Androidの不意のリブート、フリーズについて

2,215 views
Skip to first unread message

Kazuhiko Kobayashi

unread,
Feb 14, 2012, 5:30:15 AM2/14/12
to 日本Androidの会
はじめまして。小林と申します。
Androidマーケットで試験的に作ったアプリケーションを公開してみました。
https://market.android.com/details?id=jp.co.pscnet.mms.tinyar
Ver1.13では動かなかったという報告がほとんど無かったのですが、Ver1.14で端末が
勝手にリブートするなどの報告が寄せられました。
違いと言えば、Javaの配列で取っていた頂点情報をByteBufferに移しただけなのですが、
それだけで端末がリブートしてしまうという事に非常に驚いています。
尚、テスト機(ASUS Transformer TF101 Android3.2.1)では落ちたりする事は全くありません。
Androidではnative bufferを使うと落ちる事があるのでしょうか。
試しにテスト機でメモリーを大量に使用する負荷テストをしてみましたが、メモリーが
不足するとOutOfMemoryの例外が発生するだけで、それをキャッチして解放すれば
全く問題無く動いています。

アプリの重さを考えると端末によっては動かない事があるのは仕方ないと思うのですが、
OSごと落ちてしまうのは致命的ですので、何とか対策したいです。

アプリ側で出来る対策は無いものでしょうか。

--
twitter https://twitter.com/#!/chototsumoushin
blog http://blogs.yahoo.co.jp/chototsu_moushinp
MikuMikuStudio http://sourceforge.jp/projects/mikumikustudio/

堀松直也

unread,
Feb 14, 2012, 7:39:19 AM2/14/12
to android-g...@googlegroups.com

はじめまして、コガラシといいます。

Bytebufferは文字通りバイト単位のものです。
Java標準の配列とは単位が違うので間違って指定していたりしませんか?

一般的にfloat型は4byteなので、要素数の4倍を指定すべきです。

またBytebufferはJavaの管理外に確保されるので、ガーベジコレクションや例外処理などJavaの機能の恩恵を得られずエラーハンドリングなどがし辛くなります。

参考になれば幸いです。

2012/02/14 19:47 "Kazuhiko Kobayashi" <koba...@pscnet.co.jp>:
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。

Kazuhiko Kobayashi

unread,
Feb 14, 2012, 7:56:38 AM2/14/12
to 日本Androidの会
コガラシ様
返信有り難うございます。
サイズは間違っておりません。1バイト単位で完全にサイズが合っていることは確認済みです。
VBOの作成のため最終的にdirect bufferにする必要があるのですが、座標系の変換等やソート等の中間処理があり、
データを一旦vecmathのVector3fでメモリーに格納していました。
しかし頂点数が10万を超えますとメモリーが厳しいため、direct bufferにしました。
その結果メモリー消費量はかなり減らす事が出来たのですが、一部機種でトラブルが発生した次第です。

On 2月14日, 午後9:39, 堀松直也 <kogarasi.cr...@gmail.com> wrote:
> はじめまして、コガラシといいます。
>
> Bytebufferは文字通りバイト単位のものです。
> Java標準の配列とは単位が違うので間違って指定していたりしませんか?
>
> 一般的にfloat型は4byteなので、要素数の4倍を指定すべきです。
>
> またBytebufferはJavaの管理外に確保されるので、ガーベジコレクションや例外処理などJavaの機能の恩恵を得られずエラーハンドリングなどがし 辛くなります。
>
> 参考になれば幸いです。
> 2012/02/14 19:47 "Kazuhiko Kobayashi" <kobay...@pscnet.co.jp>:
>
>
>
>
>
>
>
> > はじめまして。小林と申します。
> > Androidマーケットで試験的に作ったアプリケーションを公開してみました。
> >https://market.android.com/details?id=jp.co.pscnet.mms.tinyar
> > Ver1.13では動かなかったという報告がほとんど無かったのですが、Ver1.14で端末が
> > 勝手にリブートするなどの報告が寄せられました。
> > 違いと言えば、Javaの配列で取っていた頂点情報をByteBufferに移しただけなのですが、
> > それだけで端末がリブートしてしまうという事に非常に驚いています。
> > 尚、テスト機(ASUS Transformer TF101 Android3.2.1)では落ちたりする事は全くありません。
> > Androidではnative bufferを使うと落ちる事があるのでしょうか。
> > 試しにテスト機でメモリーを大量に使用する負荷テストをしてみましたが、メモリーが
> > 不足するとOutOfMemoryの例外が発生するだけで、それをキャッチして解放すれば
> > 全く問題無く動いています。
>
> > アプリの重さを考えると端末によっては動かない事があるのは仕方ないと思うのですが、
> > OSごと落ちてしまうのは致命的ですので、何とか対策したいです。
>
> > アプリ側で出来る対策は無いものでしょうか。
>
> > --
> > twitterhttps://twitter.com/#!/chototsumoushin
> > bloghttp://blogs.yahoo.co.jp/chototsu_moushinp
> > MikuMikuStudiohttp://sourceforge.jp/projects/mikumikustudio/

堀松直也

unread,
Feb 14, 2012, 8:22:22 AM2/14/12
to android-g...@googlegroups.com

すみません、お力になれそうにです。
それと、さきほどは少し失礼な発言でしたね、すみません。

マーケットの動作報告を見た感じだとarrowsがダメだったりとまばらなのでチップ依存というのは低そうですね。
自分の中で考えられるものとしては、ネイティブのヒープが少ない端末(少なく設定されている)だとダメなのかもしれません。
実際に機種ごとにどのくらい差があるのかはちょっとわかりませんが。

参考になれば幸いです。

2012/02/14 21:56 "Kazuhiko Kobayashi" <koba...@pscnet.co.jp>:

Kazuhiko Kobayashi

unread,
Feb 14, 2012, 8:34:23 AM2/14/12
to 日本Androidの会
いえいえ、返信して頂き感謝しております。
arrowsが駄目だったのはPowerVRのドライバーのバグのためでした。
OpenGL ES2.0ではシェーダに演算精度を定義する必要があるのですが
(しないと通常エラーになります)、PowerVRのドライバーの一部バージョンでは
定義すると逆にエラーになるというバグがあります。
(Imagination Technologies社のエンジニアにお聞きしました)
http://www.imgtec.com/forum/forum_posts.asp?TID=1952
arrowsのユーザー様からはこの対策をしてからは動くようになったと聞いております。

ちなみに動かなかったのはこのバイナリです(一部端末でフリーズするので注意)。
http://chototsumoushinp.dip.jp/miku/download/AndroidSample_tinyar-114beta2.apk

MIPSアーキテクチャのainol Novo 7 Paladinですら動くのに、どうしてREGZA Phone T01Cで
OSごとハングアップするのか不思議です。

メモリー不足ごときでOSごとハングアップするとは信じがたいです。
まるでWindows3.1の時代に戻ったかのようです。
Androidではこれが普通なのでしょうか・・・。

On 2月14日, 午後10:22, 堀松直也 <kogarasi.cr...@gmail.com> wrote:
> すみません、お力になれそうにです。
> それと、さきほどは少し失礼な発言でしたね、すみません。
>
> マーケットの動作報告を見た感じだとarrowsがダメだったりとまばらなのでチップ依存というのは低そうですね。
> 自分の中で考えられるものとしては、ネイティブのヒープが少ない端末(少なく設定されている)だとダメなのかもしれません。
> 実際に機種ごとにどのくらい差があるのかはちょっとわかりませんが。
>
> 参考になれば幸いです。
> 2012/02/14 21:56 "Kazuhiko Kobayashi" <kobay...@pscnet.co.jp>:

堀松直也

unread,
Feb 14, 2012, 9:22:35 AM2/14/12
to android-g...@googlegroups.com

動作確認の方させていただきました。
logcatの方はすみませんが確認してないです。

確認を行ったのは以下の通りです。
IS03(Froyo)
ISW11M(gingerbread2.3.4)
IS11S acro(2.3.4)

ISW11Mは正常にモデルが表示できました。
デュアルなのでかなり起動時の読み込みは早かったです。

IS11S acroに関してはフリーズしました。
フリーズのタイミングは読みこみの表示が消えたらでした。
フリーズ中にサウンドが再生されっぱなしのままでした。
ハードキーからの応答なしで、バッテリーを外して対処しました。

IS03は読み込みがキャンセルになったのか、動作はしているんですがモデルが表示されませんでした。

ドライバーのバグとは泣
やはりarrowsZは十分な検証が出来なかったんでしょうね。

2012/02/14 22:34 "Kazuhiko Kobayashi" <koba...@pscnet.co.jp>:

Kazuhiko Kobayashi

unread,
Feb 14, 2012, 9:34:50 AM2/14/12
to 日本Androidの会
コガラシ様
テスト有り難うございます。
ISW11Mは開発マシンと同じTegra2ですので安定すると思います。
メモリー不足の時は何も表示されず、音楽だけが流れると思います。それが正常な
状態です。
acroは電源ボタンすら効かないとは・・・。
仮にアプリにバグがあったとしても、それくらいで電源すら落とせない状態になる
というのは、端末の欠陥ではないのでしょうか。
そう愚痴りたくなります。

いったいどうしたらいいのでしょう。
困り果てています。

On 2月14日, 午後11:22, 堀松直也 <kogarasi.cr...@gmail.com> wrote:
> 動作確認の方させていただきました。
> logcatの方はすみませんが確認してないです。
>
> 確認を行ったのは以下の通りです。
> IS03(Froyo)
> ISW11M(gingerbread2.3.4)
> IS11S acro(2.3.4)
>
> ISW11Mは正常にモデルが表示できました。
> デュアルなのでかなり起動時の読み込みは早かったです。
>
> IS11S acroに関してはフリーズしました。
> フリーズのタイミングは読みこみの表示が消えたらでした。
> フリーズ中にサウンドが再生されっぱなしのままでした。
> ハードキーからの応答なしで、バッテリーを外して対処しました。
>
> IS03は読み込みがキャンセルになったのか、動作はしているんですがモデルが表示されませんでした。
>
> ドライバーのバグとは泣
> やはりarrowsZは十分な検証が出来なかったんでしょうね。
> 2012/02/14 22:34 "Kazuhiko Kobayashi" <kobay...@pscnet.co.jp>:
>
>
>
>
>
>
>
> > いえいえ、返信して頂き感謝しております。
> > arrowsが駄目だったのはPowerVRのドライバーのバグのためでした。
> > OpenGL ES2.0ではシェーダに演算精度を定義する必要があるのですが
> > (しないと通常エラーになります)、PowerVRのドライバーの一部バージョンでは
> > 定義すると逆にエラーになるというバグがあります。
> > (Imagination Technologies社のエンジニアにお聞きしました)
> >http://www.imgtec.com/forum/forum_posts.asp?TID=1952
> > arrowsのユーザー様からはこの対策をしてからは動くようになったと聞いております。
>
> > ちなみに動かなかったのはこのバイナリです(一部端末でフリーズするので注意)。
>
> >http://chototsumoushinp.dip.jp/miku/download/AndroidSample_tinyar-114...

堀松直也

unread,
Feb 14, 2012, 9:57:08 AM2/14/12
to android-g...@googlegroups.com
Androidはまだまだ本当に不十分なものがおおいなと思います。
実際、急ピッチでここまで来たのである程度しょうがないことは多いのかなと
なんにせよ、開発者殺しなのは変わらないですが・・・


acro含めXperia系列なんですが、基本的にはOS部分はカスタマイズをしないようにしているみたいで標準環境だと動かないのかも。
確かGalaxySもダメなんでしたよね?フラグシップなモデルですし。

やはり種類がこう豊富すぎて検証も難しいですね。
メーカー側のカスタマイズでもかなり変わってきますし


2012年2月14日23:34 Kazuhiko Kobayashi <koba...@pscnet.co.jp>:

--
┏┏┏┏━━━━━━━━━━━━━━━━━━━━━━━━
┏╋┏  アーツカレッジヨコハマ
┏┏■   ゲームクリエイター学科 ゲームプログラマーコース
┏        堀松 直也  < kogaras...@gmail.com >
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━

Kazuhiko Kobayashi

unread,
Feb 14, 2012, 10:07:43 AM2/14/12
to 日本Androidの会
PowerVRが載っているGalaxy Sでは多分動くと思います。
MOVERIOやGalaxy NEXUSでもテストしましたし。
中華パッドなどでは意外なほどトラブル無く動くようです。
またテスト機のTF101も全く問題無く動いており、再起動などは
購入後数回しか行っておりませんが、落ちたことはありません。
やはりAndroid3.x系は新しいので安定しているのでしょうか。

それにしても、これだけ機種ごとの変なトラブルが多いと、
開発者としては本当に困りますね。
いったいどれだけテスト機を用意しないといけないのでしょう。
皆さん、どのように検証されているのでしょうか。

On 2月14日, 午後11:57, 堀松直也 <kogarasi.cr...@gmail.com> wrote:
> Androidはまだまだ本当に不十分なものがおおいなと思います。
> 実際、急ピッチでここまで来たのである程度しょうがないことは多いのかなと
> なんにせよ、開発者殺しなのは変わらないですが・・・
>
> acro含めXperia系列なんですが、基本的にはOS部分はカスタマイズをしないようにしているみたいで標準環境だと動かないのかも。
> 確かGalaxySもダメなんでしたよね?フラグシップなモデルですし。
>
> やはり種類がこう豊富すぎて検証も難しいですね。
> メーカー側のカスタマイズでもかなり変わってきますし
>
> 2012年2月14日23:34 Kazuhiko Kobayashi <kobay...@pscnet.co.jp>:
> ...
>
> もっと読む ≫

Kazuhiko Kobayashi

unread,
Feb 14, 2012, 8:25:02 PM2/14/12
to 日本Androidの会
続きです。
今度はAdreno205でAndroid OSがフリーズするバグを発見しました。

http://chototsumoushinp.dip.jp/miku/download/AndroidSample_tinyar-116-adreno205.apk

このアプリはAdreno200,Tegra2などでは問題無く動作します。しかし、
Adreno205を搭載したIS05ではフリーズしました。
テストして頂いた方によりますと、電源ボタン長押しも効かず、バッテリーを抜くしか
無い状態になるそうです。

調査しましたところ、フラグメントシェーダーでdiscardしているのが問題だったようです。
シェーダーのソースはこれなのですが
http://hg.sourceforge.jp/view/mikumikustudio/MMDLoaderJME/file/f64fe1a9e370/src/MatDefs/pmd/pmd.frag

161-163行目
161 if(alpha < 0.1 /*m_AlphaDiscardThreshold*/){
162 discard;
163 }
これをコメントアウトすると動くようになりました。

Android OSのフリーズ問題ですが、どうもGPUのドライバーの不具合がかなりの割合を
占めるのではないかという気がしてきました。

それにしても、たった1つのdiscard文でOSごとフリーズするとは恐ろしいです。
> ...
>
> もっと読む ≫

Hiroaki GOTO as GORRY

unread,
Feb 15, 2012, 12:50:56 AM2/15/12
to android-g...@googlegroups.com

後藤 浩昭(GORRY)です。

> Android OSのフリーズ問題ですが、どうもGPUのドライバーの不具合がかなりの割合を
> 占めるのではないかという気がしてきました。
>
> それにしても、たった1つのdiscard文でOSごとフリーズするとは恐ろしいです。

ビデオドライバの類は、動作速度などを理由に比較的「高い権限を持って」
動作することが多いです。これはつまり「不具合があったときに
システムによる保護機能が効きにくくなる」ことでもあります。
つまり、ビデオドライバのフリーズやクラッシュ=OSのフリーズや
クラッシュとなるケースが多いです。

OpenGL ESは、ビデオドライバの機能の中でも特に、Java・dalvik・
linuxによる様々な保護を飛び越えて直接ハードを操作できる機能の
ひとつです。そして2.0についてはまだ比較的新しい規格であるため
まだ「枯れて」おらず、テストスイートもあまり充実していないのか
ドライバ不具合が見つかりやすいようです。


--
Hiroaki GOTO as "GORRY" : 後藤 浩昭
EMAIL: gorr...@gmail.com

Kazuhiko Kobayashi

unread,
Feb 15, 2012, 2:17:06 AM2/15/12
to 日本Androidの会
その昔、Windows NTが出た頃はビデオドライバーも低い権限で動いていました。
その頃はネット越しで見ると正常動作しているのにコンソールの前に行くと
ビデオドライバーが落ちて操作不能になっており驚くという事が良くありました。
その後Windows NT4.0でDirect X実装のため特権レベルに移行したとたん、
カーネルごと落ちるようになりました。
そんなことをちょっと思い出しました。

思い返せばフリーズ報告があるのはAdreno205搭載機に集中しています。
コガラシ様のIS11SもAdreno205です。
もしかするとdirect bufferの不具合も、Adreno205が関係しているのかもしれません。
Adreno205がメモリーのどこかを壊しており、空きメモリーが少なくなると
重要な部分を壊す確率が高まるのかもしれません。
IS05など、ネットで検索するとフリーズが多数報告されていますが、
こう考えますとその説明が付くような気がします。

Tegra2を搭載した私のTF101は非常に安定しています。
これはnvidia製だからかもしれません。
餅は餅屋ということでしょうか。
> EMAIL: gorry...@gmail.com

Kazuhiko Kobayashi

unread,
Feb 19, 2012, 8:01:13 PM2/19/12
to 日本Androidの会
Adreno系GPUでのフリーズ問題が直ったと思います。
どうもこれを踏んでいた可能性が高いです。
http://www.archivum.info/android-d...@googlegroups.com/2010-09/01612/(android-developers)-Re-OpenGL-lockups-in-2.2.html
GPUの負荷が高い時にswapBufferが重なるとデッドロックするようです。
端末が落ちた時のログを見ると

98, status=0). CPU may be pegged. trying again.
W/SharedBufferStack( 2927): waitForCondition(LockCondition) timed out
(identity=

このようなログが大量に出ていたためググったところヒットしました。

テストには「クラウド・スマホ・レンタル」を利用させて頂きました。
利用させてくださった久納様に感謝いたします。

apkを置いておきます。
Xperia arc SO-01Cでpiron式巡音ルカが表示出来る事を確認しております。
http://chototsumoushinp.dip.jp/miku/download/AndroidSample_tinyar-116-rc2.apk
Reply all
Reply to author
Forward
0 new messages