神马马甲包?可以穿的么?人可以穿么?
无鞋。。。
大家听得最多的还是马甲账号,道理差不多,注册在多账号,注册的人还是你自己。
这里的马甲由宿主APP,通过配置gradle,生成与原APP除了包名、包ID、包名称图标等类似的部分,满足不同差异化兼容需求
步骤
1.主modlle-build.gradle配置
2.Manifest.xml配置
3.Build Variants
4.差异化
1.modle-build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
defaultConfig {
applicationId "com.xyz.app"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
manifestPlaceholders = [APP_NAME: 'com.xyz.app.majiatxt'] // 配置主包的应用名称
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
// 马甲包
majiabao1.initWith(buildTypes.debug) // 以release的配置来初始化马甲包配置
majiabao1 {
// 修改马甲包的applicationId(这里是原包名后追加:com.xyz.app.majiabao1)
applicationIdSuffix ".majiabao1"
manifestPlaceholders = [APP_NAME: '马甲包一'] // 配置马甲包的应用名称
}
// 马甲包
majiabao2.initWith(buildTypes.debug) // 以release的配置来初始化马甲包配置
majiabao2 {
// 修改马甲包的applicationId
applicationIdSuffix ".majiabao2"
manifestPlaceholders = [APP_NAME: '马甲包二'] // 配置马甲包的应用名称
}
}
}
//省略无用
2、配置清单
<application
android:allowBackup="true"
android:icon="@mipmap/icon_collection_pre2"
android:label="${APP_NAME}"
tools:replace="android:label"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
</application>
同步一下项目
3、打开侧边框的Build Variants
可以看到已经有了,选择对应的版本,就会生成不同版本的马甲APP
4、资源替换
对于不同版本马甲,可以在src建立和前面马甲包一样的后缀文件夹,在app>src下面创建一个majiabao1名字的目录(和app>src>main同级),然后在该目录下创建res目录,参考main里面的资源文件放入对应的差异化资源,这里不在演示。
问题扩展
1.Manifest merger failed : Attribute application@label value=(@string/app_name)
原因:
原因是工程A和工程B中的AndroidManifest.xml文件中都使用了app name,合并manifest的过程出现了问题
解决方法:
添加 以下两句
<manifest
...
xmlns:tools="http://schemas.android.com/tools"
...
<application
...
android:label="@string/mcs_app_name"
tools:replace="android:label"
//B工程示例
<application
...
android:label="@string/app_name"
...>
2.Unable to resolve dependency for ':app@common/compileClasspath': Could not resolve project :XXX
原因:
主工程的buildTypes有多个类型,而子module没有对应,导致马甲编译时不能与之匹配
解决方法:
子module中的buildTypes {} 中的节点 数量和名称一致即可,内容可以不一致。
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
}
majiabaoOne {
}
}
3.INSTALL FAILED CONFLICTING PROVIDER
在Android中authority要求必须是唯一的,定义一个provider时需要为它指定一个唯一的authority,系统会检查当前已安装应用的authority是否和你要安装应用的authority相同,一但相同就会出来这个问题。
解决方法:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
1.通过${applicationId}.fileprovider的形式来指定provider的authorities
2.authorities会根据applicationId的不同而不同
3.获取时,可以通过包名+fileprovider来获取
public final static String getFileProviderName(Context context){
return context.getPackageName()+".fileprovider";
}