Reverse Engineering on APK
前言: 最近处理了公司的 XX 产品的认证相关事宜。要能拿到产品在海外市场的认证,其中一项是便是需要通过 Google 的 GTS & CTS 测试用例。
CTS好说,毕竟开源的,遇到Fail可以直接去翻源码来追根溯源。但是这个丧心病狂的GTS是闭源的,多次找 Google 的要源码,真是差点把南墙撞穿。不过没关系,只是给咱增加了饭前(看源码)之前的一点小菜而已(Reverse Engineering)。– 请原谅我大言不惭地用了Reverse Engineering二字。
Prerequisites
他们的详细说明和指导都已经在官网说得很明白了,这儿就不再赘述。
Walkthrough
1. 使用 Apktool 提取到 APK 中的资源文件,也就是 res | drawable | layout 等。
$ apktool d GtsCallLogTestCases.apk
执行完毕之后就能得到如下的文件:

2. 使用 dex2jar 提取 classes.dex,然后用 .dex 文件生成 .jar 文件。
- 重命名
GtsCallLogTestCases.apk->GtsCallLogTestCases.zip - 解压
GtsCallLogTestCases.zip得到classes.dex - 使用
dex2jar生成jar
$ sh d2j-dex2jar.sh -f classes.dex
就能得到我们垂涎已久的 classes.jar 文件了:

悲剧的是 dex2jar 貌似不支持 Android N 之后的 APK。至少我在基于 Android O 的 APK 没有提取成功。
3. 上面生成的 .jar 扔到 jd-gui 中就能看到其中的源码了。

不过反编译 APK 源码你是不会希望遇到有做代码混淆的应用的 🙂。
学会了这招,也差不多能解决基本的代码学习问题了,遇到有趣的应用就想看看它到底是咋实现的!
至于重新打包成 APK 就放到以后写了吧~
To be continued~