Android默认开机横屏

部分Android应用在系统强制横屏显示后,仍以竖屏UI显示,影响正常使用。可通过修改frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java路径来解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实际开发中,有时项目需要设备默认开机横屏,这里我们默认第一帧第二帧依旧采用竖屏资源(Android7.0)。
        frameworks/base/cmds/bootanimation/BootAnimation.cpp
        frameworks/base/core/res/res/values/config.xml
        frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
        frameworks/native/services/surfaceflinger/DisplayDevice.cpp
修改分为三部分:
        1.上层UI修改
        (1)
        --- frameworks/base/core/res/res/values/config.xml	(revision 139)
        +++ frameworks/base/core/res/res/values/config.xml	(working copy)
@@ -639,7 +639,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>
        +    <bool name="config_supportAutoRotation">false</bool>

<!-- If true, the screen can be rotated via the accelerometer in all 4
        rotations as the default behavior. -->
@@ -694,7 +694,7 @@

<!-- The number of degrees to rotate the display when the keyboard is open.
        A value of -1 means no change in orientation by default. -->
        -    <integer name="config_lidOpenRotation">-1</integer>
        +    <integer name="config_lidOpenRotation">90</integer>


        (2)
        --- frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java	(revision 116)
        +++ frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java	(working copy)
        @@ -656,7 +656,7 @@

        SparseArray<DisplayContent> mDisplayContents = new SparseArray<>(2);
        -    int mRotation = 0;
        +    int mRotation = Surface.ROTATION_90;
        int mLastOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
        boolean mAltOrientation = false;

        @@ -7109,8 +7109,8 @@

        final int oldRotation = mRotation;
        /// M: [ALPS00502835] add for tablet IPO power-off/on issue in landscape mode
        -        int rotation = (mIsUpdateIpoRotation || mIsUpdateAlarmBootRotation) ? Surface.ROTATION_0 :
        -            mPolicy.rotationForOrientationLw(mLastOrientation, mRotation);
        +        int rotation = Surface.ROTATION_90;//(mIsUpdateIpoRotation || mIsUpdateAlarmBootRotation) ? Surface.ROTATION_0 :
        +            //mPolicy.rotationForOrientationLw(mLastOrientation, mRotation);

        } else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
        if (mHasReceiveIPO) {
//                    mRotation = 0;
        mRotation = 1; //M chongqing 20180307
        mPolicy.setRotationLw(mRotation);
        Slog.v(TAG, "Re-initialize the rotation value to " + mRotation);
        mHasReceiveIPO = false;
        }

        *******************上面的可以保证开机UI是横屏的 **************************


        2: 底层(C++)修改开机动画横屏问题
        (3)
        --- frameworks/native/services/surfaceflinger/DisplayDevice.cpp	(revision 116)
        +++ frameworks/native/services/surfaceflinger/DisplayDevice.cpp	(working copy)
        @@ -211,7 +211,7 @@
        }

        // initialize the display orientation transform.
        -    setProjection(DisplayState::eOrientationDefault, mViewport, mFrame);
        +    setProjection(DisplayState::eOrientation90, mViewport, mFrame);

        (4)
        --- frameworks/base/cmds/bootanimation/BootAnimation.cpp	(revision 116)
        +++ frameworks/base/cmds/bootanimation/BootAnimation.cpp	(working copy)
        @@ -417,11 +417,11 @@
        if (status)
        return -1;
        /// M: The tablet rotation maybe 90/270 degrees, so set the lcm config for tablet
        -    SurfaceComposerClient::setDisplayProjection(dtoken, DisplayState::eOrientationDefault, Rect(dinfo.w, dinfo.h), Rect(dinfo.w, dinfo.h));
        +    SurfaceComposerClient::setDisplayProjection(dtoken, DisplayState::eOrientation90, Rect(dinfo.h, dinfo.w), Rect(dinfo.h, dinfo.w));

        // create the native surface
        sp<SurfaceControl> control = session()->createSurface(String8("BootAnimation"),
        -            dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565);
        +            dinfo.h, dinfo.w, PIXEL_FORMAT_RGB_565);

部分应用在系统强制横屏显示后,还是会以竖屏UI显示,导致应用不能正常使用。

修改路径:frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

private int getAppSpecifiedOrientation() {
        //wc 强制设置第三方App横屏显示
        if(true){
            return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
        }
        //wc 强制设置第三方App横屏显示
        int lastOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
        boolean findingBehind = false;
        boolean lastFullscreen = false;
        DisplayContent displayContent = getDefaultDisplayContentLocked();
        final ArrayList<Task> tasks = displayContent.getTasks();
        final boolean inMultiWindow = isStackVisibleLocked(DOCKED_STACK_ID)
                || isStackVisibleLocked(FREEFORM_WORKSPACE_STACK_ID);
        final boolean dockMinimized =
                getDefaultDisplayContentLocked().mDividerControllerLocked.isMinimizedDock();
        ......
        // The next app has not been requested to be visible, so we keep the current orientation
        // to prevent freezing/unfreezing the display too early unless we are in multi-window, in
        // which we don't let the app customize the orientation unless it was the home task that
        // is handled above.
        return inMultiWindow ? SCREEN_ORIENTATION_UNSPECIFIED : mLastOrientation;
    }

 

<think>我们正在处理一个Android系统级配置问题:如何将Android设备的默认启动方向设置为横屏(landscape)。根据用户提供的引用内容,特别是引用[3]中提到的修改RotationPolicy类中的NATURAL_ROTATION常量,我们可以推断这需要修改系统源代码并重新编译系统镜像。 然而,用户可能希望了解不同层面的解决方案,包括系统级修改(需要源代码和编译)和应用程序级设置(无需root或修改系统)。由于用户提到了系统启动时的默认方向,我们重点放在系统级修改上。 根据引用[3]: 在RotationPolicy.java中,将NATURAL_ROTATION从Surface.ROTATION_0(竖屏)改为Surface.ROTATION_90(横屏)可以改变默认的自然方向。 此外,引用[1]提到了WindowOrientationListener和PhoneWindowManager.updateRotation方法,这涉及到系统如何响应方向变化的机制。 因此,我们可以分两个层面来回答: 1. 系统级修改(需要重新编译系统) 2. 应用程序级设置(通过Activity属性等) 但用户明确要求的是“默认开机横屏显示”,这属于系统启动时的行为,因此主要依赖系统级修改。 步骤: 一、系统级修改(AOSP源码修改) 1. 修改RotationPolicy.java中的NATURAL_ROTATION常量 文件路径:frameworks/base/core/java/com/android/internal/policy/RotationPolicy.java 修改内容: - public static final int NATURAL_ROTATION = Surface.ROTATION_0; + public static final int NATURAL_ROTATION = Surface.ROTATION_90; 2. 修改默认的屏幕方向(在PhoneWindowManager中) 引用[1]提到了PhoneWindowManager.updateRotation方法,但具体设置默认方向的位置可能在其他地方。根据经验,我们还需要修改系统默认配置。 在frameworks/base/services/java/com/android/server/wm/WindowManagerService.java中,可能也需要调整默认方向。 另外,在frameworks/base/core/res/res/values/config.xml中,可以设置默认方向: <integer name="config_orientation">1</integer> <!-- 0:portrait, 1:landscape --> 3. 修改启动动画(bootanimation)的方向(可选) 如果希望启动动画也是横屏,需要修改bootanimation的方向。通常,bootanimation的方向由设备的方向传感器决定,但也可以强制设置。 在frameworks/base/cmds/bootanimation/BootAnimation.cpp中,可以设置: setOrientation(DisplayState::eOrientation90); 4. 重新编译系统并刷机。 二、应用程序级设置(针对自己开发的应用) 如果只是希望某个应用在开机启动时以横屏显示,可以在AndroidManifest.xml中设置Activity的screenOrientation属性: <activity android:name=".MainActivity" android:screenOrientation="landscape"> </activity> 但这种方法只影响该Activity,不会改变系统默认方向(例如,系统界面、其他应用等)。 三、通过系统属性设置(无需编译,但需要root权限) 在Android设备上,可以通过修改系统属性persist.sys.surface_rotation来设置默认旋转角度(需要root): 0: 0度(竖屏) 1: 90度(横屏) 2: 180度 3: 270度 命令: adb shell su -c setprop persist.sys.surface_rotation 1 但是,这个设置在每次重启后可能会被重置(取决于设备),所以需要确保在启动脚本中设置。 我们可以将设置命令添加到init.rc中(引用[2]提到了init.rc的配置)。具体步骤: 1. 解压设备的boot.img 2. 修改init.rc或添加一个init脚本(例如:/system/etc/init/rotation.rc) 3. 在init脚本中添加: on boot setprop persist.sys.surface_rotation 1 4. 重新打包boot.img并刷入 注意:修改init.rc需要系统签名,且不同设备可能有不同的保护机制。 四、通过Magisk模块(适用于已root的设备) 可以创建一个Magisk模块,在post-fs-data.sh中设置系统属性: setprop persist.sys.surface_rotation 1 考虑到用户可能没有AOSP编译环境,我们重点介绍第三种和第四种方法(无需编译,但需要root权限)以及应用程序级设置。但用户要求的是系统开机默认,所以系统属性方法可能更可行。 总结步骤(推荐系统属性方法): 1. 确保设备已root。 2. 使用ADB连接设备,执行: adb shell su setprop persist.sys.surface_rotation 1 3. 重启设备,检查方向是否改变。 4. 如果重启后失效,则需要通过Magisk模块或修改init脚本来持久化。 注意:不同设备厂商可能定制了旋转策略,因此上述方法可能不适用于所有设备。 根据引用[3]的修改,我们也可以看到在AOSP中直接修改常量的方法是最彻底的,但需要编译系统。 现在,我们按照要求生成回答。</think>### 配置Android设备默认开机横屏显示的方法 要实现Android设备默认开机横屏显示,需通过系统级修改实现。以下是三种主要方法,按实现难度排序: #### 一、修改系统配置文件(推荐) 在`build.prop`中添加横屏强制参数: ```shell # 强制横屏显示 persist.sys.surface_rotation=1 ``` **操作步骤**: 1. 获取root权限 2. 编辑`/system/build.prop`文件 3. 添加上述参数 4. 保存并重启设备 > 此方法通过`persist.sys.surface_rotation`属性控制默认旋转角度[^1] #### 二、修改Framework层源码(需重新编译系统) 在AOSP源码中修改默认旋转方向: ```java // 文件路径: frameworks/base/core/java/com/android/internal/policy/RotationPolicy.java public final class RotationPolicy { // 修改默认方向为横屏 public static final int NATURAL_ROTATION = Surface.ROTATION_90; } ``` 同时修改资源配置: ```xml <!-- 文件路径: frameworks/base/core/res/res/values/config.xml --> <integer name="config_orientation">1</integer> <!-- 1=landscape --> ``` **编译步骤**: 1. 修改源码 2. 执行`make -j8`重新编译 3. 刷入修改后的系统镜像 #### 三、通过WindowManager强制设置(需系统权限) 在系统服务中修改屏幕方向: ```java // 在PhoneWindowManager中设置默认方向 public void updateRotation(boolean alwaysSendConfiguration) { // 强制设置为横屏 mRotation = Surface.ROTATION_90; mWindowManager.updateRotation(false, true); } ``` > 此方法需修改`WindowManagerService`相关逻辑[^1] #### 四、应用层临时方案(无需root) 在应用清单中设置Activity方向: ```xml <activity android:name=".MainActivity" android:screenOrientation="landscape" android:configChanges="orientation|screenSize"> </activity> ``` > 此方法仅影响单个应用,不影响系统全局设置 --- ### 验证方法 1. **检查当前旋转状态**: ```shell adb shell dumpsys display | grep mRotation ``` 2. **测试重力感应**: ```shell adb shell dumpsys sensorservice ``` ### 注意事项 1. 系统级修改需要设备解锁Bootloader 2. 不同Android版本实现细节可能不同(特别是Android 10+) 3. 横屏启动可能影响启动动画方向 4. 某些设备制造商可能禁用此功能 > **重要提示**:修改系统文件存在风险,建议在测试设备操作。车载或工业设备建议使用定制固件实现永久横屏[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值