Android 调用系统隐藏函数的方法(非反射)
做Android系统定制,总要重写一些系统应用,很多地方需要用到系统的隐藏函数,很多推荐的方式是用反射,但这种方式用的多时不方便,查看也不大方便。
首先拿到对应SDK的jar包。编译完成后class.jar的路径为:
Android8.1在这个路径:
out/target/common/obj/JAVA_LIBRARIES/framework_intermediates
Android11的路径:
out/target/common/obj/JAVA_LIBRARIES/framework-minus-apex_intermediates/
将class.jar拷贝出来,放到APP的这级或上级目录。
编辑app级的build.gradle
在dependencies节点下增加:
provided files('../../syslibs/classes.jar')
上面路径是相对app下build.gradle的路径。
之后同步。
打开app下的iml文件(AS 2.3版本在app路径下,发现4.X的版本在.idea/modules/app下),在后面你会看到类似如下的东西
<orderEntry type="jdk" jdkName="Android API 29 Platform" jdkType="Android SDK" /> <orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="library" name="Gradle: ./../syslibs/classes.jar" level="project" />
你会看到classes.jar这个节点在jdk节点下面。 把classes.jar放到上面。
这样编辑器里面写隐藏函数就能自动补全,也不会变红了。 但编译还会不过。
需要更改下工程级的build.gradle
在allprojects下增加下面节点信息
allprojects {
......
.....
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:../syslibs/classes.jar')
}
}
....
}
如果没有源码想不通个反射方式使用隐藏函数。
可以下载我这边编译的不同版本的classes.jar (大部分API是不会变化的,有些api可能在高版本中增加或去掉,就找到有这个api的版本就行)
链接:https://pan.baidu.com/s/1e1CeLgsCw9Jec9YsVymPKA
提取码:1234

浙公网安备 33010602011771号