教程008-跳转系统源码[进阶版]
Warning
这篇文档仅提供解决该方案的设计思路,无需添加任何配置或做额外操作,即可享受跳转系统源码。
背景¶
跳转系统源码从最开始的给 .iml 文件中的 android sdk 排序,到 教程005-跳转系统源码 提出的删除、恢复 android sdk 方案;总是觉得操作起来很繁琐。
最近在 IntelliJ IDEA 中调试 aosp_inject 工程发现使用 纯java模块 比 Android模块 速度快了不只5倍。
顿时来了灵感:把 as-aosp 的 Android模块 换成 纯java模块 ,好处如下:
-
加载更快,更省内存;
-
加载后无需任何操作,直接就能跳转系统源码。
方案¶
某模块的build.gradle
其实这个方案也很简单,就是在 build.gradle 里加载 java-build.gradle 还是 android-build.gradle,如:
if (rootProject.ext.isAndroid) {
apply from: "${rootDir}/scripts/android-build.gradle"
} else {
apply from: "${rootDir}/scripts/java-build.gradle"
}
core.gradle
那么这个 isAndroid 是在 scripts/core.gradle 中:
func.gradle
而 getForceAndroidLibrary() 函数是在 scripts/func.gradle 里定义:
ext.getForceAndroidLibrary = { properties ->
// 检查 ext/scripts/ext.properties or local.properties 是否存在 EXT_FORCE_ANDROID_LIBRARY
def forceAndroidLibrary = properties.getProperty('EXT_FORCE_ANDROID_LIBRARY')
if (isNotNull(forceAndroidLibrary)) {
logger.warn("set forceAndroidLibrary from ext/scripts/ext.properties or local.properties")
forceAndroidLibrary = forceAndroidLibrary.toBoolean()
} else {
// 经过测试发现,在 as 或者 idea 中使用 Java 模块也都可以断点调试
// 使用改成默认用 Java 模块
if (false) {
// 判断是否在中 as 中运行,
def isRunningInIDEA = System.getenv("IDEA_INITIAL_DIRECTORY") != null
def isRunningInAndroidStudio = !isRunningInIDEA && System.getProperty('idea.active') != null
logger.warn("Running on as = " + isRunningInAndroidStudio)
forceAndroidLibrary = isRunningInAndroidStudio
} else {
forceAndroidLibrary = false
}
}
return forceAndroidLibrary
}
这里可以看到,默认返回的是 false 。所以现在所有的 module 默认加载的是 Java 模块。