android应用安装成功的回调,Android9.0 PackageManagerService 应用安装篇 (三)

private void installPackageTracedLI(InstallArgs args, PackageInstalledInfo res) {

try {

installPackageLI(args, res);

} finally {

}

}

private void installPackageLI(InstallArgs args, PackageInstalledInfo res) {

// ...... 变量初始化 // Result object to be returned // 要返回的结果对象 res.setReturnCode(PackageManager.INSTALL_SUCCEEDED);

res.installerPackageName = installerPackageName;

// Sanity check // 完整性检查,及时应用只能安装在内置存储 if (instantApp && (forwardLocked || onExternal)) {

res.setReturnCode(PackageManager.INSTALL_FAILED_INSTANT_APP_INVALID);

return;

}

// Retrieve PackageSettings and parse package @ParseFlags final int parseFlags = mDefParseFlags | PackageParser.PARSE_CHATTY

| PackageParser.PARSE_ENFORCE_CODE

| (forwardLocked ? PackageParser.PARSE_FORWARD_LOCK : 0)

| (onExternal ? PackageParser.PARSE_EXTERNAL_STORAGE : 0)

| (forceSdk ? PackageParser.PARSE_FORCE_SDK : 0);

PackageParser pp = new PackageParser();

pp.setSeparateProcesses(mSeparateProcesses);

pp.setDisplayMetrics(mMetrics);

pp.setCallback(mPackageParserCallback);

final PackageParser.Package pkg;

try {

// 解析 apk 文件得到 PackageParser.Package 对象 pkg = pp.parsePackage(tmpPackageFile, parseFlags);

DexMetadataHelper.validatePackageDexMetadata(pkg);

} catch (PackageParserException e) {

res.setError("Failed parse during installPackageLI", e);

return;

} finally {

Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);

}

// Instant apps have several additional install-time checks. // 检查是否支持及时应用 if (instantApp) {

if (pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.O) {

res.setError(INSTALL_FAILED_INSTANT_APP_INVALID,

"Instant app package must target at least O");

return;

}

if (pkg.applicationInfo.targetSandboxVersion != 2) {

res.setError(INSTALL_FAILED_INSTANT_APP_INVALID,

"Instant app package must use targetSandboxVersion 2");

return;

}

if (pkg.mSharedUserId != null) {

res.setError(INSTALL_FAILED_INSTANT_APP_INVALID,

"Instant app package may not declare a sharedUserId");

return;

}

}

if (pkg.applicationInfo.isStaticSharedLibrary()) {

// Static shared libraries have synthetic package names renameStaticSharedLibraryPackage(pkg);

// No static shared libs on external storage if (onExternal) {

// 共享库不允许安装在外置存储 res.setError(INSTALL_FAILED_INVALID_INSTALL_LOCATION,

"Packages declaring static-shared libs cannot be updated");

return;

}

}

// If we are installing a clustered package add results for the children if (pkg.childPackages != null) {

// 处理子包 synchronized (mPackages) {

final int childCount = pkg.childPackages.size();

for (int i = 0; i < childCount; i++) {

PackageParser.Package childPkg = pkg.childPackages.get(i);

PackageInstalledInfo childRes = new PackageInstalledInfo();

childRes.setReturnCode(PackageManager.INSTALL_SUCCEEDED);

childRes.pkg = childPkg;

childRes.name = childPkg.packageName;

PackageSetting childPs = mSettings.getPackageLPr(childPkg.packageName);

if (childPs != null) {

childRes.origUsers = childPs.queryInstalledUsers(

sUserManager.getUserIds(), true);

}

if ((mPackages.containsKey(childPkg.packageName))) {

childRes.removedInfo = new PackageRemovedInfo(this);

childRes.removedInfo.removedPackage = childPkg.packageName;

childRes.removedInfo.installerPackageName = childPs.installerPackageName;

}

if (res.addedChildPackages == null) {

res.addedChildPackages = new ArrayMap<>();

}

res.addedChildPackages.put(childPkg.packageName, childRes);

}

}

}

// If package doesn't declare API override, mark that we have an install // time CPU ABI override. if (TextUtils.isEmpty(pkg.cpuAbiOverride)) {

pkg.cpuAbiOverride = args.abiOverride;

}

String pkgName = res.name = pkg.packageName;

if ((pkg.applicationInfo.flags&ApplicationInfo.FLAG_TEST_ONLY) != 0) {

if ((installFlags & PackageManager.INSTALL_ALLOW_TEST) == 0) {

res.setError(INSTALL_FAILED_TEST_ONLY, "installPackageLI");

return;

}

}

// 获取签名信息 try {

// either use what we've been given or parse directly from the APK if (args.signingDetails != PackageParser.SigningDetails.UNKNOWN) {

pkg.setSigningDetails(args.signingDetails);

} else {

PackageParser.collectCertificates(pkg, false /* skipVerify */);

}

} catch (PackageParserException e) {

res.setError("Failed collect during installPackageLI", e);

return;

}

// 检查签名版本 if (instantApp && pkg.mSigningDetails.signatureSchemeVersion

< SignatureSchemeVersion.SIGNING_BLOCK_V2) {

res.setError(INSTALL_FAILED_INSTANT_APP_INVALID,

"Instant app package must be signed with APK Signature Scheme v2 or greater");

return;

}

// Get rid of all references to package scan path via parser. // ...... 检查是否要替换现有包 pp = null;

String oldCodePath = null;

boolean systemApp = false;

synchronized (mPackages) {

// Check if installing already existing package }

if (args.move != null) {

// We did an in-place move, so dex is ready to roll // 移动应用 scanFlags |= SCAN_NO_DEX;

scanFlags |= SCAN_MOVE;

synchronized (mPackages) {

final PackageSetting ps = mSettings.mPackages.get(pkgName);

if (ps == null) {

res.setError(INSTALL_FAILED_INTERNAL_ERROR,

"Missing settings for moved package " + pkgName);

}

// We moved the entire application as-is, so bring over the // previously derived ABI information. pkg.applicationInfo.primaryCpuAbi = ps.primaryCpuAbiString;

pkg.applicationInfo.secondaryCpuAbi = ps.secondaryCpuAbiString;

}

} else if (!forwardLocked && !pkg.applicationInfo.isExternalAsec()) {

// Enable SCAN_NO_DEX flag to skip dexopt at a later stage scanFlags |= SCAN_NO_DEX;

try {

String abiOverride = (TextUtils.isEmpty(pkg.cpuAbiOverride) ?

args.abiOverride : pkg.cpuAbiOverride);

final boolean extractNativeLibs = !pkg.isLibrary();

derivePackageAbi(pkg, abiOverride, extractNativeLibs);

} catch (PackageManagerException pme) {

res.setError(INSTALL_FAILED_INTERNAL_ERROR, "Error deriving application ABI");

return;

}

// Shared libraries for the package need to be updated. synchronized (mPackages) {

try {

updateSharedLibrariesLPr(pkg, null);

} catch (PackageManagerException e) {

}

}

}

// 重命名安装包路径名,使用拷贝后的 if (!args.doRename(res.returnCode, pkg, oldCodePath)) {

res.setError(INSTALL_FAILED_INSUFFICIENT_STORAGE, "Failed rename");

return;

}

if (PackageManagerServiceUtils.isApkVerityEnabled()) {

// 安装验证相关 }

if (!instantApp) {

startIntentFilterVerifications(args.user.getIdentifier(), replace, pkg);

} else {

}

try (PackageFreezer freezer = freezePackageForInstall(pkgName, installFlags,

"installPackageLI")) {

if (replace) {

if (pkg.applicationInfo.isStaticSharedLibrary()) {

// Static libs have a synthetic package name containing the version // and cannot be updated as an update would get a new package name, // unless this is the exact same version code which is useful for // development. PackageParser.Package existingPkg = mPackages.get(pkg.packageName);

if (existingPkg != null &&

existingPkg.getLongVersionCode() != pkg.getLongVersionCode()) {

res.setError(INSTALL_FAILED_DUPLICATE_PACKAGE, "Packages declaring "

+ "static-shared libs cannot be updated");

return;

}

}

// 用新的应用信息替换旧的 replacePackageLIF(pkg, parseFlags, scanFlags, args.user,

installerPackageName, res, args.installReason);

} else {

// 将新应用信息加入到 PackageManagerService installNewPackageLIF(pkg, parseFlags, scanFlags | SCAN_DELETE_DATA_ON_FAILURES,

args.user, installerPackageName, volumeUuid, res, args.installReason);

}

}

// Prepare the application profiles for the new code paths. // This needs to be done before invoking dexopt so that any install-time profile // can be used for optimizations. // 为新代码路径准备应用程序配置文件。 这需要在调用 dexopt 之前完成,以便任何安装时配置文件都可以用于优化。 mArtManagerService.prepareAppProfiles(pkg, resolveUserIds(args.user.getIdentifier()));

// ...... dexopt 相关操作 BackgroundDexOptService.notifyPackageChanged(pkg.packageName);

synchronized (mPackages) {

final PackageSetting ps = mSettings.mPackages.get(pkgName);

if (ps != null) {

res.newUsers = ps.queryInstalledUsers(sUserManager.getUserIds(), true);

ps.setUpdateAvailable(false /*updateAvailable*/);

}

final int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0;

for (int i = 0; i < childCount; i++) {

PackageParser.Package childPkg = pkg.childPackages.get(i);

PackageInstalledInfo childRes = res.addedChildPackages.get(childPkg.packageName);

PackageSetting childPs = mSettings.getPackageLPr(childPkg.packageName);

if (childPs != null) {

childRes.newUsers = childPs.queryInstalledUsers(

sUserManager.getUserIds(), true);

}

}

if (res.returnCode == PackageManager.INSTALL_SUCCEEDED) {

updateSequenceNumberLP(ps, res.newUsers);

updateInstantAppInstallerLocked(pkgName);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值