summaryrefslogtreecommitdiff
path: root/libartservice
diff options
context:
space:
mode:
author Jiakai Zhang <jiakaiz@google.com> 2025-03-03 22:45:53 +0000
committer Jiakai Zhang <jiakaiz@google.com> 2025-03-11 06:45:45 -0700
commita6a75dba00303a88642a1c57ad2ed390797adf47 (patch)
treedd5f1d90603c59d953dd58a7aa9fe281ed7c56c0 /libartservice
parent4b88637ae7a8fa459bcd3a22452770ec4858772f (diff)
Remove SDM status from dump.
The SDM status has two fields: sdm-status and sdm-signature. sdm-status can actually be inferred from the compiler filter and the compilation reason, as SDM files should contain special compilation reasons. sdm-signature is no longer necessary after we added install-time check on SDM files, making SDM files with the wrong signature rejected. This change essentially reverts https://r.android.com/3342909. Bug: 377474232 Test: atest ArtServiceTests Change-Id: I079f21715afd4039bb801d3c8b79ec8a49b3c687
Diffstat (limited to 'libartservice')
-rw-r--r--libartservice/service/java/com/android/server/art/ArtManagerLocal.java29
-rw-r--r--libartservice/service/java/com/android/server/art/ArtShellCommand.java21
-rw-r--r--libartservice/service/java/com/android/server/art/DumpHelper.java93
-rw-r--r--libartservice/service/javatests/com/android/server/art/DumpHelperTest.java139
4 files changed, 13 insertions, 269 deletions
diff --git a/libartservice/service/java/com/android/server/art/ArtManagerLocal.java b/libartservice/service/java/com/android/server/art/ArtManagerLocal.java
index d8a508eb4e..735da25fbb 100644
--- a/libartservice/service/java/com/android/server/art/ArtManagerLocal.java
+++ b/libartservice/service/java/com/android/server/art/ArtManagerLocal.java
@@ -1002,19 +1002,8 @@ public final class ArtManagerLocal {
@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
public void dump(
@NonNull PrintWriter pw, @NonNull PackageManagerLocal.FilteredSnapshot snapshot) {
- dump(pw, snapshot, false /* verifySdmSignatures */);
- }
-
- /**
- * Same as above, but allows to specify options.
- *
- * @hide
- */
- @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
- public void dump(@NonNull PrintWriter pw,
- @NonNull PackageManagerLocal.FilteredSnapshot snapshot, boolean verifySdmSignatures) {
try (var pin = mInjector.createArtdPin()) {
- new DumpHelper(this, verifySdmSignatures).dump(pw, snapshot);
+ new DumpHelper(this).dump(pw, snapshot);
}
}
@@ -1030,21 +1019,9 @@ public final class ArtManagerLocal {
@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
public void dumpPackage(@NonNull PrintWriter pw,
@NonNull PackageManagerLocal.FilteredSnapshot snapshot, @NonNull String packageName) {
- dumpPackage(pw, snapshot, packageName, false /* verifySdmSignatures */);
- }
-
- /**
- * Same as above, but allows to specify options.
- *
- * @hide
- */
- @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
- public void dumpPackage(@NonNull PrintWriter pw,
- @NonNull PackageManagerLocal.FilteredSnapshot snapshot, @NonNull String packageName,
- boolean verifySdmSignatures) {
try (var pin = mInjector.createArtdPin()) {
- new DumpHelper(this, verifySdmSignatures)
- .dumpPackage(pw, snapshot, Utils.getPackageStateOrThrow(snapshot, packageName));
+ new DumpHelper(this).dumpPackage(
+ pw, snapshot, Utils.getPackageStateOrThrow(snapshot, packageName));
}
}
diff --git a/libartservice/service/java/com/android/server/art/ArtShellCommand.java b/libartservice/service/java/com/android/server/art/ArtShellCommand.java
index 0bbb6213d2..f83f5cf083 100644
--- a/libartservice/service/java/com/android/server/art/ArtShellCommand.java
+++ b/libartservice/service/java/com/android/server/art/ArtShellCommand.java
@@ -171,23 +171,11 @@ public final class ArtShellCommand extends BasicShellCommandHandler {
return 0;
}
case "dump": {
- boolean verifySdmSignatures = false;
-
- String opt;
- while ((opt = getNextOption()) != null) {
- switch (opt) {
- case "--verify-sdm-signatures":
- verifySdmSignatures = true;
- break;
- }
- }
-
String packageName = getNextArg();
if (packageName != null) {
- mInjector.getArtManagerLocal().dumpPackage(
- pw, snapshot, packageName, verifySdmSignatures);
+ mInjector.getArtManagerLocal().dumpPackage(pw, snapshot, packageName);
} else {
- mInjector.getArtManagerLocal().dump(pw, snapshot, verifySdmSignatures);
+ mInjector.getArtManagerLocal().dump(pw, snapshot);
}
return 0;
}
@@ -1084,13 +1072,10 @@ public final class ArtShellCommand extends BasicShellCommandHandler {
pw.println(" Cleanup obsolete files, such as dexopt artifacts that are outdated or");
pw.println(" correspond to dex container files that no longer exist.");
pw.println();
- pw.println(" dump [--verify-sdm-signatures] [PACKAGE_NAME]");
+ pw.println(" dump [PACKAGE_NAME]");
pw.println(" Dump the dexopt state in text format to stdout.");
pw.println(" If PACKAGE_NAME is empty, the command is for all packages. Otherwise, it");
pw.println(" is for the given package.");
- pw.println(" Options:");
- pw.println(" --verify-sdm-signatures Also verify SDM file signatures and include");
- pw.println(" their statuses.");
pw.println();
pw.println(" dexopt-packages -r REASON");
pw.println(" Run batch dexopt for the given reason.");
diff --git a/libartservice/service/java/com/android/server/art/DumpHelper.java b/libartservice/service/java/com/android/server/art/DumpHelper.java
index 77cc37f4b3..9c3bb3f087 100644
--- a/libartservice/service/java/com/android/server/art/DumpHelper.java
+++ b/libartservice/service/java/com/android/server/art/DumpHelper.java
@@ -20,12 +20,7 @@ import static com.android.server.art.DexUseManagerLocal.CheckedSecondaryDexInfo;
import static com.android.server.art.DexUseManagerLocal.DexLoader;
import static com.android.server.art.model.DexoptStatus.DexContainerFileDexoptStatus;
-import android.annotation.FlaggedApi;
import android.annotation.NonNull;
-import android.annotation.SuppressLint;
-import android.content.pm.PackageManager;
-import android.content.pm.SigningInfo;
-import android.content.pm.SigningInfoException;
import android.os.Build;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
@@ -39,7 +34,6 @@ import com.android.server.pm.pkg.PackageState;
import dalvik.system.VMRuntime;
-import java.io.File;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Comparator;
@@ -60,16 +54,14 @@ import java.util.stream.Collectors;
@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
public class DumpHelper {
@NonNull private final Injector mInjector;
- private final boolean mVerifySdmSignatures;
- public DumpHelper(@NonNull ArtManagerLocal artManagerLocal, boolean verifySdmSignatures) {
- this(new Injector(artManagerLocal), verifySdmSignatures);
+ public DumpHelper(@NonNull ArtManagerLocal artManagerLocal) {
+ this(new Injector(artManagerLocal));
}
@VisibleForTesting
- public DumpHelper(@NonNull Injector injector, boolean verifySdmSignatures) {
+ public DumpHelper(@NonNull Injector injector) {
mInjector = injector;
- mVerifySdmSignatures = verifySdmSignatures;
}
/** Handles {@link ArtManagerLocal#dump(PrintWriter, PackageManagerLocal.FilteredSnapshot)}. */
@@ -205,9 +197,6 @@ public class DumpHelper {
fileStatus.isPrimaryAbi() ? " [primary-abi]" : "");
ipw.increaseIndent();
ipw.printf("[location is %s]\n", fileStatus.getLocationDebugString());
- if (fileStatus.isPrimaryDex()) {
- dumpSdmStatus(ipw, fileStatus.getDexContainerFile(), isa);
- }
ipw.decreaseIndent();
}
}
@@ -228,69 +217,6 @@ public class DumpHelper {
}
}
- private void dumpSdmStatus(
- @NonNull IndentingPrintWriter ipw, @NonNull String dexPath, @NonNull String isa) {
- if (!android.content.pm.Flags.cloudCompilationPm()) {
- return;
- }
-
- String sdmPath = getSdmPath(dexPath, isa);
- String status = "";
- String signature = "skipped";
- if (mInjector.fileExists(sdmPath)) {
- // "Pending" means yet to be picked up by dexopt. For now, "pending" is the only status
- // because SDM files are not supported yet.
- status = "pending";
- // This operation is expensive, so hide it behind a flag.
- if (mVerifySdmSignatures) {
- signature = getSdmSignatureStatus(dexPath, sdmPath);
- }
- }
- if (!status.isEmpty()) {
- ipw.printf("sdm: [sdm-status=%s] [sdm-signature=%s]\n", status, signature);
- }
- }
-
- // The new API usage is safe because it's guarded by a flag. The "NewApi" lint is wrong because
- // it's meaningless (b/380891026). We have to work around the lint error because there is no
- // `isAtLeastB` to check yet.
- // TODO(jiakaiz): Remove this workaround, change @FlaggedApi to @RequiresApi here, and check
- // `isAtLeastB` at the call site after B SDK is finalized.
- @FlaggedApi(android.content.pm.Flags.FLAG_CLOUD_COMPILATION_PM)
- @SuppressLint("NewApi")
- @NonNull
- private String getSdmSignatureStatus(@NonNull String dexPath, @NonNull String sdmPath) {
- SigningInfo sdmSigningInfo;
- try {
- sdmSigningInfo =
- mInjector.getVerifiedSigningInfo(sdmPath, SigningInfo.VERSION_SIGNING_BLOCK_V3);
- } catch (SigningInfoException e) {
- AsLog.w("Failed to verify SDM signature", e);
- return "invalid-sdm-signature";
- }
-
- SigningInfo apkSigningInfo;
- try {
- apkSigningInfo =
- mInjector.getVerifiedSigningInfo(dexPath, SigningInfo.VERSION_SIGNING_BLOCK_V3);
- } catch (SigningInfoException e) {
- AsLog.w("Failed to verify SDM signature", e);
- return "invalid-apk-signature";
- }
-
- if (!sdmSigningInfo.signersMatchExactly(apkSigningInfo)) {
- return "mismatched-signers";
- }
-
- return "verified";
- }
-
- @NonNull
- private static String getSdmPath(@NonNull String dexPath, @NonNull String isa) {
- return Utils.replaceFileExtension(
- dexPath, "." + isa + ArtConstants.SECURE_DEX_METADATA_FILE_EXT);
- }
-
@NonNull
private String getLoaderState(
@NonNull PackageManagerLocal.FilteredSnapshot snapshot, @NonNull DexLoader loader) {
@@ -326,18 +252,5 @@ public class DumpHelper {
public DexUseManagerLocal getDexUseManager() {
return GlobalInjector.getInstance().getDexUseManager();
}
-
- public boolean fileExists(@NonNull String path) {
- return new File(path).exists();
- }
-
- // TODO(jiakaiz): See another comment about "NewApi" above.
- @FlaggedApi(android.content.pm.Flags.FLAG_CLOUD_COMPILATION_PM)
- @SuppressLint("NewApi")
- @NonNull
- public SigningInfo getVerifiedSigningInfo(
- @NonNull String path, int minAppSigningSchemeVersion) throws SigningInfoException {
- return PackageManager.getVerifiedSigningInfo(path, minAppSigningSchemeVersion);
- }
}
}
diff --git a/libartservice/service/javatests/com/android/server/art/DumpHelperTest.java b/libartservice/service/javatests/com/android/server/art/DumpHelperTest.java
index 9dbecaf49c..55224b93f7 100644
--- a/libartservice/service/javatests/com/android/server/art/DumpHelperTest.java
+++ b/libartservice/service/javatests/com/android/server/art/DumpHelperTest.java
@@ -24,19 +24,12 @@ import static com.android.server.art.model.DexoptStatus.DexContainerFileDexoptSt
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.argThat;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
import android.annotation.NonNull;
-import android.annotation.SuppressLint;
-import android.content.pm.SigningInfo;
-import android.content.pm.SigningInfoException;
import android.os.SystemProperties;
import androidx.test.filters.SmallTest;
@@ -77,8 +70,8 @@ public class DumpHelperTest {
@Mock private ArtManagerLocal mArtManagerLocal;
@Mock private DexUseManagerLocal mDexUseManagerLocal;
@Mock private PackageManagerLocal.FilteredSnapshot mSnapshot;
- @Mock private SigningInfo mSigningInfoA;
- @Mock private SigningInfo mSigningInfoB;
+
+ private DumpHelper mDumpHelper;
@Before
public void setUp() throws Exception {
@@ -106,10 +99,7 @@ public class DumpHelperTest {
setUpForBar();
setUpForSdk();
- lenient().when(mSigningInfoA.signersMatchExactly(mSigningInfoA)).thenReturn(true);
- lenient().when(mSigningInfoA.signersMatchExactly(mSigningInfoB)).thenReturn(false);
- lenient().when(mSigningInfoB.signersMatchExactly(mSigningInfoB)).thenReturn(true);
- lenient().when(mSigningInfoB.signersMatchExactly(mSigningInfoA)).thenReturn(false);
+ mDumpHelper = new DumpHelper(mInjector);
}
@Test
@@ -157,122 +147,10 @@ public class DumpHelperTest {
+ "Current GC: CollectorTypeCMC\n";
var stringWriter = new StringWriter();
- createDumpHelper(false /* verifySdmSignatures */)
- .dump(new PrintWriter(stringWriter), mSnapshot);
+ mDumpHelper.dump(new PrintWriter(stringWriter), mSnapshot);
assertThat(stringWriter.toString()).isEqualTo(expected);
}
- @Test
- public void testDumpSdmStatusNotFound() throws Exception {
- when(mInjector.fileExists(any())).thenReturn(false);
-
- var stringWriter = new StringWriter();
- createDumpHelper(true /* verifySdmSignatures */)
- .dumpPackage(
- new PrintWriter(stringWriter), mSnapshot, getPackageState(PKG_NAME_BAR));
- assertThat(stringWriter.toString()).doesNotContain("sdm:");
- }
-
- @Test
- public void testDumpSdmStatusInvalidSdmSignature() throws Exception {
- doReturn(false).when(mInjector).fileExists("/somewhere/app/bar/base.arm.sdm");
- doReturn(true).when(mInjector).fileExists("/somewhere/app/bar/base.arm64.sdm");
- when(mInjector.getVerifiedSigningInfo(eq("/somewhere/app/bar/base.arm64.sdm"), anyInt()))
- .thenThrow(SigningInfoException.class);
-
- var stringWriter = new StringWriter();
- createDumpHelper(true /* verifySdmSignatures */)
- .dumpPackage(
- new PrintWriter(stringWriter), mSnapshot, getPackageState(PKG_NAME_BAR));
- assertThat(stringWriter.toString())
- .contains("sdm: [sdm-status=pending] [sdm-signature=invalid-sdm-signature]");
- }
-
- @Test
- public void testDumpSdmStatusInvalidApkSignature() throws Exception {
- doReturn(false).when(mInjector).fileExists("/somewhere/app/bar/base.arm.sdm");
- doReturn(true).when(mInjector).fileExists("/somewhere/app/bar/base.arm64.sdm");
- doReturn(mSigningInfoA)
- .when(mInjector)
- .getVerifiedSigningInfo(eq("/somewhere/app/bar/base.arm64.sdm"), anyInt());
- doThrow(SigningInfoException.class)
- .when(mInjector)
- .getVerifiedSigningInfo(eq("/somewhere/app/bar/base.apk"), anyInt());
-
- var stringWriter = new StringWriter();
- createDumpHelper(true /* verifySdmSignatures */)
- .dumpPackage(
- new PrintWriter(stringWriter), mSnapshot, getPackageState(PKG_NAME_BAR));
- assertThat(stringWriter.toString())
- .contains("sdm: [sdm-status=pending] [sdm-signature=invalid-apk-signature]");
- }
-
- @Test
- public void testDumpSdmStatusSignersNotMatch() throws Exception {
- doReturn(false).when(mInjector).fileExists("/somewhere/app/bar/base.arm.sdm");
- doReturn(true).when(mInjector).fileExists("/somewhere/app/bar/base.arm64.sdm");
- doReturn(mSigningInfoA)
- .when(mInjector)
- .getVerifiedSigningInfo(eq("/somewhere/app/bar/base.arm64.sdm"), anyInt());
- doReturn(mSigningInfoB)
- .when(mInjector)
- .getVerifiedSigningInfo(eq("/somewhere/app/bar/base.apk"), anyInt());
-
- var stringWriter = new StringWriter();
- createDumpHelper(true /* verifySdmSignatures */)
- .dumpPackage(
- new PrintWriter(stringWriter), mSnapshot, getPackageState(PKG_NAME_BAR));
- assertThat(stringWriter.toString())
- .contains("sdm: [sdm-status=pending] [sdm-signature=mismatched-signers]");
- }
-
- @Test
- public void testDumpSdmStatusVerified() throws Exception {
- doReturn(false).when(mInjector).fileExists("/somewhere/app/bar/base.arm.sdm");
- doReturn(true).when(mInjector).fileExists("/somewhere/app/bar/base.arm64.sdm");
- doReturn(mSigningInfoA)
- .when(mInjector)
- .getVerifiedSigningInfo(eq("/somewhere/app/bar/base.arm64.sdm"), anyInt());
- doReturn(mSigningInfoA)
- .when(mInjector)
- .getVerifiedSigningInfo(eq("/somewhere/app/bar/base.apk"), anyInt());
-
- var stringWriter = new StringWriter();
- createDumpHelper(true /* verifySdmSignatures */)
- .dumpPackage(
- new PrintWriter(stringWriter), mSnapshot, getPackageState(PKG_NAME_BAR));
- assertThat(stringWriter.toString())
- .containsMatch(" \\Qpath: /somewhere/app/bar/base.apk\\E\n"
- + " arm:.*\n"
- + " .*\n"
- + " arm64:.*\n"
- + " .*\n"
- + " \\Qsdm: [sdm-status=pending] "
- + "[sdm-signature=verified]\\E\n");
- }
-
- @Test
- public void testDumpSdmStatusMultiArch() throws Exception {
- doReturn(true).when(mInjector).fileExists("/somewhere/app/bar/base.arm.sdm");
- doReturn(true).when(mInjector).fileExists("/somewhere/app/bar/base.arm64.sdm");
- doReturn(mSigningInfoA).when(mInjector).getVerifiedSigningInfo(any(), anyInt());
-
- var stringWriter = new StringWriter();
- createDumpHelper(true /* verifySdmSignatures */)
- .dumpPackage(
- new PrintWriter(stringWriter), mSnapshot, getPackageState(PKG_NAME_BAR));
- assertThat(stringWriter.toString())
- .containsMatch(" \\Qpath: /somewhere/app/bar/base.apk\\E\n"
- + " arm:.*\n"
- + " .*\n"
- + " \\Qsdm: [sdm-status=pending] "
- + "[sdm-signature=verified]\\E\n"
- + " arm64:.*\n"
- + " .*\n"
- + " \\Qsdm: [sdm-status=pending] "
- + "[sdm-signature=verified]\\E\n");
- }
-
private PackageState createPackageState(@NonNull String packageName, int appId, boolean isApex,
boolean hasPackage, @NonNull String primaryAbi, @NonNull String secondaryAbi) {
var pkgState = mock(PackageState.class);
@@ -440,13 +318,4 @@ public class DumpHelperTest {
PKG_NAME_SDK, "/somewhere/app/sdk/base.apk"))
.thenReturn(Set.of());
}
-
- @SuppressLint("DirectInvocationOnMock")
- private PackageState getPackageState(String packageName) {
- return mSnapshot.getPackageState(packageName);
- }
-
- private DumpHelper createDumpHelper(boolean verifySdmSignatures) {
- return new DumpHelper(mInjector, verifySdmSignatures);
- }
}