Android Studio 实现无缝调用系统 API

AS无缝调用系统api

Android studio使用自己的framework.jar,调用系统api

  1. 源码路径下找到对应的编译中间文件

    out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\classes.jar

  2. 拷贝jar文件添加到AS的lib中,add as library

  3. 修改app下build.gradle中framework.jar为compileOnly模式,优先级提高

    dependencies {
        compileOnly files('libs/framework.jar')
        implementation fileTree(include: ['*.jar'], dir: 'libs')
        ...
    }
    
  4. 修改AS项目app目录下的app.iml文件,将文件结尾 <orderEntry> 中对应的framework.jar项提取到sdk项之上,不要忘记save一下

    <orderEntry type="library" name="__local_aars__:E.\Workspace\AndroidProj\Test\MTvFactoryTest\app\libs\framework.jar:unspecified@jar" level="project" />
    
    <orderEntry type="jdk" jdkName="Android API 23 Platform" jdkType="Android SDK" />
    ...
    

    gradle实现方式,在app下build.gradle中结尾添加如下代码

    preBuild {
    doLast {
        def imlFile = file(project.name + ".iml")
        println('Change ' + project.name + '.iml order')
        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 groovy.util.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
        }
    }
    }
    
  5. 项目根目录下的build.gradle中,添加如下代码:

    allprojects {
        repositories {
            ...
        }
    
        gradle.projectsEvaluated {
            tasks.withType(JavaCompile) {
                options.compilerArgs.add('-Xbootclasspath/p:app\\libs\\framework.jar')
            }
        }
    }
    
  6. 执行clern,rebuild操作后,即可发现系统隐藏api不再报错,即可无缝使用

坚持原创技术分享,您的支持将鼓励我继续创作!