2011-06-21 2 views
8

VMにAndroid-x86をインストールする簡単なガイドが見つかりました(guide)。
Eclipseに接続し、すべてが正常に動作しますが、VM上で私のアプリをインストールすると、次のエラーで失敗します。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 

私はGoogleのエラーを検索し、問題を解決するために少しPythonスクリプトを見つけたが、それはdoesnの働いていない(script)。スクリプトの実行後、私は同じエラーを受けました。

Iは、Android-x86の2.2一般的な、より多くの詳細はここで見つけることができます使用します。Release 2.2

その問題を解決するための任意の可能性はありますか?

編集:

すべての2.2リリースをテストしました。ジェネリックとスパルタは一般的にしか動作しませんが、誰も私のAPKを受け入れません。
adb install <packagefile>でも試しました。

EDIT2:

私は@Vladからadvicedツールを試してみました。 apkに署名した後で部分的に動作します。最後に、apkToolsを使用し、apkEditの古いファイルをapktoolの新しいファイルに置き換えました。
しかし、adbを使用したインストールは、デバイスを待つか何も待たずにハングアップします。私がDDMSをeclipseと信じるならば、私は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/によって引き起こされます。

このメッセージフォルダには、現在所有者(10044)がインストールされています(10045)。以前の不正なインストールによって発生します。

たとえば、以前のインストールでエラーが発生して失敗し、作成したフォルダを削除しないでください。

フォルダーは他のアプリからのデータである可能性があるため、アンドロイドはそれを使用できません。 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をインストールしようとすると、ここで
は失敗です。 NDKを使用していますか?出力の「armeabi」

+0

はいネイティブコードを使用し、私のapk-fileでyesが生成された* .soです。しかし、どのように 'apktool dump badging'を使うか、オプションはありません。 – CSchulz

+0

ネイティブコードのターゲットCPUがx86システムで使用されているCPUと異なるように見えます。 で詳細を参照してくださいandroid-x86.org からNDKを使用してください: は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を使用し、apkoolの新しいファイルで 'apkEdit'の古いファイルを置き換えました。しかし、 'adb'を使ったインストールは、' 'waiting for device ''というメッセージが表示されるか、何も表示されません。私がDDMSをeclipseと信じるならば、私はapkをインストールしようとするたびにデバイスへの接続が失われます。 **編集:** "正常な" apkをインストールしようとすると失敗します: 'Failure [INSTALL_FAILED_INVALID_APK]' – CSchulz

0

問題がなければならなかった:確認する 一つの方法は、

が ネイティブコードのようなもののためにhttp://ibotpeaches.github.io/Apktool/

ルックを参照してください 「バッジapktoolダンプ」を使用することです 特定のデバイスにインストールされているアプリの「LinearAlloc」と呼ばれる固定サイズのバッファーを と決定する「dexopt」というプログラムを使用します。 IceCream SandwichやJelly Beanなどの新しいバージョン Androidの場合、バッファサイズは8または16 MBですが、古いバージョンではわずか5 MBの です。

apkに署名するときは、おそらく参照されていないコード部分(クラス、メソッド、フィールドなど)を削除するproguard手順を実行します。そのため、バッファサイズに関連するエラーを渡します。

しかし、proguardは毎回解決策ではないかもしれませんが、バッファサイズの制限を超える可能性があります。

Facebookには、「複数のdexファイルに分割する」というソリューションがあります。参照:https://www.facebook.com/notes/facebook-engineering/under-the-hood-dalvik-patch-for-facebook-for-android/10151345597798920

関連する問題