Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit af189e33 authored by Svet Ganov's avatar Svet Ganov
Browse files

Slice and dice app ops - framework

Appops can be peformed by an app on its behalf and also on
behalf of another app, i.e. an app can perform a proxy op
and blame the work on another app. The proxy mechanims is
for apps doing work on behalf of other apps where GCore is
one example since the app doing the work needs to check if
the caller has access to the functionality - specifically
the app op backing a runtime permission in case the calling
app does not support runtime permissions.

Apps being able to blame work on other apps is a problem now
that we would be using historical op data to show permission
usage in the UI as apps can start blaming each other to gain
a competitive advantage.

To address the issue we are adding APIs for querying portions
of the app op data - last and historical. One can now get
the ops for work the app did for itself, work the app blamed
on other apps if the app is trusted, work the app blamed on
other apps if the app is not trusted, work other trusted apps
blamed on the app, work other untrusted apps blamed on the app.
A trusted app is one holding the permisison to update app op
stats which is privileged.

The data slicing API allow us to show in the UI only the trusted
poriton of the data which is work the app did for itself, work
trusted apps balmed on the app, and work the app if untrusted
blamed on other apps.

Test: atest CtsAppOpsTestCases

bug:111061782

Change-Id: I9a2bcaea272cb06f38ba742cf601a6dc3b287d5e
parent f6410681
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -4276,7 +4276,8 @@ package android.app {
    method public void stopWatchingMode(android.app.AppOpsManager.OnOpChangedListener);
    method public int unsafeCheckOp(String, int, String);
    method public int unsafeCheckOpNoThrow(String, int, String);
    method public int unsafeCheckOpRaw(String, int, String);
    method public int unsafeCheckOpRaw(@NonNull String, int, String);
    method public int unsafeCheckOpRawNoThrow(@NonNull String, int, @NonNull String);
    field public static final int MODE_ALLOWED = 0; // 0x0
    field public static final int MODE_DEFAULT = 3; // 0x3
    field public static final int MODE_ERRORED = 2; // 0x2
+41 −26
Original line number Diff line number Diff line
@@ -362,27 +362,34 @@ package android.app {
    field public static final String OPSTR_WRITE_ICC_SMS = "android:write_icc_sms";
    field public static final String OPSTR_WRITE_SMS = "android:write_sms";
    field public static final String OPSTR_WRITE_WALLPAPER = "android:write_wallpaper";
    field public static final int UID_STATE_BACKGROUND = 5; // 0x5
    field public static final int UID_STATE_CACHED = 6; // 0x6
    field public static final int UID_STATE_FOREGROUND = 4; // 0x4
    field public static final int UID_STATE_FOREGROUND_SERVICE = 3; // 0x3
    field public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 2; // 0x2
    field public static final int UID_STATE_PERSISTENT = 0; // 0x0
    field public static final int UID_STATE_TOP = 1; // 0x1
    field public static final int OP_FLAGS_ALL = 31; // 0x1f
    field public static final int OP_FLAGS_ALL_TRUSTED = 13; // 0xd
    field public static final int OP_FLAG_SELF = 1; // 0x1
    field public static final int OP_FLAG_TRUSTED_PROXIED = 8; // 0x8
    field public static final int OP_FLAG_TRUSTED_PROXY = 2; // 0x2
    field public static final int OP_FLAG_UNTRUSTED_PROXIED = 16; // 0x10
    field public static final int OP_FLAG_UNTRUSTED_PROXY = 4; // 0x4
    field public static final int UID_STATE_BACKGROUND = 600; // 0x258
    field public static final int UID_STATE_CACHED = 700; // 0x2bc
    field public static final int UID_STATE_FOREGROUND = 500; // 0x1f4
    field public static final int UID_STATE_FOREGROUND_SERVICE = 400; // 0x190
    field public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 300; // 0x12c
    field public static final int UID_STATE_PERSISTENT = 100; // 0x64
    field public static final int UID_STATE_TOP = 200; // 0xc8
  }
  public static final class AppOpsManager.HistoricalOp implements android.os.Parcelable {
    method public int describeContents();
    method public long getAccessCount(int);
    method public long getAccessDuration(int);
    method public long getBackgroundAccessCount();
    method public long getBackgroundAccessDuration();
    method public long getBackgroundRejectCount();
    method public long getForegroundAccessCount();
    method public long getForegroundAccessDuration();
    method public long getForegroundRejectCount();
    method public long getAccessCount(int, int, int);
    method public long getAccessDuration(int, int, int);
    method public long getBackgroundAccessCount(int);
    method public long getBackgroundAccessDuration(int);
    method public long getBackgroundRejectCount(int);
    method public long getForegroundAccessCount(int);
    method public long getForegroundAccessDuration(int);
    method public long getForegroundRejectCount(int);
    method @NonNull public String getOpName();
    method public long getRejectCount(int);
    method public long getRejectCount(int, int, int);
    method public void writeToParcel(android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOp> CREATOR;
  }
@@ -404,6 +411,7 @@ package android.app {
  public static final class AppOpsManager.HistoricalOpsRequest.Builder {
    ctor public AppOpsManager.HistoricalOpsRequest.Builder(long, long);
    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest build();
    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setFlags(int);
    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setOpNames(@Nullable java.util.List<java.lang.String>);
    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setPackageName(@Nullable String);
    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setUid(int);
@@ -431,17 +439,24 @@ package android.app {
  public static final class AppOpsManager.OpEntry implements android.os.Parcelable {
    method public int describeContents();
    method public int getDuration();
    method public long getLastAccessBackgroundTime();
    method public long getLastAccessForegroundTime();
    method public long getLastAccessTime();
    method public long getLastRejectBackgroundTime();
    method public long getLastRejectForegroundTime();
    method public long getLastRejectTime();
    method public long getDuration();
    method public long getLastAccessBackgroundTime(int);
    method public long getLastAccessForegroundTime(int);
    method public long getLastAccessTime(int);
    method public long getLastAccessTime(int, int, int);
    method public long getLastBackgroundDuration(int);
    method public long getLastDuration(int, int, int);
    method public long getLastForegroundDuration(int);
    method public long getLastRejectBackgroundTime(int);
    method public long getLastRejectForegroundTime(int);
    method public long getLastRejectTime(int);
    method public long getLastRejectTime(int, int, int);
    method public int getMode();
    method public String getOpStr();
    method public String getProxyPackageName();
    method @NonNull public String getOpStr();
    method @Nullable public String getProxyPackageName();
    method @Nullable public String getProxyPackageName(int, int);
    method public int getProxyUid();
    method public int getProxyUid(int, int);
    method public boolean isRunning();
    method public void writeToParcel(android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.OpEntry> CREATOR;
@@ -450,7 +465,7 @@ package android.app {
  public static final class AppOpsManager.PackageOps implements android.os.Parcelable {
    method public int describeContents();
    method public java.util.List<android.app.AppOpsManager.OpEntry> getOps();
    method public String getPackageName();
    method @NonNull public String getPackageName();
    method public int getUid();
    method public void writeToParcel(android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.PackageOps> CREATOR;
+52 −19
Original line number Diff line number Diff line
@@ -193,29 +193,36 @@ package android.app {
    field public static final String OPSTR_WRITE_SMS = "android:write_sms";
    field public static final String OPSTR_WRITE_WALLPAPER = "android:write_wallpaper";
    field public static final int OP_COARSE_LOCATION = 0; // 0x0
    field public static final int OP_FLAGS_ALL = 31; // 0x1f
    field public static final int OP_FLAG_SELF = 1; // 0x1
    field public static final int OP_FLAG_TRUSTED_PROXIED = 8; // 0x8
    field public static final int OP_FLAG_TRUSTED_PROXY = 2; // 0x2
    field public static final int OP_FLAG_UNTRUSTED_PROXIED = 16; // 0x10
    field public static final int OP_FLAG_UNTRUSTED_PROXY = 4; // 0x4
    field public static final int OP_RECORD_AUDIO = 27; // 0x1b
    field public static final int OP_START_FOREGROUND = 76; // 0x4c
    field public static final int OP_SYSTEM_ALERT_WINDOW = 24; // 0x18
    field public static final int UID_STATE_BACKGROUND = 5; // 0x5
    field public static final int UID_STATE_CACHED = 6; // 0x6
    field public static final int UID_STATE_FOREGROUND = 4; // 0x4
    field public static final int UID_STATE_FOREGROUND_SERVICE = 3; // 0x3
    field public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 2; // 0x2
    field public static final int UID_STATE_PERSISTENT = 0; // 0x0
    field public static final int UID_STATE_TOP = 1; // 0x1
    field public static final int UID_STATE_BACKGROUND = 600; // 0x258
    field public static final int UID_STATE_CACHED = 700; // 0x2bc
    field public static final int UID_STATE_FOREGROUND = 500; // 0x1f4
    field public static final int UID_STATE_FOREGROUND_SERVICE = 400; // 0x190
    field public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 300; // 0x12c
    field public static final int UID_STATE_PERSISTENT = 100; // 0x64
    field public static final int UID_STATE_TOP = 200; // 0xc8
  }

  public static final class AppOpsManager.HistoricalOp implements android.os.Parcelable {
    method public int describeContents();
    method public long getAccessCount(int);
    method public long getAccessDuration(int);
    method public long getBackgroundAccessCount();
    method public long getBackgroundAccessDuration();
    method public long getBackgroundRejectCount();
    method public long getForegroundAccessCount();
    method public long getForegroundAccessDuration();
    method public long getForegroundRejectCount();
    method public long getAccessCount(int, int, int);
    method public long getAccessDuration(int, int, int);
    method public long getBackgroundAccessCount(int);
    method public long getBackgroundAccessDuration(int);
    method public long getBackgroundRejectCount(int);
    method public long getForegroundAccessCount(int);
    method public long getForegroundAccessDuration(int);
    method public long getForegroundRejectCount(int);
    method @NonNull public String getOpName();
    method public long getRejectCount(int);
    method public long getRejectCount(int, int, int);
    method public void writeToParcel(android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOp> CREATOR;
  }
@@ -228,9 +235,9 @@ package android.app {
    method public int getUidCount();
    method @Nullable public android.app.AppOpsManager.HistoricalUidOps getUidOps(int);
    method @NonNull public android.app.AppOpsManager.HistoricalUidOps getUidOpsAt(int);
    method public void increaseAccessCount(int, int, @NonNull String, int, long);
    method public void increaseAccessDuration(int, int, @NonNull String, int, long);
    method public void increaseRejectCount(int, int, @NonNull String, int, long);
    method public void increaseAccessCount(int, int, @NonNull String, int, int, long);
    method public void increaseAccessDuration(int, int, @NonNull String, int, int, long);
    method public void increaseRejectCount(int, int, @NonNull String, int, int, long);
    method public void offsetBeginAndEndTime(long);
    method public void writeToParcel(android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOps> CREATOR;
@@ -242,6 +249,7 @@ package android.app {
  public static final class AppOpsManager.HistoricalOpsRequest.Builder {
    ctor public AppOpsManager.HistoricalOpsRequest.Builder(long, long);
    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest build();
    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setFlags(int);
    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setOpNames(@Nullable java.util.List<java.lang.String>);
    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setPackageName(@Nullable String);
    method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setUid(int);
@@ -271,6 +279,31 @@ package android.app {
    method public void onOpActiveChanged(int, int, String, boolean);
  }

  public static final class AppOpsManager.OpEntry implements android.os.Parcelable {
    method public int describeContents();
    method public long getDuration();
    method public long getLastAccessBackgroundTime(int);
    method public long getLastAccessForegroundTime(int);
    method public long getLastAccessTime(int);
    method public long getLastAccessTime(int, int, int);
    method public long getLastBackgroundDuration(int);
    method public long getLastDuration(int, int, int);
    method public long getLastForegroundDuration(int);
    method public long getLastRejectBackgroundTime(int);
    method public long getLastRejectForegroundTime(int);
    method public long getLastRejectTime(int);
    method public long getLastRejectTime(int, int, int);
    method public int getMode();
    method @NonNull public String getOpStr();
    method @Nullable public String getProxyPackageName();
    method @Nullable public String getProxyPackageName(int, int);
    method public int getProxyUid();
    method public int getProxyUid(int, int);
    method public boolean isRunning();
    method public void writeToParcel(android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.OpEntry> CREATOR;
  }

  public class DownloadManager {
    field public static final String COLUMN_MEDIASTORE_URI = "mediastore_uri";
  }
+1079 −340

File changed.

Preview size limit exceeded, changes collapsed.

+35 −16
Original line number Diff line number Diff line
@@ -13,6 +13,25 @@
        },
        {
            "name": "CtsFragmentTestCasesSdk26"
        },
        {
            "file_patterns": ["(/|^)AppOpsManager.java"],
            "name": "CtsAppOpsTestCases"
        },
        {
            "file_patterns": ["(/|^)AppOpsManager.java"],
            "name": "FrameworksServicesTests",
            "options": [
                {
                    "include-filter": "com.android.server.appop.AppOpsUpgradeTest"
                },
                {
                    "include-filter": "com.android.server.appop.AppOpsServiceTest"
                },
                {
                    "include-filter": "com.android.server.appop.AppOpsActiveWatcherTest"
                }
            ]
        }
    ]
}
Loading