本文的合集已经编著成书,高级Android开发强化实战,欢迎各位读友的建议和指导。在京东即可购买:https://item.jd.com/12385680.html
在Android开发过程中, 每个Apk发布之前, 都会进行Proguard混淆代码. 当遇到崩溃时, 需要逆向解析Apk包, 定位错误. 那么, 如何找到错误的位置呢? 我来分享一个小方法.
错误
Caused by: java.lang.NullPointerException
at me.chunyu.e.f.b.getBssid(Unknown Source)
at me.chunyu.ChunyuDoctor.Activities.DeviceStatistic.getParam(Unknown Source)
at me.chunyu.ChunyuDoctor.Activities.DeviceStatistic.sendDeviceInfo(Unknown Source)
at me.chunyu.ChunyuDoctor.Activities.MainActivity2.onContinueCreate(Unknown Source)
at me.chunyu.ChunyuDoctor.Activities.MainActivity600.onContinueCreate(Unknown Source)
at me.chunyu.base.activity.CYDoctorActivity40.onCreate(Unknown Source)
at me.chunyu.base.activity.CYFragTabActivity.onCreate(Unknown Source)
at me.chunyu.ChunyuDoctor.Activities.MainActivity600.onCreate(Unknown Source)
at android.app.Activity.performCreate(Activity.java:5086)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at com.lbe.security.service.core.client.b.x.callActivityOnCreate(Unknown Source)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2056)
... 11 more
1. 逆向工具
(1) 工具dex2jar, 下载地址, Github.
主要使用d2j-dex2jar.sh
脚本执行. 例如:
sh d2j-dex2jar.sh classes.dex
(2) JD-GUI
是显示Java包内容的工具.
2. 配置命令
在bin
文件夹下设置, 建立软链接.
ln -s /Users/wangchenlong/Installations/dex2jar-2.0/d2j-dex2jar.sh d2j-dex2jar.sh
bin
是系统命令文件夹.
- 在根目录建立bin文件夹:
$mkdir bin
- 修改".bash_profile":
$vi ~/.bash_profile
- 在".bash_profile"添加系统路径:
PATH=$PATH:/Users/wangchenlong/bin
export PATH
- 更新".bash_profile":
$source ~/.bash_profile
- 显示路径, 是否加载成功:
$echo $PATH
目前需要关联d2j_invoke.sh
文件, 无法配置命令, 在文件夹内直接使用d2j-dex2jar.sh
.
3. 解析Apk
修改Apk包的扩展名, .apk
->.zip
, 解压.
找到里面的classes.dex
文件, 把这个文件转换为jar
文件.
进入dex2jar-2.0
文件夹下, 修改d2j_invoke.sh
权限.
sudo chmod 755 'd2j_invoke.sh'
d2j_invoke.sh
是d2j-dex2jar.sh
的关联脚本, 否则Permission Denied
.
执行命令d2j-dex2jar.sh
, 在当前文件夹生成classes-dex2jar.jar
.
sh d2j-dex2jar.sh ~/Desktop/SpringRainDoctor/classes.dex
移动jar
到项目文件夹.
mv classes-dex2jar.jar ~/Desktop/SpringRainDoctor/classes-dex2jar.jar
使用JD-GUI
打开jar包, 根据错误找到包内信息.
OK, 这样就可以根据错误定位到崩溃(Crash)的位置了.