找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4986|回复: 0

如何实现在android studio中附加模式调试app

[复制链接]
发表于 2016-4-23 18:05:34 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 元始天尊 于 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
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-23 16:15 , Processed in 0.033072 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表