使用@hide 的api,可以通过反射,但反射速度慢,且使用不方便。
@hide的api,在编译的时候有问题,如果能编译成功,是可以调用的。那么问题来了,如何编译成功?
可以修改android源码,去掉@hide,编译生成该模块的framework.jar。Eclipse中直接引入该jar包在android.jar前即可。AndroidStudio就比较麻烦,需要做两步。
1.引入jar包,这个网上有无数方法,不表。注意设置compile->provide,gradle文件如下:
1 |
provided files('lib/android_packageManager.jar') |
原因就是我们只需要编译成功,不需要把这个包打到系统。
这时候在系统自动生成的iml文件中,可以看到一排orderEntry标签 <orderEntry>,也就是我们引用的所有jar包信息,把framework的jar包放到orderEntry的第一位,也就是
1 |
<orderEntry type="jdk" jdkName="Android API 22 Platform" jdkType="Android SDK" /> |
前面,这时候IDE就不报错了。
不过只是表象,方便我们写代码自动补全而已。而且iml文件是自动生成的,每次重启IDE都要重新改一下。
2.真正的编译需要在工程的gradle中增加编译选项
找到
1 2 3 4 5 6 7 |
allprojects { repositories { jcenter() } } |
在repositores同级增加
1 2 3 4 5 |
gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs.add('-Xbootclasspath/p:/lib/android_packageManager.jar') } } |
Xbootclasspath/p:是Java编译的寻址优先设置,先找缺省路径还是全路径
1 |
Xbootclasspath/p: |
不确定路径怎么填的,可以使用绝对路径,如
1 |
Xbootclasspath/p:D://mProject/app/lib/android_packageManager.jar') |
编译通过
Tips:
1.有时候@hide的api编译过了,其他地方又报错。查看一下报错的api,看看是不是对android版本有要求,framework.jar编译最好用较新的编译环境。
2.不要做过多的其他尝试,这两步绝对可以解决问题。
hi 你好:
我现在需要使用系统framework.jar里的@hide方法,但是在android studio上开发的时候,使用这个方法的时候提示没有.
我按照你说的方法还是报错.不知道还有哪里需要注意.
你什么时候方便,可以知道下吗,谢谢!
参考 Android Studio中使用SystemProperties
使用android studio 2.3.3, gradle3.3版本上这样操作不起作用,还是build失败,是怎么回事呢?
现在项目中直接把整个framework.jar,以provider的方式引入了。但是AS会提前加载SDK的jar,导致还是很多hide的接口无法访问。
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:/lib/android_packageManager.jar')
}
}
也不管用。
hide的接口是没办法访问的,还是直接反射调用好了!
感谢,利用你说的这几个步骤已经解决hide无法调用的问题,编译顺利通过,万分感谢!