web-dev-qa-db-ja.com

Android API19でのGradleMultidexビルドの問題

65k limitを回避するためにmultidexを有効にし、カスタマイズのためにproductFlavors(dev API21およびprodAPI 19)を有効にしたプロジェクトがあります。 API 21、つまりdevフレーバーでプロジェクトをビルドすることは成功しますが、API 19、つまりprodフレーバーでは、アプリタスクshrink{component}MultiDexComponentsで継続的に例外が発生します。

完全なエラーログ:

:app:shrinkProdDebugMultiDexComponents FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:shrinkProdDebugMultiDexComponents'.
> Java.io.IOException: Can't read [{Project Path}/app/build/intermediates/multi-dex/prod/debug/allclasses.jar] (Can't process class [com/olivephone/office/a/b/e/p.class] (Unknown verification type [17] in stack map frame))

build.gradle

apply plugin: 'com.Android.application'

Android {  
    compileSdkVersion 23  
    buildToolsVersion '23.0.0'  
    defaultConfig {  
        applicationId '{Project Name}'  
        minSdkVersion 15  
        targetSdkVersion 23  
        versionCode 1  
        versionName "1.0"  
        multiDexEnabled true  
    }  
    productFlavors {  
        dev {  
            // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin  
            // to pre-dex each module and produce an APK that can be tested on  
            // Android Lollipop without time consuming dex merging processes.  
            minSdkVersion 21  
        }  
        prod {  
            // The actual minSdkVersion for the application.  
            minSdkVersion 19  
        }  
    }  
    buildTypes {  
        release {  
            minifyEnabled false  
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'  
        }  
    }  
}  

dependencies {  
    compile fileTree(include: ['*.jar'], dir: 'libs')  
    compile 'com.Android.support:appcompat-v7:23.0.1'  
    compile 'com.Android.support:recyclerview-v7:23.0.1'  
    compile 'com.Android.support:cardview-v7:23.0.1'  
    compile 'com.oguzdev:CircularFloatingActionMenu:1.0.2'  
    compile 'com.google.code.gson:gson:2.3.1'  
    compile 'com.google.Android.gms:play-services:8.1.0'  
    compile 'com.Android.support:multidex:1.0.1'  
    compile files('libs/linkedin-j-Android.jar')  
    compile files('libs/itsrts-pptviewer.jar')  
    compile files('libs/signpost-core-1.2.1.1.jar')  
    compile 'org.Twitter4j:Twitter4j-core:4.0.2'  
    compile files('libs/universal-image-loader-1.9.2-SNAPSHOT-with-sources.jar')
    compile files('libs/dropbox-Android-sdk-1.6.3.jar')  
    compile files('libs/json_simple-1.1.jar')  
    compile 'com.joanzapata.pdfview:Android-pdfview:1.0.1@jar'  
    compile 'com.facebook.Android:facebook-Android-sdk:4.1.0'  
}

誰か助けてください??

11
Sidakpreet N

Android 5.0以降のMultidexサポート

Android 5.0以降は、アプリケーションAPKファイルからの複数のdexファイルの読み込みをネイティブにサポートするARTと呼ばれるランタイムを使用します。 ARTは、アプリケーションのインストール時にプリコンパイルを実行し、classes(.. N).dexファイルをスキャンして、Androidデバイスで実行できるように単一の.oatファイルにコンパイルします。詳細については、 Android 5.0ランタイム、ARTの紹介を参照してください。

これが、アプリがAPIレベル21で正常に動作している理由です。

Android 5.0より前のMultidexサポート

Android 5.0より前のバージョンのプラットフォームは、アプリコードの実行にDalvikランタイムを使用します。デフォルトでは、DalvikはアプリをAPKごとに1つのclasses.dexバイトコードファイルに制限します。この制限を回避するために、アプリのプライマリDEXファイルの一部になり、追加のDEXファイルとそれに含まれるコードへのアクセスを管理するmultidexサポートライブラリを使用できます。

したがって、最初に、正しい依存関係をインポートしたことを確認します。これは、行ったようです。

_dependencies {
  compile 'com.Android.support:multidex:1.0.0'
}
_

マニフェストで、multidexサポートライブラリのMultiDexApplicationクラスをアプリケーション要素に追加します。

_<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.Android.multidex.myapplication">
    <application
        ...
        Android:name="Android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>
_

その代わりに、アプリがApplicationクラスを拡張する場合は、attachBaseContext()メソッドをオーバーライドし、MultiDex.install(this)を呼び出してmultidexを有効にすることができます。

_public void onCreate(Bundle arguments) {
    MultiDex.install(getTargetContext());
    super.onCreate(arguments);
    ...
}
_

お役に立てば幸いです。

11

API 21では、API 21はすでにDalvikの代わりにARTを使用しているため、:app:shrinkProdDebugMultiDexComponentsコマンドは呼び出されません。したがって、multidexをネイティブにサポートします。

21未満のAPIの場合、コマンド:app:shrinkProdDebugMultiDexComponentsが実行されます。 build.gradleをチェックすると、すべて問題ないように見えます。

マルチデックスサポートを適切に設定しましたか?

Multidexをサポートするようにマニフェストを設定しましたか?

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.Android.multidex.myapplication">
  <application
    ...
    Android:name="Android.support.multidex.MultiDexApplication">
    ...
  </application>
</manifest>

または、実際にアプリケーションクラスを拡張する場合は、次のようにすることができます。

public class MyApplication extends Application {
    ...
    @Override
    protected void attachBaseContext(Context base) {
       super.attachBaseContext(base);
       MultiDex.install(this);
    }
    ...     
}

または、この「ビルド済み」バージョンを使用してください

public class MyApplication extends MultiDexApplication{

 ...     

}
1
Fadils

上記のクラッシュの問題を解決しました。未使用の依存関係をいくつか削除し、rx Java依存関係io.reactivex.rxjava。 Rxの代わりにJavaパッケージにいくつかのダミークラスを追加しました。これはすでにここで説明されています https://realm.io/docs/Java/latest

// File 1
package io.reactivex;
public class Flowable {
}
// File 2
package io.reactivex;
public class Observable {
}
// File 3
package io.reactivex;
public enum BackpressureStrategy {
   LATEST;
}
1

この背後にあるロジックを覗き見していませんが、私の場合は、build.gradlecompile 'com.Android.support:appcompat-v7:25.3.1'compile 'com.google.Android.gms:play-services:10.2.4'のバージョンの競合が原因でした。 )ファイル。

multidexを有効にするだけではうまくいきませんでした。他の解決策を探していると、play-servicesのバージョン競合の奇妙な問題について不平を言う人がいます。それで、私はコードの変更をバックトラックし、最終的にplay-servicesバージョンを10.2.4から10.2.1に変更しました。

1
Ankur

ShrinkProdDebugMultiDexComponentsタスク Proguardを呼び出す なので、このエラーはProguard コード から発生します。

私の推測では、最新バージョンのOlive Office SDKを使用していないと思います(おそらく、バグのある、または誤って構成されたProguardバージョンで難読化されています)。この場合は、SDK開発者から最新バージョンを入手してください。

回避策については、 this 同様のバグを確認してください。 wontfixステータスで閉じられましたが、 このブログ投稿 はProguardコードにパッチを適用する方法を説明しています。

同様の問題について、Eric Lafortune(Proguardの作者)による this および that の回答も確認してください。

0
Alex Lipov

以下のように依存関係を変更してください:

編集された依存関係:

compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.Android.support:appcompat-v7:23.0.1'
compile 'com.Android.support:recyclerview-v7:23.0.1'
compile 'com.Android.support:cardview-v7:23.0.1'
compile 'com.oguzdev:CircularFloatingActionMenu:1.0.2'
compile 'com.google.code.gson:gson:2.3.1'
compile 'com.google.Android.gms:play-services:8.1.0'
compile 'com.Android.support:multidex:1.0.1'
compile 'com.googlecode.linkedin-j:linkedin-j-core:1.0.416'
compile 'oauth.signpost:signpost-core:1.2.1.2'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.4'
compile 'com.googlecode.json-simple:json-simple:1.1'
compile 'org.Twitter4j:Twitter4j-core:4.0.2'
compile files('libs/itsrts-pptviewer.jar')
compile files('libs/dropbox-Android-sdk-1.6.3.jar')
compile 'com.joanzapata.pdfview:Android-pdfview:1.0.1@jar'
compile 'com.facebook.Android:facebook-Android-sdk:4.1.0'  

理由は、 'compile fileTree(dir:' libs '、include:[' * .jar '])'には、libsフォルダーにあるgradleへのすべてのjarファイルが含まれているためです。

ありがとう!

0
AndiGeeky