Android studio 中导入framework 系统 jar包,使应用可以访问系统api,不报红,编译通过

在Android Studio 中开发系统应用,想要使用系统中某些三方app 无法使用的api, 往往会爆红,无法找到对应的方法或者属性

此时,做如下步骤,就可以正常编译。

1. framework.jar 的添加

将系统jar包放到module的libs文件夹下

framework.jar 来源,可以在网上搜索相应版本的jar包,当然,最正确的使在对应的源码产物中获取,

路径为\obj\JAVA_LIBRARIES\framework_intermediates\classes.jar

因为该目录下所有的jar文件名都为classes.jar,为了在AS里便于区分,我重命名为framework.jar

2. Project的build.gradle 文件中添加 gradle.projectsEvaluated

提高编译时lib库的引用优先级

allprojects {
    repositories {
        google()
        jcenter()
        
    }
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs.add('-Xbootclasspath/p:app/libs/framework.jar')
        }
    }
}

3. module 的 build.gradle 中,添加fw jar包依赖,同时提高其在模块.iml 中的顺序,使其优先于本地自带的sdk

dependencies {
    ....
    compileOnly files('libs/framework.jar')   // 添加要使用的fw jar包
}

//将本地sdk 顺序置于模块iml文件的最后,使优先使用自己的fw jar包
preBuild {
    doLast {
        def imlFile = file(project.name + ".iml")
        // def imlFile = file(".idea\\modules\\app\\app.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
        }
    }
}

结语:

如果帮到各位,欢迎点赞支持,谢谢!

你可能感兴趣的:(Android,Studio,Android,framework,android)