使用gradle参考Android核心应用程序中的aosp功能

使用gradle参考Android核心应用程序中的aosp功能,android,gradle,android-source,Android,Gradle,Android Source,如何使用gradle构建系统在核心android应用程序中引用aosp隐藏方法。我指的是out文件夹中的框架和其他JAR,但无法访问隐藏的API。是否有任何方法可以访问隐藏的方法 有两种方法 只要您对API27的定位没有问题(编写本文时还没有API28版本),这种方式就非常有效。您可以通过适当的代码完成和所有操作直接调用隐藏方法 注意:撰写本文时,您需要将Gradle类路径设置为3.1.4。3.2.0添加了某种完整性检查,在使用修改后的框架JAR时会破坏构建 使用反射 这并不理想,但如果您希望

如何使用gradle构建系统在核心android应用程序中引用aosp隐藏方法。我指的是out文件夹中的框架和其他JAR,但无法访问隐藏的API。是否有任何方法可以访问隐藏的方法

有两种方法

  • 只要您对API27的定位没有问题(编写本文时还没有API28版本),这种方式就非常有效。您可以通过适当的代码完成和所有操作直接调用隐藏方法

    注意:撰写本文时,您需要将Gradle类路径设置为3.1.4。3.2.0添加了某种完整性检查,在使用修改后的框架JAR时会破坏构建

  • 使用反射

    这并不理想,但如果您希望以API 28为目标,或者希望使用Gradle 3.2.0,那么它将起作用

    示例(Kotlin):


  • 有两种方法

  • 只要您对API27的定位没有问题(编写本文时还没有API28版本),这种方式就非常有效。您可以通过适当的代码完成和所有操作直接调用隐藏方法

    注意:撰写本文时,您需要将Gradle类路径设置为3.1.4。3.2.0添加了某种完整性检查,在使用修改后的框架JAR时会破坏构建

  • 使用反射

    这并不理想,但如果您希望以API 28为目标,或者希望使用Gradle 3.2.0,那么它将起作用

    示例(Kotlin):

  • val IWindowManager = Class.forName("android.view.IWindowManager")
    val IWindowManagerStub = Class.forName("android.view.IWindowManager\$Stub")
    val ServiceManager = Class.forName("android.os.ServiceManager")
    
    val binder = ServiceManager.getMethod("checkService", String::class.java).invoke(null, Context.WINDOW_SERVICE)
    val iWindowManagerInstance = IWindowManagerStub.getMethod("asInterface", Binder::class.java).invoke(null, binder)
    
    val hasNavBar = IWindowManager.getMethod("hasNavigationBar").invoke(iWindowManagerInstance) as Boolean