关于马甲包的方式,会从最简单的方式开始介绍:
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL}" />
android {
defaultConfig {
flavorDimensions "versionCode"
}
productFlavors {
GS1408 {//默认母包
applicationId = "com.gs"
manifestPlaceholders = [app_name: "主包",
icon : "@mipmap/logo",
style : "@style/SplashAppTheme"
]
}
JSQ{
applicationId = "com.gsjsq"
manifestPlaceholders = [app_name : "马甲包1",
icon : "@mipmap/logo",
style : "@style/SplashAppTheme",
]
}
BJ {
applicationId = "com.gsbj"
manifestPlaceholders = [app_name : "马甲包2",
icon : "@mipmap/logo",
style : "@style/SplashAppTheme",
]
}
productFlavors.all { flavors ->
manifestPlaceholders.put("UMENG_CHANNEL", name)
}
}
}
<application
android:allowBackup="true"
android:icon="${icon}"
android:label="${app_name}"
android:networkSecurityConfig="@xml/network_security_config"
android:roundIcon="${icon}"
android:supportsRtl="true"
android:theme="${style}"
tools:replace="android:label">
//tools:replace="android:label" 别忘了这个需要配置
</application>
到这里已经完成多名多icon了,这里只是替换了不同app名字、style主题、包名
这种方式没有替换app内部的任何布局或资源。这种肯定不行的,市场审核不一定通过啊。
注意:GS1408是母包,测试时把它隐藏、或者不要放到第一位,as编译运行时默认取的第一个渠道。
2. 再放入不同渠道的资源时,切记资源一定要和主包命名一样
这样在你编译时打包时,AS在打包时会根据不同的渠道把不同马甲包的资源打进来。
图片的使用:
// 跟正常的使用没区别
<ImageView
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="wrap_content"
android:src="@mipmap/home_select"
android:layout_height="wrap_content"/>
到这里就完成了马甲包的定制。
到这里的操作,都是默认指,资源都在一个app下的情况。
lib的AndroidManifest.xml
lib的gradle
注意:app的gradle下配置几个,这里也要配置几个,否则会报错。
不同的是,这里只要声明就可以,不需要具体在配置,如下面代码配置:
defaultConfig {
flavorDimensions "versionCode"
}
productFlavors {
// GS1408 {
// }
MJ {
}
JSQ {
}
productFlavors.all { flavors ->
manifestPlaceholders.put("UMENG_CHANNEL", name)
}
}
马甲包配置:
上文介绍的配置依旧保留
1.资源都在同一个lib_res下,app直接依赖lib_res
配置一样切记!切记!切记!
lib_res、modle下的productFlavors
配置是一样的多渠道的先后顺序一定要和app的productFlavors
配置顺序一样
这样才更好的方便你测试
productFlavors
productFlavors
productFlavors
productFlavors
多渠道中的productFlavors
多渠道名字的配置、顺序一样要保持
命名一定要一样
不足:
以上的介绍,比较适用app内部结构布局变化不怎么大的情况,改动较大的化,就额外需要用代码控制了。还有一些具体的细节场景,只是靠配置实现不了,需要用代码区分不同马甲包。
以上完成了马甲包配置,但是有个缺陷:当你需要来回切换不同马甲包的形式去测试app时,需要来回更改渠道的配置:第一种:需要来回去屏蔽多渠道的配置,只保留要测试渠道配置一个,这样才能运行对应的马甲包。第二种:把要测试的马甲包,其渠道配置放到第一位,编译运行(这种有缺陷,as的缓存会导致你运行后还是之前的编译过的包,我的AS是3.4.2的版本,我是碰到了)
尤其是在组件化的项目的,因为modle中也配置了渠道配置,所以切换不同马甲包来回测试时比较麻烦。
按照以下2步
完美解决上述的补充缺陷
1. 在gradle.properties中配置
// true 代编当前编马甲包 false 表示不编译
isMjQYS=true
#isMjQYS=false
#isMjQGS=true
isMjQGS=false
#
#isMjIGS=true
isMjIGS=false
#
#isMjJSQ=true
isMjJSQ=false
2. 在app 的 build.gradle中增加 是否编译的判断
这里就解决了:来回切换不同马甲包测试的麻烦
记得配置好第一步先编译!
注意⚠️:如果发现配置的 gradle.properties中的属性 isMjQYS等 不能使用
,可以在app的gradle中配置:
dependencies {
if (isMjQYS.toBoolean()) {}
if (isMjQGS.toBoolean()) {}
if (isMjJSQ.toBoolean()) {}
if (isMjIGS.toBoolean()) {}
}
编译后就可以继续使用了!
如果toBoolean()
调用不到,可直接手打也行,不影响的。 《我配置时就是 不提示这个方法》
如果是模块组件化项目,上述操作保持不变,在modle或者公共lib(配置了多渠道方式的lib)中 可以按照第二步以及注意
⚠️这样的操作配置即可!
贴出我的公共lib和其中一个modle的配置:
dependencies {
if (isMjQYS.toBoolean()) {}
if (isMjQGS.toBoolean()) {}
if (isMjJSQ.toBoolean()) {}
if (isMjIGS.toBoolean()) {}
}
编译后就可以继续使用了!
后续测试马甲包,只需要根据更改gradle.properties中的属性的boolean值
即可!
完结!
如果对你有帮助,请帮忙点个赞吧!
如有什么描述错误的请指出,我会及时纠正!
Thanks