2011-06-21 40 views
8

我發現了一個在VM(guide)中安裝Android-x86的簡單指南。
連接到Eclipse和所有工作正常,但在虛擬機上安裝我的應用程序失敗,以下錯誤:軟件包xyz在磁盤上不匹配uid:10044,在設置中爲10045

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-x86的2.2通用的,更多的細節可以在這裏找到:Release 2.2

是否有可能解決這個問題?

編輯:

我測試了所有2.2版本。一般來說只有泛型和sparta工作,但沒有人接受我的apk。
也試過adb install <packagefile>

EDIT2:

我試圖從@Vlad的諫工具。它在簽署apk之後部分工作。最後,我使用了apkTools,並將apkEdit的舊文件替換爲apktool中的新文件。
但與adb安裝掛斷消息等待設備或什麼也沒有。如果我相信日食DDMS,每次嘗試安裝apk時都會丟失與設備的連接。
這裏是失敗的,當我嘗試安裝正常 APK:Failure [INSTALL_FAILED_INVALID_APK]

+0

如果不簽署您的APK後有問題,它可能proguard的刪除未引用的類/方法和你的DEX文件減小。檢查我的答案。你的問題是一個常見的錯誤。 – Devrim

回答

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(); 
1

您的應用程序似乎使用本地代碼。你使用NDK嗎?檢查 一種方法是使用 「apktool轉儲徽章」

看到http://ibotpeaches.github.io/Apktool/

查找類似 本機代碼:在輸出

+0

是的我使用本機代碼,是的,在我的apk文件中是生成的* .so。但是如何使用'apktool dump badging',沒有選項。 – CSchulz

+0

因此,看起來您的本機代碼的目標CPU與x86系統上使用的CPU不同。 確保使用NDK從android-x86.org 看到更多細節在: http://groups.google.com/group/android-x86/browse_thread/thread/cc431223e0694e71/9620a0a9b2e783f2?#9620a0a9b2e783f2 – Vlad

+0

後才能使用部分簽署apk。最後,我使用http://forum.xda-developers.com/showthread.php?t=882742的apkTools,並用apktool中的新文件替換了'apkEdit'的舊文件。但是用'adb'安裝時會掛起「等待設備」信息或者什麼也不做。如果我相信日食DDMS,每次嘗試安裝apk時都會丟失與設備的連接。 **編輯:**當我嘗試安裝「正常」apk時失敗:'失敗[INSTALL_FAILED_INVALID_APK]' – CSchulz

0

問題不得不「armeabi」 使用稱爲「dexopt」的程序執行,該程序確定 固定大小的緩衝區,稱爲「LinearAlloc」,該緩衝區安裝在 特定設備上。雖然較新的 Android版本的冰淇淋三明治和Jelly Bean的緩衝區大小爲8或16 MB,但其舊版本中僅有5 MB的MB 。

當你簽署apk,你可能執行ProGuard的步驟,從而消除未引用的部分代碼(類,方法,字段等等),所以你通過與緩衝區大小相關的錯誤。

但是,proguard可能不是每次都有解決方案,您仍有可能超出緩衝區大小限制。

Facebook有一個解決方案:「打破我們的應用程序到多個DEX文件」。請參閱:https://www.facebook.com/notes/facebook-engineering/under-the-hood-dalvik-patch-for-facebook-for-android/10151345597798920

相關問題