# 去更新提示
去掉了烦人了启动页后,还有一个更新提示依旧烦人。

我们查看 apk 信息时可以看到它当前的版本号是 1,而这边的更新提示显示最新版本号是 1100。当然一般应用的更新提示都不会告诉你版本号,而是告诉你版本名称和更新内容,我这边为了方便直接显示出来。
大部分应用判断是否更新时,都是通过版本号进行判断,而不是版本名称。
# 方法一:修改 AndroidManifest.xml
我们反编译 apk 中的 AndroidManifest.xml 文件查看应用的版本号和版本名称。

其中 versionCode 就是版本号,versionName 就是版本名称,我们把 versionCode 改成 9999(大于 1100) 然后编译保存安装测试,发现还是有更新提示,看来此方法对这个 APP 无效。
只是对当前 APP 无效,其它 APP 还是可能有效的。
# 方法二:Dex 搜索版本号
既然方法一无效,那么很大的可能是版本号写死在 dex 中,而不是运行时从 AndroidManifest.xml 里面获取,所以我们尝试去 dex 文件中搜索版本号。
我们用 Dex 编辑器++ 打开 apk 中的 classes.dex 文件,切换到搜索页,发起新搜索,内容输入 1,搜索类型选择整数,不要勾选十六进制,点击确认后,发现搜索结果太多了。

搜索到这么多结果的主要原因是 1 这个数字出现的概率太大,我们不可能一个个去看,所以暂时先放弃方法二。
如果你在去除其它 APP 的更新提示时,使用该方法搜索到了很少的几个结果,只需要在代码中把对应的数字修改成大于最新版本的数字就行了。
# 方法三:Dex 搜索关键字
尝试这个方法前先把 apk 备份一下,待会给方法四使用。
一般 APP 会从一个网址中读取最新版本信息,而网址是 http 开头,所以我们搜索 http,然后根据整个网址来判断它是否是我们要找的。
与更新有关的英语单词有:version、update、ver,如果你找到的网址包含其中一个,那么很可能就是它了。
如果在你搜到的网址中都找不到这几个单词,那你可以尝试使用 Dex 编辑器++,搜索类型选择代码,分别搜索上面的三个单词。
我们这边尝试使用搜索网址的方式,使用 Dex 编辑器++ 打开 classes.dex 文件,切换到常量页,点击过滤功能输入 http,注意区分大小写和完全匹配等选项均不要勾选。

可以看到 https://mt2.cn/guide/reverse/practical/version.txt 就包含着关键字 version,我们把它随便改成一个无效的网址,例如 http://127.0.0.1,修改完后需要在常量页面点击应用修改。
最后点击右上角菜单编译并退出,更新 apk 后安装测试,你会发现不会再弹出更新提示了~
# 方法四:还是搜索关键字
我再补充一个方法,这边使用方法三中备份的 apk 进行修改,因为方法三已经成功去掉更新提示了。
我们重新看下更新提示:

还记得发现新版本这段文字是我们前面翻译过来的吗?它存在于 resources.arsc 文件的 string-zh-rCN 语言包内。
既然更新提示出现了这段文字,那么和更新有关的代码肯定引用了这个词条。
Arsc 文件里的词条都是通过资源 ID 进行引用的。
我们使用 Arsc 编辑器++ 打开 resources.arsc 文件,直接进入 string-zh-rCN 文件内,找到对应词条复制 ID,这边我们复制的 ID 是 7f0d0025:

我们再次打开 Dex 编辑器++ 搜索我们刚刚复制的 ID 7f0d0025,搜索类型选择整数,勾选十六进制:

只有一个搜索结果,点击进入查看 Smali 代码,但 Smali 代码比较不好阅读,我们在菜单中选择转成 Java。

可以看到在 7f0d0025 底下调用了 show() 方法,猜得没错的话这个 show() 方法就是用于显示更新对话框。
返回到 Smali 代码中,从 7f0d0025 那一行往下拉,找到 show() 方法的调用代码,删掉它:

最后保存代码并编译 dex,更新 apk 后安装测试,打开 APP 同样不会出现更新提示。
# 总结
去掉更新提示有三个思路:
- 把版本号改大,方法一和方法二就是如此;
- 让 APP 获取不到最新版本号,方法三用的就是这个思路;
- 不让它显示更新对话框,把显示对话框的代码删掉,方法四用的就是这个思路。