本篇不保证百分之百成功,但至少在我们内部,此操作是成功上架到Google Play 并保持超半年还在的。
下面聊聊具体的步骤措施
# 1. App Name
取一个跟之前不一样的就行,建议拿到名字上相关网站搜一下,同名是否多,尤其是有存在且对方已做商标保护的,那就更加不要同名了
参考:https://apkcombo.com/zh/
需VPN
# 2. 包名
同样,取一个跟之前不一样的
同时,比如公司名称简称sl,建议包名中就不要有sl了
eg:com.sl.appname 此类就不建议
# 3. Logo
设计一个新的即可
# 4. 签名
重新生成一个新jks文件、密码和名称都变更下,与之前的不要有关联
比如公司名称简称sl,建议jks中就不要有sl了
# 5. 域名
买一个新的域名使用,一个app一个单独域名
# 6. 项目结构目录
调整下结构目录,比如名称、嵌套顺序等
# 7. 文件名(类名、布局文件名、资源文件名)
修改所有的类名、布局文件名、资源文件名
# 8. 如果有相应的依赖Module
也做包名、项目结构目录、文件名调整
# 9. UI
尤其是启动页、首页、尽量重新设计,主题色最好与之前有较大变化
# 10. 图标
图标的文件名必须全部修改
单纯修改文件名,一个文件的md5其实不会变,需要修改文件的内容
还可以对图片进行压缩、格式转换,png convert to webp
or webp convert to png
# 11. 布局文件的控件id
比如之前是btn_login,调整为btn_submit等
# 12. 布局文件的控件类型
比如之前是LinearLayout,调整为androidx.appcompat.widget.LinearLayoutCompat
比如之前是TextView,调整为androidx.appcompat.widget.AppCompatTextView
# 13.strings.xml
比如之前是
```
<string name="log_pwd" translatable="false">Password</string>
```
调整为
```
<string name="log_title_pwd">Password</string>
```
# 14. 代码混淆
可参考1:https://github.com/king-ma1993/AndroidProguadRules
建议对bt-proguard.txt内容进行相应替换,每个app保证混淆的内容不一样即可
Android超级变态的混淆词典
常规abcd等混淆方式对逆向的干扰程序并不是很大,所以需要一个变态的字典,使用方法如下:
**在proguard-rules.pro文件中进行配置**
```
-obfuscationdictionary bt-proguard.txt
-classobfuscationdictionary bt-proguard.txt
-packageobfuscationdictionary bt-proguard.txt
```
可参考2:https://github.com/bytedance/AabResGuard/blob/develop/wiki/zh-cn/README.md
对aab包的资源处理
# 15. ARouter
如果使用了ARouter 路由框架,建议做相应修改
比如之前路由表
```
const val HOME: String = "/app/home"
```
调整为
```
const val INDEX: String = "/newapp/index"
```
# 16. 接口映射
举个例子
比如之前登录接口是
```
@POST("sl/app/login")
suspend fun login(@Body params: HashMap<String, String>): NetResult<LoginResultEntity>
```
调整为
```
@POST("ax/FEW/MQx")
suspend fun loginInter(@Body params: HashMap<String, String>): BaseResult<LoginEntity>
```
可以看到有几个变化
1、接口请求的具体地址变了
2、请求返回的NetResult变了
3、请求返回的实体名称也变了
4、接口请求的方法名也变了
如果内部有多个app,每个app生成的具体请求地址都是不一样的
同时每个app都有相应的请求头
比如之前是
```
val map = HashMap<String, String>()
map["appName"] = "AppName"
```
调整为
```
val map = HashMap<String, String>()
map["xAfew"] = "AppName"
最后再进行加密
```
# 17. 未混淆的类(实体类等)
比如之前是
```
data class LoginResultEntity(
val token: String? = "",
val avatar: String? = ""
)
```
调整为
1、名称变更
2、增加垃圾字段
```
data class LoginEntity(
val a="",
val b="",
val token: String? = "",
val avatar: String? = "",
val c=""
)
```
# 18. 垃圾代码
加点垃圾代码
可参考:https://github.com/qq549631030/AndroidJunkCode
唯一注意的是,混淆对相应垃圾代码保持不被混淆
# 19. 变量、方法名
大部分的变量和方法在混淆都是被重命名的
尤其注意的是打包的aab文件中,没有被重名的,进行相应修改
可通过工具 **jadx-gui** 进行查看
# 20. 三方库
相关三方库升级、或者用其他相关库替换
# 21. 三方SDK key
关于使用的一些三方SDK
比如AppFlyer,新建一个App 会有一个dev key,App Flyer 默认每个app 的 dev key都是一样的,可联系对应商户更改