dantmnf / PseudoDCDimming

Mozilla Public License 2.0
29 stars 3 forks source link

OneUI 6.1 compatibility - NoSuchMethod - setBacklight changed sig #11

Open mio-19 opened 3 months ago

mio-19 commented 3 months ago

Screenshot_20240331_205849_LSPosed Screenshot_20240331_205842_LSPosed Screenshot_20240331_205836_LSPosed

mio-19 commented 3 months ago
20:55:56.584 29971 29971 I LSPosed-Bridge: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.preference.Preference.setEnabled(boolean)' on a null object reference
03-31 20:55:56.584 29971 29971 I LSPosed-Bridge:        at xyz.cirno.pseudodcdimming.SettingsActivity$SettingsFragment.onResume(SettingsActivity.java:243)
03-31 20:55:56.584 29971 29971 I LSPosed-Bridge:        at android.app.Fragment.performResume(Fragment.java:2556)
03-31 20:55:56.584 29971 29971 I LSPosed-Bridge:        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1346)                                                                                                           03-31 20:55:56.584 29971 29971 I LSPosed-Bridge:        at android.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1581)                                                                                           03-31 20:55:56.584 29971 29971 I LSPosed-Bridge:        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1642)                                                                                                           03-31 20:55:56.584 29971 29971 I LSPosed-Bridge:        at android.app.FragmentManagerImpl.dispatchMoveToState(FragmentManager.java:3052)                                                                                                   03-31 20:55:56.584 29971 29971 I LSPosed-Bridge:        at android.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:3014)                                                                                                        03-31 20:55:56.584 29971 29971 I LSPosed-Bridge:        at android.app.FragmentController.dispatchResume(FragmentController.java:207)                                                                                                       03-31 20:55:56.584 29971 29971 I LSPosed-Bridge:        at android.app.Activity.performResume(Activity.java:9158)     03-31 20:55:56.584 29971 29971 I LSPosed-Bridge:        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:5399)                                                                                                       03-31 20:55:56.584 29971 29971 I LSPosed-Bridge:        ... 13 more                                                   03-31 20:55:56.584 29971 29971 E AndroidRuntime: FATAL EXCEPTION: main                                                03-31 20:55:56.584 29971 29971 E AndroidRuntime: Process: xyz.cirno.pseudodcdimming, PID: 29971                       03-31 20:55:56.584 29971 29971 E AndroidRuntime: java.lang.RuntimeException: Unable to resume activity {xyz.cirno.pseudodcdimming/xyz.cirno.pseudodcdimming.SettingsActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.preference.Preference.setEnabled(boolean)' on a null object reference
03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:5427)                                                                                                       03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:5508)
03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:57)
03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:180)
03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:98)                                                                                           03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2685)
03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:106)
03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.os.Looper.loopOnce(Looper.java:230)                03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:319)                    03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:8919)
03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)             03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578)                                                                                                03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)
03-31 20:55:56.584 29971 29971 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.preference.Preference.setEnabled(boolean)' on a null object reference                            03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at xyz.cirno.pseudodcdimming.SettingsActivity$SettingsFragment.onResume(SettingsActivity.java:243)
03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.app.Fragment.performResume(Fragment.java:2556)     03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1346)
03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1581)
03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1642)
03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.app.FragmentManagerImpl.dispatchMoveToState(FragmentManager.java:3052)
03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:3014)
03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.app.FragmentController.dispatchResume(FragmentController.java:207)                                                                                                       03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.app.Activity.performResume(Activity.java:9158)
03-31 20:55:56.584 29971 29971 E AndroidRuntime:        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:5399)
03-31 20:55:56.584 29971 29971 E AndroidRuntime:        ... 13 more                                                   03-31 20:55:56.585  2594  7949 I am_crash: [29971,0,xyz.cirno.pseudodcdimming,550026820,java.lang.NullPointerException,Attempt to invoke virtual method 'void android.preference.Preference.setEnabled(boolean)' on a null object reference,SettingsActivity.java,243,0]                                                                                          03-31 20:55:56.586  2594 29996 I DropBoxManagerService: add tag=data_app_crash isTagEnabled=true flags=0x2
03-31 20:55:56.586  2594  7949 D Debug   : low && ship && 3rdparty app crash, do not dump
03-31 20:55:56.586  2594 29997 W ActivityManager: crash : xyz.cirno.pseudodcdimming,10386                             03-31 20:55:56.586  2594  7949 W ActivityTaskManager:   Force finishing activity xyz.cirno.pseudodcdimming/.SettingsActivity                                                                                                                03-31 20:55:56.586  2594  7949 V Transition:  allReady query: used=true, override=false, defer=0, states=Display{#0 state=ON size=1440x3088 ROTATION_0}:false                                                                               03-31 20:55:56.587  2594  7949 I wm_finish_activity: [0,102163533,344,xyz.cirno.pseudodcdimming/.SettingsActivity,force-crash]
mio-19 commented 3 months ago

maybe related to this commit? https://github.com/dantmnf/PseudoDCDimming/commit/8de6c9b1e69d36293842980bce450644e0b31bcf

mio-19 commented 3 months ago

我在https://github.com/dantmnf/PseudoDCDimming/commit/3ed2bdf812a1a3acc131edf1eedb02c3daa5bf24 上revert了https://github.com/dantmnf/PseudoDCDimming/commit/8de6c9b1e69d36293842980bce450644e0b31bcf 现在至少可以跑起来

mio-19 commented 3 months ago

我在3ed2bdf 上revert了8de6c9b 现在至少可以跑起来

跑起来显示service not running

mio-19 commented 3 months ago

真實的錯誤在這裡 Screenshot_20240401_140447_LSPosed

mio-19 commented 3 months ago

[ 2024-04-01T14:02:46.477     1000:  2584:  2584 E/LSPosed-Bridge  ] java.lang.NoSuchMethodError: com.android.server.display.LocalDisplayAdapter$BacklightAdapter#setBacklight(float,float,float,float)#exact
    at de.robv.android.xposed.XposedHelpers.lambda$findMethodExact$3(Unknown Source:6)
    at de.robv.android.xposed.XposedHelpers.h(Unknown Source:0)
    at de.robv.android.xposed.c.get(Unknown Source:13)
    at java.util.Optional.orElseThrow(Optional.java:404)
    at de.robv.android.xposed.XposedHelpers.findMethodExact(SourceFile:1)
    at xyz.cirno.pseudodcdimming.xposed.XposedInit.handleLoadSystemServer(XposedInit.java:50)
    at xyz.cirno.pseudodcdimming.xposed.XposedInit.handleLoadPackage(XposedInit.java:31)
    at de.robv.android.xposed.IXposedHookLoadPackage$Wrapper.handleLoadPackage(Unknown Source:2)
    at de.robv.android.xposed.callbacks.XC_LoadPackage.call(Unknown Source:6)
    at de.robv.android.xposed.callbacks.XCallback.callAll(Unknown Source:26)
    at H0.a(Unknown Source:30)
    at java.lang.reflect.Method.invoke(Native Method)
    at J.callback(Unknown Source:123)
    at LSPHooker_.startBootstrapServices(Unknown Source:11)
    at com.android.server.SystemServer.run(SystemServer.java:1292)
    at com.android.server.SystemServer.main(SystemServer.java:1007)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
mio-19 commented 3 months ago

decompiled code:


        public void setBacklight(float f, float f2, float f3, float f4, int i, int i2) {
            float f5 = f;
            float f6 = f3;
            int i3 = i;
            int i4 = i2;
            if (!this.mUseSurfaceControlBrightness && !this.mForceSurfaceControl) {
                LogicalLight logicalLight = this.mBacklight;
                if (logicalLight != null) {
                    logicalLight.setBrightness(f6);
                }
            } else if (BrightnessSynchronizer.floatEquals(f, Float.NaN)) {
                this.mSurfaceControlProxy.setDisplayBrightness(this.mDisplayToken, f6);
            } else {
                Slog.d("LocalDisplayAdapter", "surface lcd : " + PowerManagerUtil.brightnessToString(i3, f6) + ", " + PowerManagerUtil.brightnessToString(i4, f) + ", " + PowerManagerUtil.displayTypeToString(this.mIsFirstDisplay) + " +");
                this.mSurfaceControlProxy.setDisplayBrightness(this.mDisplayToken, f, f2, f3, f4);
                Slog.d("LocalDisplayAdapter", "surface lcd : " + PowerManagerUtil.brightnessToString(i3, f6) + ", " + PowerManagerUtil.brightnessToString(i4, f) + ", " + PowerManagerUtil.displayTypeToString(this.mIsFirstDisplay) + " -");
            }
        }

classes2.dex.zip

mio-19 commented 3 months ago

LocalDisplayAdapter$LocalDisplayDevice$1


    public final void setDisplayBrightness(final float n, final float n2) {
        if (!Float.isNaN(n)) {
            if (!Float.isNaN(n2)) {
                LocalDisplayAdapter$LocalDisplayDevice.-$$Nest$fputmLastBrightnessRequestedTime(this.this$1, SystemClock.uptimeMillis());
                final StringBuilder sb = new StringBuilder();
                sb.append("setDisplayBrightness(id=");
                sb.append(this.val$physicalDisplayId);
                sb.append(", brightnessState=");
                sb.append(n);
                sb.append(", sdrBrightnessState=");
                sb.append(n2);
                sb.append(")");
                Trace.traceBegin(131072L, sb.toString());
                try {
                    final float brightnessToBacklight = this.brightnessToBacklight(n);
                    final float brightnessToBacklight2 = this.brightnessToBacklight(n2);
                    final float backlightToNits = this.backlightToNits(brightnessToBacklight);
                    final float backlightToNits2 = this.backlightToNits(brightnessToBacklight2);
                    LocalDisplayAdapter$LocalDisplayDevice.-$$Nest$fgetmBacklightAdapter(this.this$1).setBacklight(brightnessToBacklight2, backlightToNits2, brightnessToBacklight, backlightToNits, BrightnessSynchronizer.brightnessFloatToInt(n), BrightnessSynchronizer.brightnessFloatToInt(n2));
                    Trace.traceCounter(131072L, "ScreenBrightness", BrightnessSynchronizer.brightnessFloatToInt(n));
                    Trace.traceCounter(131072L, "SdrScreenBrightness", BrightnessSynchronizer.brightnessFloatToInt(n2));
                    if (this.this$1.getDisplayDeviceConfig().hasSdrToHdrRatioSpline()) {
                        this.handleHdrSdrNitsChanged(backlightToNits, backlightToNits2);
                    }
                }
                finally {
                    Trace.traceEnd(131072L);
                }
            }
        }
    }
mio-19 commented 3 months ago

classes.zip Github is limiting max file size. This archive contains classes.dex classes2.dex classes3.dex

mio-19 commented 3 months ago

    public static String brightnessToString(int i, float f) {
        return String.format(Locale.US, "%d(%.3f)", new Object[]{Integer.valueOf(i), Float.valueOf(f)});
    }

Since the added two parameters are not really used, 我试试填两个0

mio-19 commented 3 months ago

另一个method


[ 2024-04-01T15:28:24.533     1000:  2270:  2270 E/LSPosed-Bridge  ] java.lang.NoSuchMethodError: com.android.server.display.LocalDisplayAdapter$BacklightAdapter(android.os.IBinder,boolean,com.android.server.display.LocalDisplayAdapter$SurfaceControlProxy)#exact
    at de.robv.android.xposed.XposedHelpers.lambda$findConstructorExact$7(Unknown Source:6)
    at de.robv.android.xposed.XposedHelpers.i(Unknown Source:0)
    at de.robv.android.xposed.b.get(Unknown Source:10)
    at java.util.Optional.orElseThrow(Optional.java:404)
    at de.robv.android.xposed.XposedHelpers.findConstructorExact(SourceFile:1)
    at de.robv.android.xposed.XposedHelpers.findAndHookConstructor(SourceFile:1)
    at xyz.cirno.pseudodcdimming.xposed.XposedInit.handleLoadSystemServer(XposedInit.java:79)
    at xyz.cirno.pseudodcdimming.xposed.XposedInit.handleLoadPackage(XposedInit.java:31)
    at de.robv.android.xposed.IXposedHookLoadPackage$Wrapper.handleLoadPackage(Unknown Source:2)
    at de.robv.android.xposed.callbacks.XC_LoadPackage.call(Unknown Source:6)
    at de.robv.android.xposed.callbacks.XCallback.callAll(Unknown Source:26)
    at H0.a(Unknown Source:30)
    at java.lang.reflect.Method.invoke(Native Method)
    at J.callback(Unknown Source:123)
    at LSPHooker_.startBootstrapServices(Unknown Source:11)
    at com.android.server.SystemServer.run(SystemServer.java:1292)
    at com.android.server.SystemServer.main(SystemServer.java:1007)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
mio-19 commented 3 months ago

contructor多了一个参数


    public class BacklightAdapter {
        public final LogicalLight mBacklight;
        public final IBinder mDisplayToken;
        public boolean mForceSurfaceControl = false;
        public final boolean mIsFirstDisplay;
        public final SurfaceControlProxy mSurfaceControlProxy;
        public final boolean mUseSurfaceControlBrightness;

        public BacklightAdapter(IBinder iBinder, boolean z, SurfaceControlProxy surfaceControlProxy, long j) {
            this.mDisplayToken = iBinder;
            this.mSurfaceControlProxy = surfaceControlProxy;
            boolean displayBrightnessSupport = surfaceControlProxy.getDisplayBrightnessSupport(iBinder);
            this.mUseSurfaceControlBrightness = displayBrightnessSupport;
            this.mIsFirstDisplay = z;
            SurfaceControl.StaticDisplayInfo staticDisplayInfo = surfaceControlProxy.getStaticDisplayInfo(j);
            boolean z2 = staticDisplayInfo != null && staticDisplayInfo.isInternal;
            Class<LightsManager> cls = LightsManager.class;
            if (!displayBrightnessSupport && z) {
                this.mBacklight = ((LightsManager) LocalServices.getService(cls)).getLight(0);
            } else if (displayBrightnessSupport || !z2) {
                this.mBacklight = null;
            } else {
                this.mBacklight = ((LightsManager) LocalServices.getService(cls)).getLight(9);
            }
        }

        public void setBacklight(float f, float f2, float f3, float f4, int i, int i2) {
            float f5 = f;
            float f6 = f3;
            int i3 = i;
            int i4 = i2;
            if (!this.mUseSurfaceControlBrightness && !this.mForceSurfaceControl) {
                LogicalLight logicalLight = this.mBacklight;
                if (logicalLight != null) {
                    logicalLight.setBrightness(f6);
                }
            } else if (BrightnessSynchronizer.floatEquals(f, Float.NaN)) {
                this.mSurfaceControlProxy.setDisplayBrightness(this.mDisplayToken, f6);
            } else {
                Slog.d("LocalDisplayAdapter", "surface lcd : " + PowerManagerUtil.brightnessToString(i3, f6) + ", " + PowerManagerUtil.brightnessToString(i4, f) + ", " + PowerManagerUtil.displayTypeToString(this.mIsFirstDisplay) + " +");
                this.mSurfaceControlProxy.setDisplayBrightness(this.mDisplayToken, f, f2, f3, f4);
                Slog.d("LocalDisplayAdapter", "surface lcd : " + PowerManagerUtil.brightnessToString(i3, f6) + ", " + PowerManagerUtil.brightnessToString(i4, f) + ", " + PowerManagerUtil.displayTypeToString(this.mIsFirstDisplay) + " -");
            }
        }

        public void setForceSurfaceControl(boolean z) {
            this.mForceSurfaceControl = z;
        }

        public String toString() {
            return "BacklightAdapter [useSurfaceControl=" + this.mUseSurfaceControlBrightness + " (force_anyway? " + this.mForceSurfaceControl + "), backlight=" + this.mBacklight + "]";
        }
    }
dantmnf commented 3 months ago

好,没救了()

mio-19 commented 3 months ago

好,没救了()

救成功了 image 加上long.class以后可以进设置界面了

mio-19 commented 3 months ago

看起来工作正常 还得拿一个能调曝光时间的设备验证一下


diff --git a/app/src/main/java/xyz/cirno/pseudodcdimming/xposed/BacklightAdapterProxy.java b/app/src/main/java/xyz/cirno/pseudodcdimming/xposed/BacklightAdapterProxy.java
index 445f014..ff5feeb 100644
--- a/app/src/main/java/xyz/cirno/pseudodcdimming/xposed/BacklightAdapterProxy.java
+++ b/app/src/main/java/xyz/cirno/pseudodcdimming/xposed/BacklightAdapterProxy.java
@@ -13,7 +13,7 @@ public class BacklightAdapterProxy {

     public void setBacklight(float sdrBacklight, float sdrNits, float backlight, float nits) {
         try {
-            setBacklightMethod.invoke(adapter, sdrBacklight, sdrNits, backlight, nits);
+            setBacklightMethod.invoke(adapter, sdrBacklight, sdrNits, backlight, nits, 0, 0);^M
         } catch (Exception e) {
             // ignore
         }
diff --git a/app/src/main/java/xyz/cirno/pseudodcdimming/xposed/XposedInit.java b/app/src/main/java/xyz/cirno/pseudodcdimming/xposed/XposedInit.java
index dc81c10..266f71a 100644
--- a/app/src/main/java/xyz/cirno/pseudodcdimming/xposed/XposedInit.java
+++ b/app/src/main/java/xyz/cirno/pseudodcdimming/xposed/XposedInit.java
@@ -53,7 +53,8 @@ public class XposedInit implements IXposedHookLoadPackage {
             float.class,  // sdrBacklight
             float.class,  // sdrNits
             float.class,  // backlight
-            float.class   // nits
+            float.class,   // nits^M
+                int.class, int.class^M
         );

         XposedHelpers.findAndHookConstructor(localDisplayDevice,
@@ -79,6 +80,7 @@ public class XposedInit implements IXposedHookLoadPackage {
                 IBinder.class,
                 boolean.class,
                 XposedHelpers.findClass("com.android.server.display.LocalDisplayAdapter$SurfaceControlProxy", classLoader),
+                long.class,^M
                 new XC_MethodHook() {
                     @Override
                     protected void afterHookedMethod(MethodHookParam param) throws Throwable {
@@ -109,6 +111,8 @@ public class XposedInit implements IXposedHookLoadPackage {
                 final var requestSdrNits = (float)param.args[1];
                 final var requestBacklight = (float)param.args[2];
                 final var requestNits = (float)param.args[3];
+                final var v5 = (int)param.args[4];^M
+                final var v6 = (int)param.args[5];^M

                 var request = new BacklightRequest(requestSdrBacklight, requestSdrNits, requestBacklight, requestNits);
mio-19 commented 3 months ago

可以用,开启Samsung Dex时有bug,如果要加进主线还得有一个机型判断

TEACAET commented 2 months ago

佬能分享下你修改后的apk嘛,我想在我的5.1.1上试试。没搞过java开发自己编译还要学半天(对不起我是懒狗QAQ)

mio-19 commented 2 months ago

佬能分享下你修改后的apk嘛,我想在我的5.1.1上试试。没搞过java开发自己编译还要学半天(对不起我是懒狗QAQ)

我记得另一个手机OneUI5.1的时候不是这样的 估计可能用不了

TEACAET commented 2 months ago

我5.1能用,5.1.1不能。

mio-19 commented 2 months ago

DCDimming20240401-ver4.zip

我5.1能用,5.1.1不能。

TEACAET commented 2 months ago

谢谢你,可惜的是确实5.1.1上用不了