Hatena::ブログ(Diary)

きままな日記帳(はてな分室) RSSフィード

2009-07-04

Firefox3.5のCPU最適化バージョン

昔から、正式リリースとは別に有志による最適化コンパイルされたバージョンがあるのだけど、さっそく3.5に対応したものが出ていた。

Firefox 3.5 Release Optimized Build

日本語版もあるし、Portable版までありますよ。

Core2DuoPhenomのような最近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プラグイン更新が無いのでおそらく今後も修正されることはないんだろうな...。

AndroidJavaと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で正式サポートして欲しい。気になる機能がたくさんあるし。

Flash LiteAndroid移植した会社

Bsquare,軽量版FlashをAndroidに移植,OEMなどにライセンス供与へ - 家電・PC - Tech-On!

対応早いなぁ。

でもHTC HeroのはAdobeHTCが協力して載せたようだけど。Adobeが今後、公式に提供するようになるのかは分からないけど、cupcakeに今すぐ載せたい会社なんかはこういう会社からライセンスを受けるのもいいのかもね。

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を新規作成する
  • emulatorの起動引数でsystem.imgの場所を明示的に指定する(-systemオプションなど)

のどちらかをする必要あり。


...たしかに、よく考えれば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.xmlACCESS\_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 グループ

実際のバグトラッキングページはこちら↓。

Change 9452: Ensure that /system/etc/vold.conf is created in the "generic" product. This is necessary to let the emulator mount SD Card images properly through the "vold" mounting daemon | review.source Code Review

どうもソース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()などをコードに埋め込む

GDBデバッグが面倒な時もあるのでログ重要だと思う。LogCatで手軽に見ることができるので。

2009-05-31

Anrdoidのエミュレータ起動中にSDマウント・アンマウントする

エミュレータ起動時にSDカードイメージを指定する例はたくさん見かけたけど、起動後に動的にやるのはあまり見かけなかったのでメモ

SDからファイルを読むようなアプリで突然SDを抜かれたり、差されたりしたときの挙動を確認したいときに。

2009-05-29

x86で動くAndroidのLiveCD"live-android"

live-android - Google Code

Android本家フォーラムを眺めていたときに見つけたもの。

LiveCD形式のためPCインストールしなくてもAndroidを動かしてみることができる。

VirtualBoxでブートさせてみたところ、時々Androidエラーが表示されるけれどキーボードフォーカスを移動することで操作できる。一部起動しないアプリがあった(メーラーとか)。

キー操作は以下。

使い方を読むと、コンソール画面にも切り替えられるようなので、多少の解析やカスタマイズもできるかもしれない。

まだバージョンが0.1なので、今後ポインティングデバイス対応とか入ると面白いことになるかも。

Android live-cd

Connection: close