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

Android 是否可以将平台签名的应用程序安装到用户空间?,android,apk,android-build,Android,Apk,Android Build,我最近在一个定制的Android版本中遇到了一个奇怪的问题?我已经有一个工作ROM几个月了,使用这个ROM我已经能够将平台签名的APK安装到用户空间(/data/app)。最近,在重建ROM之后,我无法安装相同的APK。任何安装平台签名应用程序的尝试(无论是通过adb安装还是pm安装)都会产生以下消息: Failure [INSTALL_FAILED_INVALID_INSTALL_LOCATION] 在翻阅Android源代码后,我发现了以下相关代码块: if ((compareSignat

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

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;
}

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

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

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


简短的回答是否定的!平台签名应用程序是ROM的一部分,因此,如果需要用户空间中的平台签名应用程序,则需要在ROM烘焙时生成的签名密钥,因此我可以访问在生成时生成的密钥,并且我正在使用这些密钥。它工作了几个月,最近又停止工作,这让我很困惑。(我希望我能让你清楚地知道发生了什么变化,但据我所知,一切都没有改变)。如果我使用最新版本中生成的密钥对应用程序进行重新签名,我是否能够将平台证书签名的应用程序安装到用户空间?是的,在我之前的评论中-这只适用于工厂ROM,但滚动您自己的ROM,它仍然可以工作:)抱歉,我把您弄糊涂了…)这就是我不明白的事情。它工作了几个月。现在它不再工作了。但是我上面粘贴的代码块表明它永远不会工作。不过,感谢您的澄清,这有助于我们了解,以前让它工作并不是一个异常现象。也许可以尝试在源代码中创建一个干净的ROM,一个
make clobber
,有些地方出错了…:\
    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;
        }
    }