Android马甲包

一、马甲包介绍

        在App的开发过程中,经常会遇到产品或者运营的同事提出要制作马甲包的需求;马甲包是指与原APP包除了包名,包id,包名称图标等给用户加以区分的东西,其他功能基本不变的APP包。在开发马甲包之前,一定要和产品或者运营的同事讨论清楚马甲包的具体需求,比如需要制作多少个马甲包,马甲包和主包有哪些差别,之后开发的功能是否需要在马甲包上体现等等,只有了解清楚了需求,才能达到事半功倍的效果。


二、马甲包的制作流程

1、新建一个Android项目,名称为MajiabaoTest,如图:

2、配置马甲包applicationId以及应用名称

在app的build.gradle文件中添加马甲包的配置

    defaultConfig {
        applicationId "com.liunian.majiabaotest"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        manifestPlaceholders = [APP_NAME: '主包名称'] // 配置主包的应用名称
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.releaseConfig
        }
        // 第一个马甲包
        majiabaoOne.initWith(buildTypes.release) // 以release的配置来初始化马甲包配置
        majiabaoOne {
            applicationIdSuffix ".majiabaoOne" // 修改马甲包的applicationId,马甲包的application将为com.liunian.majiabaotest.majiabaoOne,即在原来的applicationId后加上配置内容
            manifestPlaceholders = [APP_NAME: '第一个马甲包'] // 配置马甲包的应用名称
        }
    }

在AndroidManifest.xml文件中引用APP_NAME
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="${APP_NAME}"
        tools:replace="android:label"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
同步一下项目(sync project),这个时候在Build Variant中就有马甲包对应的版本了,如图:


在Build Variant中分别选择release和majiabaoOne,编译运行项目,可以得到两个不同的应用

可以看到,两个应用的名称是不一样的,用adb shell dumpsys window | findstr mCurrentFocus分别查看两个应用的applicationId,如下:

两个应用的applicationId是不一样的。

3、修改应用图标icon

Android应用在编译时,会以applicationId后缀编译资源,所有根据不同的马甲包,可以编译不同的资源,如果后缀资源文件中有对应的资源,则将会用后缀资源文件中的资源覆盖主包资源,在src目录下新建一个以马甲包后缀命名的目录,并添加应用icon的资源文件,马甲包即可使用对应的应用图标,如图:


将Build Variant选中为majiabaoOne,运行app,发现马甲包的应用icon已经修改


4、修改应用资源文件

根据上面我们知道,我们可以通过配置马甲包资源文件来修改马甲包的外观,比如主题色,应用图标,文字描述,动画效果等等,下面依次举例说明:

修改应用主题色

我们知道,首先,我们在应用的colors.xml中定义应用的主题色,然后所有和主题色相关的颜色都需要引用该主题色,在main/res/values/colors.xml中定义应用的主题色,如下:

    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>

然后在马甲包的资源文件中覆盖掉主包对主题色的定义,在majiabaoOne/res/values/colors.xml中定义主题色,如下:

    <color name="colorPrimary">#D43C33</color>
    <color name="colorPrimaryDark">#C2352C</color>

在Build Variant中分别选择release和majiabaoOne,运行如下:

修改应用图标的方式前面已经有说过了,参考马甲包应用icon的配置

5、修改文字描述

文字描述我们一般定义在res/values/strings.xml中,我们只需要在马甲包中对对应的文字描述进行重定义,即可修改,下面我们将马甲包主页面中的“Hello World!”修改为“我是一个马甲包!”。

在majiabaoOne/res/values/中新建strings.xml,并对描述文字进行重定义,如下:

    <string name="string_desc">我是一个马甲包!</string>
运行效果如下:

其他如布局(不建议对布局进行重定义,因为后期维护需要维护两套布局文件,容易出错)、动画样式、文字样式、按钮样式等都可以通过这种方式来对重新定义马甲包的UI。

6、在AndroidManifest引用applicationId

在AndroidManifest中我们经常需要通过applicationId定义一些声明等,比如接入极光推送,我们就需要在Manifest文件中声明一下权限:

    <permission
        android:name="com.liunian.majiabaotest.permission.JPUSH_MESSAGE"
        android:protectionLevel="signature" />

前面com.liunian.majiabaotest是applicationId,但是马甲包的applicationId和主包是不一样的,所有不能再Manifest文件中写死,这个时候我们就可以通过引用applicationId来动态定义:

    <permission
        android:name="${applicationId}.permission.JPUSH_MESSAGE"
        android:protectionLevel="signature" />


三、总结

1、我们可以通过修改applicationId来将马甲包和主包区分开

2、我们可以通过重新定义资源文件来修改马甲包的UI显示


附上源码:https://github.com/2449983723/MajiabaoTest.git






猜你喜欢

转载自blog.csdn.net/xiao_nian/article/details/79460952
今日推荐