必先利其器
需要用到的核心工具集是 apktool、dex2jar、jd-gui,其中 apktool 用于获取资源文件,dex2jar & jd-gui 用于获取 Java 代码。除此之外你还需要文本编辑器、解压缩软件,等。
WORK THROUGH
笔者从酷安网下载了 Fuubo 的 apk 文件 me.imid.fuubo-4.1.apk
。
首先获取资源文件,图片、xml 布局等等。一行命令就好。
文中不写命令的相对路径了,默认你已经配置好了环境变量,或者使用了绝对路径。
$ apktool d me.imid.fuubo-4.1.apk # d for decompile
I: Using Apktool 2.0.3 on me.imid.fuubo-4.1.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: <placeholder-to-hide-real-path>/apktool/framework/1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
apktool 比较过分,把 Java 代码直接反编译成了 smali 文件。字节码与今天主题无关,以下我们将获取 Java 源码。不过,如果你对 bytecode 非常感兴趣,我觉得 developerWorks 的一篇教程 讲的不错,而 Java bytecode instruction listings 词条 可以作为速查表。
dex2jar 不仅可以把 dex 文件转换为 samli (d2j-dex2smali.sh),也可以转换为 jar (d2j-dex2jar.sh)。
$ unzip me.imid.fuubo-4.1.apk -d output # 解压后的输出文件在 ./output/ 文件夹下
(omitting output…)
$ cd output
$ d2j-dex2jar.sh classes.dex
dex2jar classes.dex -> ./classes-dex2jar.jar
$ jd-gui classes-dex2jar.jar
这时你已经能看到 Java 代码了,点击 jd-gui 界面中的 File - Save All Sources,把所有源码保存到一个压缩包中,解压得到的压缩文件即可看到源码目录结构。需要注意的是,源项目使用的第三方库的代码,也被反编译到这个压缩包中了。
有的时候,比如闲鱼APP,解压 apk 会得到多个 dex 文件,那么对每个 dex 都要用 d2j 和 jd-gui 进行处理。
WORK LIKE A CHARM
通常通过字符串查找比较方便,但是 Fuubo 波纹动画的页面没有标识性的字符串。还好动画出现在运行应用之始,通过入口 Activity 开始往下找,还是很轻松地找到了。
通过对反编译后的代码的分析,最终找到 me.imid.fuubo.widget.SpreadView
。在 me.imid.fuubo-4.1/res/layout/activity_login.xml
中有布局示例,在 me.imid.fuubo.ui.activity.LoginActivity
中有代码调用方法,剩下的都一目了然了。