网上的文章大多是 Android Studio 2.x 环境,实行起来,坑比较多。

本文适用于 Android Studio 3.x 及以上,亲测可行。

一、编译生成 framework.jar 包

系统级 App 开发,很多时候需要访问 framework 层隐藏的接口(接口前的注释里加了@hide),有时候甚至是定制的系统,在 framework 层加入了新的接口,为了使用这些接口,需要自己编译 framework 的源码生成 jar 包,如果编译 debug 版本,直接把 out/target/product/projectXX/system/framewor framework.jar 下面拷出来,

如果是 user 版本:

Android N/O:

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

Android P/Q:

out/soong/.intermediates/frameworks/base/framework/android_common/combined/framework.jar

Android R:

out/soong/.intermediates/frameworks/base/framework-minus-apex/android_common/combined/framework-minus-apex.jar

二、将 framework.jar 导入 Android Studio 工程

  1. 将framework.jar放在Module的libs下面

  2. 添加对 framework.jar 的依赖

    在 module 的 build.gradle 文件中添加:

repositories {
flatDir {
dirs 'libs'
}
}

同时, dependencies 中添加依赖:

dependencies {
compileOnly fileTree(dir: 'libs', include: ['*.jar'])
}

注意:

使用 compileOnly(默认是 implementation),compileOnly 表示 jar 包只参与编译,不会打包进去。

如果同时还需要依赖其它 jar 包,并且其它需要打包进去,则分开对每个 jar 包单独进行依赖。

compileOnly files('libs/framework.jar')
implementation files('libs/XXX.jar')
  1. 在 module 的 build.gradle 文件中添加如下代码:
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
Set<File> fileSet = options.bootstrapClasspath.getFiles()
List<File> newFileList = new ArrayList<>();
//"../framework.jar" 为相对位置,需要参照着修改,或者用绝对位置
newFileList.add(new File("libs/framework.jar"))
newFileList.addAll(fileSet)
options.bootstrapClasspath = files(newFileList.toArray())
}
}
  1. 在 module 的 build.gradle 文件中,加入如下代码:
preBuild {
doLast {
//此处文件名根据实际情况修改:
def imlFile = file("../.idea/modules/xxxlib/xxx.xxxlib.iml")
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 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
println "no iml found"
}
}
}

这个 task 在编译之前, 自动更改module.iml,将下面代码会移动最后

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

才能在编译时使用我们引入的 framework.jar。

Android Studio 导入自己编译的 framework jar的更多相关文章

  1. Android Studio 导入系统 jar包

    1.当前需要导入系统jar包的module所对应build.gradle中添加如下依赖: provided files('libs/classes-full-debug.jar') 也可以图形化设置: ...

  2. Android Studio 导入 Android 系统模块并编译和调试

    FAQ: AS导入系统模块源码,并且能够编译调试,正常查看java doc ???? Android AOSP基础(五)Android Studio调试系统源码的三种方式http://liuwangs ...

  3. android studio导入 so ,jar 文件。

    环境为: Android Studio 1.0.2 如果是jar文件的话,请直接拷贝jar文件到项目的libs文件夹下,然后运行:Sync Project with Gradle Files.如下图2 ...

  4. Android Studio导入第三方jar包或依赖工程的方法

    Android Studio导入第三方jar包或依赖工程的方法   一 导入jar包的方法 1.打开自己的工程,将需要导入的jar包copy到libs文件夹下 2.在导入的jar包处单击菜单 Add ...

  5. Android Studio导入Android 4.4.4r1的源码

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/70339471 一.环境配置 1.ubuntu 14.04.5 x64bit 2.j ...

  6. Android Studio导入第三方类库的方法

    Android Studio导入第三方类库的方法 本人也刚刚开始尝试做android app的开发,听说android studio是Google支持的android 应用开发工具,所以想应该肯定比E ...

  7. Android Studio 导入外部lib文件

    Android Studio 导入外部lib文件   1.将jar包放入Module里的lib文件夹中.(自己创建lib文件夹) 2.在project选中jar包点击右键"Add as li ...

  8. Android Studio导入Fresco

    大概一周之前,Facebook开源了专为Android系统定制的图片下载缓存工具,当天该消息就上了各大技术论坛网站的头条,也成为了各个技术群里讨论的最主要的话题.也就在当天stay4it的QQ群里面就 ...

  9. Android Studio导入项目

    原文:http://ask.android-studio.org/?/article/21 本篇教程中使用到的Android Studio版本为1.0, Eclipse ADT版本23.0.4.请尝试 ...

  10. android studio上代码编译调试中遇到的一些异常记录

    下面是记录的在平时代码编写或编译时的一些异常,答案有自己摸索出来的,也有参考其他程序猿朋友的,参考文章过多,就不一一贴出来了. ① E/JavaBinder: !!! FAILED BINDER TR ...

随机推荐

  1. [转帖]ChatGPT研究框架(2023)

    https://www.eet-china.com/mp/a226595.html ChatGPT是基于OpenAI公司开发的InstructGPT模型的对话系统,GPT系列模型源自2017年诞生的T ...

  2. [转帖]Linux IO调度之队列、队列深度

    有关数据结构 请求队列:struct request_queue 请求描述符:struct request 队列深度 可以在端口队列中等待IO请求数量: 具体代表其值的是request_queue的成 ...

  3. 使用influxdb以及Grafana监控vCenter的操作步骤

    1. 下载安装介质 计划telegraf和influxdb 使用rpm包进行安装.Grafana使用docker容器方式安装 下载路径为: https://repos.influxdata.com/r ...

  4. true=='true'这个等式成立吗?

    在localStorage存入里面的数据是字符串,如果你存入了一个值是Boolean类型的, 那你你取出来就是一个字符串 'true' 或者 'false' 假设取出来的值是 'true' 在你进行i ...

  5. 即时通讯(IM)开源项目OpenIM每周迭代版本发布-音视频实时通话-v2.0.4

    介绍 OpenIM每周五发布新版,包括新特性发布,bug修复,同时合并PR 由于2.0版本重构完毕,架构更清晰,代码更规范,先邀请各位参与OpenIM社区建设,包括技术开发,技术分享等,特性开发,性能 ...

  6. 从零开始配置 vim(14)——目录管理插件

    我们在介绍vim目录管理的时候提到 vim自带一个 叫做 netrw的工具来管理目录.但是它自身的功能有限,而且样式也丑.今天我们将使用其他强大的插件来替代 netrw,增强目录管理功能 nvim-t ...

  7. 新来的一个同事,把SpringBoot参数校验玩的那叫一个优雅

    介绍 在开发现代应用程序时,数据验证是确保用户输入的正确性和应用程序数据完整性的关键方面.Spring Boot 提供了强大的数据验证机制,使开发者能够轻松地执行验证操作.本文将深入介绍 Spring ...

  8. Libevent [补档-2023-08-29]

    libevent的使用 8-1 安装 ​ 自己百度一下,安装它不是特别难,加油!!! 8-2 libevent介绍 ​ 它是一个开源库,用于处理网络和定时器等等事件.它提供了跨平台的API,能够在不同 ...

  9. json扩展之自定义序列化方式

    简介:由于json.dumps() 只能序列化Python基本数据类型,如果我们想要在数据中掺杂时间对象,或者自定义类的对象则会造成序列化数据的失败,因此json.dumps() 提供了一个属性 cl ...

  10. Redis中的key的生存时间和过期时间

    目录 1.说明 2.指令 2.1.删除和更新 3.过期时间的保存 4.计算剩余生存时间 5.过期键的删除策略 5.1.定时删除 5.2.惰性删除 5.3.定期删除 1.说明 生存时间: (Time T ...