Android productFlavors 实现多项目打包

开发者 2024-9-10 07:57:09 45 0 来自 中国
近来接到产物一个需求,必要将现有工程打一个新的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"    }不加这行会报这个错

2.png
第二步:设置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);        }    }末了分享一张打包乐成的截图
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-23 19:59, Processed in 0.186911 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表