2009-07-04
■Firefox3.5のCPU最適化バージョン
昔から、正式リリースとは別に有志による最適化コンパイルされたバージョンがあるのだけど、さっそく3.5に対応したものが出ていた。
Firefox 3.5 Release Optimized Build
Core2DuoやPhenomのような最近のCPUならP3をダウンロードすればOK。
...で、Phenom X4の私の環境でやってみたんだけど...どうもページの読み込みが途中で止まる時があるみたいだ。ページ内のHTML部分と画像がある程度表示された後、他のコンテンツを取得しに行こうとしてそのまま通信が止まってしまうような感じ。
なんというか、通信スレッドがいくつも立ってHTMLやら画像やらを平行して取得するなかで、その内のいくつかのスレッドがHTTPのシーケンスの途中で止まってしまってるような雰囲気というか...。
まぁ、こっちの環境も、3.5βからのProfileを使い回してるし、セキュリティソフトのパケットキャプチャが悪さしてるのかもしれないし何とも言えないけどね。
■MTのMarkdownプラグインで「もっと読む」が勝手に入る件
movabletypeでブログを書くときは、SukerokuPlus(HatenaLike)ではてな記法を使っているのだけど、一部のエントリを書くときにはMarkdownを使うことがある。
で、MTでMarkdownを使うと、本文しか書いてないのに「もっと読む」とか「Continue Reading」が表示されてしまう。
なんでかなーと思ってググってたら、Markdown for MT fix :: Adam KalseyというサイトでMarkdownプラグインに修正パッチが載っていた。
早速パッチあてをしてエントリをリビルドしたらOKだった。本家サイトでは2004年からMarkdownプラグインの更新が無いのでおそらく今後も修正されることはないんだろうな...。
■AndroidでJavaとNativeとのやり取り(JNIは絶対必要?Socketなどは...?)
Registering a java method as a callback function - android-ndk | Google Groups
NativeからJavaのメソッドをコールバックで呼びたいんだけど...という質問。
そのレスの一つが
Use a native method to create the pipe and return the read end to the Java side, and that should be it.
JavaとNativeプロセスの間をパイプを使ってやったらどう?ってことらしい。
ああ、Javaってパイプ開けるのね...と思うと同時に、JNI使わなくてもNativeとやりとりしても(Android的に)いいんだろうか?という疑問が沸いた。
こないだリリースされたNDKでもJNI経由が前提っぽいし、今の時点ではオフィシャルにはNativeはJNI経由でということなんだと思う。
ただ、Androidのソースを見ているとJavaからsocketを使ってNativeとやり取りしている場所がある。
mydroid/frameworks/base/services/java/com/android/server/MountListener.java の中で、Nativeプロセスの"vold"に対してsocketを使っている。
おそらく、SDカードのマウント状態を監視している(と思われる)Nativeのvoldプロセスと、UI上やアプリへのintentでSDの抜き差しなどを通知しないといけないJava側のMountServiceとでいろいろやり取りしてるんだと思う。
...で、この方法、使って良いのかな?
もちろん、公式アナウンスが無いから表向きは「ダメ」なんだろうけど。今後SDKやNDKのバージョンアップとともに解禁になったりするのかな。対象デバイス固定の専用アプリなんかでは、どう実装しようが自由と言えば自由なんだろうけどね。
個人的にはframework部分も早くNDKで正式サポートして欲しい。気になる機能がたくさんあるし。
2009-07-02
■Androidのエミュレータでsystem.imgとかを差し替えるときに気をつけること
Androidのエミュレータが使うシステムイメージなどのファイルは、例えばWindows環境だと
C:\android-sdk-windows-1.5_r2\platforms\android-1.5\images
にある、system.img、userdata.img、ramdisk.imgだったりすると思っていたのだけど、AVDを作って一度でもエミュレータを起動すると、
C:\Documents and Settings\[ユーザ名]\.android\avd\[AVD名].avd
の、userdata-qemu.imgやcache.imgのほうを見に行くようになるようだ。
なので、フルソースをビルドして出来上がったsystem.imgを差し替えて使いたい場合は、
のどちらかをする必要あり。
...たしかに、よく考えればAVDが違うんだからそれぞれのシステムファイルイメージもAVDごとに分かれて管理されるようになるよね...。
2009-06-19
■開発用にAndroidシステムのセキュリティレベルを下げる
Native層からSurfaceを扱うコードを書いたのだけど、ACCESS\_SURFACE\_FLINGERの権限が無いと警告が出てAPIが動いてくれない。
Androidはセキュリティ確保のためにシステムリソースへのアクセスに制限がかかっていて、特にACCESS\_SURFACE\_FLINGERの場合は署名付きアプリにしないといけないようだ。
で、署名付きアプリの作り方はググるといろいろ出てくるのだけど、正直なところ実際の開発中はいちいちこの手順を踏んでると面倒なことこの上ない。
...ということで、システム側のセキュリティレベルを下げて署名無しアプリ(デバッグ用署名)でも動作するように設定してみる。
frameworks/base/core/res/AndroidManifest.xmlにパーミッションごとのセキュリティレベルが書かれている。
ACCESS\_SURFACE\_FLINGERの場合は、
<!-- Allows an application to use SurfaceFlinger's low level features -->
<permission android:name="android.permission.ACCESS_SURFACE_FLINGER"
android:label="@string/permlab_accessSurfaceFlinger"
android:description="@string/permdesc_accessSurfaceFlinger"
android:protectionLevel="signature" />
とprotectionLevelが"signature"となっていて、署名が必要な事を示している。
これを、"normal"に変更すると署名が無くても、アプリ側のAndroidManifest.xmlにACCESS\_SURFACE\_FLINGERのパーミションを付けておくことで関連するAPIが動くようになる。(もしかすると、ソースツリー全体のmakeが必要かも)
パーミッションレベルは、リファレンスの<permission> | Android Developersを見てみると、
- normal
- dangerous
- signature
- signatureOrSystem
の4つがあるようだ。詳しい解説まで読んでないけど、dangerousってなんだろうな。
とりあえず開発中はこの設定で進めておいて、リリース用テスト環境などで別途セキュリティ面のテストするほうが開発効率は良さそうな気がする。
(参考)Accounted error when display video frame with surfaceflinger - android-framework | Google グループ
2009-06-09
■AndroidのフルソースからビルドしたエミュレータでSDを認識しない場合
タイトルそのままなんだけど、私の環境で発生して解決できたようなのでメモ。
AVDを使わずに、フルソースをビルドして出来上がった各種イメージファイル(out/target/product/generic/system.imgなど)を使ってエミュレータを起動した場合(emulatorのパラメータで-system/-ramdisk/-kernelなどを付けたとき)、-sdcardでSDイメージファイルをちゃんと指定していてもエミュレータがSDイメージを認識せずに「SDが刺さっていない」ことになってしまうことがあるようだ。
mksdcardでイメージを作り直したりしても同じで、しばらくハマっていたところで本家フォーラムで回避策を発見。
Cupcake Emulator do not mount SD card image - Android Developers | Google グループ
どうもソースをmakeしたときに、out/target/product/generic/system/etc/ の下にvold.confというファイルが作成されないかららしい。
ちなみにvold.confの中身はというと、
## vold configuration file for the emulator/SDK volume_sdcard { ## This is the direct uevent device path to the SD slot on the device emu_media_path /devices/platform/goldfish_mmc.0/mmc_host/mmc0 media_type mmc mount_point /sdcard ums_path /devices/platform/usb_mass_storage/lun0 }
と、SDのマウントの設定が書かれている。これが無いとそもそもエミュレータがSDを認識しないようになってる模様。
さてvold.confが正しく生成されるために、ここにある差分をマージする。
diff --git a/core/main.mk b/core/main.mk
--- a/core/main.mk
+++ b/core/main.mk
@@ -209,6 +209,14 @@ ifeq (,$(filter %:system/etc/apns-conf.xml, $(PRODUCT_COPY_FILES)))
$(warning implicitly installing apns-conf_sdk.xml)
endif
endif
+# Install a vold.conf file is one's not already being installed.
+ifeq (,$(filter %:system/etc/vold.conf, $(PRODUCT_COPY_FILES)))
+ PRODUCT_COPY_FILES += \
+ development/data/etc/vold.conf:system/etc/vold.conf
+ ifeq ($(filter eng tests,$(TARGET_BUILD_VARIANT)),)
+ $(warning implicitly installing vold.conf)
+ endif
+endif
# If we're on an eng or tests build, but not on the sdk, and we have
# a better one, use that instead.
ifneq ($(filter eng tests,$(TARGET_BUILD_VARIANT)),)
パッチ適用後もう一度makeすると、vold.confが生成される。またsystem.imgも更新されるようだ。
これでエミュレータを起動すると、今度はきちんとSDが認識されるようになる。
...これで半日くらい潰した...。
2009-06-05
■AndroidのNative層でのログ出力
まだ調査中だけどとりあえず動いているのでメモ。
(1)LOG出力の際のタグの定義と、Log.hのインクルード
warningが出るのでLOG_TAGはundefしておいたほうが良いはず。
#define LOG_TAG "JNI-Test" #include <utils/Log.h>
ちなみにLog.hの場所は以下。
frameworks/base/include/utils
(2)Android.mkにlibutilsとlibcutilsをリンク対象に含める
これを含めないとLOGV()でログが出力されなかったり、LOGD()やLOGI()を使おうとするとビルドエラーになったりする。
ちなみにEnabling LOGD messages in Webkit - Android Developers | Google グループでのやり取りを参考にした。
LOCAL_SHARED_LIBRARIES:= \ libutils\ libcutils
(3)LOGD()やLOGI()などをコードに埋め込む
2009-05-29
■x86で動くAndroidのLiveCD"live-android"
Android本家フォーラムを眺めていたときに見つけたもの。
LiveCD形式のためPCにインストールしなくてもAndroidを動かしてみることができる。
VirtualBoxでブートさせてみたところ、時々Androidのエラーが表示されるけれどキーボードでフォーカスを移動することで操作できる。一部起動しないアプリがあった(メーラーとか)。
キー操作は以下。
使い方を読むと、コンソール画面にも切り替えられるようなので、多少の解析やカスタマイズもできるかもしれない。
まだバージョンが0.1なので、今後ポインティングデバイス対応とか入ると面白いことになるかも。



