对于许多Google Play开发者而言,那个清晨无异于一场噩梦。一觉醒来,发现自己的应用已经从Google Play消失,有的甚至开发者账号也遭到封禁。收入流中断,用户投诉激增,品牌声誉受损。
Google Play最近大规模下架甚至封号行动再次敲响警钟:合规性不再是可选项,而是生存底线。Google Play的政策执行日趋严格和自动化,任何心存侥幸或行动迟缓都可能付出惨重代价。
由于篇幅有限,就不再赘述下架或者封号原因,本篇着重讲述:
Google Play开发者账户被封或者App被下架/暂停,如何快速再上架?
下面从不同维度,聊聊具体的步骤措施。
-
项目创建 建议通过AS新创建一个项目的方式来,如果是直接copy之前封号的项目,则原来项目是有关联可能的。
-
文件创建 关于文件能否复制,其建议是不要直接copy文件,而是通过新建文件的方式,再粘贴内容,稍微加点空格啥的,这样文件的MD5才会不是同一个。
-
项目架构 如果能够对项目架构进行重构,涉及改动的代码就会非常多,这样代码关联性可行性更小。
比如之前用MVC,你就改为MVP、MVVM、MVI架构。
- 三方库 如果某个包用了某某功能的三方库,比如权限请求,那你也可以尝试在新包使用另外的权限三方库。
比如GitHub - guolindev/PermissionX换成GitHub - getActivity/XXPermissions权限请求框架。
-
Java or Kotlin 比如之前使用Java开发的,可以考虑全部或者部分转为kotlin代码,也可以尝试Java和Kotlin 代码并存的方式,尤其是不会被混淆的实体类可以考虑此玩法。
-
混合开发 使用常规的纯原生开发,也可以考虑尝试混合开发。
比如简单的和 WebView 里面的 H5 进行配合(Google Play对H5和原生的比例 貌似没有啥规定)。
亦或者使用 Flutter、RN 的方式,部分代码放置在原生,也可以尝试使用Compose进行开发。
- 内部SDK 一般公司内部所有的app,都使用的是一些内部公共SDK,只要在遇到过封号问题,就不要使用这种方式了。
即使是放到jitpack,jcenter上也有一定风险。
- App Name 取一个跟之前不一样的就行,建议拿到名字上相关网站搜一下,同名是否多,尤其是有存在且对方已做商标保护的,那就更加不要同名了。
可参考:
apkcombo.com/zh/
- 包名 同样,取一个跟之前不一样的,比如公司名称简称sl,建议包名中就不要有sl了,eg:com.sl.appname此类操作更不建议。
有些小伙伴取出来的包名,真的一看就是同样的一家公司的。
-
Logo 设计一个新的即可,主题色可以适当改下。
-
签名 重新生成一个新jks文件、密码和名称都变更下,与之前的不要有任何相似。
比如公司名称简称sl,建议jks中就不要有sl了。
- 域名 买一个新的域名使用,一个app一个单独域名,域名的雷同也是有点小讲究。
比如api.appName1.go、api.appName2.go,这种还是比较明显。
-
项目结构目录 调整下结构目录,比如名称、嵌套顺序等。
-
文件名 修改所有的类名、布局文件名、资源文件名。
-
依赖Module 相应依赖的module也做包名、项目结构目录、文件名调整。
-
UI 尤其是启动页、首页、尽量重新设计,主题色最好与之前有较大变化。
如果有时间,UI全套改下,最为稳妥。
- 图标 图标的文件名必须全部修改,单纯修改文件名,一个文件的md5其实不会变,需要修改文件的内容。
还可以对图片进行压缩、格式转换,比如png convert to webp或者webp convert to png。
-
布局文件的控件id 比如之前是btn_login,调整为btn_submit、buttonSubmit等。
-
布局文件的控件类型 比如之前是LinearLayout,调整为androidx.appcompat.widget.LinearLayoutCompat。
比如之前是TextView,调整为androidx.appcompat.widget.AppCompatTextView。
- strings.xml 比如之前是
Password</string AI写代码 调整为 Password AI写代码 21. 代码混淆 可参考1:
AndroidProguadRules
建议对bt-proguard.txt内容进行相应替换,每个app保证混淆的内容不一样即可,Android超级变态的混淆词典,常规abcd等混淆方式对逆向的干扰程序并不是很大,所以需要一个变态的字典,使用方法如下:
在proguard-rules.pro文件中进行配置
-obfuscationdictionarybt-proguard.txt -classobfuscationdictionarybt-proguard.txt -packageobfuscationdictionary bt-proguard.txt AI写代码 可参考2:
AabResGuard
对aab包的资源就行加密等处理。
- ARouter 如果使用了ARouter 路由框架,建议做相应修改。
比如之前路由表
const val HOME: String = "/app/home" AI写代码 调整为
const val INDEX: String = "/newapp/index" AI写代码 23. 接口映射 比如之前登录接口是
@POST("sl/app/login") suspend fun login(@Body params: HashMap<String, String>): NetResult AI写代码 调整为
@POST("ax/FEW/MQx") suspend fun loginInter(@Body params: HashMap<String, String>): BaseResult AI写代码 可以看到有几个变化:
1、接口请求的具体地址变了。
2、请求返回的NetResult变了。
3、请求返回的实体名称也变了。
4、接口请求的方法名也变了。
- 未混淆的类(实体类等) 比如之前是
dataclassLoginResultEntity( val token: String? = "", val avatar: String? = "" ) AI写代码 调整为
1、名称变更
2、增加垃圾字段
dataclassLoginEntity( val a="", val b="", val token: String? = "", val avatar: String? = "", val c="" ) AI写代码 25. 变量、方法名 大部分的变量和方法在混淆都是被重命名的,尤其注意的是打包的aab文件中,没有被重名的,进行相应修改。
这些结果可通过工具jadx-gui进行查看。
-
三方库 相关三方库升级、或者用其他相关库替换。
-
三方SDK key 关于使用的一些三方SDK。
比如AppsFlyer,新建一个App会有一个dev key,AppsFlyer默认每个app 的 dev key都是一样的,可联系对应商户更改。
- XmlClassGuard 混淆xml文件用到的类。
可参考:
XmlClassGuard
- 更换技术栈
使用React Native等新技术重构应用的核心功能,以从根本上改变应用的架构和实现方式。
以上就是常见的项目重构策略。如果我们的App确实存在问题,需要进行重构和修复后才能重新上架。
本篇不保证重构上架百分之百成功,但至少在我们内部,此操作是可以成功再上架,并且保持长期在架的。