レイアウトと描画、操作はビューのツリーをトラバースすることによって行われアンドロイド、中計測システムのビュー。木の高さが高すぎるとViewは真剣ドローの測定、レイアウト、および速度に影響します。Googleはビューが、高さが10層を超えてはならない推奨もそのAPIドキュメントです。
最適化のアイデア
Androidのレイアウトは、性能の本質は、ページの影響で影響を与える测量
と绘制
時間。
ページ及び再帰図面、即ちによる測定処理の完了
measure
、layout
プロセス。
ページの表示速度のAndroidアプリケーションを改善するために、次の側面から最適化することができます。
- 適切なレイアウトの種類を選択
- レベルのレイアウトを削減
- 再利用性のレイアウトを改善します
- ドロー測定時間を短縮
最適化
適切なレイアウトの種類を選択
これにより、ネスティングを低減する、合理的なレイアウトの種類を選択することにより、レイアウトの性能を改善します。
すなわち:複合効果UIが完了すると、複雑なレイアウト(例:RelativeLayout、ConstraintLayout)などの機能を選択する:終了ネスト完了するために、代わりに複数の機能の単純なレイアウト(でframeLayout、のLinearLayoutなど)へ。
改善の性能はレイアウトを選択することで、性能(CPUリソースと時間)より少ないレイアウトをとります。
- 低コストパフォーマンスのレイアウト:単純な関数(のような:でframeLayout、のLinearLayout)
- 高コストパフォーマンスのレイアウト:複雑な機能(例:RelativeLayout、ConstraintLayout)
アンドロイド4.0程度前に、新築のデフォルトのレイアウトは、rootであり
LinearLayout
、そしてそれが変更された後でRelativeLayout
あるため、RelativeLayout
優れたパフォーマンス、および簡単な達成することができLinearLayout
、ネスティングのレイアウトを実現することができます。2017 GoogleがAndroidのメーカー2.3、デフォルトのルートであるAndroidのメーカー2.3プロジェクトのレイアウトの新バージョンの正式版をリリースしConstraintLayout
、理由ConstraintLayout
よりも性能がRelativeLayout
優れています。
可能wrap_contentとしてわずか
レイアウトプロパティのwrap_content
計算時間は、測定のレイアウトのコストを増加させるできるだけする必要があります。固定値の既知の幅と高さで使用されていないwrap_content
プロパティ。
使用[レイアウト]タブ
<include>のタグ
<include>
タグは、多くの場合、このレイアウトに多くの利便性を提供して書くのは簡単、モジュラーレイアウトを実現するために、他の一般的なレイアウトのレイアウトの公開部分を抽出するために使用されています。
main.xmlに以下レイアウトのinclude
別のレイアウト例foot.xmlを導入します。次のようにmain.mxlコードは次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/simple_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="@dimen/dp_80" />
<include layout="@layout/foot.xml" />
</RelativeLayout>
ここでinclude
次のようにfoot.xmlは、共通の下部にページを組み込みました:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_40"
android:layout_above="@+id/text"/>
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_40"
android:layout_alignParentBottom="true"
android:text="@string/app_name" />
</RelativeLayout>
<include>
唯一のプロパティは、タグでlayout
文書のレイアウトが含まれている必要があり、属性を指定します。それは定義することができるandroid:id
とandroid:layout_*
ルートノードの対応する属性値をカバーするプロパティは、レイアウト内に導入されます。ノートは再定義android:id
、サブレイアウトのトップノードid
変更にします。
<Viewstub>タグ
<viewstub>
ラベルinclude
と同じラベルがあることを除いて、外部のレイアウトを導入するために使用することができviewstub
、デフォルトのレイアウトが展開されませ導入しつまりはどちらも表示されないも位置が、それによってCPUのメモリを節約し、レイアウトを解析し、占有占領しました。<viewstub>
これらのデフォルトを導入するために使用されるタグは、リフレッシュレイアウトレイアウトは、このような進歩のレイアウト、ネットワーク障害の表示として例外的な状況でのみ表示され、表示されない、エラーメッセージがプロンプトレイアウトが表示されます。
network_error.xml例のレイアウトエラーmain.xmlにネットワークに参加するように促さ以下のページ。次のようにmain.mxlコードは次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
……
<ViewStub
android:id="@+id/network_error_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout="@layout/network_error" />
</RelativeLayout>
どのviewstub
network_error.xmlは、ネットワークエラーにのみ導入された大規模な列 のAndroidレイアウト最適化の性能を最適化するために、次のように、表示したい場合は、デフォルトでは解決されませんレイアウトのサンプルコードを:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/network_setting"
android:layout_width="@dimen/dp_160"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="@string/network_setting" />
<Button
android:id="@+id/network_refresh"
android:layout_width="@dimen/dp_160"
android:layout_height="wrap_content"
android:layout_below="@+id/network_setting"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/dp_10"
android:text="@string/network_refresh" />
</RelativeLayout>
JavaではによってViewStub viewStub = findViewById(id)
見出さViewStub
ViewStub場合にのみinflate()
メソッドが呼び出される、または可視に設定され、このViewStub
文書のレイアウトにポイントがロードされ、現在交換されるViewStub
位置。したがって、ViewStubなるまでビュー階層に存在するsetVisibility(int)
か、inflate()
そうでなければ制御、リソースの非常に小さい消費をロードしないで、メソッドが呼び出されます。通常、「怠惰には、」それを呼び出します。
注:1の場合
ViewStub
、setVisibility(int)
またはinflate()
メソッドが呼び出された後、これをViewStub
レイアウトに指定されているView
そう呼ばれて、交換inflate()
方法をViewStub
あなたは隠された後、再び表示させたい場合に使用することはできません、inflate()
方法が、再び使用することができますsetVisibility(int)
この方法は、これらの2つの方法の間の差である、可視に設定されています。
<マージ>タグ
使用中のinclude
遅い解析、およびネストされたことにより、不要なノードで、その結果、過剰な、不必要な余分なレイアウトノードをもたらすことができるネストされた配列をhierarchy viewer
、または设置->开发者选项->显示布局边界
図。
<merge>
タグは、2つの典型的な例で使用することができます。
- あるトップレイアウトノード
FrameLayout
と必要性が提供されていないbackground
、またはpadding
性質のような、することができるmerge
ので、交換しActivity
、ルートノードがありFrameLayout
、それを使用することが可能であるmerge
唯一の排除を。 - サブレイアウトが他のレイアウトのレイアウトであるとして
include
使用された場合merge
のレイアウトのルートノードとして、ルートノードが中に導入されたときに自動的に無視され、完全にその子ノードのメインレイアウトに組み込まれます。
<merge>
唯一のXMLレイアウトのルートタグとして使用します。ときに膨張するために<merge>
、文書のレイアウトの開始時に、あなたは親を指定しなければなりませんViewGroup
し、設定する必要がありますattachToRoot
しtrue
。
概要
タグ | 機能 | 説明 |
---|---|---|
<include> |
再利用性のレイアウトを改善します | これにより、時間計測の描画レイアウトを減少させる再利用性を増加させることにより、レイアウト間の共通部分を抽出します |
<viewstub> |
ドロー測定時間を短縮 | 測定時間を短縮するために、図面、レイアウトは、直接のパフォーマンスを向上させることができます |
<merge> |
レベルのレイアウトを削減 | レベル縮小レイアウト、縮小描画時間の直接測定は、レイアウトのパフォーマンスを向上させます |
その他の最適化
共通ビューSurfaceViewまたはTextureViewに置き換え
SurfaceView
それともTextureView
、あなたは別の別のスレッドに移動操作を描画することで、パフォーマンスを向上させることができます。通常の描画処理のビューは、メインスレッド(UIスレッド)で行われているいくつかの描画操作が最適化された悪いのパフォーマンスに影響を与える場合、その後、あなたが使用を検討することができますSurfaceView
し、TextureView
他の、彼らの描画操作は、外部のUIスレッドを発生しますスレッドで。
なぜならSurfaceView
システムの従来のビューに加えて、それは従来の移動しようとすると、スケールまたは回転Aと同じではありませんSurfaceView
。TextureView
アンドロイド4.0を導入し、追加されSurfaceView
、図中の別々のスレッドとしてだけでなく、従来のビューが変更されたものと同じであってもよいです。
使用RenderJavascript
RenderScript
Adnroid 3.0言語の導入は、Android上で高いパフォーマンスのコードを書くために使用され、文法はC99標準のC言語を与え、彼の構造は独立しており、異なるCPUやGPUのカスタムコードは必要ありません。
使用OpenGLの描画
Androidの支持体の使用OpenGL
Androidのための最も高度なグラフィックスメカニズム利用可能である高性能グラフィックスAPI、アプリケーション広く使われているパフォーマンス要件のゲーム内の高。
アンドロイド4.3最大の変化は、サポートがありますOpenGL ES 3.0
。2.0と3.0と比較すると、より多テクスチャのサポートを高め、新たなシェーディング言語を追加して、オブジェクトをバッファリングしている、というように、より優れたビジュアル体験Androidのゲームをもたらすでしょう。
レイアウトチューニング・ツール
階層ビューア
Hierarchy Viewer
Androidのメーカーは、UIのパフォーマンステストツールを提供しています。可視化は、開発者が、ヘルプ最適化するために、レイアウト設計をUIのレイアウト構造とさまざまな情報の性質を得るのを助けることができます。階層ビューアの活動を簡単にレイアウト、各ビューのプロパティ、測定され、描かれたレイアウト時間を表示することができます。具体的な説明を表示階層ビューア
アンドロイドStudioバージョン3.1以降、階層ビューアが放棄されているが、実行時に使用することが推奨される
Layout Inspector
アプリケーション・プロセス・ビュー階層をチェックします。
レイアウトインスペクタ
Layout Inspector
Androidのメーカーは、階層ビューアプログラムに、新たな代替手段です。レイアウトチェッカーを使ってAndroidのメーカーは、実行時にIDEのAndroid Studioからアプリケーションの独自のビュー階層を確認することができます。予想通り、レイアウト、実行時に(とは完全にXMLで)建物やレイアウトが表示されない場合は、このチェックは非常に有用であろう。見具体的な導入レイアウトインスペクタ
レイアウトインスペクタを開くには、次の手順に従います。
- デバイスまたはエミュレーター上でアプリケーションを実行します。
- ツール>アンドロイド>レイアウトインスペクタをクリックします。
- が表示された場合は、チェックしたいアプリケーションプロセスを選択することをダイアログボックスでプロセスを選択し、[OK]をクリックします。
リント
Lint
コードスキャン分析は、Androidのメーカーが提供するツールであり、あなたはスキャンして、コードの構造と品質の問題を発見し、解決策を提供することができます。リントそれぞれの問題が説明と評価(テストと非常によく似たバグを発見した)発見した、それは簡単に重症度に応じて検索し、修正の問題をすることができます。具体的に説明可視リント
SYSTRACE
Systrace
アンドロイド4.1は、新しいパフォーマンスデータのサンプリングおよび分析ツールです。これは、パフォーマンスを向上させる、ヘルプを収集Androidの重要なサブシステムに現像剤(例えばSurfaceFlingerの、WindowManagerServiceフレームワークとキーモジュールの他の部分、サービス)動作情報をより直感的な開発システムのボトルネックを分析するのに役立ちます。具体的に説明可視SYSTRACE
SYSTRACE機能は、I / O操作、カーネルの作業キュー、CPUの負荷や、様々なサブシステムAndroidの追跡システムの他の動作条件が含まれます。主に3つの部分から構成され、Androidプラットフォームでは:
- コア部分:Linuxカーネル内SYSTRACE利点を次にftrace機能。あなたがSYSTRACEを使いたいのであれば、カーネルモジュールおよび関連する次にftraceにオンにする必要があります。
- データ収集:Androidのトレースは、クラスを定義します。アプリケーションプロセスは、このような統計の次にftraceの使用に出力することができます。プロセスがあるatrace一方、Androidは、それが次にftraceから統計情報を読み取ることができ、その後、データ分析ツールに対処します。
- データ分析ツール:Androidがsystrace.pyを提供しては、(文書のPythonのペースは、AndroidのSDKがディレクトリ/ツール/ SYSTRACEに位置しており、それは内部プロセスatrace呼びます)、このようなデータ収集タグなどの方法でデータ集録(、文書名の出力を設定するために使用されますなど)と、次にftraceは、統計データを収集し、表示するドキュメントへのユーザーのために結果ページを生成します。
基本的に、SYSTRACEは、Linuxカーネル次にftraceパッケージ、SYSTRACEを使用するには、Androidが提供するトレース・クラスを使用するようにアプリケーションのプロセスが必要です。