关于Android app一次性打包多个版本包

本文介绍了一种在Gradle中配置多版本APK的方法,通过定义不同的buildTypes和productFlavors,实现在同一构建流程中生成针对正式、测试及不同渠道的APK,包括如何在Java代码中引用构建配置字段。

      之前实现了在正式和测试版本之间的切换:https://blog.youkuaiyun.com/R_ine/article/details/81412650
      但是如果切换版本生成包会麻烦,需要一个个参数修改,然后再次生成。然后我就在想能不能实现一次性打包多个版本的apk。
然后查阅资料进行研究,下面看代码。

def Base_Url = "\"http://正式服务器/\""  //斜杠必须得加,为了让java代码识别这是String类型
def CBase_Url = "\"http://测试服务器/\""
android {
//中间省略若干代码
  buildTypes {
        release {
            //混淆
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 
            'proguard-rules.pro'
            //密钥直接run生效
            signingConfig signingConfigs.release
            //正式,其中“BASE_URL”为Java中引用的字段
            buildConfigField "String", "BASE_URL",  Base_Url
            //友盟来源设置,如果你接了友盟
            manifestPlaceholders = [umeng_app_key: Base_UM]
          
        }
 
        debug {
            //混淆
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 
            'proguard-rules.pro'
            //密钥直接run生效
            signingConfig signingConfigs.release
            //测试
            buildConfigField "String", "BASE_URL", CBase_Url
            manifestPlaceholders = [umeng_app_key: "ceshi"]
            
        }
    }
 
//不同版本的参数
 flavorDimensions "default"
    productFlavors {
        guanwang{
            resValue "string", "app_name", "app名"  //这是替换strings中的app_name。删strings中的app_name,不然会报错!
            Base_UM = "guanwang"   //友盟纪录渠道
            buildConfigField "String", "Base_UM",  "\""+Base_UM+"\""
            manifestPlaceholders = [umeng_app_key : Base_UM]
        }
        baidu {
           resValue "string", "app_name", "app名" 
            Base_UM = "baidu"
            buildConfigField "String", "Base_UM",  "\""+Base_UM+"\""
            manifestPlaceholders = [umeng_app_key : Base_UM]
        }
        xiaomi {
            resValue "string", "app_name", "app名" 
            Base_UM = "xiaomi"
            buildConfigField "String", "Base_UM",  "\""+Base_UM+"\""
            manifestPlaceholders = [umeng_app_key : Base_UM]
        } 
       
        debug1{
            resValue "string", "app_name", "app名" 
            Base_UM = "debug"
            buildConfigField "String", "Base_UM",  "\""+Base_UM+"\""
            manifestPlaceholders = [umeng_app_key : Base_UM] 
        }
    }

 //自动生成指定名称的release发布版的 apk文件
    android.applicationVariants.all { variant ->
        def appName
  //下面是修改每个版本的apk文件的名字
        if(variant.buildType.name.equals('release')){
            if(New_Base_Url.contains("api")){
                if(Base_UM.equals("guanwang")){
                    appName = "NameV"+defaultConfig.versionName
                }else{ 
                    def um = "${variant.productFlavors[0].name}"
                    appName = "Name-"+um+"V"+defaultConfig.versionName
                }
            }else if(Base_Url.contains("sixsix")){
                appName = "测试_V"+defaultConfig.versionName
            }else {
                appName = "未知_V"+defaultConfig.versionName
            }
        } else {
            appName = "测试"
        }
        variant.outputs.all {
            output ->
                //文件位置 
                outputFileName = "${appName}.apk"
        }
    }
}

在java中引用BASE_URL:
String BASE_URL = BuildConfig.BASE_URL;

在AndroidManifest.xml中引用友盟来源

<meta-data android:value="${umeng_app_key}" android:name="UMENG_CHANNEL"/> 

具体可以参考以下:
https://blog.youkuaiyun.com/abc6368765/article/details/52786509
https://blog.youkuaiyun.com/zhourui_1021/article/details/78800399

 

### 如何在Android开发中一次性构建多个APK 在Android开发中,一次性构建多个APK的需求通常与设备配置的多样性有关,例如支持不同的API级别、屏幕尺寸或CPU架构。为了满足这些需求,可以使用以下方法工具: #### 1. 使用Gradle插件进行多APK构建 Gradle是Android开发中的主要构建工具,它支持通过`productFlavors``buildTypes`来定义不同的构建变体。每个变体可以生成独立的APK文件。以下是实现方式的代码示例: ```gradle android { productFlavors { flavor1 { minSdkVersion 21 targetSdkVersion 30 } flavor2 { minSdkVersion 16 targetSdkVersion 28 } } splits { abi { enable true reset() include 'armeabi-v7a', 'x86' universalApk false } } } ``` 上述代码中,`productFlavors`定义了两个不同的构建变体,分别针对不同的API级别。同时,`splits`部分用于根据CPU架构生成多个APK[^1]。 #### 2. 版本码策略 为了确保不同APK之间的兼容性升级关系,必须设计合理的版本码(versionCode)策略。推荐的方法是将`minSDK`、屏幕尺寸其他配置信息编码到版本码中。例如: - `minSDK`用两位数字表示。 - 屏幕尺寸用两位数字表示。 - 构建号用三位数字表示。 这种方案可以确保设备在升级时选择正确的APK版本[^2]。 #### 3. 使用Android Studio的Build Variants功能 Android Studio提供了图形化界面来管理构建变体。开发者可以通过`Build Variants`窗口选择不同的flavorbuild type组合,并一次性生成所有可能的APK。这种方法适合快速测试调试。 #### 4. 支持多种设备配置 尽管Android系统支持通过单一APK适配多种设备配置,但在某些情况下(如资源过大或需要特定优化),可能仍需创建多个APK。在这种情况下,建议遵循官方文档中的指导[^3],尽量减少多APK的使用场景。 #### 5. 扩展文件的支持 如果应用含大量资源文件(如纹理、音效等),可以考虑使用扩展文件(Expansion Files)。这些文件不会直接打包进APK,而是作为单独的下载内容。扩展文件的命名规则如下: - 主文件:`main.<versionCode>.<packageName>.obb` - 补丁文件:`patch.<versionCode>.<packageName>.obb` 这种方案有助于减小APK体积,同时保持灵活性[^4]。 ### 示例代码 以下是一个完整的Gradle脚本示例,展示如何为不同CPU架构生成多个APK: ```gradle android { compileSdkVersion 30 defaultConfig { applicationId "com.example.app" minSdkVersion 16 targetSdkVersion 30 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } splits { abi { enable true reset() include 'armeabi-v7a', 'x86' universalApk false } } productFlavors { flavor1 { minSdkVersion 21 } flavor2 { minSdkVersion 16 } } } ``` #### 注意事项 - 确保每个APK的`versionCode`唯一且符合升级逻辑。 - 测试所有生成的APK,以验证其在目标设备上的兼容性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值