Showing posts with label NexusOne. Show all posts
Showing posts with label NexusOne. Show all posts

Thursday, July 15, 2010

Android Mms.apk の Softbank 絵文字対応

「リア充の道は絵文字から」というありがたい言葉を頂いたので実装してみた。

制限事項がいくつかあるけど概ね良好にみえる。
  • CM5では下書きからの復帰で件名が化ける(eclairのバグ?)
  • システムのMmsアプリを置き換える
  • アプリに絵文字の画像ファイルを含むのでサイズが若干でかい(1.9MBくらい)
  • CM5,6+ mailto:のintent対応(適当)
  • CM5+ メールアドレス補完

こんな感じですん。


iPhoneとのやりとり


入力は一番上に履歴と、カテゴリごとに分けられたタブ5ページになる。(基準はiPhoneの絵文字キーボード)


絵文字の種類はiPhone compatible.
キャリア間の互換性はサーバ側で変換してくれるので気にしなくてよいはず。
SMS, docomo, au及びGMail間での送受信テストはした。

Mms.apk は adb コマンドなどで置き換えます。
$ adb remount
$ adb shell rm /system/app/Mms.odex
$ adb push Mms.apk /system/app/

あるいは update-mms-cm6-signed.zip をリカバリからぶち込めばそれだけでもよいです。

※ HT-03A など /system 領域が小さい機種の場合、導入に工夫が必要な場合があります。

CyanogenMod 5.0.8, 6.0.0以外の環境でのテストはしていません。
CMベースならおそらく大丈夫だと思われます。
ダウンロード (CM6)
ChangeLog

CM5ではframeworkの修正が必要です。また、CM5標準に比べてメールアドレスを補完する機能を付加してあります。
ダウンロード (CM5)
CM5用差し替えframework

CM以外のFroyoベースROMではテストをしていませんが動作するようです。(framework修正をapkに含めいています)
ダウンロード

Eclair用はありません。

TODO:
  • 単体アプリとして導入できるようにする
  • コード整理
  • ソース公開

Tuesday, June 15, 2010

Nexus One Portable HotSpot with Android WiFi Tether 2.0.5

FroyoでPortable WiFi HotSpotがサポートされましたが、Android WiFi TetherでもAPモードでテザリングができるようになりました。
現状2.0.5-pre2というバージョンでまだEXPERIMENTALですが、とりあえず動作はします。

以下に、FroyoのHotSpotとの違いを簡単にまとめてみました。

- Froyo標準 WiFiTether
動作環境 Froyo Froyo, CM5.0.7以降もしくは相当のkernel(SoftAPサポート)とbcm4329firmware(fw_bcm4329_apsta.bin)
暗号化 OPEN/WPA2-PSK OPEN/WPA2-PSK
アクセス制御 - MACアドレスフィルタリング
その他-チャンネル変更,LANアドレス変更,通知設定等
同時接続8制限なし?

カーネルのSoftAPサポートが必須なのでCM-5.0.7より前のバージョンでは恐らく動きません。(kernelの差し替えで動くかも)
また、bcm4329を積んでるハードウェアでなくてはならないので、NexusOne以外では動きません。
Desireでもカーネルやbcm4329ファームウェアファイルを用意すれば動くかもしれませんが苦労しそうです。

未確認ですが、ソースコードを見た限りではFroyo環境でも動きそうです。(rootは必要)

暗号化がWPA2-PSKのみになので、対応していないPSPやNitendoDSは繋がりませんが、暗号化なしにすれば利用できます。
標準のHotSpot機能に比べて、MACアドレスフィルタリングができるのでOPEN時のタダ乗りは一応防止できますが、通信内容の暗号化はされないので注意が必要です。

Update: CM-5.0.7.1で動作確認しました。

Wednesday, June 2, 2010

Fix Android MMS more.

Update:CM-5.0.8がでましたが、マージされてませんので作りました。

どうやらAndroidのMMSはもう少し修正が必要だった模様でして。(おそらく自分の調査が甘かった)
純粋なmultipart/alternativeメッセージを受信できません。(multipart/mixedかつmultipart/alternativeは受信できる)

というわけで修正をsubmitしました。Review:14917
(追記 2010/06/15: mergeされました)

CM-5.0.7.1/5.0.8-N1用とCM-5.0.7/5.0.8-DS用のupdate-zipを用意してます。

update-mms-fix-framework-cm-508-N1-signed.zip
(MD5:541d0bc06fc960369d6c4ced1b31aa21)
update-mms-fix-framework-cm-508-DS-signed.zip
(MD5:e11c520cb98445098c3effcb6134273f)
update-mms-fix-framework-cm-5071-N1-signed.zip (MD5:c046768f48cf47dd30c3fe50d42245cb)
update-mms-fix-framework-cm-507-DS-signed.zip (MD5:7be1a11c220d441308870bcbebb58bd7)

frameworkの差し替えになるので初回起動時にえらい時間がかかります(特にDS)。adb logcatでも眺めてましょう。

Tuesday, June 1, 2010

ntpd on CyanogenMod (busybox)

Androidの時刻同期ツールもいろいろとでてきましたが、実はCyanogenMod(5.0.7)にはntpdがはいってます。
といってもbusybox appletなので完璧なntpdではありませんが、複数のntpd serverとpeerして同期するくらいのことはできます。

使い方はadb shellあるいはTerminal Emulatorアプリから起動します。
$ ./adb shell
# ntpd -p ntp.nict.jp -p ntp.ring.gr.jp
# exit
[ENTER]
~.[ENTER]

adbの場合、ntpdがバックグラウンドへいくとshellを終了できなくなるので、強制的に切り離してます。
動いているかどうか確認するには ps ntpd とでもすればわかります。

端末の起動時に自動的に起動する方法はありません。
(/sd-ext/userinit.shから起動すると、その段階ではnetworkが起動してないので失敗します)

GUIもありません。

リソース消費にやさしいくらいしかいいとこないかもしれません。
常に通信を行うので電池の消費が気になったのですが、大したことないようです。

Sunday, May 23, 2010

Softbank MMS on Froyo

Froyoになりましたが、MMSはどうなってるかといえば、標準MMSアプリはUser-Agentを変更できないので受信できません。
Mms.apkを変更するにはrootが必要ですが、一応root奪取はすでにきています。
が、Froyoのソースコードはまだでていないので、Mms.apkのソースを改変してビルドすることはできません。

手っ取り早く、リソースファイルをいじることによりUser-Agentは変更できるので試しました。
とはいえダイナミックに変更できるわけではなく、apkを構築しなおして入れ替える必要があります。
$ adb remount
$ adb push Mms_iPhone.apk /system/app/Mms.apk

※ Mms.odexは消してはいけない。
とりあえずこれでUser-AgentをiPhoneにしたものが使えます。
iPhoneの他、Softbank/X01Tにしたものも作りましたのでお試しください。ダウンロード

黒SIMでためしたところ、Android-2.1(Eclair)にあった受信のバグは期待通りなおっているようです。
Update: 追試でHTMLメールを送信したらやはりだめでした。AOSPへの修正はFroyo(Google)ブランチにはマージされなかったと思われます。

Update 2: 様々な理由により自分はCM-5.0.7-N1-test3に戻しましたので、ひとまずFroyoに関わる調査などはこれ以上いたしません。

I'm just Froyo now


FroyoのOTAが待たれていましたが、OTAが来る前にダウンロードURLがリークされました。(削除されました)

導入手順はひとまずフルリカバリして、2.1-update1を当てる。その後FRF50を同様に当てる。
システムファイルのチェックがあるのでrootを導入してたりしてはいけません。

とりあえず雑感としては
  • フォントは相変わらず
  • ニコニコ動画を完璧に見られる
  • WiFi HotspotはPSPなど、携帯ゲーム機からも接続可能
  • 連絡帳はフリガナ対応になってて日本語環境での問題はなくなった
  • バンドルされているJapanese IMEはWnn(フリックなし)SDKにしかはいってなかったみたい
  • MMSはUserAgentを変更できないのでrootしてのapk入れ替え、あるいはカスタムROMは必須になる
  • マルチタッチの座標入れ替わりバグはなおってるような気がする
  • 11nの5GHzは未対応
  • マルチアカウントでカレンダー同期できるようになった
  • GMailアプリでテキスト選択してコピーが出来るようになった、引用なし返信ができるようになった
  • ホーム長押しのアプリ履歴は8こになった


こんなところですかね。操作が軽くて快適なのはこれまでの情報通り言わずもがな。

Update: root化もきました http://forum.xda-developers.com/showthread.php?t=686627

Update 2: どうやらFRF50は正式なFroyoリリースではないらしく、あくまでプレスレビュー向けの評価リリースというような話を耳にしました。この記事はFRF50の導入を推奨するエントリではございませんので、すべて自己責任で行動してください。

Monday, May 10, 2010

MMSReq for Android - MMS新着受信

どうも。
Nexus OneでのMMSがだいぶ落ち着いてきましたので、MMSの新着をメールセンターに問い合せるアプリを作ってみました。
要するに、iPhoneにある「MMS新着受信」アプリのAndroid版です。


使い方はボタンひとつしかないので説明するまでもないですが、以下の制限があります。
  • 3Gネットワーク必須
  • WiFi環境下で稀に失敗することがある


ダウンロード
(2010/05/12 追記) Version 0.3をリリースしました。銀SIMのMMSで使えるようです。(mmsopenではダメのようです)

Friday, April 23, 2010

Nexus One MMS まとめ

メモ。おもしろくないので興味ある人だけどうぞ。
※(2010/05/05追記) 下記修正はすべてAndroid Open Source Projectにマージしてもらえました。AOSPをベースに開発されているCM-5.0.7にも取り込まれてます。


まず純正ファームウェアでの問題点。

SoftbankのMMSサーバはUser-Agentにより接続を拒否するので、MMS本文のダウンロードができない。
これは、CyanogenMod 5.0.6 (5.0.5以降?)を導入することにより解決する。(User-Agentを変更できる)

さて、以下はAOSP Android2.1,CyanogenModに共通する問題点。

1.WAP DataにMMSの仕様で定められているPduHeaderに準拠しないバイトデータが現われる。
WAPではデータを短く表現するために、ヘッダを1バイトのデータで表現し、続くバイトデータをそのヘッダの仕様に沿って解析する。
が、SBMのMMSサーバはそのヘッダオクテットを付けずにいきなり文字列ヘッダを送ってくる。
その中身は "X-Mms-Vodafone-Notif-Text" であり、続くデータは端末上で通知に使う本文の冒頭部分と思われる。
この冒頭文に、PduHeaderでつかわれるバイトデータと同じものが含まれていると、解析済みのヘッダデータを破壊する。
結果、Content-Locationヘッダ("0x83")のデータを破壊し、本文のダウンロードができなくなる。
あるいはMMSアプリが強制終了したりする。(冒頭文の内容による)

例: logcatしながらMMSを受信すると
D/WAP PUSH(  188): Rx: 0f0603beaf848c82984a42414141473338496f526c59553478675173313868722f47665233416741414141414141414141
008d928914806e756c6c406578616d706c652e636f6d009606ea546573740086818a808f818e019388058103278d008368
7474703a2f2f6d6d732f4a42414141473338496f526c59553478675173313868722f476652334167414141414141414141
4100582d4d6d732d566f6461666f6e652d4e6f7469662d54657874006d65737361676520626f647900582d4d6d732d566f
6461666f6e652d4e6f7469662d454f4c003100

のようなデータを受けとる。
この文字列は次のようなコードと人力でデコードできる。
#!/usr/bin/ruby
WAP =
"0f0603beaf848c82984a42414141473338496f526c59553478675173313868722f476652334"
"16741414141414141414141008d928914806e756c6c406578616d706c652e636f6d009606ea"
"546573740086818a808f818e019388058103278d0083687474703a2f2f6d6d732f4a4241414"
"1473338496f526c59553478675173313868722f476652334167414141414141414141410058"
"2d4d6d732d566f6461666f6e652d4e6f7469662d54657874006d65737361676520626f64790"
"0582d4d6d732d566f6461666f6e652d4e6f7469662d454f4c003100"
char = false
a = WAP.scan(/../).each do |x|
c = x.hex & 0xFF
if c >= 32 && c <= 126
print "%c" % c
char = true
else
print "\n" if char
print "0x%02x\n" % [x.hex & 0xFF]
char = false
end
end
print "\n"

結果と意味(文字列は便宜上quoteした)
0x0f 0x06 0x03 0xbe (SMS header?)
0xaf (START) 0x84 (ShortInt: 0x84 & 0x7F = 4)
0x8c (MESSAGE_TYPE) 0x82 (MESSAGE_TYPE_NOTIFICATION_IND)
0x98 (TRANSACTION_ID) "JBAAAG38IoRlYU4xgQs18hr/GfR3AgAAAAAAAAAA" 0x00 (NULL)
0x8d (MMS_VERSION) 0x92 (ShortInt: 0x92 & 0x7F = 18: (18 >> 4 = 1).(18 & 0x0F = 2) = 1.2 )
0x89 (FROM) 0x12 (Length:18) 0x80 (FROM_ADDRESS_PRESENT_TOKEN) "null@example.com" 0x00 (NULL)
0x96 (SUBJECT) 0x06 (Length:6) 0xea (Charset(ShortInt: 0xEA & 0x7F = 0x6A) = UTF-8) Test 0x00 (NULL)
0x86 (DELIVERY_REPORT) 0x81 (octet)
0x8a (MESSAGE_CLASS) 0x80 (MESSAGE_CLASS_PERSONAL)
0x8f (PRIORITY) 0x81 (PRIORITY_NORMAL)
0x8e (MESSAGE_SIZE) 0x01 (COUNT:1 (next 1byte)) 0x93 (LongInt: 0x93 = 142)
0x88 (EXPIRY) 0x05 (Length: 5) 0x81 (VALUE_RELATIVE_TOKEN) 0x03 (COUNT:3) 0x27 0x8d (((0x27 << 8) + 0x8d) << 8 = 2592000) 0x00 (NULL) (2592000secs = 30days)
0x83 (CONTENT_LOCATION) "http://mms/JBAAAG38IoRlYU4xgQs18hr/GfR3AgAAAAAAAAAA" 0x00 (NULL)
"X-Mms-Vodafone-Notif-Text" 0x00 (NULL)
"message body" 0x00 (NULL)
"X-Mms-Vodafone-Notif-EOL" 0x00 (NULL)
"1" 0x00 (NULL)

という具合になり、ヘッダオクテットなしにテキストデータおくってくる。
これはWAPというかMMSの仕様よく読めばなんかわかりそうだけど。
この"message body"の位置に0x83だとかヘッダ意味をもつオクテットが含まれる文字(日本語によくある)がくると、parserがヘッダだと誤認し、データがぶっこわれる。
ヘッダ部分にUTF-8の1st byte(32-127)がきたらとりあえず文字列として処理することでうまくいく。
というかiPhoneはこんな特殊なケースもちゃんと処理してるのがえらいなぁ。たぶんこの文字つかって通知に本文だしてる。
いろいろためしたが、この修正でたぶんOK. Review:14446


2.マルチパートメッセージの入れ子に対応していない。
これはHTMLメールや携帯のデコレーションメールなどによく見られるのだが、multipart/mixed中にmultipart/alternativeのパートがあり、これによりMMSアプリが本文の解析に失敗する。
つまり
- multipart/mixed
-- multipart/alternative
---- text/plain
---- text/html
-- image/gif
-- image/gif

というような構成になっているメール。
例えば、デコレーションメールは本文をHTMLで表現し、添付している画像をHTML中で参照するという仕組みなのだが、HTMLメールを表示できない端末向けにとりあえず本文だけでも表示できるように、multipart/alternative で text/plain を追加している。(alternativeというのはそういうためのもの)
frameworkのMMS本文解析がこれに対応していない(multipartの入れ子を解析していない)ので受信できても表示できないままとなる。
multipart/alternative があらわれたら中身を再帰的に解析し、1番目のパートを本文として使用することで解決。 Review:14466
ただし、デコメはそもそもMMSアプリでHTMLメールを表示できないので、送信者の意図通りに表示できるわけではない。


3.「"<>'&」を含む添付ファイルがある場合、添付ファイルのパートをescapeXML()した後で探すので、実際のパート名とマッチせず表示できない。
ようするに、<テスト>.gifなんてファイルが添付されいてると、添付ファイルがあるパートデータを&lt;テスト&gt;.gifで探すので表示でない。
明かにバグなのだけど…。どうするのがベストなのかわからないので、とりあえず、findPart()するときにunescapeするようにした。 Review:14523
なんでescapeXML()してるかといえば、表示するためのマークアップ(Smil)がXMLだから。

Tuesday, April 13, 2010

続: SBM MMSをNexus Oneで使う

※ このエントリはカスタムROM(CyanogenMod)導入を前提にしてあります。カスタムROMに疎い方は読まない方がいいです。

※ 追記(04/16):CM-5.0.6がリリースされたので差分だけをupdate.zipにしたのを作りました。CM-5.0.6を導入後にリカバリよりFlashしてください。ダウンロード

前回のエントリはいやはや不完全でありました。
実際のところ、Mms.apkのUser-Agentを変更すればMMSを受信することはできたのですが、完全ではなく、受信通知はされるが「ダウンロード」表示になったり、通知すらされないこともありました。

で、いろいろ調査した結果、問題はframeworkのPduParser.javaにありました。
説明すると長くなるので端折りますが、SBMのMMSはMMSの仕様に合ってない文字列を送りつけており、そのせいでメッセージヘッダの解析に失敗し、OSへの通知までいかない、もしくは本文のダウンロードができない事象が発生していました。
こう書くとSBMが悪いように思えますが、そうでもないかもしれません。実際iPhoneでは受信できますし。

そんなわけで、そのへんを修正することで、問題なく受信ができることを確認しました。
ただし、当方ではsmile.worldの環境しかありませんので、open.softbankのMMSでは確認していません。

手順
. CyanogenMod 5.0.6-test3.jrf.2をダウンロードする
. CyanogenModを導入済みならば、いつも通りリカバリからFlashする。(gappsも必要ならFlashする)
. その他のROMの場合はwipeしてからFlashする。
. カスタムROMを導入したことがなければ、Googleで調べる。
導入するとこうなります


. メッセージアプリ(Mms.apk)の設定でUser-Agentを設定する

smile.world(黒SIM)なのでiPhoneにします。


ちなみに、このROMは5.0.6-N1-test3のソースコードをベースに日本語リソースの追加と、上記MMSの修正をしてあります。(Mms.apkのソースには手を入れていません)
また、APNリストにSoftbankとNTT DoCoMoを追加しておきました。
それ以外はCMそのものと思ってよいです。

手元では何度となくテストをして問題がなかったのですが、これでダメだったりすると結構手をいれないといけなさそうです。
あと、iPhoneにある新着MMS受信アプリ的なものがないので、そのへんは別途考慮しなくてはならなさそう。

※ 追記: Desire Camera(r1)など、framework.jar を上書きするModを導入すると使えなくなりますのでご注意を。
※ 追記: Desire Camera(r2)はframework.jarを弄らないので大丈夫そうです。

Monday, March 22, 2010

How to create signed update.zip

カスタムROMを導入してシステム全体をアップデートする度にcacerts.bksやフォントをpushするのが面倒なので自前のupdate.zipを作っておいて、リカバリーモードで一緒に更新することにした。

署名付きzipじゃないとあかんぽいので、下記の手順を踏む。

なにはともあれAOSPをビルドする。
部分的にビルドするのでもいいのかもしれないけど。

適切にディレクトリを構成する。
$ mkdir ~/update
$ cd ~/update
$ mkdir -p system
$ mkdir -p META-INF/com/google/android

必要なファイル(自前で更新するファイル)を放り込む。
 $ find .
.
./META-INF
./META-INF/com
./META-INF/com/google
./META-INF/com/google/android
./system
./system/fonts
./system/fonts/DroidSansJapanese.ttf
./system/etc
./system/etc/security
./system/etc/security/cacerts.bks

META-INF/com/google/android/update-script ファイルを書く。
show_progress 0.1 0
copy_dir PACKAGE:system SYSTEM:
set_perm 0 0 0644 SYSTEM:etc/security/cacerts.bks
set_perm 0 0 0644 SYSTEM:fonts/DroidSansJapanese.ttf
show_progress 0.1 10

zipる。
$ zip -r ~/update.zip system META-INF

署名する。
$ java -jar ~/android-source/out/host/linux-x86/framework/signapk.jar \
~/android-source/build/target/product/security/testkey.x509.pem \
~/android-source/build/target/product/security/testkey.pk8 \
~/update.zip ~/update-signed.zip

update-singed.zipをsdcardにいれといてカスタムROM導入後にリカバリで適用してやれば終わり。
一度zip作っておけばあとはリカバリモードだけで完結するので楽チン。

Thursday, March 11, 2010

Nexus One(Android携帯)の時刻同期のしくみ

ここ最近Nexus Oneの時計がずれるという話題があったのです。
それはCyanogenMod-5.0.4.1というカスタムロムに採用されいている2.6.33カーネルが原因だということが判明してます。(詳細はくろぺんさんが書かれています)

しかしながら、単純にカーネルのせいでずれるにしてもずれっぱなしとはなんとも解せない話でありまして、時刻同期のしくみを調べましたのでまとめることにします。
ちなみに、遅れるのはカーネルクロックだけで、デバイスクロックは遅れていないので、再起動時にカーネルがデバイスが取得する時に元に戻ります。(カーネルは起動時に物理デバイスから一度だけ時刻を取得し、以降は自前のロジックで時を刻む)

結論から申し上げまするに、Nexus One,あるいはHTCのAndroid携帯,もしくはAndroid携帯全般について言えば、NTP(SNTP)を使った時刻同期のしくみは用意されていません。(Nexus One, HT-03Aで確認)
つまりは、WiFiのみで運用している場合、時刻同期の手段がありません。
もっというなれば、SBM(少くとも黒SIM)で運用している場合も時刻同期の手段がありません。

勘違いされがちなのが、設定にある「日付と時刻」の「自動(ネットワーク自動設定)」というもの。
これはNTPなどインターネット経由での時刻同期のしくみではありません。携帯電話のネットワークで流れている時刻情報を元に時刻設定するもので、日本の場合、SBMはこれに対応していません。(NITZというらしい)
(仮にNTP機能だとしたら、NTPサーバを設定する項目がないのもおかしな話です)
実際のところ、docomoのSIMを差してこの機能を有効にすれば時刻同期はされます。OFFにして、時計をずらし、再びOにすると修正されるのがわかります。(no-SIMやSBMのSIMでは修正されない)
※ 実はiPhoneにも同様の機能がありますが、販売しているSBMで対応していないため、日本向けのiPhoneでは設定自体が表示されないようになっています。
ただし、この機能も端末起動時あるいは機内モードからの復帰時にしか時刻を取得しません。(トグルで調整されてるように見えるのはデバイスクロックと時刻取得時の差分をカーネルクロックに再適用しているだけっぽい)

さらに勘違いの元になっている /system/etc/gps.conf というファイル。
このファイルの中にはNTP_SERVER=north-america.pool.ntp.org などと記載されており、いかにもNTPで時刻あわせをしているかのように見えますが違います。
じゃぁこれはなんなのかと言われれば、GPSの原理の話になるんですが、かいつまんで言うとGPSってのは衛星から光の速さで送られてくる、衛星に搭載された原子時計の時刻情報と、それを受けとった地表での時刻情報を比較して衛星との距離を割りだし、位置を特定するというテクノロジらしい。(詳細)
つまり、地表での正確な時刻を知らなければ正しく測位できませんが、その時刻のためのNTPサーバを設定するファイルなのです。
Androidではこの時刻をデバイスクロックあるいはカーネルクロックには適用せず、GPSハードウェアへ知らせているだけです。(ちなみに4時間に一回問い合せており、失敗した場合は5分間隔でリトライしてます(ハードコード))
実際のところ、詳しくないのでよくわかりませんが、カーネルクロックと同期してないだけで、デバイスクロックは同期されているのかもしれません。(GPSデバイスがクロックソースなのかも)

そんなわけで、Nexus OneあるいはHT-03AなどたいしてカスタマイズされていないAndroid端末では、時刻同期の手段は携帯キャリアを使うしかないと思われます。

追記: 現在はNTPクライアントアプリがいくつかあります。

Saturday, February 6, 2010

Nexus One (Android端末) に CA証明書をインストールする

オレオレ証明書でSSLサイトを運用してるような人向けの話題です。

どうやらNexus OneというかAndroidは任意のCA証明書をインストール出来ない様です。
実際に cert ファイルをダウロードなりすると、証明書インストールツールが起動しますが、これはサイト証明書をインストールして次回以降この証明書を信頼するというようなもの。


CAの証明書をインストールしてもそのCAから発行した証明書は信頼してくれません。


ではどうするのか。cacerts.bksに手で追加するしかありません。

root化必須で、Java実行環境とAndroid SDKが必要です。
まず http://bouncycastle.org/download/bcprov-jdk16-141.jar をダウンロード。

$JAVA_HOME/jre/lib/ext にコピーします。
Macだと /Library/Java/Home/lib/ext/ あたり?
Debian だと/usr/lib/jvm/java-1.5.0-sun/jre/lib/ext/ とか /usr/lib/jvm/java-6-sun/jre/lib/ext/ あたり

android端末からCA証明書ストレージファイルを取り出します。
$ adb pull /system/etc/security/cacerts.bks cacerts.bks

ストレージファイルに CA cert ファイル(cacert.pem)を追加します
$ keytool -keystore cacerts.bks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -storepass changeit -importcert -trustcacerts -alias OREORE_CA -file cacert.pem
keytoolはJREに含まれてるはずです。
OREORE_CA は適当な名前をつけたらいいです。

ストレージファイルを戻します。
$ adb remount
$ adb push cacerts.bks /system/etc/security/
これで、このCAから発行した証明書を信頼するようになり、エラーがでなくなります。

ここからは蛇足。
Androidのブラウザか、SSLのframeworkかはわかりませんが、サイト証明書のsubjectAltNameを見ない仕様(RFC的には見るべきなはずですが)のようで、
具体的にはサイト名が証明書と一致しない旨のエラーがでます。


そういうサイト運用の場合はCNを複数定義しておかねばならないようです。
証明書を発行する際の openssl.cnf [ req_distinguished_name ] で、
0.commonName                    = Common Name (eg, YOUR name)
0.commonName_max = 64
1.commonName = Common Name (eg, YOUR name)
1.commonName_max = 64
のようにしておけば、二つのCNを定義することができます。

Thursday, February 4, 2010

続: Nexus One と iPhone を SIM 1枚で運用する(MyWi編)

先日は Nexus One を親にしたテザリングでiPhoneを使ってましたが今回は逆になります。
この方法は iPhoneをjailbreakする必要があり、Nexus OneもカスタムROMにしなくてはならないため、積極的にオススメはできません。
が、既に条件を満たしているのであれば試してみるのもよいかと思います。

さて、Nexus One はカスタムROM CyanogenMod 5.0 beta3以降にします。 (参考)
それだけで準備OKです。

iPhoneのほうはJBアプリのMyWi (No Rock)というのをCydiaから入れます。しかしながらこれは有料で$9.99かかります。

MyWiはadhocネットワークでテザリングを可能にするアプリで、テザリングは純正同様にバックグラウンドで動作するので、テザリング中でも電話やネットワークが通常通りに利用できます。


また、純正テザリングは3.1.2で使えなくなってしまいましたが、MyWiをインストールすることにより再び有効化することが可能となりますので、そのために購入するのも悪くないかもしれません。

MyWiを起動したらSSIDとWEPを適当に設定して ON にします。

するとNexus Oneの無線LAN設定のところにSSIDが現れます。

WEPキーいれて接続するだけでOK。

さて、このCM5.0で実装されてるadhocネットワークのコードをみて比較してみますと、オリジナルのコードではどうやら意図的にadhocを無視して、関連するコードも省いてるようです。

抜粋
@@ -1147,9 +1167,10 @@
* Ignore adhoc, enterprise-secured, or hidden networks.
* Hidden networks show up with empty SSID.
*/
- if (AccessPointState.isAdhoc(scanResult)
- || TextUtils.isEmpty(scanResult.SSID)) {
- continue;
+ //if (AccessPointState.isAdhoc(scanResult)
+ // || TextUtils.isEmpty(scanResult.SSID)) {
+ if (TextUtils.isEmpty(scanResult.SSID)) {
+ continue;
}


大して難しくない内容なので移植してCM不要でできないかやってみようとしましたが、frameworkまで入れ替えねばならなくなり、この部分だけピンポイントで入れ替えるのが難しそうなので断念しました。


そんなわけで、今はiPhoneにSBMのSIMを差して2台を1枚のSIMで運用しております。
Nexus OneでのSBMのMMSがどうにも安定しないのでしばらくこの体制でいきます。

Tuesday, February 2, 2010

mobile power supply items

携帯端末を複数持つようになったので。

僕のような人間はスマートフォンの電池がきれると死にます。
そんなわけで、補助電源をいつも持ち歩くことにしています。

まず、旅行や超長時間の移動の際には eneloopのmobile booster KBC-L2AS

去年の暮に新型がでてiPhoneに正式対応しました。逆に旧型のだと充電できないことがあるらしいです。
長距離じゃなくても、GPSやWiFi,3Gを駆使した使い方をする時にも活躍します。
たとえば、iPhoneをGPSロガーとして使用する時とか。

次に不意に電池がやばくなってしまったときのために、eneloopのmobile stick booster

なんといっても場所をとらないのがよいです。
iPhone, Nexus Oneともに充電可能ですが、単体で電池を充電できないないので注意。
とにかくいつもカバンに忍ばせておけば、いつバッテリーがやばくなっても安心できます。

ケーブルはリール式のコンパクトなやつがおすすめですね。
iPhoneのモノは多数発売されてるのでいいとして、Nexus OneのMicro-USB Bタイプのものはミヤビックスのものしか見つかりませんでした。


また、Micro-USB変換アダプタをつかえばMini-USBのものが使えます。

Mini-USB Bのケーブルは世の中に大量に溢れいてるのでこれも一つ持っておくといいかもしれません。
ただし、中には粗悪な変換ケーブルもあったりするので気を付けた方がいいかもしれません。
これを経由したmobile stick boosterでのNexus One充電は問題なくできました。

そんなわけで、わたくしは KBC-D1ASとケーブルx2、変換アダプタをいつも持ち歩いています。
KBC-D1ASでアルカリ乾電池が使えればさらによいのですが…。パッケージの説明書によると効率はeneloopより落ちるらしいです。
緊急用ならアリかもしれません。

Saturday, January 30, 2010

Nexus One に custom rom を install する

カスタムROMについては最悪端末を文鎮にしてしまう恐れがあるので自己責任で。

Nexus One用のカスタムROMがいくつか出ているので試すことにします。
ついでに、カーネルの入れ替えもします。

今回試すのは CyanogenMod 5.0 for Nexus One
現時点で beta3 + kernel update (2.6.32-59940)がでています。
http://forum.xda-developers.com/showthread.php?t=623496
* Can be used with or without Google applications
* Latest 2.6.29.6 kernel which supports tethering, vpn, and other modules (cifs, nfs, aufs, fuse)
* Clean shudown/startup system
* NO APPS2SD. I've implemented a hack that will store the dalvik-cache of system apps in /cache, which saves you ~40MB on /data
* Built in USB tether
* Minor graphical enhancements and an excellent wallpaper by Prash
* ARM NEON optimizations (mostly to the pixelflinger library) which have not been included in the stock build yet
* Includes BusyBox, htop, nano, powertop, openvpn, and all engineering commandline utilities
* Multitouch browser using native API and code from Luke Hutchison. More MT integration coming.
* FLAC audio support from Kenny Root
* Phone enhancements from Cytown
* Contacts enhancements from Wysie
* Perform zipalign-on-install of applications
* DeskClock tweaks- longer autosilence and "require unlock" option
* Compcache is available via Spare Parts, but I don't recommend it
* Massive APN list
* Huge collection of ringtones and audio
* All available locales are included thanks to PsychoBoy
* Many other bugfixes and tweaks from AOSP contributors

こんな感じでいろいろ変わります。
普通に使う範囲だと、マルチタッチブラウザとかUSBテザリングあたりが大きいですかね。JITを有効化することによる高速化も大きいかもしれません。

さて。導入には root化あるいはbootloaderのunlockが前提となります。

フォーラムから update-cm-5.0-N1-beta3-signed.zip をダウンロード、純正アプリが必要であれば、gapps-passion-ERD79-signed.zip もダウンロードしてSDカードにコピーしておきます。

まず fastboot でリカバリモードを起動します。
Wipe により設定情報の掃除を行います。あらゆる初期状態に戻ってしまうので注意。

次に Flash zip from sdcardで update-cm-5.0-N1-beta3-signed.zip を導入、その後必要であれば gapps-passion-ERD79-signed.zip を。
これで reboot すれば導入は終りですが、フォーラムによるとそのままCM5.0b3のカーネルではバッテリーと充電関連に不具合があり、充電できなくなったり、バッテリーが死ぬとの報告がいくつかみられます。

そこでDwang氏がビルドしたカーネル2.6.32 に差し替えます。
カーネルを替えると、無線LANドライバのモジュールがloadができなくなるので、一緒においてある bcm4329.ko もダウンロードしておきます。

fastbootで起動する。
次のコマンドによりカーネルを入れ替える。
$ sudo ./fastboot-linux flash zimage zImage
$ sudo ./fastboot-linux reboot

zImage はダウンロードしたカーネル。
起動したら無線LANが使えなくなってるのを確認。
adbによりダウンロードしておいたbcm4329.koをぶち込みます。
$ ./adb remount
$ ./adb shell cp /system/lib/modules/bcm4329.ko /system/lib/modules/bcm4329.ko.29
$ ./adb push bcm4329.ko /system/lib/modules/
$ ./adb reboot

2行目はバックアップです。
これで無線LANが使えるようになっているはずです。



どうやらこのカーネルはhimemが有効になっているようで、合計メモリが395MB(395,152kB)になります


個人的にカスタムロムを導入する目的は前述のリストにはなく、アドホックネットワークへの参加が大きいです。
その詳細はまた別のエントリで。

ちなみにこのROMはまだベータなのでxdaのフォーラムは随時追っかけておいた方がよさそうです。

Sunday, January 24, 2010

Nexus One で SBM の MMS を送受信する

※追記(2010/04/13): このエントリはもはや古いので新しい情報を参照してください。

※追記(2010/01/26): 嘘記事書いてゴメンナサイ。結局Mms.apkのUser Agentも書きかえないとダメなようです。

下のほうでアプリいれればいいみたいなことを書いてましたが、全くダメでした。
理由はサードパーティのSMS/MMSアプリをいれても、受信自体は純正のcom.android.mms経由で行っているためです。
送信だけは自前でやってるらしく、ちゃんとできたように見えます。

そこで、純正の SMS/MMSアプリのUser Agent Stringを書き換えた物に入れ替えます。
androidのソースにあるpackages/apps/Mms/res/xml/mms_config.xmlを書き換えて、このxmlだけ差し替えたものです。

Download: Mms.apk
MD5: 4084a145043cc83c0a63043f3a990f09

Android SDKにあるtools/adbを使ってぶち込みます。 (要 root)
$ ./tools/adb remount
remount succeeded
$ ./tools/adb shell cp /system/app/Mms.apk /system/app/Mms.apk.orig
$ ./tools/adb push ~/Downloads/Mms.apk /system/app/
997 KB/s (272550 bytes in 0.266s)
$ ./tools/adb reboot

以上でMMSが使えるようになります。
ただ、純正のSMS/MMSアプリってグループメッセージを扱えないようなので、iPhoneのモノには劣ります。
(追記終わり)

Nexus OneでMMSを使うための設定などを。
iPhone用SBM黒SIMを使います。

まず APN の設定は適切にされていることを前提。


純正の「メッセージ」アプリは User Agent を変更できないので使わない。
自動受信とかOFFにしとくといいかも。

マーケットから Handcent SMS なるアプリケーションをダウンロード。


メニューのSettingsからわりと下のほうにあるCustom User-Agentを選び、iPhone (3.0)にしとく。


Sms Receive SettingsにあるRetrieve message settingを選びAuto-retrieveを有効にする。


以上。

通知ポップアップ時の件名は日本語だと化けちゃうみたい。
けどスレッドの表示では問題なさげ。画像の受信もできた。

Saturday, January 23, 2010

Nexus OneとiPhoneを1枚のSIMで運用する

SIM1枚でNexus OneとiPhoneを運用しようというエントリです。


まず、そのためにはどんな方法があるのか。まっとーな方法はおそらくどちらかを親にしたテザリング。

1. iPhoneを親にするケース
1-1. 純正テザリング
1-2. pdanet
1-3. MyWi

このうち純正はUSBかBTになり、AndroidでBTの子テザはできない。USBなんて仮にできたとしてもイヤだ。
pdanetは有料JBアプリで、しかも子の側でadhocな無線LANを作らなくてはならない。そしてそれはAndroidではできない。
となると残るはMyWiになるが、これもJB必須で有料。で、実はAndroidはadhocネットワークに参加すらできない。

2. Nexus Oneを親にするケース
2-1. USBやBTのテザリングはあるにはあるがiPhone側で利用できないので無理
2-2. pdanet for AndroidはUSBかBTのみ
2-3. Wireless Tether for Root Users.

つうわけで、2-3に絞られる。これはiPhoneのMyWiと同じで、adhocな無線LANでテザリングする。iPhoneでadhocネットワークに参加するのは問題なくできる。(adhocネットワークを作ることは出来ない)
とりあず無料で使える。
ただ、Android 2.1用はまだ安定していない。

ともかく試すことにします。
rootとってることが前提。

Nexus Oneのブラウザで http://code.google.com/p/android-wifi-tether/に行き、Nexus One用のリンクからwireless_tether_2_0_pre1-eclair.apkをダウンロード。
kernel updateはひとまず要らない。NETFILTERを有効にしたkernelらしいので、Access Controlで使うのかも。LinuxではNATするのにも必要なんだけど、入れなくても動いた。おかしい。まぁいい。


そのままリストからタップするとインストールできるのでインストールする。


終わったら開く。
ここで、suがどうのでAllow Denyの選択を迫られることがあるのでとにかくAllowする。
うまく起動出来ずに強制終了か待機を迫られたら、強制終了して、再び開く。何度か繰り返してると起動できる。

メニューボタンを押して設定をする。設定しないでも動きそうではあるが、無防備になってしまうのでやめましょう。
WEPはすでに脆弱で意味がなくなってきてはいるのだが、ないよりはマシ。

変更するのは Wireless Encryptionを有効にする、Change Passphrase でパスフレーズを適当に決める。
あとはSSIDを確認、あるいは変更しておく。

これで-Press to start tethering-をタップすればサービスが開始される。


iPhone側では、Wi-Fiネットワークの設定で先程設定したSSIDのネットワークが出てくるはずなので、パスフレーズを入れて接続すればOK。

結果としてどうなるかといえば、Nexus Oneが無線LANルータのように振舞ってくれる。(が、adhocなので厳密には違う)
テザリング中でもNexus Oneでネットを使えるし、あるいは電話していてもiPhone側でネットが使えなくなるようなことはなかった。

難点は、たまにクライアント側でIPの更新が出来ないことがあるということ。これは既知の問題で、クライアント側でWi-FiをOFFってONにすればいいらしい。
もうひとつはたまに起動出来ずに待機か強制終了の選択になってしまうこと。なんどか繰り返してると起動するのだけど。
あとはわりと電池を喰らう。WiFiと3Gを同時に使うのだから仕方がない。

とにかく表面的には問題なさげに使えているという状況。

蛇足だが PSP の場合、インターネット接続はインフラストラクチャの無線LANでなくてはならないので繋げられないようだ。

Friday, January 22, 2010

Nexus Oneのroot奪取とフォント入れ替え

標準の日本語フォントキモいんで。
Nexus Oneでroot取りからフォント入れ替えまでのメモ。

Android SDKを手に入れる
http://developer.android.com/sdk/index.html
まだつかわない。

bootloaderをunlockする。
注意することはunlockしたら戻せない、サポートを受けるときに影響あるかも。そんなことは知った事ではない。
How to unlock the bootloader on your Nexus One
この辺を読んで、fastboot.zip をダウンロード。

まずNexus OneをUSBで接続。
1.電源長押しででるメニューから電源を切る。
2.ボリュームダウンボタン+電源で電源を入れる
3.メニューがでてくるので、ボリュームキーで FASTBOOT を選択し、電源ボタンで決定する。
(写真はUNLOCK済なんだけどまぁ一緒)
4. LinuxやMacはターミナルから fastboot-linux なりfastboot-mac なりを実行。Windowsはコマンドライン。
$ cd fastboot/
$ sudo ./fastboot-linux oem unlock
sudoしないとダメだった。(Windowsでは管理者権限?)
5. Nexus Oneの画面が変わるので "YES. unlock bootloader" をボリュームキーで選んで電源ボタンを押し決定。
6. rebootする.

次にリカバリイメージの書き換えを行う。
[Recovery] [30-May-2010] RA-nexus-v1.7.0.1
この辺を読んで、recovery-RA-nexus-v1.7.0.1.imgをダウンロード。(MD5sum: b5dbd17b153530247e7b90dfe501b9dd)
さっきと同様に1から3までやって、fastbootでリカバリイメージを書き換える。
$ sudo ./fastboot-linux flash recovery ~/Downloads/recovery-RA-nexus-v1.7.0.1.img
(~/Downloadsは適宜読み替え)

次にrooted.
[N1 Addon] Nexus One Addon 0.1 - Makin' Bacon [01/08/2010]
この辺を読んで、nexus-addon-0.1-signed.zipをダウンロード。 (MD5sum: 7b37d4313ea4a6dc2107352d837380df)
どういう手段でもいいのでSDカードにコピーしとく。
前項同様に、1から2までやって、今度はRECOVERYを選択。
(映り込みすげえな)
リカバリーモードはトラックボールで操作することになる。項目を戻るにはボリュームダウンキー。
まず Backup/Restore を選んで、Nand backup を選択。バックアップをする。
次に Flash zip from sdcard を選択すると SDCARD:nexus-addon-0.1-signed.zip とでてくるのでそのまま選択。

以上でroot化と呼ばれる作業は終わり。PowerOffして再起動。

いよいよフォントを入れ替える。
ちなみに普通のTTFが使えるようだ。
M+IPAとか好きなのを持ってきてくださいよ。
MS GothicとかメイリオもつかえるけどMSのライセンス的にどうなのか。

Nexus OneをUSBデバッグモードにしておく。
設定 → アプリケーション → 開発 → USBデバッグ。
で、最初にもってきていたSDKに含まれるコマンドadbを使う。
$ cd android-sdk-linux/tools
$ ./adb remount
remount succeeded
$ ./adb push ~/Downloads/custom-font.ttf /system/fonts/DroidSansJapanese.ttf
$ ./adb reboot

何をやっているのかの説明は割愛。

以上。

まぁいいんじゃなかろうか。

Thursday, January 21, 2010

Got a NexusOne google phone


というわけで私もNexusOneを購入しました。

購入手段はコムギドットネットさんの記事を参考にVPN経由で。
転送業者はUS Microsoftのtechnet購入のときにつかったスピアネットを。

今さらレビューすることもないだろうけど、とりあえず1日つかってみた雑感を箇条で。
・騒ぎたてるほど動作が軽快ではない (3GSと大して変らないような)
・日本語入力は若干難がある (SimejiもOpenWnnも)
・画面外のスクリーン部分もタッチセンサーの範囲になってて、片手持ちだと意図せず指の腹が触れて誤動作する。(なんとかしてよ)
・液晶綺麗
・日本語フォントがキモイ
・解像度が高いのはいいことだ
・液晶保護フィルム欲しい
・付属のケースにいれてても、スルっと中から落ちそうなので注意

まぁiPhoneではできそうもないことをやれるのがいいですね。(legal的な意味で)

フォントがキモいのは漢字のグリフが簡体字と共通だからだそうです。
ようするに中国語風な漢字です。
まぁ追い追いカスタマイズしていきたい。