Android配置马甲包

神马马甲包?可以穿的么?人可以穿么?

无鞋。。。

大家听得最多的还是马甲账号,道理差不多,注册在多账号,注册的人还是你自己。
这里的马甲由宿主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、配置清单



同步一下项目

3、打开侧边框的Build Variants

20190402161723356.png

可以看到已经有了,选择对应的版本,就会生成不同版本的马甲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的过程出现了问题
解决方法:
添加 以下两句

//B工程示例
    

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相同,一但相同就会出来这个问题。

解决方法:


    

1.通过${applicationId}.fileprovider的形式来指定provider的authorities
2.authorities会根据applicationId的不同而不同
3.获取时,可以通过包名+fileprovider来获取

public final static String getFileProviderName(Context context){
    return context.getPackageName()+".fileprovider";
}

你可能感兴趣的:(Android配置马甲包)