asksven / BetterBatteryStats

An attempt to provide advanced battery stats for Android
614 stars 157 forks source link

Doesn't work on Android 12 #885

Closed beeshyams closed 2 years ago

beeshyams commented 2 years ago

Cycled through various versions. Doesn't work. Same confirmed by users on XDA thread

Likely error on Android 12 Screenshot_20211107-165304

beeshyams commented 2 years ago

My bad.. Browsing through previous issues found the fix, which seems to work for now. In case it doesn't work over a period of time will add more details and re-open the issue

Fix adb shell settings put global hidden_api_policy 1

beeshyams commented 2 years ago

Sorry but re-opened it to note that even with this fix a) Kernel wake locks don't show b) widgets are broken (rooted stock Android 12, Pixel 4a)

sebastianjena commented 2 years ago

Sorry but re-opened it to note that even with this fix a) Kernel wake locks don't show b) widgets are broken (rooted stock Android 12, Pixel 4a)

Can confirm on Pixel 6 / Android 12.

eldigo commented 2 years ago

Sorry but re-opened it to note that even with this fix a) Kernel wake locks don't show b) widgets are broken (rooted stock Android 12, Pixel 4a)

ArrowOs 12 , Poco f3 has the same issue

woheller69 commented 2 years ago

what about executing

settings put global hidden_api_policy 1

via

Runtime.getRuntime().Exec()

directly from the app if needed on Android 12?

asksven commented 2 years ago

Well unfortunately that is not as simple as that: access to "global" settings requires the permission android.permission.INTERACT_ACROSS_USERS that is unfortunately reserved for system apps. On rooted devices it's not an issue but on unrooted I am still looking for ways to access and change that value. If you have an idea please feel free to submit it so that I can test

woheller69 commented 2 years ago

Have you tried that library?

 https://github.com/LSPosed/AndroidHiddenApiBypass
asksven commented 2 years ago

No and I do not intend to; not because I am lazy but because of the amount of reflection code that I would need to reafactor. I am thinking about another approach but for now there are one or two adbc commands that need to be run. I think it's not a big deal since some permissions also need to be granted with ADB. On rooted devices BBS takes care of that of course

Iey4iej3 commented 1 year ago

There are issues even with rooted device after upgrade to Android 12, when I try to get "partial wakelocks", with logcat:

Exception: java.lang.SecurityException: getPackagesForUid: UID 10283 requires android.permission.INTERACT_ACROSS_USERS_FULL or android.permission.INTERACT_ACROSS_USERS or android.permission.INTERACT_ACROSS_PROFILES to access user .
    at android.os.Parcel.createExceptionOrNull(Parcel.java:2426)
    at android.os.Parcel.createException(Parcel.java:2410)
    at android.os.Parcel.readException(Parcel.java:2393)
    at android.os.Parcel.readException(Parcel.java:2335)
    at android.content.pm.IPackageManager$Stub$Proxy.getPackagesForUid(IPackageManager.java:5389)
    at android.app.ApplicationPackageManager$3.recompute(ApplicationPackageManager.java:1013)
    at android.app.ApplicationPackageManager$3.recompute(ApplicationPackageManager.java:1007)
    at android.app.PropertyInvalidatedCache.query(PropertyInvalidatedCache.java:562)
    at android.app.ApplicationPackageManager.getPackagesForUid(ApplicationPackageManager.java:1026)
    at com.asksven.android.common.nameutils.UidNameResolver.getNameForUid(UidNameResolver.java:107)
    at com.asksven.android.common.privateapiproxies.BatteryStatsProxy.getNetworkUsageStats(BatteryStatsProxy.java:3359)
    at com.asksven.betterbatterystats.data.StatsProvider.getCurrentNetworkUsageStatList(StatsProvider.java:1387)
    at com.asksven.betterbatterystats.data.StatsProvider.populateReference(StatsProvider.java:2709)
    at com.asksven.betterbatterystats.data.StatsProvider.setCustomReference(StatsProvider.java:2484)
    at com.asksven.betterbatterystats.services.WriteCustomReferenceService.onHandleIntent(WriteCustomReferenceService.java:51)
    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:78)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loopOnce(Looper.java:201)
    at android.os.Looper.loop(Looper.java:288)
    at android.os.HandlerThread.run(HandlerThread.java:67)
Caused by: android.os.RemoteException: Remote stack trace:
    at com.android.server.pm.PackageManagerService$ComputerEngine.enforceCrossUserOrProfilePermission(PackageManagerService.java:4635)
    at com.android.server.pm.PackageManagerService$ComputerTracker.enforceCrossUserOrProfilePermission(PackageManagerService.java:5898)
    at com.android.server.pm.PackageManagerService.enforceCrossUserOrProfilePermission(PackageManagerService.java:12623)
    at com.android.server.pm.PackageManagerService.getPackagesForUid(PackageManagerService.java:10385)
    at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:2241)

followed by

Exception: com.asksven.android.common.privateapiproxies.BatteryInfoUnavailableException
    at com.asksven.android.common.privateapiproxies.BatteryStatsProxy.getSensorStats(BatteryStatsProxy.java:1746)
    at com.asksven.betterbatterystats.data.StatsProvider.getCurrentSensorStatList(StatsProvider.java:614)
    at com.asksven.betterbatterystats.data.StatsProvider.populateReference(StatsProvider.java:2729)
    at com.asksven.betterbatterystats.data.StatsProvider.setCustomReference(StatsProvider.java:2484)
    at com.asksven.betterbatterystats.services.WriteCustomReferenceService.onHandleIntent(WriteCustomReferenceService.java:51)
    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:78)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loopOnce(Looper.java:201)
    at android.os.Looper.loop(Looper.java:288)
    at android.os.HandlerThread.run(HandlerThread.java:67)
cybergopnik commented 1 year ago

Can confirm that on non-rooted Galaxy S10e, Android 12 with work profile enabled. Seems like it needs some additional permissions to look into work profile's activity. Tried to give them through ADB to BBS itself and to PIDs mentioned by my logcat (12228 and 10003 - couldn't trace them afterwards anyway, like ADB couldn't get work profile apps' PIDs) - no results. Other permissions asked by BBS are already given to it. Any ideas how to solve it other than dropping work profile. Maybe at least I can make BBS think there's no any other profile somehow?

Logcat piece:

FATAL EXCEPTION: main
Process: com.asksven.betterbatterystats_xdaedition, PID: 12228
java.lang.SecurityException: getPackagesForUid: UID 10003 requires android.permission.INTERACT_ACROSS_USERS_FULL or android.permission.INTERACT_ACROSS_USERS or android.permission.INTERACT_ACROSS_PROFILES to access user .
    at android.os.Parcel.createExceptionOrNull(Parcel.java:2437)
    at android.os.Parcel.createException(Parcel.java:2421)
    at android.os.Parcel.readException(Parcel.java:2404)
    at android.os.Parcel.readException(Parcel.java:2346)
    at android.content.pm.IPackageManager$Stub$Proxy.getPackagesForUid(IPackageManager.java:5884)
    at android.app.ApplicationPackageManager$3.recompute(ApplicationPackageManager.java:1085)
    at android.app.ApplicationPackageManager$3.recompute(ApplicationPackageManager.java:1079)
    at android.app.PropertyInvalidatedCache.query(PropertyInvalidatedCache.java:562)
    at android.app.ApplicationPackageManager.getPackagesForUid(ApplicationPackageManager.java:1098)
    at com.asksven.android.common.nameutils.UidNameResolver.getNameForUid(UidNameResolver.java:107)
    at com.asksven.android.common.privateapiproxies.StatElement.getFullQualifiedName(StatElement.java:88)
    at com.asksven.android.common.privateapiproxies.StatElement.getFqn(StatElement.java:112)
    at com.asksven.betterbatterystats.adapters.StatsAdapter.getView(StatsAdapter.java:231)
    at android.widget.AbsListView.obtainView(AbsListView.java:2617)
    at android.widget.ListView.makeAndAddView(ListView.java:2224)
    at android.widget.ListView.fillDown(ListView.java:826)
    at android.widget.ListView.fillFromTop(ListView.java:888)
    at android.widget.ListView.layoutChildren(ListView.java:1960)
    at android.widget.AbsListView.onLayout(AbsListView.java:2393)
    at android.view.View.layout(View.java:24456)
    at android.view.ViewGroup.layout(ViewGroup.java:7412)
    at androidx.swiperefreshlayout.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:689)
    at android.view.View.layout(View.java:24456)
    at android.view.ViewGroup.layout(ViewGroup.java:7412)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
    at android.view.View.layout(View.java:24456)
    at android.view.ViewGroup.layout(ViewGroup.java:7412)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
    at android.view.View.layout(View.java:24456)
    at android.view.ViewGroup.layout(ViewGroup.java:7412)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
    at android.view.View.layout(View.java:24456)
    at android.view.ViewGroup.layout(ViewGroup.java:7412)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
    at android.view.View.layout(View.java:24456)
    at android.view.ViewGroup.layout(ViewGroup.java:7412)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)
    at android.view.View.layout(View.java:24456)
    at android.view.ViewGroup.layout(ViewGroup.java:7412)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
    at com.android.internal.policy.DecorView.onLayout(DecorView.java:1290)
    at android.view.View.layout(View.java:24456)
    at android.view.ViewGroup.layout(ViewGroup.java:7412)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:4504)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3926)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2832)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:10332)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1063)
    at android.view.Choreographer.doCallbacks(Choreographer.java:845)
    at android.view.Choreographer.doFrame(Choreographer.java:780)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1048)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:226)
    at android.os.Looper.loop(Looper.java:313)
    at android.app.ActivityThread.main(ActivityThread.java:8633)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1133)
Caused by: android.os.RemoteException: Remote stack trace:
    at com.android.server.pm.PackageManagerService$ComputerEngine.enforceCrossUserOrProfilePermission(PackageManagerService.java:5253)
    at com.android.server.pm.PackageManagerService$ComputerTracker.enforceCrossUserOrProfilePermission(PackageManagerService.java:6246)
    at com.android.server.pm.PackageManagerService.enforceCrossUserOrProfilePermission(PackageManagerService.java:14061)
    at com.android.server.pm.PackageManagerService.getPackagesForUid(PackageManagerService.java:11334)
    at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:2453)
Iey4iej3 commented 1 year ago

Can confirm that on non-rooted Galaxy S10e, Android 12 with work profile enabled. Seems like it needs some additional permissions to look into work profile's activity. Tried to give them through ADB to BBS itself and to PIDs mentioned by my logcat (12228 and 10003 - couldn't trace them afterwards anyway, like ADB couldn't get work profile apps' PIDs) - no results. Other permissions asked by BBS are already given to it. Any ideas how to solve it other than dropping work profile. Maybe at least I can make BBS think there's no any other profile somehow?

If I am not mistaken, this is not necessarily a consequence of work profiles. I am able to reproduce this on a device without work profile (under LineageOS MicroG).

rjshrjndrn commented 1 year ago

I am thinking about another approach but for now there are one or two adbc commands that need to be run.

Hi @asksven Can you please list the commands to run?