When a pinned file is a jar or apk, ask the runtime for other files.

This avoids the need to put odex paths in the config files. With an ART
module, these paths can become out of date.

Bug: 144773394
Test: adb shell dumpsys pinner
Change-Id: I32ad20fc882cfc978899c519e95dfe37d7a869de
This commit is contained in:
Nicolas Geoffray
2021-03-18 21:57:30 +00:00
parent 0665793932
commit 5e316f809d

View File

@@ -270,18 +270,9 @@ public final class PinnerService extends SystemService {
* Handler for on start pinning message
*/
private void handlePinOnStart() {
final String bootImage = SystemProperties.get("dalvik.vm.boot-image", "");
String[] filesToPin = null;
if (bootImage.endsWith("boot-image.prof")) {
// Use the files listed for that specific boot image.
// TODO: find a better way to know we're using the JIT zygote configuration.
filesToPin = mContext.getResources().getStringArray(
com.android.internal.R.array.config_jitzygoteBootImagePinnerServiceFiles);
} else {
// Files to pin come from the overlay and can be specified per-device config
filesToPin = mContext.getResources().getStringArray(
com.android.internal.R.array.config_defaultPinnerServiceFiles);
}
// Files to pin come from the overlay and can be specified per-device config
String[] filesToPin = mContext.getResources().getStringArray(
com.android.internal.R.array.config_defaultPinnerServiceFiles);
// Continue trying to pin each file even if we fail to pin some of them
for (String fileToPin : filesToPin) {
PinnedFile pf = pinFile(fileToPin,
@@ -291,10 +282,32 @@ public final class PinnerService extends SystemService {
Slog.e(TAG, "Failed to pin file = " + fileToPin);
continue;
}
synchronized (this) {
mPinnedFiles.add(pf);
}
if (fileToPin.endsWith(".jar") | fileToPin.endsWith(".apk")) {
// Check whether the runtime has compilation artifacts to pin.
String arch = VMRuntime.getInstructionSet(Build.SUPPORTED_ABIS[0]);
String[] files = null;
try {
files = DexFile.getDexFileOutputPaths(fileToPin, arch);
} catch (IOException ioe) { }
if (files == null) {
continue;
}
for (String file : files) {
PinnedFile df = pinFile(file,
Integer.MAX_VALUE,
/*attemptPinIntrospection=*/false);
if (df == null) {
Slog.i(TAG, "Failed to pin ART file = " + file);
continue;
}
synchronized (this) {
mPinnedFiles.add(df);
}
}
}
}
}