现在很多公司已经抛弃了单纯App开发的模式,慢慢的走向了源码编译;通过修改Framework层的东西,达到自己想要的需求,但是问题也来了,我们不能像往常一样,通过import/open来编辑编译它;正如刚开始的我,一直在用Sublime来编辑,make命令来编译,手动导包,手动查找Api,那简直是噩梦!
如题,直接进入正文!
说一下我用的环境:Ubuntu14.04、openjdk1.7、Android Studio2.2、Android6.0源码
这里先不说如何下载源码,直接从编译开始
$ source build/envsetup.sh
$ lunch aosp_flounder-userdebug
(flounder:Nexus 9 flo Nexus 7二代 grouper Nexus 7一代)
$ make -j8 ( 8代表CPU核数 )
- 编译完之后,想要关联Android Studio,一下两步很重要:
- 第一步,这行命令的意思是编译idegen这个项目,生成idegen.jar文件。
$ mmm development/tools/idegen/
如果你看到了绿色的 #### make completed successfully ####,说明这步是ok的。 - 第二步,这行命令的意思是生成:android.iws, android.ipr, android.iml这个三个文件。
$ sh ./development/tools/idegen/idegen.sh
如果你看到类似这样的字样:
Read excludes: 4ms
Traversed tree: 14572ms
说明是ok的,!!!这三个文件在根目录!!!
android.iws 包含工作区的个人设置,比如打开过的文件,版本控制工具的配置,本地修改历史,运行和debug的配置等。
android.ipr 一般保存了工程相关的设置,比如modules和modules libraries的路径,编译器配置,入口点等。
android.iml 用来描述modules。它包括modules路径、 依赖关系,顺序设置等。一个项目可以包含多个 *.iml 文件。
到了这里,就可以考虑导入到Android Studio中了。
打开Android Studio --> File --> open --> 选中生成的android.ipr文件,确定后就会导入整个源码。
导入之后,可以看到Android Studio下方,Indexing... 在以极慢的速度前进,So,为了加快读取速度,我们定义一些不需要读取的文件夹,比如 build、.repo、device、out 等等。
打开 android.iml 文件。
我们发现有2000~3000行,是非常多的,但是仔细的看,发现大标签只有三种
<sourceFolder />
<excludeFolder />
<orderEntry />
- 关于<sourceFolder>标签:
去除不需要debug的<sourceFolder/>标签内容,通常我们只需要frameworks和packages两个目录,所以保留这两个目录有关的标签就行,其他全部删掉,这样索引的速度就会加快了。 - 关于<excludeFolder>标签:
exclude顾名思义就是不包含的意思。我们有很多目录直接就不想让Studio去管它,不管是索引还是什么等等,所以只需要将这些目录配置到<excludeFolder>中就好了。
** 我这里只保留了framworks和packages模块,将其他模块全部排除了,因此在android.iml中添加了以下配置: 剩下的都删了**
<?xml version="1.0" encoding="UTF-8"?>
<module version="4" relativePaths="true" type="JAVA_MODULE">
<component name="ModuleRootManager" />
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<!--sourceFolder标签表示需要索引的代码目录-->
<sourceFolder url="file://$MODULE_DIR$/frameworks/base/core/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/gen" isTestSource="false" generated="true" />
<!--excludeFolder标签表示这个目录下所有内容都不索引-->
<excludeFolder url="file://$MODULE_DIR$/.repo" />
<excludeFolder url="file://$MODULE_DIR$/abi" />
<excludeFolder url="file://$MODULE_DIR$/art" />
<excludeFolder url="file://$MODULE_DIR$/bionic" />
<excludeFolder url="file://$MODULE_DIR$/bootable" />
<excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/cts" />
<excludeFolder url="file://$MODULE_DIR$/dalvik" />
<excludeFolder url="file://$MODULE_DIR$/developers" />
<excludeFolder url="file://$MODULE_DIR$/development" />
<excludeFolder url="file://$MODULE_DIR$/device" />
<excludeFolder url="file://$MODULE_DIR$/docs" />
<excludeFolder url="file://$MODULE_DIR$/external" />
<excludeFolder url="file://$MODULE_DIR$/external/bluetooth" />
<excludeFolder url="file://$MODULE_DIR$/external/chromium" />
<excludeFolder url="file://$MODULE_DIR$/external/emma" />
<excludeFolder url="file://$MODULE_DIR$/external/icu4c" />
<excludeFolder url="file://$MODULE_DIR$/external/jdiff" />
<excludeFolder url="file://$MODULE_DIR$/external/webkit" />
<excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs" />
<excludeFolder url="file://$MODULE_DIR$/frameworks/base/tests" />
<excludeFolder url="file://$MODULE_DIR$/frameworks/base/tools" />
<excludeFolder url="file://$MODULE_DIR$/hardware" />
<excludeFolder url="file://$MODULE_DIR$/libcore" />
<excludeFolder url="file://$MODULE_DIR$/libnativehelper" />
<excludeFolder url="file://$MODULE_DIR$/ndk" />
<excludeFolder url="file://$MODULE_DIR$/out" />
<excludeFolder url="file://$MODULE_DIR$/pdk" />
<excludeFolder url="file://$MODULE_DIR$/platform_testing" />
<excludeFolder url="file://$MODULE_DIR$/prebuilt" />
<excludeFolder url="file://$MODULE_DIR$/sdk" />
<excludeFolder url="file://$MODULE_DIR$/tools" />
<excludeFolder url="file://$MODULE_DIR$/vendor" />
<excludeFolder url="file://$MODULE_DIR$/toolchain" />
<excludeFolder url="file://$MODULE_DIR$/system" />
<excludeFolder url="file://$MODULE_DIR$/prebuilts" />
</content>
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="inheritedJdk" />
<orderEntryProperties />
</component>
</module>
接下来就可以看源码了,而且没有报错,但是没有关联跳转,接下来我们解决这个问题。
修改JDK + SDK
** 如图:我编译的版本是Android6.0,所以用JDK1.7编译,这里默认1.8,所以要换成1.7,删除多余的SDK **
选中ClassPath下所有的内容删除(-号)
修改名称,修改路径
完成
** 修改SDK **
如果这一栏有多余的内容,删除它,保留如图的2个就可以了。
这个地方,修改位对应的sdk就可以了!
然后就可以痛痛快快的搞源码了!