20100925 sola-android
DESCRIPTION
日本Androidの会 中国支部 第14回勉強会の発表資料TRANSCRIPT
Androidを移植して遊ぶ自分専用端末を作る第一歩
自己紹介
● 名前
– sola● 仕事
– 大学卒業後、 7年間は携帯の開発
– 今年転職して、新しいことに挑戦中
● ブログと twitter– ブログ
● http://blog.sola-dolphin-1.net/
● http://twitter.com/sola_dolphin_1
参加しているグループ
● 日本 Androidの会● 横浜 Androidプラットフォーム部( PFへの興味で参加)
http://www.yokohama.android-pf.org/
横浜支部の人でなくても参加可能
● 日本 Android の会 町田支部(近所なので参加)
Android歴
● 2008春頃– 社内の人に言ってみたが、感心無し(携帯作ってるとこなのに ... )
● 2008秋頃– ソース公開をきっかけに、まじめにソースとか読み始めた
● 2008冬頃~ 2009春頃– AndroidDevPhone1 、 Armadillo-500FX 、 BeagleBoardを入手
● 2009~– ブログ書き始めた& twitterを始めた
– 仕事でも Androidに関われるようになった
● 2010春頃~– 新しいことを求めて転職
– アプリ作りに手を出し始めた。 A3に出すのが目標
普通に使ってる Android端末
● Xperia (電話として使ってます)● dynabook AZ
自分でいじった Android環境を動かした実機たち
● Armadillo-500FX● Armadillo-440● Armadillo-9● Armadillo-240● mini2440● SmartQ5
● BeagleBoard● BeagleBoard-xM● IGEPv2● TOUCHBOOK● Dev Phone 1● Dev Phone 2● Nexus One
※赤字はブログとかでネタにしたもの
本日の話の概要
● 移植する時にやること
● これまでハマったこと
● その他
扱う範囲
移植するときにやること
移植手順
1.Android用の Linux Kernelを作成する
2.動作確認
3.ユーザランドを作成する
4.動作確認
5.デバイスを追加したり、チューニングしたりする
Android用の Linux Kernelを作る
2通りの方法
● Googleが公開している Androidの Linux Kernelに、ターゲット固有のドライバ等を移植する
● ターゲットで既に動いている Linux Kernelに Androidのドライバ(変更点)を移植する
Androidの Linux Kernelにターゲット固有の部分を移植する
移植手順
● ターゲット固有の部分は、 vanilla kernel と差分を取って抽出する
Linux Kernelの配布場所は、 http://www.kernel.org/ターゲットのカーネルは、linux-2.6.32ベースの sola-kernelがあると仮定
●
●
●
● 差分を Androidの Linux Kernelに適用する
●
●
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.gz$ tar zxvf linux-2.6.32.tar.gz$ diff -crdN linux-2.6.32/ sola-kernel/ > sola-kernel.patch
$ git clone git://android.git.kernel.org/kernel/common.git$ cd common/$ git checkout -b android-2.6.32-work origin/android-2.6.32$ patch -p1 -E < ../sola-kernel.patch
既に動いている Linux KernelにAndroidのドライバを移植する
移植手順
● Androidのドライバは、 vanilla kernel と差分を取って抽出す
Linux Kernelの配布場所は、 http://www.kernel.org/Androidの Linux Kernelの配布場所は、git://android.git.kernel.org/kernel/common.git
●
●
●
●
●
● 差分を既に動いている Linux Kernelに適用する
●
●
$ git clone git://android.git.kernel.org/kernel/common.git$ cd common/$ git checkout -b android-2.6.32-work origin/android-2.6.32$ cd ../$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.gz$ tar zxvf linux-2.6.32.tar.gz$ diff -crdN linux-2.6.32/ common/ > android-2.6.32.patch
$ cd sola-kernel$ patch -p1 -E < ../android-2.6.32.patch
オススメしない例
Armadillo-500FXでやったこと
● Linux Kernelのバージョンを 2.6.27に上げつつ、ドライバをAndroidの Linux Kernelへ移植
●
●
●
●
● 差分を取って、 Androidの Linux Kernelに適用する
●
$ git clone git://android.git.kernel.org/kernel/common.git$ cd common$ patch -p1 -E < ../at6.patch
※masterブランチは android-2.6.27なので、使用する Linux Kernelのバージョンは 2.6.27となります
$ wget http://armadillo.atmark-techno.com/files/downloads/armadillo-500-fx/source/kernel/linux-2.6.26-at6.tar.gz$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.tar.gz$ tar zxvf linux-2.6.26-at6.tar.gz$ tar zxvf linux-2.6.26.tar.gz$ diff -crdN linux-2.6.26/ linux-2.6.26-at6/ > at6.patch
Armadillo-500FXでやったこと
● ハマるところ
– Armadillo-500FXの Linux Kernelは 2.6.26なので、これと一致するバージョンの Androidの Linux Kernelがない(今回の例では、 2.6.27を使用)
– そのため、前のスライドでのパッチ適用は失敗する箇所が多く、手動で適用する必要のある箇所が多くなる
– Linux Kernelのバージョンが異なることで、構造体や関数の型が変更になり、コンパイルエラーとか ...
– コンパイルエラーが出なくても、動かすと kernel panicになったりするなど ...
Armadillo-500FXでやったこと
● 解決策
– 頑張るしかないです ...
– 私はひたすらソースコードと睨めっこでした。
– 経験上、動かない原因はほぼ arch/arm/*** であることが多い
– JTAG-ICEがあると原因を追いかけ易いが、個人では手が出せない ...
– 調べても原因不明な場合は、 Android-Embedded-Japan へメールを投げてみる
– 英語が分かる人は android-porting も良いと思います
実機を使用せずに試す例
Android Emulator ( Goldfish )
● Emulatorの Linux Kernelが 2.6.29までしかないので、 2.6.31へバージョンを上げましたhttp://blog.sola-dolphin-1.net/archives/1858666.htmlhttp://blog.sola-dolphin-1.net/archives/1862864.html
● Linux Kernel 2.6.31に、 Goldfish向けの変更と Android用のドライバを一気に移植
● Goldfishは規模が小く、 Armadillo-500FXよりは楽
● ただし、一気に移植すると問題発生時にGoldfish向けの変更が悪いのか、 Android向けの変更が悪いのか切り分ける必要が出てきます
Emulatorの便利なところ
● Emulatorを使うと、実機無しで移植の試しが出来る
● デバッグも出来ます
この記事が分かり易くて良いと思います
Androidエミュレータで Linuxカーネルをデバッグ !!
http://monoist.atmarkit.co.jp/fembedded/articles/filesys/06/filesys_06a.html
● センサー等のデバイスを繋ぐことは出来ないけど、 Linux Kernelの中身を追うことが出来る。
役に立つドキュメント
● Android Platform Developer's Guide
http://source.android.com/porting/index.html
(こういうの、去年欲しかった ... )
Androidのユーザランドを作成する
その前に、Emulatorのイメージで動作させる
ソースからビルドしなくても動きます
Emulatorのイメージで起動させる手順
1.busyboxをクロスコンパイルする
2.Emulatorに busyboxを入れる
3.busyboxを使用してイメージを吸い出す
4.吸い出したイメージの中を変更する(設定ファイルのみ)
5.変更したイメージを実機にのせて動かす
手順 1と 2
● busyboxのクロスコンパイル
●
●
●
●
●
●
● busyboxのインストール
$ wget http://www.codesourcery.com/sgpp/lite/arm/portal/package6488/public/arm-none-linux-gnueabi/arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2$ tar jxvf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /opt/$ wget http://busybox.net/downloads/busybox-1.17.2.tar.bz2$ tar jxvf busybox-1.17.2.tar.bz2$ cd busybox-1.17.2$ export ARCH=arm$ export CROSS_COMPILE=/opt/arm-2010q1/bin/arm-none-linux-gnueabi-$ make menuconfig$ make CFLAGS=--static LDFLAGS=--static
$ adb push busybox /data/
手順 3
● busyboxを使用して必要なデータを取り出す
$ adb shell/ # export PATH=$PATH:/data/ # busybox tar zcvf /cache/system.tar.gz system/ # busybox tar zcvf /cache/sbin.tar.gz sbin/ # busybox cp init /cache// # busybox cp init.rc /cache// # busybox cp default.prop /cache// # exit# exit$ mkdir emulator-image$ adb pull /cache/ ./emulator-image/
手順 4
● 設定ファイルの変更
– init.rcのみ
変更点は以下mountのところのみ
mount rootfs rootfs / ro remount
mount yaffs2 mtd@system /system mount yaffs2 mtd@system /system ro remount
mount yaffs2 mtd@userdata /data nosuid nodev
mount yaffs2 mtd@cache /cache nosuid nodev
手順 5
● 実機にのせるファイルを用意する
data 空フォルダ作成
dev 空フォルダ作成
proc 空フォルダ作成
sys 空フォルダ作成
default.prop 吸い出したファイル
init 吸い出したファイル
init.rc 吸い出したファイル
sbin 吸い出したファイル
system 吸い出したファイル
これだけで動作します
Androidのユーザランドを作成する
● ターゲット毎に必要な変更箇所を簡単に紹介します
– BeagleBoard
– BeagleBoard-xM
– IGEPv2
– Armadillo-500FX
– Armadillo-440
まずは Androidのビルド
● ソースを取得してmakeを実行●
●
●
● make完了後、実機にのせるファイルをまとめる
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.2_r1.1$ repo sync$ make -j8
$ mkdir android-fs$ cp -a out/target/product/generic/root/* android-fs/$ cp -a out/target/product/generic/system/* android-fs/system/
BeagleBoard編
● BeagleBoard向けに変更する箇所– init.rc
BeagleBoard-xM編
● BeagleBoard-xM向けに変更する箇所– init.rc
IGEPv2編
● IGEPv2向けに変更する箇所– init.rc
Armadillo-500FX編
● Armadillo-500FX向けに変更する箇所– init.rc
Armadillo-440編
● Armadillo-440向けに変更する箇所– init.rc
まとめ
● 複数例紹介したけど、必要な変更点はほとんど同じ
● 他のターゲット向けにも、基本的には同じところを変更してあげれば動くと思います
● Androidをのせてみるのは、本当に簡単● 初めての場合、難しいのは Linux Kernelの部分ですので、既に Linuxが動作している実機を用意した方が良いと思います。
● カメラとかGPSとかセンサーとか無線 LANを動かしたい時はそれなりに手間です。(いずれどこかに整理したいと思っています)
BeagleBoardの環境を変更してみる
変更するところ
● 以下の環境変数を設定してみる( Froyoでの例)– TARGET_ARCH_VARIANT
– WITH_JIT
● SDカードを認識させる– vold.fstabの設定( eclairまでは vold.conf )
● 複数のターゲット向けに環境を設定する
– BeagleBoardや Armadillo向けに、別々に環境を用意するのはもったいないので、切り替えられるようにする
環境変数の設定
● 設定例
●
●
● TARGET_ARCH_VARIANTに設定可能な値は、
build/core/combo/arch/arm/に存在するものであれば可能
● WITH_JITは、 JITコンパイラを有効にするかの設定で、
trueにすると有効になる
● ビルド例
TARGET_ARCH_VARIANT := armv7-a-neonWITH_JIT := true
make TARGET_ARCH_VARIANT=armv7-a-neon WITH_JIT=true
SDカードを認識させる
● vold.fstabの設定( Froyo )
●
●
● vold.confの設定( Eclairまで)
●
●
● 設定すべき値を知る方法
●
●
# Mounts the first usable partition of the specified devicedev_mount sdcard /mnt/sdcard auto /devices/platform/mmci-omap-hs.0/mmc_host/mmc0
# ls -l /sys/devices/platform/mmci-omap-hs.0/mmc_host/mmc0-rw-r--r-- root root 4096 2000-01-01 00:00 ueventlrwxrwxrwx root root 2000-01-01 00:04 subsystem -> ../../../../../class/mmc_hostlrwxrwxrwx root root 2000-01-01 00:04 device -> ../../../mmci-omap-hs.0drwxr-xr-x root root 2000-01-01 00:00 power-r--r--r-- root root 4096 2000-01-01 00:04 slot_namedrwxr-xr-x root root 2000-01-01 00:00 mmc0:aaaa
## This is the direct uevent device path to the SD slot on the devicemedia_path /devices/platform/mmci-omap-hs.0/mmc_host/mmc0
ターゲット向けの設定ファイルを作る
● device/に設定ファイルを格納する– devices/sola/beagleboard/***
– devices/sola/armadillo500fx/***
※eclairまでは devicesではなく、 vendorでした
● 格納するファイルの例( BeagleBoardの場合)– AndroidBoard.mk
– AndroidProducts.mk
– BoardConfig.mk
– beagleboard.mk
– vendorsetup.sh
AndroidBoard.mk
● 記述例
●
●
●
●
●
●
オリジナルの init.rcは system/core/rootdirにあります
LOCAL_PATH := $(call my-dir)
# board specific init.rc#PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/init.rc:root/init.rc
# vold#PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/vold.fstab:system/etc/vold.fstab
AndroidProducts.mk
● 記述例
PRODUCT_MAKEFILES := \$(LOCAL_DIR)/beagleboard.mk
BoardConfig.mk
● 記述例
# config.mk# # Product-specific compile-time definitions.#TARGET_NO_BOOTLOADER := trueTARGET_NO_KERNEL := trueTARGET_CPU_ABI := armeabiBOARD_USES_GENERIC_AUDIO := trueUSE_CAMERA_STUB := trueTARGET_ARCH_VARIANT := armv7-a-neonWITH_JIT := true
beagleboard.mk
● 記述例
# Superclass$(call inherit-product, build/target/product/generic.mk)
PRODUCT_PACKAGES += \ LiveWallpapersPicker \ LiveWallpapers \ MagicSmokeWallpapers \ VisualizationWallpapers
# OverridesPRODUCT_NAME := beagleboardPRODUCT_DEVICE := beagleboardPRODUCT_MODEL := beagleboardPRODUCT_BRAND := beagleboardPRODUCT_MANUFACTURER := beagleboard
PRODUCT_LOCALES := ldpi hdpi mdpi ja_JP en_US
vendorsetup.sh
● 記述例
add_lunch_combo beagleboard-eng
ビルド方法
● トップディレクトリで以下を実行する
$ source build/envsetup.sh
$ lunch beagleboard-eng
● ビルドした結果は genericではなく、 beagleboardフォルダの下に格納されます
out/target/product/beagleboard
● 他のターゲット(例えば armadillo440 )の場合、 beagleboardのところを読み替えてください
これまでにハマったところ
Android起動直後に終了する
Android起動直後に終了する
● capcake ( Android1.5 )でよく目撃した例
解決方法 1
● BatteryServiceで状態をごまかす
詳細は、ブリリアントサービスさんのブログを参照。
バッテリードライバを見にいかず、
BatteryServiceでバッテリー FULLを返しています。
http://d.hatena.ne.jp/bs-android/20090603/1244043649
解決方法 2
● バッテリードライバを組み込む
考え方は、方法 1と同じ。方法 2では、ドライバで常にバッテリー FULLを返すようにする。数十行で書けます。
実際に使うには、(株)パイロンさんの公開しているドライバを使用するのが良いかと思います。http://pylone.jp/blog/virtual_battery
この方法の良いところは、 Androidに手を入れる必要が無いこと。
Androidが起動しない
● cupcake ( Android1.5 )から donut ( Android1.6 )へのバージョンアップ時に目撃した例
Androidのロゴ点滅で無限ループ
ここから進まない
原因
● センサーのライブラリ( system/lib/hw/sensors.xxx.so)
元々は Android Dev Phone1で donutを動かそうとした時、起動しなくて調べました。センサーのライブラリを外すと起動したため、センサーが原因だと判断。
しかし、当時は Android Dev Phone1向けのセンサーのソースコードが公開されていなかったため、 cupcake向けに自分で実装したソフトで確認。
結果、センサーのライブラリに原因があると判明。
解決方法
#include <cutils/native_handle.h> /* donut */
/* <donut> static int control_open_data_source( struct sensors_control_device_t *dev ) */static native_handle_t* control_open_data_source( struct sensors_control_device_t *dev ) /* <donut> */{ native_handle_t* handle; /* <donut> */ handle = native_handle_create( 1, 0 ); /* <donut> */ sensor_fd = open_sensors_phy( dev ); handle->data[ 0 ] = sensor_fd; /* <donut> *//* return sensor_fd; *//* <donut> */ return handle; /* <donut> */}
/* <donut> int sensors_open( struct sensors_data_device_t *dev, int fd ) */int sensors_open( struct sensors_data_device_t *dev, native_handle_t* handle ) /* <donut> */{ int i; sPendingSensors = 0;/* event_fd = dup( fd ); *//* <donut> */ event_fd = dup( handle->data[ 0 ] ); /* <donut> */ native_handle_close( handle ); /* <donut> */ native_handle_delete( handle ); /* <donut> */ for( i = 0 ; i < MAX_NUM_SENSORS ; i++ ) sensors[ i ].vector.status = SENSOR_STATUS_ACCURACY_HIGH; return 0;}
● センサーライブラリの修正例
Androidが起動しない(2)
Androidのロゴ点滅で無限ループ(2)
● eclair ( Android2.1 )以降の目撃例●
●
●
●
●
●
●
●
I/SystemServer( 123): Battery ServiceW/dalvikvm( 123): No implementation found for native Lcom/android/server/BatteryService;.native_update ()VW/dalvikvm( 123): threadid=15: thread exiting with uncaught exception (group=0x4001b160)E/AndroidRuntime( 123): Uncaught handler: thread android.server.ServerThread exiting due to uncaught exceptionE/AndroidRuntime( 123): *** EXCEPTION IN SYSTEM PROCESS. System will crash.E/AndroidRuntime( 123): java.lang.UnsatisfiedLinkError: native_updateE/AndroidRuntime( 123): at com.android.server.BatteryService.native_update(Native Method)E/AndroidRuntime( 123): at com.android.server.BatteryService.update(BatteryService.java:200)E/AndroidRuntime( 123): at com.android.server.BatteryService.<iniinit: untracked pid 117 exitedt>(BatteryService.java:138)E/AndroidRuntime( 123): at com.android.server.ServerThread.run(SystemServer.java:140)E/AndroidRuntime( 123): Crash logging skipped, no checkin serviceI/Process ( 123): Sending signal. PID: 123 SIG: 9D/BootAnimation( 133): SurfaceFlinger died, exiting...I/ServiceManager( 25): service 'package' died(省略)I/ServiceManager( 25): service 'content' diedE/installd( 32): eofE/installd( 32): failed to read sizeI/installd( 32): closing connectionI/Zygote ( 118): Exit zygote because system server (123) has terminated
解決方法 1
● Power supply class supportを有効にする
バッテリーのドライバは用意しなくてよい。kernel configで、 CONFIG_POWER_SUPPLYを yにする。
解決方法 2
frameworks/base/services/java/com/android/server/BatteryService.java
197c197< private native void native_update();---> // private native void native_update();200c200,204< native_update();---> mAcOnline = true;> mBatteryPresent = true;> mBatteryLevel = 100;> mBatteryStatus = BatteryManager.BATTERY_STATUS_FULL;> // native_update();
● BatteryServiceで状態をごまかす
cupcakeの頃とは BatteryService.javaの作りが違うので、別の対応を行う。やることは同じ。バッテリー FULLを返す。
解決方法 3
● バッテリードライバを組み込む
Android起動直後に終了するで書いた通り。ドライバで常にバッテリー FULLを返すようにする。数十行で書けます。
実際に使うには、(株)パイロンさんの公開しているドライバを使用するのが良いかと思います。http://pylone.jp/blog/virtual_battery
この方法の良いところは、 Androidに手を入れる必要が無いこと。
Androidが起動しない(3)
Androidのロゴ点滅で無限ループ(3)
● froyo ( Android2.2 )での目撃例●
●
●
●
●
●
●
●
W/MountService( 53): Waiting too long for mReady!W/MountService( 53): Waiting too long for mReady!W/MountService( 53): Waiting too long for mReady!W/MountService( 53): Waiting too long for mReady!W/MountService( 53): Waiting too long for mReady!W/MountService( 53): Waiting too long for mReady!W/MountService( 53): Waiting too long for mReady!W/MountService( 53): Waiting too long for mReady!W/MountService( 53): Waiting too long for mReady!W/MountService( 53): Waiting too long for mReady!W/MountService( 53): Waiting too long for mReady!W/MountService( 53): Waiting too long for mReady!W/MountService( 53): Waiting too long for mReady!W/MountService( 53): Waiting too long for mReady!W/MountService( 53): Waiting too long for mReady!W/MountService( 53): Waiting too long for mReady!W/MountService( 53): Waiting too long for mReady!W/MountService( 53): Waiting too long for mReady!W/MountService( 53): Waiting too long for mReady!
解決方法 1
● Mountサービス無効化
SDカード使えなくなるのでおすすめしませんが、一応
frameworks/base/services/java/com/android/server/MountService.java
// if ("simulator".equals(SystemProperties.get("ro.product.device"))) { mReady = true; mUmsEnabling = true; return;// }
// mConnector = new NativeDaemonConnector(this, "vold", 10, "VoldConnector");// mReady = false;// Thread thread = new Thread(mConnector, NativeDaemonConnector.class.getName());// thread.start();
解決方法 2
@@ -97,11 +97,12 @@ final class NativeDaemonConnector implements Runnable { LocalSocketAddress.Namespace.RESERVED); socket.connect(address);- mCallbacks.onDaemonConnected(); InputStream inputStream = socket.getInputStream(); mOutputStream = socket.getOutputStream(); + mCallbacks.onDaemonConnected();+ byte[] buffer = new byte[BUFFER_SIZE]; int start = 0;
● NativeDaemonConnector.javaの修正
android-portingで同じ現象に関する投稿があり、既に解決済みだった。
froyo weird timeouts?http://groups.google.co.jp/group/android-porting/browse_thread/thread/a2adbf27075ef8ef?pli=1
Androidが起動しない(4)
Androidのロゴまで進まない
● initで kernel panicが発生して停止●
●
●
kjournald starting. Commit interval 5 secondsEXT3-fs warning: maximal mount count reached, running e2fsck is recommendedEXT3 FS on mmcblk0p3, internal journalEXT3-fs: mounted filesystem with writeback data mode.VFS: Mounted root (ext3 filesystem) on device 179:3.Freeing init memory: 132KWarning: unable to open an initial console.Kernel panic - not syncing: Attempted to kill init!
原因と解決方法
● 原因は TLS
Androidで TLSを使うようになっていたため、発生した。
ARCH_ARM_HAVE_TLS_REGISTERが true
しかし Linux Kernelでは CONFIG_HAS_TLS_REGが無効。
そのため、現象が発生した。
Linux Kernel側で有効であれば、問題無し。
または、 Android側で使わないようにする。
追加したデバイスが使えない
加速度センサーを繋いだとき
● TDS01V (加速度、地磁気、気圧のセンサー)USBシリアル( FTDIのドライバ)で接続します
Webカメラを繋いだとき
● USB接続するタイプのもの
発生した現象
● Linuxでは認識してるのに、 Androidで触れない
Linux起動直後( Android起動前)に確認した結果
●
●
●
●
Android起動後に確認した結果
加速度センサー[root@armadillo500 (ttymxc0) /]# ls -l /dev/ttyUSB* crw-rw-rw- 1 root root 188, 0 Jan 9 20:34 /dev/ttyUSB0
Webカメラ[root@armadillo500 (ttymxc0) ~]# ls -l /dev/video0 crw-rw---- 1 root root 81, 0 Jan 9 20:56 /dev/video0
加速度センサー# ls -l /dev/ttyUSB*crw------- root root 188, 0 2000-01-09 11:39 ttyUSB0
Webカメラ# ls -l /dev/video0crw------- root root 81, 0 2000-01-09 11:52 video0
解決方法
● Androidの initを変更する
デバイスファイルのパーミッション設定に関しては、
system/core/init/devices.cに記載します。
static struct perms_ devperms[] = { { "/dev/null", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/zero", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/full", 0666, AID_ROOT, AID_ROOT, 0 },(省略) { "/dev/ttyUSB0", 0666, AID_ROOT, AID_ROOT, 0 }, { "/dev/video0", 0660, AID_ROOT, AID_CAMERA, 1 }, { NULL, 0, 0, 0, 0 },};
ネットワークに繋がらない
有線 LAN使用時の問題
● Linuxでは認識してるのに、ブラウザでWebページを表示できない
対処方法 1
● init.rcで dnsの設定を書いてあげる
on bootのブロックに、
setprop net.dns1 8.8.8.8を書く
init.rcの抜粋
on boot... setprop net.dns1 8.8.8.8...
有線 LAN使用時の問題
● Linuxは認識してるのに Androidで認識していない?
対処方法 2
● ethernet supportを移植
Android-x86に実装されているので、必要な処理を持ってきて動かしてみた
変更箇所についてはブログを参照
ethernet support
http://blog.sola-dolphin-1.net/archives/2974043.html
有線 LAN使用時の問題解決?
● Androidにネットワーク接続を認識させた結果
ライブ壁紙が使えない
ライブ壁紙を動かすのに必要なもの
● アプリケーションをインストールしても動作しない
● 必要なライブラリがインストールされていないのが原因
Android Zaurusの日記
NetWalkerで Nexus Oneの Live Wallpaper
http://d.hatena.ne.jp/androidzaurus/20100121/1264065376
ビルドは実行されており、以下にライブラリが出来ている。
out/target/product/<target>/obj/lib/librs_jni.so
out/target/product/<target>/obj/lib/libRS.so
※<target>は環境によって異なる
これらを、ターゲット環境の /system/lib/へコピーする
何故インストールされない?
● Android.mkに
LOCAL_MODULE_TAGS := optional
があると、インストールされない
今回の場合、以下の 2ファイル
frameworks/base/libs/rs/Android.mk
frameworks/base/graphics/jni/Android.mk
(おそらく)正解な解決方法
● 以下のように設定してビルドを行う
device/sola/beagleboard/beagleboard.mkに、
PRODUCT_PACKAGES += \
libRS \
librs_jni
を追記してビルドする。
Ubuntu10.04でcupcake 、 donutのビルドができない
ビルドエラーの原因
● gccと g++が 4.4になったせい
色々とチェックが厳しいらしい
● 解決策としては、 gcc-4.3と g++-4.3をインストール。
ビルド時にこれらを使うようにする
gcc-4.3と g++-4.3のインストール
$ sudo apt-get install gcc-4.3 g++-4.3
gcc-4.3と g++-4.3を使用してビルドする
$ CC=gcc-4.3 CXX=g++-4.3 make
Androidのビルドができない
ビルドエラーの原因
● master 、 froyoなどのブランチは頻繁に修正が入ります。運が悪いと、ビルド出来ない状態なことがあります。( cupcakeの頃はとても酷かったです ... )
● 使用するなら、 android-2.2_r1.1や android-2.1_r2のように、タグが付いているものの方が良いと思います。ビルドエラーは出ない(はずです)
● 最近( 9/23に取得)のmasterではこんなのが ...
Checking build tools versions...build/core/main.mk:72: ************************************************************build/core/main.mk:73: You are attempting to build on a 32-bit system.build/core/main.mk:74: Only 64-bit build environments are supported beyond froyo/2.2.build/core/main.mk:75: ************************************************************build/core/main.mk:76: *** stop. 中止 .
その他
起動画面を変更する
● 動画にする方法
– png形式の画像を用意して、アニメーションを作れます
以下の順にデータを探しに行くようになっています。
/data/local/bootanimation.zip
/system/media/bootanimation.zip
zip形式でアニメーションデータをまとめます$ lsdesc.txt part0 part1$ zip -r -0 bootanimation ./*
dest.txtの中身320 180 30p 1 0 part0p 0 0 part1
part0/part1の中身は、 png形式の画像データ
ソース読みを楽にするために
● GNU GLOBAL– 普段よく使用しているソフト
http://www.tamacom.com/global-j.html
サンプル( VMwareの仮想環境)
http://sola-dolphin-1.net/data/android/image/gnuglobal_sample.tar.gz
ユーザ名やパスワードは android
Firefoxのブックマークに参照先のリンクがあります
● OpenGrok– OESFのサーバで Android-2.2_r1.1が公開されてます
http://tools.oesf.biz/android-2.2_r1.1/
A81-E
● BeagleBoardと同じ、OMAP3搭載● カスタム ROMを動かせるので、専用端末化するのに向いてる。
● 独自イメージの起動方法
知りたい orやりたい?
今後やろうとしてること
● 個人&(横浜) PF部等で情報を出していくまだ情報が少ない?らしいので
● 冬のコミケに申し込み中
● そろそろ Android以外のネタを
終了