本文将详细介绍如何将Android应用打包并发布到Google Play商店,包括AAB和APK格式的区别、签名配置、打包流程、上架步骤以及多渠道发布策略等内容。
一、打包前准备工作
在开始打包过程之前,需要完成以下准备工作:
- 确保应用已完成开发和测试
- 创建签名密钥
- 配置应用版本信息
1.1 创建签名密钥
使用以下命令创建签名密钥:
keytool -genkey -v -keystore your_app_key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias your_alias
重要提示:请妥善保管签名密钥,一旦丢失将无法更新应用。
1.2 配置签名信息
在项目的app/build.gradle
文件中添加签名配置:
android {
// ...其他配置
signingConfigs {
release {
storeFile file("your_app_key.jks")
storePassword "your_store_password"
keyAlias "your_alias"
keyPassword "your_key_password"
}
}
buildTypes {
release {
// ...其他配置
signingConfig signingConfigs.release
}
}
}
二、理解AAB与APK格式
2.1 什么是AAB?
AAB (Android App Bundle) 是Google推出的新一代应用发布格式,它不是安装格式,而是提供给Google Play的中间格式。AAB允许Google Play根据用户设备的配置动态生成优化的APK。
2.2 AAB与APK的区别
特性 | AAB | APK |
---|---|---|
文件大小 | 更小(平均减少15%) | 较大 |
设备适配 | 自动生成设备专用APK | 一个APK适配所有设备 |
功能模块 | 支持动态功能模块 | 不支持 |
资源下载 | 按需下载 | 全部打包 |
语言资源 | 按用户设备语言提供 | 包含所有语言 |
Google Play支持 | 优先支持且推荐 | 支持但不推荐 |
注意:Google Play现在要求新应用必须使用AAB格式上传。
三、打包流程
3.1 生成AAB包
从Android Studio生成AAB:
- 选择菜单
Build
->Generate Signed Bundle / APK
- 选择
Android App Bundle
- 选择之前创建的密钥
- 选择
release
构建类型 - 完成配置后点击
Finish
也可以使用命令行方式:
./gradlew bundleRelease
生成的AAB文件位于app/build/outputs/bundle/release/
目录。
3.2 生成APK包
虽然Google Play推荐使用AAB,但对于测试或发布到其他应用商店,可能仍需生成APK:
./gradlew assembleRelease
生成的APK文件位于app/build/outputs/apk/release/
目录。
四、Google Play上架流程
4.1 创建开发者账号
- 访问Google Play 控制台
- 注册并支付25美元的一次性注册费
- 完成开发者账号验证
4.2 创建应用
- 在控制台点击
创建应用
- 填写应用名称和默认语言
- 选择应用类型(应用或游戏)
- 选择免费或付费模式
4.3 设置应用基本信息
需要填写以下信息:
- 应用详细描述
- 应用截图和宣传图
- 应用图标
- 内容分级(完成分级问卷)
- 开发者联系方式
- 隐私政策URL
4.4 上传AAB包
- 进入
产品
->版本管理
->生产版
部分 - 创建新版本并上传AAB文件
- 填写版本说明
- 进行最终审核并提交
4.5 应用审核
提交后,Google团队将审核你的应用,这通常需要1-3天。如果被拒绝,你需要根据拒绝理由修复问题后重新提交。
五、测试AAB包
由于AAB不能直接安装到设备上,可以通过以下方法测试:
5.1 使用bundletool工具
# 安装bundletool
# 下载bundletool.jar或使用homebrew安装
# 生成一个包含所有可能配置的APK集合
bundletool build-apks --bundle=app.aab --output=app.apks --ks=keystore.jks --ks-pass=pass:密码 --ks-key-alias=别名 --key-pass=pass:密码
# 安装到已连接设备
bundletool install-apks --apks=app.apks
5.2 使用Internal App Sharing
在Google Play Console中使用"内部应用共享"功能上传AAB文件,获取共享链接后在测试设备上安装。
六、多渠道发布策略
6.1 Google Play渠道
对于Google Play渠道,使用AAB格式打包上传。
6.2 其他应用商店
对于不支持AAB的其他应用商店(如中国的应用市场),需要生成APK格式:
-
配置渠道标识
android { // ... flavorDimensions "channel" productFlavors { googlePlay { dimension "channel" manifestPlaceholders = [CHANNEL_VALUE: "google_play"] } huawei { dimension "channel" manifestPlaceholders = [CHANNEL_VALUE: "huawei"] } xiaomi { dimension "channel" manifestPlaceholders = [CHANNEL_VALUE: "xiaomi"] } // 其他渠道... } }
-
在AndroidManifest.xml中添加渠道标识
<application ...> <meta-data android:name="app_channel" android:value="${CHANNEL_VALUE}" /> <!-- ... --> </application>
-
分别生成各渠道的包
# 生成Google Play的AAB ./gradlew bundleGooglePlayRelease # 生成其他渠道的APK ./gradlew assembleHuaweiRelease ./gradlew assembleXiaomiRelease
七、如何判断应用来源于Google Play
在App代码中可以通过以下方法判断应用是否是通过Google Play安装的:
7.1 通过安装来源判断
/**
* 判断应用是否来自Google Play
* @return 如果应用来自Google Play返回true,否则返回false
*/
fun isInstalledFromGooglePlay(context: Context): Boolean {
try {
val installerPackageName = context.packageManager.getInstallerPackageName(context.packageName)
return "com.android.vending" == installerPackageName
} catch (e: Exception) {
e.printStackTrace()
return false
}
}
7.2 通过渠道标识判断
/**
* 从元数据中获取渠道信息
* @return 当前应用的渠道标识
*/
fun getChannelFromMetaData(context: Context): String {
try {
val appInfo = context.packageManager.getApplicationInfo(
context.packageName,
PackageManager.GET_META_DATA
)
return appInfo.metaData.getString("app_channel") ?: "unknown"
} catch (e: Exception) {
e.printStackTrace()
return "unknown"
}
}
/**
* 判断是否是Google Play渠道
*/
fun isGooglePlayChannel(context: Context): Boolean {
return getChannelFromMetaData(context) == "google_play"
}
7.3 综合判断方案
/**
* 综合判断应用是否是Google Play版本
* 同时考虑安装来源和渠道标识
*/
fun isGooglePlayVersion(context: Context): Boolean {
// 优先检查安装来源
val isFromPlayStore = try {
"com.android.vending" == context.packageManager.getInstallerPackageName(context.packageName)
} catch (e: Exception) {
false
}
// 再检查渠道标识
val isPlayChannel = try {
val appInfo = context.packageManager.getApplicationInfo(
context.packageName,
PackageManager.GET_META_DATA
)
"google_play" == appInfo.metaData.getString("app_channel")
} catch (e: Exception) {
false
}
// 如果两者其中一个条件满足,则认为是Google Play版本
return isFromPlayStore || isPlayChannel
}
八、常见问题解答
8.1 "Connection reset by peer"错误
当遇到"Connection reset by peer"错误时,表示连接的另一端(对等方)主动关闭了连接。
可能原因:
- 服务器超时
- 服务器崩溃或重启
- 网络设备问题
- 服务器过载
- 安全软件干预
- 网络不稳定
解决方案:
- 实现重试机制
- 延长超时时间
- 检查网络连接
- 检查服务器状态
- 使用更可靠的网络库(如OkHttp或Retrofit)
8.2 AAB包能否直接安装到设备上?
不能,AAB是提供给Google Play的中间格式,不能直接通过adb安装到设备上。
九、总结
Android应用的打包和发布流程可归纳为以下关键步骤:
- 创建签名密钥并配置
- 根据发布渠道选择打包格式(AAB或APK)
- 生成对应的包文件
- 在Google Play控制台完成应用信息填写
- 上传包文件并提交审核
- 针对多渠道发布配置不同的构建变体
参考文档: