如何修改第三方apk的activity

最近在工作过程中遇到修改第三方apk的需求:有一个第三方apk的一个启动页面涉及到广告的显示,需要在代码里去掉相应逻辑。但是apk开发时间久远,又找不到当时的开发者。所以只能尝试自行修改。

这里需要用到 Android反编译三件套 apktool 、dex2jar、jd-gui

第一步:

通过apk逆行解包工具 “ApkTool” 对apk进行解包

如何修改第三方apk的activity

选择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.

如何修改第三方apk的activity

第九步:

用ApkTool工具 合包, 根目录下会生成新的apk(未签名)

如何修改第三方apk的activity

 

第十步:

对新生成apk进行签名,然后安装、运行、验证

 

本次修改非常成功,是因为原入口activity逻辑很简单,改起来很方便。

 

如果入口activty需要依赖的内容很多的话,全部依赖copy过来的资源或代码可能行不通,因为反编译出来的代码并不是源码,有的甚至混淆编译过,变量、函数很难识别。这时改造起来就困难多了。这种情况下生搬硬套去改造是行不通的。

 

希望以后不要遇到这种需求,毕竟私下修改别人的apk是不道德的行为。