博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Smalidea无源码调试 android 应用
阅读量:6161 次
发布时间:2019-06-21

本文共 2737 字,大约阅读时间需要 9 分钟。

瘦蛟舞 · 2015/07/22 16:52

smalidea是一款 IntelliJ IDEA/Android Studio的 smali 插件

已有功能


  • 语法高亮/错误提示
  • 字节码级别调试
    • 断点
    • 单步调试
    • 寄存器查看
    • 本地窗口 java 语法支持,debug 模式下同样支持
  • 支持跳转,方便追踪变量/函数/类.(Xref也支持)
  • 查找用法
  • 重命名
  • 从 java 代码引用 smali 类
  • 错误反馈...

安装


  • 下载插件
  • 进入IntelliJ IDEA/Android Studio开始安装插件,进入Settings->Plugins点击Install plugin from disk选中下载好的压缩包.
  • 点击 apply

开启应用调试


要调试一个apk里面的dex代码,必须满足以下两个条件中的任何一个:

  • apk中的AndroidManifest.xml文件中的Application标签包含属性android:debuggable=”true”
  • /default.prop中ro.debuggable的值为1

可选方案:

  • apktool 反编译app 后在AndroidManifest.xml文件中插入android:debuggable=”true”
  • hook system debug (Xinstaller)
  • 修改boot.img

个人觉得改 boot.img和二次打包比较麻烦,所以这里采用 hook 方式达到开启所有应用调试的目的,xposed 插件代码如下

#!javapublic class Debug implements IXposedHookLoadPackage {    public boolean debugApps = true ;    public static final int DEBUG_ENABLE_DEBUGGER = 0x1;    public String tag = "IDG";    @Override    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {        if(lpparam.appInfo == null ||                (lpparam.appInfo.flags & (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) !=0){            return;        }        tag = tag + lpparam.packageName;        XposedBridge.hookAllMethods(Process.class, "start", new XC_MethodHook() {            @Override            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {                int id = 5;                int flags = (Integer) param.args[id];                Log.d(tag,"flags is : "+flags);                if (debugApps) {                    if ((flags & DEBUG_ENABLE_DEBUGGER) == 0) {                        flags |= DEBUG_ENABLE_DEBUGGER;                    }                }                param.args[id] = flags;                Log.d(tag,"flags changed : "+flags);            }        });    }}复制代码

效果如下图

如果遇到如下错误

Adb rejected connection to client复制代码

可以使用重启 adb server 来解决

adb kill-serveradb start-server复制代码

如果调试中遇到如下错误,确保关闭了其他 IDE 或者 DDMS,解除端口占用

调试应用


注意:IDEA 14.1及以上版本才支持单步调试

  • 使用 baksmali 反编译应用

    baksmali myapp.apk -o ~/projects/myapp/src复制代码
  • 转到 IDEA 中,导入新工程,选中之前的目录

    ~/projects/myapp复制代码

  • 导入时选择Create project from existing sources

  • 成功导入工程后右键点击 src 目录,设定Mark Directory As->Sources Root

  • 打开Module setting设置对应的 JDK

  • 安装debug应用

    adb install com.zkj.guimi.apk复制代码
  • 找到debug应用进程,启动应用

    如果不用 ddms 可以使用如下步骤:

    » adb shell am start -D -W -n com.zkj.guimi/.ui.SplashScreen» adb shell ps |grep guimi                                                                                                         1 ↵u0_a157   9879  242   883420 36360 ffffffff 00000000 S com.zkj.guimi» adb forward tcp:8700 jdwp:9879复制代码
  • 在 IDEA 配置远程调试(Run->Edit Configurations),更改debug端口为8700

  • Run->Debug

    Connected to the target VM, address: 'localhost:8700', transport: 'socket'

  • 断点触发后就可以单步调试

reference


转载地址:http://zeefa.baihongyu.com/

你可能感兴趣的文章
好程序员分享居中一个float元素
查看>>
阿里云前端周刊 - 第 25 期
查看>>
Java 反射教程
查看>>
开源大数据周刊-第50期
查看>>
5个产品经理必须掌握的,小程序裂变案例
查看>>
Android知识点复习(一)-Android系统架构
查看>>
calc(~,mac电脑set-cookies要域名和请求域名相同
查看>>
小葵花妈妈课堂开课了:《Handler Looper Message 浅析》
查看>>
浏览器和node的eventLoop的区别
查看>>
Android-动画-view 动画笔记
查看>>
爬虫调用百度翻译API
查看>>
80%的前端程序员都遇到的问题,你中招了吗?
查看>>
slider轮播插件的多种写法
查看>>
小米6.0以上系统怎么无需root激活Xposed框架的步骤
查看>>
【Spring】HttpMessageConverter的作用及替换
查看>>
android 关于 textview首行缩进 显示图片、文字问题
查看>>
YTKNetwork使用application json方式传递参数
查看>>
HTML5 小动画例子
查看>>
温故之.NET 任务并行
查看>>
React怎样从函数中辨别类
查看>>