跳转至

教程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 中:

isAndroid = getForceAndroidLibrary(properties)
logger.warn("Config Android module = " + isAndroid)

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 模块。

评论