flutter上架马甲包过审:
所谓马甲包,就是完全复制主包功能或保留部分功能分身包,而各大应用商店都是不允许马甲包的存在的,所以就要通过技术手段,让马甲包与主包的外表和内在都变得不一样。简单得分为两个步骤:
1、改变马甲包的外表-换肤
其中包括包名,包名称,应用图标和应用主页面布局和整体风格等。
2、改变马甲包的内在-混淆
这里简单记录下我们公司flutter项目马甲包的上架过程,总共提审了vivo、oppo、华为、小米、腾讯应用宝:
资料准备:
因为我们的马甲包是上传在同一个公司主体下,所以需要提前准备一下资料:
1、软著
2、承诺函
3、安全评估报告
4、安全评估提交截图
5、icon
6、五图
7、上架内容(主副标题,一句话简介,应用描述等)
换肤
由于时间比较紧张,并且项目比较庞大,所以我们只是改变了主色系以及登录流程和首页一级tab页的UI布局。
混淆
flutter构建apk是默认混淆的!起初我们没有做任何处理就提审了,结果当然是审核不通过!
这简直就是一模一样啊!于是我们做了以下处理:
1、修改图片资源名
修改图片资源名python脚本代码如下,将所有图片资源名末尾加上一个同样的字符串就好了;
注意:我们的图片资源都是放在/assets/images目录下,脚本代码根据你们项目调整;
#项目目录
projectAbsRootPath = sys.path[0]
#图片所在的资源目录路径
assetPath="/assets/images"
#项目中dart代码所在目录
libPath = projectAbsRootPath+ "/lib"
assetAbPath = projectAbsRootPath+assetPath
print("projectRootPath:" + projectAbsRootPath + " assets:" +assetAbPath + " lib:" + libPath)
print("----------开始查找图片--------------")
#遍历目录,将图片存储到list中的方法
def searchImage(filePath:String):
list = []
isDir = os.path.isdir(filePath)
if isDir:
for f in os.listdir(filePath):
if f.startswith("."):
print(filePath+"/"+f)
else:
tList = searchImage(filePath+"/"+f)
list.extend(tList)
else:
if imghdr.what(filePath) in {"png"}:
list.append(filePath)
return list
#项目中使用的图片资源路径集合
imageList = searchImage(assetAbPath)
for name in imageList:
print(name)
for num in range(0,len(imageList)):
# if(num<10):
pList = imageList[num].split("/")
imgName = pList[-1]
txt = imageList[num].replace(imgName, '')
nList = imgName.split(".")
imgName = nList[0]
os.rename(imageList[num],txt + '/' + imgName + '_project2.png')
然后通过android studio修改资源的引用路径就可以了,改完记得多测试!
2、原生层加垃圾代码
加垃圾代码,可以用到AndroidJunkCode库:
使用方法
根目录的 build.gradle 中:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "com.github.qq549631030:android-junk-code:x.x.x"
}
}
app 目录的 build.gradle 模块中:
apply plugin: 'com.android.application'
apply plugin: 'android-junk-code'
androidJunkCode {
variantConfig {
release {//变体名称,如果没有设置 productFlavors 就是 buildType 名称,如果有设置 productFlavors 就是 flavor+buildType,例如(freeRelease、proRelease)
packageBase = "cn.hx.plugin.ui" //生成 java 类根包名
packageCount = 30 //生成包数量
activityCountPerPackage = 3 //每个包下生成 Activity 类数量
excludeActivityJavaFile = false //是否排除生成 Activity 的 Java 文件,默认 false(layout 和写入 AndroidManifest.xml 还会执行),主要用于处理类似神策全埋点编译过慢问题
otherCountPerPackage = 50 //每个包下生成其它类的数量
methodCountPerClass = 20 //每个类下生成方法数量
resPrefix = "junk_" //生成的 layout、drawable、string 等资源名前缀
drawableCount = 300 //生成 drawable 资源数量
stringCount = 300 //生成 string 数量
}
}
}
做完这些处理,再次提交就没啥问题了!!!
最后
最终我们也只通过了vivo、oppo、小米、腾讯应用宝,华为对于马甲包的人工审核太严了需要大改版,只能放弃!
另外在上架应用时需要“全国互联网安全服务管理提交结果截图”,显示结果为成功才行,需要审核人员上门检查比较麻烦,用主包的截图ps一下就好了