是否可以将平台签名的应用程序安装到用户空间?

时间:2013-01-04 15:14:06

标签: android apk android-build

我最近在自定义Android版本中遇到了一个奇怪的问题?我已经有一个工作ROM好几个月了,使用这个ROM我已经能够将平台签名的apks安装到用户空间(/ data / app)。最近,在重建ROM后,我无法安装相同的apks。任何安装平台签名应用程序的尝试(无论是通过adb install还是pm install)都会产生以下消息:

Failure [INSTALL_FAILED_INVALID_INSTALL_LOCATION]

在深入了解Android源代码后,我发现了以下相关代码块:

if ((compareSignatures(pkg.mSignatures, s1) == PackageManager.SIGNATURE_MATCH)) {
   Slog.w(TAG, "Cannot install platform packages to user storage");
   mLastScanError = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;
   return null;
}

根据我的阅读,似乎永远不应该允许在用户空间中安装系统应用程序。最初的情况是在用户空间中安装系统应用程序是异常吗?是否可以在用户空间中安装平台签名的应用程序,如果可以,那么如何进行?

1 个答案:

答案 0 :(得分:3)

上述情况的发生是因为我们有一个共享的Android构建机器(在公司内共享)。一位同事在没有通知我的情况下切换了一个Git分支,因此我们在构建空间中留下了旧代码。将其切换回正确的分支解决了这个问题。为了更明确地回答上述问题,除非您注释掉以下代码块,否则无法在用户空间中安装平台签名应用程序。

(类文件是 /frameworks/base/services/src/com/android/server/pm/PackageManagerService.java );

    if (!pkg.applicationInfo.sourceDir.startsWith(Environment.getRootDirectory().getPath()) &&
            !pkg.applicationInfo.sourceDir.startsWith("/vendor")) {
        Object obj = mSettings.getUserIdLPr(1000);
        Signature[] s1 = null;
        if (obj instanceof SharedUserSetting) {
            s1 = ((SharedUserSetting)obj).signatures.mSignatures;
        }
        if ((compareSignatures(pkg.mSignatures, s1) == PackageManager.SIGNATURE_MATCH)) {
            Slog.w(TAG, "Cannot install platform packages to user storage");
            mLastScanError = PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;
            return null;
        }
    }