前言
去年公司因为某家客户的安全性和私密性的要求,需要我们提供不同包名不同签名的APP上传到谷歌应用市场。客户的硬性要求,怎么办呢,只能硬着头皮上了。当时时间又紧急,无奈之下只能给这家客户单独维护一套代码。由此开始了苦逼的合代码工作,一到发布的时间点,需要维护两套代码,作为程序员坚决不能忍啊,于是乎开始了回归正轨的工作。
摘要
此篇博客主要参考一下两篇文章,有兴趣的同学可以查阅:
app拆分,多产品打包实录.md
一套源码编译多个 APP,不同签名,不同接口等配置
方案
有一定基础的同学应该都知道要想实现不同的包名,不同的签名,不同的应用名称,不同的应用图标等最好的方案就是使用gradle.
首先实现第一步:
这上面设置的几个参数相信大家应该不陌生,applicationId代表你的应用包名,这边大家要和packageName作区分,前者负责APP进程的id,后者负责R包名以及四大组件的包名。resValue 和 manifestPlaceholders主要用来设置名称图标和第三方的key值。manifestPlaceholders在manifest中用占位符来表示,例如:android:icon="${app_icon}"
你按照如上代码运行这里边会有几个坑,倾听我一一道来:
(1).Error:All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html
google了一下大致是说,Plugin 3.0.0之后有一种自动匹配消耗库的机制,便于debug variant 自动消耗一个库,然后就是必须要所有的flavor 都属于同一个维度。所以你需要在主APP里面添加flavorDimensions "versionCode",然后再productFlavors每个子项里面分别加上dimension "versionCode"
(2).Error:Execution failed for task ':EroadProduct:mergeEroadDebugResources'.> [string/app_name] /Users/wanjuanjuan/Downloads/android_git/ehr-android/EroadProduct/res/values/strings.xml [string/app_name] /Users/wanjuanjuan/Downloads/android_git/ehr-android/EroadProduct/build/generated/res/resValues/eroad/debug/values/generated.xml: Error: Duplicate resources
有冲突需要把strings.xml文件里的app_name删除
(3).需要把第三方使用到的key,id等作区分,在manifest里用占位符,在代码里可以用BuildConfig.FLAVOR进行区分
(4).signatures are inconsistent
接下来最主要的就是签名这一块,准备两份签名文件,参考如下格式,
在productFlavors分别去引用他,例如signingConfig signingConfigs.eroad
总结
以上是我对一套源码多个APK的理解,有错误请纠正,O(∩_∩)O谢谢!