Android:如何优雅的开发马甲包?
一、什么是马甲包
马甲包是利用各大市场规则漏洞,通过技术手段,多次上架同一款产品的方法。马甲包和主产品包拥有同样的内容和功能,除了icon和应用名称不能完全一致,其他基本一致。
二、为什么做马甲包,做马甲包有什么好处?
1.最核心的作用是获取有效客户。另外一方面是增加关键词的覆盖量,众所周知,单个APP只能有100个字符的关键词,多个APP就意味着可以覆盖N×100个字符的关键词,关键词覆盖越多,就意味着能够被更多的客户搜索到,有展现量,才有下载量,有下载量才有可能发展成为有效客户。
2.抗风险
正常情况下,任何一款产品都是要不断的更新功能的。如果我们直接在主包上更新,一旦新功能不被用户接受那就损失大了,我们前期大量投资带来的用户将会流失,这对很多产品开发者来说是不可承受之痛。
如果使用马甲包,则可以随意测试新功能,好的功能就在主包上迭代,不好的也无所谓,马甲包本身就是来背锅的。
3.导量
主包和马甲包属于同一个平台,用户信息可以共享通过弹窗,广告,Push等引导用户下载主App。有一部分App接了网盟相互导流。
4.刷榜
积分墙;理论上是真实用户,冲榜量级大,可靠后续补量维持;但冲榜和维榜费用高昂,非一般产品所能承受。
真机;利用真实机器操作任务,但不能抹机,否则就成假量了,成本相对较低。
技术流;机刷,服务器控制操作,成本最低。
上面三种方式,机刷是最便宜的,但是风险高,容易被发现下架,所以一般用马甲包来做机刷,以此来抵抗风险。
了解了什么是马甲包,下面就来讲一下Android怎么做马甲包
看了很多方案最多的就是复制一套代码,修改包名,当然是可行的,但是也有一个弊端,马甲包越多,代码越多,版本越多,项目越多,一次更新要修改很多马甲包,这样维护会死人的,亲身经历!
那么如何优雅的开发马甲包呢?前提是一套代码!
马甲包开发,首先要了解android怎么区分不同的APP,作为开发者当然第一反应就是PackageName,这样说虽然也对,但是并不严谨,为了这个问题,我特意询问了应用商店的客服(毕竟马甲包也是为了上架),新建应用的包名是applicationID,还是PackageName,当然客服的回答并不理想,他们也不熟悉,然而我们去查看android的开发者文档,会明确的告诉你,android应用是根据applicationID区分的,只不过用早期eclipse开发项目时没有applicationID和PackageName的区分,就默认二者是一样的,到了android studio开发时,二者默认也是一样的,但是也可以不一样,那么我们就可以通过修改applicationID来打包不同的马甲包,接下来介绍马甲包需要修改的地方如何修改。这里有我遇到的三个坑需要处理
APP名称、icon怎么修改呢?
微信分享支付、支付宝支付会有影响吗?
某些sdk跟签名绑定的(例如:阿里人脸识别)
首先看怎么结局解决app名称和不同资源
build.gradle文件:
apply plugin: 'com.android.application'android {compileSdkVersion 28defaultConfig {flavorDimensions "lee"minSdkVersion 21targetSdkVersion 28versionCode 1versionName "1.0"javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } }testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}signingConfigs {app {storeFile file('keystore')storePassword "123456"keyAlias 'slice'keyPassword "123456"}}buildTypes {release {debuggable falseminifyEnabled true// Zipalign优化zipAlignEnabled true// 移除无用的resource文件shrinkResources truesigningConfig signingConfigs.appproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}debug {debuggable truesigningConfig signingConfigs.appzipAlignEnabled falseshrinkResources falseminifyEnabled false}}//多渠道配置productFlavors {app {//主包appapplicationId "com.example.baseslicedemo"versionName "1.0.0"buildConfigField "String", "channel", "\"10000\""}app1 {//马甲包appapplicationId "com.example.baseslicedemo1"versionName "1.0.0"//马甲包不同的配置 可以在这里设置 我这里设置的是渠道 可以自行配置buildConfigField "String", "channel", "\"10001\""}}//jenckins 自动化多渠道打包配置applicationVariants.all { variant ->variant.outputs.all { output ->def newNamenewName = "${applicationId}-" + variant.buildType.name + ".apk"outputFileName = new File(newName)println "outputPath:" + variant.getPackageApplication().outputDirectory}variant.assemble.doLast {println "outputPath:" + variant.getPackageApplication().outputDirectory + "/output.json"delete "${variant.getPackageApplication().outputDirectory}/output.json"}}
}dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'androidx.appcompat:appcompat:1.2.0'implementation 'androidx.constraintlayout:constraintlayout:2.0.4'testImplementation 'junit:junit:4.12'androidTestImplementation 'androidx.test.ext:junit:1.1.2'androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'implementation project(path: ':base')
}
上面就是打包的命令,可以一键打出所有马甲包,也可以单独打,通过配置不同的路径资源,还可以打出不同名字和资源的马甲包下面就是安装后的应用
主包和马甲包1。
因为我设置了不同的渠道,不同的应用名,和颜色的不同,下面是应用打开后
经过上面的配置和操作之后,就可以保证在同一套代码的情况下打出不同包名的应用,只需要改改app名字、资源、颜色就可以上架了是不是很简单。
下面就是进阶版了,和包名密切相关的功能。
我们正常的开发中会遇到微信登录和支付,支付宝支付是没有问题的,微信的登录和支付会回调给包名路径下面的Activity,这种情况下有两种方案可以实现,
1、是在项目里面创建一个和马甲包的包名一样的文件路径,例如:
2、就是现在比较流行的组件化,组件的包名要和马甲包的包名一样,我推荐是这样做,这样可以把需要验证包名、或者依赖包名回调的SDK都可以。比如,阿里的面部识别SDK 组件化怎么实现就不多做介绍了,不会的同学去看看组件化是怎么实现的。
这里还有一个问题,Android 多渠道打包-马甲、白皮包无法安装在同一手机的问题。
经过排查之后发现不是applicationId的问题造成的,网上也没其他解决办法,最后发现解决办法是
自定义provider的问题。发生错误的代码:
// 自定义provider
<provider
android:name=".utils.MyFileProvider"
android:authorities="com.xxx.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
</provider>
如上,authorities中属性,一开始没注意写的com.xx.xx也就是自己取的自定义的名字
改为如下:
// 自定义provider<providerandroid:name=".utils.MyFileProvider"android:authorities="${applicationId}.fileProvider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths"></meta-data></provider>
或者直接将provider放到上面提到的组件化里面去,就不会有这个问题了 。
Demo地址
https://github.com/lixuce248/VestBagDemo.git
当你下定决心,准备前行的时候,剩下的只有坚持了。。。
大家如果觉得我写的还可以的话,请关注我的微信公众号
Android:如何优雅的开发马甲包?相关推荐
- android 教你如何创建马甲包
看到马甲包 很多人应该都知道 也有很多人不知道 知道马甲包的 看到我的文章的话 那里有不足还请多多指教不知道马甲包的 带你看看一个新的世界 好了 废话不多说 看下面的具体操作来实现 在看具体操作之前 ...
- iOS开发马甲包被拒
1.更换整体项目. 2.更换BundleID.苹果账号.换服务器.换域名IP地址. 3.修改代码.逻辑混淆.添加依赖库. 4.更换主题色.AppIcon.界面改变. 5.项目简介含糊描述. 6.上线时 ...
- Android马甲包
一.马甲包介绍 在App的开发过程中,经常会遇到产品或者运营的同事提出要制作马甲包的需求:马甲包是指与原APP包除了包名,包id,包名称图标等给用户加以区分的东西,其他功能基本不变的A ...
- iOS马甲包开发招式及规避4.3方法合集
看了下上周的留言,有些开发者老是抱怨马甲包又被拒了,该如何上包才安全,我对这块也算略知一二,也有朋友是做这块的,一些规避手段我还是知晓一二,我今天结合了网上的资料以及几位朋友的一些意见,把这些经验分享 ...
- 马甲包审核被拒对应的处理方案
写在前面 马甲包审核被拒,目前网上流传最广的就是2.1和4.3,在查看了很多文章之后,从两篇介绍的比较详细的文章中把这两个大礼包对应条款的解决方案,整理出来,为开发马甲包做一个准备,同时分享给大家. ...
- iOS马甲包上架招式
一.什么是马甲包 马甲包是利用App store 规则漏洞,通过技术手段,多次上架同一款产品的方法.马甲包和主产品包拥有同样的内容和功能,除了icon和应用名称不能完全一致,其他基本一致. 二.为什么 ...
- android app套壳马甲开发,Android应用开发最佳实践:马甲包配置管理
在过去的半年时间中,由于行业大环境的恶化,App产品需求一直处于停滞状态,接到的都是市场导向的马甲包需求.随着马甲包的不断增多,build.gradle文件的内容长度开始变得难以接受,于是优化之旅随之 ...
- IOS+Android马甲包封装上架!
目的 我们有自己的一个主网站平台,为了推广我们的主网站平台,我们需要长期制作大量马甲app,然后引导用户到我们的主网站游戏,所以,你制作的app的功能只给审核人员看到,只是为了应付审核,app上架之 ...
- android app 马甲包,教你一招APP如何快速定制马甲包
废话不多说,给我上····· 按照本文进行定制马甲包的好处: 马甲包和主包可以进行同步打包,一键生成 不会增加apk的大小,不同的包打进对应的资源 不影响主线的开发(无须拉分支.版本迭代时增加的需求, ...
最新文章
- 不想学python-为什么自学python总是坚持不下去,这篇文章给你解答!
- php三位不够前面加0,php 格式化数字 位数不足前面加0补足的实现方法
- boost::spirit模块实现一个雇员结构的解析器的测试程序
- 进程间通信:管道和命名管道(FIFO)
- Spring IOC扫描器与注册器
- mysql群集配置_mysql8 参考手册-NDB群集配置参数,选项和变量概述
- 一开始买的是MacBook air,后来分了专业之后发现要用的软件需要Windows系统,该怎么办?
- HTML入门之003
- JVM执行子系统探究——类文件结构初窥
- 无IDE时,使用支持HTML5的浏览器作编辑器的方法
- 五年从程序员到架构师 架构师进阶之路
- 让你5分钟明白美国金融危机爆发的原因!
- ie浏览器出现代理服务器没有响应
- Python + qrcode 实现文字转二维码
- 【java多线程】多线程为什么跑的比单线程还要慢?!
- 基于 JavaFX 开发的聊天客户端 OIM-即时通讯
- DTV 学习(一) 基本概念、分类
- 最简单方法!!用python生成动态条形图(解决报错问题!)
- 图解Linux命令之--mkfs命令
- 如何查看快门使用次数v2