Merge "Fix visibility rules for apex/statsd" am: 3af010fe57 am: aa837402de am: 804e8f0984

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1517519

Change-Id: I9fc8ff51f21368fc33f98d9c598381c3bca1c0fc
diff --git a/apex/TEST_MAPPING b/apex/TEST_MAPPING
index 93f1087..331fe77 100644
--- a/apex/TEST_MAPPING
+++ b/apex/TEST_MAPPING
@@ -6,5 +6,14 @@
     {
       "name" : "LibStatsPullTests"
     }
+  ],
+
+  "postsubmit" : [
+    {
+      "name" : "CtsStatsdHostTestCases"
+    },
+    {
+      "name" : "GtsStatsdHostTestCases"
+    }
   ]
 }
diff --git a/apex/aidl/Android.bp b/apex/aidl/Android.bp
index 04339e6..f66cf7c 100644
--- a/apex/aidl/Android.bp
+++ b/apex/aidl/Android.bp
@@ -30,6 +30,7 @@
         "android/os/StatsDimensionsValueParcel.aidl",
         "android/util/StatsEventParcel.aidl",
     ],
+    host_supported: true,
     backend: {
         java: {
             enabled: false, // framework-statsd and service-statsd use framework-statsd-aidl-sources
diff --git a/apex/apex_manifest.json b/apex/apex_manifest.json
index e2972e7..1d029c6 100644
--- a/apex/apex_manifest.json
+++ b/apex/apex_manifest.json
@@ -1,5 +1,5 @@
 {
   "name": "com.android.os.statsd",
-  "version": 300000000
+  "version": 309999900
 }
 
diff --git a/apex/framework/java/android/app/StatsManager.java b/apex/framework/java/android/app/StatsManager.java
index a7d2057..41803cf 100644
--- a/apex/framework/java/android/app/StatsManager.java
+++ b/apex/framework/java/android/app/StatsManager.java
@@ -547,7 +547,7 @@
 
         @Override
         public void onPullAtom(int atomTag, IPullAtomResultReceiver resultReceiver) {
-            long token = Binder.clearCallingIdentity();
+            final long token = Binder.clearCallingIdentity();
             try {
                 mExecutor.execute(() -> {
                     List<StatsEvent> data = new ArrayList<>();
diff --git a/apex/framework/test/Android.bp b/apex/framework/test/Android.bp
index b113d59..5cc5647 100644
--- a/apex/framework/test/Android.bp
+++ b/apex/framework/test/Android.bp
@@ -14,12 +14,8 @@
 
 android_test {
     name: "FrameworkStatsdTest",
-    platform_apis: true,
-    srcs: [
-        // TODO(b/147705194): Use framework-statsd as a lib dependency instead.
-        ":framework-statsd-sources",
-        "**/*.java",
-    ],
+    sdk_version: "module_current",
+    srcs: [ "**/*.java" ],
     manifest: "AndroidManifest.xml",
     static_libs: [
         "androidx.test.rules",
@@ -28,9 +24,10 @@
     libs: [
         "android.test.runner.stubs",
         "android.test.base.stubs",
+        "framework-statsd.impl",
     ],
     test_suites: [
         "device-tests",
         "mts",
     ],
-}
\ No newline at end of file
+}
diff --git a/apex/service/java/com/android/server/stats/StatsCompanionService.java b/apex/service/java/com/android/server/stats/StatsCompanionService.java
index b5e7224..fbda86f 100644
--- a/apex/service/java/com/android/server/stats/StatsCompanionService.java
+++ b/apex/service/java/com/android/server/stats/StatsCompanionService.java
@@ -54,6 +54,7 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -194,40 +195,38 @@
                 int numRecords = 0;
                 // Add in all the apps for every user/profile.
                 for (UserHandle userHandle : users) {
-                    List<PackageInfo> pi =
-                            pm.getInstalledPackagesAsUser(PackageManager.MATCH_UNINSTALLED_PACKAGES
-                                            | PackageManager.MATCH_ANY_USER
-                                            | PackageManager.MATCH_APEX,
-                                    userHandle.getIdentifier());
-                    for (int j = 0; j < pi.size(); j++) {
-                        if (pi.get(j).applicationInfo != null) {
+                    List<PackageInfo> packagesPlusApex = getAllPackagesWithApex(pm, userHandle);
+                    for (int j = 0; j < packagesPlusApex.size(); j++) {
+                        if (packagesPlusApex.get(j).applicationInfo != null) {
                             String installer;
                             try {
-                                installer = pm.getInstallerPackageName(pi.get(j).packageName);
+                                installer = pm.getInstallerPackageName(
+                                        packagesPlusApex.get(j).packageName);
                             } catch (IllegalArgumentException e) {
                                 installer = "";
                             }
                             long applicationInfoToken =
                                     output.start(ProtoOutputStream.FIELD_TYPE_MESSAGE
                                             | ProtoOutputStream.FIELD_COUNT_REPEATED
-                                                    | APPLICATION_INFO_FIELD_ID);
+                                            | APPLICATION_INFO_FIELD_ID);
                             output.write(ProtoOutputStream.FIELD_TYPE_INT32
-                                    | ProtoOutputStream.FIELD_COUNT_SINGLE | UID_FIELD_ID,
-                                            pi.get(j).applicationInfo.uid);
+                                            | ProtoOutputStream.FIELD_COUNT_SINGLE | UID_FIELD_ID,
+                                    packagesPlusApex.get(j).applicationInfo.uid);
                             output.write(ProtoOutputStream.FIELD_TYPE_INT64
-                                    | ProtoOutputStream.FIELD_COUNT_SINGLE
-                                            | VERSION_FIELD_ID, pi.get(j).getLongVersionCode());
+                                            | ProtoOutputStream.FIELD_COUNT_SINGLE
+                                            | VERSION_FIELD_ID,
+                                    packagesPlusApex.get(j).getLongVersionCode());
+                            output.write(ProtoOutputStream.FIELD_TYPE_STRING
+                                            | ProtoOutputStream.FIELD_COUNT_SINGLE
+                                            | VERSION_STRING_FIELD_ID,
+                                    packagesPlusApex.get(j).versionName);
                             output.write(ProtoOutputStream.FIELD_TYPE_STRING
                                     | ProtoOutputStream.FIELD_COUNT_SINGLE
-                                    | VERSION_STRING_FIELD_ID,
-                                            pi.get(j).versionName);
+                                    | PACKAGE_NAME_FIELD_ID, packagesPlusApex.get(j).packageName);
                             output.write(ProtoOutputStream.FIELD_TYPE_STRING
-                                    | ProtoOutputStream.FIELD_COUNT_SINGLE
-                                            | PACKAGE_NAME_FIELD_ID, pi.get(j).packageName);
-                            output.write(ProtoOutputStream.FIELD_TYPE_STRING
-                                    | ProtoOutputStream.FIELD_COUNT_SINGLE
+                                            | ProtoOutputStream.FIELD_COUNT_SINGLE
                                             | INSTALLER_FIELD_ID,
-                                                    installer == null ? "" : installer);
+                                    installer == null ? "" : installer);
                             numRecords++;
                             output.end(applicationInfoToken);
                         }
@@ -245,6 +244,26 @@
         });
     }
 
+    private static List<PackageInfo> getAllPackagesWithApex(PackageManager pm,
+            UserHandle userHandle) {
+        // We want all the uninstalled packages because uninstalled package uids can still be logged
+        // to statsd.
+        List<PackageInfo> allPackages = new ArrayList<>(
+                pm.getInstalledPackagesAsUser(PackageManager.MATCH_UNINSTALLED_PACKAGES
+                                | PackageManager.MATCH_ANY_USER,
+                        userHandle.getIdentifier()));
+        // We make a second query to package manager for the apex modules because package manager
+        // returns both installed and uninstalled apexes with
+        // PackageManager.MATCH_UNINSTALLED_PACKAGES flag. We only want active apexes because
+        // inactive apexes can conflict with active ones.
+        for (PackageInfo packageInfo : pm.getInstalledPackages(PackageManager.MATCH_APEX)) {
+            if (packageInfo.isApex) {
+                allPackages.add(packageInfo);
+            }
+        }
+        return allPackages;
+    }
+
     private static class WakelockThread extends Thread {
         private final PowerManager.WakeLock mWl;
         private final Runnable mRunnable;
diff --git a/apex/service/java/com/android/server/stats/StatsManagerService.java b/apex/service/java/com/android/server/stats/StatsManagerService.java
index 97846f2..1e3846b 100644
--- a/apex/service/java/com/android/server/stats/StatsManagerService.java
+++ b/apex/service/java/com/android/server/stats/StatsManagerService.java
@@ -27,6 +27,7 @@
 import android.os.IPullAtomCallback;
 import android.os.IStatsManagerService;
 import android.os.IStatsd;
+import android.os.PowerManager;
 import android.os.Process;
 import android.os.RemoteException;
 import android.util.ArrayMap;
@@ -412,8 +413,13 @@
     @Override
     public byte[] getData(long key, String packageName) throws IllegalStateException {
         enforceDumpAndUsageStatsPermission(packageName);
+        PowerManager powerManager = (PowerManager)
+                mContext.getSystemService(Context.POWER_SERVICE);
+        PowerManager.WakeLock wl = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
+                /*tag=*/ StatsManagerService.class.getCanonicalName());
         int callingUid = Binder.getCallingUid();
         final long token = Binder.clearCallingIdentity();
+        wl.acquire();
         try {
             IStatsd statsd = waitForStatsd();
             if (statsd != null) {
@@ -423,6 +429,7 @@
             Log.e(TAG, "Failed to getData with statsd");
             throw new IllegalStateException(e.getMessage(), e);
         } finally {
+            wl.release();
             Binder.restoreCallingIdentity(token);
         }
         throw new IllegalStateException("Failed to connect to statsd to getData");