AOSP下载不再赘述,国内镜像地址:tsinghua

如何阅读?

一、生成AS的配置文件,然后用IDEA打开

步骤:

  • 清理
make clobber
  • 环境
source build/envsetup.sh

. build/envsetup.sh
  • 编译idegen模块
# mmm development/tools/idegen/ 这种方式可能会出问题
make idegen
  • 生成IDE项目文件
development/tools/idegen/idegen.sh
  • 导入

通过IDEA/AS打开根目录下的android.ipr,等待即可。

遇到的问题:

  • JDK下tools.jar找不到问题:
Error: could not find jdk tools.jar at /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/../lib/tools.jar, please check if your JDK was installed correctly. Stop.

解决办法,按照错误日志提示找到文件:

$AOSP_ROOT/build/core/config.mk

其中报错行内容如下:

HOST_JDK_TOOLS_JAR:= $(shell $(BUILD_SYSTEM)/find-jdk-tools-jar.sh)

再找到这个shell文件:

$AOSP_ROOT/build/core/find-jdk-tools-jar.sh
if [ "x$ANDROID_JAVA_HOME" != x ] && [ -e "$ANDROID_JAVA_HOME/lib/tools.jar" ] ; then
    echo $ANDROID_JAVA_HOME/lib/tools.jar

发现其实只要配置好环境变量 **ANDROID_JAVA_HOME **即可。

  • SDKs/MacOSX.10.?.sdk** **找不到的问题:

由于我用的系统版本比较新:10.13(High Sierra),所以没有找到对应版本的MacOSX的sdk

找到以下文件:

$AOSP_ROOT/build/core/combo/mac_version.mk

找到以下行:

mac_sdk_versions_supported :=  10.8 10.9 10.10 10.11

执行命令:

xcodebuild -showsdks | grep macosx | sed -e "s/.*macosx//g"

得到本机已安装的MacOSX的sdk版本:

10.12

10.12追加到mac_sdk_versions_supported行末,重试编译idegen模块,发现不再提示错误。

如果需要编译rom,会发现10.12的sdk不能编译,但是目前只是为了阅读源码,能生成项目文件即可,最好还是使用Android官方建议的sdk版本。老版本MacOS SDK下载

  • 在 Mac OS 中的 HFS/APFS 文件系统上进行编译时,可能会遇到诸如以下错误:
Checking build tools versions...
build/core/main.mk:159: ************************************************************
build/core/main.mk:160: You are building on a case-insensitive filesystem.
build/core/main.mk:161: Please move your source tree to a case-sensitive filesystem.
build/core/main.mk:162: ************************************************************
build/core/main.mk:163: *** Case-insensitive filesystems not supported.
make: *** [out/build-aosp_arm-mmm-._development_tools_idegen_Android.mk.ninja] Error 1

解决办法,按照官网教程新建大小写敏感的分区:

通过 shell 使用以下命令创建磁盘映像:

hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 100g ~/android.dmg

这将创建一个 .dmg(也可能是 .dmg.sparseimage)文件,该文件在装载后可用作具有 Android 开发所需格式的存储卷。

可以使用以下命令来调整稀疏映像的大小:

hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage
  • 使用 mmm development/tools/idegen/ 编译出错:
Starting build with ninja
ninja: Entering directory `.'
ninja: error: 'out/host/common/obj/JAVA_LIBRARIES/guavalib_intermediates/javalib.jar', needed by 'out/host/common/obj/JAVA_LIBRARIES/idegen_intermediates/classes-full-debug.jar', missing and no known rule to make it
make: *** [ninja_wrapper] Error 1

很奇怪,猜测是JDK版本对不上,于是安装官网建议版本:

https://source.android.com/source/requirements

不行

8换成7

还是不行

最后发现是命令不对,不应该用 :

# mmm development/tools/idegen/

应该用:

make idegen

二、直接通过gradle配置sourceSets

建议使用IDEA,方便调整源码间跳转。

  • 新建gradle-java项目
  • 在build.gradle文件中添加sourceSets.main节点,设置源码目录为:
sourceSets {
	main {
		java.srcDirs = getJavaSrcs()
	}
}
  • getJavaSrcs()方法中返回想要看的源码目录即可

这边对整个java层的源码目录梳理了一遍,形成配置文件 source.json,如下所示:

{
  "source": {
    "java": [
      "frameworks/base",
      "frameworks/multidex",
      "libcore/luni",
      "libcore/ojluni",
      "libcore/dalvik",
      "libcore/libart",
      "libcore/dex"
    ],
    "javaSpec": [],
    "javaIgnore": [
      "frameworks/base/tools"
    ]
  }
}

其中:

  • source.javaIgnore 下的目录直接过滤
  • source.javaSpec 下的目录则直接添加
  • source.java 下目录进行递归遍历,符合规则的则会被加入到源码目录中

针对source.java 的递归逻辑如下:

/**
 * @param javaDir 当前目录
 * @param result 源码目录的集合
 * @param ignores 需要过滤调的集合
 **/
void searchJavaSrcsRecurse(File javaDir, Set<File> result, Set<File> ignores) {
	File[] subDirs = javaDir.listFiles(new FileFilter() {
		@Override
		boolean accept(File pathname) {
			return pathname.isDirectory()
		}
	})
	if (subDirs.size() <= 0) {
		return
	}
	for (int i = 0; i < subDirs.size(); i++) {
		File subDir = subDirs[i]
		File[] javaFiles = subDir.listFiles(new FileFilter() {
			@Override
			boolean accept(File pathname) {
				return pathname.absolutePath.endsWith(".java")
			}
		})
		
		if (javaFiles.size() > 0) {
			// try get first package name
			File firstJavaFile = javaFiles[0]
			String packageName = ''
			firstJavaFile.eachLine { line ->
				if (line.startsWith("package ") && line.endsWith(";")) {
					packageName = line.replace('package ', '').replace(';', '')
				}
			}
			// get the source dir with package name & dir path
			String endsWith = "${packageName.replace('.', '/')}/${firstJavaFile.name}"
			if (packageName != '' && firstJavaFile.absolutePath.endsWith(endsWith)) {
				def removed = firstJavaFile.absolutePath.replace(endsWith, '')
				if (!removed.contains('Test') && !removed.contains('test') && !removed.contains('tests') && !removed.contains('Tests')) {
				  // add path(removed) to result set with ignore set(ignores) in no duplicate
					addNoDuplicate(result, removed, ignores)
				}
			}
		} else {
			searchJavaSrcsRecurse(subDir, result, ignores)
		}
	}
}

其中addNoDuplicate()方法如下:

void addNoDuplicate(Set<File> result, String path, Set<File> ignores) {
	def ignore = false
	ignores.each { ig ->
		def ignorePath = getAospRoot() + ig
		if (ignorePath == path || path.startsWith(ignorePath)) {
			ignore = true
		}
	}
	if (ignore) {
		return
	}
	def exist = false
	result.each { resultItem ->
		String p = resultItem
		// 这个地方强转了String,AS中是不用的,但是IDEA中对这个的识别貌似有问题
		if (path.startsWith(p)) {
			exist = true
		}
	}
	if (!exist) {
		result.add(path)
	}
}

// aosp 根目录
String getAospRoot() {
	return '/Volumes/android/aosp/'
}
  • 处理完sourceSets后,gradle同步一下,同步完成后IDEA会提示import changes,确认即可。

最后需要坐的事情是,调整整个项目的依赖:

  1. 打开项目配置页面,新增一个JDK,这里取名叫1.8-pure
  2. 修改刚刚新添加的JDK 1.8-pure的Classpath,将其中所有的jar移除
  3. 应用配置变更并确定

这个时候可以尝试打开一个源码文件,并验证是否能够正确的跳转到aosp的源码中,而不是jar中

最后附上环境如下:

gradle -v

------------------------------------------------------------
Gradle 4.1
------------------------------------------------------------

Build time:   2017-08-07 14:38:48 UTC
Revision:     941559e020f6c357ebb08d5c67acdb858a3defc2

Groovy:       2.4.11
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_111 (Oracle Corporation 25.111-b14)
OS:           Mac OS X 10.13 x86_64
IntelliJ IDEA 2017.2.2
Build #IU-172.3757.52, built on August 15, 2017
Licensed to ****

JRE: 1.8.0_152-release-915-b10 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Mac OS X 10.13

其中提到的gradle脚本已提交到github:aosp-reader