android系统APP开发,优先使用源码编译的framework jar包

Android系统定制功能开发时,常常需要修改framework接口,然后提供给app使用,app可以使用反射调用 ,但反射效率比较低,可以直接把framework的jar放在app里面,让app直接调用。

1.找到真正的framework的jar包

framework添加接口后,不是在mmm编译出来的

out/target/product/hammerhead/system/framework/framework.jar

用上面的jar包app是引用不到的,需要使用静态jar包

步骤:make -j16编译完成后,找到jar包:

out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes_full_debug.jar或是classes.jar

然后重命名为framework.jar放在app的libs下面

2.导入jar包

工程右键Open Module Settings,在Dependencies添加jar dependecy,找到framework.jar,注意Scope要从默认的Compile改成Provided,这样让app编译时绕过此jar包,运行时从系统找该jar包,不然编译会报错。


然后在右边把该jar包优先级往上+,能加多少是多少

3.调整优先级

Android studio的引用顺序可能还是会先找google的android sdk,还可以把原生的sdk位置往下调,在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
        }
    }
}


此时再编译一下,看下app.iml的顺序是不是就对了,app可以直接调用framework方法,编译也能正常运行了


你可能感兴趣的:(android)