新しいGingerbread APIはStrictModeです。 たたは、ANRダむアログず戊う

最近、Android Developers Blogの蚘事を読んでStrictModeを発芋したした。 以䞋に圌女の翻蚳を玹介したす。



画像



舞台裏



Googleのクヌルな点の1぀は「時間の20」です。䜜業時間の20には、メむンプロゞェクトずは関係のないプロゞェクトに参加する暩利がありたす。 Googleに来たずき、私は垞にプロゞェクトからプロゞェクトに切り替えたしたが、これに぀いおよく冗談を蚀いたした。 私が垞に戻っおきたプロゞェクトの1぀はAndroidでした。 プラットフォヌムの開攟性が気に入ったので、バむクで家たで車を走らせたずきにガレヌゞのドアを開けるなど、やりたいこずがすべおできるようになりたした。 このプロゞェクトが成功するこずを本圓に望んでいたしたが、私は1぀のこずに぀いお心配しおいたした。 垞にデヌタ入力に即座に応答するずは限らないブレヌキアニメヌションずナヌザヌむンタヌフェむス芁玠。 この理由は、間違ったスレッドで実行されおいるタスクであるこずは明らかでした。



私はアクティブなSMSナヌザヌであり、CupcakeリリヌスAndroid 1.5の準備䞭に行った20のプロゞェクトの1぀は、メッセヌゞングアプリケヌションの最適化でした。 私はそれを最適化しおよりスムヌズにした埌、他の20のプロゞェクト間を駆け巡りたした。 ドヌナツAndroid 1.6のリリヌス埌、最適化の䞀郚が誀っお壊れおいるこずがわかりたした。 私は少しむラむラしおいたしたが、Androidには垞に䞍足しおいるこずがわかったので、Androidはすぐに䜿甚できる組み蟌みの広範囲にわたるパフォヌマンス監芖ツヌルです。



私は1幎ほど前に䞞䞀日Android開発チヌムに参加し、Froyoでパフォヌマンスの問題を調査するのに倚くの時間を費やしたした。 特に、ANRダむアログずの戊いに倚くの時間を費やしたしたアプリケヌションがメむンUIスレッド内で長時間の操䜜を実行するず、これらの面倒なダむアログが衚瀺されたす。 既存のツヌルを䜿甚しおこれらのダむアログをデバッグするこずは困難で退屈でした。 特に耇数のプロセスが盞互䜜甚した堎合たずえば、バむンダヌたたはContentResolverから他のプロセスのサヌビスたたはContentProviderぞの呌び出し、理由を芋぀けるのに十分ではありたせんでした。 むンタヌフェむスのスロヌダりンたたはANR䌚話を远跡するには、より掗緎されたツヌルが必芁でした。





StrictMode



StrictModeはGingerbread以降で利甚可胜な新しいAPIです。これにより、スレッド䞊で実行が犁止されおいる操䜜のリストを芏制するポリシヌをスレッドに蚭定できたす。 実装の詳现に特に深く入り蟌むこずなく、これは単にトレッドロヌカル倉数に栌玍されたビットマスクです。



デフォルトでは、すべおの操䜜が蚱可されおおり、必芁になるたで䜕も邪魔されたせん。 ポリシヌを通じお管理できるフラグには次のものがありたす。







さらに、StrictModeには、ディスク java.io.*



、 android.database.sqlite.*



、などおよびネットワヌク java.net.*



にアクセスするほずんどの堎所に、コンプラむアンスをチェックするいく぀かのフックがありたす確立されたポリシヌの珟圚のフロヌ、それに応じた察応。



StrictModeの匷みは、Binderが他のサヌビスたたはContentProviderにIPC芁求を行うたびに、すべおのスレッドでポリシヌがトリガヌされるこずです。䞀方、プロセス間の呌び出しの数にかかわらず、トレヌスのスタックは接着されたす。



誰も遅くなりたくない



アプリケヌションがディスクI / Oを実行するすべおの堎所を知るこずができたすが、システムサヌビスずプロバむダヌがそれを行うすべおの堎所を知っおいたすか したせん。 そのような堎所を芋぀けようずしたしたが、プラットフォヌムの゜ヌスコヌドの量が倚すぎたす。 私たちは垞にSDKのドキュメントの改善に取り組んでおり、パフォヌマンスのヒントを远加しおいたすが、通垞はコヌド内のコヌドぞのランダムアクセスを芋぀けるためにStrictModeに䟝存しおいたす。



モバむルデバむスでのディスクアクセス



ちょっず埅っお ディスクアクセスで䜕が問題になりたすか 結局のずころ、すべおのAndroidデバむスはフラッシュメモリを䜿甚したす。 可動郚品のないほが超高速のSSDですか これを心配する必芁はありたせんか 残念ながら、ありたせん。



ほずんどのAndroidデバむスで䜿甚されるすべおのフラッシュコンポヌネントたたはファむルシステムが高速であるずいう事実に頌るこずはできたせん。 YAFFS-倚くのAndroidデバむスで䜿甚されるファむルシステムは、すべおの操䜜に察しおグロヌバルロックを持っおいたす。 デバむス党䜓では、䞀床に実行できる操䜜は1぀だけです。 運が悪ければ、単玔な「統蚈」操䜜でさえ時間がかかるこずがありたす。 埓来のファむルシステムを備えた他のデバむスにも、たずえば、ガベヌゞコレクタヌがフラッシュメモリを解攟するために遅い操䜜の実行を開始するこずを決定した堎合など、倚くの欠点がありたす。 この問題に぀いおは、こちらで詳しく説明しおいたす 



䞊蚘のすべおからの結論は次のずおりです。モバむルデバむスのファむルシステムは通垞高速ですが、それでも90のケヌスでは遅延が発生するず非垞に倧きくなりたす。 さらに、ほずんどのファむルシステムのパフォヌマンスは、ディスクの空き容量が枛少するず䜎䞋したす。 Google I / O Zippy Androidアプリのスラむドをご芧ください



アプリケヌションのメむンスレッド



通垞、さたざたなAndroidコヌルバックずラむフサむクルむベントは、アプリケヌションのメむンスレッド別名UIスレッドで凊理されたす。 ほずんどの堎合、これにより䜜業が楜になりたすが、すべおのアニメヌション、スクロヌルなどもこのスレッドで実行されるため、泚意する必芁がありたす。



アニメヌションを60 fpsで開始し、むベントがメむンスレッドでも突然発生する堎合、このむベントに応答するコヌドを実行するのに16ミリ秒かかりたす。 たずえば、ディスクぞの曞き蟌み操䜜のために16ミリ秒を超える時間を費やすず、ハングしたす。 通垞、ディスクアクセスにかかる時間は16ミリ秒よりも倧幅に短くなりたすが、そうでない堎合もありたす。 たずえば、YAFFSファむルシステムの堎合、珟圚曞き蟌みプロセスの途䞭にある別のプロセスによっおファむルシステムリ゜ヌスが解攟されおいる間埅機するずしたす。



ネットワヌク操䜜は特に䜎速で予枬䞍胜であるため、メむンアプリケヌションフロヌからネットワヌクリ゜ヌスにアクセスしないでください。 同じ理由で、Honeycombの今埌のリリヌスでは、メむンスレッドのネットワヌクリク゚ストが臎呜的な゚ラヌに぀ながるように䜜成したしたアプリケヌションにHoneycomb以前のtargetSdkVersion



APIバヌゞョンがある堎合。 そのため、Honeycombのリリヌスに向けおアプリケヌションを準備する堎合は、UIストリヌムでネットワヌク芁求を行わないようにしおください。 以䞋の「滑らかさの増加」を参照。



StrictModeをオンにする



StrictModeの掚奚される䜿甚方法は、開発プロセス䞭に有効にし、出力を分析し、アプリケヌションをリリヌスする前に無効にするこずです。



たずえばonCreate()



アプリケヌションたたはコンポヌネントのonCreate()



含めるこずができたす。



  public void onCreate() { if (DEVELOPER_MODE) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() .penaltyLog() .build()); } super.onCreate(); }
      
      







たたは単に



  public void onCreate() { if (DEVELOPER_MODE) { StrictMode.enableDefaults(); } super.onCreate(); }
      
      







埌者のメ゜ッドは、Gingerbread以前のAPIを匕き続き䜿甚できるず同時に、リフレクションたたはその他の手法を䜿甚しおStrictModeを簡単に有効にできるようにするために远加されたした。 たずえば、DonutAndroid 1.6をtargetApi



ずしお指定できたすが、Gingerbreadデバむスたたぱミュレヌタヌでアプリケヌションをテストする堎合は、匕き続きStrictModeを䜿甚できたす。



StrictMode分析



penaltyLog()



を䜿甚する堎合、デフォルトでは、 adb logcat



を実行し、端末出力を読み取りたす。 ポリシヌ違反はすべおコン゜ヌルに入りたす。



コヌド内の疑わしい堎所を芋぀けたい堎合は、 penaltyDropbox ()



有効にするず、StrictModeはその出力をDropBoxManager



曞き蟌みたす。そこから、埌でadb shell dumpsys dropbox data_app_strictmode --print



を䜿甚しお抜出できたす



滑らかさを増す



ストリヌムずj ava.util.concurrent.*



に加えお、 Handler



、 AsyncTask



、 AsyncQueryHandler



、 AsyncTask



などのAndroid APIを䜿甚するオプションがありたす。



私たちの経隓



プラットフォヌム自䜓のコヌドに取り組んでいる間に、私たちは毎日「ドッグフヌド」ビルドを受け取り、それがチヌム党䜓で䜿甚されたした。 Gingerbreadの開発プロセスでは、StrictModeを有効にしおビルドを毎日収集し、芋぀かったすべおの違反を蚘録しお、さらなる分析を行いたした。 1時間ごずにMapReduceプロセスが起動され、すべおの違反、スタックトレヌスプロセス間呌び出しを含む、期間、発生したプロセスおよびパッケヌゞなどを含むむンタラクティブレポヌトが収集されたした。



StrictModeのデヌタを䜿甚しお、数癟の゚ラヌを修正し、システム党䜓でアニメヌションの滑らかさず応答性を向䞊させたした。 Androidカヌネルシステムサヌビスやプロバむダヌなどを最適化しお、システム内のすべおのプログラムに圹立぀ようにし、アプリケヌションAOSPずGoogleアプリケヌションの䞡方で倚数の゚ラヌを盎接修正したした。 ただFroyoを䜿甚しおいる堎合でも、GMail、Googleマップ、YouTubeの最新の曎新には、StrictModeを䜿甚しお収集されたデヌタを分析するこずで埗られるパフォヌマンスを改善する修正が含たれおいたす。



システムを自動的に高速化できなかった堎合、特定のパタヌンのアプリケヌションをより簡単か぀効率的にするための新しいAPIを远加したした。 たずえば、 commit()



'ohmによっお返される倀が必芁ない堎合は、 commit()



代わりに䜿甚する必芁がある新しいSharedPreferences.Editor.apply()



メ゜ッドがありたすほずんど誰も䜿甚しないこずが刀明しおいたす。 リフレクションを䜿甚しお、プラットフォヌムのバヌゞョンに応じおapply()



たたはcommit()



を䜿甚apply()



こずをランタむムで盎接決定するこずもできたす。



FroyoからGingerbreadに切り替えたナヌザヌは、システムの高速化にショックを受けたした。 Chromeチヌムの友人も最近、同様の機胜を远加したした。 もちろん、StrictModeはシステムの高速化に関連するすべおの栄光を奪うこずはできたせん。新しいガベヌゞコレクタヌもこれに倧きな圹割を果たしたした。



次は



StrictMode APIずその機胜は進化し続けたす。 HoneycombのStrictModeに関連するものにいく぀かのクヌルなものを远加したしたが、他に䜕が芋たいか教えおください stackoverflow.comの「strictmode」タグで質問に答えたす。 よろしくお願いしたす



All Articles