11 打包发布 APK¶
写完 App,最后要打包成能装到手机上的 APK(或上架用的 AAB)。本站的"落英文档"离线 App 就是这么打的包。
11.1 调试包 vs 发布包¶
| 类型 | 签名 | 用途 |
|---|---|---|
| Debug APK | AS 自动用 debug 签名 | 自己测试装 |
| Release APK | 你自己的正式签名 | 发给别人/上架 |
- 没签名或 debug 签名的包,别人覆盖安装会因签名不一致失败(签名 = App 身份证);
- 签名 keystore 一定要备份保存!丢了以后永远没法给老用户升级(只能卸载重装)。
11.2 生成正式签名(keystore)¶
菜单 Build → Generate Signed App Bundle / APK…:
- 选 APK(直接给安装包)或 App Bundle(上架 Google Play 用);
- 没有 keystore 就点 Create new…:
- Key store path:选存放位置(务必备份这个文件)
- Password / Confirm:设密码(也请记牢)
- Alias:别名(如
myapp) - Validity:有效期(填 25+ 年)
- 填好后一路 Next → 选
release→ Finish。
AS 会自动跑 Gradle 的 assembleRelease,完成后右下角提示 locate,点击即可找到 APK 文件(一般在 app/build/outputs/apk/release/app-release.apk)。
11.3 命令行打正式包(进阶)¶
# Linux/macOS 用 ./gradlew;Windows 用 gradlew.bat
./gradlew assembleRelease
输出:app/build/outputs/apk/release/app-release.apk
想用命令行签名,可以配置 signingConfigs(build.gradle.kts):
android {
signingConfigs {
create("release") {
storeFile = file("../keystore/myapp.jks") // keystore 文件
storePassword = "你的密码"
keyAlias = "myapp"
keyPassword = "你的密码"
}
}
buildTypes {
release {
signingConfig = signingConfigs.getByName("release")
isMinifyEnabled = true // 开启代码压缩混淆
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro")
}
}
}
密码写进构建文件有泄露风险,可改用环境变量(
System.getenv("KEYSTORE_PASS"))或keystore.properties文件。
11.4 版本号管理(升级必备)¶
每次发新版必须递增,否则用户装不上:
defaultConfig {
versionCode = 2 // 内部版本号,升级必须比旧版大(整数)
versionName = "1.1" // 显示给用户的版本名
}
11.5 装机测试注意¶
- 手机需允许"安装未知来源应用"(设置里对对应应用/浏览器开启);
- 发给别人前先自己装一遍 release 包确认没问题;
- 可用
adb install app-release.apk命令行安装并看报错。
11.6 一点经验(来自本站落英文档 App)¶
- WebView 套壳做离线文档 App:把网页打包进
assets/,用WebView.loadUrl("file:///android_asset/index.html")即可离线浏览(见本站「落英文档」); - 远程更新文档:App 启动时请求服务器的
version.json,发现新版本就下载 zip 解压到私有目录、页面优先读本地更新——文档更新就不用重发 APK; - 混淆规则:如果用了反射/第三方 SDK,记得在
proguard-rules.pro里 keep 对应类,否则发布包功能异常。
本章练习:生成自己的 keystore,打一个 release APK,装到手机上看看效果。