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'
}
誰か助けてください??
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);
...
}
_
お役に立てば幸いです。
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{
...
}
上記のクラッシュの問題を解決しました。未使用の依存関係をいくつか削除し、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;
}
この背後にあるロジックを覗き見していませんが、私の場合は、build.gradleのcompile '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に変更しました。
ShrinkProdDebugMultiDexComponentsタスク Proguardを呼び出す なので、このエラーはProguard コード から発生します。
私の推測では、最新バージョンのOlive Office SDKを使用していないと思います(おそらく、バグのある、または誤って構成されたProguardバージョンで難読化されています)。この場合は、SDK開発者から最新バージョンを入手してください。
回避策については、 this 同様のバグを確認してください。 wontfixステータスで閉じられましたが、 このブログ投稿 はProguardコードにパッチを適用する方法を説明しています。
同様の問題について、Eric Lafortune(Proguardの作者)による this および that の回答も確認してください。
以下のように依存関係を変更してください:
編集された依存関係:
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ファイルが含まれているためです。
ありがとう!