前言
公司最近把指纹打卡改为钉钉打卡,作为有自驱力的程序员,每天打卡简直就是在浪费我的生命,所以黑掉钉钉的考勤打卡功能,期间用到smalidea这个神器,相比ida简单许多,记录下怎么玩(文章末尾有彩蛋~)。
关于smalidea
smalidea官网: https://github.com/JesusFreke/smali/wiki/smalidea
它其实就是 IntelliJ IDEA/Android Studio 的插件,让你拥有smali文件就能去debug 一个apk,而不需要拿到它的源码。
如何安装
首先下载 smalidea : https://bitbucket.org/JesusFreke/smali/downloads
话说这个好久没更新了,目前还是smalidea-0.0.3.zip,我用的Android Studio, Android Studio 更新速度贼快,半年就更新了N个版本,亲测大部分版本已经用不了smalidea, 目前有个相对较新的版本能用上 smalidea的版本是 Android Studio 2.2 Preview 4。
下载结束后,开始安装插件:
Android Studio -> Preferences -> Plugins -> Install plugin from disk -> 选择 smalidea插件 ->重启 -> 插件就安装好了。
准备工作
第一步当然是要拿到你想debug的apk啦,这里就拿阿里的钉钉开刀,下载完的apk文件为
com.alibaba.android.rimet.apk
第二步就是要把apk里面的编译后的代码转成smali。这里用apktool,具体如何使用参考网 https://ibotpeaches.github.io/Apktool/
apktool d com.alibaba.android.rimet.apk
后,成功的话就反编译出来一堆smali了:
这一步很关键,就是让运行在设备中的程序支持debug。方法有几种:
- 把设备root掉
- 修改测试机的 /default.prop 文件的ro.debuggable=1,目测这一步也可能需要root。
- 使用模拟器
- 修改apk的Manifest application 属性 android:debuggable=”true”,可以用apktool 解出 Manifest 然后修改,接着重新打包回去。
- 终极办法,自己编译一个debug版 的rom,这个稍微麻烦一点,我就是用这个方法,自己编一个,想怎么玩就怎么玩,酸爽。
开始debug
好了,假设你已经把apk安装到设备里了。
接下来用Android Studio 打开一个 Project , 工程的目录定位到刚刚apk反编译后的的文件夹,这里为 com.alibaba.android.rimet
, 接着右键工程主目录:Mark Directory As -> Sources Root
设置Project 的 sdk
工程配好了,配置debug的端口:
EditConfigurations…
添加一个remote调试
修改调试的端口
这里我用8800端口,这个可以随便定,只要不与其它端口冲突即可,然后apply->ok。
好了,project方面就准备好了!Nice!
接下来需要准备的就是如何连上设备debug了!这个过程稍微麻烦一点:
- 拿到apk的包名和启动的Activity,这里为
com.alibaba.android.rimet
和com.alibaba.android.rimet.biz.SplashActivity
,如何拿到呢?还是从反编译后的Manifest里面找啊。 - 把应用启动起来然后等待debug:
adb shell am start -D -S -W com.alibaba.android.rimet/.biz.SplashActivity
正常的话,你会看到设备里的应用已经跑起来了,并且有个Waiting For Debugger
的提示,别关掉它。
另外这一步命令行执行也很久,要等个10秒左右的超时,有点蛋疼,后面会讲怎么优化这一步。 - 拿到程序运行的pid:
adb shell ps | grep com.alibaba.android.rimet
图中的5413就是进程的pid啦。 - 端口映射:
adb forward tcp:8800 jdwp:5413
这里的8800
是上一步在配置工程中自定义的端口。 万事具备,只差断点:
打断点,在你想下断点的地方随便下, 这里随便在SplashActivity的初始化地方下一个断点:
开始debug
点一下debug, OK,狂拽炫酷屌炸天的画面出现了!
好了,接下来你想干嘛就干嘛了~
小小的彩蛋
哈哈,终于debug起来了是不是感觉很爽~
然而,每次debug都要敲着一堆的命令蛋都要碎了。
前段时间看了下python,还没怎么写过,所以,我决定把人生的第一段python脚本献给这次任务。
传送门:https://github.com/hackoooo/ApkDebugConnection
求少年们给我多点几个star, 平时没怎么玩,github上的星星少得可怜…T_T…
ok,玩的愉快,有任何问题欢迎留言~