summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/BinaryTransparencyService.java125
1 files changed, 46 insertions, 79 deletions
diff --git a/services/core/java/com/android/server/BinaryTransparencyService.java b/services/core/java/com/android/server/BinaryTransparencyService.java
index d485441a605f..68722d207ae3 100644
--- a/services/core/java/com/android/server/BinaryTransparencyService.java
+++ b/services/core/java/com/android/server/BinaryTransparencyService.java
@@ -29,11 +29,8 @@ import android.app.job.JobService;
import android.compat.annotation.ChangeId;
import android.content.ComponentName;
import android.content.Context;
-import android.content.pm.ApexStagedEvent;
import android.content.pm.ApplicationInfo;
import android.content.pm.IBackgroundInstallControlService;
-import android.content.pm.IPackageManagerNative;
-import android.content.pm.IStagedApexObserver;
import android.content.pm.InstallSourceInfo;
import android.content.pm.ModuleInfo;
import android.content.pm.PackageInfo;
@@ -132,6 +129,7 @@ public class BinaryTransparencyService extends SystemService {
private String mVbmetaDigest;
// the system time (in ms) the last measurement was taken
private long mMeasurementsLastRecordedMs;
+ private PackageManagerInternal mPackageManagerInternal;
/**
* Guards whether or not measurements of MBA to be performed. When this change is enabled,
@@ -1049,6 +1047,7 @@ public class BinaryTransparencyService extends SystemService {
mServiceImpl = new BinaryTransparencyServiceImpl();
mVbmetaDigest = VBMETA_DIGEST_UNINITIALIZED;
mMeasurementsLastRecordedMs = 0;
+ mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
}
/**
@@ -1063,6 +1062,38 @@ public class BinaryTransparencyService extends SystemService {
} catch (Throwable t) {
Slog.e(TAG, "Failed to start BinaryTransparencyService.", t);
}
+
+ // register a package observer to detect updates to preloads
+ mPackageManagerInternal.getPackageList(new PackageManagerInternal.PackageListObserver() {
+ @Override
+ public void onPackageAdded(String packageName, int uid) {
+
+ }
+
+ @Override
+ public void onPackageChanged(String packageName, int uid) {
+ // check if the updated package is a preloaded app.
+ PackageManager pm = mContext.getPackageManager();
+ try {
+ pm.getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(
+ PackageManager.MATCH_FACTORY_ONLY));
+ } catch (PackageManager.NameNotFoundException e) {
+ // this means that this package is not a preloaded app
+ return;
+ }
+
+ Slog.d(TAG, "Preload " + packageName + " was updated. Scheduling measurement...");
+ UpdateMeasurementsJobService.scheduleBinaryMeasurements(mContext,
+ BinaryTransparencyService.this);
+ }
+
+ @Override
+ public void onPackageRemoved(String packageName, int uid) {
+
+ }
+ });
+
+ // TODO(b/264428429): Register observer for updates to APEXs.
}
/**
@@ -1073,22 +1104,19 @@ public class BinaryTransparencyService extends SystemService {
*/
@Override
public void onBootPhase(int phase) {
- // so far we are only doing things in the PHASE_BOOT_COMPLETED phase
- if (phase != PHASE_BOOT_COMPLETED) {
- return;
- }
-
- Slog.i(TAG, "Boot completed. Getting VBMeta Digest.");
- getVBMetaDigestInformation();
- // to avoid the risk of holding up boot time, computations to measure APEX, Module, and
- // MBA digests are scheduled here, but only executed when the device is idle and plugged
- // in.
- Slog.i(TAG, "Scheduling measurements to be taken.");
- UpdateMeasurementsJobService.scheduleBinaryMeasurements(mContext,
- BinaryTransparencyService.this);
-
- registerPackageUpdateObservers();
+ // we are only interested in doing things at PHASE_BOOT_COMPLETED
+ if (phase == PHASE_BOOT_COMPLETED) {
+ Slog.i(TAG, "Boot completed. Getting VBMeta Digest.");
+ getVBMetaDigestInformation();
+
+ // to avoid the risk of holding up boot time, computations to measure APEX, Module, and
+ // MBA digests are scheduled here, but only executed when the device is idle and plugged
+ // in.
+ Slog.i(TAG, "Scheduling measurements to be taken.");
+ UpdateMeasurementsJobService.scheduleBinaryMeasurements(mContext,
+ BinaryTransparencyService.this);
+ }
}
/**
@@ -1184,67 +1212,6 @@ public class BinaryTransparencyService extends SystemService {
FrameworkStatsLog.write(FrameworkStatsLog.VBMETA_DIGEST_REPORTED, mVbmetaDigest);
}
- /**
- * Register observers for APK and APEX updates.
- * The observers will be invoked when i) APK update and ii) APEX staging happens. This will
- * then be used as signals to schedule measurement for the relevant binaries.
- */
- private void registerPackageUpdateObservers() {
- Slog.d(TAG, "Registering APK updates...");
- // first, register a package observer to detect updates to preloads
- PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
- pmi.getPackageList(new PackageManagerInternal.PackageListObserver() {
- @Override
- public void onPackageAdded(String packageName, int uid) {
- }
-
- @Override
- public void onPackageChanged(String packageName, int uid) {
- // check if the updated package is a preloaded app.
- PackageManager pm = mContext.getPackageManager();
- try {
- pm.getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(
- PackageManager.MATCH_FACTORY_ONLY));
- } catch (PackageManager.NameNotFoundException e) {
- // this means that this package is not a preloaded app
- return;
- }
-
- Slog.d(TAG, "Preload " + packageName + " was updated. Scheduling measurement...");
- UpdateMeasurementsJobService.scheduleBinaryMeasurements(mContext,
- BinaryTransparencyService.this);
- }
-
- @Override
- public void onPackageRemoved(String packageName, int uid) {
- }
- });
-
- // then, register an observer for staged APEXs
- Slog.d(TAG, "Registering APEX updates...");
- IPackageManagerNative iPackageManagerNative = IPackageManagerNative.Stub.asInterface(
- ServiceManager.getService("package_native"));
- if (iPackageManagerNative == null) {
- Slog.e(TAG, "IPackageManagerNative is null");
- return;
- }
-
- try {
- iPackageManagerNative.registerStagedApexObserver(new IStagedApexObserver.Stub() {
- @Override
- public void onApexStaged(ApexStagedEvent event) throws RemoteException {
- Slog.d(TAG, "A new APEX has been staged for update. There are currently "
- + event.stagedApexModuleNames.length + " APEX(s) staged for update. "
- + "Scheduling measurement...");
- UpdateMeasurementsJobService.scheduleBinaryMeasurements(mContext,
- BinaryTransparencyService.this);
- }
- });
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to register a StagedApexObserver.");
- }
- }
-
private String translateContentDigestAlgorithmIdToString(int algorithmId) {
switch (algorithmId) {
case ApkSigningBlockUtils.CONTENT_DIGEST_CHUNKED_SHA256: