アプリでFileProvider
を使用しています。いつものように、<Provider>
タグのAndroidManifest.xml
以下のファイル。
<provider
Android:name="Android.support.v4.content.FileProvider"
Android:authorities="com.jk.Android.fileprovider"
Android:exported="false"
Android:grantUriPermissions="true">
<meta-data
Android:name="Android.support.FILE_PROVIDER_PATHS"
Android:resource="@xml/file_paths" />
</provider>
Android Lollipop
バージョンを持つデバイスで正常に動作します。KitKat
バージョンで試してみると、次のエラーが表示されます。
FATAL EXCEPTION: main
Process: com.jk.Android.perfectphotoeditor2018, PID: 24992
Java.lang.RuntimeException: Unable to get provider Android.support.v4.content.FileProvider: Java.lang.ClassNotFoundException: Didn't find class "Android.support.v4.content.FileProvider" on path: DexPathList[[Zip file "/data/app/com.jk.Android.perfectphotoeditor2018-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.jk.Android.perfectphotoeditor2018-2, /system/lib]]
at Android.app.ActivityThread.installProvider(ActivityThread.Java:5071)
at Android.app.ActivityThread.installContentProviders(ActivityThread.Java:4648)
at Android.app.ActivityThread.handleBindApplication(ActivityThread.Java:4588)
at Android.app.ActivityThread.access$1500(ActivityThread.Java:151)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1290)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:136)
at Android.app.ActivityThread.main(ActivityThread.Java:5299)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:515)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:932)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:748)
at dalvik.system.NativeStart.main(Native Method)
Caused by: Java.lang.ClassNotFoundException: Didn't find class "Android.support.v4.content.FileProvider" on path: DexPathList[[Zip file "/data/app/com.jk.Android.perfectphotoeditor2018-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.jk.Android.perfectphotoeditor2018-2, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.Java:56)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:497)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:457)
at Android.app.ActivityThread.installProvider(ActivityThread.Java:5056)
at Android.app.ActivityThread.installContentProviders(ActivityThread.Java:4648)
at Android.app.ActivityThread.handleBindApplication(ActivityThread.Java:4588)
at Android.app.ActivityThread.access$1500(ActivityThread.Java:151)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1290)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:136)
at Android.app.ActivityThread.main(ActivityThread.Java:5299)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:515)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:932)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:748)
at dalvik.system.NativeStart.main(Native Method)
this のような多くのソリューションを試しましたが、うまくいきません。だから、この問題を解決するために私を助けてください。
build.gradle依存関係:
dependencies {
compile 'com.Android.support.constraint:constraint-layout:1.0.2'
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.Android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.Android.support', module: 'support-annotations'
})
configurations.all {
resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'
}
testCompile 'junit:junit:4.12'
/* Add the CSDK framework dependencies (Make sure these version numbers are correct) */
// compile 'com.aviary.Android.feather.sdk:aviary-sdk:3.6.3'
compile 'com.Android.support:appcompat-v7:25.4.0'
compile 'com.Adobe.creativesdk.foundation:auth:0.9.1251'
compile 'com.Adobe.creativesdk:image:4.8.4'
compile 'com.localytics.Android:library:4.0.1'
compile 'com.Android.support:design:25.4.0'
compile 'com.Android.support:multidex:1.0.2'
compile 'com.Android.support:support-v4:25.4.0'
compile 'com.intuit.sdp:sdp-Android:1.0.4'
compile 'com.github.bumptech.glide:glide:4.3.1'
compile 'com.google.Android.gms:play-services-ads:9.4.0'
implementation 'com.Android.support:support-v4:25.4.0'
}
AndroidXに移行した場合は、AndroidManifest.xml
の名前をandroidx.core.content.FileProvider
に変更する必要があります
それが私の場合のクラッシュでした。
同じ質問がありますが、このドキュメントは私の問題を解決します。 https://developer.Android.com/studio/build/multidexAndroid multidex
before Android 5.0、次の方法でmultidexを使用する必要があります。
Android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 28
multiDexEnabled true
}
...
}
dependencies {
compile 'com.Android.support:multidex:1.0.3'
}
次に、アプリケーションを変更し、次の3つの方法のいずれかを選択します。
アプリケーションを実装しない場合:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.example.myapp">
<application
Android:name="Android.support.multidex.MultiDexApplication" >
...
</application>
</manifest>
カスタムアプリケーションがある場合は、次のように変更できます。
public class MyApplication extends MultiDexApplication { ... }
ベースアプリケーションを置き換える場合は、次のように変更できます。
public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
これで問題が解決することを願っています。
Android Multidexのドキュメントをよく読んだ後、一般的に見逃している構成がJava.lang.NoClassDefFoundError
の原因であることがわかりました。65Kの参照制限で、まだJava.lang.NoClassDefFoundError
を取り除くことができない場合、これらの手順に従う必要があります。
次の行を追加します(例外が発生している絶対クラス名)
Android.support.v4.content.FileProvider
Build.gradleを次のように変更します
Android {
buildTypes {
release {
multiDexKeepFile file('multidex-config.txt')
...
}
}
}
注:特定のビルドタイプまたはその両方に追加するには、defaultConfig
で宣言します。
Androidビルドツールは、必要に応じてプライマリDEXファイル(classes.dex)とサポートDEXファイル(classes2.dex、classes3.dexなど)を構築します。ビルドシステムはすべてのDEXをパッケージ化しますファイルをAPKに追加します。
実行時に、multidex APIは特別なクラスローダーを使用して、メインのclasses.dexファイルでのみ検索するのではなく、使用可能なすべてのDEXファイルでメソッドを検索します。
Multidexアプリ用の各DEXファイルをビルドする場合、ビルドツールは複雑な意思決定を実行して、アプリが正常に起動できるように、プライマリDEXファイルで必要なクラスを決定します。 起動時に必要なクラスがプライマリDEXファイルで提供されていない場合、アプリはerror
Java.lang.NoClassDefFoundError
でクラッシュします。
これは、ビルドツールがこれらのコードパスを認識するため、アプリコードから直接アクセスされるコードでは発生しませんが、使用するライブラリに複雑な依存関係がある場合など、コードパスが見えにくい場合に発生する可能性があります。たとえば、コードがイントロスペクションまたはネイティブコードからのJavaメソッドの呼び出しを使用する場合、これらのクラスはプライマリDEXファイルで必要と認識されない場合があります。
したがって、Java.lang.NoClassDefFoundError
を受け取った場合は、 multiDexKeepFile (上記を参照)または multiDexKeepProguard ( ドキュメントを参照 )ビルドタイプのプロパティ。 multiDexKeepFileまたはmultiDexKeepProguardファイルのいずれかでクラスが一致した場合、そのクラスはプライマリDEXファイルに追加されます。
Multidexの完全なドキュメントについては、 https://developer.Android.com/studio/build/multidex を参照してください
プロジェクトで「multiDexEnabled」をfalseに設定すると、エラーが修正されました。マニフェストに移動して追加
Android {
defaultConfig {
multiDexEnabled false
}}
これがお役に立てば幸いです
AndroidManifest.xmlをクリックして、「テキスト」と「マージされたマニフェスト」が表示されるファイルページの下部を見てから、「マージされたマニフェスト」をクリックします-> "「Android.support.v4.content.FileProvider」を検索して「androidx.core.content.FileProvider」
それ、それ、正確な解決策。
次のコードは私のために機能します(AndroidXに移行しました):
<provider
Android:name="androidx.core.content.FileProvider"
Android:authorities="${applicationId}.provider"
Android:exported="false"
Android:grantUriPermissions="true"
tools:ignore="WrongManifestParent">
<meta-data
Android:name="Android.support.FILE_PROVIDER_PATHS"
Android:resource="@xml/provider_paths" />
</provider>