赞
踩
在做android方案定制开发中,常常会碰到需要调用厂商自己定制sdk拓展的系统接口,而Android studio默认使用的是谷歌官方标准sdk,无法调用厂商私有接口,这时就需要将标准sdk中相关代码替换成厂商的,最常见的framework.jar中的代码,以此为例,将厂商提供的framework编译成framework.jar导入Android Studio,编译时替换掉标准sdk中的framework.jar,从而实现调用厂商私有的接口。
这里已海思Hi3798MV200平台Android N为例,编译出的framework.jar路径为:out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
将其重命名为hisi-android.jar拷贝到 项目libs目录下,
然后在 module 的 build.gradle 文件中添加配置:
- repositories {
- flatDir {
- dirs 'libs'
- }
- }
-
- dependencies {
- compileOnly files('libs/hisi-android.jar')
- }
-
-
- //预编译时替换掉sdk中对应的jar
- preBuild {
- doLast {
- def imlFile = file(project.name + ".iml")
- // def imlFile = file(".idea\\modules\\app\\app.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
- }
- }
- }
注意:
使用 compileOnly(默认是 implementation),compileOnly 表示 jar 包只参与编译,不会打包进去。
然后在 整个项目 的 build.gradle 文件中添加配置:
- gradle.projectsEvaluated {
- tasks.withType(JavaCompile) {
- options.compilerArgs.add('-Xbootclasspath/p:D:\\AS\\AndroidStudioProjects\\KTV\\ktv\\k900_kugou_karaok\\libs\\hisi-android.jar')
- }
- }
这个 task 在编译之前, 自动更改module.iml,将下面代码会移动最后
<orderEntry type="jdk" jdkName="Android API 30 Platform" jdkType="Android SDK" />
才能在编译时使用我们引入的 framework.jar。
至此就可以正常调用厂商私有接口而不会编译报错,但是Android Studio上还是会显示红色,这不影响使用。
参考:https://blog.csdn.net/yzwfeng/article/details/125540849
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。