跳转至

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…:

  1. 选 APK(直接给安装包)或 App Bundle(上架 Google Play 用);
  2. 没有 keystore 就点 Create new…:
  3. Key store path:选存放位置(务必备份这个文件)
  4. Password / Confirm:设密码(也请记牢)
  5. Alias:别名(如 myapp)
  6. Validity:有效期(填 25+ 年)
  7. 填好后一路 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,装到手机上看看效果。

🏠 返回总站