Blog -
Androidの開発をやっていると、Viewの更新をぐりぐりやる処理を作ったりする。
WidgetのImageViewに対してServiceからRemoteViewを経由して
setImageViewBitmapを更新する処理の開発を行っている時にどうもカクカク(処理遅延の様な)したり更新されなかったりする時が有る。
そんな時LOGには
!!! FAILED BINDER TRANSACTION !!!
が連発している事が多いですが、その原因と対処法について
原因は、RemoteViewのsetImageViewBitmapを呼び出すと引数のBitmapを
シリアル化して渡す、その時のメモリが累積してIPCの許容を超えると発生します。
1.RemoteViewをService内で使いまわしている
2.大きな画像をBitmapに指定している
対処法として
1の場合は、
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.レイアウトID);
といったように毎回定義しなおすと回避できる。
2の場合は、
Bitmapのサイズを小さくするもしくは、Bitmap.Config.RGB_565を指定する
アルファチャネルが使えないのが痛いが、背景ならなんとか。
参考までに、2*2のサイズのPNGは大丈夫でした。
また、Eclipseのデバッグ(実機)などで何をしても発生する場合、実機のAPKを一度アンインストールすると直る事が有ります。
(自分はこれにハマりました)
WidgetのImageViewに対してServiceからRemoteViewを経由して
setImageViewBitmapを更新する処理の開発を行っている時にどうもカクカク(処理遅延の様な)したり更新されなかったりする時が有る。
そんな時LOGには
!!! FAILED BINDER TRANSACTION !!!
が連発している事が多いですが、その原因と対処法について
原因は、RemoteViewのsetImageViewBitmapを呼び出すと引数のBitmapを
シリアル化して渡す、その時のメモリが累積してIPCの許容を超えると発生します。
1.RemoteViewをService内で使いまわしている
2.大きな画像をBitmapに指定している
対処法として
1の場合は、
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.レイアウトID);
といったように毎回定義しなおすと回避できる。
2の場合は、
Bitmapのサイズを小さくするもしくは、Bitmap.Config.RGB_565を指定する
アルファチャネルが使えないのが痛いが、背景ならなんとか。
参考までに、2*2のサイズのPNGは大丈夫でした。
また、Eclipseのデバッグ(実機)などで何をしても発生する場合、実機のAPKを一度アンインストールすると直る事が有ります。
(自分はこれにハマりました)
AuraxTSense(Sense系)7.9にSB公式のbuild.propを参考に
魔法の五行を編集して利用しているが
ro.ril.oem.ecclist=110,118,119
ro.ril.enable.a52=0
ro.ril.enable.a53=1
ro.ril.fast.dormancy.timeout=3
ro.ril.enable.sbm.feature=1
バッテリー満タン時には、juicePlotterで40時間近い稼動予定になる。
実際は、ちょこちょこ(稀にヘビーに)使っても2日は持つ感じになる。
音楽再生などで使うと1日くらい、夜中0時から朝6時のスリープ時消費は
大体、2〜3%というところ、グラフで倍率が高いと殆ど横線に見える。
ただ、Sense系以外のROMを使った場合、丁度45度の角度で消費されて行く
満タンからだと8時間くらい使っていれば5時間持つかどうか、以前の
バッテリー大量消費に見舞われてからの現象。
ハードは同じだし、SDかデバイス関連でしょうか。
同じ様な症状の方は、Sense系ROM入れて魔法の5行追加してみては?
追記
→libhtc_ril.soを入れ替えるとSense系以外もなかなか行けます。
AuraxTSenseのlibhtc_ril.soを愛用していますがなかなかです。
(/system/lib以下にあります。)
魔法の五行を編集して利用しているが
ro.ril.oem.ecclist=110,118,119
ro.ril.enable.a52=0
ro.ril.enable.a53=1
ro.ril.fast.dormancy.timeout=3
ro.ril.enable.sbm.feature=1
バッテリー満タン時には、juicePlotterで40時間近い稼動予定になる。
実際は、ちょこちょこ(稀にヘビーに)使っても2日は持つ感じになる。
音楽再生などで使うと1日くらい、夜中0時から朝6時のスリープ時消費は
大体、2〜3%というところ、グラフで倍率が高いと殆ど横線に見える。
ただ、Sense系以外のROMを使った場合、丁度45度の角度で消費されて行く
満タンからだと8時間くらい使っていれば5時間持つかどうか、以前の
バッテリー大量消費に見舞われてからの現象。
ハードは同じだし、SDかデバイス関連でしょうか。
同じ様な症状の方は、Sense系ROM入れて魔法の5行追加してみては?
追記
→libhtc_ril.soを入れ替えるとSense系以外もなかなか行けます。
AuraxTSenseのlibhtc_ril.soを愛用していますがなかなかです。
(/system/lib以下にあります。)
MMSのアプリがSoftBankさんから出たんですが、カスタムROM派には
余り興味が無かった訳ですがSense系のROMでは、有志が作成して下さった
Mms.pakが上手く動作しない、もしくは絵文字が使えなかったり
Senseのコピー機能は欲しいけどMMSの絵文字も使いたいというと二者択一
(私の中ではですが)でした。
AuraxTSenseに有志のMms.apkを入れてUser-Agentを替えれば送受信可能です
(フォントサイズなど変えられて結構快適に使えます)
その上にSoftBankのメールをインストールすると使えない事は無いが
通知を既存のMmsが取得する為、SB側のメールがエラーを発生させる
無視すれば使えない事は無いが、既存Mms側とSBメール両方に通知が残る。
また、既存MmsはwifiでAPNを常時接続にしていないと本文受信が出来なかったりするのでWifiを切るか常時接続にする。(通知は受け取れる)
SBのメールは、3G側を常に使うので常時接続でなくてもそれなりにシームレスに使える様です。
純正ROMだとSBメール入れるとMMSが置き換わるのか解りませんが
単純に、カスタムROM側のMms.apkを削除してSBメールをインストールするだけで実現可能でした、サイズさえ目を瞑れば絵文字も見れるし感情を誤解しない様にはなりそうです。
余り興味が無かった訳ですがSense系のROMでは、有志が作成して下さった
Mms.pakが上手く動作しない、もしくは絵文字が使えなかったり
Senseのコピー機能は欲しいけどMMSの絵文字も使いたいというと二者択一
(私の中ではですが)でした。
AuraxTSenseに有志のMms.apkを入れてUser-Agentを替えれば送受信可能です
(フォントサイズなど変えられて結構快適に使えます)
その上にSoftBankのメールをインストールすると使えない事は無いが
通知を既存のMmsが取得する為、SB側のメールがエラーを発生させる
無視すれば使えない事は無いが、既存Mms側とSBメール両方に通知が残る。
また、既存MmsはwifiでAPNを常時接続にしていないと本文受信が出来なかったりするのでWifiを切るか常時接続にする。(通知は受け取れる)
SBのメールは、3G側を常に使うので常時接続でなくてもそれなりにシームレスに使える様です。
純正ROMだとSBメール入れるとMMSが置き換わるのか解りませんが
単純に、カスタムROM側のMms.apkを削除してSBメールをインストールするだけで実現可能でした、サイズさえ目を瞑れば絵文字も見れるし感情を誤解しない様にはなりそうです。
Buletoothのサーチ(クライアント)中は、待ち受け(サーバ)をしない方が
良いとの事、電波干渉するらしい。
同時(非同期)にしたかったが順番に行う方が良いみたい。
1.デバイス検索
2.デバイスリスト処理 非同期で待ち受け処理
3.デバイス検索(以下繰り返し)
両方終ったら、デバイス検索という処理が理想かなと考察
という事は、
サービス
デバイス検索
完了→非同期 デバイスリスト処理(クラス)、非同期 待ち受け処理(クラス)
処理完了(ハンドラで待ち受け)
デバイス検索
という事で、サービスとして設計する。
良いとの事、電波干渉するらしい。
同時(非同期)にしたかったが順番に行う方が良いみたい。
1.デバイス検索
2.デバイスリスト処理 非同期で待ち受け処理
3.デバイス検索(以下繰り返し)
両方終ったら、デバイス検索という処理が理想かなと考察
という事は、
サービス
デバイス検索
完了→非同期 デバイスリスト処理(クラス)、非同期 待ち受け処理(クラス)
処理完了(ハンドラで待ち受け)
デバイス検索
という事で、サービスとして設計する。
軒並み外国のAndroidサイトから勧誘が来ます。
中国とかドイツ、イギリスなどなど
ん〜翻訳してみるもどうも怪しい感じがしてしまうのは
島国根性の為??フリーのもなら問題なかなぁと思いつつ
二の足を踏んでしまう。
中国とかドイツ、イギリスなどなど
ん〜翻訳してみるもどうも怪しい感じがしてしまうのは
島国根性の為??フリーのもなら問題なかなぁと思いつつ
二の足を踏んでしまう。
SB版の2.2へアップグレードを行うともれなくHBOOT-0.93になり
GoldCardによるRoot化手法が使えなくなる。
そこで、unrEVOked3.21を使う。
HBOOTのUSBドライバを設定して、該当のExeを実行するだけで行ける様だ。
(多少の設定、USBデバックに設定とか外部ストレージモードにするとかあるが待つだけ)
もうちょっと純正を使ってからトライしてみようと思う。
カスタムROMの方が軒並み処理能力やら消費電力やら痒い所に手が届くやら
あるので魅力的。
→ 上記の方法でRootが取れたかも、簡単すぎて微妙な感じですが
ROM ManagerからRootが取れません、カスタムROM入れないと駄目なんだろうか。
→ Root取れてました、ブートの時のロゴが「=SoftBank」でしたので勘違いしていました。
GoldCardによるRoot化手法が使えなくなる。
そこで、unrEVOked3.21を使う。
HBOOTのUSBドライバを設定して、該当のExeを実行するだけで行ける様だ。
(多少の設定、USBデバックに設定とか外部ストレージモードにするとかあるが待つだけ)
もうちょっと純正を使ってからトライしてみようと思う。
カスタムROMの方が軒並み処理能力やら消費電力やら痒い所に手が届くやら
あるので魅力的。
→ 上記の方法でRootが取れたかも、簡単すぎて微妙な感じですが
ROM ManagerからRootが取れません、カスタムROM入れないと駄目なんだろうか。
→ Root取れてました、ブートの時のロゴが「=SoftBank」でしたので勘違いしていました。
やっとこ、アイデアが纏まったので開発に入ります。
内容は、Bluetoothを使った物になります。
詳しくは後ほど。
しかし、iPhoneもこの辺とまりでしょうね。
ハードまで握ったらPC98と同じ事になりますね
デザインとアイデアが、昔のNECよりはあるので
好きに人にはこのままの人気で行くでしょうが
開発の場に上がってくるのはAndroidになって来るでしょうね。
今のうちに習得しておきたいところです。
内容は、Bluetoothを使った物になります。
詳しくは後ほど。
しかし、iPhoneもこの辺とまりでしょうね。
ハードまで握ったらPC98と同じ事になりますね
デザインとアイデアが、昔のNECよりはあるので
好きに人にはこのままの人気で行くでしょうが
開発の場に上がってくるのはAndroidになって来るでしょうね。
今のうちに習得しておきたいところです。
Bluetooth(A2dp)は、接続しましたメッセージが出た後、実質確立するまで
意外と時間が掛かっている、その為、接続完了の通知がレシーバに届くまでに時間が掛かる。
MediaSwitchなどはトーストで通知している為、見逃す・・・
という事で、バイブレータで通知します、少しだけ気長に待って下さい。
あと、XperiaユーザにBluetooth関係が動かない様で調査しています。
Xperiaユーザ様、すいません。
Sonyエリクソン仕様なのかな、X10のSDK(エミュレータ)を入手して調べます。
実機が欲しい所、誰か持っていないかなぁ
意外と時間が掛かっている、その為、接続完了の通知がレシーバに届くまでに時間が掛かる。
MediaSwitchなどはトーストで通知している為、見逃す・・・
という事で、バイブレータで通知します、少しだけ気長に待って下さい。
あと、XperiaユーザにBluetooth関係が動かない様で調査しています。
Xperiaユーザ様、すいません。
Sonyエリクソン仕様なのかな、X10のSDK(エミュレータ)を入手して調べます。
実機が欲しい所、誰か持っていないかなぁ
Mediaswitch FREE版でエラーレポートが送られて来ていました。
内容は、ANR keyDispatchingTimedOutイメージ的には、ディスパッチャが
何かを割り当てようとした時にタイムアウトしている様な意味かな?
早速、ログを解析するもまったく意味が解らない(笑)
メインのActivityで発生している模様なのは解った
デバックを実機(2.2)からエミュレータ(1.6)に変えてやってみるもアプリ画面が表示される前に「応答しません」という警告が出る
実機だと強制終了になるっぽい
デバッグで場所を確認したいが場所が判断出来ない、んー困った。
デバックのログを解析するとどうやらOnCreateで発生している模様
初期設定に重い処理(マシン依存)があるとタイムアウトが発生するのか?と仮定して、この処理をコメントアウトする。
と、エラーが出ない。場所を特定出来たので方法を考える。
何かしらOSに返さないとエラーを出すらしい。
この処理は、レイアウトのLISTVIEWに対してなので場所は変えられない
そこで、プログレスダイアログを考えるこれなら、ダイアログ自体と
処理はOSとやり取りする為タイムアウトが発生しないかも知れない
早速、重い処理を開始する前にプログレスダイアログを表示して
待ち合わせをする様に変更すると問題解消、非同期の重い処理は
これをやらないと危ない。
特に(ユーザには悪いが)Xperiaはスペックが良くないので発生する様だ
実機を買わないと行けないのか、マーケットで売れたら考えるかな。
→ 後日分かった事は、onCreate及びonStartの処理に5秒以上掛かると発生するっぽいです。
ですので、メインのUIで重い処理をする時は、Threadで非同期処理もしくはAsysncTaskで切り分けましょう
内容は、ANR keyDispatchingTimedOutイメージ的には、ディスパッチャが
何かを割り当てようとした時にタイムアウトしている様な意味かな?
早速、ログを解析するもまったく意味が解らない(笑)
メインのActivityで発生している模様なのは解った
デバックを実機(2.2)からエミュレータ(1.6)に変えてやってみるもアプリ画面が表示される前に「応答しません」という警告が出る
実機だと強制終了になるっぽい
デバッグで場所を確認したいが場所が判断出来ない、んー困った。
デバックのログを解析するとどうやらOnCreateで発生している模様
初期設定に重い処理(マシン依存)があるとタイムアウトが発生するのか?と仮定して、この処理をコメントアウトする。
と、エラーが出ない。場所を特定出来たので方法を考える。
何かしらOSに返さないとエラーを出すらしい。
この処理は、レイアウトのLISTVIEWに対してなので場所は変えられない
そこで、プログレスダイアログを考えるこれなら、ダイアログ自体と
処理はOSとやり取りする為タイムアウトが発生しないかも知れない
早速、重い処理を開始する前にプログレスダイアログを表示して
待ち合わせをする様に変更すると問題解消、非同期の重い処理は
これをやらないと危ない。
特に(ユーザには悪いが)Xperiaはスペックが良くないので発生する様だ
実機を買わないと行けないのか、マーケットで売れたら考えるかな。
→ 後日分かった事は、onCreate及びonStartの処理に5秒以上掛かると発生するっぽいです。
ですので、メインのUIで重い処理をする時は、Threadで非同期処理もしくはAsysncTaskで切り分けましょう
10/08からSoftbankから2.2とMMSがリリースされるが
2.2を使ってみたいけどRUUでのアップロードなのか方法が判らない
バッテリーの事もありアップデートまで純正に戻す事にしたので手順をメモ
(個人の責任で処理を行って下さい、これによって発生した障害などは責任を持ちません、といってもRootedした人なら解ると思うが)
前提
・Rootedである事
・USBドライバが正常にインストールされている事
必要ファイル
・RUU_Bravo_SoftBank_JP_1.18.762.7_Radio_32.34.00.28U_4.05.00.30_2_release_128910_signed.exe
(Xdaなどに有る)
・flash_image(SDカードへコピー)
・mtd0.img(SDカードへコピー)
(Softbankの最新は、1.18.762.7)
1.音量下げ+電源でBootメニューに入る、Recoveryモードへ
2.USBケーブルを接続し画面が黒字に赤い三角の画面が出たら、DOSプロンプトからAmDrsireRecoveryでRecoveryモードに
3.もう一つDOSプロンプトを開いてadb shellを実行(SDKのTOOLSにPATHが通っている事)
4.下記コマンド
adb shell
mount /sdcard/
cd data
chmod 755 flash_image
/data/flash_image misc /data/mtd0.img
cp /sdcard/mtd0.img /data
cp /sdcard/flash_image /data
exitで抜ける。
この時に、/dataに同名のファイルが無い方は、コピーのみ(4,5行目は実行しない)また、SDカードへコピーしなくてもadb pushでPC上の場所を指定してもOK。
5.そのままプロンプトで
adb reboot oem-78
を実行する、X06HTの画面がHTCと出たままになる。
6.RUU_Bravo_SoftBank_JP_1.18.762.7_Radio_32.34.00.28U_4.05.00.30_2_release_128910_signed.exeを実行する
後は画面に従って完了まで。
(Windows7の方は、このファイルのプロパティの互換よりXP SP3で動かす設定と管理者で実行を行う、それをしないと途中でエラーを出す)
すっかり元通りになりましたが、意外と速いしバッテリー食わない
SBの2.2とMMSとを使わなきゃ行けないみたいな制約が無ければまたRootedすると思います。
DesireHDのROMがとても気になる。
なお、ここで使用したファイルが必要な方はメールくれればDowunloadなどの方法を考えたいと思います(それによって出た不具合は責任持てません)
2.2を使ってみたいけどRUUでのアップロードなのか方法が判らない
バッテリーの事もありアップデートまで純正に戻す事にしたので手順をメモ
(個人の責任で処理を行って下さい、これによって発生した障害などは責任を持ちません、といってもRootedした人なら解ると思うが)
前提
・Rootedである事
・USBドライバが正常にインストールされている事
必要ファイル
・RUU_Bravo_SoftBank_JP_1.18.762.7_Radio_32.34.00.28U_4.05.00.30_2_release_128910_signed.exe
(Xdaなどに有る)
・flash_image(SDカードへコピー)
・mtd0.img(SDカードへコピー)
(Softbankの最新は、1.18.762.7)
1.音量下げ+電源でBootメニューに入る、Recoveryモードへ
2.USBケーブルを接続し画面が黒字に赤い三角の画面が出たら、DOSプロンプトからAmDrsireRecoveryでRecoveryモードに
3.もう一つDOSプロンプトを開いてadb shellを実行(SDKのTOOLSにPATHが通っている事)
4.下記コマンド
adb shell
mount /sdcard/
cd data
chmod 755 flash_image
/data/flash_image misc /data/mtd0.img
cp /sdcard/mtd0.img /data
cp /sdcard/flash_image /data
exitで抜ける。
この時に、/dataに同名のファイルが無い方は、コピーのみ(4,5行目は実行しない)また、SDカードへコピーしなくてもadb pushでPC上の場所を指定してもOK。
5.そのままプロンプトで
adb reboot oem-78
を実行する、X06HTの画面がHTCと出たままになる。
6.RUU_Bravo_SoftBank_JP_1.18.762.7_Radio_32.34.00.28U_4.05.00.30_2_release_128910_signed.exeを実行する
後は画面に従って完了まで。
(Windows7の方は、このファイルのプロパティの互換よりXP SP3で動かす設定と管理者で実行を行う、それをしないと途中でエラーを出す)
すっかり元通りになりましたが、意外と速いしバッテリー食わない
SBの2.2とMMSとを使わなきゃ行けないみたいな制約が無ければまたRootedすると思います。
DesireHDのROMがとても気になる。
なお、ここで使用したファイルが必要な方はメールくれればDowunloadなどの方法を考えたいと思います(それによって出た不具合は責任持てません)