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

Commit 5e316f80 authored by Nicolas Geoffray's avatar Nicolas Geoffray
Browse files

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
parent 06657939
Loading
Loading
Loading
Loading
+26 −13
Original line number Diff line number Diff line
@@ -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(
        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);
                    }
                }
            }
        }
    }