Android Studio 优先源码编译的framework.jar(使用系统隐藏的api)

引言
场景:做系统开发或者想使用隐藏的api时,通常只能使用反射的方式,
缺点:需要使用的api或变量太多时不方便使用。
解决办法:将需要在编译时使用的jar包参与编译,不编译到产品apk里,使app运行时调用的是系统api

步骤
1、将jar包放入libs目录,如下图(jar包自行编译或到github下载https://github.com/anggrayudi/android-hidden-api)
在这里插入图片描述
2、在app 的build.gradle加入参与编译的jar

dependencies {
        compileOnly files('libs/framework.jar')
}

3、调整 .iml里配置的引用库的优先级。
作用是使待使用的jar包优先于android.jar.

在app 的build.gradle加入以下代码,注意App.iml的路径

preBuild {
    doLast {
        //***需要使用你项目中的App.iml的路径***
        def imlFile = file("../.idea/modules/App/App.iml")
        println 'Change ' + imlFile.getAbsoluteFile()
        try {
            def parsedXml = (new XmlParser()).parse(imlFile)
            def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' }
            parsedXml.component[1].remove(jdkNode)
            def sdkString = "Android API " + android.compileSdkVersion.substring("android-".length()) + " Platform"
            new Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK'])
            groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile))
        } catch (FileNotFoundException e) {
            // nop, iml not found
        }
    }
}

4、修改根目录下的build.gradle (注意framework.jar的路径).
作用是在.iml里加入自己待使用的jar包。

allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }
        maven { url 'https://dl.bintray.com/rikkaw/Shizuku' }
    }

	//必须是正确路径,否则无法识别
    String path = getRootDir().getAbsolutePath()+'/App/libs/framework.jar'

    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            // 如果是单模块app, 可以使用相对路径
//            options.compilerArgs << '-Xbootclasspath/p:libs/framework.jar'

            //  如果是单模块app, 多模块(我的项目里有两个app模块)需要使用绝对路径,否则会出现assembleDebug assembleRelease能成功
            // 但是直接使用android studio run 会保错,找不到相关的类 (原因是编译时脚本所在的位置不一样)

            options.compilerArgs << '-Xbootclasspath/p:'+path
            println(path)
        }
    }
}
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页