• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.art.model;
18 
19 import android.annotation.NonNull;
20 import android.annotation.SystemApi;
21 
22 import com.android.internal.annotations.Immutable;
23 
24 import com.google.auto.value.AutoValue;
25 
26 import java.util.List;
27 
28 /**
29  * Describes the dexopt status of a package.
30  *
31  * @hide
32  */
33 @SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
34 @Immutable
35 @AutoValue
36 public abstract class DexoptStatus {
37     /** @hide */
DexoptStatus()38     protected DexoptStatus() {}
39 
40     /** @hide */
create( @onNull List<DexContainerFileDexoptStatus> dexContainerFileDexoptStatuses)41     public static @NonNull DexoptStatus create(
42             @NonNull List<DexContainerFileDexoptStatus> dexContainerFileDexoptStatuses) {
43         return new AutoValue_DexoptStatus(dexContainerFileDexoptStatuses);
44     }
45 
46     /**
47      * The statuses of the dex container file dexopts. Note that there can be multiple entries
48      * for the same dex container file, but for different ABIs.
49      */
getDexContainerFileDexoptStatuses()50     @NonNull public abstract List<DexContainerFileDexoptStatus> getDexContainerFileDexoptStatuses();
51 
52     /**
53      * Describes the dexopt status of a dex container file.
54      *
55      * @hide
56      */
57     @SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
58     @Immutable
59     @AutoValue
60     public abstract static class DexContainerFileDexoptStatus {
61         /** @hide */
DexContainerFileDexoptStatus()62         protected DexContainerFileDexoptStatus() {}
63 
64         /** @hide */
create(@onNull String dexContainerFile, boolean isPrimaryDex, boolean isPrimaryAbi, @NonNull String abi, @NonNull String compilerFilter, @NonNull String compilationReason, @NonNull String locationDebugString)65         public static @NonNull DexContainerFileDexoptStatus create(@NonNull String dexContainerFile,
66                 boolean isPrimaryDex, boolean isPrimaryAbi, @NonNull String abi,
67                 @NonNull String compilerFilter, @NonNull String compilationReason,
68                 @NonNull String locationDebugString) {
69             return new AutoValue_DexoptStatus_DexContainerFileDexoptStatus(dexContainerFile,
70                     isPrimaryDex, isPrimaryAbi, abi, compilerFilter, compilationReason,
71                     locationDebugString);
72         }
73 
74         /** The absolute path to the dex container file. */
getDexContainerFile()75         public abstract @NonNull String getDexContainerFile();
76 
77         /**
78          * If true, the dex container file is a primary dex (the base APK or a split APK).
79          * Otherwise, it's a secondary dex (a APK or a JAR that the package sideloaded into its data
80          * directory).
81          */
isPrimaryDex()82         public abstract boolean isPrimaryDex();
83 
84         /**
85          * If true, the dexopt is for the primary ABI of the package (the ABI that the
86          * application is launched with). Otherwise, the dexopt is for an ABI that other
87          * applications might be launched with when using this application's code.
88          */
isPrimaryAbi()89         public abstract boolean isPrimaryAbi();
90 
91         /**
92          * Returns the ABI that the dexopt is for. Possible values are documented at
93          * https://developer.android.com/ndk/guides/abis#sa.
94          */
getAbi()95         public abstract @NonNull String getAbi();
96 
97         /**
98          * A human-readable string that describes the compiler filter.
99          *
100          * Possible values are:
101          * <ul>
102          *   <li>A valid value of the {@code --compiler-filer} option passed to {@code dex2oat}, if
103          *     the dexopt artifacts are valid. See
104          *     https://source.android.com/docs/core/dalvik/configure#compilation_options.
105          *   <li>{@code "run-from-apk"}, if the dexopt artifacts do not exist.
106          *   <li>{@code "run-from-apk-fallback"}, if the dexopt artifacts exist but are invalid
107          *     because the dex container file has changed.
108          *   <li>{@code "error"}, if an unexpected error occurs.
109          * </ul>
110          */
getCompilerFilter()111         public abstract @NonNull String getCompilerFilter();
112 
113         /**
114          * A string that describes the compilation reason.
115          *
116          * Possible values are:
117          * <ul>
118          *   <li>The compilation reason, in text format, passed to {@code dex2oat}.
119          *   <li>{@code "unknown"}: if the reason is empty or the dexopt artifacts do not exist.
120          *   <li>{@code "error"}: if an unexpected error occurs.
121          * </ul>
122          *
123          * Note that this value can differ from the requested compilation reason passed to {@link
124          * DexoptParams.Builder}. Specifically, if the requested reason is for app install (e.g.,
125          * "install"), and a DM file is passed to {@code dex2oat}, a "-dm" suffix will be appended
126          * to the actual reason (e.g., "install-dm"). Other compilation reasons remain unchanged
127          * even if a DM file is passed to {@code dex2oat}.
128          *
129          * Also note that the "-dm" suffix does <b>not</b> imply anything in the DM file being used
130          * by {@code dex2oat}. The compilation reason can still be "install-dm" even if {@code
131          * dex2oat} left all contents of the DM file unused or an empty DM file is passed to
132          * {@code dex2oat}.
133          */
getCompilationReason()134         public abstract @NonNull String getCompilationReason();
135 
136         /**
137          * A human-readable string that describes the location of the dexopt artifacts.
138          *
139          * Note that this string is for debugging purposes only. There is no stability guarantees
140          * for the format of the string. DO NOT use it programmatically.
141          */
getLocationDebugString()142         public abstract @NonNull String getLocationDebugString();
143     }
144 }
145