近来接到产物一个需求,必要将现有工程打一个新的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节点
<provider android:name="androidx.core.content.FileProvider" android:authorities="${package_name}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>注意看了,这里引用了package_name变量,而package_name变量是在步调一的productFlavors 中声明的
第三步:新建file_paths.xml文件
在app/src/res目次中新建xml文件夹,并新建文件file_paths.xml,文件内容为
<?xml version="1.0" encoding="utf-8"?><paths> <external-path path="Android/data/${package_name}/" name="files_root" /> <external-path path="." name="external_storage_root" /> <external-path path="." name="external_files" /></paths>这里同样的,也是用了变量值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); } }末了分享一张打包乐成的截图
|