Androidアプリケーションの開発に関するGoogleのベストプラクティス

この記事では、Googleの最新のベストプラクティスについて簡単に説明します。 読者が特定の機能が開発者に与えるものを正確に理解できるように、最も重要なポイントを強調しようとしました。 どこかで繰り返しても驚かないでください。 彼は、 www.youtube.com / channel / UCVHFbqXqoYvEWM1Ddxl0QDgでのビデオ視聴の過程で自分自身から追加されたものを調べました。

また、各アイテムには、特定のベストプラクティスを詳しく知るために必要なすべてのリンクが含まれています。

ベストプラクティス。 UI


1.ハードウェアアクセラレーションを使用します。 UIのスムーズさ、アニメーションの予備レンダリングによるアニメーション、およびこれらのレンダリングのメモリへの保存を改善できます(動的な定数レンダリングと再描画の代わりに)

2.カスタムビューまたはアニメーション(透明度など)の場合、ハードウェアアクセラレーションを使用することをお勧めします。 例:

 View.setLayerType(View.LAYER_TYPE_HARDWARE、null);
 ObjectAnimator animator = ObjectAnimator.ofFloat(view、 "rotationY"、180);
 animator.addListener(新しいAnimatorListenerAdapter(){
     @Override
     public void onAnimationEnd(アニメーションアニメーション){
         view.setLayerType(View.LAYER_TYPE_NONE、null);
     }
 });
 animator.start();


3.カスタムビューで、メソッドがhasOverlappingRenderingメソッドをオーバーライドしてfalseを返す場合、ビューは他のアルファを指定できませんが、パフォーマンスは2倍になります。

リンク: www.youtube.com/watch?v=wIy8g8yNhNk&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE&index=9
このリンクの詳細については、 developer.android.com / guide / topics / graphics / hardware-accel.html

4. onDrawでは、オブジェクト(ペイントなど)を作成することはお勧めしません。 これらのオブジェクトは静的にすることができます-これはメモリの節約+予備作成+ gcの定数呼び出しの欠如です。
リンク: www.youtube.com/watch?v=HAK5acHQ53E&index=10&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE

5.ツール:厳密モード。 このツールは、デバイスの開発者の設定で構成されます。 UIの潜在的なボトルネックをすべてキャッチできます(何かが遅くなり、UIがブロックされている場合-ThreadPolicy)。 また、メモリリーク(VMPolicy)をキャッチすることもできます。 適切なクラス-developer.android.com/reference/android/os/StrictMode.htmlを使用して、アプリケーションのモードを構成できます。

6.カスタムビューを作成する場合。
View.invalidate()-アイテムを再描画します。 これは悪です。 何かが変更された場合は、ビュー全体ではなく、特定のRect(ユーザーに表示される場合)を再描画する必要があります。

描きすぎないでください。 目に見えないものは、描画しないでください。 控えめだが、しばしば無視されている。 Canvas.clipRect()が役立ちます。 また、レイヤーが表示されていないことをすばやく判断するために-Canvas.quickReject(...)

別のCPUおよびGPUのために過負荷にしないでください。

リンク:https://www.youtube.com/watch?V = zK2i7ivzK7M&list = PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE&index = 12

7.ビットマップ。 BitmapFactory.Optionsを使用して事前に圧縮された画像を読み込むことをお勧めします
developer.android.com/training/displaying-bitmaps/load-bitmap.html

8.ビットマップ。 画像(jpeg、png)からビットマップを作成する場合、デフォルトの形式はARGB_8888(ピクセルあたり32ビット)です。 メモリの問題が重大な場合は、他の形式(RGB_565-16ビットなど)を使用できます。 このパラメーターの設定は、BitmapOptionsを介して行われます。 もちろん、変換はパフォーマンスに影響します。

リンク: www.youtube.com/watch?v=1WqcEHXRWpM&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE&index=14

9. www.youtube.com/watch?v=2TUvmlGoDrw&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE&index=15-さまざまな画像形式
新しいGoogle形式(同じ品質、小さいサイズ) -developers.google.com/speed/webp/?csw=1

10. BitmapOptionsでスケーリングして、高解像度画像をダウンロードするときにメモリを節約する
www.youtube.com/watch?v=HY9aaXHx8yA&index=16&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE
developer.android.com/training/displaying-bitmaps/load-bitmap.html#load-bitmap

11.オーバードロー。 GPUを強制的にアイドル状態にします(ねじれた要素を描画します)。 オーバードローを定義するには、DeveloperOptionsでShow GPU Overdrawフラグを有効にする必要があります。 ViewHierarchyツールも役立ちます。

リンク: www.youtube.com/watch?v=T52v50r-JfE&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE&index=22

12. TraceViewは、レンダリングの正確さを判断するのにも適しています。 すべてのレンダリングは16ミリ秒(60フレーム/秒)に収まる必要があります。

リンク: www.youtube.com/watch?v=HXQhu6qfTVU&index=21&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE

13. VSYNC。 これは何ですか。
リフレッシュレート(60 Hz)は、一定のスクリーンリフレッシュレートです。 フレームレート-1秒あたりのフレームリフレッシュレート。 GPUの測定単位。

正しく表示するには、両方の速度を同期する必要があります。 この問題を解決するには、ダブルバッファリングを使用します。 GPUから、画像はバックバッファーに移動してからフレームバッファーに移動し、そこから画面に移動します。 バックバッファーとフレームバッファーの間はVSYNCで、バックバッファーからのデータが画面のリフレッシュレートと同期してフレームバッファーに入るようにします。 これにより、画面上で発生する可能性のある衝突がなくなります。

uiがスムーズになるように、GPUの速度(フレームレート)は画面のリフレッシュレート(リフレッシュレート)よりも高くする必要があります。
www.youtube.com/watch?v=1iaHxmfZGGc&index=23&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE

14.ツール-GPUレンダリングのプロファイル
DeveloperOptionsで接続できます。 アプリケーションのグラフに興味があります。 ナビゲーションバーと通知バーもあります。 グラフ自体は、フレームの描画に必要な時間のコレクションです。 グラフは、緑色の垂直線-16ms(画面のリフレッシュレート)を超えてはなりません。

グラフの構成は、以下のビデオで詳しく説明されています。 すべてが明確です:
www.youtube.com/watch?v=VzYkVL1n4M8&index=24&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE

15.ロシア語のCPUおよびGPUの動作は、 www.youtube.com / watch?v = zVK6TKSx1lUfeature = ivsrc_vid = VzYkVL1n4M8annotation_id = annotation_3064896115に詳しく説明されています。
ゲームにとって重要)

16. 60 fpsに準拠する必要がある理由-www.youtube.com/watch?v=CaMTIgxCSqU&index=25&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE

17. Android UIとGPU
GPUは、ポリゴン、テクスチャのラスタライズに必要です。 CPUはGPUに必要なグラフィック要素を提供し、OpenGLを使用してこれらの要素はポリゴンとテクスチャに変換され、GPUに保存されます(明確にする必要がありますか?)。 その他のGPU最適化:画面全体だけでなく、可変部分の描画、要素のポリゴンへの結合など:
www.youtube.com/watch?v=WH9AFhgwmDw&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE&index=26

18. DevOpsでGPUビューの更新を表示-どの要素が無効化されているかを示します()

ベストプラクティス。 コレクション


1.デフォルトでは、コレクションのすべての要素を反復処理するイテレータをお勧めします。
しかし、危機的な状況では、最速の検索方法を選択するという疑問が生じます。 最良のインジケータは、インデックス検索を使用したArrayListに属します。
リンク: developer.android.com/training/articles/perf-tips.html#Loops、www.youtube.com/watch? v=MZOf3pOAM6A&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE&index=6

ベストプラクティス。 同期の方法。 省エネ


1. JobScheduler + github.com/evant/JobSchedulerCompat (バージョン<21の場合)。 バックグラウンド操作(特にネットワークで動作)のキューを形成し、効果的なバッテリー節約のためにそれらの実行を均等に編成するツール(無線は短時間アクティブおよびスタンバイモードになります)。 タスクについては、いつ、どの頻度で、どの接続で、などの条件を設定します。 それらを開始する必要があります。

2. SyncAdapter。 古いソリューション。 多くのコード+ネイティブContentProvider。

3. GCM。 JobSchedulerの代わりとして-developers.google.com/cloud-messaging/network-manager。 定期的にサービスをポーリングするのではなく、GSMからサービス内の何かの変更に関するメッセージを受信することで同期できます。実際、クライアントも更新する必要があります。 さらに、GSMメッセージのみがディープスリープモード(Mバージョン)でデバイスに到達します。

4. Firebase Offline。 オフライン同期。

5. AlarmManager。 2つのタイプの開始/再試行時間を設定します:不正確(時間は他のアプリケーションの開始時間と相関してバッテリーを節約します、推奨)、正確(正確な時間、推奨されません)

ベストプラクティス。 バッテリー


1.アプリケーションのバッテリーを追跡するには、次を使用できます。
-アプリケーション設定
-バッテリー履歴(https://github.com/google/battery-historian)

バッテリーを節約するために、定期的な要求を行う必要がある場合は、それをお勧めします-JobScheduler
バッテリーはどこへ行くのですか-research.microsoft.com/en-us/people/mzh/eurosys-2012.pdf良い研究:
www.youtube.com/watch?v=9i1_PnPpd3g&index=29&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE

ベストプラクティス。 記憶


1.オブジェクトプール( www.youtube.com/watch?v=bSOREVMEFnM&index=5&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE )。 重いオブジェクト(ビットマップなど)に割り当てられたメモリを独立して制御するため。 GCが動作するタイミング、つまりアプリケーションの速度と滑らかさを制御するために必要です。
可能な解決策:LRUCache、プール(https://developer.android.com/reference/android/support/v4/util/Pools.html)、FlatBuffers(https://google.imtqy.com/flatbuffers/)

2.通常のLRUCacheで十分だと思います

ベストプラクティス。 Gc


1. DalvikとARTの比較-source.android.com/devices/tech/dalvik
例として、ARTはGCの並列化のおかげでGCのパフォーマンスを改善しました。
www.youtube.com/watch?v=pzfzz50W5Uo&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE&index=34

Google Play Services 7.5


1.クラウドメッセージング。 原則としてJobSchedulerを繰り返す特定のトピック、NetworkManagerを含むメッセージの送信
developers.google.com/cloud-messaging

2.アプリの招待。 友人からの招待
developers.google.com/app-invites

3.パスワードのスマートロック。 ユーザーが自分のアカウントでモバイルアカウントを使用しており、たとえば、ブラウザーからアプリケーションにアクセスしてパスワードを保存した場合、アプリケーションは自動的に認証されます: developers.google.com/identity/smartlock-passwords/android

これらの技術革新とその他については、ここ-developers.google.com/app-invites

音声対話


音声コマンドでアプリケーションを管理します。 コースではMバージョンのみ。

io2015codelabs.appspot.com/codelabs/voice-interaction#1
developers.google.com/voice-actions

新しくて面白い


1. Fingerprint API(指による)および資格情報の確認(暗号化)
www.youtube.com/watch?v=VOn7VrTRlA4&index=11&list=PLOU2XLYxmsIJDPXCTt5TLDu67271PruEk
2. [設定]のMバージョンでは、アプリケーションがトラフィックをどれだけ消費しているかなどを確認できます。
3.将来のデータバインディング(xmlでリストと日付を直接設定)
4. RecyclerView ItemTouchHelper-スワイプして閉じる、ドラッグ&ドロップ
5. setAlphaハードウェアが自動的に接続するとき

ただ面白い


1.外部ストレージ-ハードコードなし! タイプ「never use / sdcard /」の文字列のファイルへのパスを指定する場合(つまり、ファイルへのパスを手動で設定しないでください)。 これには、「Environment.getExternalStorageDirectory()。GetAbsolutePath()」などの特別なメソッドがあります。これは、常にファイルへの正しいパスを返しますが、手動タスクでは保証されません。

Androidスタジオ


1. SVG形式をサポート
2.新しいJackコンパイラー
3. PNGクランチャー?
4.来る:aapt
5. Studio 1.3 + Gradle 2.4 =ビルド速度が大幅に向上
6.データバインディングが実験的に利用可能になりました。
7.近日公開:クラウドテストラボ、Googleプレイテスト
8. NDKサポート
9.新しい注釈(WorkThreadなど)
10. Android型付き整数-フラグの意味が表示されるようになりました
11.ビューのキャプチャ:ヒープスナップショット、割り当ての追跡など。 -メモリリークなどを表示できます
12. Googleサービス(分析、クラウドなど)の簡単な接続
13.テーマエディター
www.youtube.com/watch?v=f7ihSQ44WO0

興味深いライブラリ


1.開発者向けのライブラリ。 多くの興味深いUIソリューション

おわりに


この記事をお楽しみいただき、興味深いものになることを願っています! これは私の最初の記事ですので、あなたが肯定的な感情と知識を受け取ったら、私は招待を待っています。 追加または修正するものがある場合、私はコメントを待っています。

Source: https://habr.com/ru/post/J264255/


All Articles