Androidstudio中添加jar包
为了访问framework隐藏接口,一种办法是添加classes.jar或framework.jar。具体方法如下:
1.先到ANDROID中间层framework中拷贝或网上下载你需要的jar包,得到后,将你Androidstudio中的项目切换为project:
文章图片
2.找到app下的libs,将你下载的jar包复制粘贴进去
文章图片
4.选中volley,右键,选择add as library,放进你的module中(要是有多个module,要注意自己要放进哪个module),然后加载下你就会发现刚才在dependencies中空白出现了下图所示:
文章图片
5.右键Module选择“Open Module Settings,进入Project Structure界面,把framework.jar移到最顶上,把implementation改为compileOnly(默认Compile),点击确定:
文章图片
compileOnly表示只在编译时引用该jar包,打包的时候并不会将该jar打包进去。
这里有一点一定要特别注意:一定要将Modules下的build.gradle里的
【Androidstudio中添加jar包】implementation fileTree(include: [’*.jar’], dir: ‘libs’)
注释掉,否则还是会将framework.jar打包进apk
6、在工程的根目录下打开build.gradle,并找到allprojects,加入如下代码
allprojects {
repositories {
google()
jcenter()
}
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:app/libs/framework.jar')
}
}
7、在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,将下面代码会移动最后
通过以上步骤后,就可以引用源码的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,其它文章会详细介绍。
另外引入framework.jar后可能造成的错误:
Caused by: java.lang.ArrayIndexOutOfBoundsException: 65535
文章图片
这个异常可以理解为,总函数数量超出java虚拟机的限制. 有很多种解决方案,比如使用谷歌提供的multi进行分包处理.但是这种方法不适用我这种场景
解决方案:修改framework.jar的编译方式
将:implementation files(‘libs/framework.jar’)的引用方式更换为compileOnly files(‘libs/framework.jar’)
后者的含义为只编译不集成进apk或者jar包中, 相当于编译的时候有framework.jar环境,但是却不会将framework.jar的相关引用编译进jar或者apk中.具体做法,文章前面有,请返回去查看。
推荐阅读
- 热闹中的孤独
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 异地恋中,逐渐适应一个人到底意味着什么()
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- “成长”读书社群招募
- 2020-04-07vue中Axios的封装和API接口的管理