Android中使用 framework.jar 的方法

开发过程中遇到,要调用系统@hide的方法,这个要使用framework.jar

第一步:保证framework.jar 的版本匹配

第二步:把jar包放到libs文件下,并add to library,这个时候在build.gradle文件里看到

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

要把它改成

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

这样个provided 的作用是我们只需要编译成功,不需要把这个包打到apk中。

第三步:修改项目根目录下的build.gradle

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

放到allprojects中是要作用到所有的子模块上,tasks.withType(JavaCompile) 是在 javac 的 task 中加入一个参数,就是在 Xbootclasspath 增加自己的 jar 包

第四步:更改jar包编译顺序优先于android.jar

dependencies {
    ....
    provided files('libs/framework.jar')
}
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
        }
    }
}

这个时候有可能还会遇到这个错误


Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.
> java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex

解决办法

在项目上右键,选择"Open Module Setting" ,点击“Dependences”,看到
{include=[*.jar], dir=libs},remove掉,应该就OK了

你可能感兴趣的:(Android中使用 framework.jar 的方法)