Androidアプリ最適化事典について

little bottle
リリース: 2019-04-10 14:33:16
転載
2147 人が閲覧しました

技術者にとって、多くの場合、やり方がわからないのではなく、何をすべきかわからないのです?今日は、その方法についていくつかの経験を集めました。 Android アプリケーションを最適化します。合計 8 つの次元です。

Androidアプリ最適化事典について

#1. レイアウトの最適化

##なぜですか?

Android システムは、UI のレンダリングをトリガーするために 16 ミリ秒ごとに VSYNC 信号を送信します。スムーズなインターフェイスを実現するには、60fps である必要があります。これは、ほとんどの操作を 16 ミリ秒以内に完了する必要があることを意味します。

上記のインターフェイスが複雑すぎてレンダリングが時間内に完了しないことに加えて、過剰描画の問題もあります。オーバー描画と呼ばれるのは、特定のピクセルが同じフレーム内で複数回描画されることを意味します。マルチレベル UI インターフェイスでは、非表示の UI も描画されている場合、これらの重複領域のピクセルが複数回描画されるため、無駄が発生します。大量の CPU および GPU リソース。背景が重なっている場合にもオーバードローが発生します。たとえば、レイアウトには独自の背景があり、サブビューには独自の背景があります。

検出方法は?

  • HierarchyViewer を使用して、アクティビティのレイアウトが複雑すぎますか?を確認します。

  • 開発者向けオプションで [GPU オーバードローの表示] オプションを開いて、オーバードローがあるかどうかを観察します。

  • 開発者で、オプションで [GPU レンダリングのプロファイル] を選択し、バーとして [画面上] を選択します。

  • TraceView を使用して CPU を観察します。実行

最適化方法

  • レイアウト レベルを下げ、インクルード、マージ、ViewStub を合理的に使用します

  • カスタム コンポーネントの onDraw() で大量の作成を避ける 頻繁に GC がトリガーされるのを避けるため、String などの一時オブジェクトを作成する onDraw()カスタム コンポーネントの場合は、描画する必要がある領域を描画するために Canvas.clipRect() を使用することを検討してください。

  • ListView などのコンポーネント コンテナーの場合は、convertView と ViewHolder の使用を検討してください。

    よりパフォーマンスの高いコンポーネントの使用を検討してください。たとえば、ListView の代わりに RecycleView を使用することをお勧めします。自動行折り返しを実現するには静的レイアウトを使用してください。
  • #2. メモリの最適化

なぜですか?リソースは常に限られており、メモリはもリソースです。Android では、メモリ リソースの過度/不適切な占有により、アプリケーションが頻繁に強制終了され、最終的には全体的なユーザー エクスペリエンスにも影響します。開発者はメモリの節約を念頭に置く必要があります。

検出方法

##LeakCanary を使用する

##MAT を使用して Java ヒープを分析する

    ##Android デバイス モニターで Application Tracker を使用してメモリ割り当て情報を追跡する
  • Android Studio で Android モニター、[メモリ] を選択します
  • 最適化する方法は?

  • メモリをアクティブに解放し、onLowMemory() および onTrimMemory() でメモリを適切に解放します。

メモリ リークを回避し、メモリ オーバーフロー

    ビットマップを使用する場合は、ビットマップを圧縮するか、キャッシュを使用するか、カラー モードを変更することを検討してください。たとえば、Android のデフォルトのカラー フォーマットは ARGB_8888 です。要件を満たしていない場合は、高い場合は、RGB__565 を使用できるため、各ピクセルが占有するメモリは 4 バイトから 2 バイトになります。
  • フレーム アニメーションの使用を減らし、必要に応じて、SurfaceView を通じて実装します。
  • #ArrayMap/SparseArray などの、より軽量なデータ構造を使用します
  • Service や Webview などの関連コンポーネントを合理的に使用し、次の場合にそれらのライフ サイクルを積極的に終了します。それらは必要ありません
  • 音楽プレーヤー クラスなどの複数プロセスの合理的な使用は、メイン プロセスと再生プロセスに分けることができます。

  • 使用する場合は、境界付きキューを考慮してください。非同期キュー

  • HashMap のサイズが明確にわかっている場合は、初期化中にその容量を設定します

3. バッテリーの最適化

なぜですか?

バッテリーはモバイル デバイスにとって非常に貴重なリソースです。開発者として、ユーザーのことを考えて消費電力を削減する必要がある 調査によると、通常、インターフェイスのレンダリングなどプログラムのコア機能で消費される電力は 30% 程度で、残りの 70% はレポート データで消費されます、位置情報の更新、バックグラウンド通知。

検出方法

  • 電話オプションでアプリの消費電力統計を表示します

  • Battery Historian ツールを使用して詳細な消費電力を表示します

最適化方法

  • 画面を起動する回数を減らします。持続時間に応じて、WakeLock を正しく使用してください。

  • ログのレポートなど、必須ではない操作を充電状態まで遅らせる場合、夜間充電中に完了します。JobScheduler と組み合わせて使用​​できます

  • センサーを使用してデータを収集する場合は、必要がなくなったら必ず登録をキャンセルしてください。

  • ネットワーク通信を削減し、通信を統合します。

  • 測位機能を合理的に使用し、位置更新の頻度を減らし、実際の状況に応じて異なる精度の測位要件を使用します

4. ネットワークの最適化

##理由?

#現在では、ほぼすべてのアプリをオンラインで操作する必要があります。ネットワークの最適化により、一方ではエクスペリエンスが向上し、他方ではエクスペリエンスが向上します。トラフィックと電力消費が削減されます。また、ネットワークはリソースでもあります。ユーザーやネットワーク サービス プロバイダーにとっては重要であり、開発者はネットワーク リソースが無制限であると想定すべきではありません。

検出方法は?

  • ネットワーク トラフィック ツールを使用するAndroid Studio でネットワーク リクエストを表示する

  • Android Studio でモニターを使用する

  • Fidder や Charles などのパケット キャプチャ ツールを使用してネットワーク データ パケットを分析する

#最適化方法

    写真でも通常のデータでも、必要に応じて必ずキャッシュしてください。LruCache を使用してください。および DiskLruCache を使用して、独自のキャッシュ システムを構築し、実際のシナリオに基づいてキャッシュ戦略を設計します
  • 過剰なネットワーク同期を回避し、関連するネットワーク リクエストをマージします
  • 実際のシナリオに応じてリクエスト戦略を決定し、ネットワーク操作に固定間隔の頻度を使用することは避けてください。たとえば、WiFi に接続して充電する場合、頻度は高くても構いません。最初のネットワーク リクエストが失敗した後は、2 倍の時間間隔を使用できます。
  • データ送信量を削減し、送信データを圧縮します。送信が写真の場合は、適切な画像フォーマットを選択し、適切な仕様に従って画像をリクエストする必要があります。通常のデータの場合は、ProtocolBuffers を使用して送信データのサイズを削減することを検討できます。
  • 場合によっては、IP 直接接続を使用できる一方で、 DNS 解決時間を短縮し、その一方でドメイン名のハイジャックを防ぐことができます
#5. 最適化を開始します

##なぜですか?

起動の最適化はそれほど必要ではないようですが、心理的な観点から見ると、起動速度が速いと、ユーザーに良好なパフォーマンス、効率、および優れた心​​理的意味を与える傾向があります。信頼性が高いため、ユーザーは良い印象を持ちやすく、後でユーザーに好印象を与える余地が残されます。

検出方法は?

メソッド トレースを使用する

  • Systrace を使用する (onCreate に Trace.beginSection() および trace.endSection()

    を追加するなど)
  • 使用 adb shell am start -W [パッケージ名]/[パッケージ名.MainActivity]コールド スタート時間を測定する

最適化方法:

  • アクティビティの onCreate() での複雑で時間のかかる操作を削減します。

  • アプリケーションの onCreate()、attachBaseContext () も複雑で時間のかかる操作を軽減しますが、多くのアプリでは、コンポーネントとサービスの多数の初期化操作がここで実行されます。可能であれば、並列初期化を検討してください。テーマを設定して起動ウィンドウとして画像を表示するなど、起動ウィンドウをカスタマイズします。

  • レイアウトの最適化

6. ボリュームの最適化

理由?

ユーザーにとって、それがユーザー空間であれ、ネットワークであれ、あるいは時間であれ、リソースです。ボリュームの最適化は、ユーザーのリソースを節約するための重要な部分です。現在 SDK 製品を作成している場合、ボリュームの最適化も同様に重要です。検出方法?

Android Lint を使用して未使用のリソースを確認する
  • ##最適化する方法は?##Reduce不要な依存ライブラリ/Jar を削除し、ニーズを満たしながら小さいライブラリ/Jar を優先します。

#コードのスリム化、最適化、難読化には Proguard ツールを使用します

so ファイルの数を減らし、実際の状況に応じて so ファイルを提供します
  • Gradle で shrinResource を使用して、APK インストール パッケージから無駄なコードとリソースを除外します
  • 画像リソースのサイズを削減するか、画像圧縮を検討するか、png/jpeg の代わりに Vertor Drawable を使用します
  • #対応する解像度の画像を選択的に提供しますリソース

  • 既存の画像を再利用します。主にコードを通じて既存の画像を変換します。

  • プラグイン テクノロジを使用します (プロジェクトが単純な場合は使用しないでください)

  • 7. パフォーマンスの最適化

  • を使用できます。自分の能力を 100% 発揮する場合は、次のことを行ってください。そのうちの 50% だけを使用するわけではありません。これはアプリケーションにとって悪いことではありません。2 台の車が同じ価格でユーザーに販売された場合、ほとんどの人はよりパフォーマンスの高い方を選択すると思います。

検出方法?

Android Studio の [分析] -> [コードの検査] で、Lint を使用して静的分析を実行します。

ターン開発者向けオプションで StrictMode をオンにするか、コードでオンにします

コード レビュー

  • 最適化する方法は?
  • タスクの並列化、可能なタスクに対して並列操作を実行、スレッドを直接使用する代わりにスレッド プールを使用
  • データをシリアル化する方法、Android を優先するJava によって提供されるのではなく、それ自体で提供されるシリアライズ可能

適切なデータ構造を選択し、List/Set/Map/Stack 操作の複雑さを明確にする

  • Android を使用して、HashMap の代わりに ArrayMap を使用するなど、より効率的なコンテナを提供します。さらに、SparseBoolMap、SparseIntMap、SparseLongMap があります

  • Enum 型の代わりに静的定数を使用すると、少なくとも 2 倍削減できますメモリ消費

  • #オブジェクト プール テクノロジを使用する (String のようなオブジェクト プールを提供するなど)
  • キャッシュ テクノロジを使用する
  • 文字列のスプライシング操作は StringBuilder の使用に限定されます
  • 関連するアルゴリズムとロジックを最適化して不要なプロセスを削減します
  • JNI を採用します。計算量の多いロジックでは、画像処理などのコルーチン SO ファイルを使用します。
  • ビジネス最適化

  • 上記に加えて、計画に加えて、より一般的な最適化についても言及しました。ビジネスの最適化にも時間を費やす必要があります。多くの場合、時間のプレッシャーにより、現在のビジネス ソリューションは最適ではありません。たとえば、複数の写真のアップロードをサポートするには、多くの人々はシリアル操作を直接使用します。これは実装は簡単ですが、最良のものではありません。
  • 各製品のビジネスは同じではないため、一般的な最適化計画を立てるのは困難です。考慮に値するさらに 2 つの目標があります:

    • 可能であれば、シリアル ビジネス並列化

    • 可能であれば、ビジネス プロセスを簡素化します。象を冷蔵庫に入れる方法は、冷蔵庫を開け、象を中に入れ、最後に冷蔵庫を閉めることです。

    ビジネスの最適化が最後に置かれる根本的な理由は、ビジネスの最適化には高いリスクがあり、完了するにはチーム全体の協力が必要であるためです。

    Android には画像のカラー形式が 4 つあります。

    Androidアプリ最適化事典について

    ##デフォルトは です。 ARGB_8888<span style="font-size:14px;"></span>, ここで、ARGB はそれぞれ透明度、赤、緑、青を表し、各値は 8 ビットで記録されます。つまり、1 ピクセルは 4 バイト、合計 32 ビットを占有します。 And
    ARGB_4444<span style="font-size:14px;"></span> は上記と非常によく似ていますが、各値は 4 ビットで記録されます。つまり、1 ピクセルは合計 2 バイトを占有します。 16ビットの。
    RGB_565<span style="font-size:14px;"></span> は、5 ビット、6 ビット、および 5 ビットを使用して各値を記録します。透明度はなく、各ピクセルは 2 バイトを占めます。合計 16 ビット
    ALPHA_8<span style="font-size:14px;"></span>: このピクセルは透明度のみを保存し、1 バイト、合計 8 ビットを占有します。 実際のアプリケーションでは、
    ARGB_8888<span style="font-size:14px;"></span> および RGB_565<span style="font-size:14px;"></span># を使用することをお勧めします # #、透明性が必要ない場合は、RGB_565<span style="font-size:14px;"></span> を選択してください。これにより、メモリ使用量が半分に削減されます。 [おすすめコース:

    Android ビデオ チュートリアル

    ]

以上がAndroidアプリ最適化事典についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!