反射

2017-06-28 64 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