Cherry pick: Add batched createAppData API to installd.

Benchmarking creation of new users shows on a freshly setup device
sees many individual binder calls from system server into installd to
create app data directories. Batching these calls shows a significant
performance improvement.

Bug: 153171028
Test: Manually create guest user, trace performance with Perfetto.
Change-Id: Iea43c058d465be44c0937bf6c353555869fc9fd2
Merged-In: Iea43c058d465be44c0937bf6c353555869fc9fd2
This commit is contained in:
Ben Murdoch 2020-04-15 12:46:23 +01:00
parent 931c87d986
commit 872d2af935
3 changed files with 35 additions and 1 deletions

View file

@ -420,6 +420,32 @@ static bool prepare_app_profile_dir(const std::string& packageName, int32_t appI
return true;
}
binder::Status InstalldNativeService::createAppDataBatched(
const std::unique_ptr<std::vector<std::unique_ptr<std::string>>>& uuids,
const std::unique_ptr<std::vector<std::unique_ptr<std::string>>>& packageNames,
int32_t userId, int32_t flags, const std::vector<int32_t>& appIds,
const std::vector<std::string>& seInfos, const std::vector<int32_t>& targetSdkVersions,
int64_t* _aidl_return) {
ENFORCE_UID(AID_SYSTEM);
std::lock_guard<std::recursive_mutex> lock(mLock);
ATRACE_BEGIN("createAppDataBatched");
binder::Status ret;
for (size_t i = 0; i < uuids->size(); i++) {
if (!packageNames->at(i)) {
continue;
}
ret = createAppData(uuids->at(i), *packageNames->at(i), userId, flags, appIds[i],
seInfos[i], targetSdkVersions[i], _aidl_return);
if (!ret.isOk()) {
ATRACE_END();
return ret;
}
}
ATRACE_END();
return ok();
}
binder::Status InstalldNativeService::createAppData(const std::unique_ptr<std::string>& uuid,
const std::string& packageName, int32_t userId, int32_t flags, int32_t appId,
const std::string& seInfo, int32_t targetSdkVersion, int64_t* _aidl_return) {

View file

@ -44,7 +44,12 @@ public:
int32_t userSerial, int32_t flags);
binder::Status destroyUserData(const std::unique_ptr<std::string>& uuid, int32_t userId,
int32_t flags);
binder::Status createAppDataBatched(
const std::unique_ptr<std::vector<std::unique_ptr<std::string>>>& uuids,
const std::unique_ptr<std::vector<std::unique_ptr<std::string>>>& packageNames,
int32_t userId, int32_t flags, const std::vector<int32_t>& appIds,
const std::vector<std::string>& seInfos, const std::vector<int32_t>& targetSdkVersions,
int64_t* _aidl_return);
binder::Status createAppData(const std::unique_ptr<std::string>& uuid,
const std::string& packageName, int32_t userId, int32_t flags, int32_t appId,
const std::string& seInfo, int32_t targetSdkVersion, int64_t* _aidl_return);

View file

@ -23,6 +23,9 @@ interface IInstalld {
long createAppData(@nullable @utf8InCpp String uuid, in @utf8InCpp String packageName,
int userId, int flags, int appId, in @utf8InCpp String seInfo, int targetSdkVersion);
long createAppDataBatched(in @nullable @utf8InCpp String[] uuids,
in @nullable @utf8InCpp String[] packageNames, in int userId, int flags, in int[] appIds,
in @utf8InCpp String[] seInfos, in int[] targetSdkVersions);
void restoreconAppData(@nullable @utf8InCpp String uuid, @utf8InCpp String packageName,
int userId, int flags, int appId, @utf8InCpp String seInfo);
void migrateAppData(@nullable @utf8InCpp String uuid, @utf8InCpp String packageName,