2015-09-28 11 views
7

私は、65k limitと、productFlavors(開発API 21とプロダクトAPI 19)のカスタマイズを避けるためにを有効にしたプロジェクトを持っています。 API 21すなわちdevの味に私のプロジェクトをビルド は成功したがAPI 19すなわちPRODの味に、それが継続的にappタスクで私に例外を与えているshrink{component}MultiDexComponentsAndroid Gradle Multidex APIのビルドに関する問題

完全なエラーログ:

: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:[email protected]' 
    compile 'com.facebook.android:facebook-android-sdk:4.1.0' 
} 

何か助けてください?

+1

try clean build。 – QAMAR

+1

既にしました!あなたは運がありません –

+0

Proguardを使っていますか? –

答えて

0

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

編集依存関係: '(含まれ

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:[email protected]' 
compile 'com.facebook.android:facebook-android-sdk:4.1.0' 

理由::LIBS '含める[' *の.jar '] fileTree DIR)' をコンパイルする' ということですlibsフォルダにあるすべてのjarファイルをグラブします。

ありがとう!!

+0

まだ問題を解決していない。その他の回避策? –

8

Multidexのアンドロイド5.0をサポートし、高い

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

これは、のDalvikを使用する従来のAndroid 5.0へのプラットフォームの5.0

バージョンをAndroidに前にアプリケーションがAPIレベルで正常に動作している理由21

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

だから、まずあなたが正しい依存関係をインポートしたことを確認してください。マニフェストで

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)を呼び出すことができます。

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

私はあなたを助けてくれることを願っています。

+1

これを試してみましたが、同じエラー –

+0

ありがとう.. Bhuvesh私はアプリケーションファイルに以下のコードを追加します。それはトリックを行います、oncreateにBUNDLEはありません。その中でattachBaseContext()を使用しています。私はMULTIDEX JARを、実行時にapi 21の下でクラッシュしていた..今、その作業はその背後にある理由を知らない。 public void onCreate(){ \t \t MultiDex.install(this); \t \t super.onCreate(); \t \t //シングルトン \t \t sInstanceを初期化する=この; \t} – Ancee

1

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

21未満のAPIでは、コマンド:app:shrinkProdDebugMultiDexComponentsが実行されます。 build.gradleをチェックするとすべてがうまく見えます。これは次のことにつながります。

multidexサポートを正しく設定しましたか?

Multidexをサポートするようにマニフェストをセットアップしましたか?そう、この "事前に構築された" バージョン

public class MyApplication extends MultiDexApplication{ 

...  

} 
+2

すでにありました。運がない –

+0

使用されているが動作していない。 –

0

shrinkProdDebugMultiDexComponentsタスクinvokes Proguard

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

をか使用:あなたが実際にアプリケーションクラスを拡張する場合

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

OR、あなたはこれを行うことができますこのエラーはProguard codeからのものです。

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

回避方法としては、thisと同様のバグをチェックしてください。それはwontfixのステータスで終了しましたが、this blogpostはProguardコードの修正方法を説明しています。

また、同様の問題については、Eric Lafortune(Proguardの著者)の回答thisthatもチェックしてください。

1

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

有効にするとが有効になりませんでした。他の解決策を探しているうちに、ある人がバージョンコンフリクトの厄介な問題play-servicesについて苦情を申し立てました。だから、私はコードの変更を取り戻し、最後にのバージョンをplay-servicesから10.2.4から10.2.1に変更してくれました。

0

上記のクラッシュの問題を解決しました。私はいくつかの未使用の依存関係を削除し、また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; 
} 
関連する問題