2011-06-21 35 views
8

Tôi tìm thấy hướng dẫn đơn giản để cài đặt Android-x86 trong máy ảo (guide).
Kết nối với Eclipse và tất cả hoạt động tốt, nhưng cài đặt ứng dụng của tôi trên máy ảo không thành công với các lỗi sau đây:Gói xyz có uid không khớp: 10044 trên đĩa, 10045 trong cài đặt

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 

Tôi đã tìm kiếm cho các lỗi ở google và tìm thấy một kịch bản Python ít để khắc phục vấn đề, nhưng nó doesn 't làm việc (script). Sau khi thực hiện kịch bản tôi đã nhận được lỗi tương tự.

tôi sử dụng Android-x86 2.2 chung, các chi tiết có thể được tìm thấy ở đây: Release 2.2

Có khả năng nào để khắc phục vấn đề đó?

EDIT:

Tôi đã kiểm tra tất cả 2.2 bản phát hành. Chỉ chung chung và sparta làm việc nói chung, nhưng không ai chấp nhận gói ứng dụng của tôi.
Đã thử với adb install <packagefile> quá.

EDIT2:

Tôi đã thử các công cụ được hỗ trợ từ @Vlad. Nó hoạt động một phần sau khi ký apk. Cuối cùng tôi đã sử dụng apkTools và thay thế các tệp cũ của apkEdit bằng tệp mới từ apktool.
Nhưng cài đặt với adb treo lên với thông báo đang chờ thiết bị hoặc không có gì. Nếu tôi tin rằng nhật thực DDMS, kết nối với thiết bị sẽ bị mất mỗi khi tôi cố gắng cài đặt gói ứng dụng.
Đây là sự thất bại khi cố gắng cài đặt bình thường apk: Failure [INSTALL_FAILED_INVALID_APK]

+0

Nếu bạn không có vấn đề sau khi ký apk của bạn, có lẽ Proguard nó loại bỏ các lớp unreferenced/phương pháp và tập tin dex của bạn giảm. Kiểm tra câu trả lời của tôi. Vấn đề của bạn là một lỗi phổ biến. – Devrim

Trả lời

1

Lỗi Package xyz has mismatched uid: 10044 on disk, 10045 in settings do thư mục tồn tại /data/data/xyz/.

Trong thư mục thư này tồn tại và có chủ sở hữu khác (10044) từ bây giờ được cài đặt (10045). Nguyên nhân là do cài đặt ô uế trước đó.

Ví dụ cài đặt trước đó không thành công với một số lỗi và không xóa các thư mục đã tạo.

Vì trong thư mục có thể là dữ liệu từ ứng dụng android khác không thể cho phép sử dụng. PackageManager cố gắng sửa chữa nó theo những cách khác nhau nhưng nếu không thể làm điều này - nó nhận được ứng dụng khác nhau dir và hiển thị thông báo này.

Giải pháp tốt hơn - cài đặt ứng dụng và xóa sạch ứng dụng. Sau đó cài đặt lại.

Một giải pháp khác - xóa thư mục /data/data/xyz/ theo một số cách. Có thể bạn cần root cho việc này.

Mã từ PackageManager (bình luận có thể rất hữu ích):

  // 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

Ứng dụng của bạn dường như sử dụng mã gốc. Bạn có sử dụng NDK không? Một cách để kiểm tra là để sử dụng "apktool bãi huy hiệu"

thấy http://ibotpeaches.github.io/Apktool/

Hãy tìm một cái gì đó giống như bản địa-code: 'armeabi' trong đầu ra

+0

Có, tôi sử dụng mã gốc và có trong tập tin apk của tôi là tạo ra * .so. Nhưng cách sử dụng 'badtool dump badging', không có tùy chọn. – CSchulz

+0

Vì vậy, có vẻ như CPU ​​mục tiêu của mã nguồn gốc của bạn khác với CPU được sử dụng trên hệ thống x86 của bạn. Đảm bảo sử dụng NDK từ android-x86.org Xem thêm chi tiết tại: http://groups.google.com/group/android-x86/browse_thread/thread/cc431223e0694e71/9620a0a9b2e783f2?#9620a0a9b2e783f2 – Vlad

+0

Nó hoạt động một phần sau ký apk. Cuối cùng tôi đã sử dụng apkTools từ http://forum.xda-developers.com/showthread.php?t=882742 và thay thế các tệp cũ của 'apkEdit' bằng tệp mới từ apktool. Nhưng cài đặt với 'adb' treo lên với thông báo" chờ thiết bị "hoặc không có gì. Nếu tôi tin rằng nhật thực DDMS, kết nối với thiết bị sẽ bị mất mỗi khi tôi cố gắng cài đặt gói ứng dụng. ** EDIT: ** Đây là lỗi khi tôi cố cài đặt gói ứng dụng "bình thường": 'Lỗi [INSTALL_FAILED_INVALID_APK]' – CSchulz

0

Vấn đề phải làm với một chương trình có tên là "dexopt" xác định bộ đệm có kích thước cố định được gọi là "LinearAlloc" của các ứng dụng được cài đặt trên thiết bị cụ thể . Mặc dù kích thước bộ đệm là 8 hoặc 16 MB cho kích thước mới hơn Phiên bản Android như Ice Cream Sandwich và Jelly Bean, chỉ có 5 MB trong các phiên bản cũ hơn.

Khi bạn đăng ký gói ứng dụng, bạn có thể thực hiện các bước bảo vệ, loại bỏ các phần mã không được tham chiếu (lớp, phương pháp, trường, v.v.) Vì vậy, bạn vượt qua lỗi đó liên quan đến kích thước bộ đệm.

Nhưng bảo vệ có thể không phải là giải pháp mọi lúc, bạn vẫn có khả năng vượt quá giới hạn kích thước bộ đệm.

Facebook có giải pháp cho việc này: "Chia ứng dụng của chúng tôi thành nhiều tệp dex". Xem: https://www.facebook.com/notes/facebook-engineering/under-the-hood-dalvik-patch-for-facebook-for-android/10151345597798920

Các vấn đề liên quan