Пакет xyz имеет несоответствующий uid: 10044 на диске, 10045 в настройках

Я нашел простое руководство по установке Android-x86 на виртуальную машину (руководство).
Подключение к Eclipse и все работает нормально, но установка моего приложения на виртуальную машину завершается со следующими ошибками:

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

Я искал ошибку в Google и нашел небольшой скрипт Python для решения проблемы, но он не работает (script). После выполнения скрипта я получил ту же ошибку.

Я использую универсальный Android-x86 2.2, более подробную информацию можно найти здесь: Release 2.2

Есть ли возможность исправить эту проблему?

РЕДАКТИРОВАТЬ:

Я протестировал все выпуски 2.2. В общем работают только дженерик и спарта, но мой апк никто не принимает.
Пробовал и с adb install <packagefile> тоже.

РЕДАКТИРОВАТЬ2:

Я попробовал инструменты, рекомендованные @Vlad. Частично работает после подписания apk. Наконец, я использовал apkTools и заменил старые файлы apkEdit на новое из apktool.
Но установка с помощью adb зависает с сообщением ожидание устройства или ничего. Если я верю в eclipse DDMS, соединение с устройством будет теряться каждый раз, когда я пытаюсь установить apk.
Вот ошибка, когда я пытаюсь установить обычный apk: Failure [INSTALL_FAILED_INVALID_APK]


person CSchulz    schedule 21.06.2011    source источник
comment
Если у вас нет проблем после подписания вашего apk, вероятно, proguard удалит неиспользуемые классы/методы, и ваш файл dex уменьшится. Проверьте мой ответ. Ваша проблема - распространенная ошибка.   -  person Devrim    schedule 07.05.2014


Ответы (3)


Ошибка Package xyz has mismatched uid: 10044 on disk, 10045 in settings вызвана существующей папкой /data/data/xyz/.

В этом сообщении папка существует и имеет другого владельца (10044) от установленного (10045). Это вызвано предыдущей нечистой установкой.

Например, предыдущая установка не удалась с некоторыми ошибками и не удаляла созданные папки.

Поскольку в папке могут быть данные из другого приложения, Android не может разрешить его использование. PackageManager попробуйте исправить это разными способами, но если не можете этого сделать - приложение получает другой каталог и показывает это сообщение.

Лучшее решение - установить приложение и полностью удалить его. После этого установите его снова.

Другое решение - каким-то образом удалить папку /data/data/xyz/. Может быть, вам нужен root для этого.

Код от 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(); 
person Enyby    schedule 14.05.2016

Похоже, ваше приложение использует собственный код. Вы используете НДК? Один из способов проверить — использовать «значок дампа apktool».

см. http://ibotpeaches.github.io/Apktool/

Ищите что-то вроде native-code: 'armeabi' в выводе

person Vlad    schedule 23.06.2011
comment
Да, я использую собственный код, и да, в моем apk-файле есть сгенерированный *.so. А вот как использовать apktool dump badging, вариантов нет. - person CSchulz; 23.06.2011
comment
Похоже, что целевой ЦП вашего собственного кода отличается от ЦП, используемого в вашей системе x86. Обязательно используйте NDK с сайта android-x86.org Подробнее см. на странице: groups.google.com/group/android-x86/browse_thread/thread/ - person Vlad; 23.06.2011
comment
Частично работает после подписания apk. Наконец, я использовал apkTools из forum.xda-developers.com/showthread.php? t=882742 и заменил старые файлы apkEdit новыми из apktool. Но установка с adb зависает с сообщением об ожидании устройства или ничего. Если я верю в eclipse DDMS, соединение с устройством будет теряться каждый раз, когда я пытаюсь установить apk. EDIT: Вот ошибка, когда я пытаюсь установить обычный APK: Failure [INSTALL_FAILED_INVALID_APK] - person CSchulz; 23.06.2011

Проблема была связана с программой под названием «dexopt», которая определяет буфер фиксированного размера под названием «LinearAlloc» для приложений, установленных на определенном устройстве. В то время как размер буфера составляет 8 или 16 МБ для более новых версий Android, таких как Ice Cream Sandwich и Jelly Bean, в более старых версиях он составляет всего 5 МБ.

Когда вы подписываете apk, вы, вероятно, выполняете шаги proguard, которые удаляют неиспользуемые части кода (классы, методы, поля и т. д.). Таким образом, вы передаете эту ошибку, связанную с размером буфера.

Но proguard не может быть решением каждый раз, у вас все еще есть возможность превысить лимит размера буфера.

У Facebook есть решение для этого: «Разбить наше приложение на несколько файлов dex». См.: https://www.facebook.com/notes/facebook-engineering/under-the-hood-dalvik-patch-for-facebook-for-android/10151345597798920

person Devrim    schedule 31.03.2014