2011-06-21 5 views
8

मुझे एक वीएम (guide) में एंड्रॉइड-x86 इंस्टॉल करने के लिए एक सरल मार्गदर्शिका मिली।
कनेक्शन ग्रहण करने के लिए और सभी ठीक काम करता है, लेकिन वी एम पर अपने ऐप्लिकेशन को इंस्टॉल निम्न त्रुटियों के साथ विफल:पैकेज xyz ने मेल नहीं किया है: डिस्क पर 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 

मैं गूगल पर त्रुटि के लिए खोज की है और एक छोटे से अजगर स्क्रिप्ट नहीं मिली इस मुद्दे को ठीक करने के लिए है, लेकिन यह नहीं करता है काम नहीं करते (script)। स्क्रिप्ट के निष्पादन के बाद मुझे एक ही त्रुटि मिली।

मैं एंड्रॉयड-86 2.2 सामान्य, अधिक जानकारी यहां पाया जा सकता का उपयोग करें: Release 2.2

वहाँ उस समस्या को ठीक करने के लिए कोई संभावना है?

संपादित करें:

मैंने सभी 2.2 रिलीज़ का परीक्षण किया। सामान्य रूप से केवल सामान्य और स्पार्टा कार्य, लेकिन कोई भी मेरे एपीके को स्वीकार नहीं करता है।
adb install <packagefile> के साथ भी कोशिश की।

EDIT2:

मैं @Vlad से सलाह दी उपकरण की कोशिश की है। यह एपीके पर हस्ताक्षर करने के बाद आंशिक रूप से काम करता है। अंत में मैंने apkTools का उपयोग किया और apktool से नई के साथ apkEdit की पुरानी फाइलों को प्रतिस्थापित किया।
लेकिन एडीबी के साथ स्थापित संदेश डिवाइस या कुछ भी नहीं के लिए प्रतीक्षा कर रहा है। अगर मुझे ग्रहण डीडीएमएस पर विश्वास है तो हर बार जब मैं एपीके स्थापित करने की कोशिश करता हूं तो डिवाइस से कनेक्शन खो जाएगा। Failure [INSTALL_FAILED_INVALID_APK]

+0

आप आपके apk हस्ताक्षर करने के बाद समस्या नहीं है, तो इसकी शायद ProGuard unreferenced वर्गों/तरीकों दूर करता है और अपने डेक्स फ़ाइल घट जाती है। मेरा जवाब जांचें। आपकी समस्या एक आम बग है। – Devrim

उत्तर

1

त्रुटि Package xyz has mismatched uid: 10044 on disk, 10045 in settings मौजूद फ़ोल्डर /data/data/xyz/ के कारण त्रुटि।

इस संदेश में फ़ोल्डर मौजूद है और अब स्थापित (10045) से अलग मालिक (10044) है। यह पिछले अशुद्ध स्थापना के कारण होता है।

उदाहरण के लिए पिछली स्थापना कुछ त्रुटियों के साथ विफल रही और बनाए गए फ़ोल्डर को न हटाएं।

क्योंकि फ़ोल्डर में अन्य ऐप से डेटा हो सकता है एंड्रॉइड इसका उपयोग करने की अनुमति नहीं दे सकता है। 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

आपका आवेदन मूल कोड का उपयोग करने के लिए प्रकट होता है:
यहाँ विफलता जब मैं सामान्य apk स्थापित करने का प्रयास है। क्या आप एनडीके का उपयोग करते हैं? 'Armeabi' उत्पादन

+0

हां मैं देशी कोड का उपयोग करता हूं और हाँ मेरी एपीके-फाइल में उत्पन्न * .so है। लेकिन 'apktool डंप बैजिंग' का उपयोग कैसे करें, कोई विकल्प नहीं है। – CSchulz

+0

ऐसा लगता है कि आपके मूल कोड का लक्ष्य सीपीयू आपके x86 सिस्टम पर उपयोग किए गए CPU से अलग है। android-x86.org से NDK उपयोग करने के लिए पर अधिक विवरण देखें सुनिश्चित करें: http://groups.google.com/group/android-x86/browse_thread/thread/cc431223e0694e71/9620a0a9b2e783f2?#9620a0a9b2e783f2 – Vlad

+0

यह आंशिक रूप से काम करता है के बाद एपीके पर हस्ताक्षर अंत में मैंने apforTools का उपयोग http://forum.xda-developers.com/showthread.php?t=882742 से किया और apktool से नए के साथ 'apkEdit' की पुरानी फ़ाइलों को प्रतिस्थापित किया। लेकिन 'adb' के साथ इंस्टॉल "डिवाइस के लिए प्रतीक्षा" या कुछ भी संदेश के साथ लटका हुआ है। अगर मुझे ग्रहण डीडीएमएस पर विश्वास है तो हर बार जब मैं एपीके स्थापित करने की कोशिश करता हूं तो डिवाइस से कनेक्शन खो जाएगा। ** संपादित करें: ** जब मैं "सामान्य" एपीके स्थापित करने का प्रयास करता हूं तो विफलता यहां दी गई है: 'विफलता [INSTALL_FAILED_INVALID_APK] ' – CSchulz

0

समस्या पड़ा में: जांच करने के लिए एक तरह से उपयोग करने के लिए "apktool डंप बैजिंग"

देशी-कोड की तरह कुछ के लिए http://ibotpeaches.github.io/Apktool/

देखो देखना है "dexopt" नामक एक प्रोग्राम के साथ करें जो विशिष्ट डिवाइस पर स्थापित ऐप्स के "लीनियरअलोक" नामक एक निश्चित आकार के बफर को निर्धारित करता है। जबकि नए आइस क्रीम सैंडविच और जेली बीन जैसे एंड्रॉइड संस्करणों के लिए बफर आकार 8 या 16 एमबी आकार में है, पुराने संस्करणों में इसका केवल 5 एमबी है।

आप apk अप करते हैं, तो आप शायद ProGuard कदम, जो unreferenced कोड भागों (कक्षाएं, विधियां, फ़ील्ड आदि) को हटा अमल तो तुम बफर आकार के साथ संबंधित है कि त्रुटि गुजरती हैं।

लेकिन हर समय प्रोगार्ड समाधान नहीं हो सकता है, फिर भी आपके पास बफर आकार सीमा से अधिक होने की संभावना है।

फेसबुक के लिए इसका समाधान है: "हमारे ऐप को कई डीएक्स फाइलों में तोड़ना"। देखें: https://www.facebook.com/notes/facebook-engineering/under-the-hood-dalvik-patch-for-facebook-for-android/10151345597798920

संबंधित मुद्दे