Chainfire / liveboot

Sources for the LiveBoot app for rooted Android devices
Other
213 stars 24 forks source link

Android 14 Support #10

Closed DavidBerdik closed 6 months ago

DavidBerdik commented 12 months ago

Looks like Google broke something again with the release of Android 14!

DavidBerdik commented 11 months ago

I spent some time looking into this yesterday. As was the case when the app needed updated to support Android 12 (#4), the main issue is actually not the app itself, but the libcfsurface library that it relies on.

To provide some context, the two methods that seem to be the start of the issue are getPhysicalDisplayIds() and getPhysicalDisplayToken(), which the libcfsurface code uses here for API levels 29 and higher.

I managed to track down the new locations for the getPhysicalDisplayIds() and getPhysicalDisplayToken() methods. They are located here in com.android.server.display.LocalDisplayAdapter. I tried accessing these methods, but my attempt to access the class using Class.forName("com.android.server.display.LocalDisplayAdapter"); resulted in a ClassNotFoundException. I tried to do some research on it and came across this post on StackOverflow. One of the answers to the question implies that reflection to anything under com.android.server.* will magically work if the app is a system app. I tried using the App Systemizer Magisk module to install my build of LiveBoot as a system app, however, the reflection attempt still did not work, so I decided to try something else.

My second attempt involved using the same reflection approach that scrcpy uses to get information about the device's display. The relevant portions of their code that I looked at are here and here. Based on what I saw of their implementation, I made some changes which are available here on my fork of libcfsurface. The good news about this change is that when I do a test run through the app, it works! The bad news is that when the phone is rebooted, it does not work. I assume that this is likely a side effect of the class not being ready during this stage in the boot sequence, and thus, attempting to use it for getting the display dimensions does not work. Unfortunately, this is where my luck ran out.

I don't have time to do any further research right now, but I wanted to get the app working on my phone, so I made a sloppy change to hard-code the dimensions of my phone's display to use. Obviously this "fix" is not appropriate for submitting a PR for, to say nothing about the fact that the output is going to look weird for anyone using a phone with display dimensions that are not exactly the same as mine. If I have a chance, I will revisit this, but if not, then I hope someone else will be able to see this through to the end based on the information that I have provided here.

For anyone who is interested in compiling their own version of the app with hard-coded dimensions for their phone, the relevant commit for seeing what I did is available here.

In my opinion, the best way to solve this issue would be to determine the display dimensions at install-time (the logic should probably go somewhere in here) and then use that saved information at boot rather than trying to do it using reflection.

@Chainfire I know you are not really involved in the Android root scene anymore, but if you have any insight into this, I would greatly appreciate it.

Chainfire commented 11 months ago

Many devices allow (or automatically do) resolution changes, so just setting the data at install time seems like it'll break something.

As with the last PR, I don't actually even have any device anymore that runs the latest Android rooted, so I have no idea what is going on.

Have you also tried making it a priv-app rather than a normal system app? (if the distinction is still a thing these days). Possibly it's just a matter of changing the loaded CLASSPATH's by libRootJava, or actually loading the classes manually with a ClassLoader ? You can cat /proc/<pid>/environ from a system app to see what's different compared to the LiveBoot's test runner. Either way that StackOverflow post is very old - much older than the latest version of LiveBoot that actually still works.

Rather than using LocalDisplayAdapter, what about com.android.server.display.DisplayControl ? Which LocalDisplayAdapter would be calling in turn anyway.

Even if DisplayControl cannot be loaded, and classpath doesn't help, these functions call their native counterparts in some .so that is loaded, so presumably we can load that .so ourselves and just define and call those functions manually? Heck, it may even already be loaded! Maybe just copy/pasting the native definitions and calling them works out of the box. I don't remember what would happen if you would then load it onto a device not having those native calls available though, whether that's a warning until the function is actually called or fatal on load...

EDIT: perhaps we're barking up the wrong tree completely:

SurfaceControl.getDynamicDisplayInfo(0) could possibly be called (statically, and assuming displayId == 0 still works for the physical display as it did in the past), returning a SurfaceControl.DynamicDisplayInfo object, which supportedDisplayModes may be enumerated to retrieve the correct dimensions? The activeDisplayModeId probably translates to supportedDisplayModes[x].id.

EDIT#2:

If using 0 doesn't work for physical display id, perhaps DisplayManager can be used. It's already referenced in checkRotation() in our code. Assuming the DisplayManager.getDisplay(0) call still works, the Display class has a member mDisplayId which may be the correct value to use for SurfaceControl.getDynamicDisplayInfo. If not, it also has a member mDisplayInfo, which in turn also has a displayId member that may be correct. If that's still not the correct id, DisplayInfo has an address member which should be of class DisplayAddress.Physical and has the mPhysicalDisplayId member which really has to be the right id at this point :)

EDIT#3:

DisplayInfo also has logicalWidth and logicalHeight members if all else fails. I'm not sure if those would behave correctly when scaling/rotation is going on. Preferred would be getDynamicDisplayInfo still I think! But hey, yet another fallback.

DavidBerdik commented 11 months ago

Many devices allow (or automatically do) resolution changes, so just setting the data at install time seems like it'll break something.

I can see why this would be an issue for today's foldables, but this seems rather strange to me for normal devices. Anyway, I guess that rules that approach out.

Have you also tried making it a priv-app rather than a normal system app? (if the distinction is still a thing these days). Possibly it's just a matter of changing the loaded CLASSPATH's by libRootJava, or actually loading the classes manually with a ClassLoader ? You can cat /proc/<pid>/environ from a system app to see what's different compared to the LiveBoot's test runner. Either way that StackOverflow post is very old - much older than the latest version of LiveBoot that actually still works.

I did indeed try making it a priv-app but unfortunately, that did not work either. As for the cat command, here's the output that I got from using it on a PID that I arbitrarily chose from a list of them that were running as the system user, so I assume that it's from a system app?

PATH=/product/bin:/apex/com.android.runtime/bin:/apex/com.android.art/bin:/system_ext/bin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbinANDROID_BOOTLOGO=1ANDROID_ROOT=/systemANDROID_ASSETS=/system/appANDROID_DATA=/dataANDROID_STORAGE=/storageANDROID_ART_ROOT=/apex/com.android.artANDROID_I18N_ROOT=/apex/com.android.i18nANDROID_TZDATA_ROOT=/apex/com.android.tzdataEXTERNAL_STORAGE=/sdcardASEC_MOUNTPOINT=/mnt/asecDOWNLOAD_CACHE=/data/cacheBOOTCLASSPATH=/apex/com.android.art/javalib/core-oj.jar:/apex/com.android.art/javalib/core-libart.jar:/apex/com.android.art/javalib/okhttp.jar:/apex/com.android.art/javalib/bouncycastle.jar:/apex/com.android.art/javalib/apache-xml.jar:/system/framework/framework.jar:/system/framework/framework-graphics.jar:/system/framework/ext.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/apex/com.android.i18n/javalib/core-icu4j.jar:/apex/com.android.adservices/javalib/framework-adservices.jar:/apex/com.android.adservices/javalib/framework-sdksandbox.jar:/apex/com.android.appsearch/javalib/framework-appsearch.jar:/apex/com.android.btservices/javalib/framework-bluetooth.jar:/apex/com.android.configinfrastructure/javalib/framework-configinfrastructure.jar:/apex/com.android.conscrypt/javalib/conscrypt.jar:/apex/com.android.devicelock/javalib/framework-devicelock.jar:/apex/com.android.healthfitness/javalib/framework-healthfitness.jar:/apex/com.android.ipsec/javalib/android.net.ipsec.ike.jar:/apex/com.android.media/javalib/updatable-media.jar:/apex/com.android.mediaprovider/javalib/framework-mediaprovider.jar:/apex/com.android.ondevicepersonalization/javalib/framework-ondevicepersonalization.jar:/apex/com.android.os.statsd/javalib/framework-statsd.jar:/apex/com.android.permission/javalib/framework-permission.jar:/apex/com.android.permission/javalib/framework-permission-s.jar:/apex/com.android.scheduling/javalib/framework-scheduling.jar:/apex/com.android.sdkext/javalib/framework-sdkextensions.jar:/apex/com.android.tethering/javalib/framework-connectivity.jar:/apex/com.android.tethering/javalib/framework-connectivity-t.jar:/apex/com.android.tethering/javalib/framework-tethering.jar:/apex/com.android.uwb/javalib/framework-uwb.jar:/apex/com.android.virt/javalib/framework-virtualization.jar:/apex/com.android.wifi/javalib/framework-wifi.jarDEX2OATBOOTCLASSPATH=/apex/com.android.art/javalib/core-oj.jar:/apex/com.android.art/javalib/core-libart.jar:/apex/com.android.art/javalib/okhttp.jar:/apex/com.android.art/javalib/bouncycastle.jar:/apex/com.android.art/javalib/apache-xml.jar:/system/framework/framework.jar:/system/framework/framework-graphics.jar:/system/framework/ext.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/apex/com.android.i18n/javalib/core-icu4j.jarSYSTEMSERVERCLASSPATH=/system/framework/com.android.location.provider.jar:/system/framework/services.jar:/apex/com.android.adservices/javalib/service-adservices.jar:/apex/com.android.adservices/javalib/service-sdksandbox.jar:/apex/com.android.appsearch/javalib/service-appsearch.jar:/apex/com.android.art/javalib/service-art.jar:/apex/com.android.compos/javalib/service-compos.jar:/apex/com.android.configinfrastructure/javalib/service-configinfrastructure.jar:/apex/com.android.healthfitness/javalib/service-healthfitness.jar:/apex/com.android.media/javalib/service-media-s.jar:/apex/com.android.ondevicepersonalization/javalib/service-ondevicepersonalization.jar:/apex/com.android.permission/javalib/service-permission.jar:/apex/com.android.rkpd/javalib/service-rkp.jarSTANDALONE_SYSTEMSERVER_JARS=/apex/com.android.btservices/javalib/service-bluetooth.jar:/apex/com.android.devicelock/javalib/service-devicelock.jar:/apex/com.android.os.statsd/javalib/service-statsd.jar:/apex/com.android.scheduling/javalib/service-scheduling.jar:/apex/com.android.tethering/javalib/service-connectivity.jar:/apex/com.android.uwb/javalib/service-uwb.jar:/apex/com.android.wifi/javalib/service-wifi.jar

I'm not actually sure how to make use of this information, though. That is, assuming that it is actually useful.

Rather than using LocalDisplayAdapter, what about com.android.server.display.DisplayControl ? Which LocalDisplayAdapter would be calling in turn anyway.

Unfortunately, since com.android.server.display.DisplayControl is located in com.android.server, attempting to access this is also going to result in a ClassNotFoundException.

EDIT: perhaps we're barking up the wrong tree completely:

SurfaceControl.getDynamicDisplayInfo(0) could possibly be called (statically, and assuming displayId == 0 still works for the physical display as it did in the past), returning a SurfaceControl.DynamicDisplayInfo object, which supportedDisplayModes may be enumerated to retrieve the correct dimensions? The activeDisplayModeId probably translates to supportedDisplayModes[x].id.

EDIT#2:

If using 0 doesn't work for physical display id, perhaps DisplayManager can be used. It's already referenced in checkRotation() in our code. Assuming the DisplayManager.getDisplay(0) call still works, the Display class has a member mDisplayId which may be the correct value to use for SurfaceControl.getDynamicDisplayInfo. If not, it also has a member mDisplayInfo, which in turn also has a displayId member that may be correct. If that's still not the correct id, DisplayInfo has an address member which should be of class DisplayAddress.Physical and has the mPhysicalDisplayId member which really has to be the right id at this point :)

EDIT#3:

DisplayInfo also has logicalWidth and logicalHeight members if all else fails. I'm not sure if those would behave correctly when scaling/rotation is going on. Preferred would be getDynamicDisplayInfo still I think! But hey, yet another fallback.

These all seem like reasonable avenues to research! Assuming that someone else doesn't beat me to it, I will try to give the approach you suggested in your first edit a shot and report back. The idea of trying to hard-code the display ID to zero had occurred to me, but I had assumed that it was probably not a good idea, so I didn't bother with it.

ItzExotical commented 10 months ago

Tried installing it on my Android 14 phone and it just showed the normal boot animation from the custom ROM. Any ETA on this yet perhaps?

DavidBerdik commented 10 months ago

@ItzExotical Unfortunately, I have not had time to investigate this further. If you want a lazy approach to get it working on your phone, you can hard-code the dimensions of your display using the instructions I provided above.

Although, it would be nice to get some help with trying to fix this properly. πŸ™‚

symbuzzer commented 8 months ago

I hope I'm not bothering. Any news for Android 14 support sir? @Chainfire @DavidBerdik

DavidBerdik commented 8 months ago

@symbuzzer Sorry, but unfortunately, I haven't had a chance to dig into it. Adding support for Android 14 is on the list of programming projects I want to take on if someone else does not beat me to it, but my free time is quite limited these days, and since I have a hacked-together but working solution, I have not prioritized this over other projects that I want to work on.

spart0n654 commented 8 months ago

I'm going to see about posting a bounty for this to be updated to a14 and if I can I'll make sure it's posted here. Gotta see if I can find someone willing and able then see if my wife will let me use my wallet πŸ‘

DavidBerdik commented 8 months ago

Good luck!

Axionnus commented 7 months ago

@DavidBerdik Hello sir, any updates?

spart0n654 commented 7 months ago

Idk about OP but I haven't had any luck finding someone willing to fix this and get paid for it. Tried fiverr and most everyone said no but the few that was willing to work on it wasn't willing to post the update here and was only willing to make it work on my device only. So unfortunately I've made no progress.

DavidBerdik commented 7 months ago

@Axionnus Nope. Sorry!

@spart0n654 Part of the issue that you are facing with finding someone willing to update it probably stems from the fact that this application requires root access and therefore, any developer that is not used to doing Android work outside the confines of the official API does not want to take it on.

DavidBerdik commented 7 months ago

It would seem that the task of getting LiveBoot to work on Android 14 just got a bit harder. After installing the March 2024 update on my phone, the version I built for myself with hard-coded screen dimensions no longer works properly.

DavidBerdik commented 6 months ago

Small update on getting LiveBoot working after the Android 14 March 2024 update:

It appears that getGlobalTransaction() was removed from here. When looking at the latest version of that same file, the function is missing. This is a problem because libcfsurface uses it here.

Stack trace:

2024-03-08 01:17:24.488 21222-21507 libsuperuser            eu.chainfire.liveboot                D  [libsuperuser][O][SU*]  at eu.chainfire.libcfsurface.SurfaceHost.initSurface(SurfaceHost.java:339)
2024-03-08 01:17:24.488 21222-21507 libsuperuser            eu.chainfire.liveboot                D  [libsuperuser][O][SU*]  at eu.chainfire.libcfsurface.SurfaceHost.run(SurfaceHost.java:565)
2024-03-08 01:17:24.488 21222-21507 libsuperuser            eu.chainfire.liveboot                D  [libsuperuser][O][SU*]  at eu.chainfire.liveboot.shell.Runner.main(Runner.java:73)
2024-03-08 01:17:24.489 21222-21507 libsuperuser            eu.chainfire.liveboot                D  [libsuperuser][O][SU*]  at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
2024-03-08 01:17:24.489 21222-21507 libsuperuser            eu.chainfire.liveboot                D  [libsuperuser][O][SU*]  at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:359)
2024-03-08 01:17:24.490 21222-21507 libsuperuser            eu.chainfire.liveboot                D  [libsuperuser][O][SU*] java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[])' on a null object reference
2024-03-08 01:17:24.490 21222-21507 libsuperuser            eu.chainfire.liveboot                D  [libsuperuser][O][SU*]  at eu.chainfire.libcfsurface.SurfaceHost.initSurface(SurfaceHost.java:339)
2024-03-08 01:17:24.491 21222-21507 libsuperuser            eu.chainfire.liveboot                D  [libsuperuser][O][SU*]  at eu.chainfire.libcfsurface.SurfaceHost.run(SurfaceHost.java:565)
2024-03-08 01:17:24.491 21222-21507 libsuperuser            eu.chainfire.liveboot                D  [libsuperuser][O][SU*]  at eu.chainfire.liveboot.shell.Runner.main(Runner.java:73)
2024-03-08 01:17:24.492 21222-21507 libsuperuser            eu.chainfire.liveboot                D  [libsuperuser][O][SU*]  at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
2024-03-08 01:17:24.492 21222-21507 libsuperuser            eu.chainfire.liveboot                D  [libsuperuser][O][SU*]  at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:359)
2024-03-08 01:17:24.493 21222-21507 libsuperuser            eu.chainfire.liveboot                D  [libsuperuser][O][SU*] java.lang.RuntimeException: CFSurface: unexpected exception during SurfaceControl creation
2024-03-08 01:17:24.493 21222-21507 libsuperuser            eu.chainfire.liveboot                D  [libsuperuser][O][SU*]  at eu.chainfire.libcfsurface.SurfaceHost.initSurface(SurfaceHost.java:359)
2024-03-08 01:17:24.494 21222-21507 libsuperuser            eu.chainfire.liveboot                D  [libsuperuser][O][SU*]  at eu.chainfire.libcfsurface.SurfaceHost.run(SurfaceHost.java:565)
2024-03-08 01:17:24.494 21222-21507 libsuperuser            eu.chainfire.liveboot                D  [libsuperuser][O][SU*]  at eu.chainfire.liveboot.shell.Runner.main(Runner.java:73)
2024-03-08 01:17:24.495 21222-21507 libsuperuser            eu.chainfire.liveboot                D  [libsuperuser][O][SU*]  at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
2024-03-08 01:17:24.495 21222-21507 libsuperuser            eu.chainfire.liveboot                D  [libsuperuser][O][SU*]  at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:359)

I have started digging in to what it's going to take to at least get a version of LiveBoot working with hard-coded screen dimensions like what I had before, but I think it's probably going to be a while before I get it done. It unfortunately does not look like a small change.

DavidBerdik commented 6 months ago

I have some good news. I figured out how to fix what Google broke with the Android 14 QPR2 release. The relevant commit on my fork of the libcfsurface repo is here.

The bad news is that I still have not figured out how to get screen dimension detection working properly again, which means that for now, I have to continue using the hard-coded dimensions trick. I am still researching a proper fix for this.

DavidBerdik commented 6 months ago

I believe that in order to get the dimension detection working again, I need to use com.android.server.display.DisplayControl. I am still having issues with getting reflection to work, though. More research is needed.

Chainfire commented 6 months ago

I've installed an Android 14 based LineageOS + Magisk on an old Pixel2XL to see what's what.

I think I've fixed the size detection and incorporated all the QPR2 changes needed. But note this ROM is not QPR2 based so I haven't actually be able to test that part.

If all of you here could install this test APK and see if it works, that would be just dandy.

v1.87 test build

@DavidBerdik @ItzExotical @symbuzzer @spart0n654 @Axionnus

EDIT: Oopsy, this version does not support KernelSU, just FYI

ItzExotical commented 6 months ago

Hi! I don't have a rooted phone anymore as I've bought a new phone and it's a Samsung. I unfortunately do not have any phone that is rooted or could be rooted at my disposal.

spart0n654 commented 6 months ago

Well I don't have a rooted pixel anymore but I do have a stock rooted OnePlus 12 on oos 14 which is android 14 and I can confirm it does not work on this phone

DavidBerdik commented 6 months ago

@Chainfire In order for me to test it on the device that I use 14 QPR2 on, I need a build that has KernelSU support. If you're willing to rebuild it or share the source on a different branch for me to build it myself, that would be great!

I'll admit I'm curious to see if the approach you took is similar to what I had already done on my forked copy of the repo. πŸ™‚

Chainfire commented 6 months ago

Hi! I don't have a rooted phone anymore as I've bought a new phone and it's a Samsung. I unfortunately do not have any phone that is rooted or could be rooted at my disposal.

Ah no worries then.

Well I don't have a rooted pixel anymore but I do have a stock rooted OnePlus 12 on oos 14 which is android 14 and I can confirm it does not work on this phone

Ouch, that is unfortunate. Can you logcat the "test run" ?

@Chainfire In order for me to test it on the device that I use 14 QPR2 on, I need a build that has KernelSU support. If you're willing to rebuild it or share the source on a different branch for me to build it myself, that would be great!

I'll admit I'm curious to see if the approach you took is similar to what I had already done on my forked copy of the repo. πŸ™‚

Yeah I'll rebuild it tomorrow. It has gotten way too late due to fighting with Android Studio and Gradle rather than actually coding. The approach is the same as your repo, just with some tiny changes and adding the size detection fix.

spart0n654 commented 6 months ago

Ouch, that is unfortunate. Can you logcat the "test run" ?

1710040014.100 10743 17156 18837 D CompatibilityChangeReporter: Compat change id reported: 247079863; UID 10743; state: ENABLED 1710040014.109 1000 2600 3557 D NotificationService--NotificationRecord: isSupportRearLight , isRearLight = false mLedRM = false isMultilLed = false 1710040014.301 1000 5175 5774 D UlPriorityService: handleSignalStrengthsChange: mSignalPoor changes from false to true 1710040014.307 radio 5109 5109 D OplusTelephonyController: onSignalStrengthChanged: SignalStrength=SignalStrength:{mCdma=CellSignalStrengthCdma: cdmaDbm=2147483647 cdmaEcio=2147483647 evdoDbm=2147483647 evdoEcio=2147483647 evdoSnr=2147483647 level=0,mGsm=CellSignalStrengthGsm: rssi=2147483647 ber=2147483647 mTa=2147483647 mLevel=0,mWcdma=CellSignalStrengthWcdma: ss=2147483647 ber=2147483647 rscp=2147483647 ecno=2147483647 level=0,mTdscdma=CellSignalStrengthTdscdma: rssi=2147483647 ber=2147483647 rscp=2147483647 level=0,mLte=CellSignalStrengthLte: rssi=2147483647 rsrp=2147483647 rsrq=2147483647 rssnr=2147483647 cqiTableIndex=2147483647 cqi=2147483647 ta=2147483647 level=0 parametersUseForLevel=0,mNr=CellSignalStrengthNr:{ csiRsrp = -112 csiRsrq = 2147483647 csiCqiTableIndex = 2147483647 csiCqiReport = [] ssRsrp = -112 ssRsrq = 2147483647 ssSinr = 2147483647 level = 0 parametersUseForLevel = 0 timingAdvance = 2147483647 },primary=CellSignalStrengthNr} 1710040014.309 1000 7929 7941 E IHansComunication: HANS printMessageBody: RCV message: type = 0,port = 86870,caller_pid = 2600,caller_uid = 1000,target_pid = 18425,target_uid = 10367,pkg_cmd = -1,rpc = com.android.internal.telephony.IPhoneStateListener/10 1710040014.318 1000 2600 2600 D LockSettingsService: [getSeparateProfileChallengeEnabled] userId = 13 1710040014.318 1000 2600 2600 D LockSettingsService: [getSeparateProfileChallengeEnabled] userId = 13 1710040014.319 radio 5109 5109 D OplusTelephonyController: onSignalStrengthChanged: SignalStrength=SignalStrength:{mCdma=CellSignalStrengthCdma: cdmaDbm=2147483647 cdmaEcio=2147483647 evdoDbm=2147483647 evdoEcio=2147483647 evdoSnr=2147483647 level=0,mGsm=CellSignalStrengthGsm: rssi=2147483647 ber=2147483647 mTa=2147483647 mLevel=0,mWcdma=CellSignalStrengthWcdma: ss=2147483647 ber=2147483647 rscp=2147483647 ecno=2147483647 level=0,mTdscdma=CellSignalStrengthTdscdma: rssi=2147483647 ber=2147483647 rscp=2147483647 level=0,mLte=CellSignalStrengthLte: rssi=2147483647 rsrp=2147483647 rsrq=2147483647 rssnr=2147483647 cqiTableIndex=2147483647 cqi=2147483647 ta=2147483647 level=0 parametersUseForLevel=0,mNr=CellSignalStrengthNr:{ csiRsrp = 2147483647 csiRsrq = 2147483647 csiCqiTableIndex = 2147483647 csiCqiReport = [] ssRsrp = -112 ssRsrq = -12 ssSinr = 6 level = 0 parametersUseForLevel = 0 timingAdvance = 2147483647 },primary=CellSignalStrengthNr} 1710040014.320 1000 2600 2600 I OplusStatusBarManagerServiceEnhance: getTopIsFullscreen mTopIsFullscreen: false 1710040014.321 1000 2600 5142 I OplusHansManager : unfreeze uid: 10367 com.dunkinbrands.otgo pids: [18425, 20125] reason: AsyncBinder scene: LcdOn 1710040014.328 1000 2600 5140 I OplusHansManager : uid=10367, pkg=com.dunkinbrands.otgo F exit(), F stay=2, reason=AsyncBinder 1710040014.334 1000 7929 7941 E IHansComunication: HANS printMessageBody: RCV message: type = 0,port = 86870,caller_pid = 2600,caller_uid = 1000,target_pid = 10084,target_uid = 10351,pkg_cmd = -1,rpc = android.service.notification.INotificationListener/2 1710040014.336 1000 7929 7941 E IHansComunication: HANS printMessageBody: RCV message: type = 0,port = 86870,caller_pid = 2600,caller_uid = 1000,target_pid = 10093,target_uid = 10461,pkg_cmd = -1,rpc = android.service.notification.INotificationListener/2 1710040014.337 1000 2600 5142 I OplusHansManager : unfreeze uid: 10351 io.github.jd1378.otphelper pids: [10084] reason: AsyncBinder scene: LcdOn 1710040014.337 1000 2600 5140 I OplusHansManager : uid=10351, pkg=io.github.jd1378.otphelper F exit(), F stay=67, reason=AsyncBinder 1710040014.340 10382 10155 10155 I NotificationListener: Received new notification 1710040014.342 1000 2600 5142 I OplusHansManager : unfreeze uid: 10461 com.benoitletondor.pixelminimalwatchface pids: [10093] reason: AsyncBinder scene: LcdOn 1710040014.343 10382 10155 13796 I NotificationPipeline: Processing new notification: 0|com.f0x1d.logfox|0|recording|10743 1710040014.343 10382 10155 13796 I Notification4Heart_NB: NotificationChecker.checkIgnoreCase - onGoing 1710040014.343 1000 2600 5140 I OplusHansManager : uid=10461, pkg=com.benoitletondor.pixelminimalwatchface F exit(), F stay=55, reason=AsyncBinder 1710040014.343 10382 10155 13796 W Notification4Heart_NB: NotificationBridgeCallback.onNotificationPosted-Ignored package : [0] com.f0x1d.logfox 1710040014.343 10210 4850 4850 I SystemUi--Aod: AodNotificationListenerService-->onNotificationPosted size =0 1710040014.344 1000 5175 5774 D CommonScenarios-100-10743: transportLayerQosChange TransportLayerData{link_index=19, uid=10743, uplink_srtt=0, uplink_packets=0, uplink_retrans_packets=0, uplink_retrans_rate=0, downlink_srtt=0, downlink_packets=0, downlink_retrans_packets=0, downlink_retrans_rate=0, downlink_rate=0, uplink_udp_packets=0, downlink_udp_packets=0, uplink_tcp_rate=0, uplink_udp_rate=0, downlink_tcp_rate=0, downlink_udp_rate=0} 1710040014.344 1000 5175 5774 D CommonScenarios-106-10743: link=19,uid=10743 and not match current link:24 uid:10743 1710040014.344 1000 5175 5774 D CommonScenarios-100-10743: link=24,uid=10743 and not match current link:19 uid:10743 1710040014.344 1000 5175 5774 D CommonScenarios-106-10743: transportLayerQosChange TransportLayerData{link_index=24, uid=10743, uplink_srtt=0, uplink_packets=0, uplink_retrans_packets=0, uplink_retrans_rate=0, downlink_srtt=0, downlink_packets=0, downlink_retrans_packets=0, downlink_retrans_rate=0, downlink_rate=0, uplink_udp_packets=0, downlink_udp_packets=0, uplink_tcp_rate=0, uplink_udp_rate=0, downlink_tcp_rate=0, downlink_udp_rate=0} 1710040014.344 10210 4850 4850 E tztt : updateNotificationListOnKg size:0 1710040014.344 1000 5175 5774 D CommonScenarios-100-10743: ActiveState process message 2 1710040014.345 1000 5175 5774 D CommonScenarios-100-10743: ActiveState EVENT_NETWORK_KPI_CHANGE 1710040014.345 1000 5175 5774 D CommonScenarios-100-10743: transport layer data is invalid 1710040014.345 1000 5175 5774 D CommonScenarios-100-10743: ActiveState EVENT_NETWORK_KPI_CHANGE score is invalid 1710040014.346 1000 5175 5774 D CommonScenarios-106-10743: ActiveState process message 2 1710040014.346 1000 5175 5774 D CommonScenarios-106-10743: ActiveState EVENT_NETWORK_KPI_CHANGE 1710040014.346 1000 5175 5774 D CommonScenarios-106-10743: transport layer data is invalid 1710040014.346 1000 5175 5774 D CommonScenarios-106-10743: ActiveState EVENT_NETWORK_KPI_CHANGE score is invalid 1710040014.369 1002 1792 6488 I vendor.qti.bluetooth@1.1-ibs_handler: ProcessIbsCmd: Received IBS_WAKE_IND: 0xFD 1710040014.369 1002 1792 6488 D vendor.qti.bluetooth@1.1-ibs_handler: SerialClockVote: vote for UART CLK ON 1710040014.369 1002 1792 6488 E vendor.qti.bluetooth@1.1-wake_lock: Acquire write to wakelock file failed -1 - Operation not permitted 1710040014.369 1002 1792 6488 I vendor.qti.bluetooth@1.1-ibs_handler: ProcessIbsCmd: Writing IBS_WAKE_ACK 1710040014.373 1002 5094 6492 E adv_data_processor: adv data modified, but len check fail or data invalid, stay intact 1710040014.410 1002 1792 6488 I vendor.qti.bluetooth@1.1-ibs_handler: ProcessIbsCmd: Received IBS_SLEEP_IND: 0xFE 1710040014.410 1002 1792 6488 D vendor.qti.bluetooth@1.1-ibs_handler: SerialClockVote: vote for UART CLK OFF 1710040014.443 root 3360 3902 D QmiClient: qmiServiceEventCallback recv msg id 1099 1710040014.444 root 3360 3902 D QmiVsClient: enter - onQmiServiceEventCallback msgId 1099 1710040014.444 root 3360 3902 D QmiVsClientEvent: QosPeriodReportInd MSG IND data_len 2052 1710040014.444 root 3360 3902 D QmiVsClientEvent: qmiVsClientNotifyQosPeriodReportIndEvent - RADIO_EVENT_QOS_PERIOD_REPORT_NOTIFY_IND 1710040014.444 root 3362 3899 D QmiClient: qmiServiceEventCallback recv msg id 1099 1710040014.444 root 3362 3899 D QmiVsClient: enter - onQmiServiceEventCallback msgId 1099 1710040014.444 root 3362 3899 D QmiVsClientEvent: QosPeriodReportInd MSG IND data_len 2052 1710040014.444 root 3362 3899 D QmiVsClientEvent: qmiVsClientNotifyQosPeriodReportIndEvent - RADIO_EVENT_QOS_PERIOD_REPORT_NOTIFY_IND 1710040014.444 root 3360 3473 D VsProxy : handleMessage msg is 2420 1710040014.444 root 3360 3473 D VsProxy : handleQosPeriodReportInd for instance 0 data_len 38 1710040014.445 root 3362 3409 D VsProxy : handleMessage msg is 2420 1710040014.446 root 3362 3409 D VsProxy : handleQosPeriodReportInd for instance 1 data_len 90 1710040014.446 1000 5254 5853 D SubsysRadioIndication: radioQosPeriodReportInd 1710040014.447 1000 5254 5368 D SubsysRadioIndication: radioQosPeriodReportInd 1710040014.449 1000 5175 5774 D CommonScenarios-100-10743: modemQosChange ModemData{mSubId=2, mRat=5, mArfcn=-1, mPci=-1, mBand=-1, mDLBW=-1, mRsrp=-1, mRsrq=-1, mSnr=-999, mSvcStatus=3, mULTimeStamp=-1, mULPDCPNumDataPdu=0, mULPDCPNumDropPdu=0, mULPDCPTput=0, mULRLCNumDataPdu=0, mULRLCNumRetxPdu=0, mULGrant=0, mULBSR=0, mULBler=0, mDLTimeStamp=-1, mDLPDCPNumDataPdu=0, mDLPDCPTput=0, mDLRLCNumDataPdu=0, mDLRLCNumRetxPdu=0, mDLRLCNumDropPdu=0, mDLMACPaddingBytes=0, mDLPdcpNumMissToUppPdu=0, mDLBler=1, mRlfCount=0, mRachWithULGrantCount=0, mCellChangeCount=0, mIsRedirectionOccur=0, mIsDualSimConflict=0, mMobilityEventListSize=0} 1710040014.449 1000 5175 5774 D CommonScenarios-100-10743: notifyModemCauseChange masterChannelQoe 2 1710040014.524 root 3162 3162 E OplusTouchDaemon: ts_run_service: shellback temperature updated 29 (29062) 1710040014.538 10210 4850 4850 I SystemUi--Keyguard: OplusLockScreenWallpaper-->loadBitmap drawable false, type: 0 1710040014.540 1000 2600 3557 D NotificationService--OplusNavigationManager: Notification--isSuppressedByDriveMode--userId:-1,mode:false 1710040014.552 1000 2600 5140 I OplusHansManager : uid=10332, pkg=com.paget96.batteryguru cannot transition from R to M, importance=fg-service 1710040014.552 1000 4776 4804 I OplusEngineerService: [isEngineerItemInBlackList] start type=1,item=com.nearme.statistics.rom/com.nearme.statistics.rom.service.ReceiverService 1710040014.552 1000 4776 10996 I SecrecyService: [isEngineerItemInBlackList] isSecrecySupport in 1710040014.553 1000 4776 10996 I SecrecyService: [isEngineerItemInBlackList] mSecrecySupport=true 1710040014.553 1000 4776 10996 I OplusEngineerService: [isEngineerItemInBlackList] secrecySupport=true 1710040014.553 1000 4776 10996 I SecrecyService: [isEngineerItemInBlackList] isInEncryptedAppList in 1710040014.553 1000 4776 10996 I SecrecyService: [isEngineerItemInBlackList] mSecrecySupport=true 1710040014.553 1000 4776 10996 I SecrecyService: [isEngineerItemInBlackList] start PolicyManager check 1710040014.553 1000 4776 10996 I SecrecyService.PolicyManager: [isEngineerItemInBlackList] getPolicyState in 1710040014.554 1000 4776 10996 I SecrecyService: [isEngineerItemInBlackList] start preWork check 1710040014.554 1000 4776 10996 I SecrecyService.ActivityConfig: [isEngineerItemInBlackList]isInActivityConfig in packageName = com.nearme.statistics.rom, className = com.nearme.statistics.rom.service.ReceiverService 1710040014.554 1000 4776 10996 I SecrecyService.ActivityConfig: [isEngineerItemInBlackList]isInActivityConfig end return false 1710040014.554 1000 4776 10996 I SecrecyService: [isEngineerItemInBlackList] preWork return false 1710040014.554 1000 4776 10996 I OplusEngineerService: [isEngineerItemInBlackList] inEncryptedAppList=false 1710040014.554 1000 4776 10996 I OplusEngineerConfig: [isEngineerItemInBlackList] mActivitySwitch=false 1710040014.554 1000 4776 10996 I OplusEngineerService: [isEngineerItemInBlackList] ACTIVITY result=false 1710040014.554 1000 4776 4804 I OplusEngineerService: [isEngineerItemInBlackList] dealtime=2,result=false,item=com.nearme.statistics.rom/com.nearme.statistics.rom.service.ReceiverService 1710040014.555 1000 2600 3557 W ActivityManager: Unable to start service Intent { cmp=com.nearme.statistics.rom/.service.ReceiverService (has extras) } U=0: not found 1710040014.557 1000 2600 5140 I OplusHansManager : uid=10371, pkg=eu.faircode.email cannot transition from R to M, importance=fg-service 1710040014.560 1002 1792 5951 E vendor.qti.bluetooth@1.1-wake_lock: Release wake lock not initialized/acquired 1710040014.563 1000 2600 5140 I OplusHansManager : uid=10415, pkg=com.freestylelibre3.app.us cannot transition from R to M, importance=bt 1710040014.569 1000 2600 5140 I OplusHansManager : uid=10459, pkg=sk.henrichg.phoneprofilesplus cannot transition from R to M, importance=fg-service 1710040014.577 10210 4850 4850 E tztt : updateNotificationListOnKg size:0 1710040014.578 1000 2600 5140 I OplusHansManager : uid=10501, pkg=com.zacharee1.systemuituner cannot transition from R to M, importance=fg-service 1710040014.588 root 3162 3162 I synaLib : tcm: STATUS: Enter DOZE mode 1710040014.588 root 3162 3299 E OplusTouchDaemon: [OplusTouchDaemon][touchMonitorRoutine][79]: touchMonitor stop, isEnable:1, currentState:1 1710040014.604 10210 4850 5687 D LocalImageResolver: Couldn't use ImageDecoder for drawable, falling back to non-resized load. 1710040014.611 10210 4850 5687 D LocalImageResolver: Couldn't use ImageDecoder for drawable, falling back to non-resized load. 1710040014.641 10210 4850 4850 E tztt : updateNotificationListOnKg size:0 1710040014.681 10210 4850 5542 I SystemUi--Statusbar: PrivacyDotViewController-->scheduleUpdate: 1710040014.781 10210 4850 5542 I SystemUi--Statusbar: PrivacyDotViewController-->processNextViewState: 1710040014.782 10210 4850 5542 I SystemUi--Statusbar: PrivacyDotViewController-->resolveState ViewState(viewInitialized=true, systemPrivacyEventIsActive=false, shadeExpanded=false, qsExpanded=false, portraitRect=Rect(0, 0 - 1440, 160), landscapeRect=Rect(160, 0 - 3168, 160), upsideDownRect=Rect(0, 0 - 1440, 160), seascapeRect=Rect(0, 0 - 2992, 160), layoutRtl=false, rotation=0, paddingTop=31, paddingBottom=31, cornerIndex=1, designatedCorner=android.widget.FrameLayout{e43c418 I.E...... ......ID 1370,0-1440,160 #7f0a0842 app:id/privacy_dot_top_right_container viewInfo = }, contentDescription=null, dotMargin=79) 1710040014.888 1000 2084 2840 D VRR [OTI]: handleIdle from 0 to 1 1710040014.888 1000 2084 2840 D VRR [OTI-HW]: isStateReady 0 1710040014.888 1000 2084 2840 E RefreshRateSelector: Can't find max refresh rate by policy with the same group 0 1710040014.888 1000 2084 2840 D VRR [OTI-HW]: rate range: min {id=3, hwcId=3, resolution=1440x3168, refreshRate=120.00 Hz, dpi=515.15x509.29, group=0} cur {id=3, hwcId=3, resolution=1440x3168, refreshRate=120.00 Hz, dpi=515.15x509.29, group=0} max {id=3, hwcId=3, resolution=1440x3168, refreshRate=120.00 Hz, dpi=515.15x509.29, group=0} 1710040014.888 1000 2084 2840 D VRR [OTI-HW]: keep rate. 1710040014.888 1000 2084 2840 D VRR [OTI-ADFR]: getBestCvtRate 0, modeTypeIsReady 0, currentFps 120 1710040014.906 1000 2600 3557 D UsageStatsService: User[0] type=0 b=1710040012899 e=1710040014899 cb=1710018454643 ce=1710040014330 disk=0 all=1 1710040014.920 1000 2600 3557 D NotificationService--NotificationRecord: isSupportRearLight , isRearLight = false mLedRM = false isMultilLed = false 1710040014.983 10208 5167 5167 D DeviceStatisticsService: onReceive: action= android.intent.action.BATTERY_CHANGED 1710040014.985 1000 5254 5254 D SubsysBroadcastManager: onReceive action:android.intent.action.BATTERY_CHANGED 1710040014.987 nfc 9654 9654 E VendorNfcService: changeNfcStateByWirelessCharge: feature WIRELESS_CHARGING = true; mIsWirelessCharging: false; mIsReverseChargingSwitchOpen: false; mNfcWorkMode: 0; isOverSeaRegion() = true 1710040014.988 10208 5167 5167 D DeviceInfoAidlClient: isRadioOn()=true 1710040014.988 10208 5167 5167 I DeviceInfoAidlClient: isPowerInfoNeverSent=false batteryLevel=44 batteryLevelIndex=5 chargingMode=0 totalCapacity=4890900 powerSaveMode=false 1710040014.991 1000 1957 1957 D vendor.oplus.hardware.charger-V1-service: chargeDetail oplus_chg : , ret_value0 1710040014.991 1000 1957 1957 D vendor.oplus.hardware.charger-V1-service: find ., st_mode=0x41ed, rc=0 1710040014.991 1000 1957 1957 D vendor.oplus.hardware.charger-V1-service: find dir . 1710040014.991 1000 1957 1957 D vendor.oplus.hardware.charger-V1-service: find .., st_mode=0x41ed, rc=0 1710040014.991 1000 1957 1957 D vendor.oplus.hardware.charger-V1-service: find dir .. 1710040014.991 1000 1957 1957 D vendor.oplus.hardware.charger-V1-service: find hmac, st_mode=0x41ed, rc=-1 1710040014.991 1000 1957 1957 D vendor.oplus.hardware.charger-V1-service: find dir hmac 1710040014.991 1000 1957 1957 D vendor.oplus.hardware.charger-V1-service: find reserve_soc_debug, st_mode=0x41ed, rc=-1 1710040014.991 1000 1957 1957 D vendor.oplus.hardware.charger-V1-service: find dir reserve_soc_debug 1710040014.991 1000 1957 1957 D vendor.oplus.hardware.charger-V1-service: find integrate_gauge_fcc_flag, st_mode=0x41ed, rc=-1 1710040014.991 1000 1957 1957 D vendor.oplus.hardware.charger-V1-service: find dir integrate_gauge_fcc_flag 1710040014.991 1000 1957 1957 D byb_info: find ., st_mode=0x41ed, rc=0 1710040014.991 1000 1957 1957 D byb_info: find dir . 1710040014.991 1000 1957 1957 D byb_info: find .., st_mode=0x41ed, rc=0 1710040014.991 1000 1957 1957 D byb_info: find dir .. 1710040014.991 1000 1957 1957 D byb_info: find vic-8, st_mode=0x41ed, rc=-1 1710040014.991 1000 1957 1957 D byb_info: find dir vic-8 1710040014.991 1000 1957 1957 D byb_info: find vic-16, st_mode=0x41ed, rc=-1 1710040014.991 1000 1957 1957 D byb_info: find dir vic-16 1710040014.991 1000 1957 1957 D byb_info: find vic-6, st_mode=0x41ed, rc=-1 1710040014.991 1000 1957 1957 D byb_info: find dir vic-6 1710040014.991 1000 1957 1957 D byb_info: find vic-14, st_mode=0x41ed, rc=-1 1710040014.991 1000 1957 1957 D byb_info: find dir vic-14 1710040014.991 1000 1957 1957 D byb_info: find vic-4, st_mode=0x41ed, rc=-1 1710040014.991 1000 1957 1957 D byb_info: find dir vic-4 1710040014.992 1000 1957 1957 D byb_info: find vic-12, st_mode=0x41ed, rc=-1 1710040014.992 1000 1957 1957 D byb_info: find dir vic-12 1710040014.992 1000 1957 1957 D byb_info: find vic-2, st_mode=0x41ed, rc=-1 1710040014.992 1000 1957 1957 D byb_info: find dir vic-2 1710040014.992 1000 10000 12322 E Battery : a: getAISleepDuration: predictResult is null. 1710040014.992 1000 1957 1957 D byb_info: find vic-10, st_mode=0x41ed, rc=-1 1710040014.992 1000 1957 1957 D byb_info: find dir vic-10 1710040014.992 1000 1957 1957 D byb_info: find vic-0, st_mode=0x41ed, rc=-1 1710040014.992 1000 1957 1957 D byb_info: find dir vic-0 1710040014.992 1000 1957 1957 D byb_info: find vic-9, st_mode=0x41ed, rc=-1 1710040014.992 1000 1957 1957 D byb_info: find dir vic-9 1710040014.992 1000 1957 1957 D byb_info: find vic-7, st_mode=0x41ed, rc=-1 1710040014.992 1000 1957 1957 D byb_info: find dir vic-7 1710040014.992 1000 1957 1957 D byb_info: find vic-15, st_mode=0x41ed, rc=-1 1710040014.992 1000 1957 1957 D byb_info: find dir vic-15 1710040014.992 1000 1957 1957 D byb_info: find vic-5, st_mode=0x41ed, rc=-1 1710040014.992 1000 1957 1957 D byb_info: find dir vic-5 1710040014.992 1000 1957 1957 D byb_info: find version, st_mode=0x41ed, rc=-1 1710040014.992 1000 1957 1957 D byb_info: find dir version 1710040014.992 1000 1957 1957 D byb_info: find vic-13, st_mode=0x41ed, rc=-1 1710040014.992 1000 1957 1957 D byb_info: find dir vic-13 1710040014.992 1000 1957 1957 D byb_info

Now the test run doesn't even work on this device so idk how much this will help

spart0n654 commented 6 months ago

09_03-21-06-54_100.zip

spart0n654 commented 6 months ago

The log file in a zip too just in case you wanted it not as a copy/paste

Chainfire commented 6 months ago

The log file in a zip too just in case you wanted it not as a copy/paste

Did the test run do anything in the previous version of Liveboot? Did the app work in the previous version of the OS? The log shows literally nothing helpful, I might have to build a debug version for you.

spart0n654 commented 6 months ago

The app doesn't do anything as the previous release either on this OnePlus 12

symbuzzer commented 6 months ago

I've installed an Android 14 based LineageOS + Magisk on an old Pixel2XL to see what's what.

I think I've fixed the size detection and incorporated all the QPR2 changes needed. But note this ROM is not QPR2 based so I haven't actually be able to test that part.

If all of you here could install this test APK and see if it works, that would be just dandy.

v1.87 test build

@DavidBerdik @ItzExotical @symbuzzer @spart0n654 @Axionnus

EDIT: Oopsy, this version does not support KernelSU, just FYI

I have an Android 13 device too :(

DavidBerdik commented 6 months ago

Yeah I'll rebuild it tomorrow. It has gotten way too late due to fighting with Android Studio and Gradle rather than actually coding. The approach is the same as your repo, just with some tiny changes and adding the size detection fix.

@Chainfire Great! Yup, fighting with Gradle is part of the fun. πŸ˜†

I have an old Pixel 3 XL running Android 14-based LineageOS and the build you shared above works for me in test mode as well as when booting. If the logic that you used for Android 14 and 14 QPR2 is taken from my repo, then I think it should work, but I obviously cannot test it until there's a build that supports KernelSU.

Chainfire commented 6 months ago

I have an Android 13 device too :(

@symbuzzer ah ok, just here in name for the users of your module then?

Any insight on whether that's actively used? And while I'm added, what exactly is the reason to make it a module? The app supports Magisk fine as it is, no?

(just curious)

Either way the new version could always use testing on older Androids too, make sure we didn't break it

Chainfire commented 6 months ago

LiveBoot-v1.87-test-2.zip

Here's a ZIP containing two APKs, a normal one and a DEBUG one.

@spart0n654 please install the debug one, do the test run, and provide the logcat of it (zipped). Hopefully it's an easy fix as it works great now on my P2XL w/ A14.

@DavidBerdik this build should support KernelSU as well. I've also pushed the changes to the libcfsurface repo, so you can build it yourself if needed. I haven't pushed the changes to the main app yet, but that's just gradle versions changes and copyright notices and such, nothing that would influence how it runs. However I obviously still want the APK I produce to work, as that will see distribution.

spart0n654 commented 6 months ago

LiveBoot-v1.87-test-2.zip

Here's a ZIP containing two APKs, a normal one and a DEBUG one.

@spart0n654 please install the debug one, do the test run, and provide the logcat of it (zipped). Hopefully it's an easy fix as it works great now on my P2XL w/ A14.

10_03-05-38-50_108.zip

Just installed and tried it, the test run still doesn't show me anything. I'll post a screen record too in case I missed something. https://photos.app.goo.gl/5ngVKEcj1UfpbKAf7 Record was too large for GitHub

symbuzzer commented 6 months ago

@Chainfire No of course. My device is Mi 10T Pro and Android 14 (Lineageos 21) has not arrived yet. When the update comes, I'm definitely thinking of updating the module. However, I am currently on Android 13 and I enjoy using this feature provided by your application. Thank you very much indeed for your effort.

The reason why I turned your application into a module is that the application icon cannot be hidden from the home screen. As far as I know, Android doesn't allow this anymore. But if you can add this, there will be no need for the module.

I would also like to point out that I developed this module for my own use. When it was noticed on Github, I started sharing it.

By the way, since the first day I created this module, I have chosen not only to comply with the license rules. I also mentioned linking to the app repo, crediting you as the developer, and pointing to the license texts you specified. I tried to do this very carefully out of respect for you and your efforts. If you want me to remove the module, I can.

Finally, I will definitely try it in my first free time. Since I use my device on a daily basis, I honestly don't have the courage at this stage.

Chainfire commented 6 months ago

By the way, since the first day I created this module, I have chosen not only to comply with the license rules. I also mentioned linking to the app repo, crediting you as the developer, and pointing to the license texts you specified. I tried to do this very carefully out of respect for you and your efforts. If you want me to remove the module, I can.

I appreciate that. No worries, everything you're doing is fine. I was just curious as to the rationale.

Chainfire commented 6 months ago

Just installed and tried it, the test run still doesn't show me anything. I'll post a screen record too in case I missed something. https://photos.app.goo.gl/5ngVKEcj1UfpbKAf7 Record was too large for GitHub

Oof, I think this is a SELinux issue. Curious whether @DavidBerdik will run into the same issue

EDIT: we can possibly solve this on Magisk using supolicy, but I don't think that facility exists in KernelSU... somehow surfaceflinger doesn't have the rights on your device to figure out what the display is...

@spart0n654 can you hook your phone up to adb, shell into it, go into root mode with "su", and dump the output of:

supolicy --print-rules (this should be a massive list)

You could also try running:

supolicy --live "allow surfaceflinger magisk file *" "allow surfaceflinger magisk dir *"

And see if that fixes the test run (it won't fix the boot). Please provide a logcat of that again. You should probably reboot the device before doing any of this to keep the logcat managable.

spart0n654 commented 6 months ago

I tried that command from turmex and the command worked but the test still didn't. When I get to my PC later I'll print the list and post it here.

Chainfire commented 6 months ago

@spart0n654 here's a new ZIP with test APKs... Hopefully these will work. LiveBoot-v1.88-test-3.zip

@DavidBerdik I would like to know your results with both v1.87 and v1.88

spart0n654 commented 6 months ago

@spart0n654 here's a new ZIP with test APKs... Hopefully these will work. LiveBoot-v1.88-test-3.zip

@DavidBerdik I would like to know your results with both v1.87 and v1.88

Woot woot! The debug test works! I took a logcat of it working

I have not tried rebooting though. 10_03-10-09-08_559.zip

Chainfire commented 6 months ago

@spart0n654 here's a new ZIP with test APKs... Hopefully these will work. LiveBoot-v1.88-test-3.zip @DavidBerdik I would like to know your results with both v1.87 and v1.88

Woot woot! The debug test works! I took a logcat of it working

I have not tried rebooting though. 10_03-10-09-08_559.zip

Well then you should probably try rebooting :)

spart0n654 commented 6 months ago

You're awesome! Using transparent background and the cyberpunk boot animation from xda both of these together look amazing. Like gobbledygook but cool techy gobbledygook

Chainfire commented 6 months ago

@symbuzzer it should be noted for your module that in this version the app itself also detects screen size and saves this info to the startup script (fallbackwidth and fallbackheight options), as a fallback for if the root code cannot determine the screen size (which is the issue at least @spart0n654 here was suffering from).

I don't think you can duplicate that in the module, so it's possible the module will not work for various Android 14+ users while the full-blown app install would.

symbuzzer commented 6 months ago

@symbuzzer it should be noted for your module that in this version the app itself also detects screen size and saves this info to the startup script (fallbackwidth and fallbackheight options), as a fallback for if the root code cannot determine the screen size (which is the issue at least @spart0n654 here was suffering from).

I don't think you can duplicate that in the module, so it's possible the module will not work for various Android 14+ users while the full-blown app install would.

To be honest, I was expecting bad news :(

symbuzzer commented 6 months ago

May be it is possible to get screen size from app itself or its libraries via a shell code when first install of module.

Chainfire commented 6 months ago

Well I mean you could check the script that is generated now, it simply adds a fallbackwidth and fallbackheight parameter.

It grabs these from dumpsys display | grep -i real output. If you run that command yourself and observe it you will see something like:

mBaseDisplayInfo=DisplayInfo{"Built-in Screen", displayId 0, displayGroupId 0, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_TRUSTED, real 1440 x 2880, largest app 1440 x 2880, smallest app 1440 x 2880, appVsyncOf ....

Then it grabs the real WIDTH x HEIGHT text and parses that. Depending on your shell-code-fu you might emulate that.

Off-topic: you disable logcat colors in your module? eek πŸ˜‚

symbuzzer commented 6 months ago

Well I mean you could check the script that is generated now, it simply adds a fallbackwidth and fallbackheight parameter.

It grabs these from dumpsys display | grep -i real output. If you run that command yourself and observe it you will see something like:

mBaseDisplayInfo=DisplayInfo{"Built-in Screen", displayId 0, displayGroupId 0, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_TRUSTED, real 1440 x 2880, largest app 1440 x 2880, smallest app 1440 x 2880, appVsyncOf ....

Then it grabs the real WIDTH x HEIGHT text and parses that. Depending on your shell-code-fu you might emulate that.

Off-topic: you disable logcat colors in your module? eek πŸ˜‚

I think I'll need some GPT help :) Thank you very much

By the way, I left it like this because I use it this way, this may change if there is demand of course :)

symbuzzer commented 6 months ago

So will these new parameters also apply to older Android versions?

Chainfire commented 6 months ago

Yeah... but they're ignored if the root part of the app can determine the screen resolution itself. This is a fallback method just-in-case, it's not proper, as devices support multiple resolutions and can (and will) change them during boot time. So the values may not actually be correct sometimes.

Lassie111 commented 6 months ago

@spart0n654 here's a new ZIP with test APKs... Hopefully these will work. LiveBoot-v1.88-test-3.zip

@DavidBerdik I would like to know your results with both v1.87 and v1.88

Does not work on Samsung Galaxy S21 FE. Test run does nothing.

May you tell me by what string to filter the logcat before sending it? I don't want to send the whole file here cause I saw it contains sensitive info like my email. It's too big to review it by hand.

Chainfire commented 6 months ago

Does not work on Samsung Galaxy S21 FE. Test run does nothing.

May you tell me by what string to filter the logcat before sending it? I don't want to send the whole file here cause I saw it contains sensitive info like my email. It's too big to review it by hand.

Are you rooted? :)

Filtering on lines that contain "libsuperuser" or "liveboot" (case insensitive) should probably do the trick. If you still end up with thousands of lines, then it did work under the hood, it just wasn't visible, and we'd have to filter differently, and I'd have to actually think about that.

Lassie111 commented 6 months ago

Does not work on Samsung Galaxy S21 FE. Test run does nothing. May you tell me by what string to filter the logcat before sending it? I don't want to send the whole file here cause I saw it contains sensitive info like my email. It's too big to review it by hand.

Are you rooted? :)

Filtering on lines that contain "libsuperuser" or "liveboot" (case insensitive) should probably do the trick. If you still end up with thousands of lines, then it did work under the hood, it just wasn't visible, and we'd have to filter differently, and I'd have to actually think about that.

Yes, using Magisk. Here is the log :) log.txt

Chainfire commented 6 months ago

Does not work on Samsung Galaxy S21 FE. Test run does nothing. May you tell me by what string to filter the logcat before sending it? I don't want to send the whole file here cause I saw it contains sensitive info like my email. It's too big to review it by hand.

Are you rooted? :) Filtering on lines that contain "libsuperuser" or "liveboot" (case insensitive) should probably do the trick. If you still end up with thousands of lines, then it did work under the hood, it just wasn't visible, and we'd have to filter differently, and I'd have to actually think about that.

Yes, using Magisk. Here is the log :) log.txt

Which Android version is this?