一、何为马甲、作用
简单的说,一句话就是:APP的小号。
区别:
1. 马甲icon和名字不同,内容和主号基本一样。
2. 有的是针对不同的目标用户,马甲采用主App的部分功能,同时具特别的功能和内容。
3. 不想让大家知道主App,通常App name/icon/应用截图/开屏图片/关键词/开发者账号都会与主App不同
既然马甲跟主开发的app功能差不多,那么为什么要用到马甲呢?个人总结不外乎导量、刷榜、测试等。
导量:(只说搜索导量)目前第三方应用市场上各类app琳琅满目,如何让更多的用户通过搜索找到你的应用嘞。在这个过程中,APP推广者在一开始就该清楚的是,哪些词的流量更高,哪些词的竞争更激烈,哪些词更适合自己的APP等等,只有这样才能使收益最大化。这样蛋疼的推广者会跟你说我们需要咱的app的关键词多一些,咋办嘞?马甲包的作用,上线多几个app跟主app功能一样,描述区别出来就可以了。当然,除了搜索导量,也可以在马甲包里加推送或者各类广告、弹窗来引用户去下载咱的app。
刷榜:刷榜常用方式有:1.积分墙。理论上是真实用户,冲榜量级大,可靠后续补量维持;但冲榜和维榜费用高昂,非一般产品所能承受。2.真机。利用真实 机器操作任务,但不能抹机,否则就成假量了,成本相对较低。3.技术流。机刷,服务器控制操作,成本最低。
测试:替主号进行改版测试,将风险最小化。使用主App进行改版测试新会存在很多弊端,马甲的好处是可以随意更改,一旦引发不良影响有而不会造成大的损失。如果测试效果良好,则可以对主App进行相应功能迭代。
二、创建马甲
这里介绍一下两种方式,第一种是直接复制出来整个项目,修改applicationid和包名、随你改各种资源文件;第二种是同个项目项目夹里多个马甲。
1.
我们要做的是在原来项目的基础复制整个项目然后打开项目副本。
此时的项目和原项目一模一样,切记不要直接在文件夹上动手脚。要用编译软件打开副本中的项目。(android studio)
打开软件后我们先改变包id。
打开项目中app包下的build.gradle文件修改下面代码中星号的位置,将其改成马甲包的名字。(也就是改包名,比如说我们要改星号部分,当然改后面都是一样的,只要我们下面引号中的包名和以前不同就可以了)
applicationId "com.*****.wsjr"
- 1
然后我们开始修改包名。
修改包名不要从AndroidManifest中修改。首先我们打开包的层级
在如图所示位置将compact Empty Middle Packages前面的对勾点掉。
找到星号位置的文件夹,也就是代表你项目名称的文件夹
点击右键选择refzctor下的rename键将其改为你所需要的项目名。此时下面会弹出更改包名还是文件夹名选择第一个更改包名。
然后会弹出如下界面
这里是询问我们是否修改项目中所有用到此包名的地方。因为我的测试项目中只有一个文件所以只出现修改和取消,正常项目可选择Do Refactor All 修改全部。
到这里还没有结束,我们通常会在自定义View或依赖中引用到包名,所以按快捷键Ctrl+shift+f,查找com.*.wsjr字段逐一将星号部分改成马甲包包名。(如果快捷键不好使可能是因为搜狗输入法等将studio的快捷键占去了,把输入法等正在用的软件快捷键关闭即可) 。运行项目,如果项目还有报错,报错的地方肯定与项目名有关,修改成马甲包的名字即可。
2.
在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,编译运行项目,可以得到两个不同的应用
修改应用图标icon
Android应用在编译时,会以applicationId后缀编译资源,所有根据不同的马甲包,可以编译不同的资源,如果后缀资源文件中有对应的资源,则将会用后缀资源文件中的资源覆盖主包资源,在src目录下新建一个以马甲包后缀命名的目录,并添加应用icon的资源文件,马甲包即可使用对应的应用图标,如图:
将Build Variant选中为majiabaoOne,运行app,发现马甲包的应用icon已经修改
修改应用资源文件
根据上面我们知道,我们可以通过配置马甲包资源文件来修改马甲包的外观,比如主题色,应用图标,文字描述,动画效果等等,下面依次举例说明:
修改应用主题色
我们知道,首先,我们在应用的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的配置
修改文字描述
文字描述我们一般定义在res/values/strings.xml中,我们只需要在马甲包中对对应的文字描述进行重定义,即可修改,下面我们将马甲包主页面中的“Hello World!”修改为“我是一个马甲包!”。
在majiabaoOne/res/values/中新建strings.xml,并对描述文字进行重定义,如下:
- <string name="string_desc">我是一个马甲包!</string>
运行效果如下:
其他如布局(不建议对布局进行重定义,因为后期维护需要维护两套布局文件,容易出错)、动画样式、文字样式、按钮样式等都可以通过这种方式来对重新定义马甲包的UI。
在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" />