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下面
由于我编译的是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
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,下篇文章会详细介绍。
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2018-07-06 android framework-下载Android系统源代码
2017-07-06 C++语言基础(25)-C++格式化输出
2017-07-06 C++语言基础(24)-四种类型转换运算符(static_cast、dynamic_cast、const_cast和reinterpret_cast)
2017-07-06 C++语言基础(23)-拷贝构造函数