初回起動プログラムのホワイトスクリーン時間が長すぎるという問題を解決する(Android Studio Instant Run向け)


郭霖大神から:
Android Studioに新しく追加されたInstant Run機能により、開発の効率が大幅に向上します(詳細は前のブログを参照).
問題の再現
私が初めてこの問題を発見したのはAndroid Studio 2.0をアップグレードした後で、当時Android Studioのバージョンは1.5から2.0に直接アップグレードされ、このような大きなバージョンの飛躍的な説明の変更は比較的大きいに違いない.
この時点から、新しい携帯電話にプログラムをインストールして初めて起動するたびに、次の図のように長い白画面時間がかかります.
上図の再生速度はリアルタイム速度で、加速や減速は行われていません.これは空のプロジェクトで、中にはほとんど機能がなく、初めて白画面を起動して5秒以上も続いたことがわかります.初めて起動してから長い間白画面になったとはいえ、ユーザーにこのような体験を与えるのは、私たちのプログラムがアマチュアすぎるように見えるので、何とかしなければなりません.
原因分析
最初はこの原因をAndroid Studio 2.0のバグにまとめましたが、結局一度にこんなに大きなアップグレードをしたので、ちょっとバグも普通でした.しかし、現在の最新のAndroid Studio 2.2バージョンでは、この問題は依然として存在し、Googleがそれを修復する意味が全くないようで、これはあまりよくありません.
それから私は実験を始めました.この長い白画面の問題はAndroid Studioのバージョンとは関係なく、私たちが使っているgradleプラグインのバージョンと関係があることがわかりました.開けてgradleファイルを確認します.コードは次のとおりです.
<span style="font-size:14px;">buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
    }
}</span>

ここで私が使っているgradleプラグインのバージョンは2.1.2で、このバージョンでは長時間の白画面の問題が発生します.
しかし、gradleプラグインのバージョン番号を2.0.0に下げてプログラムを実行すると、このようなヒントがポップアップされます.
ヒント2.0.0バージョンのgradleプラグインはInstant Runをサポートしていないので、2.1.2にアップグレードさせてください.しかし同時に、長い間白い画面の問題がなくなったことに気づきます.
しかし、ここでは、2.0.0バージョンのgradleプラグインがInstant Runをサポートしていないのではなく、2.1バージョンのAndroid Studioを使用しているため、2.0.0バージョンのgradleプラグインとInstnat Run機能の面で互換性がありません.2.0バージョンのAndroid Studioを使用している場合は、2.0.0バージョンのgradleプラグインもInstant Runをサポートしていることがわかります.
興味があればgradleプラグインのバージョン番号をさらに低くすることができます.例えば、1.5.0、1.3.0などです.この2つのプラグインのバージョンはInstant Run機能を完全にサポートしていません.成長時間の白い画面の問題はありません.
これで私たちは基本的に問題の原因を特定して、Instant Run機能をサポートする時に長い間白い画面の情況が現れて、Instant Run機能をサポートしない時すべて正常で、元凶はやはりInstant Runですね.
問題を解決する
しかし、Instant RunはAndroid Studio 2.0で重ポンドで発売された機能で、このような深刻なバグがあれば、誰が使うことができますか?Googleは廃機能を発売したのではないでしょうか.
もちろんそうではありません.この問題に遭遇して驚いてInstant Runを使う勇気がなければ、Instant Runの機能を本当に理解していないことを説明するしかありません.Instant Runコードを迅速に導入できるようにするには、APKにサーバを構築してAndroid Studioと通信したり、コードの違いの比較や置き換えをしたりするなど、非常に複雑な論理が背後にあります.ここでは、Instant Runの作業原理図を貼って体験してみましょう.
この図は複雑で、読めなくても大丈夫です.私も読めないので、少なくともInstant Runの背後で処理されている仕事が非常に重いことを直感的に感じることができます.
それなら、なぜ初めて起動すると白い画面がこんなに長くなるのか理解しておくべきだと思います.Instant Runが正常に動作するために、私たちのプログラムは非常に多くの初期化作業をしなければならないからです.今回の長時間のホワイトスクリーンは、後続の開発効率の急増であり、この取引はかなり価値があると思います.
ある友达は疑問を抱くかもしれませんが、私たちが理解していると言って何の役に立ちますか?ユーザーはInstant Runとは何かを理解することはできません.このような白い画面はユーザーの体験を深刻に損なうことになります.
でもInstant Runは何に使うのか考えたことはありますか?開発効率を向上させるために使われています.間違いなく、開発効率です.つまり、開発段階でしかInstant Runというものはなく、本格的な製品ではInstant Runは全く存在しません!
夢の中の人を一言で目覚めさせたのではないでしょうか.実ははっきり言って、私达はこの长い时间の白いスクリーンがユーザーの体験を伤つけることができることを心配して纯粋に杞憂で、Googleはとっくに私达にすべて考虑したことがあって、release版のプログラムはこのような现象が现れません.信じないなら今サインしたAPKバッグを打って、携帯電話に入れてみましょう.以下のようにします.
                                              
これはさっきと同じプログラムで、私は何のコードも修正していません.releaseパッケージを打っただけで、今は長い間白画面になっていません.
さらに最適化
もしあなたの観察力が非常に鋭ければ、実は私たちのプログラムはまだ白い画面の段階を経験していることに気づくはずですが、非常に短くて、瞬間的にスキップしました.
これはInstant Runとは関係ありません.これは、起動時にプログラムが基本的な初期化操作を行い、すべてのプログラムがこのプロセスを経験するためです.
このホワイトスクリーンは時間が短く、あまり影響はありませんが、コードでさらに最適化することができます.スタイルを変更します.xmlのトピックに関連するコードは、次のようになります.
<span style="font-size:14px;"><style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ......
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowNoTitle">true</item>
</style></span>

このうち、windowIsTranslucentとwindowNoTitleの2つの属性をtrueに設定すると、プログラムが初期化されたときにウィンドウが透明になり、初期化が終わった後にプログラムのメインインタフェースが表示され、白画面インタフェースが全く見えなくなります.下図のように:
                                               
この方式を用いると,ホワイトスクリーンインタフェースは見えなくなったが,初期化の過程でウィンドウが透明であるため,ユーザにプログラム起動の応答速度がやや遅いと感じさせるが,この差はいずれもミリ秒級であり,これ以上心配する必要はない.