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

posted @ 2021-06-09 15:29  goolinli  阅读(523)  评论(2)    收藏  举报