8

Android-x86をVMにインストールするための簡単なガイドを見つけました(ガイド)。
Eclipseとすべての接続は正常に機能しますが、VMへのアプリのインストールは次のエラーで失敗します。

06-21 22:40:26.390: INFO/PackageManager(2439): /data/app/xyz.apk changed; unpacking
06-21 22:40:26.390: ERROR/PackageManager(2439): Package xyz has mismatched uid: 10044 on disk, 10045 in settings
06-21 22:40:26.390: WARN/PackageManager(2439): Native ABI mismatch from package file
06-21 22:40:26.390: WARN/PackageManager(2439): Package couldn't be installed in /data/app/xyz-1.apk

グーグルでエラーを検索し、問題を修正するための小さなPythonスクリプトを見つけましたが、機能しません(script)。スクリプトの実行後、同じエラーが発生しました。

私はAndroid-x862.2ジェネリックを使用しています。詳細については、リリース2.2をご覧ください。

その問題を解決する可能性はありますか?

編集:

2.2リリースすべてをテストしました。一般的にはジェネリックとスパルタのみが機能しますが、誰も私のapkを受け入れません。
も試してみましadb install <packagefile>た。

EDIT2:

@Vladからアドバイスされたツールを試しました。それはapkに署名した後に部分的に機能します。最後に、apkToolsを使用して、apkEditの古いファイルをapktoolの新しいファイルに置き換えました。
ただし、adbを使用したインストールでは、デバイスを待機している、または何も待機していないというメッセージが表示されてハングアップします。eclipse DDMSを信じている場合、apkをインストールしようとするたびにデバイスへの接続が失われます。通常のapk
をインストールしようとすると失敗します。Failure [INSTALL_FAILED_INVALID_APK]

4

3 に答える 3

1

アプリケーションはネイティブコードを使用しているようです。NDKを使用していますか?確認する1つの方法は、「apktoolダンプバッジ」を使用することです。

http://ibotpeaches.github.io/Apktool/を参照してください

出力でnative-code:'armeabi'のようなものを探します

于 2011-06-23T00:54:31.053 に答える
1

Package xyz has mismatched uid: 10044 on disk, 10045 in settings存在するフォルダによるエラー/data/data/xyz/

このメッセージにはフォルダーが存在し、現在インストールされているフォルダー (10045) とは異なる所有者 (10044) を持っています。以前のクリーンでないインストールが原因です。

たとえば、以前のインストールはいくつかのエラーで失敗し、作成されたフォルダーを削除しません。

フォルダーには他のアプリのデータが含まれている可能性があるため、Androidはそれを使用できません。PackageManagerさまざまな方法で修正を試みますが、これができない場合は、アプリの別のディレクトリを取得して、このメッセージを表示します。

より良い解決策 - アプリをインストールし、きれいに削除してください。その後、再度インストールしてください。

別の解決策 - いくつかの方法でフォルダーを削除します/data/data/xyz/。これにはルートが必要な場合があります。

からのコードPackageManager(コメントは非常に役立つ場合があります):

            // This is a normal package, need to make its data directory.
        dataPath = getDataPathForPackage(pkg.packageName, 0);

        boolean uidError = false;

        if (dataPath.exists()) {
            // XXX should really do this check for each user.
            mOutPermissions[1] = 0;
            FileUtils.getPermissions(dataPath.getPath(), mOutPermissions);

            // If we have mismatched owners for the data path, we have a problem.
            if (mOutPermissions[1] != pkg.applicationInfo.uid) {
                boolean recovered = false;
                if (mOutPermissions[1] == 0) {
                    // The directory somehow became owned by root.  Wow.
                    // This is probably because the system was stopped while
                    // installd was in the middle of messing with its libs
                    // directory.  Ask installd to fix that.
                    int ret = mInstaller.fixUid(pkgName, pkg.applicationInfo.uid,
                            pkg.applicationInfo.uid);
                    if (ret >= 0) {
                        recovered = true;
                        String msg = "Package " + pkg.packageName
                                + " unexpectedly changed to uid 0; recovered to " +
                                + pkg.applicationInfo.uid;
                        reportSettingsProblem(Log.WARN, msg);
                    }
                }
                if (!recovered && ((parseFlags&PackageParser.PARSE_IS_SYSTEM) != 0
                        || (scanMode&SCAN_BOOTING) != 0)) {
                    // If this is a system app, we can at least delete its
                    // current data so the application will still work.
                    int ret = mInstaller.remove(pkgName, 0);
                    if (ret >= 0) {
                        // TODO: Kill the processes first
                        // Remove the data directories for all users
                        sUserManager.removePackageForAllUsers(pkgName);
                        // Old data gone!
                        String prefix = (parseFlags&PackageParser.PARSE_IS_SYSTEM) != 0
                                ? "System package " : "Third party package ";
                        String msg = prefix + pkg.packageName
                                + " has changed from uid: "
                                + mOutPermissions[1] + " to "
                                + pkg.applicationInfo.uid + "; old data erased";
                        reportSettingsProblem(Log.WARN, msg);
                        recovered = true;

                        // And now re-install the app.
                        ret = mInstaller.install(pkgName, pkg.applicationInfo.uid,
                                pkg.applicationInfo.uid);
                        if (ret == -1) {
                            // Ack should not happen!
                            msg = prefix + pkg.packageName
                                    + " could not have data directory re-created after delete.";
                            reportSettingsProblem(Log.WARN, msg);
                            mLastScanError = PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;
                            return null;
                        }
                        // Create data directories for all users
                        sUserManager.installPackageForAllUsers(pkgName,
                                pkg.applicationInfo.uid);
                    }
                    if (!recovered) {
                        mHasSystemUidErrors = true;
                    }
                } else if (!recovered) {
                    // If we allow this install to proceed, we will be broken.
                    // Abort, abort!
                    mLastScanError = PackageManager.INSTALL_FAILED_UID_CHANGED;
                    return null;
                }
                if (!recovered) {
                    pkg.applicationInfo.dataDir = "/mismatched_uid/settings_"
                        + pkg.applicationInfo.uid + "/fs_"
                        + mOutPermissions[1];
                    pkg.applicationInfo.nativeLibraryDir = pkg.applicationInfo.dataDir;
                    String msg = "Package " + pkg.packageName
                            + " has mismatched uid: "
                            + mOutPermissions[1] + " on disk, "
                            + pkg.applicationInfo.uid + " in settings";
                    // writer
                    synchronized (mPackages) {
                        mSettings.mReadMessages.append(msg);
                        mSettings.mReadMessages.append('\n');
                        uidError = true;
                        if (!pkgSetting.uidError) {
                            reportSettingsProblem(Log.ERROR, msg);
                        }
                    }
                }
            }
            pkg.applicationInfo.dataDir = dataPath.getPath(); 
于 2016-05-14T21:34:15.150 に答える
0

この問題は、特定のデバイスにインストールされたアプリの「LinearAlloc」と呼ばれる固定サイズのバッファを決定する「dexopt」と呼ばれるプログラムに関係していました。Ice Cream Sandwich や Jelly Bean などの新しい Android バージョンのバッファ サイズは 8 MB または 16 MB ですが、古いバージョンではわずか 5 MB です。

apk に署名すると、参照されていないコード部分 (クラス、メソッド、フィールドなど) を削除するプロガード手順を実行する可能性があります。そのため、バッファ サイズに関連するエラーを渡します。

ただし、proguard が毎回解決策になるとは限りません。バッファ サイズの制限を超える可能性はまだあります。

Facebook には、「アプリを複数の dex ファイルに分割する」という解決策があります。参照: https://www.facebook.com/notes/facebook-engineering/under-the-hood-dalvik-patch-for-facebook-for-android/10151345597798920

于 2014-03-31T12:32:45.230 に答える