Android 使用系统JAR包
项目开发过程中,经常有需要到系统jar包,导入系统jar包后,发现无法正常编译通过,针对此问题,下文简述下如何导入framework.jar ,并正常使用
1、导入framework.jar ,使用compileOnly依赖
compileOnly files('libs/framework.jar')
正常情况下 已经可以使用framework.jar 中相关api,但是存在使用的API可能在系统源码中已有,所以在编译时,无法获取到framework.jar中的api,默认用的是系统api,原因如下:

可以发现在项目.idea/module_name/module_name.iml (module_name 替换成自己的)文件中 找到orderEntry 代表该模块的库依赖顺序,通过调整依赖顺序可以解决项目引用库编译默认报红问题,调整后 顺序如下

调整好依赖顺序之后,只要sync 项目 会导致orderEntry 顺序重新回到默认顺序,默认依赖系统api 而非引入framework.jar,所以不建议sync
修改好上述顺序后,AndroidStudio 不会爆红,方法与类也都可以跟进到framework源码中,但是编译时还是会报错,找不到对应的类和方法,需要在项目的build.gradle 下加入以下配置
#引入jar包路径
def externalFramework = file('../download_upgrade/provider/framework8.0.jar')
gradle.projectsEvaluated {
# 执行JavaCompile时,添加此依赖
tasks.withType(JavaCompile) {
options.compilerArgs.add("-Xbootclasspath/p:$externalFramework")
}
}
通过以上方式可以确保编译不会报错
以上即为引入系统jar包 相关问题
系统jar包api爆红问题
上面虽然解决了使用系统jar包的问题,但是调用系统jar里的api会爆红,要解决这个问题则:
在module的build.gradle中添加以下代码,此段代码的目的是为了编译时动态的修改iml文件,将androidSutdio默认的Android SDK优先级调整到最后,以使我们自己的frameworks.jar的优先级提高,这样在代码加载时则会根据优先级进行加载,可以解决代码报红的问题
apply plugin: 'com.android.application'
// place in first line of gradle.
import groovy.xml.XmlUtil
// not contained in any attribute, put it in the outermost layer
// make SDK directory's android.jar set in libs behind
preBuild {
doLast {
def imlFile = file("../.idea/modules/${project.name}/TSmartLink.LinkPermissionProxy.iml //这里是此module的iml文件路径,一定要写对
println 'Change ' + imlFile.name + ' order'
try {
def parseXml = new XmlParser().parse(imlFile)
def jdkNode = parseXml.component[1].orderEntry.find { it.'@type' == 'jdk' }
parseXml.component[1].remove(jdkNode)
def sdkString = "Android API " + android.compileSdkVersion.substring("android-".length()) + " Platform"
println 'sdkString ' + sdkString + ' '
new Node(parseXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK'])
XmlUtil.serialize(parseXml, new FileOutputStream(imlFile))
} catch (FileNotFoundException e) {
//nop, iml not found.
println e.printStackTrace()
}
}
}
android {
...
...
}
dependencies {
...
...
}
Android 使用系统JAR包的更多相关文章
- Android Studio 导入系统 jar包
1.当前需要导入系统jar包的module所对应build.gradle中添加如下依赖: provided files('libs/classes-full-debug.jar') 也可以图形化设置: ...
- Android:导入所需的系统jar包到Android studio
1. 修改对于的AIDL文件,根据编译信息获知所需的jar包. mmm /frameworks/base/ show commands > log.txt 2>&1 out/tar ...
- 如何制作Jar包并在android中调用jar包
android制作jar包: 新建android工程,然后右击,点击导出,选择导出类型为Java下的JAR file,在java file specification 中不要选择androidmani ...
- Android Studio导出Jar包
这篇博客将介绍一下如何用Android Studio导出jar包,希望能给大家带来帮助. 首先需要修改build.gradle文件,在Android Studio中会显示多个build.gradle文 ...
- Android动态载入JAR包的实现方法
有时候我们须要使用动态更新技术,简单来说就是:当我们把开发jar包发送给用户后.假设后期升级了部分代码.这时让用户的jar包自己主动更新,而不是用户主动手动地去更新的技术就是动态更新.这个须要使用的技 ...
- Android Studio 生成Jar包以及是否混淆打包等ZengYuanFinn博客等你来查看
1,Android studio生成jar包的前提是要确保生成的代码是引用的module工程: 2,在需要生成jar包的build.gradle(上图倒数第三行)中添加如下代码: //生成jar包 t ...
- Eclipse中添加Android系统jar包
这样做的好处是,可以使用Eclipse开发系统应用了,这样可以调用系统中才使用的API. 1.首先在项目中右击->属性.如图所示依次操作 2.添加User Library 3.第一次要新建Use ...
- Android实战技巧之十九:android studio导出jar包(Module)并获得手机信息
AS中并没有独立的Module 工程,可是能够在普通的Project中增加Module.所谓的Module就是我们通常所指的模块化的一个单元.并经常以jar包的形式存在.以下以一个获取手机信息的样例演 ...
- [Android] Android工程以jar包形式向第三方应用提供服务
参考: http://www.cnblogs.com/0616--ataozhijia/p/4094952.html 以API 19为例: 系统默认提供的 android.jar整体大小为: 21.8 ...
- android studio 使用jar包,arr包和怎么使用githup开源项目中的aar包或module
我这里的android studio的版本是2.2.3版本 一.现在大家都用android studio了,就有人问怎么使用jar包 其实使用jar包比较简单 直接吧jar放入工程的app目录下的li ...
随机推荐
- Python中os.walk函数说明
这个函数对于文件方面的遍历等其他方面的操作来说功能很强大,比如批量修改文件名.批量移动文件.将所有不在一个文件夹下的文件移动到同一个文件夹下等等. 这个其实很简单的,用一个示例就能明白这个函数的具体用 ...
- Linux 中通过虚拟地址获取物理地址并锁定
在 Linux 开发过程中,申请内存后,某些时候需要用物理地址传给其他外设进行写入或者读取操作,同时考虑到防止被操作系统 sawp,导致实际的物理地址发生变化,从而在操作对应的虚拟地址时无法正常运行等 ...
- 解析Sermant热插拔能力:服务运行时动态挂载JavaAgent和插件
本文分享自华为云社区<服务运行时动态挂载JavaAgent和插件--Sermant热插拔能力解析>,作者:华为云高级软件工程师 栾文飞 一.概述 Sermant是基于Java字节码增强技术 ...
- Centos7部署django+uwsgi+nginx 转载: https://www.cnblogs.com/wztshine/p/16172154.html
Centos7部署django+uwsgi+nginx Django + uwsgi + nginx on Centos7 wsgi 介绍 本小节来自 廖雪峰 wsgi 一文 一个Web应用的本质 ...
- 开源神器:自动生成随机 mock 数据测试对象
测试的痛点 大家好,我是老马. 每一位开发者大部分工作都是写代码.测试代码.修BUG. 我们有很多测试代码,总是花费大量的实践去构建一个对象. 于是就在想,能不能自动填充一个对象呢? 于是去 gith ...
- 【Unity3D】固定管线着色器一
1 前言 着色器(Shader)是渲染管线中最重要的一环,Unity3D 底层基于 OpenGL 实现,读者可以通过 渲染管线 了解 Unity3D 渲染流程. OpenGL 1.x 为固定管 ...
- 使用DeskPins工具钉住窗口
需求 我们经常一边看着PDF或视频教程,一边又打开一个文本编辑器/word/markdown编辑器在做一些笔记.问题是有时候呀需要来回切换(alt+tab)窗口,时间长了其实费时费力,这是一名工程师无 ...
- std::shared_ptr 线程安全方面的思考
一直惦记着 std::shared_ptr 线程安全的问题,看了些文章后,又怕过段时间忘记了,遂记录下来 std::shared_ptr 的线程安全问题主要有以下两种: 引用计数的加减操作是否线程安全 ...
- flutter打包android的一些配置修改(解决白屏,视频闪退)
1.打包后视频播放闪退 视频播放器选择了flutter_tencentplayer(https://github.com/qq326646683/flutter_tencentplayer) 解决:不 ...
- JavaScript之原生ajax && jQuery之ajax
ajax提供了异步访问服务器的方法,使页面无须刷新就可以更改页面内容,在实际情况中使用原生的情况较少但是原理需要掌握,一般都是使用jquey更轻量级的实现ajax但是原理是共同的. 原 ...