美文网首页
Android使用Gradle自动化实现分渠道打包、app标识、

Android使用Gradle自动化实现分渠道打包、app标识、

作者: tikeyc | 来源:发表于2023-08-24 11:17 被阅读0次
    • 场景:
      多渠道打包、版本共存、区分线上线下版本
    1. 假设项目分正式环境和测试环境两个版本,两个版本需要同时安装在一个手机上,此时需要两个applicationId
      com.tikeyc.onlinecom.tikeyc.offline
    defaultConfig {
            applicationId "com.tikeyc.online" // 正式
            // applicationId "com.tikeyc.offline" // 测试
    }
    
    1. 添加环境标记,在打包时指定线上线下环境
    buildTypes {
            release {
                buildConfigField("boolean", "online", "${defaultConfig.applicationId == "com.tikeyc.online"}")
            }
            debug {
                buildConfigField("boolean", "online", "${defaultConfig.applicationId == "com.tikeyc.online"}")
            }
    }
    

    编译后在BuildConfig.class中会自动生成online

    public final class BuildConfig {
      public static final boolean DEBUG = Boolean.parseBoolean("true");
      public static final String APPLICATION_ID = "com.tikeyc.online";
      public static final String BUILD_TYPE = "debug";
      public static final int VERSION_CODE = 1;
      public static final String VERSION_NAME = "1";
      // Field from build type: debug
      public static final boolean online = true;
    }
    

    在JAVA业务代码中使用

    public class MyContactsURL {
      public static final String host = BuildConfig.online ? "online .xxx.xx" : "offline.xxx.xx";
    }
    
    1. 指定线上、线下版本的applicationId和签名文件
    defaultConfig {
            applicationId "com.tikeyc.online" // 正式
            // applicationId "com.tikeyc.offline" // 测试
    }
    signingConfigs {
            def online = defaultConfig.applicationId == "com.tikeyc.online"
            def file = online ? file("./online.jks") : file("./offline.jks")
            def alias = online ? "online" : "offline"
            release {
                storeFile file
                storePassword "online.123"
                keyAlias alias
                keyPassword "online.123"
            }
            debug {
                storeFile file
                storePassword "offline.123"
                keyAlias alias
                keyPassword "offline.123"
            }
    }
    buildTypes {
            release {
                buildConfigField("boolean", "online", "${defaultConfig.applicationId == "com.tikeyc.online"}")
                signingConfig signingConfigs.release
                buildConfigField "boolean", "LOG_DEBUG", "false" //不显示log
                minifyEnabled false // 打包是否代码混淆
                shrinkResources false // 是否打开资源压缩
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
            debug {
                buildConfigField("boolean", "online", "${defaultConfig.applicationId == "com.tikeyc.online"}")
                signingConfig signingConfigs.debug
            }
    }
    
    1. 自动化配置AndroidManifest.xml文件中的值
      比如配置百度地图的API_KEY
    <meta-data
        android:name="com.baidu.lbsapi.API_KEY"
        android:value="${BAIDUMAP_KEY}" />
    

    build.gradle文件中设置manifestPlaceholders

    defaultConfig {
            applicationId "com.tikeyc.online" // 正式
            // applicationId "com.tikeyc.offline" // 测试
            if (applicationId == "com.tikeyc.online") {
                manifestPlaceholders = [
                        BAIDUMAP_KEY: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                ]
            } else {
                manifestPlaceholders = [
                        BAIDUMAP_KEY: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                ]
            }
    }
    
    1. 配置打包后的apk名称
    android.applicationVariants.all {
            variant ->
                variant.outputs.all {
                    // 在这里修改apk文件名
                    // outputFileName = "tikeyc.apk"
                    def suffix = variant.applicationId == "com.tikeyc.online" ? "online" : "offline"
                    outputFileName = "tikeyc-${suffix}.apk"
                }
    }
    

    相关文章

      网友评论

          本文标题:Android使用Gradle自动化实现分渠道打包、app标识、

          本文链接:https://www.haomeiwen.com/subject/wqvmmdtx.html