「dx」のドキュメントはありますか?
特に、--core-library
オプションが何をするのか知りたいです。
これは、一部のフレームワーク JAR ファイル ( core.jar、framework.jarなど)をビルドするときにのみ使用される特別な目的のフラグです。通常、dx は java.* または javax.* クラスの処理を拒否します。したがって、このオプションは、これらすべてのクラスが実際に定義されているcore.jarに使用されます。
アプリケーションに java.* または javax.* クラスを含めようとすると、dx ソース ( dalvik/dx/src/com/android/dx/command/dexer/Main.java ) からの関連する宣伝文句が出力されます。 .
コア ライブラリを構築しない場合のコア クラス (java.* または javax.*) の不適切な使用または誤った使用。これは多くの場合、IDE (Eclipse など) を使用しているときに、コア ライブラリ ファイルをアプリケーションのプロジェクトに誤って含めたことが原因です。コア クラスを意図的に定義していないことが確実な場合は、これが何が起こっているかの最も可能性の高い説明です。
ただし、実際にはコア名前空間でクラスを定義しようとしている可能性があります。そのソースは、たとえば Android 以外の仮想マシン プロジェクトから取得した可能性があります。これは確実に機能しません。少なくとも、アプリとプラットフォームの将来のバージョンとの互換性が損なわれます。また、合法性が疑わしいこともよくあります。
アプリケーションをコンパイルするのではなく、完全な仮想マシン ディストリビューションを作成する一部としてのみ適切なコア ライブラリをビルドする場合は、「--core-library」オプションを使用してこのエラー メッセージを抑制します。「--core-library」を使用しても実際にはアプリケーションをビルドしている場合は、アプリケーションがまだビルドまたは実行に失敗する可能性があることに注意してください。たとえば、オペレーティング システムをアップグレードすると、アプリケーションが機能しなくなったことに気付いた顧客が怒っていることに備えてください。この問題の責任はあなたにあります。
たまたまコア パッケージにあるコードを合法的に使用している場合、最も簡単で安全な代替手段は、そのコードを再パッケージ化することです。つまり、問題のクラスを独自のパッケージ名前空間に移動します。これは、コア システム クラスと競合しないことを意味します。JarJar は、この取り組みに役立つツールです。これができないとわかった場合、それはあなたがたどっている道が最終的に痛み、苦しみ、悲しみ、嘆きにつながることを示しています.
Dxの--core-libraryオプションは、誤って Android アプリに Java コア ライブラリを含めることを防ぐ愚かさチェックをバイパスします。
java.*またはjavax.*名前空間にパッケージを含むライブラリを含めようとすると、Dx は barf を実行します。その名前空間のクラスは、他の JDK の「コア」クラスに依存する可能性が高く、Android に存在しない可能性があるため、アプリが壊れる可能性があると考えられています。
もちろん、Java パッケージがjava.*またはjavax. * で始まるからといって、それが適切な JDK に依存しているとは限りません。Android では問題なく動作する可能性があります。自分が何をしているのか分かっていて、Java/x.* クラスが JDK コア クラスに依存していないことがわかっている場合は、JarJar などのツールを使用して、JAR ファイルを別の名前空間に再パッケージ化することをお勧めします。
そうは言っても、愚かさのチェックを回避するには、--core-libraryオプションを dx に追加します。fromの最後の行を変更$ANDROID_HOME/platform-tools/dx
し、
exec java $javaOpts -jar "$jarpath" "$@"
に、
exec java $javaOpts -jar "$jarpath" --core-library "$@"
私の場合、JAXBに依存するJacksonに依存するライブラリを含めていました。私にとっては、愚かさチェックをオーバーライドすることは受け入れられました。なぜなら、ライブラリの Jackson の使用は JSON のみであり、XML シリアライゼーションではなかったからです (実装ではなく JAXB API ライブラリのみを含めます)。もちろん、これについてよりクリーンな方法があればいいのにと思いますが、Jackson を使用しないように最上位ライブラリを書き直すことは選択肢ではありませんでした。