Merge "Allow callers holding PACKAGE_USAGE_STATS permission to call ActivityManager#getPackageImportance()" into mnc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
b21a77fefc
@@ -1688,7 +1688,7 @@ public class Am extends BaseCommand {
|
||||
private void runPackageImportance() throws Exception {
|
||||
String packageName = nextArgRequired();
|
||||
try {
|
||||
int procState = mAm.getPackageProcessState(packageName);
|
||||
int procState = mAm.getPackageProcessState(packageName, "com.android.shell");
|
||||
System.out.println(
|
||||
ActivityManager.RunningAppProcessInfo.procStateToImportance(procState));
|
||||
} catch (RemoteException e) {
|
||||
|
||||
@@ -2345,7 +2345,8 @@ public class ActivityManager {
|
||||
@SystemApi
|
||||
public int getPackageImportance(String packageName) {
|
||||
try {
|
||||
int procState = ActivityManagerNative.getDefault().getPackageProcessState(packageName);
|
||||
int procState = ActivityManagerNative.getDefault().getPackageProcessState(packageName,
|
||||
mContext.getOpPackageName());
|
||||
return RunningAppProcessInfo.procStateToImportance(procState);
|
||||
} catch (RemoteException e) {
|
||||
return RunningAppProcessInfo.IMPORTANCE_GONE;
|
||||
|
||||
@@ -2539,7 +2539,8 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
|
||||
case GET_PACKAGE_PROCESS_STATE_TRANSACTION: {
|
||||
data.enforceInterface(IActivityManager.descriptor);
|
||||
String pkg = data.readString();
|
||||
int res = getPackageProcessState(pkg);
|
||||
String callingPackage = data.readString();
|
||||
int res = getPackageProcessState(pkg, callingPackage);
|
||||
reply.writeNoException();
|
||||
reply.writeInt(res);
|
||||
return true;
|
||||
@@ -5868,11 +5869,13 @@ class ActivityManagerProxy implements IActivityManager
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPackageProcessState(String packageName) throws RemoteException {
|
||||
public int getPackageProcessState(String packageName, String callingPackage)
|
||||
throws RemoteException {
|
||||
Parcel data = Parcel.obtain();
|
||||
Parcel reply = Parcel.obtain();
|
||||
data.writeInterfaceToken(IActivityManager.descriptor);
|
||||
data.writeString(packageName);
|
||||
data.writeString(callingPackage);
|
||||
mRemote.transact(GET_PACKAGE_PROCESS_STATE_TRANSACTION, data, reply, 0);
|
||||
reply.readException();
|
||||
int res = reply.readInt();
|
||||
|
||||
@@ -503,7 +503,8 @@ public interface IActivityManager extends IInterface {
|
||||
public void updateLockTaskPackages(int userId, String[] packages) throws RemoteException;
|
||||
public void updateDeviceOwner(String packageName) throws RemoteException;
|
||||
|
||||
public int getPackageProcessState(String packageName) throws RemoteException;
|
||||
public int getPackageProcessState(String packageName, String callingPackage)
|
||||
throws RemoteException;
|
||||
|
||||
public boolean setProcessMemoryTrimLevel(String process, int uid, int level)
|
||||
throws RemoteException;
|
||||
|
||||
@@ -3583,10 +3583,23 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
}
|
||||
}
|
||||
|
||||
private boolean hasUsageStatsPermission(String callingPackage) {
|
||||
final int mode = mAppOpsService.checkOperation(AppOpsManager.OP_GET_USAGE_STATS,
|
||||
Binder.getCallingUid(), callingPackage);
|
||||
if (mode == AppOpsManager.MODE_DEFAULT) {
|
||||
return checkCallingPermission(Manifest.permission.PACKAGE_USAGE_STATS)
|
||||
== PackageManager.PERMISSION_GRANTED;
|
||||
}
|
||||
return mode == AppOpsManager.MODE_ALLOWED;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPackageProcessState(String packageName) {
|
||||
enforceCallingPermission(android.Manifest.permission.GET_PACKAGE_IMPORTANCE,
|
||||
"getPackageProcessState");
|
||||
public int getPackageProcessState(String packageName, String callingPackage) {
|
||||
if (!hasUsageStatsPermission(callingPackage)) {
|
||||
enforceCallingPermission(android.Manifest.permission.GET_PACKAGE_IMPORTANCE,
|
||||
"getPackageProcessState");
|
||||
}
|
||||
|
||||
int procState = ActivityManager.PROCESS_STATE_NONEXISTENT;
|
||||
synchronized (this) {
|
||||
for (int i=mLruProcesses.size()-1; i>=0; i--) {
|
||||
|
||||
Reference in New Issue
Block a user