如何修改第三方apk的activity
最近在工作过程中遇到修改第三方apk的需求:有一个第三方apk的一个启动页面涉及到广告的显示,需要在代码里去掉相应逻辑。但是apk开发时间久远,又找不到当时的开发者。所以只能尝试自行修改。
这里需要用到 Android反编译三件套 apktool 、dex2jar、jd-gui
第一步:
通过apk逆行解包工具 “ApkTool” 对apk进行解包
选择apk 所在全路径,点击解包, 这样就会在apktool根目录下找对应解压出来的apk 资源目录,在对应AndroidManifest.xml 里找到入口activity
第二步:
用 “dex2jar” 工具对第一步解压目录下classes.dex 反编译成 classes.jar
第三步
用 “jd-gui” 工具查看 classes.jar 里面反编译出来的代码,找到入口activity代码
要去掉广告所涉及的代码就要修改入口activity, jd-gui 工具只能查看、参考,不能修改
所以修改的话需要另行解决
第四步:
用android开发工具建立一个和 第三方apk 一样包名的功臣,一样入口名的activity(路径一样), 将activity所需资源文件从第一步解压出来的目录里找出来copy到新建工程一样的目录下,将jd-gui里反编译出来的入口activity代码copy到 新建工程的入口activity文件里,反编译出来的代码直接用的话会有些编译错误, 有的需要依赖其他文件, 这时根据需求把入口activity需要依赖的文件也建立起来,对应的方法代码从“jd-gui”反编译出来的代码 copy过来并修改编译错误。注意一样目录。编译无误后进入下一步
第五步:
将新建工程编译成apk
第六步:
反编译新建apk
用反编译三件套对“新”apk反编译, 从第三步得到的“新”classes.jar中找到改造后的入口activity的class文件,并解压出来备用。
当然也可以在新建工程目录build目录下搜索对应的.class文件来备用
第七步:
用新的入口activity class文件替换原class文件
用解压工具将原classes.jar里面的 对应 class删除, 然后将新生成的class文件丢进去并保存
第八步:
用dex2jar 工具将前一步的classes.jar 编译成 新的classes.dex, 并替换第一步目录下的旧class.dex.
第九步:
用ApkTool工具 合包, 根目录下会生成新的apk(未签名)
第十步:
对新生成apk进行签名,然后安装、运行、验证
本次修改非常成功,是因为原入口activity逻辑很简单,改起来很方便。
如果入口activty需要依赖的内容很多的话,全部依赖copy过来的资源或代码可能行不通,因为反编译出来的代码并不是源码,有的甚至混淆编译过,变量、函数很难识别。这时改造起来就困难多了。这种情况下生搬硬套去改造是行不通的。
希望以后不要遇到这种需求,毕竟私下修改别人的apk是不道德的行为。