zoukankan      html  css  js  c++  java
  • Smalidea无源代码调试 android 应用

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

    已有功能


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

    安装


    • 下载插件smalidea
    • 进入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 插件代码例如以下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    public 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-server
    
    adb start-server
    

    调试应用


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

    • 使用 baksmali 反编译应用

      baksmali myapp.apk -o ~/projects/myapp/src
      
    • 转到 IDEA 中,导入新project,选中之前的文件夹

      ~/projects/myapp
      

    • 导入时选择Create project from existing sources

    • 成功导入project后右键点击 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),更改debugport为8700

    • Run->Debug

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

    • 断点触发后就能够单步调试

    reference

  • 相关阅读:
    Java中编写代码出现异常,如何抛出异常,如何捕获异常
    用Java制作斗地主
    Java—Map接口中的常用方法
    Java—增强for循环与for循环的区别/泛型通配符/LinkedList集合
    Java—包装类/System类/Math类/Arrays类/大数据运算/Collection接口/Iterator迭代器
    Java—时间的原点 计算时间所使用的 Date类/DateFormat类/Calendar类
    Java—匿名对象/内部类/访问修饰符/代码块
    Java—构造方法及this/super/final/static关键字
    Java—接口
    URL Protocol打开应用程序并传递程序启动参数(Windows、Mac)
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6869519.html
Copyright © 2011-2022 走看看