注意:本文仅供学习,不能做违法的事。
作为一名安卓人,安卓手机是我们每天都要接触的东西,使用安卓手机的频率甚至比使用我们身上的某些器官的时间还要长。在我们玩手机的时候,肯定会遇到一个烦恼,那就是无休无止的广告,有开屏广告、功能界面中嵌入的广告等等。更不能让人忍受的是,有些软件必须要求看完广告,才允许你继续浏览下面的内容。那我们有没有办法把平时经常使用的app里面的广告去掉呢?下面就是一个实用有效的界面方法。
需要的工具:
工欲善其事必先利其器,我们除了基础的环境外,例如java、AndroidSDK,还要特别准备好三样工具,有利于我们等好地进行操作。
1、Apktool 官网下载apktool工具。
2、Install Guide | Apktool 根据安装指引下载好脚本,并且把文件名称改为一致。这样就可以得到两个文件:apktool.bat、apktool.jar。
3、Release v2.4 · pxb1988/dex2jar下载dex-tools,目前最新版本为2.4。用于把dex文件翻译成jar文件。
4、Release JD-GUI 1.6.6 · java-decompiler/jd-gui 下载jd_gui工具,用于打开第三步翻译出的jar文件。
准备破解的软件
笔者以一款记账软件为例进行破解,主要就是为了去除软件中的广告和一些自己不需要的功能,达到界面简洁的目的,再说一次,仅供学习,不能干违法的事。软件名称为Timi记账,最新版本为6.4.2。如果这位软件的开发者发现了这篇文章,那你可能需要做一次更新,把漏洞修复掉。




上面三张图片红框处,就是我们要去掉的东西。
我们先下载软件,下载软件之前,需要先确定软件下载的地址,笔者用的是小米手机,在应用商店的设置中,关闭“安装完成后删除软件”开关。
下载的软件包地址:Android/data/com.xiaomi.market/files/apk
正式操作
一、反编译apk文件
把下载好的软件,放入apktool所在文件夹,进入cmd命令:apktool d -f Timi6.4.2.apk -only-main-classes
成功得到Timi6.4.2文件夹,里面的内容就是资源文件以及smali文件,我们就是要在smali文件中大动手脚。
二、去掉“植物精选”选项
用编辑器打开Timi6.4.2文件夹,找到【res】- 【layout】-【activity_main】文件。如图所示:

我们不要轻易删掉“植物精选”选项按钮,防止程序出现找不到资源提示空指针的错误。但是我们可以加上android:visibility="gone",这样就可以把该选项隐藏了。
三、去掉广告
直接通过smali文件找到广告的内容可不是一件简单的事,在做后面的步骤之前,让我们把dex文件转换为可以看到java源码的jar文件吧。
(一)dex文件转换为jar文件
把 Timi6.4.2.apk 后缀改为 zip ,解压zip文件,得到 dex 文件。
鉴于核心代码都在 classes3.dex 文件中(我是从classes1.dex到classes4.dex一个个试出来的),把 classes3.dex 文件放进 dex-tools-v2.4 工具文件夹,进入cmd使用:d2j-dex2jar classes3.dex 得到 classes3-dex2jar.jar 文件。如图所示:

(二)查看java源码
把得到的 classes3-dex2jar.jar 文件放入 jd-gui-windows-1.6.6 工具文件夹,使用 jd-gui.exe 工具打开该文件。找到 com.talicai.timiclient 下的 ui 文件夹,我们所有的界面源码都在这里面。

(三)去掉开屏广告
从 jd-gui 工具中找到 splashActivity.class 文件,找到 init 方法,可以看到此处为判断是否显示广告的逻辑。

如图所示,我们只需要把下面两行代码放到 if 判断的前面去即可。也即是 responseConfig 定义语句的下方。
1 | generalJump(); |
来,我们去找到对应的 smali 文件,找到该段代码的转义部分。

init 方法源码如下
1 | .method private init()V |
更改之后,源码如下所示:
1 | .method private init()V |
至于为什么这么改,大家可以自己研究研究,我相信有 Android 基础的同学定能发现其中 if 语句对应的开始和结束。
(四)去掉功能界面弹出的广告
同上,从 jd-gui 工具中找到 MainActivity.class 文件,找到 onCreate 方法,可以看到此处直接显示广告的逻辑。我们只要在 MainActivity.smali 文件中删掉showAdMobileAd() 方法的调用即可。

MainActivity.smali 文件中的 showAdMobileAd() 方法调用在第十一行,那就让我们删除此段代码吧。如图所示:

直接删掉第11行,更改后源码如下:
1 | .method public onCreate(Landroid/os/Bundle;)V |
(五)去掉检测更新
通过分析 MainActivity.class 文件,我们发现在 exitShowTost() 方法中有进行检测更新。也就是在退出时会做更新判断。由于我们现在在破解该软件,后面打包时会用到自己的签名。签名不一致的话更新会不成功,既然如此,与其以后每次有更新提醒,不如在破解版本里去掉更新检测吧。

smali 文件中 exitShowToast() 源码如下:
1 | .method private exitShowTost()Z |
更改后如下所示:
1 | .method private exitShowTost()Z |
(六)去掉“我的”界面的弹框广告
根据上面的逻辑,找到【ui】- 【fragment】下的 MineFragment.class 文件,如下图所示,弹框小广告 showSuspendAd() 主要是在 setUserVisibleHint() 方法中调用的,那我们直接修改 setUserVisibleHint() 方法即可。

smali 文件源码如下:
1 | .method public setUserVisibleHint(Z)V |
直接删除弹框部分的代码,更改后,如下所示:
1 | .method public setUserVisibleHint(Z)V |
四、打包更改后的 smali 文件
现在我们把所有需要修改的地方都改的差不多了,我们可以使用如下命令打包文件了。apktool b foldername ,其中 foldername 就是我们反编译生成的 “Timi6.4.2” 文件夹名称。

在 dist 文件夹中,就可找到生成的修改后的文件了。

五、最后一步,文件签名
虽然我们拿到了我们想要的apk,但是很有可能在手机上安装不了,这是因为Android系统有自己的验签机制。我们还得做好签名文件,这就需要 AndroidSDK 了。一般而言,只要我们下载一个Android Studio,就会自当下载 sdk 了。
文件签名前,我们需要执行对齐优化。
cmd 进入D:\SoftWareSDK\AndroidSdk\build-tools\35.0.0,执行检查命令:
1 | .\zipalign -c -v 4 D:\WorkSpace\05decompile\AndroidDecompileTool\mykeyfile\timi6.4.2.apk |
再执行对齐优化命令,即可得到一个 timi6.4.2_aligned.apk:
1 | .\zipalign -v 4 D:\WorkSpace\05decompile\AndroidDecompileTool\mykeyfile\timi6.4.2.apk |
最后,我们再使用自己生成的签名文件对 timi6.4.2_aligned.apk 文件进行签名。签名格式为: apksigner sign --ks path --ks-key-alias ALIAS --out outputpath apkpath
我们把 timi6.4.2_aligned.apk 放入签名文件所在的文件夹,使用 apksigner 签名。
签名命令为.\apksigner sign --ks D:\WorkSpace\05decompile\AndroidDecompileTool\mykeyfile\decompiler.jks --ks-key-alias key0 --out D:\WorkSpace\05decompile\AndroidDecompileTool\mykeyfile\timiclient-signed.apk D:\WorkSpace\05decompile\AndroidDecompileTool\mykeyfile\timi6.4.2_aligned.apk
这个时候得到的 timiclient-signed.apk 文件就是我们最终需要的文件,赶紧安装一下试试吧。