Android动态调试Smali文件

动态调试分为Java层和Native层调试
Java层动态调试主要是调试smali文件
Native层主要是调试so文件
这篇文章主要介绍smali文件动态调试的方法

准备工作

  • Android studio
  • smalidea插件(识别smali语法)
    安装smaliidea方法:File–>Setings–>Plugins–>Install plugin fromdisk…. –>Restart
  • apktool.jar/AhakaApktool.jar(对apk进行反编译和回编译)
  • 夜神模拟器

搭建环境

  • 安装jdk环境
  • 安装SDK
    运行SDK Manager.exe这里只要安装默认的package就可以了,后期可以根据自己的需要安装其他的package,安装好之后把platform-tools和tools添加到path环境变量中
    打开cmd输入adb或是monitor进行测试,如果不报错说明安装成功了

调试

  • 修改AndroidMainifest.xml文件
    反编译apk文件
    java -jar ShakaApktool.jar/apktool.jar d -df apkfile -o filename
    然后在AndroidMainifest.xml中添加调试属性android:debuggable=”true”

回编译apk文件
java -jar ShakaApktool.jar/apktool.jar b filename -o apkfile1

ShakaApktool.jar/apktool.jar 这两个工具都可以对apk文件进行反编译和回编译
回编译后的apk需要进行签名,可以使用工具进行签名

  • AS中导入源码 AS/idea中导入源码 File–>open

  • 设置远程调试选项
    Run–>Debug Configurations–>Remote Java Application Host填写为localhost,端口为Debug开放的端口8700

  • 连接模拟器
    nox_adb.exe connect 127.0.0.1:62001

  • 安装apk
    adb install apkfile

安装失败,使用adb kill-server结束adb服务,然后在再重启就可以
adb devices 检测设备连接情况

  • 下断点

  • 启动apk文件调试
    adb shell am start -D -n packageName/ActivityName

在monitor在检测apk

启动调试后,在断点处断下来,模拟器中会有调试等待的指令

然后就可以开始调试了

回编译遇到错误解决办法

回编译apk文件,遇到报错提示:
No resource found that matches the given name ‘@android:style/Animation.OptionsPanel
No resource found that matches the given name ‘@android:style/Animation.LockScreen
在网上查了百度了一下这个错误,原因在于 styles.xml文件中,有如下代码,删除即可:

1
2
style name="Base.TextAppearance.AppCompat.Widget.Button.Borderless.Colored" parent="@android:style/Animation.OptionsPanel"
style name="Base.TextAppearance.AppCompat.Widget.Button.Colored" parent="@android:style/Animation.LockScreen"

这个文件可以根据提示的路径找到,一般是在res文件夹下
error: No resource identifier found for attribute ‘roundIcon’ in package ‘android’
删除AndroidManifest.xml里的 android:roundIcon=”@mipmap/ic_launcher_round”