static void run_dex2oat(int zip_fd, int oat_fd, int image_fd, const char* input_file_name,
const char* output_file_name, int swap_fd, const char *instruction_set,
const char* compiler_filter, bool vm_safe_mode, bool debuggable, bool post_bootcomplete,
- int profile_fd) {
+ int profile_fd, const char* shared_libraries) {
static const unsigned int MAX_INSTRUCTION_SET_LEN = 7;
if (strlen(instruction_set) >= MAX_INSTRUCTION_SET_LEN) {
+ (debuggable ? 1 : 0)
+ (have_app_image_format ? 1 : 0)
+ dex2oat_flags_count
- + (profile_fd == -1 ? 0 : 1)];
+ + (profile_fd == -1 ? 0 : 1)
+ + (shared_libraries != nullptr ? 4 : 0)];
int i = 0;
argv[i++] = DEX2OAT_BIN;
argv[i++] = zip_fd_arg;
if (profile_fd != -1) {
argv[i++] = profile_arg;
}
+ if (shared_libraries != nullptr) {
+ argv[i++] = RUNTIME_ARG;
+ argv[i++] = "-classpath";
+ argv[i++] = RUNTIME_ARG;
+ argv[i++] = shared_libraries;
+ }
// Do not add after dex2oat_flags, they should override others for debugging.
argv[i] = NULL;
int dexopt(const char* apk_path, uid_t uid, const char* pkgname, const char* instruction_set,
int dexopt_needed, const char* oat_dir, int dexopt_flags, const char* compiler_filter,
- const char* volume_uuid ATTRIBUTE_UNUSED)
+ const char* volume_uuid ATTRIBUTE_UNUSED, const char* shared_libraries)
{
struct utimbuf ut;
struct stat input_stat;
}
run_dex2oat(input_fd, out_fd, image_fd, input_file_name, out_path, swap_fd,
instruction_set, compiler_filter, vm_safe_mode, debuggable, boot_complete,
- reference_profile_fd);
+ reference_profile_fd, shared_libraries);
} else {
ALOGE("Invalid dexopt needed: %d\n", dexopt_needed);
exit(73);
int dexopt(const char *apk_path, uid_t uid, const char *pkgName, const char *instruction_set,
int dexopt_needed, const char* oat_dir, int dexopt_flags, const char* compiler_filter,
- const char* volume_uuid);
+ const char* volume_uuid, const char* shared_libraries);
int mark_boot_complete(const char *instruction_set);
int linklib(const char* uuid, const char* pkgname, const char* asecLibDir, int userId);
int idmap(const char *target_path, const char *overlay_path, uid_t uid);
arg[5], // oat_dir
dexopt_flags,
arg[7], // compiler_filter
- parse_null(arg[8])); // volume_uuid
+ parse_null(arg[8]), // volume_uuid
+ parse_null(arg[9])); // shared_libraries
}
static int do_merge_profiles(char **arg, char reply[REPLY_MAX])
{ "create_user_data", 4, do_create_user_data },
{ "destroy_user_data", 3, do_destroy_user_data },
- { "dexopt", 9, do_dexopt },
+ { "dexopt", 10, do_dexopt },
{ "markbootcomplete", 1, do_mark_boot_complete },
{ "rmdex", 2, do_rm_dex },
{ "freecache", 2, do_free_cache },
package_parameters_[5], // oat_dir
atoi(package_parameters_[6]), // dexopt_flags
package_parameters_[7], // compiler_filter
- ParseNull(package_parameters_[8])); // volume_uuid
+ ParseNull(package_parameters_[8]), // volume_uuid
+ ParseNull(package_parameters_[9])); // shared_libraries
return ret;
}
// to compile, instead of the A properties we could get from init/get_property.
SystemProperties system_properties_;
- const char* package_parameters_[9];
+ const char* package_parameters_[10];
// Store environment values we need to set.
std::vector<std::string> environ_;