AOSP OTA 更新如何处理已安装的系统应用程序更新?

How does an AOSP OTA update deal with installed system app updates?

这是针对自定义信息亭模式设备的自定义 AOSP ROM。目前我们有一个系统,/system/priv-app 中的主要信息亭应用程序可以使用 PackageManager 下载并安装自身更新的 APK。我们现在正在考虑实施 OTA 更新,以便我们可以实际更新 OS 的其余部分。我的问题是如果我们同时使用这两种更新会怎样? IE。 kiosk 模式应用程序下载自己的新更新并将更新后的 APK 安装到数据分区,然后我们发布一个 OTA 更新,其中包含更新版本的应用程序。 Android 会自动从 /data 中删除旧的更新并在 /system/priv-app 中恢复到现在更新的版本吗?另外,如果 OTA 更新有更新的应用程序但仍然比安装的最新更新旧,会发生什么情况?

不专门使用 OTA 更新的原因是我们的一些旧设备无法使用 OTA 更新,所以我们只推送应用程序更新,因此理想情况下我们可以对所有设备继续相同的过程然后推送需要时为新设备提供额外的 OTA 更新。

答案似乎是,即使 OTA 更新将 APK 更新为更新版本,PackageManager 仍将原始版本号缓存在某处,因此认为 /system/priv-app 上的版本是旧版本。我没有机会进一步研究它,但 似乎 是安装到 /data 的任何更新将始终优先,但这只是因为 PackageManager 无法识别/system/priv-app 版本已通过 OTA 更新更新。

在这种情况下,PackageManagerService 通过比较版本代码来寻找更好的版本。 OTA更新后,如果您的system/priv-app版本高于data/app版本,则system/priv-app优先。

代码参考: http://aosp.opersys.com/xref/android-8.0.0_r36/xref/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java#8887

代码片段:

if (pkg.mVersionCode <= ps.versionCode) {
    // The system package has been updated and the code path does not match
    // Ignore entry. Skip it.
    if (DEBUG_INSTALL) Slog.i(TAG, "Package " + ps.name + " at " + scanFile
        + " ignored: updated version " + ps.versionCode
        + " better than this " + pkg.mVersionCode);
    if (!updatedPkg.codePath.equals(scanFile)) {
        Slog.w(PackageManagerService.TAG, "Code path for hidden system pkg "
            + ps.name + " changing from " + updatedPkg.codePathString
            + " to " + scanFile);
        updatedPkg.codePath = scanFile;
        updatedPkg.codePathString = scanFile.toString();
        updatedPkg.resourcePath = scanFile;
        updatedPkg.resourcePathString = scanFile.toString();
    }
    updatedPkg.pkg = pkg;
    updatedPkg.versionCode = pkg.mVersionCode;
    ..........................................
    ..........................................
}

已检查并发现按上述说明工作。