包名为xyz的应用程序在磁盘上的用户ID为10044,但在设置中的用户ID为10045不匹配。

8
我找到了一份简单的指南,教你如何在虚拟机中安装 Android-x86 (guide)。
与 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版本。只有通用版和斯巴达一般工作,但没有一个接受我的apk。 也尝试过adb install <packagefile>
编辑2:
我尝试了@Vlad建议的工具。在签署apk后,它部分地起作用。最终,我使用了apkTools,并用apktool中的新文件替换了apkEdit中的旧文件。
但是,使用adb安装时会挂起,并显示“等待设备”或无任何消息。如果我相信eclipse DDMS,每次尝试安装apk时都会失去与设备的连接。
这是我尝试安装正常apk时的错误:Failure [INSTALL_FAILED_INVALID_APK]

如果您在签署apk后没有问题,那么很可能是Proguard删除了未引用的类/方法,从而减少了dex文件大小。请查看我的答案。您的问题是一个常见的错误。 - Devrim
3个回答

1

错误 包 xyz 在磁盘上的 uid 为 10044,在设置中为 10045,不匹配 是由于存在文件夹 /data/data/xyz/ 引起的。

在此消息中,文件夹存在并且具有与现在已安装的所有者(10045)不同的所有者(10044)。这是由之前的不干净的安装引起的。

例如,以前的安装失败了,并且没有删除创建的文件夹。

因为文件夹中可能有其他应用程序的数据,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(); 

1

您的应用程序似乎使用本地代码。您是否使用 NDK? 检查的一种方法是使用 "apktool dump badging "

请参见http://ibotpeaches.github.io/Apktool/

在输出中查找类似于 native-code: 'armeabi' 的内容


是的,我使用本地代码,并且在我的apk文件中生成了 *.so 文件。但是如何使用 "apktool dump badging",却没有选项。 - CSchulz
看起来你本地代码的目标 CPU 与你的 x86 系统使用的 CPU 不同。 确保使用来自 android-x86.org 的 NDK。 更多细节请参见: http://groups.google.com/group/android-x86/browse_thread/thread/cc431223e0694e71/9620a0a9b2e783f2?#9620a0a9b2e783f2 - Vlad
签署apk后它部分工作。最终,我使用了来自http://forum.xda-developers.com/showthread.php?t=882742的apkTools,并用apktool中的新文件替换了apkEdit的旧文件。但是,使用adb安装时会挂起并显示消息“等待设备”或无任何消息。如果我相信eclipse DDMS,每次尝试安装apk时都会丢失与设备的连接。编辑:这是我尝试安装“正常”apk时的失败原因:Failure [INSTALL_FAILED_INVALID_APK] - CSchulz

0
问题与名为“dexopt”的程序有关,该程序确定特定设备上安装的应用程序的固定大小缓冲区称为“LinearAlloc”。对于像冰淇淋三明治和果冻豆一样的较新的Android版本,缓冲区大小为8或16 MB,而在旧版本中仅为5MB。
当您签署apk时,可能会执行proguard步骤,该步骤会删除未引用的代码部分(类、方法、字段等)。因此,您通过那个与缓冲区大小相关的错误。
但是proguard并不总是解决方案,您仍然有可能超过缓冲区大小限制。
Facebook有一个解决方案:“将我们的应用程序分成多个dex文件”。请参见:https://www.facebook.com/notes/facebook-engineering/under-the-hood-dalvik-patch-for-facebook-for-android/10151345597798920

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接