2013年1月29日火曜日

Android開発環境を64bit Ubuntu 12.04.1LTSに構築する(挫折)

Androidの開発環境を64bit Ubuntu 12.04.1LTSに構築しようと色々調べまくったのでそれのまとめ。ちなみに私はどうやってもうまくいかないので途中で諦めて64bit Windows 7に環境を構築した。なので以下は不完全な情報だけれどもWebにあがっていた報告では下記情報で正常に動作したらしいので後続の方のためにも記しておく。

今回はOracle VirtualBoxをWindows 7 64bit上で動かし、そのVirtualBox上で動作しているUbuntu 12.04.1 LTS 64bitに環境を構築しようとした。


1、SDKの入手
なにはともあれSDKを入手する。
Get the Android SDK
上記のリンクから「DOWNLOAD FOR OTHER PLATFORMS」を選びLinux 64-bitを取得する。

※私はeclipseではなくintellij ideaをIDEにしているのでADT BundleではなくSDK Tools Onlyを選択した


2、インストール
※ADT Bundleを選択している場合はSetting Up the ADT Bundleを参考にしよう
Setting Up an Existing IDEを参考にしよう。忘れずに「Information for other platforms」をクリックしてLinuxの情報を開示し、ページ最下部にある「Troubleshooting Ubuntu」もクリックしよう。下記コマンドを実行するよう指示があるので忘れずに実行しよう。

sudo apt-get install ia32-libs

これを実行しておかないとAVD ManagerでVirtual Device自体の作成ができない。


3、プラットフォームとパッケージの選択
Adding Platforms and Packagesを参考にAndroid SDK Managerで必要なプラットフォームをインストールしよう。


4、確認
ここまでで基本的な設定は完了した。私は下記の場所へAndroid SDKを配置した。
/home/yoo/devs/android-sdk-linux

下記コマンドでAVD Managerを実行しVirtual Deviceを作成しよう。toolsに作業場所を移している。
yoo@yoo-UbuntuBox:~/devs/android-sdk-linux/tools$ ./android avd

※私は名前を「test」にしTarget Platformは2.1で作成した

適当に作ったVDを選択しStartボタンクリック→LaunchボタンクリックでAndroidフォンのスキンが起動し「A N D R O I D」の文字まで表示されるようだったらOKなのでこれ以上読み進める必要はない。失敗している場合はAndroidフォンのスキンに文字が表示されずに画面がブラックのままで固まる。


5、原因究明
なにはともあれ問題の箇所を把握しよう。ここでは「test」という名前のVDを作成してあるとする。
yoo@yoo-UbuntuBox:~/devs/android-sdk-linux/tools$ ./emulator -avd test -verbose

上記コマンドを実行すると下記のような内容が出力される。
emulator: found SDK root at /home/yoo/devs/android-sdk-linux
emulator: Android virtual device file at: /home/yoo/.android/avd/test.ini
emulator: virtual device content at /home/yoo/.android/avd/test.avd
emulator: virtual device config file: /home/yoo/.android/avd/test.avd/config.ini
emulator: using core hw config path: /home/yoo/.android/avd/test.avd/hardware-qemu.ini
emulator: Found AVD target API level: 7
emulator: 'magic' skin format detected: 320x480
emulator: autoconfig: -skin 320x480
emulator: autoconfig: -skindir (null)
emulator: keyset loaded from: /home/yoo/.android/default.keyset
emulator: found magic skin width=320 height=480 bpp=16

emulator: autoconfig: -kernel /home/yoo/devs/android-sdk-linux/platforms/android-7/images//kernel-qemu
emulator: autoconfig: -ramdisk /home/yoo/devs/android-sdk-linux/platforms/android-7/images//ramdisk.img
emulator: Using initial system image: /home/yoo/devs/android-sdk-linux/platforms/android-7/images//system.img
emulator: autoconfig: -data /home/yoo/.android/avd/test.avd/userdata-qemu.img
emulator: autoconfig: -initdata /home/yoo/.android/avd/test.avd/userdata.img
emulator: autoconfig: -cache /home/yoo/.android/avd/test.avd/cache.img
emulator: Physical RAM size: 512MB

Content of hardware configuration file:
hw.cpu.arch = arm
hw.ramSize = 512
hw.screen = touch
hw.mainKeys = yes
hw.trackBall = yes
hw.keyboard = no
hw.keyboard.lid = yes
hw.keyboard.charmap = qwerty2
hw.dPad = no
hw.gsmModem = yes
hw.gps = yes
hw.battery = yes
hw.accelerometer = yes
hw.audioInput = yes
hw.audioOutput = yes
hw.sdCard = no
disk.cachePartition = yes
disk.cachePartition.path = /home/yoo/.android/avd/test.avd/cache.img
disk.cachePartition.size = 66m
hw.lcd.width = 320
hw.lcd.height = 480
hw.lcd.depth = 16
hw.lcd.density = 160
hw.lcd.backlight = yes
hw.gpu.enabled = no
hw.camera.back = none
hw.camera.front = none
vm.heapSize = 16
hw.sensors.proximity = yes
hw.sensors.magnetic_field = yes
hw.sensors.orientation = yes
hw.sensors.temperature = yes
kernel.path = /home/yoo/devs/android-sdk-linux/platforms/android-7/images//kernel-qemu
kernel.parameters = android.checkjni=1
disk.ramdisk.path = /home/yoo/devs/android-sdk-linux/platforms/android-7/images//ramdisk.img
disk.systemPartition.initPath = /home/yoo/devs/android-sdk-linux/platforms/android-7/images//system.img
disk.systemPartition.size = 200m
disk.dataPartition.path = /home/yoo/.android/avd/test.avd/userdata-qemu.img
disk.dataPartition.size = 200m
avd.name = test
.
QEMU options list:
emulator: argv[00] = "./emulator-arm"
emulator: argv[01] = "-android-hw"
emulator: argv[02] = "/home/yoo/.android/avd/test.avd/hardware-qemu.ini"
Concatenated QEMU options:
./emulator-arm -android-hw /home/yoo/.android/avd/test.avd/hardware-qemu.ini
emulator: registered 'boot-properties' qemud service
emulator: nand_add_dev: system,size=0xc800000,initfile=/home/yoo/devs/android-sdk-linux/platforms/android-7/images//system.img
emulator: mapping 'system' NAND image to /tmp/android-yoo/emulator-5wqpJC
emulator: rounding devsize up to a full eraseunit, now c810000

emulator: nand_add_dev: userdata,size=0xc800000,file=/home/yoo/.android/avd/test.avd/userdata-qemu.img
emulator: rounding devsize up to a full eraseunit, now c810000

emulator: registered 'boot-properties' qemud service
emulator: Adding boot property: 'dalvik.vm.heapsize' = '16m'
emulator: Adding boot property: 'qemu.sf.lcd_density' = '160'
emulator: Adding boot property: 'qemu.hw.mainkeys' = '1'
emulator: Adding boot property: 'qemu.sf.fake_camera' = 'none'
emulator: nand_add_dev: cache,size=0x4200000,file=/home/yoo/.android/avd/test.avd/cache.img
emulator: Initializing hardware OpenGLES emulation support
Failed to load libGL.so
error libGL.so: cannot open shared object file: No such file or directory
Failed to load libGL.so
error libGL.so: cannot open shared object file: No such file or directory
emulator: Kernel parameters: qemu.gles=0 qemu=1 console=ttyS0 android.qemud=ttyS1 android.checkjni=1 ndns=1
emulator: Trace file name is not set

emulator: autoconfig: -scale 1
emulator: Could not open file: (null)/system/build.prop: No such file or directory
emulator: control console listening on port 5554, ADB on port 5555
emulator: sent '0012host:emulator:5555' to ADB server
emulator: ping program: /home/yoo/devs/android-sdk-linux/tools/ddms
emulator: ping command: /home/yoo/devs/android-sdk-linux/tools/ddms ping emulator 20.0 "VMware, Inc." "Gallium 0.4 on llvmpipe (LLVM 0x300)" "2.1 Mesa 8.0.4"

いくつかErrorが散見されるけれど下のほうに下記が見つかる。
Failed to load libGL.so
error libGL.so: cannot open shared object file: No such file or directory

どうやらOpenGL周りがインストールされていないようだ。それなので下記コマンドでインストールする。
sudo apt-get install libgl1-mesa-dev

インストールが完了したら再度実行してみよう。
yoo@yoo-UbuntuBox:~/devs/android-sdk-linux/tools$ ./emulator -avd test -verbose

ここでまた同じエラーが発生した場合はlibGL.soが想定とは違う場所にインストールされているはずなのでインストールされた場所を下記コマンドで見つけよう。

/usrに作業場所を移している。下記コマンドで下記の場所にlibGL.soが複数見つかった。
yoo@yoo-UbuntuBox:/usr$ sudo find -name libGL.so*
./lib/x86_64-linux-gnu/libGL.so
./lib/x86_64-linux-gnu/mesa/libGL.so.1
./lib/x86_64-linux-gnu/mesa/libGL.so
./lib/x86_64-linux-gnu/mesa/libGL.so.1.2
./lib/i386-linux-gnu/mesa/libGL.so.1
./lib/i386-linux-gnu/mesa/libGL.so.1.2

とりあえず適当にライブラリを選択しSimlinkする。
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1.2 ~/devs/android-sdk-linux/tools/lib/libGL.so

これで再度Emulatorを実行しよう。すると下記のようなエラーが発生する場合があるので、その場合は違うlibGL.soライブラリをSymlinkしよう。
Failed to load libGL.so
error libGL.so: wrong ELF class: ELFCLASS64


6、万策尽きた
ここまで体系的にやってきて動かなかったのと、/system/build.propのあたりもエラーっぽくなってるのに加え、まれにADB serverへ接続しようとして接続エラーになったりと、どれが直接敵な問題なのかも不明な状況で問題が噴出することに心が折れて諦めた。

以下は散発的にやったものでどれもうまくいかなかったけれどあわせて載せておく。

・3d accelerationをオフにする
VBox上でVirtual Deviceを動作させる場合は3d accelerationはオフにしないといけないらしく、オフにしたら動作したとの報告あり。

・yoo@yoo-UbuntuBox:~/devs/android-sdk-linux/tools$ ./emulator-arm -avd test -verboseで実行する
./emulatorではなく./emulator-armにしたら動作したとの報告あり。


ほかにもいくつか試した覚えがあるのだけれどメモしておかなかったので正確なところは覚えていない。revision 20以降のSDKで同様の症状に悩まされている人は結構いる模様。少しでも誰かの助けになれば幸いです。