Android for x86 †Android kernel (AOSP版) tips for x86 †
kernel 取得方法 †$ 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 †
$ cd ~/ $ cd kernel/android_kernel $ cp arch/x86/configs/i386_defconfig .config $ make menuconfig Android に必要なモジュール(主に staging にあります)を導入します。 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行目に記述ミスがあるためです。 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 に変更すると続きます。 参考サイト 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’:
$ ls include/asm asm-offsets.h
* 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>
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; 参考サイト: Android-x86 1.6-r2 †
Android-x86 から 2010年3月中旬に Android-x86 1.6r2 がリリースされました。 ソースファイルの取得とビルド †環境構築は、過去のバージョンのものを使用しています。
ソースファイルの取得は、android-x86.org から取得しています。 $ 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 というディレクトリが $ 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 †USB Disk(2GB) をビルドしたマシンに挿し、ext3でフォーマットします。 # vfat でも動作できるとのことですが、今回は試していません。 #ここでは /media/disk にマウントされた場合で記載します。 $ sudo cp -fr android-system /media/disk/
注:USB Disk の /dev 以下の位置を確認して作業してください。 $ sudo grub-install --root-directory=/media/disk --no-floppy /dev/sdb
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 以上で準備は完了です。 #サスペンドに入ると復帰ができないのでディスプレイは常時点灯にしました。
過去のバージョン †2009/04 cupcake †この項目はミラクル・リナックス中河 宏文さんによるITproの記事「「Android」をx86パソコンで動かしてみよう」、 Androidは日々更新されているため、以下の内容は全て確認時点のものとなります。 ファイルの編集にあたり http://code.google.com/p/patch-hosting-for-android-x86-support/downloads/list
にあるパッチ boot_able_img_v2.patch を適用しました。
USBディスクへの移植手順 †
ビルドに必要なパッケージのインストール †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の導入 †
今回はcupcakeを利用します。 $ mkdir cupcake $ cd cupcake $ repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake $ repo sync
$ vi ./.repo/local_manifest.xml <manifest> <project name="platform/vendor/asus/eee_701" path="vendor/asus/eee_701"/> </manifest>
kernelの準備 †
使用する際は .config とリネームして make oldconfig make menuconfig を実行してください。
USBディスクでの起動準備 †
解像度一覧を出力するためvga=askとなっていますが、IdeaPadでは現状640x480まで kernel /boot/vmlinuz root=/dev/sdb1 init=/init rw vga=0x311 rootwait としました。
以上で、USBディスク起動の場合は終了です。 制限事項:IdeaPadではUSBマウスのみ動作を確認しています。 by syariten
|