签署你的应用程序

在本文档中

  1. 证书和密钥库
  2. 签署您的调试版本
    1. 调试证书到期
  3. 管理你的钥匙
    1. 使用Google Play应用程式签名
    2. 管理您自己的密钥和密钥库
  4. 签一个APK
    1. 生成密钥和密钥库
    2. 手动签名APK
    3. 配置构建过程以自动签名您的APK
    4. 以不同的方式标示每种产品的味
    5. 签署Android Wear应用程式
  5. 签署注意事项
  6. 确保你的钥匙
    1. 从构建文件中删除签名信息
  7. 从命令行构建并签署您的应用程序
    1. 构建一个未签名的APK并手动签名
    2. 配置Gradle来签署你的APK

Android要求所有APK在安装之前都必须使用证书进行数字签名。本文档介绍如何使用Android Studio签名APK,包括创建和存储证书,使用不同证书签署不同的构建配置,以及配置构建过程以自动签名APK。

证书和密钥库


公开密钥证书(也称为数字证书或身份证书)包含公共/私人密钥对的公共密钥以及标识密钥所有者的一些其他元数据(例如名称和位置)。证书的所有者保存相应的私钥。

当您签署APK时,签名工具将公钥证书附加到APK。公钥证书作为“APK”,将APK与您和您对应的私钥唯一相关联。这有助于Android确保您的APK的任何未来更新都是真实的,并且来自原作者。用于创建此证书的密钥称为应用程序签名密钥

密钥库是包含一个或多个私钥的二进制文件。

每个应用程序必须在整个使用寿命期间使用相同的证书,以便用户能够将新版本作为应用程序的更新安装。有关在整个使用寿命期间为所有应用程序使用相同证书的更多信息,请参阅 下面的签名注意事项。

签署您的调试版本


当您从IDE中运行或调试项目时,Android Studio会使用Android SDK工具生成的调试证书自动签名您的APK。首次在Android Studio中运行或调试项目时,IDE会自动创建调试密钥库和证书$HOME/.android/debug.keystore,并设置密钥库和密钥密码。

由于调试证书是由构建工具创建的,并且设计不安全,所以大多数应用商店(包括Google Play商店)都不会接受使用调试证书签发的APK进行发布。

Android Studio会自动将您的调试签名信息存储在签名配置中,因此您每次调试时都不必输入。签名配置是一个对象,包括签名APK的所有必要信息,包括密钥库位置,密钥库密码,密钥名称和密钥密码。您无法直接编辑调试签名配置,但您可以配置如何签名发布版本。

有关如何构建和运行应用程序进行调试的更多信息,请参阅 构建和运行应用程序。

调试证书到期

用于签署APK进行调试的自签名证书的创建日期为365天。当证书过期时,您将收到一个构建错误。

要解决这个问题,只需删除该debug.keystore文件。该文件存储在以下位置:

  • ~/.android/ 在OS X和Linux上
  • C:\Documents and Settings\<user>\.android\ 在Windows XP上
  • C:\Users\<user>\.android\ 在Windows Vista和Windows 7,8和10上

下次构建和运行调试构建类型时,构建工具将重新生成新的密钥库和调试密钥。请注意,您必须运行您的应用程序,单独构建不会重新生成密钥库和调试密钥。

管理你的钥匙


因为您的应用签名密钥用于验证您的开发人员的身份,并确保为用户提供无缝和安全的更新,管理密钥并保持安全,这对您和您的用户都非常重要。您可以选择使用Google Play应用程序签名,使用Google的基础架构安全地管理和存储应用签名密钥,也可以管理和保护您自己的密钥库和应用签名密钥。

使用Google Play应用程式签名

使用Google Play应用签名时,您将使用两个键:应用签名密钥上传密钥。Google管理并保护您的应用签名密钥,并保留上传密钥,并使用它来签署您的应用以上传到Google Play商店。

当您选择使用Google Play应用签名功能时,您可以使用Google Play提供的Play Encrypt Private Key工具导出并加密您的应用签名密钥,然后将其上传到Google的基础设施。然后,您创建一个单独的上传密钥并将其注册到Google。准备发布时,您可以使用上传键签署您的应用,并将其上传到Google Play。Google然后使用上传证书验证您的身份,并使用您的应用程序签名密钥重新签名APK,如图1所示。(如果您还没有应用签名密钥,则可以在签名过程中生成一个密码,进程)

图1。使用Google Play应用程式签名登录应用程式

当您使用Google Play应用程式签名时,如果您丢失上传密钥,或者如果它被盗用,您可以联系Google撤销旧的上传密钥并生成一个新的密钥。由于您的应用签名密钥由Google保护,您可以继续将新版本的应用程序上传到原始应用的更新,即使您更改了上传密钥。

有关如何选择使用Google Play应用签名的详细信息,请参阅 管理应用签名密钥。

管理您自己的密钥和密钥库

您可以选择管理自己的应用签名密钥和密钥库,而不是使用Google Play应用签名。如果您选择管理自己的应用程序签名密钥和密钥库,则负责保护密钥和密钥库。您应该为密钥库选择一个强密码,并为存储在密钥库中的每个私钥分别输入一个强密码。您必须将密钥库保存在安全可靠的位置。如果您无法访问您的应用签名密钥或密钥遭到入侵,Google无法为您检索应用签名密钥,您将无法将新版本的应用发布给用户,因为原始应用的更新。有关详细信息,请参阅下面的保护您的密钥。

如果您管理自己的应用程序签名密钥和密钥库,当您签署APK时,您将使用您的应用签名密码在本地签名,并将签名的APK直接上传到Google Play商店进行分发,如图2所示。

图2。当您管理自己的应用程序签名密钥时签名应用程序

签一个APK


无论您如何选择管理密钥和密钥库,您都可以使用Android Studio手动签名您的APK(使用上传密钥或应用签名密钥),或者通过配置自己的构建过程来自动签名APK。

如果您选择管理和保护自己的应用程序签名密钥和密钥库,您将使用应用程序签名密钥对您的APK进行签名。如果您选择使用Google Play应用签名来管理和保护您的应用签名密钥和密钥库,您将使用上传密钥来签名您的APK。

生成密钥和密钥库

您可以使用Android Studio生成应用程序签名或上传密钥,使用以下步骤:

  1. 在菜单栏中,单击构建 > 生成签名的APK
  2. 从下拉列表中选择一个模块,然后单击 下一步
  3. 单击创建新建以创建新密钥和密钥库。

  4. 在“ 新建密钥存储”窗口中,为密钥库和密钥提供以下信息,如图3所示。

    图3。在Android Studio中创建一个新的密钥库。

    密钥库

    • 密钥存储路径:选择应创建密钥库的位置。
    • 密码:为密钥库创建并确认安全密码。

    • 别名:输入密钥的识别名称。
    • 密码:创建并确认密钥的安全密码。这与您为密钥库选择的密码不同
    • 有效期(年):设定您的密钥有效期的时间长度。您的密钥应至少有效期至少25年,因此您可以在应用程序的使用期限内使用相同的密钥签署应用更新。
    • 证书:输入有关您自己的证书信息。此信息不会显示在您的应用中,但作为APK的一部分包含在您的证书中。

    完成表单后,单击确定

  5. 继续手动登录APK,如果您想生成使用新密钥签名的APK,或者如果您只想生成密钥和密钥库,而不是签署APK ,请单击 取消
  6. 如果您想选择使用Google Play应用签名,请继续 管理您的应用签名密钥,并按照说明设置Google Play应用签名。

手动签名APK

您可以使用Android Studio手动生成签名的APK,一次一个,或一次创建多个构建变体。而不是手动签名APK,您也可以配置您的Gradle构建设置,以便在构建过程中自动处理签名。本节介绍手动签名过程。有关在构建过程中签名应用程序的更多信息,请参阅配置构建过程以自动签名您的APK。

要在Android Studio中手动签名发布APK,请按照下列步骤操作:

  1. 单击构建>生成签名的APK以打开生成签名的APK窗口。(如果您刚才生成的密钥和密钥库如上所述,此窗口将已经打开。)
  2. 在“ 生成签名的APK向导”窗口中,选择密钥库,私钥,然后输入两者的密码。(如果您刚刚在上一节中创建了密钥库,那么这些字段已经为您填充了。)然后单击下一步

    注意:如果您使用Google Play应用程式签名,则应在此处指定上传密钥。如果您正在管理自己的应用程序签名密钥和密钥库,则应指定应用程序签名密钥。有关详细信息,请参阅上述管理您的密钥。

    图4。在Android Studio中选择一个私钥。

  3. 在下一个窗口中,选择已签名的APK的目的地,选择构建类型(如果适用)选择产品风味,然后单击 完成

    图5。为选定的产品风格生成签名的APK。

    注意:如果您的项目使用产品风味,您可以在Windows / Linux上按住Control键或Mac OSX上的 Command键时选择多种产品风味 。Android Studio将为每个选定的产品风格生成一个单独的APK。

进程完成后,您将在您上面选择的目标文件夹中找到已签名的APK。您现在可以通过Google Play商店等应用程式市场或使用您选择的机制发布已签名的APK。有关如何将已签名的APK发布到Google Play商店的详情,请参阅“开始使用发布”。要了解更多关于其他分发选项,阅读 另类的分布选项。

为了让用户成功安装应用程式的更新,您需要在整个应用程式的使用期限内使用相同的证书签署APK。有关使用相同密钥签名所有应用的其他好处,请参阅下面的签名注意事项。有关保护您的私钥和密钥库的更多信息,请参阅下面的保护密钥。

配置构建过程以自动签名您的APK

在Android Studio中,您可以通过创建签名配置并将其分配给发行版构建类型,在构建过程中自动配置您的项目以自动签名发行版APK。签名配置由密钥库位置,密钥库密码,密钥别名和密钥密码组成。要创建一个签名配置并使用Android Studio将其分配给您的发行版构建类型,请使用以下步骤:

  1. 在“ 项目”窗口中,右键单击应用程序,然后单击“ 打开模块设置”
  2. 在“ 项目结构”窗口 的“左侧面板模块 ”下,单击要签名的模块。
  3. 单击签名选项卡,然后单击添加 
  4. 选择您的密钥库文件,输入此签名配置的名称(您可能创建多个),然后输入所需的信息。

    图6。用于创建新的签名配置的窗口。

  5. 单击构建类型选项卡。
  6. 点击发布版本。
  7. 签名配置下,选择刚刚创建的签名配置。

    图7。在Android Studio中选择一个签名配置。

  8. 单击确定

现在,每次使用Android Studio构建版本构建类型时,IDE将使用您指定的签名配置自动签名APK。您可以在build/outputs/apk/您正在构建的模块的项目目录下的文件夹中找到您签名的APK 。

创建签名配置时,您的签名信息将以Gradle构建文件中的纯文本格式包含。如果您正在一个团队工作或公开分享您的代码,那么您应该通过将其从构建文件中删除并分开存储来保持您的签名信息的安全。您可以从构建文件中删除签名信息,了解如何从构建文件中 删除签名信息。有关保持签名信息安全的更多信息,请阅读 安全密钥。

以不同的方式标示每种产品的味

如果您的应用程序使用产品风格,并且您希望以不同的方式签署每种风格,则可以创建其他签名配置,并通过口味进行分配:

  1. 在“ 项目”窗口中,右键单击应用程序,然后单击“ 打开模块设置”
  2. 在“ 项目结构”窗口 的“左侧面板模块 ”下,单击要签名的模块。
  3. 单击签名选项卡,然后单击添加 
  4. 选择您的密钥库文件,输入此签名配置的名称(您可能创建多个),然后输入所需的信息。

    图8。用于创建新的签名配置的窗口。

  5. 根据需要重复步骤3和4,直到您创建了所有的签名配置。
  6. 单击Flavors选项卡。
  7. 单击要配置的风格,然后从“ 签名配置”下拉菜单中选择适当的签名配置。

    图9。根据产品风味配置签名设置。

    重复以配置任何其他产品风味。

  8. 单击确定

您还可以在Gradle配置文件中指定您的签名设置。有关详细信息,请参阅配置签名设置。

签署Android Wear应用程式

如果您正在构建Android Wear应用,则该应用的签名过程可能与此页面上描述的过程不同。请参阅有关 打包和发布Android Wear应用程序的信息。

签署注意事项


您应该在所有应用程序的预期使用寿命期内使用相同的证书签名所有的APK。有几个原因你应该这样做:

  • 应用程序升级:当系统正在安装对应用程序的更新时,它会将新版本的证书与现有版本中的证书进行比较。如果证书匹配,系统允许更新。如果您使用不同的证书签署新版本,则必须为应用程序分配不同的软件包名称 - 在这种情况下,用户将新版本作为全新应用程序安装。
  • 应用程序模块化:Android允许由相同证书签名的APK在相同的过程中运行,如果应用程序请求,则系统将其视为单个应用程序。以这种方式,您可以在模块中部署应用程序,用户可以独立更新每个模块。
  • 通过权限进行代码/数据共享:Android提供基于签名的权限强制,以便应用程序可以将功能公开到使用指定证书签名的另一个应用程序。通过签署具有相同证书的多个APK并使用基于签名的权限检查,您的应用程序可以以安全的方式共享代码和数据。

如果您计划支持应用程序的升级,请确保您的应用程序签名密钥的有效期超过了该应用的预期使用寿命。推荐25年以上的有效期。当您的密钥的有效期到期时,用户将无法再无缝地升级到新版本的应用。

如果您打算在Google Play上发布应用程式,则用于签署这些APK的密钥必须在2033年10月22日以后结束。Google Play强制执行此要求,以确保用户可以在新版本可用时无缝升级应用。如果您使用 Google Play应用程式签名,Google可确保您的应用程式已正确登入,并能在整个使用寿命期内接收更新。

确保你的钥匙


如果您选择管理和保护您的应用签名密钥,并自行密码(而不是选择使用Google Play应用签名),则保护您的应用签名密钥对您和用户至关重要。如果您允许某人使用您的密钥,或者如果您将密钥库和密码留在不安全的位置,以便第三方可以找到并使用它们,则您的创作身份和用户的信任将受到损害。

注意:如果您使用Google Play应用签名,您的应用签名密钥将使用Google的基础架构保持安全。您仍然应如下所述保持您的上传密钥安全。如果您的上传密钥遭到入侵,您可以联系Google撤销并接收新的上传密钥。

如果第三方在未经您的认可或许可的情况下设法取代您的密钥,那么该用户可以签署并分发恶意替换您的正版应用程序或将其破坏的应用程序。这样的人也可以根据您的身份签署和分发攻击其他应用或系统本身的应用,或损坏或窃取用户数据。

您的私人密钥是签名所有未来版本的应用程序所必需的。如果丢失或错位您的密钥,您将无法发布现有应用的更新。您无法重新生成以前生成的密钥。

您作为开发人员实体的声誉取决于您在任何时候正确保护您的应用签名密钥,直到密钥过期。这里有一些提示,以保护您的钥匙安全:

  • 为密钥库和密钥选择强密码。
  • 不要给任何人或任何你的私钥,不要让未经授权的人知道你的密钥库和密钥密码。
  • 将包含您的私钥的密钥库文件保存在一个安全,安全的地方。

一般来说,如果您在生成,使用和存储密钥时遵循常识性注意事项,则它将保持安全。

从构建文件中删除签名信息

创建签名配置时,Android Studio会将您的签名信息以纯文本形式添加到模块的build.gradle文件中。如果您正在与团队合作或开源代码,您应该将这些敏感信息从构建文件中移出,以便其他人不容易访问。为此,您应该创建一个单独的属性文件来存储安全信息,并在构建文件中引用该文件,如下所示:

  1. 创建签名配置,并将其分配给一个或多个构建类型。这些说明假设您已为您的发行版构建类型配置了单个签名配置,如上所述配置构建过程以自动签名您的APK所述。
  2. 创建一个keystore.properties在项目的根目录中命名的文件。此文件应包含您的签名信息,如下所示:
    storePassword = myStorePassword
    keyPassword = mykeyPassword
    keyAlias = myKeyAlias
    storeFile = myStoreFileLocation
  3. 在您的模块build.gradle文件中,添加代码以keystore.propertiesandroid {} 块之前加载 文件。
    ... //创建一个名为keystorePropertiesFile的变量,并在rootProject文件夹中将其初始化为// keystore.properties文件。def keystorePropertiesFile = rootProject 。file (“keystore.properties” )//初始化一个名为keystoreProperties的新的Properties()对象。def keystoreProperties = new Properties ()//将您的keystore.properties文件加载到keystoreProperties对象中。密钥库属性。load (new FileInputStream (keystorePropertiesFile ))android { ... }
    

    注意:您可以选择将keystore.properties文件存储 在另一个位置(例如,在模块文件夹中,而不是项目的根文件夹,或者在使用连续集成工具的情况下,在构建服务器上)。在这种情况下,您应该keystorePropertiesFile使用实际 keystore.properties文件的位置来修改上述代码以正确初始化 。

  4. 您可以参考keystoreProperties 使用语法存储的属性。修改模块的文件块, 以引用使用此语法存储的签名信息 。keystoreProperties['propertyName']signingConfigsbuild.gradlekeystoreProperties
    android { signatureConfigs { config { keyAlias keystoreProperties [ 'keyAlias' ] keyPassword keystoreProperties [ 'keyPassword' ] storeFile文件(keystoreProperties [ 'storeFile' ])storePassword keystoreProperties [ 'storePassword' ] } } ... }
  5. 打开构建变量工具窗口,并确保选择版本构建类型。
  6. 单击构建>构建APK以构建您的发布版本,并确认Android Studio已在build/outputs/apk/您的模块目录中创建了一个已签名的APK 。

因为您的构建文件不再包含敏感信息,您现在可以将它们包含在源代码控制中或将其上传到共享代码库。确保保持keystore.properties文件的安全。这可能包括从源控制系统中删除它。

从命令行构建并签署您的应用程序


您不需要Android Studio签署您的应用程序。您可以使用该apksigner工具从命令行签名应用程序,也可以在构建过程中配置Gradle为您签名。无论哪种方式,您都需要先使用私钥生成keytool。例如:

keytool -genkey -v -keystore my-release-key.jks
-keyalg RSA-keysize 2048 -validity 10000 -alias我的别名

注意: keytool位于bin/ JDK 中的目录中。要从Android Studio找到您的JDK,请选择文件>项目结构,然后单击SDK位置,您将看到JDK位置

此示例提示您输入密钥库和密钥的密码,并提供密钥的可分辨名称字段。然后,它将生成密钥库作为一个文件my-release-key.jks,将其保存在当前目录中(您可以随意移动它)。密钥库包含一个有效期为10,000天的单个密钥。

现在,您可以构建一个未签名的APK,并手动签名,或者配置Gradle来签署APK。

构建一个未签名的APK并手动签名

  1. 打开命令行并导航到项目目录的根目录 - 从Android Studio中选择“ 视图”>“工具窗口”>“终端”。然后调用assembleRelease任务:

    毕业组合

    这将创建一个名为APK module_name-unsigned.apk在 。此时APK 无符号且未对齐,只有使用私钥签名才能安装APK 。project_name/module_name/build/outputs/apk/

  2. 使用zipalign以下命令对齐未签名的APK :

    zipalign -v -p 4 my-app-unsigned.apk my-app-unsigned-aligned.apk
    

    zipalign 确保所有未压缩的数据以相对于文件开头的特定字节对齐开始,这可能减少应用程序消耗的RAM量。

  3. 用您的私钥使用apksigner以下方式签名您的APK :

    apksigner sign --ks my-release-key.jks --out my-app-release.apk my-app-unsigned-aligned.apk
    

    这个例子签署的APK在输出my-app-release.apk 与被存储在单个密钥库文件的私钥和证书签名之后:my-release-key.jks

    apksigner工具支持其他签名选项,包括使用单独的私钥和证书文件签名APK文件,并使用多个签名者签名APK。有关详细信息,请参阅apksigner参考。

    注意:要使用该apksigner工具,必须安装Android SDK Build Tools的版本为24.0.3或更高版本。您可以使用SDK Manager更新此软件包。

  4. 验证您的APK是否已签名:

    apksigner验证我的app-release.apk
    

配置Gradle来签署你的APK

  1. 打开模块级的build.gradle文件,并添加 signingConfigs {}与条目块storeFile, storePasswordkeyAlias和 keyPassword,再传递对象到signingConfig您的构建类型属性。例如:

    android { ...     defaultConfig { ... }     signatureConfigs {         release {             storeFile file (“my-release-key.jks” )            storePassword “password”             keyAlias “my-alias”             keyPassword “password” } }     buildTypes {         release {             signatureConfig signingConfigs 。发布... } } }
    

    因为Gradle读取相对于该路径的路径build.gradle,所以上述示例仅my-release-key.jks在与该build.gradle文件位于同一目录中时才起作用。

    注意:在这种情况下,build.gradle文件中可以直接看到密钥库和密钥密码。为了提高安全性,您应该从构建文件中删除签名信息。

  2. 在项目根目录中打开一个命令行并调用该 assembleRelease任务:
    毕业组合

这将创建一个名为APK module_name-release.apk在 。该APK文件使用您的文件中指定的私钥进行签名, 并与之对齐。project_name/module_name/build/outputs/apk/build.gradlezipalign

现在,您已使用签名密钥配置发布版本,“安装”任务可用于该构建类型。因此,您可以在模拟器或设备上构建,对齐,签名和安装版本APKinstallRelease

用您的私钥签名的APK可以分发,但您应该首先阅读有关如何发布应用程序并查看Google Play启动清单的更多信息。

  • 推特

    在Twitter上关注@AndroidDev
  • Google+的
    关注Google+上的Android Developers
  • YouTube的
    查看YouTube上的Android Developers

android studio 签名配置相关推荐

  1. Android Studio 签名配置及使用Walle实现多渠道打包

    本篇博客 主要为本人学习过程总结,有不对的地方麻烦指出,一起学习进步 前言 最近也是搞到了一个 电子书 <Android+Gradle权威指南>,学习一波Gradle 知识,尝试配置签名设 ...

  2. Android Studio 打包配置设置V1签名

    Android Studio 打包配置设置V1签名 Android Studio 打包配置设置V1签名 添加 注意 一定要有debug的设置 如果是用下图这个打包按钮 Android Studio 打 ...

  3. 怎么配置android远程服务器地址,在 Android studio 中 配置Gradle 进行 “动态编译期间,指定 远程服务器地址 ,生成多个安装包”...

    需求: 在产品开发中,经常需要发布各个版本,每个版本的服务器地址有不同的服务器地址.比如 开发服务器使用 192.168.1.232服务器, 测试服务器使用 192.168.1.245服务器, 正式上 ...

  4. android studio密钥库口令,Android应用开发Android Studio签名打包及根据keystore密钥获取SHA1安全码...

    本文将带你了解Android应用开发Android Studio签名打包及根据keystore密钥获取SHA1安全码,希望本文对大家学Android有所帮助. " 一.签名打包两种方式 1. ...

  5. Android开发——Android Studio中配置及使用OpenCV示例

    from: http://www.mobile-open.com/2015/86176.html 本文主要讲述了Android Studio中配置及使用OpenCV示例,现在整理出来分享给Androi ...

  6. 【Android Protobuf 序列化】Protobuf 使用 ( protobuf-gradle-plugin 插件简介 | Android Studio 中配置插件 | AS 中编译源文件 )

    文章目录 一.protobuf-gradle-plugin 插件简介 二.Android Studio 中配置 protobuf-gradle-plugin 插件 三.Android Studio 中 ...

  7. 【Android RTMP】RTMPDumb 源码导入 Android Studio ( 交叉编译 | 配置 CMakeList.txt 构建脚本 )

    文章目录 安卓直播推流专栏博客总结 一. RTMP 协议 二. RTMP 协议使用 三. RTMPDump 源码下载 四. RTMPDump 源码交叉编译 五. RTMPDump 源码导入 Andro ...

  8. 【Android FFMPEG 开发】Android Studio 工程配置 FFMPEG ( 动态库打包 | 头文件与函数库拷贝 | CMake 脚本配置 )

    文章目录 I . FFMPEG 交叉编译后的函数库及头文件 II . FFMPEG 静态库打包动态库 ( 仅做参考 ) III . 创建 Android Studio 工程 IV . FFMPEG 头 ...

  9. 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )

    文章目录 I . 动态库 与 静态库 II . 编译动态库 III. Android Studio 使用第三方动态库 IV . Android Studio 关键代码 V . 博客资源 I . 动态库 ...

最新文章

  1. aws 认证_引入#AWSCertified挑战:您的第一个AWS认证之路
  2. 【转】supervisord使用
  3. c++读取utf8文件_经常在日常工作中处理统一码文件(or其他编码)?这篇必读
  4. C语言中.和->区别
  5. GitHub Desktop理解与入门
  6. 听说你在生产环境下还没关闭Swagger2,算你猛
  7. 网页实现二维码扫描和解析
  8. EPSON/爱普生打印机Linux打印服务器基于ARM驱动安装踩坑CUPS实现支持远程打印AirPrint
  9. C++开源DirectUI库SOUI简介
  10. word2010里脚注横线如何顶格
  11. 阿里云全站加速在游戏行业的最佳实践
  12. python输入自己的出生年月日命运_出生年月日五行查询表 免费五行缺失查询表...
  13. 八个有效解决眼睛进东西的方法
  14. A005-软件结构-从前后台到调度器
  15. “人文素养老师”——马小平老师
  16. 操作系统精选习题——第六章
  17. 睿量30W迷你氮化镓,小巧耐用易携带,支持更多充电协议
  18. 微信收发邮件的个人邮箱怎么注册,VIP个人邮箱怎么注册申请?
  19. 爬取豆瓣电影top250(正则表达式)
  20. mac音乐雷达:Shazam for Mac

热门文章

  1. 燕雀安知鸿蒙之志,笔点酷玩 篇一百零三:燕雀焉知鸿鹄之志:华为智慧屏V65开箱初体验...
  2. MyEclipse中阿里JAVA代码规范插件(P3C)的安装及使用
  3. 计算机二级C语言与专升本编程题(入门级),用函数isprime(x)判断[n,m](n<m)之间所有的素数,并求其和
  4. http-request-post
  5. 图片无损压缩工具在哪下载?
  6. CAD电气制图中怎么快速转换线缆类型?
  7. python 词表里的词不符合_教你背单词 | 利用python分析考研英语阅读并生成词频降序表...
  8. WPS Office下载链接
  9. python控制台字体背景及前景颜色设置
  10. 【从入门到进阶】vim基础配置+ 常用插件(NERDTree, cscope, rainbow等)