[1-time permissions] Use internal api to check proc states

We need to check the proc state and the binder method has a filter that
is affected by a bug that keeps a killed a proces in the "pending top"
list. Using the internal api isn't affected by this filter and also is
more correct for inprocess calls.

Test: Install test app that requests permission and will exit
        immediately on granting, observe permission is no longer
	indefinitely held.
Bug: 254736794
Change-Id: I30579090c803b231fd750abbc4ad645805f7ece2
This commit is contained in:
Evan Severson
2023-01-31 17:14:34 -08:00
parent f3005b4fc7
commit a5c6abbdf0

View File

@@ -18,6 +18,7 @@ package com.android.server.pm.permission;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.AlarmManager; import android.app.AlarmManager;
import android.app.IActivityManager; import android.app.IActivityManager;
import android.app.IUidObserver; import android.app.IUidObserver;
@@ -34,6 +35,7 @@ import android.util.Log;
import android.util.SparseArray; import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy;
import com.android.server.LocalServices;
import com.android.server.PermissionThread; import com.android.server.PermissionThread;
/** /**
@@ -50,6 +52,7 @@ public class OneTimePermissionUserManager {
private final @NonNull Context mContext; private final @NonNull Context mContext;
private final @NonNull IActivityManager mIActivityManager; private final @NonNull IActivityManager mIActivityManager;
private final @NonNull ActivityManagerInternal mActivityManagerInternal;
private final @NonNull AlarmManager mAlarmManager; private final @NonNull AlarmManager mAlarmManager;
private final @NonNull PermissionControllerManager mPermissionControllerManager; private final @NonNull PermissionControllerManager mPermissionControllerManager;
@@ -80,6 +83,7 @@ public class OneTimePermissionUserManager {
OneTimePermissionUserManager(@NonNull Context context) { OneTimePermissionUserManager(@NonNull Context context) {
mContext = context; mContext = context;
mIActivityManager = ActivityManager.getService(); mIActivityManager = ActivityManager.getService();
mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
mAlarmManager = context.getSystemService(AlarmManager.class); mAlarmManager = context.getSystemService(AlarmManager.class);
mPermissionControllerManager = new PermissionControllerManager( mPermissionControllerManager = new PermissionControllerManager(
mContext, PermissionThread.getHandler()); mContext, PermissionThread.getHandler());
@@ -243,12 +247,7 @@ public class OneTimePermissionUserManager {
} }
private int getCurrentState() { private int getCurrentState() {
try { return getStateFromProcState(mActivityManagerInternal.getUidProcessState(mUid));
return getStateFromProcState(mIActivityManager.getUidProcessState(mUid, null));
} catch (RemoteException e) {
Log.e(LOG_TAG, "Couldn't check uid proc state", e);
}
return STATE_GONE;
} }
private int getStateFromProcState(int procState) { private int getStateFromProcState(int procState) {