Android開発ツール(ADT)バンドルは、「Linux 64ビット」用のZipパッケージとして利用できますが、 以下の要件を記載 :
64ビットディストリビューションは、32ビットアプリケーションを実行できる必要があります。
実際に、パッケージ化されたEclipseをFedora 17 64ビットシステムで実行するだけではエラーが発生します。これは、いくつかの開発ツールを「見つける」ことができないためです。 adb
またはaapt
:
Aaptの実行エラー:プログラムを実行できません "/ home/juser/local/adt-bundle-linux/sdk/platform-tools/aapt":error = 2、No such file or directory:error = 2、No such file or directory
「そのようなファイルはありません」は、$ HOME/localの下にあるため、誤解を招く可能性があります。
adt-bundle-linux/sdk/platform-tools/aapt
しかし、私はそれをシェルで実行することはできません:
~/local $ ./adt-bundle-linux/sdk/platform-tools/aapt
zsh: no such file or directory: ./adt-bundle-linux/sdk/platform-tools/aapt
ファイルを見る
$ file adt-bundle-linux/sdk/platform-tools/aapt
adt-bundle-linux/sdk/platform-tools/aapt: ELF 32-bit LSB executable, Intel 80386,
version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8,
not stripped
32バイナリであることがわかります。また、私のシステムは(現在のところ)32ビットアプリケーションを実行できないようです。
どうすれば変更できますか?現在のFedora 64ビットシステムで32ビットアプリケーションを実行できるようにするにはどうすればよいですか?
(もちろん、誰かが32ビットのバイナリを「Linux 64ビット」と呼ばれるバイナリパッケージに入れてしまう理由を尋ねることもできます...)
Eclipseがadb
などを見つけられないということに関しては、システムでそれらを実行するために必要な32ビットの共有ライブラリがないと実行できないためです。
32ビットライブラリに関しては、状況はかなり単純です。適切な32ビットライブラリをインストールする必要があるだけです。ここにある64ビットのFedora 17インストールでは、プライマリ64ビットライブラリは/ usr/lib64にあり、オプションの32ビットライブラリは/ usr/libにあります。したがって、sdk/platform-tools/adbでldd
を呼び出すと:
linux-gate.so.1 => (0xf7791000)
librt.so.1 => /lib/librt.so.1 (0xf776c000)
libncurses.so.5 => /lib/libncurses.so.5 (0xf7747000)
libpthread.so.0 => /lib/libpthread.so.0 (0xf772d000)
libstdc++.so.6 => /lib/libstdc++.so.6 (0xf7644000)
libm.so.6 => /lib/libm.so.6 (0xf7618000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xf75fb000)
libc.so.6 => /lib/libc.so.6 (0xf7449000)
/lib/ld-linux.so.2 (0xf7792000)
libdl.so.2 => /lib/libdl.so.2 (0xf7444000)
libtinfo.so.5 => /lib/libtinfo.so.5 (0xf7424000)
これらはすべて/ libにあることに注意してください。これは/ usr/libへのシンボリックリンクです(/ usr/lib64ではありません)。見て:
»file /lib/libc.so.6
/lib/libc.so.6: symbolic link to `libc-2.15.so'
»file /lib/libc-2.15.so
/lib/libc-2.15.so: ELF 32-bit LSB shared object [...]
32ビットの標準Cライブラリ。あなたができることは、32ビットのsdkツールを通過し、それらがldd
とリンクされているものを確認することです。私は手元に例はありませんが、何かが欠けている場合、ldd
は次のように報告します:
libc.so.6 => ??????
First、そう、lddが機能するためには、32ビットのglibcに付属する32ビットのローダーが必要です(これがないと、lddはそれを非実行可能ファイルと呼び、何も伝えません)。
»yum search glibc
glibc.i686 : The GNU libc libraries
glibc.x86_64 : The GNU libc libraries
これは省略されていますが、x86_64パッケージはすでに手元にあるものです。 i686は32ビットバージョンです。それをインストールしてください。
何もコンパイルされないため、「devel」パッケージは必要ありません。それを超えて、推測とyum whatprovides
/yum search
は役立つはずです(adbのリストを見ると、32ビットバージョンのC++ lib、ncurses、pthreads、および私が知らないいくつかのものが存在します)。
whatprovides
の使用に関する簡単なヒント:
»yum whatprovides libtinfo
No matches found.
»yum whatprovides libtinfo.so.5
[2 matches]
»yum whatprovides "*/libtinfo.so.5"
[4 matches]
;)
32ビットのglibcをインストールする必要があります。
# yum install glibc.i686
これにより、32ビットのバイナリを実行しようとしたときに、誤解を招く「そのようなファイルまたはディレクトリはありません」というメッセージが削除されます。これにより、64ビットのFedoraシステムは32ビットのバイナリを実行できます。
これにより、32ビットの動的実行可能ファイルでldd
を呼び出すときにldd
の誤解を招く「動的でない実行可能ファイル」メッセージが削除されます。
次に、不足している32ビットライブラリをインストールする必要があります。adt-bundle-linux/sdk/platform-tools
の下のバイナリはリンクされています。
# yum install zlib.i686 libstdc++.i686 ncurses-libs.i686 libgcc.i686
それでおしまい。
上記のパッケージ名を導出する方法の背景。たとえばの出力を見て
$ ldd adb
linux-gate.so.1 => (0xf774f000)
librt.so.1 => /lib/librt.so.1 (0xf7725000)
libncurses.so.5 => not found
libpthread.so.0 => /lib/libpthread.so.0 (0xf770b000)
libstdc++.so.6 => not found
libm.so.6 => /lib/libm.so.6 (0xf76df000)
[..]
つまり、adbには2つのライブラリがまだありません。
「見つかりません」ごとに、パッケージ名を検索する必要があります。例:
$ yum whatprovides '*libstdc++.so.6'
[..]
libstdc++-4.7.2-2.fc17.i686 : GNU Standard C++ Library
[..]
次に、パッケージのベース名を取得し、それに「.i686」を追加して、32ビットバージョンを取得します。
必要なパッケージは次の方法でインストールできます。
Sudo yum install redhat-lsb.i686