全部开发者教程

Android Studio 如何发布应用

前面的小节我们介绍了应用调试相关的知识,本小结我们学习如何合理的发布应用。

1. 准备工作

为了让应用做好发布准备,我们需要先进行一些准备工作。

1.1 收集材料和资源

要开始准备应用以进行发布,我们需要收集几项支持性的信息,其中至少应包含用于为应用签名的加密密钥以及应用图标。此外,我们可能还需要提供最终用户许可协议。

  • 加密密钥
    Android 系统要求安装的每个应用都必须使用应用开发者拥有的证书(即开发者用于存放私钥的证书)进行数字签名。Android 系统利用该证书来识别应用作者并在应用之间建立信任关系。我们用于签名的的证书无需由证书授权机构签名;Android 系统允许我们使用自签名证书为我们的应用签名。

  • 应用图标
    请确保有一个应用图标且该图标符合建议的图标指南的相关要求。应用的图标会显示在设备的主屏幕上和启动器窗口中,有助于用户识别我们的应用。它还会显示在“管理应用”、“我的下载”等其他位置。

  • 最终用户许可协议
    请考虑为我们的应用准备最终用户许可协议 (EULA)。最终用户许可协议可帮助保护我们的员工、公司和知识产权,因此我们建议为自己的应用提供一份。

1.2 配置应用

收集完所有支持材料后,我们可以开始配置应用以进行发布。这部分总结了一些建议在发布应用前对源代码、资源文件和应用清单进行的配置更改。虽然是否实现这里列出的大部分配置更改都由自己决定,但这些都是良好的编码习惯,因此建议实现这些更改。

  • 选择合适的软件包名称
    请确保选择的软件包名称适合在应用的整个生命周期中使用。将应用分发给用户后,我们就无法再更改软件包名称。我们可以在应用的清单文件中设置软件包名称。

  • 关闭日志记录和调试功能
    在构建应用以进行发布之前,请务必禁用日志记录功能并停用调试选项。要禁用日志记录功能,我们可以在源文件中移除对 Log 方法的调用。要停用调试功能,我们可以从清单文件的 代码中移除 android:debuggable 属性,或在清单文件中将 android:debuggable 属性设为 false。此外,请移除在我们的项目中创建的所有日志文件或静态测试文件。

  • 清理项目目录
    请清理项目,确保其符合 Android 项目中所述的目录结构。项目中留有散乱或孤立的文件会妨碍对应用的编译,而且会导致应用行为异常。至少应执行以下清理任务:

    1. 检查项目中是否包含应用不使用的专用或专有数据文件,如果有,请将其移除。例如,在项目的 res/ 目录中查找旧的可绘制对象文件、布局文件和值文件,如果不再使用这些文件,请将其删除;

    2. 检查 lib/ 目录中是否包含测试库;如果应用不再使用这些库,请将其移除;

    3. 查看 assets/ 目录和 res/raw/ 目录的内容,查找其中是否包含需在应用发布前更新或移除的原始资源文件和静态文件。

  • 解决兼容性问题
    Android 提供了多种工具和技术,可让我们的应用与各种设备兼容。为了使我们的应用可供尽可能多的用户使用,不妨考虑执行以下操作:

    1. 添加对多种屏幕配置的支持;

    2. 针对 Android 平板电脑设备优化我们的应用;

    3. 考虑使用支持库

2. 版本控制

版本控制是应用升级和维护策略的关键组成部分。版本控制很重要,因为:

  • 用户需要了解其设备上所安装应用的具体版本信息,以及可供安装的升级版本。

  • 其他应用(包括作为套件发布的其他应用)需要向系统查询应用的版本,以确定兼容性并识别依赖关系。

  • 我们将借以发布应用的服务可能也需要向我们的应用查询其版本,以便它们可以向用户显示相应版本。要发布的服务可能还需要检查应用版本,以确定兼容性并建立升级/降级关系。

Android 系统使用我们应用的版本信息来防止降级。系统不会使用应用版本信息对第三方应用的升级或兼容性施加限制。我们的应用必须强制执行所有版本限制,并且应告知用户这些限制。

2.1 设置应用版本信息

要为我们的应用定义版本信息,请在 Gradle 构建文件中为版本设置设定相应的值。这些值随后会在构建流程中合并到我们应用的清单文件中。

有两种设置,我们应始终为它们定义相应的值:

  • versionCode:一个正整数,用作内部版本号。此数字仅用于确定某个版本是否比另一个版本更新:数字越大,则版本越新。这不是向用户显示的版本号;向用户显示的版本号由 versionName 设置来设定。Android 系统使用 versionCode 值来防止降级,方法是阻止用户安装 versionCode 低于设备上当前所安装版本的 APK。

  • versionName:一个字符串,用作向用户显示的版本号。我们可以将此设置指定为原始字符串或对字符串资源的引用。

示例如下:

android {
  defaultConfig {
    ...
    versionCode 2
    versionName "1.1"
  }
}

示例的 defaultConfig {} 代码块中,versionCode 值表示当前 APK 包含应用的第二个版本,versionName 字符串则指定向用户显示的应用版本为版本 1.1。

2.2 指定 API 级别要求

如果我们的应用需要特定的最低 Android 平台版本,我们可以在应用的 build.gradle 文件中将该版本要求指定为 API 级别设置。在构建流程中,这些设置将合并到应用的清单文件中。指定 API 级别要求可确保只能将我们的应用安装在运行兼容的 Android 平台版本的设备上。

有两种 API 级别设置:

  • minSdkVersion:可运行应用的最低 Android 平台版本,由平台的 API 级别标识符指定。

  • targetSdkVersion:指定运行应用的目标 API 级别。在某些情况下,这允许应用使用针对目标 API 级别定义的清单元素或行为,而不是仅限于使用那些针对最低 API 级别定义的清单元素或行为。

示例如下:

android {
  ...
  defaultConfig {
    ...
    minSdkVersion 14
    targetSdkVersion 24
  }
}

在准备安装我们的应用时,系统会检查这些设置的值,并将其与系统版本进行比较。如果 minSdkVersion 值大于系统版本,系统会阻止安装应用。

3. 应用签名

Android 系统要求所有 APK 必须先使用证书进行数字签名,然后才能安装到设备上或进行更新。

3.1 生成密钥和密钥库

如果我们还没有密钥,我们可以使用 Android Studio 生成一个,具体步骤如下所示:

  1. 在菜单栏中依次点击 Build > Build > Generate Signed Bundle/APK

  2. Generate Signed Bundle or APK 对话框中,选择 Android App BundleAPK,然后点击 Next

  3. Key store path 字段下,点击 Create new

  4. New Key Store 窗口中,为密钥库和密钥提供以下信息:

    • Key store path:选择创建密钥库的位置。

    • Password:为我们的密钥库创建并确认一个安全的密码。

    • Key-Alias:为我们的密钥输入一个标识名。

    • Key-Password:为我们的密钥创建并确认一个安全的密码。此密码应该与我们为密钥库选择的密码不同。

    • Key-Validity (years):以年为单位设置密钥的有效时长。密钥的有效期应至少为 25 年,以便我们可以在应用的整个生命期内使用同一密钥为应用更新签名。

    • Key-Certificate:为证书输入一些关于本人的信息。此信息不会显示在应用中,但会作为 APK 的一部分包含在我们的证书中。

  5. 填写完表单后,请点击 OK

至此,我们的密钥库和密钥就创建好了,下面我们使用密钥来给应用签名。

3.2 为应用签名

要使用 Android Studio 为我们的应用签名,并导出现有的应用签名密钥,请按以下步骤操作:

  1. 在菜单栏中依次点击 Build > Build > Generate Signed Bundle/APK
  2. Generate Signed Bundle or APK 对话框中,选择 Android App BundleAPK,然后点击 Next
  3. 指定密钥库的路径密钥的别名,然后输入二者的密码,然后点击 Next
  4. 为签名的应用选择一个目标文件夹、选择构建类型,选择签名版本,然后点击 Finish

至此,我们的应用就编译并且签名完成,可以上传至应用市场或自己的服务器。

4. 小结

本节课程我们主要学习了如何合理的发布应用。本节课程的重点如下:

  • 掌握发布应用前的准备工作;
  • 掌握如何创建密钥库和密钥;
  • 掌握如何为应用签名。