ROM 编译&调试(一):Android Studio查看并调试源码流程

649 阅读3分钟

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版本是无法看到进程信息的