見えないところは塗りつぶすな - 不要なオーバードロー削除で高速化

「アプリを作ったけど なぜか表示が遅い」

そのようなレンダリング時間の改善するための方法のひとつとして GPUオーバードローツールを利用しましょう.

「オーバードロー」とは?

アプリがシステムに他の何かの上に描画することを「オーバードロー」といいます.「GPUオーバードロー」ツールを使うとそのピクセルが何回再描画されたか画面上に色をかぶせて表示させることができます.

GPUオーバードローツールを有効化する

以下ので順で有効化します.

1.「設定」
2.「開発者向けオプション」
3.「GPUオーバードローをデバッグ」
4.「オーバードロー領域の表示」

20160221-134639

画面の色が変化したと思います.

20160221-134651

あなたのアプリを開いてレイアウトの改善を行ってみましょう.

Screenshot_2016-02-01-11-08-40

変化した色の違いは何を表しているのか?

画面上のピクセルに対してオーバードローを行った回数を表しています.

オリジナル色
– オーバードローなし
– そのピクセルは一度だけ塗りつぶされた

- 1回 オーバードロー
- そのピクセルは2回塗りつぶされた

...
ピンク
...

...

Debug_GPU_Overdraw_Walkthrough___Android_Developers

どのようにオーバードローを改善するか?

たとえば, RelativeLayout のbackground color を削除して テーマのみにbackground color を描画させる.

<RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#FFFFFF">

<RelativeLayout
     android:layout_width="match_parent"
     android:layout_height="match_parent">

これにより, オリジナル色と青色のオーバードローが少しに改善させることができました. いくつかのオーバードローは避けることができません.

オーバードローがすべて背景色に関連しているわけではありません. 非常に複雑なレイアウト階層構造の多すぎるビューの中にたくさん存在すると思われます。

オーバードローが発生している理由は, Hierarchy Viewer や GL Tracer などのツールで確認することができます.

Hierarchy_Viewer_Walkthrough___Android_Developers

Hierarchy Viewer Walkthrough | Android Developers

Tracer for OpenGL ES | Android Developers

まずは, 最大で2回のオーバードロー(緑)を目指してみましょう.

Debug_GPU_Overdraw_Walkthrough___Android_Developers 2

Optimizing Layouts in Android - Reducing Overdraw - Riggaroo

Debug GPU Overdraw Walkthrough | Android Developers


【AndroidStudio 不要】サンプルアプリは「dryrun」で試してすぐ捨てよう

参考にしたいサンプルアプリをGiHubで見つけて試してみる場合は以下のような手順

1. サンプルアプリのリポジトリを探す.
2. zip をダウンロードする.
3. それを展開する.
4. AndroidStudio などIDEを開く.
5. インポートする.
6. Gradle が sync する.
7. プロジェクトを run.
8. 実行するデバイスを選択する.
9. 実際に動かしてみる.
10. zipファイルとプロジェクトフォルダを捨てる.

となりますが,「dryrun」をインストールすると

$ gem install dryrun
...
$ dryrun -h
Usage: dryrun GITHUB_URL [OPTIONS]

Options
    -m, --module MODULE_NAME         Custom module to run
    -p, --path PATH                  Custom path to android project
    -h, --help                       Displays help
    -v, --version                    Displays version

dryrun: Try the demo project of any Android Library

リポジトリのURLのみでターミナルからの一行で起動までが可能になります. AndroidStudioなどIDEは起動しなくてよいです.

プロジェクトディレクトリは残りません.

$ dryrun https://github.com/cesarferreira/android-helloworld

usage_v2

cesarferreira_dryrun__Try_the_demo_project_of_any_Android_Library

アプリ起動後, 動かしてみて, いらなくなったらターミナル出力の最終行に表示されているadbコマンドでアンインストール.

...
> If you want to remove the app you just installed, execute:
adb uninstall github.cesarferreira.helloworld

あなたのマシンには試したテストアプリの不要なプロジェクトディレクトリがたくさんありませんか?

man は長すぎるので「tldr」


Android Studio「Instant Run」の適用範囲や条件

実際使ってみると, 編集したコードが反映されたりされなかったり.

でも確かに高速なときもある.

効果的に高速で動作してくれるためのコードの編集範囲・条件は何なのか.

Instant_Run_-_Android_Tools_Project_Site

Instant Run - Android Tools Project Site

分かりづらいので表に.

instantrun

なんだか...

it seems that this feature is not perfectly stable yet : sometimes the modified code is marked as “pushed” whereas the modification is not really applied on the emulator. It is currently stable when it comes to hot resources or xml file swapping. It is really a great improvement, as we generally have to perform numerous incremental builds when we are tuning our xml files.

Reduce your Android build duration | OCTO talks !

みんなも上手に「Instant Run」を使って高速にアプリを開発しよう!!