Android 7.1 竖屏转横屏全过程实现-基于高通平台

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/seek_0380/article/details/70766283
背景:

调试使用一款800x1280分辨率的屏,客户希望横屏使用(1280x800),且没有旋转过程,看起来就是横屏显示一样。修改主要涉及几个方面,第一是LK阶段的图片,第二是开机动画的显示(/system/bin/bootanimation),第三是最终进入系统后的显示,且所有的显示过程无缝连接。

涉及的库文件:

/system/lib64/libsurfaceflinger.so

/system/framework/services.jar

/system/framework/framework-res.apk

/system/bin/bootanimation

 
Android显示子系统大致流程:

主要分为两个部分,LK部分和kernel独立。主要讲kernel部分。

显示驱动加载—>创建/dev/graphic/fb0à启动servicesurfaceflinger /system/bin/surfaceflinger

à启动servicebootanim /system/bin/bootanimation—>启动zygote和system-server进入Java

service zygote /system/bin/app_process64-Xzygote /system/bin --zygote --start-system-server进入Android系统—>启动各种servicemanager –>启动activity managerà启动luncher—>等待用户启动app。

 
涉及的文件路径:

开机动画的路径:vendor\qcom\proprietary\qrdplus\Extension\apps\BootAnimation\

更换开机动画:

C:\Users\binq>adb push X:\shaomingliang\android7.1\LA.UM.5.6\vendor\qcom\proprie

tary\qrdplus\Extension\apps\BootAnimation\bootanimation.zip /system/media/

surfaceflinger文件:

frameworks\native\services\surfaceflinger\DisplayDevice.cpp

frameworks\native\services\surfaceflinger\SurfaceFlinger.cpp

加载开机动画的代码:

frameworks\base\cmds\bootanimation\bootanimation_main.cpp

frameworks\base\cmds\bootanimation\BootAnimation.cpp

JAVA层代码:

frameworks/base/core/res/res/values/config.xml

frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

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

kernel部分代码:

kernel/msm-3.18/arch/arm/boot/dts/qcom/dsi-panel-nt35521s-kd101n66-40ni-k2-800p-video.dtsi(屏的配置文件)

device/qcom/msm8937_64/system.prop 添加属性
1、  修改LK阶段图片

高通使用splash.img存储LK的开机动画,在device/qcom/common/display/logo/logo.png

添加对应分辨率的图片,重新打包编译splash.img下载进去即可。
2、  修改kernel中屏的相关配置,

使屏旋转180度,这样在后面Android部分只需要旋转90度即可,不需要旋转270.旋转270有可能会遇到Android设置界面设置字体闪屏的问题。

在配置文件中添加:

qcom,mdss-dsi-panel-orientation = "180";
3、  开机动画横屏,

修改/system/bin/bootanimation(C++)

在frameworks\base\cmds\bootanimation\BootAnimation.cpp中添加:

@@ -286,7+286,22 @@ status_t BootAnimation::readyToRun() {

     status_t status =SurfaceComposerClient::getDisplayInfo(dtoken, &dinfo);

     if (status)

         return -1;

+   //ALOGE("eliot BootAnimation::readyToRun111111\n");  

+   

+    char value[PROPERTY_VALUE_MAX];

+   property_get("persist.panel.orientation", value,"0");

+    int orient= atoi(value) / 90;

+

+    if(orient== 1 || orient == 3) {

+        inttemp = dinfo.h;

+        dinfo.h= dinfo.w;

+        dinfo.w= temp;

+    }

+    RectdestRect(dinfo.w, dinfo.h);

+   mSession->setDisplayProjection(dtoken, orient, destRect, destRect);

+   

+   //ALOGE("eliot BootAnimation::readyToRun22222222\n");

     // create the native surface

     sp<SurfaceControl> control =session()->createSurface(String8("BootAnimation"),

             dinfo.w, dinfo.h,PIXEL_FORMAT_RGB_565);

在device/qcom/msm8937_64/system.prop添加:

persist.panel.orientation=90 #bootanimation daemon会读取这个字符串进行旋转操作。

qemu.hw.mainkeys=0 #这个是虚拟按键

 
4、  JAVA层修改默认方向

frameworks/base/core/res/res/values/config.xml

修改:

---a/frameworks/base/core/res/res/values/config.xml

+++b/frameworks/base/core/res/res/values/config.xml

@@ -619,7 +619,7 @@

         settings are omitted from the system UI. In certain situations we may

         still use the accelerometer to determine the orientation, such as when

         docked if the dock is configured to enable the accelerometer. -->

-    <bool name="config_supportAutoRotation">true</bool>

+    <boolname="config_supportAutoRotation">false</bool>

    <!-- If true, the screen can be rotated via the accelerometer in all4

         rotations as the default behavior. -->

@@ -674,7 +674,7 @@

    <!-- The number of degrees to rotate the display when the keyboard isopen.

         A value of -1 means no change in orientation by default. -->

-    <integername="config_lidOpenRotation">-1</integer>

+    <integername="config_lidOpenRotation">90</integer>

    <!-- Indicate whether the lid state impacts the accessibility of

         the physical keyboard.  0 means itdoesn't, 1 means it is accessible

修改

frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

--- a/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

+++b/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

@@ -6924,7 +6924,7 @@ public classPhoneWindowManager implements WindowManagerPolicy{

                     if (preferredRotation >=0) {

                         returnpreferredRotation;

                     }

-                    return Surface.ROTATION_0;

+                    return Surface.ROTATION_90;

            }

        }

    }

修改

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

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

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

@@ -553,7 +553,7 @@ public classWindowManagerService extends IWindowManager.Stub

    /** All DisplayContents in the world, kept here */

    SparseArray<DisplayContent> mDisplayContents = newSparseArray<>(2);

-    int mRotation = 0;

+    int mRotation = 1;

    int mLastOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;

    boolean mAltOrientation = false;

@@ -3857,7 +3857,7 @@ public classWindowManagerService extends IWindowManager.Stub

        long ident = Binder.clearCallingIdentity();

        try {

            int req = getOrientationLocked();

-                       req =ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; //add

+                       //req =ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; //add

            if (req != mLastOrientation) {

                 mLastOrientation = req;

                 //send a message to Policyindicating orientation change to take

 
参考网站:http://blog.csdn.net/q1183345443/article/details/53068526
 

发布了18 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37207639/article/details/102365764