Android Studio 导入自己编译的 framework jar
网上的文章大多是 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 工程
将framework.jar放在Module的libs下面

添加对 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')
- 在 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())
}
}
- 在 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的更多相关文章
- Android Studio 导入系统 jar包
1.当前需要导入系统jar包的module所对应build.gradle中添加如下依赖: provided files('libs/classes-full-debug.jar') 也可以图形化设置: ...
- Android Studio 导入 Android 系统模块并编译和调试
FAQ: AS导入系统模块源码,并且能够编译调试,正常查看java doc ???? Android AOSP基础(五)Android Studio调试系统源码的三种方式http://liuwangs ...
- android studio导入 so ,jar 文件。
环境为: Android Studio 1.0.2 如果是jar文件的话,请直接拷贝jar文件到项目的libs文件夹下,然后运行:Sync Project with Gradle Files.如下图2 ...
- Android Studio导入第三方jar包或依赖工程的方法
Android Studio导入第三方jar包或依赖工程的方法 一 导入jar包的方法 1.打开自己的工程,将需要导入的jar包copy到libs文件夹下 2.在导入的jar包处单击菜单 Add ...
- Android Studio导入Android 4.4.4r1的源码
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/70339471 一.环境配置 1.ubuntu 14.04.5 x64bit 2.j ...
- Android Studio导入第三方类库的方法
Android Studio导入第三方类库的方法 本人也刚刚开始尝试做android app的开发,听说android studio是Google支持的android 应用开发工具,所以想应该肯定比E ...
- Android Studio 导入外部lib文件
Android Studio 导入外部lib文件 1.将jar包放入Module里的lib文件夹中.(自己创建lib文件夹) 2.在project选中jar包点击右键"Add as li ...
- Android Studio导入Fresco
大概一周之前,Facebook开源了专为Android系统定制的图片下载缓存工具,当天该消息就上了各大技术论坛网站的头条,也成为了各个技术群里讨论的最主要的话题.也就在当天stay4it的QQ群里面就 ...
- Android Studio导入项目
原文:http://ask.android-studio.org/?/article/21 本篇教程中使用到的Android Studio版本为1.0, Eclipse ADT版本23.0.4.请尝试 ...
- android studio上代码编译调试中遇到的一些异常记录
下面是记录的在平时代码编写或编译时的一些异常,答案有自己摸索出来的,也有参考其他程序猿朋友的,参考文章过多,就不一一贴出来了. ① E/JavaBinder: !!! FAILED BINDER TR ...
随机推荐
- [转帖]关于iostat的问题,svctm数据不可信
使用FIO对磁盘进行压力测试,使用1个线程对磁盘进行随机读,设置单次read的数据块分别为128KB和1M,数据如下: (1)单次IO数据块为128KB (2)单次IO数据块为1M 从上面的数据可以看 ...
- ELK搭建简单说明
ELK搭建简单说明 简单说明 周天陪孩子学习,自己简单研究了下如何处理 不是很系统,仅是能够展示部分文件的日志. 需要有很多坑需要进行填充. 搭建模式 自己采取rpm包方式进行搭建 183 机器上面安 ...
- silce的扩容,截取,使用规范总结
切片 什么是slice slice的创建使用 slice使用的一点规范 slice和数组的区别 slice的append是如何发生的 复制Slice和Map注意事项 接收 Slice 和 Map 作为 ...
- SqlSugar的Repository
1.仓储说明 仓储可以让你的方法更加的规范,需要什么方法都封装到仓储中,下次就能重复使用,并且能很好的和你业务拆分开 这种设计模式简单粗暴用起来也方便 ,文章下面有可以运行的DEMO 2.仓储方法 仓 ...
- 4.1 Windows驱动开发:内核中进程与句柄互转
在内核开发中,经常需要进行进程和句柄之间的互相转换.进程通常由一个唯一的进程标识符(PID)来标识,而句柄是指对内核对象的引用.在Windows内核中,EProcess结构表示一个进程,而HANDLE ...
- 驱动开发:WinDBG 枚举SSDT以及SSSDT地址
在前面的博文<驱动开发:内核读取SSDT表基址>中已经教大家如何寻找SSDT表基地址了,今天给大家分享两个适用于WinDBG调试器上的脚本文件,该脚本文件可以很好的枚举出当前系统内的SSD ...
- Web 3.0 - 圈里的百科
Web3.0只是由业内人员制造出来的概念词语,最常见的解释是,网站内的信息可以直接和其他网站相关信息进行交互,能通过第三方信息平台同时对多家网站的信息进行整合使用:用户在互联网上拥有自己的数据,并能在 ...
- 【动态内存】C语言动态内存管理及使用总结篇【初学者保姆级福利】
动态内存管理及应用总结篇 一篇博客学好动态内存的管理和使用 这篇博客干货满满,建议收藏再看哦!! 求个赞求个赞求个赞求个赞 谢谢 先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点 ...
- Leetcode刷题第一天-贪心
455-分饼干 链接:455. 分发饼干 - 力扣(LeetCode) 优先使用最小饼干满足最小胃口,一个娃只能分一个饼干T_T不能加 1 class Solution: 2 def findCont ...
- 记录一则ADG备库报错ORA-29771的案例
有客户找到我这边咨询,说他们的一套核心ADG库在业务高峰期报错,因为业务做了读写分离,其备库也实际承担读业务,所以备库故障也会对业务产生影响. 这里也要提醒大家,做读写分离,如果读库出现故障的情况,要 ...