深入理解Android Framework(二)- 导入Android11源码到Android Studio

1,383 阅读3分钟

上一篇文章中讲解了Android 11源码的下载和编译,本章我们将android 11源码导入Android Studio,用于我们日后的开发定制工作。

1、设置环境

使用 envsetup.sh 脚本初始化环境:

source build/envsetup.sh

2、选择目标 [lunch]

使用 lunch 选择要构建的目标。lunch product_name-build_variant 会选择 product_name 作为需要构建的产品,并选择 build_variant 作为需要构建的变体,然后将这些选择存储在环境中,以便供后续对 m 和其他类似命令的调用读取。 确切的配置可作为参数进行传递。例如,以下命令表示针对模拟器进行完整构建,并且启用所有调试功能。

lunch sdk_phone_x86_64

注意 lunch选择目标时请选择您已经编译通过的目标,这样将方便您进行后期的源码调试工作,如果在没有参数的情况下运行,则 lunch 会提示您从菜单中选择目标。

3、编译idegen工具

make idegen -j4

如果您成功编译idegen,您将看到以下输出:

...
[100% 787/787] Install: out/host/linux-x86/framework/idegen.jar
#### make completed successfully (02:15 (mm:ss)) ####

idegen.jar简介 要将Android系统源代码工程导入到Android Studio,关键是要有相应的工程配置文件。idegen就是用来生成针对Android Studio的Android系统源代码工程配置文件的一个工具,此外,它也支持生成Eclipse或IntelliJ IDEA的工程配置文件。

4、生成工程配置文件

./development/tools/idegen/idegen.sh

如果生成成功您可以看到如下输出:

...
Read excludes: 6ms
Traversed tree: 157312ms

同时,您可以在您的源码目录找到以下两个文件:

  • android.iml (由IntelliJ IDEA创建的模块文件,存储有关开发模块的信息)
  • android.ipr (工程的具体配置,代码以及依赖信息)

5、修改android.iml文件 (可选)

如果您的主机配置满足google建议的最低要求(至少16G RAM, CPU 8核以上),并且您想导入全部安卓源码用于开发,您可以参考步骤6继续您的导入流程,如果您的主机配置不够或您像我一样只是关注Farmwork层代码。您可以从这一步开始您的导入流程。 打开android.iml,该文件配置项非常多,其中有三部分最为主要:

  • sourceFolder:表示包含的文件目录,在本教程中只需要留下framewrok。
  • excludeFolder:表示不包含的文件目录,安卓源码中很多代码是我们不需要关注的,我们可以配置这部分目录到excludeFolder,以让我们的IDE在导入过程中忽略它们。
  • orderEntry: 表示代码目录的相关依赖,如果不删除的话,ctrl+左键跟踪代码时,AS会默认使用orderEntry中指定的jar包,并跳转到jar包中的.class文件。 所以删除orderEntry只保留最下面两行即可。

由于我只关注Framework层的相关代码,所以我可以作如下配置:

5.1、sourceFolder标签

全局搜索<sourceFolder url="file://$MODULE_DIR$/frameworks字段,把除了这个字段以外的全部删除即可。

5.2、excludeFolder标签

<sourceFolder url="file://$MODULE_DIR$/./sdk/testapps/userLibTest/src" isTestSource="true"/>
<sourceFolder url="file://$MODULE_DIR$/./tools/external/fat32lib/src/main/java" isTestSource="false"/>
<excludeFolder url="file://$MODULE_DIR$/out/eclipse"/>
<excludeFolder url="file://$MODULE_DIR$/.repo"/>
<excludeFolder url="file://$MODULE_DIR$/external/bluetooth"/>
<excludeFolder url="file://$MODULE_DIR$/external/chromium"/>
<excludeFolder url="file://$MODULE_DIR$/external/icu4c"/>
<excludeFolder url="file://$MODULE_DIR$/external/webkit"/>
<excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs"/>
<excludeFolder url="file://$MODULE_DIR$/out/host"/>
<excludeFolder url="file://$MODULE_DIR$/out/target/common/docs"/>
<excludeFolder url="file://$MODULE_DIR$/out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates"/>
<excludeFolder url="file://$MODULE_DIR$/out/target/product"/>
<excludeFolder url="file://$MODULE_DIR$/prebuilt"/>

5.3、orderEntry标签

我们可以仿照上面这段代码的<excludeFolder url="file://$MODULE_DIR$/.repo"/>写法一样过滤掉不需要的内容,这样在导入时就会快很多,具体导入哪些模块可以视您的需要而定。

6、导入代码

至此,打开Android Studio,如下图所示即可导入安卓源码

img

7、其他操作

7.1、 导入或排除其他模块

点击"File -> Project Structure...",打开如图所示的界面

img在这里我们可以看到项目的所有代码目录,我们可以选中不需要的module,并点击上面的"Excluded"按钮,当被选中的目录变为橙色,即表示完成Exclude操作;如果想要取消对某代码目录的Exclude操作,选中该目录,再次点击"Excluded"按钮,等待目录变为蓝色即可。