1.问题叙述

在APP开发中,Android Studio工程无法引用framework.jar带有@hide的api,但是在framework开发中需要引用到系统的@hide接口,为了在AS中开发,需要做如下配置。

2.配置步骤

  • 从android源码的如下目录中获取class.jar (这里的class.jar包含了系统中被标注了@hide的api)

out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar

  • 将framework.jar拷贝到APP的工程目录的libs目录下.

  • 配置build.gradle

1
2
3
4
5
6
dependencies {
// 一定要注释掉,否者会报3小节中的错误
//implementation fileTree(include: ['*.jar'], dir: 'libs')
......
compileOnly files('libs/framework.jar')
}
  • 在根目录build.gradle中加入,-Xbootclasspath/p:后面加入framework.jar的路径
1
2
3
4
5
6
7
8
allprojects {

gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << '-Xbootclasspath/p:app/libs/framework.jar'
}
}
}
  • 然后编译工程。系统hide API在AS中一样是红色的,但是可以正常编译通过运行。

3.编译报错

引入的framework.jar只能用compileOnly,不能用implement,否则会报如下错误,注释掉implementation也是这个原因

1
Caused by: java.lang.ArrayIndexOutOfBoundsException: 65535