java.lang.NoClassDefFoundErrorの解決に失敗した。: Lcom/apache/commons/desc/binary/Hex
バージョンアップを繰り返した後、突然いくつかのモデルでクラッシュが発生しました:
10.0のテスト機では問題がありましたが、6.0のテスト機では問題ありませんでした。
問題の特定と解決
org.apache.commons.codec.binary.Hex
異なるモデルの上記のパフォーマンスに基づいて、クラスのロードを検証するコードを使用して、検証コードは次のとおりです:
try {
Class.forName("org.apache.commons.codec.binary.Hex");
Log.e("HexTest","success");
} catch (ClassNotFoundException e) {
e.printStackTrace();
Log.e("HexTest","failed");
}
10.0の携帯電話ではFALIED、6.0の携帯電話ではSUCCESSが出力されることが確認されています。
org.apache.commons.codec.binary.Hex
このクラスは実際に何をするのですか?どのパッケージの下にあるのですか?org.apache.commons.codec.binary.Hex
プロジェクトのコードをグローバルに検索しましたが、見つかりませんでした。
まず問題を解決するために、Apache Commons Codecある適切なjarパッケージを見つけて、以下の方法でプロジェクトに依存関係を追加しました:
compile group: 'commons-codec', name: 'commons-codec', version: '1.14'
とりあえず問題解決。
問題の原因分析
次に、この問題の原因を分析するために、問題の核心は、6.0携帯電話は、このクラスにロードすることができ、10.0携帯電話をロードすることはできません、最初の推測は、携帯電話のシステムは、このクラスを内蔵し、携帯電話の上位バージョンは、非表示にするには、このクラスにデフォルト。
その後、この反復のコードの詳細な調査の後、可能な原因を発見した、つまり、コンパイルされたバージョンcompileSdkVersionにアップグレードしてから、compileSdkVersionに戻って、この問題は本当になくなっています。
api 28はAndroid 9に対応しています。詳細はAndroidのバージョン履歴をご覧ください。
さて、問題はcompileSdkVersionが27から28になったことと、このapacheパッケージのHIDEアップにどんな関係があるのでしょうか?
ふと、Android 6.0からApache HTTPクライアントのサポートがなくなったことを思い出したのですが、これもapacheのパッケージなのですが、何か関係があるのでしょうか?公式サイトを見てみると、このように説明されています:
Apache HTTP クライアントの非推奨
Android 6では.0 Apache HTTPクライアントのサポートがAndroid 9から削除された。Android 9から、このコンテンツ・ライブラリはブートクラスパスから削除され、デフォルトではアプリで利用できない。
org.apache.http.legacy
のjarパッケージを見つけて、以下のように分析します:
AndroidManifest.xmlに以下を追加するだけです:
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
もちろん、別の方法もあります。モジュールのbuild.gradleに以下のコードを追加するだけです:
android {
useLibrary 'org.apache.http.legacy'
}
org.apache.http.legacy
sdk/platforms/android-xx/options/
各バージョンのAndroid sdkには、以下のようにパスの下にあるjarパッケージがあります:
org.apache.commons.codec.binary.Hex
org.apache.commons.codec.binary.Base64
org.apache.http.legacy
これまでのところ、問題の原因は、Androidはjarパッケージがそれらを含んで付属しているため、通常、クラスまたはこれらのクラスを参照することができます考え出した。あなたのプロジェクトのcompileSdkVersionはapi 28以上である場合は、この問題に注意を払う必要があります。