2014年03月18日

Android 安定化

Android の安定化に関する記事を書きます。

iOS や Windows に比べてまだまだ不安定感のある Android は需要が多いためか「高速化」「安定化」に関する内容の記事を多く見かけます。

さまざまな人がツールを開発したり安定化方法を試してみたりした結果、本当に効果のある方法と、良くなったような気がするプラセボ(偽薬)効果であるものが解ってきています。以下に簡潔にまとめてみたいと思います。

・タスクキラーにてアプリを終了させる→【☓プラセボ効果】【☓不安定化する】
注:ただし、2.2などの古いAndroidや暴走している通常アプリがある場合は効果あり

・キャッシュクリア→【☓プラセボ効果】
注:アプリのアップデート時にアプリまたはOS側にバグがあった場合には効果あり
注:SSDの性質上、ディスク残りが極端に少なくなっている場合には効果あり

・開発者オプションのバックグラウンドプロセスの上限を制限する→【○効果あり】
注:ただしバックグラウンドプロセスを利用するアプリが起動できなくなります

・開発者オプションのアニメーションを無効化→【△効果あり】
注:アニメーションがスキップされる分高速化します。ただし、それだけです

・ウィジェットやアイコンを置かない、インストールするアプリを少なくする→【○効果あり】
注:実際に起動しているかは関係なくアプリの絶対数に比例して速度が落ちる。OSまたはシステム関連のバグと推測。

・再起動→【△効果あり】
注:原因は間違いなくアプリかOSのバグです

・!!root必要!! Firewallを利用する(ただしカーネルで制御するもの)→【◎絶大効果あり】
注:AndroidFirewall(JTSCHOHL社)で確認
注:無駄な広告通信、開発者用のデバグ情報を遮断するためと推測


・!!root必要!! 軽量な entropy generator を利用する→【☓プラセボ効果】
注:通常の処理では使用されていないため、通常の利用では効果なし

・!!root必要!! 先読みキャッシュ(read_ahead)の大きさを変更→【△効果あり】
注:ただし、デフォルトの値が最適でなかった場合のみ

・!!root必要!! cpu,gpuのクロック調整→【◎絶大効果あり】
注:高クロックは動作速度向上、低クロックはバッテリー性能を向上。ハードの変更なので当たり前ですけれど

・!!root必要!! build.propの変更→【△ほとんどプラセボ効果】
- 一般的な端末では無意味なものの例
wifi.supplicant_scan_interval
net.tcp.buffersize.*
persist.sys.purgeable_assets=1
ro.max.fling_velocity/ro.min.fling_velocity
ro.kernel.android.checkjni=0
ro.kernel.checkjni=0
persist.sys.use_dithering=0
dalvik.vm.dexopt-flags

・!!root必要!! greenify を利用する→【◎絶大効果あり】
注:インストールアプリをハイバネーションさせるアプリ



posted by CatappWorks at 22:17| Comment(0) | Android

2014年02月13日

Androidアプリの数

Androidアプリをインストールすればする程動作が遅くなってしまうのですが、原因を調査してみました。

もちろんアプリを増やすと、バックグラウンド動作が増加して負荷が増加するわけですが、バックグラウンド動作のないアプリをインストールして、アプリの「数」が動作に影響がないのか試してみました。(4.1.1JB)

結果、数百のオーダーでアプリをインストールすると、バックグラウンド動作のありなしに関わらず動作の低下を招くようです。

はっきりとした原因はわからないのですが、ストアアプリがインストールアプリのリスト探索を定期的にしているようで、この処理が通常の動作に影響しているように感じます。

iOSアプリの場合は、全くと言って良いほど、アプリの「数」による影響はありません。

もし、ストアアプリが原因であるなら今後のアップデートに期待したいですね。

posted by CatappWorks at 12:24| Comment(0) | Android

2013年12月20日

Android 高速化に関して

Android を利用されている方の多くは、高速化に関してかなり関心を持っているように思いますが、
ネット上の情報には、Android の高速化に関して正しくないと思われる記事を見かけます。

それら間違いの多くは、パソコンの高速化と同じ原理が、スマホ(Android)にも当てはまるという考えから来ているのかもしれません。

*** 1, タスクキラーでメモリを開放すれば高速化 ***

パソコンでは、物理メモリが圧迫されるとメモリの一部を内蔵ディスクなどにスワップする仕組みがあり、アプリケーションを実行するために十分なメモリを確保できれば、高速化できるというものがあります。

しかし、Androidでは事情が異なります。

一般的なAndroidにはスワップがありません。そしてメモリが足りない場合は動作しません。また、空きメモリがある場合は無駄だという設計思想により、利用しなくても取り敢えずメモリを確保しようとします。どんなに十分なメモリがあっても、常に80%程度使用中になると思います。単純に空きメモリを増やす行為はあまり意味がありません。

それでは、何が問題なのでしょうか。
メモリが足りずにパフォーマンス低下を招く主な理由は以下のものです。

アプリには「ライフサイクル」という概念があり、「停止」→「初期化処理」→「動作中」→「終了処理」→「停止」を繰り返します。もし、空きメモリが少なくなると、OSが利用しなくなったバックグラウンドのアプリに「終了処理」の命令を出して終了させようとします。

しかし、「終了処理」の作りが悪く重い処理であった場合はこの処理が原因でパフォーマンスの低下を引き起こします。したがって、Androidには明示的にアプリを終了させない設計思想があるため、どんなにメモリが多い機種であっても、「空きメモリが少ない」状態がいずれ訪れ、「終了処理」のためのパフォーマンス低下を引き起こします。

高速化のポイントは「終了処理」をいかに発生させないかにあります。

そうです。いわゆるタスクキラーアプリを利用すると「終了処理」が発生しません。「動作中」から一気に「停止」へ強制的に移ります。

これが、タスクキラー高速化の主な理由です。実は「メモリの空き」はあまり関係ありません。

※タスクキラーの副作用として、強制的な不正終了によるアプリ管理のデータへのダメージ、整合性を崩すなどの問題があります

*** 2, キャッシュを削除すると高速化する ***

良く見かける記事は、「利用していないデータや探索キーがあるため、無駄を削除すれば高速化する」というものですが、人が認識できる程度の違いが出るとは思えません。むしろ高速化のための仕組みのキャッシュを削除することが原因のパフォーマンス低下の弊害が予想できます。

しかしながら、高速化できるであろう理由は2つあります。内蔵ストレージ(SSD)の性質上、空き容量が著しく少なくなると、書き込み速度が極端に低下します。

たとえば、空き容量が10%程度の状態であり、キャッシュ削除により20%程度まで回復できたとすれば速度向上が確認できると思います。

もうひとつの理由は、アップデートなどが理由で、キャッシュの整合性が崩れている場合です。誤動作によりパフォーマンスが低下している状態であれば高速化が見込めます。

筆者の経験では、後者の理由により高速化した(正常動作した)ことが多いと感じています。

*** まとめ ***

高速化というよりも、正常に動作させる工夫という方が正しいのかもしれませんね。

posted by CatappWorks at 11:28| Comment(0) | Android