Google Play Android应用打包指南

本文将详细介绍如何将Android应用打包并发布到Google Play商店,包括AAB和APK格式的区别、签名配置、打包流程、上架步骤以及多渠道发布策略等内容。

一、打包前准备工作

在开始打包过程之前,需要完成以下准备工作:

  1. 确保应用已完成开发和测试
  2. 创建签名密钥
  3. 配置应用版本信息

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的区别

特性AABAPK
文件大小更小(平均减少15%)较大
设备适配自动生成设备专用APK一个APK适配所有设备
功能模块支持动态功能模块不支持
资源下载按需下载全部打包
语言资源按用户设备语言提供包含所有语言
Google Play支持优先支持且推荐支持但不推荐

注意:Google Play现在要求新应用必须使用AAB格式上传。

三、打包流程

3.1 生成AAB包

从Android Studio生成AAB:

  1. 选择菜单 Build -> Generate Signed Bundle / APK
  2. 选择 Android App Bundle
  3. 选择之前创建的密钥
  4. 选择 release 构建类型
  5. 完成配置后点击 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 创建开发者账号

  1. 访问Google Play 控制台
  2. 注册并支付25美元的一次性注册费
  3. 完成开发者账号验证

4.2 创建应用

  1. 在控制台点击创建应用
  2. 填写应用名称和默认语言
  3. 选择应用类型(应用或游戏)
  4. 选择免费或付费模式

4.3 设置应用基本信息

需要填写以下信息:

  • 应用详细描述
  • 应用截图和宣传图
  • 应用图标
  • 内容分级(完成分级问卷)
  • 开发者联系方式
  • 隐私政策URL

4.4 上传AAB包

  1. 进入产品 -> 版本管理 -> 生产版部分
  2. 创建新版本并上传AAB文件
  3. 填写版本说明
  4. 进行最终审核并提交

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格式:

  1. 配置渠道标识

    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"]
            }
            // 其他渠道...
        }
    }
    
  2. 在AndroidManifest.xml中添加渠道标识

    <application ...>
        <meta-data
            android:name="app_channel"
            android:value="${CHANNEL_VALUE}" />
        <!-- ... -->
    </application>
    
  3. 分别生成各渠道的包

    # 生成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应用的打包和发布流程可归纳为以下关键步骤:

  1. 创建签名密钥并配置
  2. 根据发布渠道选择打包格式(AAB或APK)
  3. 生成对应的包文件
  4. 在Google Play控制台完成应用信息填写
  5. 上传包文件并提交审核
  6. 针对多渠道发布配置不同的构建变体

参考文档:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值