最近接到产品一个需求,需要将现有工程打一个新的apk出来,要给到新客户使用,需要替换appIcon, appName, appId以及切换新的api接口需要切换新的地址。
场景大概如下图:
二话不说,直接上代码
第一步:添加productFlavors配置
打开项目app工程的
build.gradle
文件,在android {}
标签里面添加下面代码
productFlavors {
_pro_hongyuan {
applicationId "com.bibt.aide"
resValue("integer", "app_evn", "1")
resValue("string", "app_name", "智运维-弘源")
manifestPlaceholders = [
app_icon : "@mipmap/ic_launcher",
package_name: applicationId,
JPUSH_PKGNAME: applicationId,
JPUSH_APPKEY : "xxxxxxxxxxxxxxxxxxxxxx", //极光开发平台上注册的包名对应的appkey.
JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可.
]
}
_pro_wantong {
applicationId "com.bibt.wantong"
resValue("integer", "app_evn", "2")
resValue("string", "app_name", "智运维-万通")
manifestPlaceholders = [
app_icon : "@mipmap/ic_launcher",
package_name: applicationId,
JPUSH_PKGNAME: applicationId,
JPUSH_APPKEY : "xxxxxxxxxxxxxxxxxxxxxx", //极光开发平台上注册的包名对应的appkey.
JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可.
]
}
}
然后还需要在build.gradle
里面的defaultConfig{}
标签里面添加这个配置flavorDimensions "default"
defaultConfig {
//其他配置项省略
flavorDimensions "default"
}
不加这行会报这个错
第二步:配置fileprovider信息
打开App的
AndroidManifest.xml
文件,在application标签内添加provider节点
注意看了,这里引用了package_name
变量,而package_name
变量是在步骤一的productFlavors
中声明的
第三步:新建file_paths.xml
文件
在app/src/res目录中新建xml文件夹,并新建文件file_paths.xml
,文件内容为
这里同样的,也是用了变量值package_name
到这里也就完成了,可以直接编译打包。
过程比较痛苦,作者我遇到一个问题困扰许久,给大家分享下,避免大家跟我一样浪费时间,报错截图如下
这个错误的意思大概就是
com.bibt.aide.DataProvider
已经被使用了,话里话外的意思就是要我把com.bibt.aide这个换成别的,当时我是一脸懵逼的,因为,我已经在productFlavors 中定义了package_name,而且也作为变量引用到了AndroidManifest.xml和file_path.xml两个文件当中,理论上是没有问题的呀,而且在网上搜索该问题,其他博主也都是说这里用变量引用替换即可,于是我新建了一个helloword工程,将上面配置信息填入,结果发现没有任何问题,可以根据productFlavors 打出不同的apk包。
后面我仔细对比,最后发现还有一个地方的AppId是写死的
于是乎,我将其注释掉,一起添加到productFlavors(步骤一已经配置过了)中,然后编译打包,一票通过,也就是说,替换AppId以及packageName的时候,也要考虑第三方引用变量。
第四步:根据productFlavors 配置中的app_evn字段,切换不同的服务器地址,代码如下
/**
* 该方法在Application的OnCreate方法里面调用即可
* 初始化服务器
*/
private void initServer(){
int server = getResources().getInteger(R.integer.app_evn);
if(server == HttpServerGet.ENV_TEST){
//测试环境
HttpServerGet.DEFAULT_ENV = HttpServerGet.ENV_TEST;
LogWrite.d("initServer:"+"测试环境", LogModel.MODEL_COMMON);
}else if(server == HttpServerGet.ENV_HONGYUAN){
//弘源-生产环境
HttpServerGet.DEFAULT_ENV = HttpServerGet.ENV_HONGYUAN;
LogWrite.d("initServer:"+"弘源-生产环境", LogModel.MODEL_COMMON);
}else if(server == HttpServerGet.ENV_WANTONG){
//万通-生产环境
HttpServerGet.DEFAULT_ENV = HttpServerGet.ENV_WANTONG;
LogWrite.d("initServer:"+"万通-生产环境", LogModel.MODEL_COMMON);
}
}
最后分享一张打包成功的截图