Android性能-コールドスタート最適化

4305 ワード

一、冷熱起動概念:
1、コールドスタート:コールドスタートシステムは新しいプロセスを再作成して割り当てるので、まずApplicationクラスを作成して初期化し、MainActivityクラス(一連の測定、レイアウト、描画を含む)を作成して初期化し、最後にインタフェースに表示します.
2、ホットスタート:ホットスタートは既存のプロセスからスタートするので、ホットスタートはApplicationのステップではなく、直接MainActivity(一連の測定、レイアウト、描画を含む)を歩くので、ホットスタートのプロセスはMainActivityを作成して初期化するだけでいいので、アプリケーションを作成して初期化する必要はありません.新しいプロセスの作成からプロセスの破棄まで、Applicationは一度だけ初期化されます.
二、冷間起動プロセス:アプリケーションの最初の起動が完了した後、私たちが見たインタフェースは第1フレームと呼ばれています.そこで、アプリケーションの起動プロセスをまとめると、Applicationの作成と初期化-->attachBaseContext()->onCreate()->Activityの構築方法-->onCreate()->トピックの背景などのプロパティの構成-->onStart()->onResume()->contentViewのmeasure/layout/drawがインタフェースに表示されます.
三、ツールと分析方法:1、activityの起動時間を測定する------activityのreportFullyDrawn()方法2、adb shell screenrecord--bugreport/sdcard/launch.mp 4録画画面
最適化方法:1、アプリケーションを業務に参加させない操作2、APPlicationで時間のかかる操作をしないでください.例えば、一部の開発者は自分のアプリにフォルダやファイル(例えば私自身)を並べて、これらのI/O操作は「確かに使うべき時に作成する」か、データベースのいくつかの操作に置くべきです.3、静的変数でアプリケーションにデータなどを保存しない.
JAvaコード最適化1、キャッシュ:頻繁にアクセスする必要がある、または1回のオーバーヘッドが比較的大きい:res.getstring()のような他のキャッシュをキャッシュする必要がある:ピクチャキャッシュ、スレッドプール、メッセージキャッシュhandler.ObtainMessage()、2、データ構造の選択:AndroidもSparseArray、SparseBooleanArray、SparseIntaray、Pairなどの性能の優れたデータ型を提供しています.Sparseシリーズのデータ構造はkeyがintの場合の特殊な処理であり、二分検索と簡単な配列記憶を採用し、汎用変換を必要としないオーバーヘッドを加え、Mapに比べて性能が優れている.3、アルゴリズムの選択:できるだけo(n*2)のアルゴリズムを使わない;必要な時間は空間で時間を変える4、非同期:時間を費やす操作は非同期スレッドの中に入れて5、繰り上げあるいは遅延操作を実行し、時間帯をずらしてTPS(1)遅延操作を高める:Activity、Service、BroadcastReceiverのライフサイクルなど応答時間に敏感な関数の中で時間を費やす操作を実行しない、適切にdelayすることができる.Androidではhandlerを取ることができます.postDelayed,handler.postAtTime,handler.sendMessageDelayed,View.postDelayed、AlarmManagerタイミングなど.
レイアウト最適化:ツール:hierarchy viewer、lintポリシー:レイアウトの複雑さを減らし、レイアウトの深さ方法:1、include 2、merge 3、viewstubはデフォルトで表示されず、必要に応じてinflateします.gone 4、listviewの最適化:convertview、viewHolderを多重化してfindviewByIdを低減し、5を局所的に更新し、通常のViewの代わりにSurfaceViewまたはTextureViewを使用します.図面操作を別のスレッドに移動することでパフォーマンスを向上させることができます.Surface Viewは通常のビューシステムの外にあるため、通常の試みのようにSurface Viewを移動、スケール、または回転することはできません.TextureViewはAndroid 4.0は、SurfaceViewと同様に個別のスレッドで描画するほか、通常のビューのように変更することもできる.6、できるだけすべての解像度のために資源を作成し、不要なハードウェアのスケーリングを減らし、UIの描画速度を下げる
データベース最適化1、インデックス:CREATE INDEX mycolumn_index ON mytable(myclumn)の利点:インデックスはクエリーの速度を大きくすることができます;表クエリー、連表クエリー、グループクエリー、ソートクエリーの悪いところを含む:削除を増やすにはインデックスを維持し、性能に影響を与える必要がある.また、インデックスには、更新頻度が低く、クエリー頻度が高く、範囲クエリー(>,=,<=)やorder by、groupbyが発生した場合のフィールドでインデックスの使用を推奨する物理空間が必要です.複数のカラムに同時にアクセスすることが多く、各カラムに重複する値が含まれているため、複合インデックスの作成2、トランザクションが考慮されます.Sqliteのデフォルトでは、挿入、更新操作ごとにトランザクションが作成され、挿入、更新のたびにコミットされます(トランザクションの作成->文の実行->コミット).最適化は、バッチ操作時にトランザクションの作成->n文の実行->public void insertWithOneTransaction(){SQLiteDatabase db=sqliteOpenHelper.getWritableDatabase();//Begins a transaction db.beginTransaction();try{//your sqls for(int i=0;i<100;i+){db.insert(yourTable Name,null,value);}
    // marks the current transaction as successful
    db.setTransactionSuccessful();
} catch (Exception e) {
    // process it
    e.printStackTrace();
} finally {
    // end a transaction
    db.endTransaction();
}

}3、データベースクエリー操作は非同期スレッドに入れて4、文のつなぎ合わせはStringの代わりにStringBuilderを使うのは言うまでもないが、簡単なstring加算は複数の一時オブジェクトを作成して性能を消費する.StringBuilderの空間事前割り当てのパフォーマンスはずっと優れています.文字列の長さを大体知っていれば、100文字程度であれば、new StringBuilder(128)で初期サイズを直接指定し、スペースが足りない場合の再割り当てを減らすことができます.5.クエリー時により少ない結果セットとより少ないフィールドを返します.クエリー時に必要なフィールドと結果セットだけを取得すると、より多くの結果セットにより多くの時間とメモリが消費され、より多くのフィールドにより多くのメモリが消費されます.6、cursorを少なく使う.getColumnIndexは、static変数である列のindexが性能チューニング中の観察cursorに基づいて記憶する.getColumnIndexの時間消費とcursor.getIntはほぼ同じです.テーブルを作成するときにstatic変数でカラムのindexを覚え、クエリーのたびにではなく対応するindexを直接呼び出すことができます.
その他:視覚体験上の「速い」:起動したActivityのためにThemeをカスタマイズし、ThemeのwindowBackgroundはユーザーに見せたい画面に設定されています.
起動したActivityのためにTheme<をカスタマイズします.br> <item name="android:windowBackground">@drawable/window_background_statusbar_toolbar_tab</item><br>
新しいThemeをAndroidManifestに適用します.xmlでandroid:name=".MainActivity"android:theme="@style/AppTheme.Launcher">

    
    


MainActivityに新しいThemeを設定することで、元のThemeを上書きしますので、MainActivityで元のThemeに戻す必要があります