Travisのandroid.componentsで毎回100秒かかっていたのを0.01秒にできた話
もともとはこちらのMediumのエントリで紹介されていた高速化を試そうと思ったのがきっかけで、色々試行錯誤して結構高速化できたのでその経緯を残しておきます。
まずは紹介された方法をためした
Mediumのエントリの手法は意訳すると
sdkディレクトリをまとめてcacheしちゃえばacceptが高速化されて速くなるぜ!
というもの。で、その通り更新してみると...以下の問題が発生した。
- キャッシュを作る時に400秒くらいかかってる。(デフォルトの180秒タイムアウトに引っかるので
cache.timeout
に600秒セットした) - 作ったキャッシュがでかい。2GB超えてる。
- キャッシュを再展開する時に400秒くらいかかってる。
この時点で「あれ?遅くなってね?」と思ったがsdkディレクトリをまるごとキャッシュするということが辛い様子。一方でそもそものandroid.components
でかかっている時間がわからなかったので調べてみた。
android.components
でかかる時間
単純に修正前に成功していたTravisビルドのログにあるInstalling Android dependencies
に出てくる秒数をたしたところ約100秒だった。
(秒数はそれぞれのandroid.components
設定によって変わるのでご参考まで)
ただし、Installing Android dependencies
はキャッシュの再展開をしていると思われるSetting up build cache
よりも前に実行されるのでどんなに頑張ってもキャッシュを効かせることができない。
sdkmanagerで自前acceptを行う
前述のMediumのエントリの中で触れられているが、もともとlicenseのaccept処理はsdkmanager
を使うことでコマンドライン実行でき、それをinstall
で行い、結果をキャッシュしてしまえ!というもの。
ということは、すでにTravisのOSイメージにインストールされているsdkmanager
を使いつつ、accept結果をキャッシュできればよさそう、ということでトライ。
こんな感じ。
echo y | $ANDROID_HOME/tools/bin/sdkmanager 'platform-tools' > /dev/null
これを使ってandroid.components
でacceptしていたものと同じものをsdkmanager
で処理するシェルスクリプトを作り実行。一旦キャッシュなし。
約200秒。
うーん、何が違うのか分からないけどandroid.components
よりも遅い。でも初回だけなら我慢できそうな気がするので次のステップへ。
accpet結果をキャッシュする
sdkmanager
スクリプトを使いつつ、キャッシュを効かせるためにymlに以下を追加。
cache:
directories:
# Android SDK licenses
- ${ANDROID_HOME}/licenses/
そして、sdkmanager
スクリプトに${ANDROID_HOME}/licenses/
が存在していたらaccept処理をスキップするよう分岐も追加。
一度ビルドをしてキャッシュさせて、2回目...
0.01秒。(acceptスキップしたからそりゃ早いよね)
その後のgradleタスクでもエラーはなく、念のため吐き出されたapkは実機に配信してもちゃんと使えています。
ビルド全体ではもともと11分~12分かかっていた処理(Travis build stagesも使っているのでandroid.components
が2回走ってた)ものが8〜9分で完了するようになりました。
まとめ
以下のことを行うことでlicenceのaccept処理にキャッシュを効かせることができ、毎回100秒かかっていたところを0.01秒にできました。
-
android.components
を消して、sdkmanager
を使ってacceptするスクリプトをinstall
で実行する -
${ANDROID_HOME}/licenses/
をキャッシュする
sdkmanager
スクリプトは参考までにこちらのGistにアップしておきました。。
Author And Source
この問題について(Travisのandroid.componentsで毎回100秒かかっていたのを0.01秒にできた話), 我々は、より多くの情報をここで見つけました https://qiita.com/gki/items/702baacbe005ed26402d著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .