2009-01-25

Ruby for Android その7

http://code.google.com/p/android-ruby/source/browse/#svn/trunk

http://android-ruby.googlecode.com/svn/trunk/lib/Android.mk

enc, ext など全部shared libraryにできました。


/data/ruby/lib/ruby/1.9.1/arm-linux/nkf.so

において、require 'nkf'、NKF.guess, NKF.nkfなど動作確認ずみ。


master HEADでbuildしたものはrelease-1.0で動作せず。libc.soその他更新されてますしね。release-1.0とtrunk用バイナリ2種類用意しないと。


sourceforge.jpのgit更新に失敗した(ローカルでbranchリネームとかするとややっこしいことになりますね)ので、code.google.comのsubversionに移動させました。

2009-01-23

Android donut

cupcake の次は donut

cupcake branch が release サイクルに入った?

次は。eclair はフランス語か。


http://twitter.com/splhack

RSS流してみてます。

2009-01-22

Ruby for Android その6

ruby-1.9.1-rc2 ベースに変更中。

shared libraryもbuildできるようにconfigureに渡す環境変数などをいじってみました。

config.sh

so群とrubyがbuildできてます。動かしてないですけども。

これを元にAndroid.mk変更開始。

2009-01-21

Ruby for Android その5

release-1.0で作業中。

/data/ruby に.rbを置くようにconfigure変更。
Encoding::ASCII_8BIT がuninitialized constantとか言われるのはdefineが足りてないっぽい。


rjbはわりとあっさりbuildできまして、なんとなく使えてる感じです。まとめ中。


それはそれとして、master HEADで試したところbuild失敗? 要調査。

stdlib.h などが変わってますね。
/* make STLPort happy */
なんて書いてあります。

frameworks/base/include/utils/List.h などにSTLもどきが入ってますが、STLportそのものも入ってくるんでしょうか。

2009-01-20

Ruby for Android その4



てな感じの構成になっています。


ARM用バイナリもアップしてみました。

http://code.google.com/p/android-ruby/downloads/list

emulatorは、

adb remount
adb push libruby.so /system/lib
adb push libruby_jni.so /system/lib
adb install -r package.apk

で、いけると思います。

G1(ADP1)では、adb remountが効かなかったと思うので、adb shellで

su
mount -o rw,remount /dev/block/mtdblock3 /system

しときます。またadb pushだと/system/libに新規ファイルを作成できないので、echo > /system/lib/libruby.so とかしておきます(busyboxでcpしたので未確認)。

そのうちwikiにまとめます。

http://code.google.com/p/android-ruby/


あと、追求してないんですが、rb_string_eval_protectでローカル変数が引き継がれないみたいです。グローバル変数($a)とかdefは使えます。bionic関連?

ライブラリ(.rb)群もちゃんとインストールすれば使えるはずです。.soもdl系関数使えそうな気が。

http://rjb.rubyforge.org/もbuildできれば、アプリの大半をRubyで書くこともできそうです。

2009-01-19

Ruby for Android その3

思いあまって http://code.google.com/p/android-ruby/ とか作ってみました。



バイナリ準備中。

Android Dev Phone 1 その12

Debugging native library crashes
http://groups.google.com/group/android-platform/browse_thread/thread/1227418641c53473


JNIライブラリで例外が発生した、などの状況をgdbで調べる方法。

adb shell setprop debug.db.uid 32767

としておく。/data/local.propに debug.db.uid = 32767 って書いといてもいけるかも。

すると例外発生時にdebuggerdが拾ってくれます。

adb logcat とかでログを見ると


I/DEBUG ( 21): ********************************************************
I/DEBUG ( 21): * process 513 crashed. debuggerd waiting for gdbserver
I/DEBUG ( 21): *
I/DEBUG ( 21): * adb shell gdbserver :port --attach 513 &
I/DEBUG ( 21): *
I/DEBUG ( 21): * and press the HOME key.
I/DEBUG ( 21): ********************************************************


などと出ているので、

adb shell /data/gdbserver :8888 --attach 513 &

とか。gdbserverはprebuiltに入っているので、/dataなどにadb pushしておく。また、adb forward tcp:8888 tcp:8888などでport転送を設定しておく。

これでgdbで接続できます。

$TOP/prebuilt/darwin-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-gdb $TOP/out/target/product/dream/obj/SHARED_LIBRARIES/libruby_intermediates/LINKED/libruby.so
target remote localhost:8888

など。

2009-01-18

Ruby for Android その2

gccとかldとかのoptionが足らないのが原因だと思いますが、追求しません。

configureしてmakeした経過そのものが目的だったのでした。


ということで make |& tee log した結果から、Android.mk を作ってみます。

Rubyをビルドするための Android.mk

bionicでのinclude内容(unistd.hがincludeされてない状況とか)を修正したり、同一ファイル名をrenameしたり、
強引にextconf.hをまとめてみたり、などの変更を施してます

なんとなく libruby.so ができています。


libruby.so をつかって main.c で実行ファイルを作ってみると、emulatorで動きました!


Terminalアプリとかから使うのもいいですが、どうせならJavaから使ってみたい。


ので、rb_eval_string_protect をJNI経由で呼べるようなライブラリと、それを使うアプリ(いんちきげなirb)を作ってみました。




http://git.sourceforge.jp/view?p=splhack/AndroidRuby.git

Ruby for Android

ruby-1.9.1-rc1 を Android でビルドしてみます。

codesourcery の toolchain で static link すれば動くと思いますが、ここはやはりbionic(Androidのlibc)を使ってビルドしてみましょう。


試行錯誤した結果 ↓


#!/bin/sh
TOP=${HOME}/android
PRODUCT=dream
HOST=linux-x86
GCCHOST=i686-linux
ARCH=arch-arm
GCCARCH=arm-eabi
GCCVER=4.2.1
RUBYARCH=arm-android-linux
TOOLCHAIN_PATH=${TOP}/prebuilt/${HOST}/toolchain/${GCCARCH}-${GCCVER}
TOOLCHAIN_PREFIX=${TOOLCHAIN_PATH}/bin/${GCCARCH}-
LPATH=${TOP}/out/target/product/${PRODUCT}/obj/lib

export CC=${TOOLCHAIN_PREFIX}gcc
export LD=${TOOLCHAIN_PREFIX}ld
export AR=${TOOLCHAIN_PREFIX}ar
export RANLIB=${TOOLCHAIN_PREFIX}ranlib
export CPPFLAGS="-nostdinc -I${TOP}/external/zlib -I${TOP}/external/openssl/include -I${TOP}/bionic/libc/include -I${TOP}/bionic/libc/${ARCH}/include -I${TOP}/bionic/libc/kernel/common -I${TOP}/bionic/libc/kernel/${ARCH} -I${TOP}/bionic/libc/kernel/common/linux -I${TOP}/bionic/libm/include -I${TOOLCHAIN_PATH}/lib/gcc/${GCCARCH}/${GCCVER}/include -Dptrdiff_t=__ptrdiff_t -include stdio.h -include unistd.h -include fcntl.h -include sys/mman.h -DHAVE_GETCWD"
export LIBS="-nostdlib -L${LPATH} ${LPATH}/crtbegin_dynamic.o -lstdc++ -lc -lm -ldl ${LPATH}/crtend_android.o -Wl,-dynamic-linker,/system/bin/linker,-rpath,/system/lib"

export ac_cv_func_getpgrp_void=yes
export ac_cv_func_setpgrp_void=yes
export ac_cv_prog_cc_g=no
export ac_cv_prog_cxx_g=no
export ac_cv_func_vsnprintf=yes
export ac_cv_func_isinf=yes
export ac_cv_header_langinfo_h=no

./configure --build=${RUBYARCH} --target=${RUBYARCH} --host=${GCCHOST} --with-static-linked-ext --enable-wide-getaddrinfo

(config.sh)


あといくつかソースとかMakefileまわりをいじったらビルドできました。

emulator上に持ってっても動かなかったですけども。

2009-01-13

Android Dev Phone 1 その11

ubuntu8.10上で make sdk に失敗。javadocらしきところ。

> Generate SDK from Source?
http://groups.google.com/group/android-platform/browse_thread/thread/de555a2f3029ab1a

ubuntuなら、

# apt-get install sun-java5-jdk
# update-alternatives --config javadoc


でいけました。


release-1.0 branch だと、

development/build/sdk.atree:122: couldn't locate source file: development/emulator/prebuilt/android-arm/kernel-qemu
http://review.source.android.com/789

にもひっかかるので、development/build/sdk.atree を書き換え。

http://review.source.android.com/789/patch/1/z064d469caa731f1e6ec52ad47e94703da3111909

2009-01-10

Android Dev Phone 1 その10

Heads Up: Adding a library to Android
http://groups.google.com/group/android-platform/browse_thread/thread/618971d3f7608f4c/2e15c8be7abca1e4


development/samples/PlatformLibrary ですが、

adb install $MYDROID/out/target/product/dream/data/app/PlatformLibraryClient.apk

しても、INSTALL_FAILED_MISSING_SHARED_LIBRARY って出てインストールできません。

out/target/product/dream/system/framework/com.example.android.platform_library.jar を他のjarファイルと同様に /system/framework に置いてみても、やはり同じエラー。


そもそもこのエラー誰がどうやって出してるのかと探ってみれば
frameworks/base/services/java/com/android/server/PackageManagerService.java line 1639

/etc/permissions.xml に書いてあるjarしか許可しないようになってるわけでした。


frameworks/base/data/etc/permissions.xml に


<library name="com.example.android.platform_library"
file="/data/app/com.example.android.platform_library.jar"/>


とか追加して/system/etcに置いて、jarを/data/app/com.example.android.platform_library.jar に置いて再起動すればインストールできました。


out/target/product/dream/obj/SHARED_LIBRARIES/libplatform_library_jni_intermediates/LINKED/libplatform_library_jni.so は、/system/lib に置きます。

/init.rc で LD_LIBRARY_PATH 指定してますが、/を書き換えるにはfastbootで焼かないといけないような気がするので、/system/libに置かざるを得ないかなと。

/systemいじるには
mount -o rw,remount /dev/block/mtdblock3 /system
で。

直接adb pushできないところへは、busybox使ってcpするとかします。

Android Dev Phone 1 その9

repoのworking dirの外でbuild

$HOME/android に repo init してたとしたら

source $HOME/android/build/envsetup.sh

とかで環境設定しといて、Android.mkのあるところで、

TOP=$HOME/android mm

とかすればok。


cupcakeに入ってるPlatformLibraryだったら

git clone git://android.git.kernel.org/platform/development.git
cd development/samples/PlatformLibrary
TOP=$HOME/android mm


build結果は、$HOME/android/outですけど。

Android Dev Phone 1 その8

現在のrepoで、Android Dev Phone 1 (HTC dream)に元から入ってるバージョンのAndroidをbuildするにはどうすれば。

release-1.0 revisionを指定すればいけるはず。

んが、http://android.git.kernel.org/をながめてみると、肝心のplatform/vendor/htc/dream.gitplatform/hardware/msm7k.gitがrelease-1.0 branchを持ってなさげ。


しかし履歴を見てみると、cupcake branchが入ってきたときの状態がちょうどrelease-1.0らしき気配。

ということで

repo init -u git://android.git.kernel.org/platform/manifest.git -b release-1.0


してrelease-1.0を持ってくるようにして、htc dream固有のものを取ってくるための .repo/local_manifest.xml は


<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remove-project name="kernel/common"/>
<project path="kernel" name="kernel/msm" revision="refs/heads/android-msm-htc-2.6.25"/>
<project path="vendor/htc/dream" name="platform/vendor/htc/dream" revision="cupcake"/>
<project path="hardware/msm7k" name="platform/hardware/msm7k" revision="cupcake"/>
</manifest>


のようにkernelはhtc dream用の2.6.25を、他はcupcakeを指定。で repo sync。


Ubuntu8.10、というかgcc-4.3だとstdlib.h、string.hなどをincludeしまくらないとbuildできないので
http://groups.google.co.jp/group/android-porting/browse_thread/thread/66862bdb52dac936
gcc-4.2を使う。ので TOPディレクトリの buildspec.mk は、

TARGET_PRODUCT:=htc_dream
CC=gcc-4.2
CXX=g++-4.2


としておく。


libaudioがbuildできないのは、include pathが解決できないせいなので
http://groups.google.com/group/android-platform/msg/dac64d13ff2303b0
シンボリックリンクを貼ってしまう。
cd hardware/msm7k/libaudio
ln -s ../../../kernel/include/linux .



あと system/wlan/ti/wpa_supplicant_lib/Android.mk の STA_DK_ROOT を
STA_DK_ROOT = $(LOCAL_PATH)/../sta_dk_4_0_4_32

しとけば、buildできました。


動作確認してないので、ADP1出荷時と同じような状態のイメージができてるかどうかよくわかりませんけども。

(2009/03/31 追記)