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

时间:2018-12-14 22:56:29

标签: android android-source

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

在这种情况下,PackageManagerService通过比较版本代码来寻找更好的版本。在OTA更新后,如果您的系统/专用应用程序的版本高于数据/应用程序的版本,则系统/专用应用程序将优先。

代码参考: 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;
    ..........................................
    ..........................................
}

已检查并发现其工作如上所述。