10

私はいくつかの Linux ツール (およびいくつかの独自の C コード) を Android にクロスコンパイルしてきましたが、直面している課題の 1 つは、Android の libc に欠落しているコンポーネントや削除されたコンポーネントがいくつかあることです。 Android の libc (たとえば、このhttp://credentiality2.blogspot.com/2010/08/compile-ncurses-for-android.htmlのような問題)

Q1 : arm ツールチェーン (または ndk-build) を使用してクロスコンパイルしているときに、glibc (およびその他の依存関係) に対して静的にリンクするにはどうすればよいですか?

Q2 : Android のバイナリ用に glibc に対して静的にリンクするのは良い考えですか? 静的リンクを開始すると、何かが壊れることを予期する必要がありますか? パフォーマンス/メモリの問題はありますか?

ここから静的リンクと動的リンクの長所と短所のほとんどを理解しています - C++アプリケーション - ライブラリに静的リンクまたは動的リンクを使用する必要がありますか? および 静的リンクと動的リンク

したがって、バイナリをクロスコンパイルするときに Android 用の glibc を静的にリンクする必要があるかどうかを知りたいと思います。

4

2 に答える 2

5

最初に libc に関する小さなメモ。Android libc は、GNU libc (glibc) ではなく、Bionic libc ( https://github.com/android/platform_bionic/ ) です。したがって、NDK に含まれる libc は Bionic であり、Android デバイスで利用できる libc と同様です。

glibc に関する限り、NDK でビルドすることが可能です。ただし、Android デバイスにインストールすると、その名前がシステム libc と衝突します。これは、動的ライブラリを構築する場合のみであることに注意してください。GNU libc を静的ライブラリとしてビルドすると、静的ライブラリをインストールする必要がないため、上記の問題全体が回避されます。

あなたの質問に答えるために:

  1. Q1: NDK を使用して glibc をビルドしている場合、Android.mk は変数 BUILD_STATIC_LIBRARY を使用して静的ライブラリをビルドします。ただし、NDK を使用しない場合は、おそらく多くの頭痛の種になる必要があります (どの程度かはわかりません)。静的または動的な glibc のビルドを試していないため、これについては詳しく説明できません。また、glibc との静的リンクは、少なくとも非モバイル プラットフォームでは推奨されないようです。

  2. 破損の観点からは、静的リンクと動的リンクの間に違いはありません。起動の観点から見ると、動的ライブラリのロード手順が不要なため、静的実行可能ファイルの起動が速くなります。静的または動的にリンクされた実行可能ファイルには、メモリまたは実行速度のペナルティはありません。静的実行可能ファイルの場合、ディスク ストレージ要件が大きくなります。

bionic libc の欠落機能に関する問題に関しては、ほとんどの GNU ソフトウェアで使用されている方法を使用できます。つまり、システム ライブラリに欠落している関数の独自の実装を提供します。Android 用に file-5.11、GNU make 3.82、diffutils-2.8 をコンパイルし、NDK ツールチェーン/インクルード/ライブラリを autotools (./configure ...) に渡します。これらのプログラムには、標準ライブラリがそれらを提供しない場合に備えて、ほとんどの非コア ライブラリ関数の実装が含まれているようです (この場合は Bionic)。

注:静的glibcを構築して、成功/失敗したときに回答を更新しようとします。

于 2012-05-01T09:32:38.043 に答える
2

bionic の代わりに glibc を使用する場合は、ndk ではなく (互換性のあるカーネル世代) arm-linux ディストリビューションのツールチェーンの使用を検討する価値があるかもしれません。これは、コマンド ライン実行可能ファイルを生成している場合に特に当てはまります。(実験的に Android デバイス上の chroot debian 環境を G1 まで押し込んでいます)

jni サブシステム (ネイティブ アプリケーション コードの公式に承認された唯一の手段である) の場合、どちらのツールチェーンでも少し「興味深い」ものになる可能性があります。 Dalvik VM をサポートします。おそらく、ライブラリ自体の依存関係を静的にリンクすると、名前の競合に遭遇することはありませんが、どのパスを選択しても、内部の仕組みについての学習経験になると思います-それは必ずしも悪いことではありません.

ncurses が必要ですか? ndkでAndroid用のcursesを1回ビルドすることに成功しました。また、プログラムがそれを真剣に利用しているのか (つまり、実際にかなりのテキストの書式設定を行っているのか)、それともターゲット システムで利用できると想定されていたために、単に何かの目的で使用しているのかを検討してください。

于 2012-05-01T12:37:53.817 に答える