android使用graldle打渠道包

使用Gradle配置打出不同的渠道包

需求如下

我们要使用一套代码打出几个包,包与包的差异如下:

1.icon不同

2.app_name不同

3.登录的机构id不同(即每个包的机构id不相同)

开始改造

打开app模块的build.gradle

我们这里虚拟两个包,苹果和香蕉

android{//android模块下创建productFlavors
  defaultConfig{
    applicationId ""
    //...
    flavorDimensions "default"//在AS3.0+,需要添加这句
  }
    productFlavors{
        apple{

    }
    banana{

    }
    }
}

需要注意,需要在defaultConfig中添加配置项flavorDimensions "default",否则会报错

All flavors must now belong to a named flavor dimension. Learn more at…

我们可以在apple/banana中添加丰富的配置,如下

apple {
      // 每个环境包名不同,单独配置的applicationId会覆盖默认值
      applicationId "com.apple.dev"
    // 动态添加 string.xml 字段;
    // 注意,这里是添加,在 string.xml 不能有这个字段,会重名!!!
    resValue "string", "app_name", "dev_myapp"
    resValue "bool", "isrRank", 'false'
    // 动态修改 常量 字段
    buildConfigField "String", "ENVIRONMENT", '"dev"'
    // 修改 AndroidManifest.xml 里渠道变量
    manifestPlaceholders = [UMENG_CHANNEL_VALUE: "dev"]
}

为我们不同的包,添加不同的app_name,BuildConfig字段

    productFlavors{
        apple{
      resValue "string", "app_name", "苹果"//不同的appname
      buildConfigField "String", "ENVIRONMENT", '"dev"'
      buildConfigField "int", "VALUE", '22'
      buildConfigField "boolean", "HTTPS", 'true'
    }
    //...
    }

我们看到BuildConfig字段中的 String值,使用的是'"dev"'

我们查找了资料发现有很多种写法。如下

// 单引号写法
buildConfigField 'String', 'string1', '\"string1value\"'
// 双引号写法
buildConfigField "String", "string2", "\"string2value\""
// 单双引号的写法,最简洁不⽤转义,推荐该写法
buildConfigField 'String', 'string3', '"string3value"'

根据查阅的资料,还是推荐单引号引用双引号的

如果只是一个双引号。会直接把字串中的值,复制到BuildConfig中,丢掉双引号,如下面的int 值和boolean值,直接使用双引号即可

另外注意:

app_name在string.xml中我们要删除,不然会出现重名错误

我们再看一下如何设置不同的icon

<application
    android:icon="${app_icon}"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    ...
    <meta-data
        android:name="UMENG_CHANNEL"
        android:value="${ENVIRONMENT}" />
    ...
</application>

设置如下:

productFlavors {
    apple {
        manifestPlaceholders = [ENVIRONMENT: "apple",
                                app_icon   : "@drawable/icon_apple"]
    }
    banana {
        manifestPlaceholders = [ENVIRONMENT: "banana",
                                app_icon   : "@drawable/icon_banana"]
    }
}

重要的一点

因为上面的apple|banana是我们另添加的配置,我们运行代码时也会使用到,所以我们在defaultConfig 也要添加一份相同配置

问题解决

问题1:

在使用resValue时,我们发现在<manifest标签中,使用

android:label="@string/app_name" 时,会显示我们引用的三方库中的app_name,怎么也无法显示我们定义的”苹果“,”香蕉“这个应用名称

resValue "string", "app_name", "苹果"

我们使用下面的方式解决

使用manifestPlaceholders,不再使用res/string的资源

huawen{
            manifestPlaceholders=[app_icon:"@mipmap/ic_launcher",gpis_app_name:"苹果"]
            buildConfigField "int", "org_id", '20'
        }

在Manifist.xml中使用如下

<application
        android:name=".MainApplication"
        android:allowBackup="true"
        android:icon="${app_icon}"
        android:label="${gpis_app_name}"
        ...
        tools:replace="android:allowBackup,android:theme,android:name,android:label"
        tools:targetApi="n">

关键点在添加:

tools:replace="android:label"

否则会报错误。

暂无评论

相关推荐

记录包

http://package.cn-bj.ufileos.com/android%2Fprod-zmyl%2Ftitan-large-screen-android_x-7.1.8-203_0000_prod-zmyl_10 …

记录包

http://package.cn-bj.ufileos.com/android%2Fprod-zmyl%2Ftitan-large-screen-android_x-7.1.8-203_0000_prod-zmyl_10 …

微信扫一扫,分享到朋友圈

android使用graldle打渠道包