[[Software/Android]] - 目次 #contents * Android for x86 [#ve9179a5] * Android kernel (AOSP版) tips for x86 [#h43eeb1c] - 2010/06/24 現在~ AOSP から取得した Android kernel についての tips です。~ この項目ではandroid-x86.org版 ではなくAndroid Open Source 版になります。~ ** kernel 取得方法 [#p696774e] $ mkdir kernel_work $ cd kernel_work $ git clone git://android.git.kernel.org/kernel/common.git android_kernel $ cd android_kernel 2.6.29 の場合~ $ git checkout --track -b android-2.6.29 origin/android-2.6.29 2.6.32 の場合~ $ git checkout --track -b android-2.6.32 origin/android-2.6.32 ** android-2.6.29 [#x974b9cd] - 2010/06/24 現在~ android_kernel 内にkernel 2.6.29 が展開されています。~ .config は arch/x86/configs/i386_defconfig を使用しました。~ $ cd ~/ $ cd kernel/android_kernel $ cp arch/x86/configs/i386_defconfig .config $ make menuconfig Android に必要なモジュール(主に staging にあります)を導入します。~ ここで make を実行するとcpuset.c alarm.c でエラーが起こります。~ 1. kernel/cpuset.c ~ kernel/cpuset.c: In function ‘cpuset_can_attach’: kernel/cpuset.c:1360: error: ‘task’ undeclared (first use in this function) kernel/cpuset.c:1360: error: (Each undeclared identifier is reported only once kernel/cpuset.c:1360: error: for each function it appears in.) make[1]: *** [kernel/cpuset.o] エラー 1 make: *** [kernel] エラー 2 これは kernel/cpuset.c の1354行目に記述ミスがあるためです。~ (2010/06/24現在も修正されていませんでした)~ static int cpuset_can_attach(struct cgroup_subsys *ss, struct cgroup *cont, struct task_struct *tsk) { struct cpuset *cs = cgroup_cs(cont); int ret = 0; + // change task->tsk + // if ((current != task) && (!capable(CAP_SYS_ADMIN))) { + if ((current != tsk) && (!capable(CAP_SYS_ADMIN))) { const struct cred *cred = current_cred(), *tcred; if (cred->euid != tcred->uid && cred->euid != tcred->suid) return -EPERM; } if (cpumask_empty(cs->cpus_allowed) || nodes_empty(cs->mems_allowed)) return -ENOSPC; if (tsk->flags & PF_THREAD_BOUND) { task を tsk に変更すると続きます。~ 参考サイト~ http://zash-egg.seesaa.net/article/131182492.html ~ http://www.mail-archive.com/android-kernel@googlegroups.com/msg00368.html ~ ~ 続けていくともう一つエラーが起こります。~ ~ 2. drivers/rtc/alarm.c ~ もう一つのエラーはalarm.c で起こります。~ CC drivers/rtc/alarm.o drivers/rtc/alarm.c:16:27: error: asm/mach/time.h: No such file or directory drivers/rtc/alarm.c: In function ‘alarm_suspend’: ~ time.h が見つからないというエラーが起こります。~ time.h が確認できませんでしたのでdrivers/rtc/alarm.cを以下のように修正します。~ $ ls include/asm asm-offsets.h - alarm.c 12行目付近~ * GNU General Public License for more details. * */ + #ifdef __i386__ + #else #include <asm/mach/time.h> + #endif #include <linux/android_alarm.h> #include <linux/device.h> - alarm.c 320行目付近~ static void alarm_triggered_func(void *p) { struct rtc_device *rtc = alarm_rtc_dev; if (!(rtc->irq_data & RTC_AF)) return; ANDROID_ALARM_DPRINTF(ANDROID_ALARM_PRINT_INT, "rtcalarm triggered\n"); wake_lock_timeout(&alarm_rtc_wake_lock, 1 * HZ); } + #ifdef __i386__ + // Port this function from arch/arm/kernel/time.c + /** + * save_time_delta - Save the offset between system time and RTC time + * @delta: pointer to timespec to store delta + * @rtc: pointer to timespec for current RTC time + * + * Return a delta between the system time and the RTC time, such + * that system time can be restored later with restore_time_delta() + */ + static void save_time_delta(struct timespec *delta, struct timespec *rtc) + { + set_normalized_timespec(delta, + xtime.tv_sec - rtc->tv_sec, + xtime.tv_nsec - rtc->tv_nsec); + } + #endif int alarm_suspend(struct platform_device *pdev, pm_message_t state) { int err = 0; 参考サイト:~ https://review.source.android.com/#patch,sidebyside,6751,1,drivers/rtc/alarm.c~ ~ 以上で、android-2.6.29 のx86版ビルドが完了します。~ ~ * Android-x86 1.6-r2 [#m23df227] - 2010/03/29 現在 ~ Android-x86 から 2010年3月中旬に Android-x86 1.6r2 がリリースされました。~ http://www.android-x86.org/releases/releasenote_1_6_r2 ~ Eclair のポーティングも進んでいますが、リリースアナウンスが出ていますので ~ Android-x86 1.6r2 を DUX 社製 組込向けAtom ボード[[HFMB-22:http://www.dux.co.jp/product/hfmb-22.html]] および AXIMOTEK 社製 Intel Atom 向けPico-ITX [[PICO821:http://axiomtek.com/products/ViewProduct.asp?view=772]]で ~ 動作させました。以下に手順を記載します。~ 使用した HFMB-22,PICO821 は共にディスクレスです。 手順は共に同じ手順で記載しています、また USB Disk(2GB)での boot 手順になります。~ ** ソースファイルの取得とビルド [#qa0117c0] 環境構築は、[[過去のバージョン:]]のものを使用しています。~ 環境構築は、[[過去のバージョン]]のものを使用しています。~ OS は Ubuntu 8.04 です。~ ~ - ソースファイルの取得 ~ ソースファイルの取得は、android-x86.org から取得しています。~ ソースファイル取得のためのディレクトリを作成し、そのディレクトリで ~ repo を実行します。 ~ $ mkdir android-x86-1.6r2 $ cd android-x86-1.6r2 $ repo init -u git://git.android-x86.org/platform/manifest.git -b donut-x86 $ repo sync - ビルド ~ 動作をさせるx86 マシンは HFMB-22 ですが、TARGET_PRODUCT の指定は eeepc で行いました。~ $ make usb_img TARGET_PRODUCT=eeepc ビルドが完了後に、android-x86-1.6r2/out/target/product/eeepc/usb_boot というディレクトリが ~ 作成されています。このディレクトリ内の android-system/ にinitrd.img、 ~ install.img、kernel、ramdisk.img、system.imgがあります。~ $ cd ~/android-x86-1.6r2/out/target/product/eeepc/usb_boot $ ls android-system initrd.img install.img kernel ramdisk.img system.img ** USB Disk boot [#f52e7d68] USB Disk(2GB) をビルドしたマシンに挿し、ext3でフォーマットします。~ android-system をUSB Disk にコピーします。~ # vfat でも動作できるとのことですが、今回は試していません。 ~ #ここでは /media/disk にマウントされた場合で記載します。 ~ $ sudo cp -fr android-system /media/disk/ - grubのインストール ~ 注:USB Disk の /dev 以下の位置を確認して作業してください。 ~ $ sudo grub-install --root-directory=/media/disk --no-floppy /dev/sdb - grub の設定 ~ grub の menu.lst を編集します。~ $ sudo vi /media/disk/boot/grub $ sudo vi menu.lst menu.lst は android-x86-1.6r2/out/target/product/eeepc/usb_boot にあるmenu.lst の~ 内容とほぼ同じです。~ # HFMB-22 のシステムコントローラハブが US15W ですので VESA Mode で動かすことにしました。~ default=0 root (hd0,0) title Live USB - VESA Mode kernel /android-system/kernel root=/dev/ram0 androidboot_hardware=eeepc acpi_sleep=s3_bios,s3_mode quiet vga=788 SRC=/android-system initrd /android-system/initrd.img title Live USB - Debug Mode kernel /android-system/kernel root=/dev/ram0 androidboot_hardware=eeepc acpi_sleep=s3_bios,s3_mode vga=788 SRC=/android-system DEBUG=1 initrd /android-system/initrd.img 以上で準備は完了です。~ HFMB-22 に上記 USB Disk を挿し、電源投入後、BIOSで USB Disk が 1st boot になっていることを確認し ~ grub の menu で VESA Mode を選択し Android が起動した写真が以下のものになります。~ #サスペンドに入ると復帰ができないのでディスプレイは常時点灯にしました。 -PICO821 #ref(pico821_android.jpg,,50%)~ -HFMB-22 #ref(atom-android1.6_01.jpg,,50%);~ ~ #ref(atom-android1.6_02.jpg,,60%);~ ~ #ref(atom-android1.6_03.jpg,,60%); * 過去のバージョン [#lae6a92c] * 2009/04 cupcake [#r9fea9f7] この項目はミラクル・リナックス中河 宏文さんによる[[ITpro>http://itpro.nikkeibp.co.jp/]]の記事「[[「Android」をx86パソコンで動かしてみよう>http://itpro.nikkeibp.co.jp/article/COLUMN/20090219/325052/?ST=oss&P=4]]」、~ みずの@組み込みWGさんによる[[日本Androidの会 2009年3月のイベント>http://android.siprop.org/index.php?%CA%D9%B6%AF%B2%F1%2F2009%C7%AF3%B7%EE%A4%CE%A5%A4%A5%D9%A5%F3%A5%C8]]での発表資料「[[VMWareでx86版Android>http://android.siprop.org/index.php?plugin=attach&refer=%CA%D9%B6%AF%B2%F1%2F2009%C7%AF3%B7%EE%A4%CE%A5%A4%A5%D9%A5%F3%A5%C8&openfile=how-to-android-vmplayer-ubuntu.pdf]]」~ (PDFファイル)を参考に作成しました。(2009年4月中旬時点) ''Androidは日々更新されているため、以下の内容は全て確認時点のものとなります。'' ファイルの編集にあたり~ http://code.google.com/p/patch-hosting-for-android-x86-support/downloads/list にあるパッチ~ boot_able_img_v2.patch ~ cursor.patch ~ alarm.patch ~ e2fsprogs.patch ~ frameworks.patch (※) を適用しました。~ ※現在は frameworks_v2.patch に変更されているようです。 - 対象機種はLenovoのIdeaPad S10eになります。~ **USBディスクへの移植手順 [#va96115c] - Ubuntu 8.04 or 8.10のマシンを用意します。~ *** ビルドに必要なパッケージのインストール [#u3570077] Androidをビルドするために必要なパッケージをインストールする。 ~ $ sudo apt-get update $ sudo apt-get -y install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev valgrind g++ 注:前述の参考サイトではJDK6を利用していますが、 http://source.android.com/download ~ によると ''JDK 5.0, update 12 or higher. Java 6 is not supported, because of incompatibilities with @Override.'' ~ となっているため、今回はJDK5を利用しました(本ドキュメントの内容がJDK6で~ 利用可能かは未確認です)。 *** Androidの導入 [#t957e0d3] - repoのインストール ~ $cd ~ $ mkdir bin $ curl http://android.git.kernel.org/repo >~/bin/repo $ chmod a+x ~/bin/repo - JAVA_HOMEの設定 ~ $ export JAVA_HOME=/usr/lib/jvm/java-5-sun-1.5.hoge 注:hogeはインストールされたバージョンによって異なります。 ~ バージョンの確認をして、設定をしてください。~ $ export PATH=$PATH:~/bin - ソースコード取得 ~ 今回はcupcakeを利用します。~ $ mkdir cupcake $ cd cupcake $ repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake $ repo sync - manifestの作成 ~ IdeaPadへの導入であるがEeePC701のmanifestを使用する。~ $ vi ./.repo/local_manifest.xml <manifest> <project name="platform/vendor/asus/eee_701" path="vendor/asus/eee_701"/> </manifest> - 再度 repo sync $ repo sync - Android ソースファイル修正 ~ 電源管理インタフェースが無いと入力イベントを受け付けなくなるというバグがあるので修正します。~ $ vi frameworks/base/services/java/com/android/server/PowerManagerService.java 344行目付近 // assume nothing is on yet - mUserState = mPowerState = 0; + mUserState = mPowerState = SCREEN_BRIGHT; また、~ http://code.google.com/p/patch-hosting-for-android-x86-support/downloads/list ~ にある各patchをあてる - Androidのビルド ~ 上記準備が整ったらビルドします。 $ TARGET_ARCH=x86 TARGET_PRODUCT=eee_701 DISABLE_DEXPREOPT=true make installer_img *** kernelの準備 [#q5607ca4] - kernelの設定 $ cd kernel $ make i386_defconfig $ make menuconfig 以下の設定は最低限必要になります。 General setup ---> (-android) <-作成したものをわかりやすくするためです。 [*] Enable the Anonymous Shared Memory Subsystem Power management options ---> [*] Wake lock Device Drivers ---> [*] Misc devices ---> [ ] Android pmem allocator <-これがあるとビルドの際エラーになります。 <*> Binder IPC Driver <*> Low memory killer [*] Network device support ---> [*] Ethernet (1000 Mbit) ---> [*] Atheros L1E Gigabit Ethernet support (EXPERIMENTAL) Graphics support ---> <*> Support for frame buffer devices ---> [*] VESA VGA graphics support <*> Real Time Clock ---> [*] Android alarm driver 注:マウスを使用する場合は該当のマウスにチェックを入れてください。~ また、上記ではAtherosのEthernet Driverを使用していますが、機種によっては ~ Ethernet Driverの種類が違いますので適宜変更してください。~ ~ 参考のためにconfigファイルを置いておきます。~ #ref(config-x86) ~ 使用する際は ~ .config とリネームして~ make oldconfig make menuconfig を実行してください。~ - カーネルビルド ~ $ make $ cd .. *** USBディスクでの起動準備 [#uc0cf459] - USBディスクのフォーマット ~ $ sudo apt-get install gparted 「システム」−>「システム管理」ー>「パーティションエディタ」 にて「ext3」でフォーマットする。 - ファイルのコピー ~ 通常Ubuntuではオートマウントされます。 ~ マウント位置は/media/diskになります。 ~ $ sudo cp -fr out/target/product/eee_701/root/* /media/disk $ sudo cp -fr out/target/product/eee_701/system/* /media/disk/system/ $ sudo mkdir /media/disk/boot $ sudo chmod 666 /media/disk/system/usr/keychars/* $ sudo chmod 666 /media/disk/system/usr/keylayout/* $ sudo cp kernel/arch/x86/boot/bzImage /media/disk/boot/vmlinuz オートマウントされない場合は以下を試してみてください。~ $ sudo mount -t ext3 /dev/sdb1 /mnt/usb 注意:/mnt/usbにした場合はコピー先のディレクトリ位置が 変わります。~ - initrcの編集 ~ $ sudo vi /media/disk/init.rc 添付ファイルのように編集する。 #ref(init.rc) ~ - init.usb.shの作成 ~ $ sudo vi /media/disk/system/etc/init.usb.sh #!/system/bin/sh netcfg eth0 dhcp setprop net.dns1 4.2.2.2 実行権限を与える~ $ sudo chmod a+x /media/disk/system/etc/init.usb.sh - grubの設定 ~ $ sudo mkdir /media/disk/boot/grub $ sudo vi /media/disk/boot/grub/menu.lst default 0 timeout 3 hiddenmenu title Android root (hd0,0) kernel /boot/vmlinuz root=/dev/sdb1 init=/init rw vga=ask rootwait 解像度一覧を出力するためvga=askとなっていますが、IdeaPadでは現状640x480まで~ しか利用出来ないので今回は ~ kernel /boot/vmlinuz root=/dev/sdb1 init=/init rw vga=0x311 rootwait としました。~ - grubのインストール ~ 注意:USBディスクの/dev以下の位置を十分に注意してください。~ $ sudo grub-install --root-directory=/media/disk --no-floppy /dev/sdb $ sudo umount /media/disk - USBディスクでの起動準備 + BIOS画面上でUSBディスクから起動するようにします。 + USBディスクをマシンに挿入し電源を入れます。 + grubのmenuにAndroidが表示されるのでそれを選択します。 これでAndroidが起動できるはずです。 ~ ただし、USBディスクの認識が/dev/sdaになるものもあるなので ~ その場合はgrubを/dev/sdaに編集してください。 ~ 以上で、USBディスク起動の場合は終了です。~ ''制限事項:IdeaPadではUSBマウスのみ動作を確認しています。'' ~ ''タッチパッドは現在動作しません。'' ~ ''また、VESAでは640x480の解像度のみ動作を確認しています。'' ~ ''wifiは動作していません。'' ~ RIGHT:by syariten