0Pricing
Android Academy · 课时

准备发布构建

了解应用包和代码收缩

准备发布构建 是 CoddyKit 上的免费 Android Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 4 节课。

从调试版到发布版

您每天都在 Android Studio 中运行调试构建。但 Google Play 需要的是发布构建:体积更小、速度更快,而且不会标记为可调试。

发布构建有三个关键区别:使用发布密钥进行签名,设置为 debuggable false,并且通常会进行压缩以移除未使用的代码和资源。

在本课中,您将准备一个正确的发布构建,并生成 Google Play 所需的文件:Android 应用包(.aab)。

Gradle 中的构建类型

Gradle 默认定义了两种构建类型:debug 和 release。您可以在模块的 build.gradle.kts 中进行配置。

release 代码块用于启用优化。请注意下面的 isMinifyEnabled 和 isShrinkResources——它们是让应用体积变小的开关。

android {
    buildTypes {
        release {
            isMinifyEnabled = true
            isShrinkResources = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
}

AAB 与 APK

Google Play 要求使用Android 应用包(.aab),而不是普通的 .apk。

  • .apk 包含适用于所有设备的代码和资源——所有屏幕密度、所有 CPU 架构以及所有语言。
  • .aab 会上传到 Play,然后由 Play 针对每位用户的具体设备生成体积小且经过优化的 APK。

结果是:用户下载的数据更少,应用安装后的体积也更小。您仍然可以使用 APK 在手机上直接测试,但发布时应使用 AAB。

什么是 R8 / 压缩

当 isMinifyEnabled = true 时,Android Studio 会运行 R8。R8 会在一次处理中完成三项工作:

  • 压缩——移除应用从未调用的类和方法。
  • 混淆——将类和方法重命名为 a、b、c 等短名称,以节省空间并阻碍逆向工程。
  • 优化——内联并重写代码,使其运行更快。

资源压缩(isShrinkResources = true)还会移除未使用的可绘制资源、布局和字符串。

使用 ProGuard 保留规则

R8 有时会移除或重命名仅通过反射引用的代码(例如 Gson、Retrofit 或序列化所引用的代码)。您可以在 保留规则中保护这些代码,规则位于 proguard-rules.pro。

保留规则会告诉 R8:“不要重命名或删除这些类。”

# proguard-rules.pro

# Keep data classes used with Gson reflection
-keep class com.example.app.model.** { *; }

# Keep Retrofit interface methods
-keepattributes Signature
-keepattributes *Annotation*

# Keep Kotlin metadata used by libraries
-keep class kotlin.Metadata { *; }

为应用设置版本

每个发布版本都需要在 build.gradle.kts 中设置两个版本值:

  • versionCode — 必须随每次上传递增的整数。Play 使用它来判断哪个构建版本更新。
  • versionName — 面向用户显示的易读字符串,例如 "1.4.0"。

如果忘记递增 versionCode,Play 会将上传内容视为重复版本并拒绝。

android {
    defaultConfig {
        applicationId = "com.example.app"
        minSdk = 24
        targetSdk = 35
        versionCode = 12
        versionName = "1.4.0"
    }
}

在 Android Studio 中构建捆绑包

要通过界面创建已签名的发布捆绑包:

  • 打开构建 → 生成已签名的捆绑包 / APK。
  • 选择Android 应用捆绑包。
  • 选择(或创建)您的密钥库和密钥。
  • 选择 release 构建变体。

Android Studio 会运行 R8、为捆绑包签名,并将 .aab 放入 app/release/。您要上传到 Play 的就是这个文件。

从命令行构建

对于 CI/CD 或脚本,您可以直接使用 Gradle 构建捆绑包。任务名称遵循 bundle<Variant> 模式。

bundleRelease 会生成 AAB。文件会位于 app/build/outputs/bundle/release/。

# Build a release App Bundle (.aab)
./gradlew bundleRelease

# Output:
# app/build/outputs/bundle/release/app-release.aab

# Build a release APK instead (for direct install/testing)
./gradlew assembleRelease

检查和测试 AAB

您无法直接在手机上安装 .aab。要测试 Play 将生成的准确 APK,请使用 Google 的 bundletool。

它会根据您的捆绑包构建设备专用的 APK,并将其安装到已连接的设备上——这是最接近真实 Play 下载的方式。

# Generate APKs from the bundle for the connected device
java -jar bundletool.jar build-apks \
  --bundle=app-release.aab \
  --output=app.apks \
  --connected-device

# Install them on the device
java -jar bundletool.jar install-apks --apks=app.apks

从发布版本中移除调试代码

发布版本不应记录敏感数据,也不应启用仅用于调试的功能。请使用 BuildConfig.DEBUG 来分支处理行为。它仅在调试构建中为 true。

R8 甚至可以移除由常量 false 控制的代码块,因此这也能减小应用体积。

fun setupLogging() {
    if (BuildConfig.DEBUG) {
        // Verbose logging only in debug builds
        Log.d("App", "Debug logging enabled")
        Timber.plant(Timber.DebugTree())
    } else {
        // Release: send to crash reporting only, no console spam
        Timber.plant(CrashReportingTree())
    }
}

发布准备检查清单

构建最终捆绑包之前,请确认:

  • versionCode 已递增,versionName 已更新。
  • 发布版本已启用 isMinifyEnabled 和 isShrinkResources。
  • 已为所有基于反射的库添加保留规则。
  • targetSdk 满足 Play 当前的要求。
  • 发布代码中没有仅用于调试的日志记录或测试端点。
  • 已通过 bundletool 在真实设备上测试 AAB。

这些项目全部通过后,您的 .aab 就可以上传了。

快速检查

您设置了 isMinifyEnabled = true,应用在发布版本中因 JSON 解析器报告“找不到类”错误而崩溃,但在调试版本中运行正常。最可能的原因是什么?

回顾:准备发布版本

现在您已经了解如何将调试应用转换为可发布的构建版本:

  • Play 要求上传已签名的 .aab,并会根据它为每台设备生成 APK。
  • release 构建类型通过 isMinifyEnabled 和 isShrinkResources 启用 R8,以进行压缩、混淆和优化。
  • 保留规则可以防止基于反射的代码被移除。
  • 始终递增 versionCode 并更新 versionName。
  • 使用 ./gradlew bundleRelease 构建,并使用 bundletool 测试结果。

下一步:了解使此构建值得信任的签名机制究竟如何工作。

常见问题解答

「准备发布构建」课时是免费的吗?

是的 — 「准备发布构建」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 4 节课。

「准备发布构建」这节课中我会学到什么?

了解应用包和代码收缩 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Android Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「准备发布构建」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Android Academy 课中编写并运行代码吗?

能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 准备发布构建
  2. 应用签名
  3. Play 控制台与应用列表
  4. 分阶段发布与更新
← 返回 Android Academy