Android Studio 导入源码模块并debug
做系统开发,经常需要导入源码,但是导入全部源码又太卡了,这时候,有什么办法只导入我们需要修改的模块呢。答案是肯定的。
导入所有源码的方法,参见如何使用Android Studio开发/调试Android源码
1. 导入需要开发的模块
2. 配置Android Sdk并且加载src,支持android studio里面的java文件跳转
这样做是为了重新加载.java文件,添加索引,这样之后,点击ctrl+鼠标左键 直接跳转过去
删除SDK中的jar包
这一部是防止跳转的时候,跳转到sdk中的class文件中去
此时有可能会出现String和其他一些类找不到的情况,
一般情况下,我还添加/out/target/common/obj/JAVA_LIBRARIES/android_system_stubs_current_intermediates/下的资源,这个里面有基本库,String类等
注意:
在开发系统的时候,有时候,代码中会有一些相同名的文件名,为了规避跳转到不对应的地方,我们需要把不需要的文件名Exclude掉
比如下图,framework/base/package/SystemUI 并不是我们编译进系统的SystemUI
真正的地方在Vendor下面,
那我们可以把framework下的SystemUI给Exclude掉
3. debug调试
首先要保证你刷机的镜像和本地的代码保持一致,否则会出现代码无法识别的情况
这样就可以跟正常的app 应用开发打断点了
正常情况下,如果你选择的进程不是对应的代码,那前面的小红点不会有变化。
如果你选择debug的进程对应了你所需要调试的代码,前面的小红点会打钩。
此时,你就可以进行断点,如果程序运行到断点位置,就会停下来。
此时通过F5、F6、F7等就可以调试。和普通的断点调试没有任何区别
重启android
root@android:/system/vendor/modules # ps |grep servicemanager
system 1250 1 892 336 c04193a8 400a6fe8 S /system/bin/servicemanager
root@android:/system/vendor/modules # kill -9 1250
如果只是杀死servicemanager这个进程,则只重启android
或者在 adb shell进去,然后stop -> start 也可以进行重启
注意:
有可能调试模块的时候出现能调试全局变量,但是不能调试局部变量的情况,此时有可能是因为你的代码进行了混淆。
我们只需要在Android.mk文件中,把代码混淆去掉,重新编译就行了
指定不需要混淆的native方法与变量的proguard.flags文件如:LOCAL_PROGUARD_FLAG_FILES := proguard.flags
制定编译的工程,不要使用代码混淆的工具进行代码混淆如:LOCAL_PROGUARD_ENABLED := disabled
不设置,默认使用LOCAL_PROGUARD_ENABLED := full.即将该工程代码全部混淆