如何实现在android studio中附加模式调试app
本帖最后由 元始天尊 于 2016-4-24 16:51 编辑我在学习的过程中,亲历的这件事:项目组要做一个复杂的工程,分为sdk工程和demo工程,里面有java和jni层
而so和aar是sdk工程中生成的,拷贝到demo工程中编译成最终apk。
java层的调试,是简单的。可以在运行的时候用sdk工程的android studio附加app,如果直接用demo附加,sdk中的源码有些并不好显现,只能通过工程目录jar文件来查看。
而so层的附加,默认情况下是不可行的,因为jni层调试是启动型调试,我们来看下android studio处理各种调试行为的过程:
java层调试:
adb push 1.apk /data/local/tmp/1.apk
am start -D -n com.example.test/.MainActivity
android studio等待app状态正常
设置断点
执行remote connect,使用java调试协议附加
jni层调试:
adb push 1.apk /data/local/tmp/1.apk
am start -D -n com.example.test/.MainActivity
android studio等待app状态正常
adb push lldb_server
./lldb_server ..............建立Lldb调试服务器
lldbfrontend.exe ...........连接lldb调试服务器
向lldb_server发送附加调试命令
设置java/c层断点
执行remote connect,使用java调试协议附加
附加调试:
设置断点
执行remote connect,使用java调试协议附加
1.在研究过程中发现jni层在编译时生成2个so,带符号的是obj/local目录下的so,apk中编译好的的so是可以不带符号的,此时用gdb调试,吧文件设置为带符号的so,即可调试。继续研究发现带符号的so和无符号的so,前面字节完全相同。
2.android studio建立jni工程,需要自动安装lldb,修改gradle脚本,build.gradle
debug {
jniDebuggable true
}
3.android studio附加按钮只是采用Run/Debug Configuration中的Remote Configuaration
从上述过程可见,附加并不能触发jni层调试步骤,而jni层调试步骤又是写死的,必须把前面加载apk部分去掉,于是对android-ndk.jar做修改
最终实现了效果。其中一些重要的类:
IDevice:描述移动设备
Client:描述app包进程
AndroidNativeDebugProcess 控制jni调试,和lldb_server通信
AndroidNativeDeubgRunner 控制调试器部分
AndroidNativeRunConfiguration 配置Run/Debug Configuration中的Natvie-Debug选项,我在里面添加了用户app进程列表方便调试
AndroidNativeRunConfigurationEditor 配置界面控件
AndroidLLDBDebuggerContext jni层建立lldb调试器
AndroidLLDBDriver 实现基本调试功能
开源项目在:
https://github.com/lichao890427/AndroidNdkDebugPlugin.git
页:
[1]