diff options
author | 2016-12-07 12:12:00 -0700 | |
---|---|---|
committer | 2016-12-09 15:46:58 -0700 | |
commit | 6c2c056193010cf93b4264810d462c120ce801c8 (patch) | |
tree | d32cdcf8fba64c366c2c166f61149d9797601b44 | |
parent | 77f764d66fdfb89e0e7dd07fca64ae78fd02aad5 (diff) |
Final push of installd to Binder; goodbye socket!
Move last two straggling installd commands to Binder and destroy the
socket-based communication channel forever.
Test: builds, boots, apps install fine, pre-OTA dexopt works
Bug: 13758960, 30944031
Change-Id: I2ecd604fb6627b9028a7e32f87d0367e4a4afde3
-rw-r--r-- | cmds/installd/Android.bp | 1 | ||||
-rw-r--r-- | cmds/installd/Android.mk | 2 | ||||
-rw-r--r-- | cmds/installd/binder/android/os/IInstalld.aidl | 9 | ||||
-rw-r--r-- | cmds/installd/commands.cpp | 88 | ||||
-rw-r--r-- | cmds/installd/commands.h | 43 | ||||
-rw-r--r-- | cmds/installd/dexopt.cpp | 57 | ||||
-rw-r--r-- | cmds/installd/dexopt.h | 38 | ||||
-rw-r--r-- | cmds/installd/installd.cpp | 275 | ||||
-rw-r--r-- | cmds/installd/installd.rc | 1 | ||||
-rw-r--r-- | cmds/installd/installd_constants.h | 2 | ||||
-rw-r--r-- | cmds/installd/otapreopt.cpp | 2 | ||||
-rw-r--r-- | cmds/installd/otapreopt_chroot.cpp | 1 |
12 files changed, 183 insertions, 336 deletions
diff --git a/cmds/installd/Android.bp b/cmds/installd/Android.bp index 4ed45ae877..e4e652a5b7 100644 --- a/cmds/installd/Android.bp +++ b/cmds/installd/Android.bp @@ -7,6 +7,7 @@ cc_defaults { ], srcs: [ "commands.cpp", + "dexopt.cpp", "globals.cpp", "utils.cpp", "binder/android/os/IInstalld.aidl", diff --git a/cmds/installd/Android.mk b/cmds/installd/Android.mk index 4971f07caa..2f13998336 100644 --- a/cmds/installd/Android.mk +++ b/cmds/installd/Android.mk @@ -24,7 +24,7 @@ LOCAL_CFLAGS += -DART_BASE_ADDRESS=$(LIBART_IMG_HOST_BASE_ADDRESS) LOCAL_CFLAGS += -DART_BASE_ADDRESS_MIN_DELTA=$(LOCAL_LIBART_IMG_HOST_MIN_BASE_ADDRESS_DELTA) LOCAL_CFLAGS += -DART_BASE_ADDRESS_MAX_DELTA=$(LOCAL_LIBART_IMG_HOST_MAX_BASE_ADDRESS_DELTA) -LOCAL_SRC_FILES := otapreopt.cpp commands.cpp globals.cpp utils.cpp binder/android/os/IInstalld.aidl +LOCAL_SRC_FILES := otapreopt.cpp commands.cpp globals.cpp utils.cpp dexopt.cpp binder/android/os/IInstalld.aidl LOCAL_SHARED_LIBRARIES := \ libbase \ libbinder \ diff --git a/cmds/installd/binder/android/os/IInstalld.aidl b/cmds/installd/binder/android/os/IInstalld.aidl index 4f84319953..a8233dbd70 100644 --- a/cmds/installd/binder/android/os/IInstalld.aidl +++ b/cmds/installd/binder/android/os/IInstalld.aidl @@ -16,6 +16,7 @@ package android.os; +/** {@hide} */ interface IInstalld { void createUserData(@nullable @utf8InCpp String uuid, int userId, int userSerial, int flags); void destroyUserData(@nullable @utf8InCpp String uuid, int userId, int flags); @@ -32,11 +33,19 @@ interface IInstalld { int userId, int flags, long ceDataInode); long getAppDataInode(@nullable @utf8InCpp String uuid, @utf8InCpp String packageName, int userId, int flags); + long[] getAppSize(@nullable @utf8InCpp String uuid, @utf8InCpp String packageName, + int userId, int flags, long ceDataInode, @utf8InCpp String codePath); void moveCompleteApp(@nullable @utf8InCpp String fromUuid, @nullable @utf8InCpp String toUuid, @utf8InCpp String packageName, @utf8InCpp String dataAppName, int appId, @utf8InCpp String seInfo, int targetSdkVersion); + void dexopt(@utf8InCpp String apkPath, int uid, @nullable @utf8InCpp String packageName, + @utf8InCpp String instructionSet, int dexoptNeeded, + @nullable @utf8InCpp String outputPath, int dexFlags, + @utf8InCpp String compilerFilter, @nullable @utf8InCpp String uuid, + @nullable @utf8InCpp String sharedLibraries); + void rmdex(@utf8InCpp String codePath, @utf8InCpp String instructionSet); boolean mergeProfiles(int uid, @utf8InCpp String packageName); diff --git a/cmds/installd/commands.cpp b/cmds/installd/commands.cpp index 69ac979ac6..facf7a4c62 100644 --- a/cmds/installd/commands.cpp +++ b/cmds/installd/commands.cpp @@ -47,6 +47,8 @@ #include <otapreopt_utils.h> #include <utils.h> +#include "dexopt.h" + #ifndef LOG_TAG #define LOG_TAG "installd" #endif @@ -796,35 +798,48 @@ static void add_app_data_size(std::string& path, int64_t *codesize, int64_t *dat closedir(d); } -int get_app_size(const char *uuid, const char *pkgname, int userid, int flags, ino_t ce_data_inode, - const char *code_path, int64_t *codesize, int64_t *datasize, int64_t *cachesize, - int64_t* asecsize) { +binder::Status InstalldNativeService::getAppSize(const std::unique_ptr<std::string>& uuid, + const std::string& packageName, int32_t userId, int32_t flags, int64_t ceDataInode, + const std::string& codePath, std::vector<int64_t>* _aidl_return) { + ENFORCE_UID(AID_SYSTEM); + const char* uuid_ = uuid ? uuid->c_str() : nullptr; + const char* pkgname = packageName.c_str(); + const char* code_path = codePath.c_str(); + DIR *d; int dfd; + int64_t codesize = 0; + int64_t datasize = 0; + int64_t cachesize = 0; + int64_t asecsize = 0; d = opendir(code_path); if (d != nullptr) { dfd = dirfd(d); - *codesize += calculate_dir_size(dfd); + codesize += calculate_dir_size(dfd); closedir(d); } if (flags & FLAG_STORAGE_CE) { - auto path = create_data_user_ce_package_path(uuid, userid, pkgname, ce_data_inode); - add_app_data_size(path, codesize, datasize, cachesize); + auto path = create_data_user_ce_package_path(uuid_, userId, pkgname, ceDataInode); + add_app_data_size(path, &codesize, &datasize, &cachesize); } if (flags & FLAG_STORAGE_DE) { - auto path = create_data_user_de_package_path(uuid, userid, pkgname); - add_app_data_size(path, codesize, datasize, cachesize); + auto path = create_data_user_de_package_path(uuid_, userId, pkgname); + add_app_data_size(path, &codesize, &datasize, &cachesize); } - *asecsize = 0; - - return 0; + std::vector<int64_t> res; + res.push_back(codesize); + res.push_back(datasize); + res.push_back(cachesize); + res.push_back(asecsize); + *_aidl_return = res; + return binder::Status::ok(); } binder::Status InstalldNativeService::getAppDataInode(const std::unique_ptr<std::string>& uuid, - const std::string& packageName, int32_t userId, int32_t flags, int64_t* _aidl_return) { + const std::string& packageName, int32_t userId, int32_t flags, int64_t* _aidl_return) { ENFORCE_UID(AID_SYSTEM); const char* uuid_ = uuid ? uuid->c_str() : nullptr; const char* pkgname = packageName.c_str(); @@ -1688,28 +1703,6 @@ binder::Status InstalldNativeService::mergeProfiles(int32_t uid, const std::stri return binder::Status::ok(); } -static const char* parse_null(const char* arg) { - if (strcmp(arg, "!") == 0) { - return nullptr; - } else { - return arg; - } -} - -int dexopt(const char* const params[DEXOPT_PARAM_COUNT]) { - return dexopt(params[0], // apk_path - atoi(params[1]), // uid - params[2], // pkgname - params[3], // instruction_set - atoi(params[4]), // dexopt_needed - params[5], // oat_dir - atoi(params[6]), // dexopt_flags - params[7], // compiler_filter - parse_null(params[8]), // volume_uuid - parse_null(params[9])); // shared_libraries - static_assert(DEXOPT_PARAM_COUNT == 10U, "Unexpected dexopt param count"); -} - // Helper for fd management. This is similar to a unique_fd in that it closes the file descriptor // on destruction. It will also run the given cleanup (unless told not to) after closing. // @@ -1788,10 +1781,10 @@ class Dex2oatFileWrapper { bool do_cleanup_; }; +// TODO: eventually move dexopt() implementation into dexopt.cpp 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* shared_libraries) -{ + int dexopt_needed, const char* oat_dir, int dexopt_flags,const char* compiler_filter, + const char* volume_uuid ATTRIBUTE_UNUSED, const char* shared_libraries) { bool is_public = ((dexopt_flags & DEXOPT_PUBLIC) != 0); bool vm_safe_mode = (dexopt_flags & DEXOPT_SAFEMODE) != 0; bool debuggable = (dexopt_flags & DEXOPT_DEBUGGABLE) != 0; @@ -2060,6 +2053,26 @@ int dexopt(const char* apk_path, uid_t uid, const char* pkgname, const char* ins return 0; } +binder::Status InstalldNativeService::dexopt(const std::string& apkPath, int32_t uid, + const std::unique_ptr<std::string>& packageName, const std::string& instructionSet, + int32_t dexoptNeeded, const std::unique_ptr<std::string>& outputPath, int32_t dexFlags, + const std::string& compilerFilter, const std::unique_ptr<std::string>& uuid, + const std::unique_ptr<std::string>& sharedLibraries) { + ENFORCE_UID(AID_SYSTEM); + + const char* apk_path = apkPath.c_str(); + const char* pkgname = packageName ? packageName->c_str() : "*"; + const char* instruction_set = instructionSet.c_str(); + const char* oat_dir = outputPath ? outputPath->c_str() : nullptr; + const char* compiler_filter = compilerFilter.c_str(); + const char* volume_uuid = uuid ? uuid->c_str() : nullptr; + const char* shared_libraries = sharedLibraries ? sharedLibraries->c_str() : nullptr; + + int res = android::installd::dexopt(apk_path, uid, pkgname, instruction_set, dexoptNeeded, + oat_dir, dexFlags, compiler_filter, volume_uuid, shared_libraries); + return res ? binder::Status::fromServiceSpecificError(-1) : binder::Status::ok(); +} + binder::Status InstalldNativeService::markBootComplete(const std::string& instructionSet) { ENFORCE_UID(AID_SYSTEM); const char* instruction_set = instructionSet.c_str(); @@ -2448,7 +2461,6 @@ static bool move_ab_path(const std::string& b_path, const std::string& a_path) { return true; } -//int move_ab(const char* apk_path, const char* instruction_set, const char* oat_dir) { binder::Status InstalldNativeService::moveAb(const std::string& apkPath, const std::string& instructionSet, const std::string& outputPath) { ENFORCE_UID(AID_SYSTEM); diff --git a/cmds/installd/commands.h b/cmds/installd/commands.h index a54d980fd6..f921d2fa71 100644 --- a/cmds/installd/commands.h +++ b/cmds/installd/commands.h @@ -57,12 +57,21 @@ public: const std::string& packageName, int32_t userId, int32_t flags, int64_t ceDataInode); binder::Status getAppDataInode(const std::unique_ptr<std::string>& uuid, const std::string& packageName, int32_t userId, int32_t flags, int64_t* _aidl_return); + binder::Status getAppSize(const std::unique_ptr<std::string>& uuid, + const std::string& packageName, int32_t userId, int32_t flags, int64_t ceDataInode, + const std::string& codePath, std::vector<int64_t>* _aidl_return); binder::Status moveCompleteApp(const std::unique_ptr<std::string>& fromUuid, const std::unique_ptr<std::string>& toUuid, const std::string& packageName, const std::string& dataAppName, int32_t appId, const std::string& seInfo, int32_t targetSdkVersion); + binder::Status dexopt(const std::string& apkPath, int32_t uid, + const std::unique_ptr<std::string>& packageName, const std::string& instructionSet, + int32_t dexoptNeeded, const std::unique_ptr<std::string>& outputPath, int32_t dexFlags, + const std::string& compilerFilter, const std::unique_ptr<std::string>& uuid, + const std::unique_ptr<std::string>& sharedLibraries); + binder::Status rmdex(const std::string& codePath, const std::string& instructionSet); binder::Status mergeProfiles(int32_t uid, const std::string& packageName, bool* _aidl_return); @@ -71,36 +80,22 @@ public: binder::Status clearAppProfiles(const std::string& packageName); binder::Status destroyAppProfiles(const std::string& packageName); - binder::Status idmap(const std::string& targetApkPath, const std::string& overlayApkPath, int32_t uid); + binder::Status idmap(const std::string& targetApkPath, const std::string& overlayApkPath, + int32_t uid); binder::Status rmPackageDir(const std::string& packageDir); binder::Status markBootComplete(const std::string& instructionSet); binder::Status freeCache(const std::unique_ptr<std::string>& uuid, int64_t freeStorageSize); - binder::Status linkNativeLibraryDirectory(const std::unique_ptr<std::string>& uuid, const std::string& packageName, const std::string& nativeLibPath32, int32_t userId); + binder::Status linkNativeLibraryDirectory(const std::unique_ptr<std::string>& uuid, + const std::string& packageName, const std::string& nativeLibPath32, int32_t userId); binder::Status createOatDir(const std::string& oatDir, const std::string& instructionSet); - binder::Status linkFile(const std::string& relativePath, const std::string& fromBase, const std::string& toBase); - binder::Status moveAb(const std::string& apkPath, const std::string& instructionSet, const std::string& outputPath); - binder::Status deleteOdex(const std::string& apkPath, const std::string& instructionSet, const std::string& outputPath); + binder::Status linkFile(const std::string& relativePath, const std::string& fromBase, + const std::string& toBase); + binder::Status moveAb(const std::string& apkPath, const std::string& instructionSet, + const std::string& outputPath); + binder::Status deleteOdex(const std::string& apkPath, const std::string& instructionSet, + const std::string& outputPath); }; -int get_app_size(const char *uuid, const char *pkgname, int userid, int flags, ino_t ce_data_inode, - const char* code_path, int64_t *codesize, int64_t *datasize, int64_t *cachesize, - int64_t *asecsize); - -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* shared_libraries); -static_assert(DEXOPT_PARAM_COUNT == 10U, "Unexpected dexopt param size"); - -// Helper for the above, converting arguments. -int dexopt(const char* const params[DEXOPT_PARAM_COUNT]); - } // namespace installd } // namespace android diff --git a/cmds/installd/dexopt.cpp b/cmds/installd/dexopt.cpp new file mode 100644 index 0000000000..71836c38e0 --- /dev/null +++ b/cmds/installd/dexopt.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + +#include <android-base/logging.h> +#include <android-base/stringprintf.h> + +#include "dexopt.h" +#include "utils.h" + +using android::base::StringPrintf; + +namespace android { +namespace installd { + +static const char* parse_null(const char* arg) { + if (strcmp(arg, "!") == 0) { + return nullptr; + } else { + return arg; + } +} + +int dexopt(const char* const params[DEXOPT_PARAM_COUNT]) { + return dexopt(params[0], // apk_path + atoi(params[1]), // uid + params[2], // pkgname + params[3], // instruction_set + atoi(params[4]), // dexopt_needed + params[5], // oat_dir + atoi(params[6]), // dexopt_flags + params[7], // compiler_filter + parse_null(params[8]), // volume_uuid + parse_null(params[9])); // shared_libraries + static_assert(DEXOPT_PARAM_COUNT == 10U, "Unexpected dexopt param count"); +} + +} // namespace installd +} // namespace android diff --git a/cmds/installd/dexopt.h b/cmds/installd/dexopt.h new file mode 100644 index 0000000000..1bfef02731 --- /dev/null +++ b/cmds/installd/dexopt.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef DEXOPT_H_ +#define DEXOPT_H_ + +#include <sys/types.h> + +namespace android { +namespace installd { + +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* shared_libraries); + +static constexpr size_t DEXOPT_PARAM_COUNT = 10U; +static_assert(DEXOPT_PARAM_COUNT == 10U, "Unexpected dexopt param size"); + +// Helper for the above, converting arguments. +int dexopt(const char* const params[DEXOPT_PARAM_COUNT]); + +} // namespace installd +} // namespace android + +#endif // DEXOPT_H_ diff --git a/cmds/installd/installd.cpp b/cmds/installd/installd.cpp index ef92a690a3..ab49ebe98f 100644 --- a/cmds/installd/installd.cpp +++ b/cmds/installd/installd.cpp @@ -20,14 +20,12 @@ #include <sys/capability.h> #include <sys/fsuid.h> #include <sys/prctl.h> -#include <sys/socket.h> #include <sys/stat.h> #include <android-base/logging.h> #include <cutils/fs.h> #include <cutils/log.h> // TODO: Move everything to base::logging. #include <cutils/properties.h> -#include <cutils/sockets.h> #include <private/android_filesystem_config.h> #include <commands.h> @@ -39,11 +37,6 @@ #ifndef LOG_TAG #define LOG_TAG "installd" #endif -#define SOCKET_PATH "installd" - -#define BUFFER_MAX 1024 /* input buffer for commands */ -#define TOKEN_MAX 16 /* max number of arguments in buffer */ -#define REPLY_MAX 256 /* largest reply allowed */ namespace android { namespace installd { @@ -174,220 +167,6 @@ bool create_cache_path(char path[PKG_PATH_MAX], return true; } - -static char* parse_null(char* arg) { - if (strcmp(arg, "!") == 0) { - return nullptr; - } else { - return arg; - } -} - -static int do_ping(char **arg ATTRIBUTE_UNUSED, char reply[REPLY_MAX] ATTRIBUTE_UNUSED) -{ - return 0; -} - -// We use otapreopt_chroot to get into the chroot. -static constexpr const char* kOtaPreopt = "/system/bin/otapreopt_chroot"; - -static int do_ota_dexopt(const char* args[DEXOPT_PARAM_COUNT], - char reply[REPLY_MAX] ATTRIBUTE_UNUSED) { - // Time to fork and run otapreopt. - - // Check that the tool exists. - struct stat s; - if (stat(kOtaPreopt, &s) != 0) { - LOG(ERROR) << "Otapreopt chroot tool not found."; - return -1; - } - - pid_t pid = fork(); - if (pid == 0) { - const char* argv[1 + DEXOPT_PARAM_COUNT + 1]; - argv[0] = kOtaPreopt; - - for (size_t i = 0; i < DEXOPT_PARAM_COUNT; ++i) { - argv[i + 1] = args[i]; - } - - argv[DEXOPT_PARAM_COUNT + 1] = nullptr; - - execv(argv[0], (char * const *)argv); - PLOG(ERROR) << "execv(OTAPREOPT_CHROOT) failed"; - exit(99); - } else { - int res = wait_child(pid); - if (res == 0) { - ALOGV("DexInv: --- END OTAPREOPT (success) ---\n"); - } else { - ALOGE("DexInv: --- END OTAPREOPT --- status=0x%04x, process failed\n", res); - } - return res; - } -} - -static int do_regular_dexopt(const char* args[DEXOPT_PARAM_COUNT], - char reply[REPLY_MAX] ATTRIBUTE_UNUSED) { - return dexopt(args); -} - -using DexoptFn = int (*)(const char* args[DEXOPT_PARAM_COUNT], - char reply[REPLY_MAX]); - -static int do_dexopt(char **arg, char reply[REPLY_MAX]) -{ - const char* args[DEXOPT_PARAM_COUNT]; - for (size_t i = 0; i < DEXOPT_PARAM_COUNT; ++i) { - CHECK(arg[i] != nullptr); - args[i] = arg[i]; - } - - int dexopt_flags = atoi(arg[6]); - DexoptFn dexopt_fn; - if ((dexopt_flags & DEXOPT_OTA) != 0) { - dexopt_fn = do_ota_dexopt; - } else { - dexopt_fn = do_regular_dexopt; - } - return dexopt_fn(args, reply); -} - -static int do_get_app_size(char **arg, char reply[REPLY_MAX]) { - int64_t codesize = 0; - int64_t datasize = 0; - int64_t cachesize = 0; - int64_t asecsize = 0; - int res = 0; - - /* const char *uuid, const char *pkgname, int userid, int flags, ino_t ce_data_inode, - const char* code_path */ - res = get_app_size(parse_null(arg[0]), arg[1], atoi(arg[2]), atoi(arg[3]), atol(arg[4]), - arg[5], &codesize, &datasize, &cachesize, &asecsize); - - /* - * Each int64_t can take up 22 characters printed out. Make sure it - * doesn't go over REPLY_MAX in the future. - */ - snprintf(reply, REPLY_MAX, "%" PRId64 " %" PRId64 " %" PRId64 " %" PRId64, - codesize, datasize, cachesize, asecsize); - return res; -} - -struct cmdinfo { - const char *name; - unsigned numargs; - int (*func)(char **arg, char reply[REPLY_MAX]); -}; - -struct cmdinfo cmds[] = { - { "ping", 0, do_ping }, - { "get_app_size", 6, do_get_app_size }, - { "dexopt", 10, do_dexopt }, -}; - -static int readx(int s, void *_buf, int count) -{ - char *buf = (char *) _buf; - int n = 0, r; - if (count < 0) return -1; - while (n < count) { - r = read(s, buf + n, count - n); - if (r < 0) { - if (errno == EINTR) continue; - ALOGE("read error: %s\n", strerror(errno)); - return -1; - } - if (r == 0) { - ALOGE("eof\n"); - return -1; /* EOF */ - } - n += r; - } - return 0; -} - -static int writex(int s, const void *_buf, int count) -{ - const char *buf = (const char *) _buf; - int n = 0, r; - if (count < 0) return -1; - while (n < count) { - r = write(s, buf + n, count - n); - if (r < 0) { - if (errno == EINTR) continue; - ALOGE("write error: %s\n", strerror(errno)); - return -1; - } - n += r; - } - return 0; -} - - -/* Tokenize the command buffer, locate a matching command, - * ensure that the required number of arguments are provided, - * call the function(), return the result. - */ -static int execute(int s, char cmd[BUFFER_MAX]) -{ - char reply[REPLY_MAX]; - char *arg[TOKEN_MAX+1]; - unsigned i; - unsigned n = 0; - unsigned short count; - int ret = -1; - - // ALOGI("execute('%s')\n", cmd); - - /* default reply is "" */ - reply[0] = 0; - - /* n is number of args (not counting arg[0]) */ - arg[0] = cmd; - while (*cmd) { - if (isspace(*cmd)) { - *cmd++ = 0; - n++; - arg[n] = cmd; - if (n == TOKEN_MAX) { - ALOGE("too many arguments\n"); - goto done; - } - } - if (*cmd) { - cmd++; - } - } - - for (i = 0; i < sizeof(cmds) / sizeof(cmds[0]); i++) { - if (!strcmp(cmds[i].name,arg[0])) { - if (n != cmds[i].numargs) { - ALOGE("%s requires %d arguments (%d given)\n", - cmds[i].name, cmds[i].numargs, n); - } else { - ret = cmds[i].func(arg + 1, reply); - } - goto done; - } - } - ALOGE("unsupported command '%s'\n", arg[0]); - -done: - if (reply[0]) { - n = snprintf(cmd, BUFFER_MAX, "%d %s", ret, reply); - } else { - n = snprintf(cmd, BUFFER_MAX, "%d", ret); - } - if (n > BUFFER_MAX) n = BUFFER_MAX; - count = n; - - // ALOGI("reply: '%s'\n", cmd); - if (writex(s, &count, sizeof(count))) return -1; - if (writex(s, cmd, count)) return -1; - return 0; -} - static bool initialize_globals() { const char* data_path = getenv("ANDROID_DATA"); if (data_path == nullptr) { @@ -527,16 +306,13 @@ static int log_callback(int type, const char *fmt, ...) { } static int installd_main(const int argc ATTRIBUTE_UNUSED, char *argv[]) { - char buf[BUFFER_MAX]; - struct sockaddr addr; - socklen_t alen; - int lsocket, s, ret; + int ret; int selinux_enabled = (is_selinux_enabled() > 0); setenv("ANDROID_LOG_TAGS", "*:v", 1); android::base::InitLogging(argv); - ALOGI("installd firing up\n"); + LOG(INFO) << "installd firing up"; union selinux_callback cb; cb.func_log = log_callback; @@ -562,50 +338,9 @@ static int installd_main(const int argc ATTRIBUTE_UNUSED, char *argv[]) { exit(1); } - lsocket = android_get_control_socket(SOCKET_PATH); - if (lsocket < 0) { - ALOGE("Failed to get socket from environment: %s\n", strerror(errno)); - exit(1); - } - if (listen(lsocket, 5)) { - ALOGE("Listen on socket failed: %s\n", strerror(errno)); - exit(1); - } - fcntl(lsocket, F_SETFD, FD_CLOEXEC); - - for (;;) { - alen = sizeof(addr); - s = accept(lsocket, &addr, &alen); - if (s < 0) { - ALOGE("Accept failed: %s\n", strerror(errno)); - continue; - } - fcntl(s, F_SETFD, FD_CLOEXEC); - - ALOGI("new connection\n"); - for (;;) { - unsigned short count; - if (readx(s, &count, sizeof(count))) { - ALOGE("failed to read size\n"); - break; - } - if ((count < 1) || (count >= BUFFER_MAX)) { - ALOGE("invalid size %d\n", count); - break; - } - if (readx(s, buf, count)) { - ALOGE("failed to read command\n"); - break; - } - buf[count] = 0; - if (selinux_enabled && selinux_status_updated() > 0) { - selinux_android_seapp_context_reload(); - } - if (execute(s, buf)) break; - } - ALOGI("closing connection\n"); - close(s); - } + IPCThreadState::self()->joinThreadPool(); + + LOG(INFO) << "installd shutting down"; return 0; } diff --git a/cmds/installd/installd.rc b/cmds/installd/installd.rc index 5e4c925d2b..d5d5236774 100644 --- a/cmds/installd/installd.rc +++ b/cmds/installd/installd.rc @@ -1,3 +1,2 @@ service installd /system/bin/installd class main - socket installd stream 600 system system diff --git a/cmds/installd/installd_constants.h b/cmds/installd/installd_constants.h index 4a6143fd28..b0bcce911a 100644 --- a/cmds/installd/installd_constants.h +++ b/cmds/installd/installd_constants.h @@ -30,8 +30,6 @@ constexpr const char* SECONDARY_USER_PREFIX = "user/"; #define DALVIK_CACHE "dalvik-cache" constexpr const char* DALVIK_CACHE_POSTFIX = "@classes.dex"; -static constexpr size_t DEXOPT_PARAM_COUNT = 10U; - constexpr size_t PKG_NAME_MAX = 128u; /* largest allowed package name */ constexpr size_t PKG_PATH_MAX = 256u; /* max size of any path we use */ diff --git a/cmds/installd/otapreopt.cpp b/cmds/installd/otapreopt.cpp index 7e02b6bcfc..8a7a29f6e1 100644 --- a/cmds/installd/otapreopt.cpp +++ b/cmds/installd/otapreopt.cpp @@ -44,6 +44,8 @@ #include <system_properties.h> #include <utils.h> +#include "dexopt.h" + #ifndef LOG_TAG #define LOG_TAG "otapreopt" #endif diff --git a/cmds/installd/otapreopt_chroot.cpp b/cmds/installd/otapreopt_chroot.cpp index 924600a766..cec8f6853b 100644 --- a/cmds/installd/otapreopt_chroot.cpp +++ b/cmds/installd/otapreopt_chroot.cpp @@ -27,6 +27,7 @@ #include "installd_constants.h" #include "otapreopt_utils.h" +#include "dexopt.h" #ifndef LOG_TAG #define LOG_TAG "otapreopt" |