天天看點

android源代碼framework取消apk強制翻轉

我本人是做驅動的,由于公司android方面隻有我一個人,是以framework也是我的活,痛苦啊。

公司産品沒有任何sensor預設橫屏,好多APK運作時都會強制翻轉成豎屏。各種百度查資料,各種嘗試,雖然可以強制橫屏,但是不全屏,還是會先豎屏瞬間切橫屏,而且下面的虛拟按鍵少了一個,位置也不對,退出APK時還是會先豎屏瞬間切橫屏。今天根據自己的了解,抱着試試的态度,居然改好了,非常簡單,總結如下(強制橫屏後會有拉伸現象,由于我司要求不大,是以我沒有繼續深入研究了):

一、網上很多資料都是說修改frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java中的函數rotationForOrientationLw();強制橫屏或豎屏,但是這樣修改後的後果就是我上面所說的。然後我就想着如何從源頭修改。該函數調用logcat如下:

android源代碼framework取消apk強制翻轉

二、framework目錄下grep rotationForOrientationLw發現調用此函數的是frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java中的函數updateRotationUncheckedLocked()

android源代碼framework取消apk強制翻轉

由函數rotationForOrientationLw()可知,當其兩個參數相等時即保持原螢幕角度,由一中logcat知參數1=1,參數2=0;

那麼跟蹤看看mForceAppOrientation是如何指派的。

frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

android源代碼framework取消apk強制翻轉

通過函數getOrientationFromAppTokensLocked()從APK中擷取orientation資訊然後指派給mForceAppOrientation。

跟到這裡,我的想法就是強制req = 0;看看是什麼現象,做驅動的對framework了解不深,隻能試試看結果了。

結果就是驚喜。