这是用于自定义信息亭模式设备的自定义AOSP ROM。当前,我们有一个系统,/ system / priv-app中的主要信息亭应用可以使用PackageManager下载并安装自身的更新APK。我们现在正在考虑实施OTA更新,以便我们实际上可以更新其余的OS。我的问题是,如果我们同时使用两种类型的更新会发生什么?即信息亭模式的应用会下载自身的新更新,并将更新的APK安装到数据分区,然后我们发布OTA更新,其中包含该应用的更新版本。 Android会自动从/ data删除较旧的更新,并在/ system / priv-app中恢复为较新的版本吗?另外,如果OTA更新具有更新的应用程序,但仍比安装的最新更新还旧,该怎么办?
之所以不专门使用OTA更新,是因为我们的某些旧设备无法使用OTA更新,因此我们只需推送应用更新,因此理想情况下,我们可以对所有设备继续相同的过程,然后再推送额外的OTA在需要时为较新的设备更新。
答案 0 :(得分:0)
答案似乎是,即使OTA更新将APK更新为较新的版本,PackageManager仍将原始版本号缓存在某个地方,因此认为/system/priv-app
上的版本是较旧的版本。我没有机会进一步研究它,但它似乎似乎是,安装到/data
的任何更新将始终优先,但这仅是因为PackageManager无法识别{ OTA更新已更新了{1}}版本。
答案 1 :(得分:0)
在这种情况下,PackageManagerService通过比较版本代码来寻找更好的版本。在OTA更新后,如果您的系统/专用应用程序的版本高于数据/应用程序的版本,则系统/专用应用程序将优先。
代码段:
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;
..........................................
..........................................
}
已检查并发现其工作如上所述。