Home | History | Annotate | Download | only in installd
      1 /*
      2  * Copyright (C) 2016 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 #define LOG_TAG "installed"
     17 
     18 #include <fcntl.h>
     19 #include <stdlib.h>
     20 #include <string.h>
     21 #include <sys/capability.h>
     22 #include <sys/file.h>
     23 #include <sys/stat.h>
     24 #include <sys/time.h>
     25 #include <sys/types.h>
     26 #include <sys/resource.h>
     27 #include <sys/wait.h>
     28 #include <unistd.h>
     29 
     30 #include <android-base/logging.h>
     31 #include <android-base/stringprintf.h>
     32 #include <android-base/strings.h>
     33 #include <android-base/unique_fd.h>
     34 #include <cutils/fs.h>
     35 #include <cutils/properties.h>
     36 #include <cutils/sched_policy.h>
     37 #include <log/log.h>               // TODO: Move everything to base/logging.
     38 #include <private/android_filesystem_config.h>
     39 #include <selinux/android.h>
     40 #include <system/thread_defs.h>
     41 
     42 #include "dexopt.h"
     43 #include "installd_deps.h"
     44 #include "otapreopt_utils.h"
     45 #include "utils.h"
     46 
     47 using android::base::StringPrintf;
     48 using android::base::EndsWith;
     49 using android::base::unique_fd;
     50 
     51 namespace android {
     52 namespace installd {
     53 
     54 // Deleter using free() for use with std::unique_ptr<>. See also UniqueCPtr<> below.
     55 struct FreeDelete {
     56   // NOTE: Deleting a const object is valid but free() takes a non-const pointer.
     57   void operator()(const void* ptr) const {
     58     free(const_cast<void*>(ptr));
     59   }
     60 };
     61 
     62 // Alias for std::unique_ptr<> that uses the C function free() to delete objects.
     63 template <typename T>
     64 using UniqueCPtr = std::unique_ptr<T, FreeDelete>;
     65 
     66 static unique_fd invalid_unique_fd() {
     67     return unique_fd(-1);
     68 }
     69 
     70 static bool clear_profile(const std::string& profile) {
     71     unique_fd ufd(open(profile.c_str(), O_WRONLY | O_NOFOLLOW | O_CLOEXEC));
     72     if (ufd.get() < 0) {
     73         if (errno != ENOENT) {
     74             PLOG(WARNING) << "Could not open profile " << profile;
     75             return false;
     76         } else {
     77             // Nothing to clear. That's ok.
     78             return true;
     79         }
     80     }
     81 
     82     if (flock(ufd.get(), LOCK_EX | LOCK_NB) != 0) {
     83         if (errno != EWOULDBLOCK) {
     84             PLOG(WARNING) << "Error locking profile " << profile;
     85         }
     86         // This implies that the app owning this profile is running
     87         // (and has acquired the lock).
     88         //
     89         // If we can't acquire the lock bail out since clearing is useless anyway
     90         // (the app will write again to the profile).
     91         //
     92         // Note:
     93         // This does not impact the this is not an issue for the profiling correctness.
     94         // In case this is needed because of an app upgrade, profiles will still be
     95         // eventually cleared by the app itself due to checksum mismatch.
     96         // If this is needed because profman advised, then keeping the data around
     97         // until the next run is again not an issue.
     98         //
     99         // If the app attempts to acquire a lock while we've held one here,
    100         // it will simply skip the current write cycle.
    101         return false;
    102     }
    103 
    104     bool truncated = ftruncate(ufd.get(), 0) == 0;
    105     if (!truncated) {
    106         PLOG(WARNING) << "Could not truncate " << profile;
    107     }
    108     if (flock(ufd.get(), LOCK_UN) != 0) {
    109         PLOG(WARNING) << "Error unlocking profile " << profile;
    110     }
    111     return truncated;
    112 }
    113 
    114 // Clear the reference profile for the given location.
    115 // The location is the package name for primary apks or the dex path for secondary dex files.
    116 static bool clear_reference_profile(const std::string& location, bool is_secondary_dex) {
    117     return clear_profile(create_reference_profile_path(location, is_secondary_dex));
    118 }
    119 
    120 // Clear the reference profile for the given location.
    121 // The location is the package name for primary apks or the dex path for secondary dex files.
    122 static bool clear_current_profile(const std::string& pkgname, userid_t user,
    123         bool is_secondary_dex) {
    124     return clear_profile(create_current_profile_path(user, pkgname, is_secondary_dex));
    125 }
    126 
    127 // Clear the reference profile for the primary apk of the given package.
    128 bool clear_primary_reference_profile(const std::string& pkgname) {
    129     return clear_reference_profile(pkgname, /*is_secondary_dex*/false);
    130 }
    131 
    132 // Clear all current profile for the primary apk of the given package.
    133 bool clear_primary_current_profiles(const std::string& pkgname) {
    134     bool success = true;
    135     // For secondary dex files, we don't really need the user but we use it for sanity checks.
    136     std::vector<userid_t> users = get_known_users(/*volume_uuid*/ nullptr);
    137     for (auto user : users) {
    138         success &= clear_current_profile(pkgname, user, /*is_secondary_dex*/false);
    139     }
    140     return success;
    141 }
    142 
    143 // Clear the current profile for the primary apk of the given package and user.
    144 bool clear_primary_current_profile(const std::string& pkgname, userid_t user) {
    145     return clear_current_profile(pkgname, user, /*is_secondary_dex*/false);
    146 }
    147 
    148 static int split_count(const char *str)
    149 {
    150   char *ctx;
    151   int count = 0;
    152   char buf[kPropertyValueMax];
    153 
    154   strncpy(buf, str, sizeof(buf));
    155   char *pBuf = buf;
    156 
    157   while(strtok_r(pBuf, " ", &ctx) != NULL) {
    158     count++;
    159     pBuf = NULL;
    160   }
    161 
    162   return count;
    163 }
    164 
    165 static int split(char *buf, const char **argv)
    166 {
    167   char *ctx;
    168   int count = 0;
    169   char *tok;
    170   char *pBuf = buf;
    171 
    172   while((tok = strtok_r(pBuf, " ", &ctx)) != NULL) {
    173     argv[count++] = tok;
    174     pBuf = NULL;
    175   }
    176 
    177   return count;
    178 }
    179 
    180 static const char* get_location_from_path(const char* path) {
    181     static constexpr char kLocationSeparator = '/';
    182     const char *location = strrchr(path, kLocationSeparator);
    183     if (location == NULL) {
    184         return path;
    185     } else {
    186         // Skip the separator character.
    187         return location + 1;
    188     }
    189 }
    190 
    191 static void run_dex2oat(int zip_fd, int oat_fd, int input_vdex_fd, int output_vdex_fd, int image_fd,
    192         const char* input_file_name, const char* output_file_name, int swap_fd,
    193         const char* instruction_set, const char* compiler_filter,
    194         bool debuggable, bool post_bootcomplete, int profile_fd, const char* shared_libraries) {
    195     static const unsigned int MAX_INSTRUCTION_SET_LEN = 7;
    196 
    197     if (strlen(instruction_set) >= MAX_INSTRUCTION_SET_LEN) {
    198         ALOGE("Instruction set %s longer than max length of %d",
    199               instruction_set, MAX_INSTRUCTION_SET_LEN);
    200         return;
    201     }
    202 
    203     // Get the relative path to the input file.
    204     const char* relative_input_file_name = get_location_from_path(input_file_name);
    205 
    206     char dex2oat_Xms_flag[kPropertyValueMax];
    207     bool have_dex2oat_Xms_flag = get_property("dalvik.vm.dex2oat-Xms", dex2oat_Xms_flag, NULL) > 0;
    208 
    209     char dex2oat_Xmx_flag[kPropertyValueMax];
    210     bool have_dex2oat_Xmx_flag = get_property("dalvik.vm.dex2oat-Xmx", dex2oat_Xmx_flag, NULL) > 0;
    211 
    212     char dex2oat_threads_buf[kPropertyValueMax];
    213     bool have_dex2oat_threads_flag = get_property(post_bootcomplete
    214                                                       ? "dalvik.vm.dex2oat-threads"
    215                                                       : "dalvik.vm.boot-dex2oat-threads",
    216                                                   dex2oat_threads_buf,
    217                                                   NULL) > 0;
    218     char dex2oat_threads_arg[kPropertyValueMax + 2];
    219     if (have_dex2oat_threads_flag) {
    220         sprintf(dex2oat_threads_arg, "-j%s", dex2oat_threads_buf);
    221     }
    222 
    223     char dex2oat_isa_features_key[kPropertyKeyMax];
    224     sprintf(dex2oat_isa_features_key, "dalvik.vm.isa.%s.features", instruction_set);
    225     char dex2oat_isa_features[kPropertyValueMax];
    226     bool have_dex2oat_isa_features = get_property(dex2oat_isa_features_key,
    227                                                   dex2oat_isa_features, NULL) > 0;
    228 
    229     char dex2oat_isa_variant_key[kPropertyKeyMax];
    230     sprintf(dex2oat_isa_variant_key, "dalvik.vm.isa.%s.variant", instruction_set);
    231     char dex2oat_isa_variant[kPropertyValueMax];
    232     bool have_dex2oat_isa_variant = get_property(dex2oat_isa_variant_key,
    233                                                  dex2oat_isa_variant, NULL) > 0;
    234 
    235     const char *dex2oat_norelocation = "-Xnorelocate";
    236     bool have_dex2oat_relocation_skip_flag = false;
    237 
    238     char dex2oat_flags[kPropertyValueMax];
    239     int dex2oat_flags_count = get_property("dalvik.vm.dex2oat-flags",
    240                                  dex2oat_flags, NULL) <= 0 ? 0 : split_count(dex2oat_flags);
    241     ALOGV("dalvik.vm.dex2oat-flags=%s\n", dex2oat_flags);
    242 
    243     // If we are booting without the real /data, don't spend time compiling.
    244     char vold_decrypt[kPropertyValueMax];
    245     bool have_vold_decrypt = get_property("vold.decrypt", vold_decrypt, "") > 0;
    246     bool skip_compilation = (have_vold_decrypt &&
    247                              (strcmp(vold_decrypt, "trigger_restart_min_framework") == 0 ||
    248                              (strcmp(vold_decrypt, "1") == 0)));
    249 
    250     bool generate_debug_info = property_get_bool("debug.generate-debug-info", false);
    251 
    252     char app_image_format[kPropertyValueMax];
    253     char image_format_arg[strlen("--image-format=") + kPropertyValueMax];
    254     bool have_app_image_format =
    255             image_fd >= 0 && get_property("dalvik.vm.appimageformat", app_image_format, NULL) > 0;
    256     if (have_app_image_format) {
    257         sprintf(image_format_arg, "--image-format=%s", app_image_format);
    258     }
    259 
    260     char dex2oat_large_app_threshold[kPropertyValueMax];
    261     bool have_dex2oat_large_app_threshold =
    262             get_property("dalvik.vm.dex2oat-very-large", dex2oat_large_app_threshold, NULL) > 0;
    263     char dex2oat_large_app_threshold_arg[strlen("--very-large-app-threshold=") + kPropertyValueMax];
    264     if (have_dex2oat_large_app_threshold) {
    265         sprintf(dex2oat_large_app_threshold_arg,
    266                 "--very-large-app-threshold=%s",
    267                 dex2oat_large_app_threshold);
    268     }
    269 
    270     static const char* DEX2OAT_BIN = "/system/bin/dex2oat";
    271 
    272     static const char* RUNTIME_ARG = "--runtime-arg";
    273 
    274     static const int MAX_INT_LEN = 12;      // '-'+10dig+'\0' -OR- 0x+8dig
    275 
    276     // clang FORTIFY doesn't let us use strlen in constant array bounds, so we
    277     // use arraysize instead.
    278     char zip_fd_arg[arraysize("--zip-fd=") + MAX_INT_LEN];
    279     char zip_location_arg[arraysize("--zip-location=") + PKG_PATH_MAX];
    280     char input_vdex_fd_arg[arraysize("--input-vdex-fd=") + MAX_INT_LEN];
    281     char output_vdex_fd_arg[arraysize("--output-vdex-fd=") + MAX_INT_LEN];
    282     char oat_fd_arg[arraysize("--oat-fd=") + MAX_INT_LEN];
    283     char oat_location_arg[arraysize("--oat-location=") + PKG_PATH_MAX];
    284     char instruction_set_arg[arraysize("--instruction-set=") + MAX_INSTRUCTION_SET_LEN];
    285     char instruction_set_variant_arg[arraysize("--instruction-set-variant=") + kPropertyValueMax];
    286     char instruction_set_features_arg[arraysize("--instruction-set-features=") + kPropertyValueMax];
    287     char dex2oat_Xms_arg[arraysize("-Xms") + kPropertyValueMax];
    288     char dex2oat_Xmx_arg[arraysize("-Xmx") + kPropertyValueMax];
    289     char dex2oat_compiler_filter_arg[arraysize("--compiler-filter=") + kPropertyValueMax];
    290     bool have_dex2oat_swap_fd = false;
    291     char dex2oat_swap_fd[arraysize("--swap-fd=") + MAX_INT_LEN];
    292     bool have_dex2oat_image_fd = false;
    293     char dex2oat_image_fd[arraysize("--app-image-fd=") + MAX_INT_LEN];
    294 
    295     sprintf(zip_fd_arg, "--zip-fd=%d", zip_fd);
    296     sprintf(zip_location_arg, "--zip-location=%s", relative_input_file_name);
    297     sprintf(input_vdex_fd_arg, "--input-vdex-fd=%d", input_vdex_fd);
    298     sprintf(output_vdex_fd_arg, "--output-vdex-fd=%d", output_vdex_fd);
    299     sprintf(oat_fd_arg, "--oat-fd=%d", oat_fd);
    300     sprintf(oat_location_arg, "--oat-location=%s", output_file_name);
    301     sprintf(instruction_set_arg, "--instruction-set=%s", instruction_set);
    302     sprintf(instruction_set_variant_arg, "--instruction-set-variant=%s", dex2oat_isa_variant);
    303     sprintf(instruction_set_features_arg, "--instruction-set-features=%s", dex2oat_isa_features);
    304     if (swap_fd >= 0) {
    305         have_dex2oat_swap_fd = true;
    306         sprintf(dex2oat_swap_fd, "--swap-fd=%d", swap_fd);
    307     }
    308     if (image_fd >= 0) {
    309         have_dex2oat_image_fd = true;
    310         sprintf(dex2oat_image_fd, "--app-image-fd=%d", image_fd);
    311     }
    312 
    313     if (have_dex2oat_Xms_flag) {
    314         sprintf(dex2oat_Xms_arg, "-Xms%s", dex2oat_Xms_flag);
    315     }
    316     if (have_dex2oat_Xmx_flag) {
    317         sprintf(dex2oat_Xmx_arg, "-Xmx%s", dex2oat_Xmx_flag);
    318     }
    319 
    320     // Compute compiler filter.
    321 
    322     bool have_dex2oat_compiler_filter_flag = false;
    323     if (skip_compilation) {
    324         strcpy(dex2oat_compiler_filter_arg, "--compiler-filter=extract");
    325         have_dex2oat_compiler_filter_flag = true;
    326         have_dex2oat_relocation_skip_flag = true;
    327     } else if (compiler_filter != nullptr) {
    328         if (strlen(compiler_filter) + strlen("--compiler-filter=") <
    329                     arraysize(dex2oat_compiler_filter_arg)) {
    330             sprintf(dex2oat_compiler_filter_arg, "--compiler-filter=%s", compiler_filter);
    331             have_dex2oat_compiler_filter_flag = true;
    332         } else {
    333             ALOGW("Compiler filter name '%s' is too large (max characters is %zu)",
    334                   compiler_filter,
    335                   kPropertyValueMax);
    336         }
    337     }
    338 
    339     if (!have_dex2oat_compiler_filter_flag) {
    340         char dex2oat_compiler_filter_flag[kPropertyValueMax];
    341         have_dex2oat_compiler_filter_flag = get_property("dalvik.vm.dex2oat-filter",
    342                                                          dex2oat_compiler_filter_flag, NULL) > 0;
    343         if (have_dex2oat_compiler_filter_flag) {
    344             sprintf(dex2oat_compiler_filter_arg,
    345                     "--compiler-filter=%s",
    346                     dex2oat_compiler_filter_flag);
    347         }
    348     }
    349 
    350     // Check whether all apps should be compiled debuggable.
    351     if (!debuggable) {
    352         char prop_buf[kPropertyValueMax];
    353         debuggable =
    354                 (get_property("dalvik.vm.always_debuggable", prop_buf, "0") > 0) &&
    355                 (prop_buf[0] == '1');
    356     }
    357     char profile_arg[strlen("--profile-file-fd=") + MAX_INT_LEN];
    358     if (profile_fd != -1) {
    359         sprintf(profile_arg, "--profile-file-fd=%d", profile_fd);
    360     }
    361 
    362     // Get the directory of the apk to pass as a base classpath directory.
    363     char base_dir[arraysize("--classpath-dir=") + PKG_PATH_MAX];
    364     std::string apk_dir(input_file_name);
    365     unsigned long dir_index = apk_dir.rfind('/');
    366     bool has_base_dir = dir_index != std::string::npos;
    367     if (has_base_dir) {
    368         apk_dir = apk_dir.substr(0, dir_index);
    369         sprintf(base_dir, "--classpath-dir=%s", apk_dir.c_str());
    370     }
    371 
    372 
    373     ALOGV("Running %s in=%s out=%s\n", DEX2OAT_BIN, relative_input_file_name, output_file_name);
    374 
    375     const char* argv[9  // program name, mandatory arguments and the final NULL
    376                      + (have_dex2oat_isa_variant ? 1 : 0)
    377                      + (have_dex2oat_isa_features ? 1 : 0)
    378                      + (have_dex2oat_Xms_flag ? 2 : 0)
    379                      + (have_dex2oat_Xmx_flag ? 2 : 0)
    380                      + (have_dex2oat_compiler_filter_flag ? 1 : 0)
    381                      + (have_dex2oat_threads_flag ? 1 : 0)
    382                      + (have_dex2oat_swap_fd ? 1 : 0)
    383                      + (have_dex2oat_image_fd ? 1 : 0)
    384                      + (have_dex2oat_relocation_skip_flag ? 2 : 0)
    385                      + (generate_debug_info ? 1 : 0)
    386                      + (debuggable ? 1 : 0)
    387                      + (have_app_image_format ? 1 : 0)
    388                      + dex2oat_flags_count
    389                      + (profile_fd == -1 ? 0 : 1)
    390                      + (shared_libraries != nullptr ? 4 : 0)
    391                      + (has_base_dir ? 1 : 0)
    392                      + (have_dex2oat_large_app_threshold ? 1 : 0)];
    393     int i = 0;
    394     argv[i++] = DEX2OAT_BIN;
    395     argv[i++] = zip_fd_arg;
    396     argv[i++] = zip_location_arg;
    397     argv[i++] = input_vdex_fd_arg;
    398     argv[i++] = output_vdex_fd_arg;
    399     argv[i++] = oat_fd_arg;
    400     argv[i++] = oat_location_arg;
    401     argv[i++] = instruction_set_arg;
    402     if (have_dex2oat_isa_variant) {
    403         argv[i++] = instruction_set_variant_arg;
    404     }
    405     if (have_dex2oat_isa_features) {
    406         argv[i++] = instruction_set_features_arg;
    407     }
    408     if (have_dex2oat_Xms_flag) {
    409         argv[i++] = RUNTIME_ARG;
    410         argv[i++] = dex2oat_Xms_arg;
    411     }
    412     if (have_dex2oat_Xmx_flag) {
    413         argv[i++] = RUNTIME_ARG;
    414         argv[i++] = dex2oat_Xmx_arg;
    415     }
    416     if (have_dex2oat_compiler_filter_flag) {
    417         argv[i++] = dex2oat_compiler_filter_arg;
    418     }
    419     if (have_dex2oat_threads_flag) {
    420         argv[i++] = dex2oat_threads_arg;
    421     }
    422     if (have_dex2oat_swap_fd) {
    423         argv[i++] = dex2oat_swap_fd;
    424     }
    425     if (have_dex2oat_image_fd) {
    426         argv[i++] = dex2oat_image_fd;
    427     }
    428     if (generate_debug_info) {
    429         argv[i++] = "--generate-debug-info";
    430     }
    431     if (debuggable) {
    432         argv[i++] = "--debuggable";
    433     }
    434     if (have_app_image_format) {
    435         argv[i++] = image_format_arg;
    436     }
    437     if (have_dex2oat_large_app_threshold) {
    438         argv[i++] = dex2oat_large_app_threshold_arg;
    439     }
    440     if (dex2oat_flags_count) {
    441         i += split(dex2oat_flags, argv + i);
    442     }
    443     if (have_dex2oat_relocation_skip_flag) {
    444         argv[i++] = RUNTIME_ARG;
    445         argv[i++] = dex2oat_norelocation;
    446     }
    447     if (profile_fd != -1) {
    448         argv[i++] = profile_arg;
    449     }
    450     if (shared_libraries != nullptr) {
    451         argv[i++] = RUNTIME_ARG;
    452         argv[i++] = "-classpath";
    453         argv[i++] = RUNTIME_ARG;
    454         argv[i++] = shared_libraries;
    455     }
    456     if (has_base_dir) {
    457         argv[i++] = base_dir;
    458     }
    459     // Do not add after dex2oat_flags, they should override others for debugging.
    460     argv[i] = NULL;
    461 
    462     execv(DEX2OAT_BIN, (char * const *)argv);
    463     ALOGE("execv(%s) failed: %s\n", DEX2OAT_BIN, strerror(errno));
    464 }
    465 
    466 /*
    467  * Whether dexopt should use a swap file when compiling an APK.
    468  *
    469  * If kAlwaysProvideSwapFile, do this on all devices (dex2oat will make a more informed decision
    470  * itself, anyways).
    471  *
    472  * Otherwise, read "dalvik.vm.dex2oat-swap". If the property exists, return whether it is "true".
    473  *
    474  * Otherwise, return true if this is a low-mem device.
    475  *
    476  * Otherwise, return default value.
    477  */
    478 static bool kAlwaysProvideSwapFile = false;
    479 static bool kDefaultProvideSwapFile = true;
    480 
    481 static bool ShouldUseSwapFileForDexopt() {
    482     if (kAlwaysProvideSwapFile) {
    483         return true;
    484     }
    485 
    486     // Check the "override" property. If it exists, return value == "true".
    487     char dex2oat_prop_buf[kPropertyValueMax];
    488     if (get_property("dalvik.vm.dex2oat-swap", dex2oat_prop_buf, "") > 0) {
    489         if (strcmp(dex2oat_prop_buf, "true") == 0) {
    490             return true;
    491         } else {
    492             return false;
    493         }
    494     }
    495 
    496     // Shortcut for default value. This is an implementation optimization for the process sketched
    497     // above. If the default value is true, we can avoid to check whether this is a low-mem device,
    498     // as low-mem is never returning false. The compiler will optimize this away if it can.
    499     if (kDefaultProvideSwapFile) {
    500         return true;
    501     }
    502 
    503     bool is_low_mem = property_get_bool("ro.config.low_ram", false);
    504     if (is_low_mem) {
    505         return true;
    506     }
    507 
    508     // Default value must be false here.
    509     return kDefaultProvideSwapFile;
    510 }
    511 
    512 static void SetDex2OatScheduling(bool set_to_bg) {
    513     if (set_to_bg) {
    514         if (set_sched_policy(0, SP_BACKGROUND) < 0) {
    515             ALOGE("set_sched_policy failed: %s\n", strerror(errno));
    516             exit(70);
    517         }
    518         if (setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_BACKGROUND) < 0) {
    519             ALOGE("setpriority failed: %s\n", strerror(errno));
    520             exit(71);
    521         }
    522     }
    523 }
    524 
    525 static bool create_profile(int uid, const std::string& profile) {
    526     unique_fd fd(TEMP_FAILURE_RETRY(open(profile.c_str(), O_CREAT | O_NOFOLLOW, 0600)));
    527     if (fd.get() < 0) {
    528         if (errno == EEXIST) {
    529             return true;
    530         } else {
    531             PLOG(ERROR) << "Failed to create profile " << profile;
    532             return false;
    533         }
    534     }
    535     // Profiles should belong to the app; make sure of that by giving ownership to
    536     // the app uid. If we cannot do that, there's no point in returning the fd
    537     // since dex2oat/profman will fail with SElinux denials.
    538     if (fchown(fd.get(), uid, uid) < 0) {
    539         PLOG(ERROR) << "Could not chwon profile " << profile;
    540         return false;
    541     }
    542     return true;
    543 }
    544 
    545 static unique_fd open_profile(int uid, const std::string& profile, bool read_write) {
    546     // Check if we need to open the profile for a read-write operation. If so, we
    547     // might need to create the profile since the file might not be there. Reference
    548     // profiles are created on the fly so they might not exist beforehand.
    549     if (read_write) {
    550         if (!create_profile(uid, profile)) {
    551             return invalid_unique_fd();
    552         }
    553     }
    554     int flags = read_write ? O_RDWR : O_RDONLY;
    555     // Do not follow symlinks when opening a profile:
    556     //   - primary profiles should not contain symlinks in their paths
    557     //   - secondary dex paths should have been already resolved and validated
    558     flags |= O_NOFOLLOW;
    559 
    560     unique_fd fd(TEMP_FAILURE_RETRY(open(profile.c_str(), flags)));
    561     if (fd.get() < 0) {
    562         if (errno != ENOENT) {
    563             // Profiles might be missing for various reasons. For example, in a
    564             // multi-user environment, the profile directory for one user can be created
    565             // after we start a merge. In this case the current profile for that user
    566             // will not be found.
    567             // Also, the secondary dex profiles might be deleted by the app at any time,
    568             // so we can't we need to prepare if they are missing.
    569             PLOG(ERROR) << "Failed to open profile " << profile;
    570         }
    571         return invalid_unique_fd();
    572     }
    573 
    574     return fd;
    575 }
    576 
    577 static unique_fd open_current_profile(uid_t uid, userid_t user, const std::string& location,
    578         bool is_secondary_dex) {
    579     std::string profile = create_current_profile_path(user, location, is_secondary_dex);
    580     return open_profile(uid, profile, /*read_write*/false);
    581 }
    582 
    583 static unique_fd open_reference_profile(uid_t uid, const std::string& location, bool read_write,
    584         bool is_secondary_dex) {
    585     std::string profile = create_reference_profile_path(location, is_secondary_dex);
    586     return open_profile(uid, profile, read_write);
    587 }
    588 
    589 static void open_profile_files(uid_t uid, const std::string& location, bool is_secondary_dex,
    590             /*out*/ std::vector<unique_fd>* profiles_fd, /*out*/ unique_fd* reference_profile_fd) {
    591     // Open the reference profile in read-write mode as profman might need to save the merge.
    592     *reference_profile_fd = open_reference_profile(uid, location, /*read_write*/ true,
    593             is_secondary_dex);
    594 
    595     // For secondary dex files, we don't really need the user but we use it for sanity checks.
    596     // Note: the user owning the dex file should be the current user.
    597     std::vector<userid_t> users;
    598     if (is_secondary_dex){
    599         users.push_back(multiuser_get_user_id(uid));
    600     } else {
    601         users = get_known_users(/*volume_uuid*/ nullptr);
    602     }
    603     for (auto user : users) {
    604         unique_fd profile_fd = open_current_profile(uid, user, location, is_secondary_dex);
    605         // Add to the lists only if both fds are valid.
    606         if (profile_fd.get() >= 0) {
    607             profiles_fd->push_back(std::move(profile_fd));
    608         }
    609     }
    610 }
    611 
    612 static void drop_capabilities(uid_t uid) {
    613     if (setgid(uid) != 0) {
    614         ALOGE("setgid(%d) failed in installd during dexopt\n", uid);
    615         exit(64);
    616     }
    617     if (setuid(uid) != 0) {
    618         ALOGE("setuid(%d) failed in installd during dexopt\n", uid);
    619         exit(65);
    620     }
    621     // drop capabilities
    622     struct __user_cap_header_struct capheader;
    623     struct __user_cap_data_struct capdata[2];
    624     memset(&capheader, 0, sizeof(capheader));
    625     memset(&capdata, 0, sizeof(capdata));
    626     capheader.version = _LINUX_CAPABILITY_VERSION_3;
    627     if (capset(&capheader, &capdata[0]) < 0) {
    628         ALOGE("capset failed: %s\n", strerror(errno));
    629         exit(66);
    630     }
    631 }
    632 
    633 static constexpr int PROFMAN_BIN_RETURN_CODE_COMPILE = 0;
    634 static constexpr int PROFMAN_BIN_RETURN_CODE_SKIP_COMPILATION = 1;
    635 static constexpr int PROFMAN_BIN_RETURN_CODE_BAD_PROFILES = 2;
    636 static constexpr int PROFMAN_BIN_RETURN_CODE_ERROR_IO = 3;
    637 static constexpr int PROFMAN_BIN_RETURN_CODE_ERROR_LOCKING = 4;
    638 
    639 static void run_profman_merge(const std::vector<unique_fd>& profiles_fd,
    640         const unique_fd& reference_profile_fd) {
    641     static const size_t MAX_INT_LEN = 32;
    642     static const char* PROFMAN_BIN = "/system/bin/profman";
    643 
    644     std::vector<std::string> profile_args(profiles_fd.size());
    645     char profile_buf[strlen("--profile-file-fd=") + MAX_INT_LEN];
    646     for (size_t k = 0; k < profiles_fd.size(); k++) {
    647         sprintf(profile_buf, "--profile-file-fd=%d", profiles_fd[k].get());
    648         profile_args[k].assign(profile_buf);
    649     }
    650     char reference_profile_arg[strlen("--reference-profile-file-fd=") + MAX_INT_LEN];
    651     sprintf(reference_profile_arg, "--reference-profile-file-fd=%d", reference_profile_fd.get());
    652 
    653     // program name, reference profile fd, the final NULL and the profile fds
    654     const char* argv[3 + profiles_fd.size()];
    655     int i = 0;
    656     argv[i++] = PROFMAN_BIN;
    657     argv[i++] = reference_profile_arg;
    658     for (size_t k = 0; k < profile_args.size(); k++) {
    659         argv[i++] = profile_args[k].c_str();
    660     }
    661     // Do not add after dex2oat_flags, they should override others for debugging.
    662     argv[i] = NULL;
    663 
    664     execv(PROFMAN_BIN, (char * const *)argv);
    665     ALOGE("execv(%s) failed: %s\n", PROFMAN_BIN, strerror(errno));
    666     exit(68);   /* only get here on exec failure */
    667 }
    668 
    669 // Decides if profile guided compilation is needed or not based on existing profiles.
    670 // The location is the package name for primary apks or the dex path for secondary dex files.
    671 // Returns true if there is enough information in the current profiles that makes it
    672 // worth to recompile the given location.
    673 // If the return value is true all the current profiles would have been merged into
    674 // the reference profiles accessible with open_reference_profile().
    675 static bool analyze_profiles(uid_t uid, const std::string& location, bool is_secondary_dex) {
    676     std::vector<unique_fd> profiles_fd;
    677     unique_fd reference_profile_fd;
    678     open_profile_files(uid, location, is_secondary_dex, &profiles_fd, &reference_profile_fd);
    679     if (profiles_fd.empty() || (reference_profile_fd.get() < 0)) {
    680         // Skip profile guided compilation because no profiles were found.
    681         // Or if the reference profile info couldn't be opened.
    682         return false;
    683     }
    684 
    685     pid_t pid = fork();
    686     if (pid == 0) {
    687         /* child -- drop privileges before continuing */
    688         drop_capabilities(uid);
    689         run_profman_merge(profiles_fd, reference_profile_fd);
    690         exit(68);   /* only get here on exec failure */
    691     }
    692     /* parent */
    693     int return_code = wait_child(pid);
    694     bool need_to_compile = false;
    695     bool should_clear_current_profiles = false;
    696     bool should_clear_reference_profile = false;
    697     if (!WIFEXITED(return_code)) {
    698         LOG(WARNING) << "profman failed for location " << location << ": " << return_code;
    699     } else {
    700         return_code = WEXITSTATUS(return_code);
    701         switch (return_code) {
    702             case PROFMAN_BIN_RETURN_CODE_COMPILE:
    703                 need_to_compile = true;
    704                 should_clear_current_profiles = true;
    705                 should_clear_reference_profile = false;
    706                 break;
    707             case PROFMAN_BIN_RETURN_CODE_SKIP_COMPILATION:
    708                 need_to_compile = false;
    709                 should_clear_current_profiles = false;
    710                 should_clear_reference_profile = false;
    711                 break;
    712             case PROFMAN_BIN_RETURN_CODE_BAD_PROFILES:
    713                 LOG(WARNING) << "Bad profiles for location " << location;
    714                 need_to_compile = false;
    715                 should_clear_current_profiles = true;
    716                 should_clear_reference_profile = true;
    717                 break;
    718             case PROFMAN_BIN_RETURN_CODE_ERROR_IO:  // fall-through
    719             case PROFMAN_BIN_RETURN_CODE_ERROR_LOCKING:
    720                 // Temporary IO problem (e.g. locking). Ignore but log a warning.
    721                 LOG(WARNING) << "IO error while reading profiles for location " << location;
    722                 need_to_compile = false;
    723                 should_clear_current_profiles = false;
    724                 should_clear_reference_profile = false;
    725                 break;
    726            default:
    727                 // Unknown return code or error. Unlink profiles.
    728                 LOG(WARNING) << "Unknown error code while processing profiles for location "
    729                         << location << ": " << return_code;
    730                 need_to_compile = false;
    731                 should_clear_current_profiles = true;
    732                 should_clear_reference_profile = true;
    733                 break;
    734         }
    735     }
    736 
    737     if (should_clear_current_profiles) {
    738         if (is_secondary_dex) {
    739             // For secondary dex files, the owning user is the current user.
    740             clear_current_profile(location, multiuser_get_user_id(uid), is_secondary_dex);
    741         } else  {
    742             clear_primary_current_profiles(location);
    743         }
    744     }
    745     if (should_clear_reference_profile) {
    746         clear_reference_profile(location, is_secondary_dex);
    747     }
    748     return need_to_compile;
    749 }
    750 
    751 // Decides if profile guided compilation is needed or not based on existing profiles.
    752 // The analysis is done for the primary apks of the given package.
    753 // Returns true if there is enough information in the current profiles that makes it
    754 // worth to recompile the package.
    755 // If the return value is true all the current profiles would have been merged into
    756 // the reference profiles accessible with open_reference_profile().
    757 bool analyze_primary_profiles(uid_t uid, const std::string& pkgname) {
    758     return analyze_profiles(uid, pkgname, /*is_secondary_dex*/false);
    759 }
    760 
    761 static void run_profman_dump(const std::vector<unique_fd>& profile_fds,
    762                              const unique_fd& reference_profile_fd,
    763                              const std::vector<std::string>& dex_locations,
    764                              const std::vector<unique_fd>& apk_fds,
    765                              const unique_fd& output_fd) {
    766     std::vector<std::string> profman_args;
    767     static const char* PROFMAN_BIN = "/system/bin/profman";
    768     profman_args.push_back(PROFMAN_BIN);
    769     profman_args.push_back("--dump-only");
    770     profman_args.push_back(StringPrintf("--dump-output-to-fd=%d", output_fd.get()));
    771     if (reference_profile_fd != -1) {
    772         profman_args.push_back(StringPrintf("--reference-profile-file-fd=%d",
    773                                             reference_profile_fd.get()));
    774     }
    775     for (size_t i = 0; i < profile_fds.size(); i++) {
    776         profman_args.push_back(StringPrintf("--profile-file-fd=%d", profile_fds[i].get()));
    777     }
    778     for (const std::string& dex_location : dex_locations) {
    779         profman_args.push_back(StringPrintf("--dex-location=%s", dex_location.c_str()));
    780     }
    781     for (size_t i = 0; i < apk_fds.size(); i++) {
    782         profman_args.push_back(StringPrintf("--apk-fd=%d", apk_fds[i].get()));
    783     }
    784     const char **argv = new const char*[profman_args.size() + 1];
    785     size_t i = 0;
    786     for (const std::string& profman_arg : profman_args) {
    787         argv[i++] = profman_arg.c_str();
    788     }
    789     argv[i] = NULL;
    790 
    791     execv(PROFMAN_BIN, (char * const *)argv);
    792     ALOGE("execv(%s) failed: %s\n", PROFMAN_BIN, strerror(errno));
    793     exit(68);   /* only get here on exec failure */
    794 }
    795 
    796 bool dump_profiles(int32_t uid, const std::string& pkgname, const char* code_paths) {
    797     std::vector<unique_fd> profile_fds;
    798     unique_fd reference_profile_fd;
    799     std::string out_file_name = StringPrintf("/data/misc/profman/%s.txt", pkgname.c_str());
    800 
    801     open_profile_files(uid, pkgname, /*is_secondary_dex*/false,
    802             &profile_fds, &reference_profile_fd);
    803 
    804     const bool has_reference_profile = (reference_profile_fd.get() != -1);
    805     const bool has_profiles = !profile_fds.empty();
    806 
    807     if (!has_reference_profile && !has_profiles) {
    808         LOG(ERROR)  << "profman dump: no profiles to dump for " << pkgname;
    809         return false;
    810     }
    811 
    812     unique_fd output_fd(open(out_file_name.c_str(),
    813             O_WRONLY | O_CREAT | O_TRUNC | O_NOFOLLOW, 0644));
    814     if (fchmod(output_fd, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) < 0) {
    815         ALOGE("installd cannot chmod '%s' dump_profile\n", out_file_name.c_str());
    816         return false;
    817     }
    818     std::vector<std::string> code_full_paths = base::Split(code_paths, ";");
    819     std::vector<std::string> dex_locations;
    820     std::vector<unique_fd> apk_fds;
    821     for (const std::string& code_full_path : code_full_paths) {
    822         const char* full_path = code_full_path.c_str();
    823         unique_fd apk_fd(open(full_path, O_RDONLY | O_NOFOLLOW));
    824         if (apk_fd == -1) {
    825             ALOGE("installd cannot open '%s'\n", full_path);
    826             return false;
    827         }
    828         dex_locations.push_back(get_location_from_path(full_path));
    829         apk_fds.push_back(std::move(apk_fd));
    830     }
    831 
    832     pid_t pid = fork();
    833     if (pid == 0) {
    834         /* child -- drop privileges before continuing */
    835         drop_capabilities(uid);
    836         run_profman_dump(profile_fds, reference_profile_fd, dex_locations,
    837                          apk_fds, output_fd);
    838         exit(68);   /* only get here on exec failure */
    839     }
    840     /* parent */
    841     int return_code = wait_child(pid);
    842     if (!WIFEXITED(return_code)) {
    843         LOG(WARNING) << "profman failed for package " << pkgname << ": "
    844                 << return_code;
    845         return false;
    846     }
    847     return true;
    848 }
    849 
    850 static std::string replace_file_extension(const std::string& oat_path, const std::string& new_ext) {
    851   // A standard dalvik-cache entry. Replace ".dex" with `new_ext`.
    852   if (EndsWith(oat_path, ".dex")) {
    853     std::string new_path = oat_path;
    854     new_path.replace(new_path.length() - strlen(".dex"), strlen(".dex"), new_ext);
    855     CHECK(EndsWith(new_path, new_ext.c_str()));
    856     return new_path;
    857   }
    858 
    859   // An odex entry. Not that this may not be an extension, e.g., in the OTA
    860   // case (where the base name will have an extension for the B artifact).
    861   size_t odex_pos = oat_path.rfind(".odex");
    862   if (odex_pos != std::string::npos) {
    863     std::string new_path = oat_path;
    864     new_path.replace(odex_pos, strlen(".odex"), new_ext);
    865     CHECK_NE(new_path.find(new_ext), std::string::npos);
    866     return new_path;
    867   }
    868 
    869   // Don't know how to handle this.
    870   return "";
    871 }
    872 
    873 // Translate the given oat path to an art (app image) path. An empty string
    874 // denotes an error.
    875 static std::string create_image_filename(const std::string& oat_path) {
    876     return replace_file_extension(oat_path, ".art");
    877 }
    878 
    879 // Translate the given oat path to a vdex path. An empty string denotes an error.
    880 static std::string create_vdex_filename(const std::string& oat_path) {
    881     return replace_file_extension(oat_path, ".vdex");
    882 }
    883 
    884 static bool add_extension_to_file_name(char* file_name, const char* extension) {
    885     if (strlen(file_name) + strlen(extension) + 1 > PKG_PATH_MAX) {
    886         return false;
    887     }
    888     strcat(file_name, extension);
    889     return true;
    890 }
    891 
    892 static int open_output_file(const char* file_name, bool recreate, int permissions) {
    893     int flags = O_RDWR | O_CREAT;
    894     if (recreate) {
    895         if (unlink(file_name) < 0) {
    896             if (errno != ENOENT) {
    897                 PLOG(ERROR) << "open_output_file: Couldn't unlink " << file_name;
    898             }
    899         }
    900         flags |= O_EXCL;
    901     }
    902     return open(file_name, flags, permissions);
    903 }
    904 
    905 static bool set_permissions_and_ownership(
    906         int fd, bool is_public, int uid, const char* path, bool is_secondary_dex) {
    907     // Primary apks are owned by the system. Secondary dex files are owned by the app.
    908     int owning_uid = is_secondary_dex ? uid : AID_SYSTEM;
    909     if (fchmod(fd,
    910                S_IRUSR|S_IWUSR|S_IRGRP |
    911                (is_public ? S_IROTH : 0)) < 0) {
    912         ALOGE("installd cannot chmod '%s' during dexopt\n", path);
    913         return false;
    914     } else if (fchown(fd, owning_uid, uid) < 0) {
    915         ALOGE("installd cannot chown '%s' during dexopt\n", path);
    916         return false;
    917     }
    918     return true;
    919 }
    920 
    921 static bool IsOutputDalvikCache(const char* oat_dir) {
    922   // InstallerConnection.java (which invokes installd) transforms Java null arguments
    923   // into '!'. Play it safe by handling it both.
    924   // TODO: ensure we never get null.
    925   // TODO: pass a flag instead of inferring if the output is dalvik cache.
    926   return oat_dir == nullptr || oat_dir[0] == '!';
    927 }
    928 
    929 static bool create_oat_out_path(const char* apk_path, const char* instruction_set,
    930             const char* oat_dir, bool is_secondary_dex, /*out*/ char* out_oat_path) {
    931     // Early best-effort check whether we can fit the the path into our buffers.
    932     // Note: the cache path will require an additional 5 bytes for ".swap", but we'll try to run
    933     // without a swap file, if necessary. Reference profiles file also add an extra ".prof"
    934     // extension to the cache path (5 bytes).
    935     if (strlen(apk_path) >= (PKG_PATH_MAX - 8)) {
    936         ALOGE("apk_path too long '%s'\n", apk_path);
    937         return false;
    938     }
    939 
    940     if (!IsOutputDalvikCache(oat_dir)) {
    941         // Oat dirs for secondary dex files are already validated.
    942         if (!is_secondary_dex && validate_apk_path(oat_dir)) {
    943             ALOGE("cannot validate apk path with oat_dir '%s'\n", oat_dir);
    944             return false;
    945         }
    946         if (!calculate_oat_file_path(out_oat_path, oat_dir, apk_path, instruction_set)) {
    947             return false;
    948         }
    949     } else {
    950         if (!create_cache_path(out_oat_path, apk_path, instruction_set)) {
    951             return false;
    952         }
    953     }
    954     return true;
    955 }
    956 
    957 // Helper for fd management. This is similar to a unique_fd in that it closes the file descriptor
    958 // on destruction. It will also run the given cleanup (unless told not to) after closing.
    959 //
    960 // Usage example:
    961 //
    962 //   Dex2oatFileWrapper file(open(...),
    963 //                                                   [name]() {
    964 //                                                       unlink(name.c_str());
    965 //                                                   });
    966 //   // Note: care needs to be taken about name, as it needs to have a lifetime longer than the
    967 //            wrapper if captured as a reference.
    968 //
    969 //   if (file.get() == -1) {
    970 //       // Error opening...
    971 //   }
    972 //
    973 //   ...
    974 //   if (error) {
    975 //       // At this point, when the Dex2oatFileWrapper is destructed, the cleanup function will run
    976 //       // and delete the file (after the fd is closed).
    977 //       return -1;
    978 //   }
    979 //
    980 //   (Success case)
    981 //   file.SetCleanup(false);
    982 //   // At this point, when the Dex2oatFileWrapper is destructed, the cleanup function will not run
    983 //   // (leaving the file around; after the fd is closed).
    984 //
    985 class Dex2oatFileWrapper {
    986  public:
    987     Dex2oatFileWrapper() : value_(-1), cleanup_(), do_cleanup_(true), auto_close_(true) {
    988     }
    989 
    990     Dex2oatFileWrapper(int value, std::function<void ()> cleanup)
    991             : value_(value), cleanup_(cleanup), do_cleanup_(true), auto_close_(true) {}
    992 
    993     Dex2oatFileWrapper(Dex2oatFileWrapper&& other) {
    994         value_ = other.value_;
    995         cleanup_ = other.cleanup_;
    996         do_cleanup_ = other.do_cleanup_;
    997         auto_close_ = other.auto_close_;
    998         other.release();
    999     }
   1000 
   1001     Dex2oatFileWrapper& operator=(Dex2oatFileWrapper&& other) {
   1002         value_ = other.value_;
   1003         cleanup_ = other.cleanup_;
   1004         do_cleanup_ = other.do_cleanup_;
   1005         auto_close_ = other.auto_close_;
   1006         other.release();
   1007         return *this;
   1008     }
   1009 
   1010     ~Dex2oatFileWrapper() {
   1011         reset(-1);
   1012     }
   1013 
   1014     int get() {
   1015         return value_;
   1016     }
   1017 
   1018     void SetCleanup(bool cleanup) {
   1019         do_cleanup_ = cleanup;
   1020     }
   1021 
   1022     void reset(int new_value) {
   1023         if (auto_close_ && value_ >= 0) {
   1024             close(value_);
   1025         }
   1026         if (do_cleanup_ && cleanup_ != nullptr) {
   1027             cleanup_();
   1028         }
   1029 
   1030         value_ = new_value;
   1031     }
   1032 
   1033     void reset(int new_value, std::function<void ()> new_cleanup) {
   1034         if (auto_close_ && value_ >= 0) {
   1035             close(value_);
   1036         }
   1037         if (do_cleanup_ && cleanup_ != nullptr) {
   1038             cleanup_();
   1039         }
   1040 
   1041         value_ = new_value;
   1042         cleanup_ = new_cleanup;
   1043     }
   1044 
   1045     void DisableAutoClose() {
   1046         auto_close_ = false;
   1047     }
   1048 
   1049  private:
   1050     void release() {
   1051         value_ = -1;
   1052         do_cleanup_ = false;
   1053         cleanup_ = nullptr;
   1054     }
   1055     int value_;
   1056     std::function<void ()> cleanup_;
   1057     bool do_cleanup_;
   1058     bool auto_close_;
   1059 };
   1060 
   1061 // (re)Creates the app image if needed.
   1062 Dex2oatFileWrapper maybe_open_app_image(const char* out_oat_path, bool profile_guided,
   1063         bool is_public, int uid, bool is_secondary_dex) {
   1064     // Use app images only if it is enabled (by a set image format) and we are compiling
   1065     // profile-guided (so the app image doesn't conservatively contain all classes).
   1066     // Note that we don't create an image for secondary dex files.
   1067     if (is_secondary_dex || !profile_guided) {
   1068         return Dex2oatFileWrapper();
   1069     }
   1070 
   1071     const std::string image_path = create_image_filename(out_oat_path);
   1072     if (image_path.empty()) {
   1073         // Happens when the out_oat_path has an unknown extension.
   1074         return Dex2oatFileWrapper();
   1075     }
   1076     char app_image_format[kPropertyValueMax];
   1077     bool have_app_image_format =
   1078             get_property("dalvik.vm.appimageformat", app_image_format, NULL) > 0;
   1079     if (!have_app_image_format) {
   1080         return Dex2oatFileWrapper();
   1081     }
   1082     // Recreate is true since we do not want to modify a mapped image. If the app is
   1083     // already running and we modify the image file, it can cause crashes (b/27493510).
   1084     Dex2oatFileWrapper wrapper_fd(
   1085             open_output_file(image_path.c_str(), true /*recreate*/, 0600 /*permissions*/),
   1086             [image_path]() { unlink(image_path.c_str()); });
   1087     if (wrapper_fd.get() < 0) {
   1088         // Could not create application image file. Go on since we can compile without it.
   1089         LOG(ERROR) << "installd could not create '" << image_path
   1090                 << "' for image file during dexopt";
   1091          // If we have a valid image file path but no image fd, explicitly erase the image file.
   1092         if (unlink(image_path.c_str()) < 0) {
   1093             if (errno != ENOENT) {
   1094                 PLOG(ERROR) << "Couldn't unlink image file " << image_path;
   1095             }
   1096         }
   1097     } else if (!set_permissions_and_ownership(
   1098                 wrapper_fd.get(), is_public, uid, image_path.c_str(), is_secondary_dex)) {
   1099         ALOGE("installd cannot set owner '%s' for image during dexopt\n", image_path.c_str());
   1100         wrapper_fd.reset(-1);
   1101     }
   1102 
   1103     return wrapper_fd;
   1104 }
   1105 
   1106 // Creates the dexopt swap file if necessary and return its fd.
   1107 // Returns -1 if there's no need for a swap or in case of errors.
   1108 unique_fd maybe_open_dexopt_swap_file(const char* out_oat_path) {
   1109     if (!ShouldUseSwapFileForDexopt()) {
   1110         return invalid_unique_fd();
   1111     }
   1112     // Make sure there really is enough space.
   1113     char swap_file_name[PKG_PATH_MAX];
   1114     strcpy(swap_file_name, out_oat_path);
   1115     if (!add_extension_to_file_name(swap_file_name, ".swap")) {
   1116         return invalid_unique_fd();
   1117     }
   1118     unique_fd swap_fd(open_output_file(
   1119             swap_file_name, /*recreate*/true, /*permissions*/0600));
   1120     if (swap_fd.get() < 0) {
   1121         // Could not create swap file. Optimistically go on and hope that we can compile
   1122         // without it.
   1123         ALOGE("installd could not create '%s' for swap during dexopt\n", swap_file_name);
   1124     } else {
   1125         // Immediately unlink. We don't really want to hit flash.
   1126         if (unlink(swap_file_name) < 0) {
   1127             PLOG(ERROR) << "Couldn't unlink swap file " << swap_file_name;
   1128         }
   1129     }
   1130     return swap_fd;
   1131 }
   1132 
   1133 // Opens the reference profiles if needed.
   1134 // Note that the reference profile might not exist so it's OK if the fd will be -1.
   1135 Dex2oatFileWrapper maybe_open_reference_profile(const std::string& pkgname,
   1136         const std::string& dex_path, bool profile_guided, bool is_public, int uid,
   1137         bool is_secondary_dex) {
   1138     // Public apps should not be compiled with profile information ever. Same goes for the special
   1139     // package '*' used for the system server.
   1140     if (!profile_guided || is_public || (pkgname[0] == '*')) {
   1141         return Dex2oatFileWrapper();
   1142     }
   1143 
   1144     // Open reference profile in read only mode as dex2oat does not get write permissions.
   1145     const std::string location = is_secondary_dex ? dex_path : pkgname;
   1146     unique_fd ufd = open_reference_profile(uid, location, /*read_write*/false, is_secondary_dex);
   1147     const auto& cleanup = [location, is_secondary_dex]() {
   1148         clear_reference_profile(location.c_str(), is_secondary_dex);
   1149     };
   1150     return Dex2oatFileWrapper(ufd.release(), cleanup);
   1151 }
   1152 
   1153 // Opens the vdex files and assigns the input fd to in_vdex_wrapper_fd and the output fd to
   1154 // out_vdex_wrapper_fd. Returns true for success or false in case of errors.
   1155 bool open_vdex_files(const char* apk_path, const char* out_oat_path, int dexopt_needed,
   1156         const char* instruction_set, bool is_public, int uid, bool is_secondary_dex,
   1157         bool profile_guided, Dex2oatFileWrapper* in_vdex_wrapper_fd,
   1158         Dex2oatFileWrapper* out_vdex_wrapper_fd) {
   1159     CHECK(in_vdex_wrapper_fd != nullptr);
   1160     CHECK(out_vdex_wrapper_fd != nullptr);
   1161     // Open the existing VDEX. We do this before creating the new output VDEX, which will
   1162     // unlink the old one.
   1163     char in_odex_path[PKG_PATH_MAX];
   1164     int dexopt_action = abs(dexopt_needed);
   1165     bool is_odex_location = dexopt_needed < 0;
   1166     std::string in_vdex_path_str;
   1167 
   1168     // Infer the name of the output VDEX.
   1169     const std::string out_vdex_path_str = create_vdex_filename(out_oat_path);
   1170     if (out_vdex_path_str.empty()) {
   1171         return false;
   1172     }
   1173 
   1174     bool update_vdex_in_place = false;
   1175     if (dexopt_action != DEX2OAT_FROM_SCRATCH) {
   1176         // Open the possibly existing vdex. If none exist, we pass -1 to dex2oat for input-vdex-fd.
   1177         const char* path = nullptr;
   1178         if (is_odex_location) {
   1179             if (calculate_odex_file_path(in_odex_path, apk_path, instruction_set)) {
   1180                 path = in_odex_path;
   1181             } else {
   1182                 ALOGE("installd cannot compute input vdex location for '%s'\n", apk_path);
   1183                 return false;
   1184             }
   1185         } else {
   1186             path = out_oat_path;
   1187         }
   1188         in_vdex_path_str = create_vdex_filename(path);
   1189         if (in_vdex_path_str.empty()) {
   1190             ALOGE("installd cannot compute input vdex location for '%s'\n", path);
   1191             return false;
   1192         }
   1193         // We can update in place when all these conditions are met:
   1194         // 1) The vdex location to write to is the same as the vdex location to read (vdex files
   1195         //    on /system typically cannot be updated in place).
   1196         // 2) We dex2oat due to boot image change, because we then know the existing vdex file
   1197         //    cannot be currently used by a running process.
   1198         // 3) We are not doing a profile guided compilation, because dexlayout requires two
   1199         //    different vdex files to operate.
   1200         update_vdex_in_place =
   1201             (in_vdex_path_str == out_vdex_path_str) &&
   1202             (dexopt_action == DEX2OAT_FOR_BOOT_IMAGE) &&
   1203             !profile_guided;
   1204         if (update_vdex_in_place) {
   1205             // Open the file read-write to be able to update it.
   1206             in_vdex_wrapper_fd->reset(open(in_vdex_path_str.c_str(), O_RDWR, 0));
   1207             if (in_vdex_wrapper_fd->get() == -1) {
   1208                 // If we failed to open the file, we cannot update it in place.
   1209                 update_vdex_in_place = false;
   1210             }
   1211         } else {
   1212             in_vdex_wrapper_fd->reset(open(in_vdex_path_str.c_str(), O_RDONLY, 0));
   1213         }
   1214     }
   1215 
   1216     // If we are updating the vdex in place, we do not need to recreate a vdex,
   1217     // and can use the same existing one.
   1218     if (update_vdex_in_place) {
   1219         // We unlink the file in case the invocation of dex2oat fails, to ensure we don't
   1220         // have bogus stale vdex files.
   1221         out_vdex_wrapper_fd->reset(
   1222               in_vdex_wrapper_fd->get(),
   1223               [out_vdex_path_str]() { unlink(out_vdex_path_str.c_str()); });
   1224         // Disable auto close for the in wrapper fd (it will be done when destructing the out
   1225         // wrapper).
   1226         in_vdex_wrapper_fd->DisableAutoClose();
   1227     } else {
   1228         out_vdex_wrapper_fd->reset(
   1229               open_output_file(out_vdex_path_str.c_str(), /*recreate*/true, /*permissions*/0644),
   1230               [out_vdex_path_str]() { unlink(out_vdex_path_str.c_str()); });
   1231         if (out_vdex_wrapper_fd->get() < 0) {
   1232             ALOGE("installd cannot open vdex'%s' during dexopt\n", out_vdex_path_str.c_str());
   1233             return false;
   1234         }
   1235     }
   1236     if (!set_permissions_and_ownership(out_vdex_wrapper_fd->get(), is_public, uid,
   1237             out_vdex_path_str.c_str(), is_secondary_dex)) {
   1238         ALOGE("installd cannot set owner '%s' for vdex during dexopt\n", out_vdex_path_str.c_str());
   1239         return false;
   1240     }
   1241 
   1242     // If we got here we successfully opened the vdex files.
   1243     return true;
   1244 }
   1245 
   1246 // Opens the output oat file for the given apk.
   1247 // If successful it stores the output path into out_oat_path and returns true.
   1248 Dex2oatFileWrapper open_oat_out_file(const char* apk_path, const char* oat_dir,
   1249         bool is_public, int uid, const char* instruction_set, bool is_secondary_dex,
   1250         char* out_oat_path) {
   1251     if (!create_oat_out_path(apk_path, instruction_set, oat_dir, is_secondary_dex, out_oat_path)) {
   1252         return Dex2oatFileWrapper();
   1253     }
   1254     const std::string out_oat_path_str(out_oat_path);
   1255     Dex2oatFileWrapper wrapper_fd(
   1256             open_output_file(out_oat_path, /*recreate*/true, /*permissions*/0644),
   1257             [out_oat_path_str]() { unlink(out_oat_path_str.c_str()); });
   1258     if (wrapper_fd.get() < 0) {
   1259         PLOG(ERROR) << "installd cannot open output during dexopt" <<  out_oat_path;
   1260     } else if (!set_permissions_and_ownership(
   1261                 wrapper_fd.get(), is_public, uid, out_oat_path, is_secondary_dex)) {
   1262         ALOGE("installd cannot set owner '%s' for output during dexopt\n", out_oat_path);
   1263         wrapper_fd.reset(-1);
   1264     }
   1265     return wrapper_fd;
   1266 }
   1267 
   1268 // Updates the access times of out_oat_path based on those from apk_path.
   1269 void update_out_oat_access_times(const char* apk_path, const char* out_oat_path) {
   1270     struct stat input_stat;
   1271     memset(&input_stat, 0, sizeof(input_stat));
   1272     if (stat(apk_path, &input_stat) != 0) {
   1273         PLOG(ERROR) << "Could not stat " << apk_path << " during dexopt";
   1274         return;
   1275     }
   1276 
   1277     struct utimbuf ut;
   1278     ut.actime = input_stat.st_atime;
   1279     ut.modtime = input_stat.st_mtime;
   1280     if (utime(out_oat_path, &ut) != 0) {
   1281         PLOG(WARNING) << "Could not update access times for " << apk_path << " during dexopt";
   1282     }
   1283 }
   1284 
   1285 // Runs (execv) dexoptanalyzer on the given arguments.
   1286 // The analyzer will check if the dex_file needs to be (re)compiled to match the compiler_filter.
   1287 // If this is for a profile guided compilation, profile_was_updated will tell whether or not
   1288 // the profile has changed.
   1289 static void exec_dexoptanalyzer(const std::string& dex_file, const char* instruction_set,
   1290         const char* compiler_filter, bool profile_was_updated) {
   1291     static const char* DEXOPTANALYZER_BIN = "/system/bin/dexoptanalyzer";
   1292     static const unsigned int MAX_INSTRUCTION_SET_LEN = 7;
   1293 
   1294     if (strlen(instruction_set) >= MAX_INSTRUCTION_SET_LEN) {
   1295         ALOGE("Instruction set %s longer than max length of %d",
   1296               instruction_set, MAX_INSTRUCTION_SET_LEN);
   1297         return;
   1298     }
   1299 
   1300     char dex_file_arg[strlen("--dex-file=") + PKG_PATH_MAX];
   1301     char isa_arg[strlen("--isa=") + MAX_INSTRUCTION_SET_LEN];
   1302     char compiler_filter_arg[strlen("--compiler-filter=") + kPropertyValueMax];
   1303     const char* assume_profile_changed = "--assume-profile-changed";
   1304 
   1305     sprintf(dex_file_arg, "--dex-file=%s", dex_file.c_str());
   1306     sprintf(isa_arg, "--isa=%s", instruction_set);
   1307     sprintf(compiler_filter_arg, "--compiler-filter=%s", compiler_filter);
   1308 
   1309     // program name, dex file, isa, filter, the final NULL
   1310     const char* argv[5 + (profile_was_updated ? 1 : 0)];
   1311     int i = 0;
   1312     argv[i++] = DEXOPTANALYZER_BIN;
   1313     argv[i++] = dex_file_arg;
   1314     argv[i++] = isa_arg;
   1315     argv[i++] = compiler_filter_arg;
   1316     if (profile_was_updated) {
   1317         argv[i++] = assume_profile_changed;
   1318     }
   1319     argv[i] = NULL;
   1320 
   1321     execv(DEXOPTANALYZER_BIN, (char * const *)argv);
   1322     ALOGE("execv(%s) failed: %s\n", DEXOPTANALYZER_BIN, strerror(errno));
   1323 }
   1324 
   1325 // Prepares the oat dir for the secondary dex files.
   1326 static bool prepare_secondary_dex_oat_dir(const std::string& dex_path, int uid,
   1327         const char* instruction_set, std::string* oat_dir_out) {
   1328     unsigned long dirIndex = dex_path.rfind('/');
   1329     if (dirIndex == std::string::npos) {
   1330         LOG(ERROR ) << "Unexpected dir structure for secondary dex " << dex_path;
   1331         return false;
   1332     }
   1333     std::string dex_dir = dex_path.substr(0, dirIndex);
   1334 
   1335     // Create oat file output directory.
   1336     mode_t oat_dir_mode = S_IRWXU | S_IRWXG | S_IXOTH;
   1337     if (prepare_app_cache_dir(dex_dir, "oat", oat_dir_mode, uid, uid) != 0) {
   1338         LOG(ERROR) << "Could not prepare oat dir for secondary dex: " << dex_path;
   1339         return false;
   1340     }
   1341 
   1342     char oat_dir[PKG_PATH_MAX];
   1343     snprintf(oat_dir, PKG_PATH_MAX, "%s/oat", dex_dir.c_str());
   1344     oat_dir_out->assign(oat_dir);
   1345 
   1346     // Create oat/isa output directory.
   1347     if (prepare_app_cache_dir(*oat_dir_out, instruction_set, oat_dir_mode, uid, uid) != 0) {
   1348         LOG(ERROR) << "Could not prepare oat/isa dir for secondary dex: " << dex_path;
   1349         return false;
   1350     }
   1351 
   1352     return true;
   1353 }
   1354 
   1355 static int constexpr DEXOPTANALYZER_BIN_EXEC_ERROR = 200;
   1356 
   1357 // Verifies the result of dexoptanalyzer executed for the apk_path.
   1358 // If the result is valid returns true and sets dexopt_needed_out to a valid value.
   1359 // Returns false for errors or unexpected result values.
   1360 static bool process_dexoptanalyzer_result(const std::string& dex_path, int result,
   1361             int* dexopt_needed_out) {
   1362     // The result values are defined in dexoptanalyzer.
   1363     switch (result) {
   1364         case 0:  // no_dexopt_needed
   1365             *dexopt_needed_out = NO_DEXOPT_NEEDED; return true;
   1366         case 1:  // dex2oat_from_scratch
   1367             *dexopt_needed_out = DEX2OAT_FROM_SCRATCH; return true;
   1368         case 5:  // dex2oat_for_bootimage_odex
   1369             *dexopt_needed_out = -DEX2OAT_FOR_BOOT_IMAGE; return true;
   1370         case 6:  // dex2oat_for_filter_odex
   1371             *dexopt_needed_out = -DEX2OAT_FOR_FILTER; return true;
   1372         case 7:  // dex2oat_for_relocation_odex
   1373             *dexopt_needed_out = -DEX2OAT_FOR_RELOCATION; return true;
   1374         case 2:  // dex2oat_for_bootimage_oat
   1375         case 3:  // dex2oat_for_filter_oat
   1376         case 4:  // dex2oat_for_relocation_oat
   1377             LOG(ERROR) << "Dexoptnalyzer return the status of an oat file."
   1378                     << " Expected odex file status for secondary dex " << dex_path
   1379                     << " : dexoptanalyzer result=" << result;
   1380             return false;
   1381         default:
   1382             LOG(ERROR) << "Unexpected result for dexoptanalyzer " << dex_path
   1383                     << " exec_dexoptanalyzer result=" << result;
   1384             return false;
   1385     }
   1386 }
   1387 
   1388 // Processes the dex_path as a secondary dex files and return true if the path dex file should
   1389 // be compiled. Returns false for errors (logged) or true if the secondary dex path was process
   1390 // successfully.
   1391 // When returning true, the output parameters will be:
   1392 //   - is_public_out: whether or not the oat file should not be made public
   1393 //   - dexopt_needed_out: valid OatFileAsssitant::DexOptNeeded
   1394 //   - oat_dir_out: the oat dir path where the oat file should be stored
   1395 //   - dex_path_out: the real path of the dex file
   1396 static bool process_secondary_dex_dexopt(const char* original_dex_path, const char* pkgname,
   1397         int dexopt_flags, const char* volume_uuid, int uid, const char* instruction_set,
   1398         const char* compiler_filter, bool* is_public_out, int* dexopt_needed_out,
   1399         std::string* oat_dir_out, std::string* dex_path_out) {
   1400     int storage_flag;
   1401 
   1402     if ((dexopt_flags & DEXOPT_STORAGE_CE) != 0) {
   1403         storage_flag = FLAG_STORAGE_CE;
   1404         if ((dexopt_flags & DEXOPT_STORAGE_DE) != 0) {
   1405             LOG(ERROR) << "Ambiguous secondary dex storage flag. Both, CE and DE, flags are set";
   1406             return false;
   1407         }
   1408     } else if ((dexopt_flags & DEXOPT_STORAGE_DE) != 0) {
   1409         storage_flag = FLAG_STORAGE_DE;
   1410     } else {
   1411         LOG(ERROR) << "Secondary dex storage flag must be set";
   1412         return false;
   1413     }
   1414 
   1415     {
   1416         // As opposed to the primary apk, secondary dex files might contain symlinks.
   1417         // Resolve the path before passing it to the validate method to
   1418         // make sure the verification is done on the real location.
   1419         UniqueCPtr<char> dex_real_path_cstr(realpath(original_dex_path, nullptr));
   1420         if (dex_real_path_cstr == nullptr) {
   1421             PLOG(ERROR) << "Could not get the real path of the secondary dex file "
   1422                     << original_dex_path;
   1423             return false;
   1424         } else {
   1425             dex_path_out->assign(dex_real_path_cstr.get());
   1426         }
   1427     }
   1428     const std::string& dex_path = *dex_path_out;
   1429     if (!validate_secondary_dex_path(pkgname, dex_path, volume_uuid, uid, storage_flag)) {
   1430         LOG(ERROR) << "Could not validate secondary dex path " << dex_path;
   1431         return false;
   1432     }
   1433 
   1434     // Check if the path exist. If not, there's nothing to do.
   1435     struct stat dex_path_stat;
   1436     if (stat(dex_path.c_str(), &dex_path_stat) != 0) {
   1437         if (errno == ENOENT) {
   1438             // Secondary dex files might be deleted any time by the app.
   1439             // Nothing to do if that's the case
   1440             ALOGV("Secondary dex does not exist %s", dex_path.c_str());
   1441             return NO_DEXOPT_NEEDED;
   1442         } else {
   1443             PLOG(ERROR) << "Could not access secondary dex " << dex_path;
   1444         }
   1445     }
   1446 
   1447     // Check if we should make the oat file public.
   1448     // Note that if the dex file is not public the compiled code cannot be made public.
   1449     *is_public_out = ((dexopt_flags & DEXOPT_PUBLIC) != 0) &&
   1450             ((dex_path_stat.st_mode & S_IROTH) != 0);
   1451 
   1452     // Prepare the oat directories.
   1453     if (!prepare_secondary_dex_oat_dir(dex_path, uid, instruction_set, oat_dir_out)) {
   1454         return false;
   1455     }
   1456 
   1457     // Analyze profiles.
   1458     bool profile_was_updated = analyze_profiles(uid, dex_path, /*is_secondary_dex*/true);
   1459 
   1460     pid_t pid = fork();
   1461     if (pid == 0) {
   1462         // child -- drop privileges before continuing.
   1463         drop_capabilities(uid);
   1464         // Run dexoptanalyzer to get dexopt_needed code.
   1465         exec_dexoptanalyzer(dex_path, instruction_set, compiler_filter, profile_was_updated);
   1466         exit(DEXOPTANALYZER_BIN_EXEC_ERROR);
   1467     }
   1468 
   1469     /* parent */
   1470 
   1471     int result = wait_child(pid);
   1472     if (!WIFEXITED(result)) {
   1473         LOG(ERROR) << "dexoptanalyzer failed for path " << dex_path << ": " << result;
   1474         return false;
   1475     }
   1476     result = WEXITSTATUS(result);
   1477     bool success = process_dexoptanalyzer_result(dex_path, result, dexopt_needed_out);
   1478     // Run dexopt only if needed or forced.
   1479     // Note that dexoptanalyzer is executed even if force compilation is enabled.
   1480     // We ignore its valid dexopNeeded result, but still check (in process_dexoptanalyzer_result)
   1481     // that we only get results for odex files (apk_dir/oat/isa/code.odex) and not
   1482     // for oat files from dalvik-cache.
   1483     if (success && ((dexopt_flags & DEXOPT_FORCE) != 0)) {
   1484         *dexopt_needed_out = DEX2OAT_FROM_SCRATCH;
   1485     }
   1486 
   1487     return success;
   1488 }
   1489 
   1490 int dexopt(const char* dex_path, uid_t uid, const char* pkgname, const char* instruction_set,
   1491         int dexopt_needed, const char* oat_dir, int dexopt_flags, const char* compiler_filter,
   1492         const char* volume_uuid, const char* shared_libraries, const char* se_info) {
   1493     CHECK(pkgname != nullptr);
   1494     CHECK(pkgname[0] != 0);
   1495     if ((dexopt_flags & ~DEXOPT_MASK) != 0) {
   1496         LOG_FATAL("dexopt flags contains unknown fields\n");
   1497     }
   1498 
   1499     bool is_public = (dexopt_flags & DEXOPT_PUBLIC) != 0;
   1500     bool debuggable = (dexopt_flags & DEXOPT_DEBUGGABLE) != 0;
   1501     bool boot_complete = (dexopt_flags & DEXOPT_BOOTCOMPLETE) != 0;
   1502     bool profile_guided = (dexopt_flags & DEXOPT_PROFILE_GUIDED) != 0;
   1503     bool is_secondary_dex = (dexopt_flags & DEXOPT_SECONDARY_DEX) != 0;
   1504 
   1505     // Check if we're dealing with a secondary dex file and if we need to compile it.
   1506     std::string oat_dir_str;
   1507     std::string dex_real_path;
   1508     if (is_secondary_dex) {
   1509         if (process_secondary_dex_dexopt(dex_path, pkgname, dexopt_flags, volume_uuid, uid,
   1510                 instruction_set, compiler_filter, &is_public, &dexopt_needed, &oat_dir_str,
   1511                 &dex_real_path)) {
   1512             oat_dir = oat_dir_str.c_str();
   1513             dex_path = dex_real_path.c_str();
   1514             if (dexopt_needed == NO_DEXOPT_NEEDED) {
   1515                 return 0;  // Nothing to do, report success.
   1516             }
   1517         } else {
   1518             return -1;  // We had an error, logged in the process method.
   1519         }
   1520     } else {
   1521         // Currently these flags are only use for secondary dex files.
   1522         // Verify that they are not set for primary apks.
   1523         CHECK((dexopt_flags & DEXOPT_STORAGE_CE) == 0);
   1524         CHECK((dexopt_flags & DEXOPT_STORAGE_DE) == 0);
   1525     }
   1526 
   1527     // Open the input file.
   1528     unique_fd input_fd(open(dex_path, O_RDONLY, 0));
   1529     if (input_fd.get() < 0) {
   1530         ALOGE("installd cannot open '%s' for input during dexopt\n", dex_path);
   1531         return -1;
   1532     }
   1533 
   1534     // Create the output OAT file.
   1535     char out_oat_path[PKG_PATH_MAX];
   1536     Dex2oatFileWrapper out_oat_fd = open_oat_out_file(dex_path, oat_dir, is_public, uid,
   1537             instruction_set, is_secondary_dex, out_oat_path);
   1538     if (out_oat_fd.get() < 0) {
   1539         return -1;
   1540     }
   1541 
   1542     // Open vdex files.
   1543     Dex2oatFileWrapper in_vdex_fd;
   1544     Dex2oatFileWrapper out_vdex_fd;
   1545     if (!open_vdex_files(dex_path, out_oat_path, dexopt_needed, instruction_set, is_public, uid,
   1546             is_secondary_dex, profile_guided, &in_vdex_fd, &out_vdex_fd)) {
   1547         return -1;
   1548     }
   1549 
   1550     // Ensure that the oat dir and the compiler artifacts of secondary dex files have the correct
   1551     // selinux context (we generate them on the fly during the dexopt invocation and they don't
   1552     // fully inherit their parent context).
   1553     // Note that for primary apk the oat files are created before, in a separate installd
   1554     // call which also does the restorecon. TODO(calin): unify the paths.
   1555     if (is_secondary_dex) {
   1556         if (selinux_android_restorecon_pkgdir(oat_dir, se_info, uid,
   1557                 SELINUX_ANDROID_RESTORECON_RECURSE)) {
   1558             LOG(ERROR) << "Failed to restorecon " << oat_dir;
   1559             return -1;
   1560         }
   1561     }
   1562 
   1563     // Create a swap file if necessary.
   1564     unique_fd swap_fd = maybe_open_dexopt_swap_file(out_oat_path);
   1565 
   1566     // Create the app image file if needed.
   1567     Dex2oatFileWrapper image_fd =
   1568             maybe_open_app_image(out_oat_path, profile_guided, is_public, uid, is_secondary_dex);
   1569 
   1570     // Open the reference profile if needed.
   1571     Dex2oatFileWrapper reference_profile_fd = maybe_open_reference_profile(
   1572             pkgname, dex_path, profile_guided, is_public, uid, is_secondary_dex);
   1573 
   1574     ALOGV("DexInv: --- BEGIN '%s' ---\n", dex_path);
   1575 
   1576     pid_t pid = fork();
   1577     if (pid == 0) {
   1578         /* child -- drop privileges before continuing */
   1579         drop_capabilities(uid);
   1580 
   1581         SetDex2OatScheduling(boot_complete);
   1582         if (flock(out_oat_fd.get(), LOCK_EX | LOCK_NB) != 0) {
   1583             ALOGE("flock(%s) failed: %s\n", out_oat_path, strerror(errno));
   1584             _exit(67);
   1585         }
   1586 
   1587         run_dex2oat(input_fd.get(),
   1588                     out_oat_fd.get(),
   1589                     in_vdex_fd.get(),
   1590                     out_vdex_fd.get(),
   1591                     image_fd.get(),
   1592                     dex_path,
   1593                     out_oat_path,
   1594                     swap_fd.get(),
   1595                     instruction_set,
   1596                     compiler_filter,
   1597                     debuggable,
   1598                     boot_complete,
   1599                     reference_profile_fd.get(),
   1600                     shared_libraries);
   1601         _exit(68);   /* only get here on exec failure */
   1602     } else {
   1603         int res = wait_child(pid);
   1604         if (res == 0) {
   1605             ALOGV("DexInv: --- END '%s' (success) ---\n", dex_path);
   1606         } else {
   1607             ALOGE("DexInv: --- END '%s' --- status=0x%04x, process failed\n", dex_path, res);
   1608             return res;
   1609         }
   1610     }
   1611 
   1612     update_out_oat_access_times(dex_path, out_oat_path);
   1613 
   1614     // We've been successful, don't delete output.
   1615     out_oat_fd.SetCleanup(false);
   1616     out_vdex_fd.SetCleanup(false);
   1617     image_fd.SetCleanup(false);
   1618     reference_profile_fd.SetCleanup(false);
   1619 
   1620     return 0;
   1621 }
   1622 
   1623 // Try to remove the given directory. Log an error if the directory exists
   1624 // and is empty but could not be removed.
   1625 static bool rmdir_if_empty(const char* dir) {
   1626     if (rmdir(dir) == 0) {
   1627         return true;
   1628     }
   1629     if (errno == ENOENT || errno == ENOTEMPTY) {
   1630         return true;
   1631     }
   1632     PLOG(ERROR) << "Failed to remove dir: " << dir;
   1633     return false;
   1634 }
   1635 
   1636 // Try to unlink the given file. Log an error if the file exists and could not
   1637 // be unlinked.
   1638 static bool unlink_if_exists(const std::string& file) {
   1639     if (unlink(file.c_str()) == 0) {
   1640         return true;
   1641     }
   1642     if (errno == ENOENT) {
   1643         return true;
   1644 
   1645     }
   1646     PLOG(ERROR) << "Could not unlink: " << file;
   1647     return false;
   1648 }
   1649 
   1650 // Create the oat file structure for the secondary dex 'dex_path' and assign
   1651 // the individual path component to the 'out_' parameters.
   1652 static bool create_secondary_dex_oat_layout(const std::string& dex_path, const std::string& isa,
   1653         /*out*/char* out_oat_dir, /*out*/char* out_oat_isa_dir, /*out*/char* out_oat_path) {
   1654     size_t dirIndex = dex_path.rfind('/');
   1655     if (dirIndex == std::string::npos) {
   1656         LOG(ERROR) << "Unexpected dir structure for dex file " << dex_path;
   1657         return false;
   1658     }
   1659     // TODO(calin): we have similar computations in at lest 3 other places
   1660     // (InstalldNativeService, otapropt and dexopt). Unify them and get rid of snprintf by
   1661     // use string append.
   1662     std::string apk_dir = dex_path.substr(0, dirIndex);
   1663     snprintf(out_oat_dir, PKG_PATH_MAX, "%s/oat", apk_dir.c_str());
   1664     snprintf(out_oat_isa_dir, PKG_PATH_MAX, "%s/%s", out_oat_dir, isa.c_str());
   1665 
   1666     if (!create_oat_out_path(dex_path.c_str(), isa.c_str(), out_oat_dir,
   1667             /*is_secondary_dex*/true, out_oat_path)) {
   1668         LOG(ERROR) << "Could not create oat path for secondary dex " << dex_path;
   1669         return false;
   1670     }
   1671     return true;
   1672 }
   1673 
   1674 // Reconcile the secondary dex 'dex_path' and its generated oat files.
   1675 // Return true if all the parameters are valid and the secondary dex file was
   1676 //   processed successfully (i.e. the dex_path either exists, or if not, its corresponding
   1677 //   oat/vdex/art files where deleted successfully). In this case, out_secondary_dex_exists
   1678 //   will be true if the secondary dex file still exists. If the secondary dex file does not exist,
   1679 //   the method cleans up any previously generated compiler artifacts (oat, vdex, art).
   1680 // Return false if there were errors during processing. In this case
   1681 //   out_secondary_dex_exists will be set to false.
   1682 bool reconcile_secondary_dex_file(const std::string& dex_path,
   1683         const std::string& pkgname, int uid, const std::vector<std::string>& isas,
   1684         const std::unique_ptr<std::string>& volume_uuid, int storage_flag,
   1685         /*out*/bool* out_secondary_dex_exists) {
   1686     // Set out to false to start with, just in case we have validation errors.
   1687     *out_secondary_dex_exists = false;
   1688     if (isas.size() == 0) {
   1689         LOG(ERROR) << "reconcile_secondary_dex_file called with empty isas vector";
   1690         return false;
   1691     }
   1692 
   1693     const char* volume_uuid_cstr = volume_uuid == nullptr ? nullptr : volume_uuid->c_str();
   1694     if (!validate_secondary_dex_path(pkgname.c_str(), dex_path.c_str(), volume_uuid_cstr,
   1695             uid, storage_flag)) {
   1696         LOG(ERROR) << "Could not validate secondary dex path " << dex_path;
   1697         return false;
   1698     }
   1699 
   1700     if (access(dex_path.c_str(), F_OK) == 0) {
   1701         // The path exists, nothing to do. The odex files (if any) will be left untouched.
   1702         *out_secondary_dex_exists = true;
   1703         return true;
   1704     } else if (errno != ENOENT) {
   1705         PLOG(ERROR) << "Failed to check access to secondary dex " << dex_path;
   1706         return false;
   1707     }
   1708 
   1709     // The secondary dex does not exist anymore. Clear any generated files.
   1710     char oat_path[PKG_PATH_MAX];
   1711     char oat_dir[PKG_PATH_MAX];
   1712     char oat_isa_dir[PKG_PATH_MAX];
   1713     bool result = true;
   1714     for (size_t i = 0; i < isas.size(); i++) {
   1715         if (!create_secondary_dex_oat_layout(dex_path, isas[i], oat_dir, oat_isa_dir, oat_path)) {
   1716             LOG(ERROR) << "Could not create secondary odex layout: " << dex_path;
   1717             result = false;
   1718             continue;
   1719         }
   1720 
   1721         // Delete oat/vdex/art files.
   1722         result = unlink_if_exists(oat_path) && result;
   1723         result = unlink_if_exists(create_vdex_filename(oat_path)) && result;
   1724         result = unlink_if_exists(create_image_filename(oat_path)) && result;
   1725 
   1726         // Delete profiles.
   1727         std::string current_profile = create_current_profile_path(
   1728                 multiuser_get_user_id(uid), dex_path, /*is_secondary*/true);
   1729         std::string reference_profile = create_reference_profile_path(
   1730                 dex_path, /*is_secondary*/true);
   1731         result = unlink_if_exists(current_profile) && result;
   1732         result = unlink_if_exists(reference_profile) && result;
   1733 
   1734         // Try removing the directories as well, they might be empty.
   1735         result = rmdir_if_empty(oat_isa_dir) && result;
   1736         result = rmdir_if_empty(oat_dir) && result;
   1737     }
   1738 
   1739     return result;
   1740 }
   1741 
   1742 // Helper for move_ab, so that we can have common failure-case cleanup.
   1743 static bool unlink_and_rename(const char* from, const char* to) {
   1744     // Check whether "from" exists, and if so whether it's regular. If it is, unlink. Otherwise,
   1745     // return a failure.
   1746     struct stat s;
   1747     if (stat(to, &s) == 0) {
   1748         if (!S_ISREG(s.st_mode)) {
   1749             LOG(ERROR) << from << " is not a regular file to replace for A/B.";
   1750             return false;
   1751         }
   1752         if (unlink(to) != 0) {
   1753             LOG(ERROR) << "Could not unlink " << to << " to move A/B.";
   1754             return false;
   1755         }
   1756     } else {
   1757         // This may be a permission problem. We could investigate the error code, but we'll just
   1758         // let the rename failure do the work for us.
   1759     }
   1760 
   1761     // Try to rename "to" to "from."
   1762     if (rename(from, to) != 0) {
   1763         PLOG(ERROR) << "Could not rename " << from << " to " << to;
   1764         return false;
   1765     }
   1766     return true;
   1767 }
   1768 
   1769 // Move/rename a B artifact (from) to an A artifact (to).
   1770 static bool move_ab_path(const std::string& b_path, const std::string& a_path) {
   1771     // Check whether B exists.
   1772     {
   1773         struct stat s;
   1774         if (stat(b_path.c_str(), &s) != 0) {
   1775             // Silently ignore for now. The service calling this isn't smart enough to understand
   1776             // lack of artifacts at the moment.
   1777             return false;
   1778         }
   1779         if (!S_ISREG(s.st_mode)) {
   1780             LOG(ERROR) << "A/B artifact " << b_path << " is not a regular file.";
   1781             // Try to unlink, but swallow errors.
   1782             unlink(b_path.c_str());
   1783             return false;
   1784         }
   1785     }
   1786 
   1787     // Rename B to A.
   1788     if (!unlink_and_rename(b_path.c_str(), a_path.c_str())) {
   1789         // Delete the b_path so we don't try again (or fail earlier).
   1790         if (unlink(b_path.c_str()) != 0) {
   1791             PLOG(ERROR) << "Could not unlink " << b_path;
   1792         }
   1793 
   1794         return false;
   1795     }
   1796 
   1797     return true;
   1798 }
   1799 
   1800 bool move_ab(const char* apk_path, const char* instruction_set, const char* oat_dir) {
   1801     // Get the current slot suffix. No suffix, no A/B.
   1802     std::string slot_suffix;
   1803     {
   1804         char buf[kPropertyValueMax];
   1805         if (get_property("ro.boot.slot_suffix", buf, nullptr) <= 0) {
   1806             return false;
   1807         }
   1808         slot_suffix = buf;
   1809 
   1810         if (!ValidateTargetSlotSuffix(slot_suffix)) {
   1811             LOG(ERROR) << "Target slot suffix not legal: " << slot_suffix;
   1812             return false;
   1813         }
   1814     }
   1815 
   1816     // Validate other inputs.
   1817     if (validate_apk_path(apk_path) != 0) {
   1818         LOG(ERROR) << "Invalid apk_path: " << apk_path;
   1819         return false;
   1820     }
   1821     if (validate_apk_path(oat_dir) != 0) {
   1822         LOG(ERROR) << "Invalid oat_dir: " << oat_dir;
   1823         return false;
   1824     }
   1825 
   1826     char a_path[PKG_PATH_MAX];
   1827     if (!calculate_oat_file_path(a_path, oat_dir, apk_path, instruction_set)) {
   1828         return false;
   1829     }
   1830     const std::string a_vdex_path = create_vdex_filename(a_path);
   1831     const std::string a_image_path = create_image_filename(a_path);
   1832 
   1833     // B path = A path + slot suffix.
   1834     const std::string b_path = StringPrintf("%s.%s", a_path, slot_suffix.c_str());
   1835     const std::string b_vdex_path = StringPrintf("%s.%s", a_vdex_path.c_str(), slot_suffix.c_str());
   1836     const std::string b_image_path = StringPrintf("%s.%s",
   1837                                                   a_image_path.c_str(),
   1838                                                   slot_suffix.c_str());
   1839 
   1840     bool success = true;
   1841     if (move_ab_path(b_path, a_path)) {
   1842         if (move_ab_path(b_vdex_path, a_vdex_path)) {
   1843             // Note: we can live without an app image. As such, ignore failure to move the image file.
   1844             //       If we decide to require the app image, or the app image being moved correctly,
   1845             //       then change accordingly.
   1846             constexpr bool kIgnoreAppImageFailure = true;
   1847 
   1848             if (!a_image_path.empty()) {
   1849                 if (!move_ab_path(b_image_path, a_image_path)) {
   1850                     unlink(a_image_path.c_str());
   1851                     if (!kIgnoreAppImageFailure) {
   1852                         success = false;
   1853                     }
   1854                 }
   1855             }
   1856         } else {
   1857             // Cleanup: delete B image, ignore errors.
   1858             unlink(b_image_path.c_str());
   1859             success = false;
   1860         }
   1861     } else {
   1862         // Cleanup: delete B image, ignore errors.
   1863         unlink(b_vdex_path.c_str());
   1864         unlink(b_image_path.c_str());
   1865         success = false;
   1866     }
   1867     return success;
   1868 }
   1869 
   1870 bool delete_odex(const char* apk_path, const char* instruction_set, const char* oat_dir) {
   1871     // Delete the oat/odex file.
   1872     char out_path[PKG_PATH_MAX];
   1873     if (!create_oat_out_path(apk_path, instruction_set, oat_dir,
   1874             /*is_secondary_dex*/false, out_path)) {
   1875         return false;
   1876     }
   1877 
   1878     // In case of a permission failure report the issue. Otherwise just print a warning.
   1879     auto unlink_and_check = [](const char* path) -> bool {
   1880         int result = unlink(path);
   1881         if (result != 0) {
   1882             if (errno == EACCES || errno == EPERM) {
   1883                 PLOG(ERROR) << "Could not unlink " << path;
   1884                 return false;
   1885             }
   1886             PLOG(WARNING) << "Could not unlink " << path;
   1887         }
   1888         return true;
   1889     };
   1890 
   1891     // Delete the oat/odex file.
   1892     bool return_value_oat = unlink_and_check(out_path);
   1893 
   1894     // Derive and delete the app image.
   1895     bool return_value_art = unlink_and_check(create_image_filename(out_path).c_str());
   1896 
   1897     // Derive and delete the vdex file.
   1898     bool return_value_vdex = unlink_and_check(create_vdex_filename(out_path).c_str());
   1899 
   1900     // Report success.
   1901     return return_value_oat && return_value_art && return_value_vdex;
   1902 }
   1903 
   1904 }  // namespace installd
   1905 }  // namespace android
   1906