Software/Android

Android for x86

Android kernel (AOSP版) tips for x86

  • 2010/06/24 現在
    AOSP から取得した Android kernel についての tips です。
    この項目ではandroid-x86.org版 ではなくAndroid Open Source 版になります。

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

  • 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

  • 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 および AXIMOTEK 社製 Intel Atom 向けPico-ITX PICO821
動作させました。以下に手順を記載します。
使用した HFMB-22,PICO821 は共にディスクレスです。 手順は共に同じ手順で記載しています、また USB Disk(2GB)での boot 手順になります。

ソースファイルの取得とビルド

環境構築は、過去のバージョンのものを使用しています。
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

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
pico821_android.jpg
  • HFMB-22
atom-android1.6_01.jpg


atom-android1.6_02.jpg


atom-android1.6_03.jpg

過去のバージョン

2009/04 cupcake

この項目はミラクル・リナックス中河 宏文さんによるITproの記事「「Android」をx86パソコンで動かしてみよう」、
みずの@組み込みWGさんによる日本Androidの会 2009年3月のイベントでの発表資料「VMWareでx86版Android
(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ディスクへの移植手順

  • Ubuntu 8.04 or 8.10のマシンを用意します。

ビルドに必要なパッケージのインストール

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の導入

  • 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の準備

  • 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ファイルを置いておきます。

使用する際は

.config

とリネームして

make oldconfig
make menuconfig

を実行してください。

  • カーネルビルド
    $ make
    $ cd ..

USBディスクでの起動準備

  • 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
    添付ファイルのように編集する。
  • 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ディスクでの起動準備
  1. BIOS画面上でUSBディスクから起動するようにします。
  2. USBディスクをマシンに挿入し電源を入れます。
  3. grubのmenuにAndroidが表示されるのでそれを選択します。 これでAndroidが起動できるはずです。 
    ただし、USBディスクの認識が/dev/sdaになるものもあるなので
    その場合はgrubを/dev/sdaに編集してください。

以上で、USBディスク起動の場合は終了です。

制限事項:IdeaPadではUSBマウスのみ動作を確認しています。 
タッチパッドは現在動作しません。
また、VESAでは640x480の解像度のみ動作を確認しています。
wifiは動作していません。

by syariten

添付ファイル: filepico821_android.jpg 1037件 [詳細] fileatom-android1.6_03.jpg 1064件 [詳細] fileatom-android1.6_02.jpg 1126件 [詳細] fileatom-android1.6_01.jpg 1099件 [詳細] fileinit.rc 1852件 [詳細] fileconfig-x86 1590件 [詳細]

BC::labsへの質問は、bc9-dev @ googlegroups.com までお願い致します。
トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2010-07-12 (月) 18:36:31 (2838d)