Android多环境配置打包

需求

打包多个app,App名称,应用图标,包名,启动页都不一样,如果打包一个,然后又替换一下资源,再打下一个,真的会疯了,一次还好,要是有啥bug需要改,又得重新来一遍。。。

app名称-->resValue

如下使用,需要注意的是,在string.xml中不能有相同的字段,否则会报错。 bool、color、dimen也可以使用同样的方法配置

productFlavors {
        myapp1 {
            
            resValue "string", "app_name", "myapp1"
            resValue "bool", "isrRank", 'false'
        }
    }

string:类型 app_name:字段名 myapp1:字段的值,最后生成R.string.app_name = "myapp1"

应用图标-->manifestPlaceholders

使用manifestPlaceholders配置添加,常用于AndroidManifest中 meta-data中数据配置,比如友盟,高德地图,百度地图的key
build.gradle

 productFlavors {
        myapp1 {
            manifestPlaceholders = [
                    UMENG_APPKEY:"key值",
                    app_icon:"@drawable/ic_launcher_myapp1"
            ]
        }
}

AndroidManifest.xml


 

包名-->applicationId

使用这个,也可以方便的区分开测试和生产的包,可以使一台手机安装两个包(Android上安装APK,看是否是同一个app,就是看包名是否一致,不一致则认为是两个不同的app)

 productFlavors {
        myapp1 {
            applicationId 'com.myapp1'
        }
 } 

启动页图片-->buildConfigField

buildConfigField这个应该用得也挺多的,比如生产环境和开发环境,接口地址肯定是不一样的,这时候,就可以通过buildConfigField去配置接口地址,配置完成之后会在BuildConfig.java中生成对应的字段,比如下面的代码:

productFlavors {
        myapp1 {
            buildConfigField 'String', "API_ENV", '"http://192.168.165.191:8081/api/"'
            buildConfigField "Integer", "SPLASH", "R.drawable.screen_myapp1"
        }
        prod {
            buildConfigField 'String', "API_ENV", '"http://xx.xx/api/"'
            buildConfigField "Integer", "SPLASH", "R.drawable.screen_prod"
        }

对应的在BuildConfig.java文件中会生成:

public static final String API_ENV = "http://192.168.165.191:8081/api/";
public static final Integer SPLASH = R.drawable.screen_myapp1;

使用的时候直接调用BuildConfig.API_ENV就可以获取到当前环境的地址。极大的简便了每次打包修改环境的麻烦(或许会觉得这样接口地址很容易被反编译的找到,但是接口地址,直接抓包也很容易拿到。。。)。同样的启动页也可以直接调用mIvSplash.setBackgroundResource(BuildConfig.SPLASH)设置

通过以上方式,我们基本可以 通过 gradle 动态设定应用标题,应用图标,替换常量,设置不同包名,更改渠道等等。

切换运行时环境

在左下角打开Build Variant选项,选择需要的运行配置,每个环境都有debug和release选择


Android多环境配置打包_第1张图片
切换运行时环境

完整代码

build.gradle

android {
    flavorDimensions 'api'
    productFlavors {
        myapp1 {
            resValue "string", "app_name", "myapp1"
            buildConfigField 'String', "API_ENV", '"http://192.168.165.191:8081/api/"'
            buildConfigField "Integer", "SPLASH", "R.drawable.screen_myapp1"
            manifestPlaceholders = [
                    app_icon:"@drawable/ic_launcher_myapp1"
            ]
            applicationId 'com.myapp1'
        }
        myapp2 {
            resValue "string", "app_name", "myapp2"
            buildConfigField 'String', "API_ENV", '"http://xx.xx/api/"'
            buildConfigField "Integer", "SPLASH", "R.drawable.screen_myapp2"
            manifestPlaceholders = [
                    app_icon:"@drawable/ic_launcher_myapp2"
            ]
            applicationId 'com.myapp2'
        }
    }
}

AndroidManifest.xml



参考

Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)

你可能感兴趣的:(Android多环境配置打包)