反射

2017-06-28 16 views
4

得到“指针” NavigationBarView.java我试图使用旧的Android操作系统在嵌入式系统上编程更改导航栏上的几件事情。我缩小到处理下面导航栏的类。反射

https://android.googlesource.com/platform/frameworks/base/+/7d8abae/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java

对象似乎在这里宣布:

https://android.googlesource.com/platform/frameworks/base/+/598a7aedfb6b77fc98bace9f420968a6f3ed637e/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java

线238

私人NavigationBarView mNavigationBarView = NULL;

有没有办法以编程方式获取指向此对象的指针?我唯一能找到的就是获得更大容器的代码,就像当你以编程方式隐藏导航栏时一样。

 View decorView = getWindow().getDecorView(); 
     int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; 
     decorView.setSystemUiVisibility(uiOptions); 

但是,这还不够。我想深入了解导航栏的绘图。

任何线索都不胜感激。

谢谢。

P.S.由于它是一个嵌入式系统,因此如果我更改操作系统,那么它就不会出现在Google商店中。

+0

你尝试(https://stackoverflow.com/questions/1196192/how-do-i-read-a-private-field-in-java)? – VanDir

+0

我知道如何通过反思来获得东西,这不是问题。我想通过反射来获得Navbar指针,这是主要问题。感谢您阅读所有情况。 – gmmo

回答

1

有没有办法通过反射来获得mNavigationBarView对象PhoneStatusBar。 此对象生活在进程com.android.systemui中,您自己的进程无法使用反射访问另一个进程的对象。

一种可能的方法是使用Xposed框架。通过PhoneStatusBar方法中的一些钩子,您可以访问mNavigationBarView对象。

已经有一些模块修改的导航栏,如:Xperia/AOSP NavBar Buttons。你可以按照这个教程modify SystemUI's clock style using Xposed framework

+0

如果不能完成,他们怎么做?我相信这是可能的,只是重新构建并导入正确的.jar文件。 – gmmo

+0

@gmmo不可能通过反射。它可以通过使用Xposed框架,它的钩子在SystemUI的进程中运行,所以你可以访问mNavigationBarView对象并做你想做的事情。另一种方法是反编译SystemUI.apk并修改smali文件(反编译的源代码文件),然后使用平台密钥重新编译并签署apk。你可能没有密钥,所以你需要反编译和修改services.jar来信任你自己的密钥。这很复杂但可能,我之前做过这样的事情。 xposed框架和修改apk都需要一个根植设备。 – wrkwrk