Optimization: remove duplicated flags computations for getInstalledPackages
Below are some test runs that show 100 iterations of getInstalledPackages ran
at activity startup of touchlatency app to demonstrate the perf cost.
R Baseline:
https://screenshot.googleplex.com/PnVi5APraJo
https://pprof.corp.google.com/?id=dc105ca9592f8367c381e2dcf7f1847d
R Optimized:
https://pprof.corp.google.com/?id=2d1d9fadc20bcc61d41bd52116bd94e3
https://screenshot.googleplex.com/OAwJnvwPqPH
Savings: 8% of system_server binder response time when the call is executed.
In terms total binder transaction time. Savings are 2% of the total
binder call time.
Exempt-From-Owner-Approval: CP to correct branch for R
Bug: 153656459
Test: atest FrameworksServicesTests:PackageParserTest
Test: atest FrameworksServicesTests:PackageParserLegacyCoreTest
Test: atest FrameworksServicesTests:ScanTests
Test: atest FrameworksServicesTests:ParallelPackageParserTest
Merged-In: I2de9cf1f754a505239d4416e1fc70bf77932c5db
Change-Id: I2de9cf1f754a505239d4416e1fc70bf77932c5db
(cherry picked from commit 7cb9e5f671)
This commit is contained in:
committed by
Winson Chiu
parent
56ef0ea4b6
commit
c7f8e75806
@@ -350,9 +350,6 @@ public class PackageInfoWithoutStateUtils {
|
||||
// TODO(b/135203078): Consolidate the data directory logic, remove initForUser
|
||||
ai.initForUser(userId);
|
||||
|
||||
ai.flags = appInfoFlags(pkg);
|
||||
ai.privateFlags = appInfoPrivateFlags(pkg);
|
||||
|
||||
if ((flags & PackageManager.GET_META_DATA) == 0) {
|
||||
ai.metaData = null;
|
||||
}
|
||||
|
||||
@@ -850,9 +850,15 @@ public class ParsingPackageImpl implements ParsingPackage, Parcelable {
|
||||
@Deprecated
|
||||
@Override
|
||||
public ApplicationInfo toAppInfoWithoutState() {
|
||||
ApplicationInfo appInfo = new ApplicationInfo();
|
||||
ApplicationInfo appInfo = toAppInfoWithoutStateWithoutFlags();
|
||||
appInfo.flags = PackageInfoWithoutStateUtils.appInfoFlags(this);
|
||||
appInfo.privateFlags = PackageInfoWithoutStateUtils.appInfoPrivateFlags(this);
|
||||
return appInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApplicationInfo toAppInfoWithoutStateWithoutFlags() {
|
||||
ApplicationInfo appInfo = new ApplicationInfo();
|
||||
|
||||
appInfo.appComponentFactory = appComponentFactory;
|
||||
appInfo.backupAgentName = backupAgentName;
|
||||
|
||||
@@ -858,4 +858,9 @@ public interface ParsingPackageRead extends Parcelable {
|
||||
|
||||
// TODO(b/135203078): Hide and enforce going through PackageInfoUtils
|
||||
ApplicationInfo toAppInfoWithoutState();
|
||||
|
||||
/**
|
||||
* same as toAppInfoWithoutState except without flag computation.
|
||||
*/
|
||||
ApplicationInfo toAppInfoWithoutStateWithoutFlags();
|
||||
}
|
||||
|
||||
@@ -235,8 +235,9 @@ public class PackageInfoUtils {
|
||||
info.primaryCpuAbi = AndroidPackageUtils.getPrimaryCpuAbi(pkg, pkgSetting);
|
||||
info.secondaryCpuAbi = AndroidPackageUtils.getSecondaryCpuAbi(pkg, pkgSetting);
|
||||
|
||||
info.flags |= appInfoFlags(pkg, pkgSetting);
|
||||
info.privateFlags |= appInfoPrivateFlags(pkg, pkgSetting);
|
||||
info.flags |= appInfoFlags(info.flags, pkgSetting);
|
||||
info.privateFlags |= appInfoPrivateFlags(info.privateFlags, pkgSetting);
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
@@ -455,9 +456,18 @@ public class PackageInfoUtils {
|
||||
public static int appInfoFlags(AndroidPackage pkg, @Nullable PackageSetting pkgSetting) {
|
||||
// TODO(b/135203078): Add setting related state
|
||||
// @formatter:off
|
||||
int flags = PackageInfoWithoutStateUtils.appInfoFlags(pkg)
|
||||
int pkgWithoutStateFlags = PackageInfoWithoutStateUtils.appInfoFlags(pkg)
|
||||
| flag(pkg.isSystem(), ApplicationInfo.FLAG_SYSTEM)
|
||||
| flag(pkg.isFactoryTest(), ApplicationInfo.FLAG_FACTORY_TEST);
|
||||
|
||||
return appInfoFlags(pkgWithoutStateFlags, pkgSetting);
|
||||
// @formatter:on
|
||||
}
|
||||
|
||||
/** @see ApplicationInfo#flags */
|
||||
public static int appInfoFlags(int pkgWithoutStateFlags, @NonNull PackageSetting pkgSetting) {
|
||||
// @formatter:off
|
||||
int flags = pkgWithoutStateFlags;
|
||||
if (pkgSetting != null) {
|
||||
flags |= flag(pkgSetting.getPkgState().isUpdatedSystemApp(), ApplicationInfo.FLAG_UPDATED_SYSTEM_APP);
|
||||
}
|
||||
@@ -467,9 +477,8 @@ public class PackageInfoUtils {
|
||||
|
||||
/** @see ApplicationInfo#privateFlags */
|
||||
public static int appInfoPrivateFlags(AndroidPackage pkg, @Nullable PackageSetting pkgSetting) {
|
||||
// TODO(b/135203078): Add setting related state
|
||||
// @formatter:off
|
||||
return PackageInfoWithoutStateUtils.appInfoPrivateFlags(pkg)
|
||||
int pkgWithoutStateFlags = PackageInfoWithoutStateUtils.appInfoPrivateFlags(pkg)
|
||||
| flag(pkg.isSystemExt(), ApplicationInfo.PRIVATE_FLAG_SYSTEM_EXT)
|
||||
| flag(pkg.isPrivileged(), ApplicationInfo.PRIVATE_FLAG_PRIVILEGED)
|
||||
| flag(pkg.isOem(), ApplicationInfo.PRIVATE_FLAG_OEM)
|
||||
@@ -477,6 +486,15 @@ public class PackageInfoUtils {
|
||||
| flag(pkg.isProduct(), ApplicationInfo.PRIVATE_FLAG_PRODUCT)
|
||||
| flag(pkg.isOdm(), ApplicationInfo.PRIVATE_FLAG_ODM)
|
||||
| flag(pkg.isSignedWithPlatformKey(), ApplicationInfo.PRIVATE_FLAG_SIGNED_WITH_PLATFORM_KEY);
|
||||
return appInfoPrivateFlags(pkgWithoutStateFlags, pkgSetting);
|
||||
// @formatter:on
|
||||
}
|
||||
|
||||
/** @see ApplicationInfo#privateFlags */
|
||||
public static int appInfoPrivateFlags(int pkgWithoutStateFlags, @Nullable PackageSetting pkgSetting) {
|
||||
// @formatter:off
|
||||
// TODO: Add state specific flags
|
||||
return pkgWithoutStateFlags;
|
||||
// @formatter:on
|
||||
}
|
||||
|
||||
|
||||
@@ -300,6 +300,12 @@ public interface AndroidPackage extends PkgAppInfo, PkgPackageInfo, ParsingPacka
|
||||
@NonNull
|
||||
ApplicationInfo toAppInfoWithoutState();
|
||||
|
||||
/**
|
||||
* Same as toAppInfoWithoutState except it does not compute any flags.
|
||||
*/
|
||||
@NonNull
|
||||
ApplicationInfo toAppInfoWithoutStateWithoutFlags();
|
||||
|
||||
/**
|
||||
* TODO(b/135203078): Remove usages?
|
||||
* @return a mock of what the previous package.applicationInfo would've returned for logging
|
||||
|
||||
@@ -455,7 +455,7 @@ public final class PackageImpl extends ParsingPackageImpl implements ParsedPacka
|
||||
|
||||
@Override
|
||||
public ApplicationInfo toAppInfoWithoutState() {
|
||||
ApplicationInfo appInfo = super.toAppInfoWithoutState();
|
||||
ApplicationInfo appInfo = super.toAppInfoWithoutStateWithoutFlags();
|
||||
appInfo.flags = PackageInfoUtils.appInfoFlags(this, null);
|
||||
appInfo.privateFlags = PackageInfoUtils.appInfoPrivateFlags(this, null);
|
||||
appInfo.nativeLibraryDir = nativeLibraryDir;
|
||||
|
||||
Reference in New Issue
Block a user