0.预先设置
1 增加ubuntu的watch文件数量
打开文件/etc/sysctl.conf,在这个文件加入一行:
fs.inotify.max_user_watches=524288
保存文件后执行:
sudo sysctl -p
最后可以执行:
cat /proc/sys/fs/inotify/max_user_watches
来检查这个值是否被成功修改了。
(参考:code.visualstudio.com/docs/setup/…)
2 增加Android Studio的堆内存
使用Android Studio浏览这么大的项目会存在堆内存不够的问题。
在Android Studio中点击File → Settings → Appearance & Behavior → System Settings → Memory Settings,将其中所有heap size调到最大然后点击ok。
1.进入源码根目录,编译idegen项目,生成idegen.jar 文件
cd 源码目录
source build/envsetup.sh
export BUILD_TARGET_PRODUCT=ingres
lunch missi-userdebug //也可以先lunch查看,在选择对应的机型
mmm development/tools/idegen
#如果你看到了绿色的 #### make completed successfully ####,说明这步是ok的
2.执行idegen.sh,生成:android.iws, android.ipr, android.iml这个三个文件
./development/tools/idegen/idegen.sh #执行idegen.sh
如果你看到类似这样的字样:
Read excludes: 4ms
Traversed tree: 14572ms
说明是ok的。
#这三个文件在根目录#
android.iws 包含工作区的个人设置,比如打开过的文件,版本控制工具的配置,本地修改历史,运行和debug的配置等。
android.ipr 一般保存了工程相关的设置,比如modules和modules libraries的路径,编译器配置,入口点等。
android.iml 用来描述modules。它包括modules路径、 依赖关系,顺序设置等。一个项目可以包含多个 *.iml 文件。
android.iml文件中包括了太多的源码目录和jar包,如果此时直接用Android Studio打开ipr文件,扫描会非常耗时。通常如果只看framework层代码,只需要扫描framewroks, miui, packages, tools这几个目录就够了,并且jar包也是完全不需要的。
可以通过python脚本进行处理,在源码根目录下新建cutiml.py文件
cutiml.py
if __name__ == '__main__':
with open('android.iml', 'r') as f:
lines = f.readlines()
include_start = '<sourceFolder url="file://$MODULE_DIR$/./'
exclude_start = '<excludeFolder url="file://$MODULE_DIR$/'
library_start = '<orderEntry type="module-library"'
includes = ('frameworks', 'miui', 'packages', 'tools')
excludes = ('art', 'bionic', 'bootable', 'build', 'build_log', 'compatibility', 'cts', 'dalvik', 'developers', 'development', 'device', 'disregard', 'external', 'hardware',
'kernel', 'libcore', 'libnativehelper', 'out', 'pdk', 'platform_testing', 'prebuilts', 'sdk', 'shortcut-fe', 'system', 'test', 'toolchain', 'vendor')
exclude_written = False
with open('android.iml', 'w') as f:
for line in lines:
line = line.lstrip()
if not exclude_written and line.startswith(exclude_start):
for exclude in excludes:
f.write('<excludeFolder url="file://$MODULE_DIR$/' + exclude + '"/>\n')
exclude_written = True
if (not line.startswith(include_start) or line[len(include_start):].startswith(includes)) and not line.startswith(library_start):
f.write(line)
执行 python cutiml.py
以上为常规方法导入
简便导入AS方法:
[Android Studio调试Framework源码]见后文
3.完成后通过Android Studio打开项目,点击File选项下的Open,在源码根目录下选择android.ipr文件进行导入,导入过程较慢,等待右下角的进度条完成
4.调试源码
点击Add Configuration...然后点击左上角的+,选择Android App并点击OK
在Android Studio中点File → Project Structure...→ Project → Project SDK选择与插入手机安卓系统API版本一致的SDK,如果找不到对应的SDK,通过如下方式添加:
File → Settings → Appearance&Behavior → System Settings → Android SDK,勾选需要的SDK版本进行下载,如果不知道系统API版本或者安卓版本可以通过以下adb命令查询:
adb shell getprop ro.build.version.sdk #查看系统API版本 adb shell getprop ro.build.version.release #查看安卓版本 |
|---|
上述步骤完成后就可以进行调试了;
调试方法:先插入手机并打开USB调试模式,然后在需要调试的代码地方打断点,接着点击工具栏中的Attach Debugger to Android Process按钮,在弹出的Choose Process对话框中勾选Show all processes,即可选择需要调试的进程;可以先拉到最下面,选择system_process进程进行调试(注:这里system_process就是SystemServer进程)
注意:手机必须刷root版本才能看到进程信息,User版本是无法看到进程信息的