关于安卓的调试方法(一)
字数 804 2025-08-22 22:47:30
Android调试方法教学文档(一)
一、Smali语法基础
1. 基本指令
invoke-static: 执行静态函数move-result-object v1: 将函数执行结果存入寄存器v1invoke-virtual: 执行虚函数(有返回值)const-string v0, "...": 定义字符串变量v0并赋值
二、ADB调试基础
1. 常见问题解决
当adb找不到设备时:
adb kill-server
adb start-server
三、Smali调试方法
1. 准备工作
- 使用apktool反编译APK:
apktool d app.apk
- 将生成的smali文件夹重命名为src
- 导入到Android Studio(版本3.3+)
2. 调试步骤
- 启动应用调试模式:
adb shell am start -D -n package.name/package.name.MainActivity
- 获取进程PID(替代旧版Android Devices Monitor):
netstat -p # 或 ps | grep 应用名
- 端口转发:
adb forward tcp:8700 jdwp:PID
- 在Android Studio中配置远程调试:
- 设置调试端口
- 配置项目结构(File > Project Structure)
- 设置SDK
四、Smali日志注入
1. 基本流程
- 反编译APK获取smali文件
- 在smali中插入日志代码
- 重新编译并签名:
apktool b 反编译文件夹 -o output.apk
jarsigner -verbose -keystore 签名文件 -signedjar 签名后.apk 待签名.apk 别名
2. 日志打印示例
打印字符串
查找smali中的日志打印段,复制并修改内容后重新编译。
查看日志:
adb logcat | grep "关键字"
打印寄存器值
在smali方法中添加寄存器值打印代码:
const-string v0, "TAG"
invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
五、关键点总结
- 新版Android Studio移除了Android Devices Monitor,需使用命令行获取PID
- 端口转发是远程调试的关键步骤
- Smali日志注入是动态分析的重要手段
- 每次修改smali后需要重新编译和签名
六、注意事项
- 端口冲突时可更换端口号
- 确保使用正确的签名文件和别名
- 日志标签(TAG)应具有唯一性便于过滤
七、参考工具
- apktool:APK反编译/回编译
- Android Studio:代码查看和调试
- adb:设备连接和调试
- jarsigner:APK签名工具