Android Debug Bridge 强制 RTL 选项在没有 root 的情况下应用

Android Debug Bridge force RTL option to apply without root

我了解到使用 ADB 可以使用以下命令强制显示布局指南:

adb shell setprop debug.layout true
adb shell service call activity 1599295570 # SYSPROPS_TRANSACTION

由于 SYSPROPS_TRANSACTION 代码,这允许开发人员查看布局网格。

可以找到其中的例子here

但是,如果我想更改 RTL(从右到左)之类的东西 - SYSPROPS_TRANSACTION 调用不会强制重新渲染,我怀疑是因为它需要重新启动 activity,给定旋转设备将起作用:

adb shell setprop debug.force_rtl true
adb shell settings put system user_rotation 3 # landscape
adb shell settings put system user_rotation 0 # portrait

虽然我不介意使 activity 无效,但我认为我不应该成为这个“手册”。有没有不做旋转刷新屏幕的机制?

我查看了 AOSP 并发现了这个:

    private void writeToForceRtlLayoutSetting(boolean isEnabled) {
        Settings.Global.putInt(mContext.getContentResolver(),
                Settings.Global.DEVELOPMENT_FORCE_RTL,
                isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF);
        DisplayProperties.debug_force_rtl(isEnabled);
    }

大致相当于:

    adb shell settings put global debug.force_rtl 1.0 #or 0.0 for off

但我注意到,如果我执行此操作并进行旋转,它不会改变

我一直在努力寻找合适的广播 intent 以使其正常工作,但我找不到只告诉屏幕重新呈现的广播 intent

adb shell am broadcast <SOMETHING HERE WOULD BE NICE>

我从 DarkModePreference 中取出一个页面并试图告诉它电池充电状态已经改变,但是你不能从 ADB 这样做:

    adb shell am broadcast android.os.action.POWER_SAVE_MODE_CHANGED

但也不走运 - 没有刷新发生

注意:

有趣的是 android 源代码中的 layout bounds and RTL elements are grouped,但更改后不要使用相同的行为

我注意到如果我使用

adb shell wm size

我可以读取 window 的大小,作为奖励,当设置它时,它会导致从右到左的重绘。所以现在我要做的是读取 window 大小,保存它,稍微更改一下,将其设置为更改后的值并重新设置。我的脚本看起来像:

run("adb shell settings put global debug.force_rtl 1.0")
old_size = run("adb shell wm size")
run("adb shell wm size 100x100")
run("adb shell wm size " + old_size)

而且它会强制从右到左。这有点 hacky 但它有效。