5

最近、カスタム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;
}

私の読書によると、ユーザースペースへのシステムアプリケーションのインストールは決して許可されるべきではなかったようです。システムアプリケーションをユーザースペースにインストールする最初のケースは異常でしたか?プラットフォームで署名されたアプリケーションをユーザースペースにインストールすることは可能ですか?インストールする場合、どのようにインストールしますか?

4

1 に答える 1

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;
        }
    } 
于 2013-01-09T14:04:52.480 に答える