zoukankan      html  css  js  c++  java
  • android studio: android studio 导入自己编译的Framework.jar(转)

    本文转自:https://www.jianshu.com/p/d2fc082a212e

    最近做一个指纹注册验证的APP,需要访问framework层隐藏的接口(接口前的注释里加了@hide),为了能在android studio里可以使用这些接口,需要自己编译下framework的源码,如果编译debug版本,直接把out/target/product/projectXX/system/framewor framework.jar下面拷出来,如果是user版本,out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
    由于我编译的是user版本,所以直接将classes.jar拷贝出来并修改为framework.jar
    下面将framework.jar导入android studio工程
    1、将framework.jar放在Module的libs下面

    2、右键framework.jar,选择“Add As Library”
    3、右键Module选择“Open Module Settings,进入Project Structure界面,把framework.jar移到最顶上,把implementation改为compileOnly(默认Compile),点击确定:

    compileOnly表示只在编译时引用该jar包,打包的时候并不会将该jar打包进去。

    这里有一点一定要特别注意:一定要将Modules下的build.gradle里的
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    注释掉,否则还是会将framework.jar打包进apk
     
    4、在工程的根目录下打开build.gradle,并找到allprojects,加入如下代码
    allprojects {
        repositories {
            google()
            jcenter()
        }
        tasks.withType(JavaCompile) {
            options.compilerArgs.add('-Xbootclasspath/p:app\libs\framework.jar')
        }
    }

    5、在Module下打开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
            }
        }
    }

    自动更改module.iml,将下面代码会移动最后

    <orderEntry type="jdk" jdkName="Android API 26 Platform" jdkType="Android SDK" />

    通过以上步骤后,就可以引用源码的Api了,但可能在运行时会出错,提示odex超出了65536,所以再加上如下设置就不会出错了

    6、在Module下面的build.gradle里找到defaultConfi加入multiDexEnabled = true:

     

    并在dependencies里添加

    implementation 'com.android.support:multidex:1.0.0'

    由于使用了framework层隐藏的Api,编译出来的apk是不能作为一个普通的app运行的,必须将该app变成系统级的app才能正常运行,怎样变成系统级的app,下篇文章会详细介绍。

    参考链接:
     
     
  • 相关阅读:
    unsupported jsonb version number 123
    如何在MPlayer上支持RTSP
    TDengine 时序数据库的 ADO.Net Core 提供程序 Maikebing.EntityFrameworkCore.Taos
    如何使用IoTSharp对接ModBus?
    如何从源码启动和编译IoTSharp
    Asp.Net Core 自动适应Windows服务、Linux服务、手动启动时的内容路径的扩展方法
    MQTTnet 的Asp.Net Core 认证事件的扩展
    Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)
    The remote certificate is invalid according to the validation procedure 远程证书验证无效
    settings插拔式源码
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/14976896.html
Copyright © 2011-2022 走看看