リリース前のAndroidアプリケーションの最適化[終了]


120

プログラムの効率性について「特別な」状況にあります。現在、アプリケーションのパフォーマンスを向上させ、バッテリーの消費を削減する必要がある段階にあります。

質問の前に:

さて、私は他の開発者が独自のアプリケーションを最適化するために使用した特別な修正について知りたいです。ユーザーが認識したり注意を払ったりすることのないもの。ただし、修正により、バッテリーの寿命が延びるか、アプリケーションのメンテナンスが改善されます。

それで、あなたのユニークな最適化トリック何ですか?

私は本当に知識を探している特定の状況にあります。これは、開発者が経験したすべての状況について開発者の知識を共有する絶好の機会になると思います。

すばらしい開発者が知識を共有するように促すので、すばらしい答えに投票してください。


2
効率は最終的には必要のないこと(または必要な場合よりも頻繁に)を行わないことに帰着するので、アプリケーションが達成しなければならないことの種類に大きく依存すると思います...それを指定せずに、すべてのできることは、「通常の容疑者」のコレクションを取得することです
Chris Stratton

1
@クリス・ストラットン:そうですね。しかし、「通常の容疑者」または特定のトリックに関する少しの回答は、その「推測」が彼らが探しているものであるかどうか(そしてそれが彼らの特定の状況に役立つかどうか)を他の人が簡単に決定できるようにします。
Wroclai、2011

このサイトで本当に興味深い質問がいくつ閉まっているのかばかげています。
Patrick

このブログ投稿読むmedium.com/@hammad_tariq/...
Developine

回答:


68

ある時点で、既知のトリックを使用すると限界に達するポイントに到達します。この時点で行う最善の方法は、コードをプロファイリングし、特定の要件に基づいてボトルネックとなっている領域を確認することです。

MAT使用したRAMの使用状況の調査およびTraceviewの使用:ツールを使用してアプリケーションのプロファイルを作成する方法に関する記事。


ありがとう!リソースでの回答が本当に好きです。:-)
Wroclai、2011

1
このブログ記事を読んでください。medium.com/@hammad_tariq/…–
Developine

37

割り当てを追跡してスカッシュします。割り当てる量が多いほど、ガベージコレクターの実行が必要になる頻度が高くなり、100ミリ秒などの比較的長い期間、プロセスが他の処理を実行するのを停止します。

これについて私が知っている最良のツールは、DDMSに含まれているAllocation Tracker です。

GCはユーザーエクスペリエンスに影響を与えるだけでなく、余分な割り当てとGCが一部のコンピューティングリソースを消費します。

ここに例と小さなトリックがあります。私のアプリでは、1/10秒を含む現在の(オーディオ)時間を表示する時計を持っています。これは頻繁に更新されます。また、TextViewは、CharSequenceを使用してsetText()を呼び出すたびに、内部的に割り当てを実行します。ただし、setText(char [] text、int start、int len)バリアントでは何も割り当てません。これは文書化されておらず、私が質問しても誰も答えませんでした。

このようなものがたくさんあります。そして、これが私のアプリに50%のネイティブコードが含まれている理由の1つです(ただし、他の理由もあります)。

これとは別に、ProGuardを試すことをお勧めします。いくつかの最適化パスを実行し、プロジェクト内の未使用のメソッドなどの情報をログに記録します。これは、コードの残り物を削除するのに役立ちます。


1
正解です。具体的なトリックは大歓迎です。
Wroclai

22

アプリの画面時間が長い場合は、可能な限り黒を使用してください。これにより、デバイスの最悪の部分、特にAMOLEDの携帯電話とタブレットの画面のバッテリー消費量が削減されます。


暗い色の賢明な使用は、バッテリーの勝利を意味します。
ロバートマサイオリ2011年

7
一方、LCD画面では、黒は白よりも多くの電力を消費します。これは、(バックライトによって供給される)光が白から始まり、黒を生成するためにアクティブに遮断する必要があるためです。[ Scientificamerican.com/article.cfm?id=fact-or-fiction-black-is ]結論:この色の最適化はあまり重視しないでください。
Sparky

16

複数のアクティビティを持つアプリケーションの場合、適切なインテントフラグを使用して、前面に移動する必要があるだけのアクティビティを再起動していないことを確認してください。ヒープが制御されていること、および不要なビュー、バインディング、コンテキストが作成されていないことを確認してください。

アプリの実行中にこれらすべてを表示するのに最適なツールは次のとおりです。

adb shell dumpsys meminfo 'your apps package name'

1
ああ、それは新しいことでした。共有してくれてありがとう!
Wroclai、2011

15

SQLliteを使用する場合は、インデックスに特に注意してください。何も想定しないでください。検索に一般的に使用される列にインデックスを配置すると、Zwitscherで途方もなく高速化しました。


13

UIに関してアプリを最適化するのに役立ついくつかのヒント:

  • 使用convertViewリストアダプタの-あなたが新しいビューの内部を作成する場合、それは非常に高価になるAdapter.getView()。このルーチンは、リスト内のすべての位置のために呼ばれているよう。を使用convertViewすると、作成済みのビューを再利用できます。の良い例は(の使用とともにViewHolderApiDemosにあります。

  • レイアウトが完全に最適化されておらず、(たとえば、親のマージまたは削除を使用して)改善できる場合があります。Androidツールlayoutoptはあなたのためにそのような状況を見つけます。HierarchyViewerとともに使用して、個々のビューを検査できます。詳細はこちら

  • 背景ドローアブルを削除-Androidフレームワークは、どのビューを描画するかを検出する際に問題がありました(まだありますか?)。(デフォルトの)バックグラウンドドローアブルが描画され、その後不透明なUIによって非表示になる可能性があります。この無駄な描画を取り除くには、単に背景のドローアブルを削除します。

カスタムスタイルを使用して行うことができます

<resources>
    <style name="Theme.NoBackground" parent="android:Theme">
        <item name="android:windowBackground">@null</item>
    </style>
</resources>

バッテリー使用量の観点からアプリを最適化するのに役立ついくつかのヒント:

  • ネットワークタイプを確認し、ユーザーがWi-Fiまたは3G(ローミングではなく)でエリアに入るまで待ってから、接続の使用を許可します

  • 可能な限りテキストデータにgzipを使用してダウンロードと解析を高速化する

  • XmlPullParserFactory/ BitmapFactory/ StringBuilder/ Matcherなどの複雑なJavaオブジェクトをリサイクルする

その他のバッテリートリックについては、Coding for Life-Battery Life、That Isを参照してください。


「複雑なJavaオブジェクトなどをリサイクル...」JavaにGCがある間
Yousha Aleayoub 2015

9

考えるべきこと:たとえば巨大なループでは、文字列を使いすぎないでください。これにより、GCする必要のある多くのStringオブジェクトが作成されます。「悪いコーディング」の例では、ループごとに2つの文字列オブジェクトが生成されます。次の例では、1つの最後の文字列と1つの文字列ビルダーのみが生成されます。これは、速度のために巨大なループを最適化するときに大きな違いを生みます。私はWordlist Pro Androidアプリを作成するときにstringbuilderを頻繁に使用しましたが、270000語をすぐに処理すると、非常に高速になりました。

    //Bad coding:
    String s = "";
    for(int i=0;i<999999;i++){
        s = "Number=";
        s = s + i;
        System.out.println(s);
    }

    //Better coding
    final String txt = "Number=";
    StringBuilder sb = new StringBuilder();
    for(int i=0;i < 999999;i++){
        sb.setLength(0);
        sb.append(txt);
        sb.append(i);
        System.out.println(sb);
    }

私はその問題についてより長いブログ記事を書きました。 ここを読んで


6

可能であればどこでも「最終」変数を使用すると、実行速度も向上すると思います。


1
どこかでリンクを提供してもらえますか?
Wesley Wiser

1
それほど確か最後の変数についても同様ですが、静的最終変数のためにできること-を参照してstackoverflow.com/questions/3117770/...
アリスター・コリンズ

リンクを提供できませんが、Reto Meier(2010年5月19日)/ Google IOによる「Androidの初心者向けガイド」でリンクに関する通知を見つけました。それは短く、ダウンロードは無料で、優れたアプリを構築する方法についての良いアドバイスがあります。
スタン

2
最終的な変数は、すべてのオブジェクトが同じ実行でGCされることを意味するため、コードをより効率的にすることができます。それらをnullに設定したタイミングに基づいて異なる場合はありません。
ロバートマサイオリ2011年

1
質問:コンパイラーは明示的にそれを行いませんか?コード分​​析フェーズで実行する必要があると思います。
Pawan、2016

6

OptiPNGPNGCrushなどのツールを使用してPNG画像を最適化し、APKサイズから(キロ)バイトを削減します。Webサイトの画像最適化のヒントもここに適用されます。適切な画像形式を使用し、JPG圧縮で再生し、8ビット透明の代わりにバイナリ透明を使用することを検討してください。

アルファチャネル付きの大きなPNGを出荷する場合は、APKサイズを起動速度と引き換えに、RGBチャネルとAチャネルに別々のJPGを使用できます

HTTP接続を行う場合は、HTTPクライアントがコンテンツ圧縮を利用していることを確認してください。受信したHTTP応答をキャッシュする場合は、キャッシュ関連のHTTPヘッダーを正しく理解して使用していることを確認してください。


洞察をありがとう!これについて聞いたことがありません!
Wroclai、2011

5

ネットワーク操作がある場合は、同じhttpclientインスタンスを再利用してみてください。正規表現の使用は避けてください。


理由?理由を説明できますか?
Yousha Aleayoub 2015

5

DDMSを使用して、システムで実行されているすべてのスレッドを追跡してみてください。たとえば、webviewを使用してhtmlコンテンツを表示していることに気付きました。Cookie管理セッションの管理などのためにいくつかのスレッドが作成され、メモリフットプリントが増加しました。そのため、複雑なhtmlを表示する必要がない限り、Androidで通常のユーティリティクラス「Html」を使用してhtmlコンテンツを表示してみてください。典型的なeulaにはhtmlテキストが含まれているので、これはEulaを表示している人にとって役立つかもしれません。

ネットワーク操作を行う必要がある場合、初心者であればAndroidHttpClientを使用してみてください。SSLセッションをキャッシュするための優れた機能がいくつかあり、パフォーマンスの向上に役立ちます。特にsslハンドシェイク中に接続をドロップした場合、無限のタイムアウトによりデッドロックが発生する可能性があるため、ソケット接続のタイムアウトは常に60秒程度または有限の値に設定してください。



4

タグ間のテキストを取得するために文字列操作ルーチンを使用してXML入力を解析できる場合は、XPathの使用を避けてください。私はテストし、HTC Desireで50000アイテムのデータセットで、この場合10倍の改善を確認できます。


3

私はこの会話に少し後で参加することを知っていますが、1つの場所に多くの良いヒントがあることは完璧です。そのため、このスレッドが存続し、かなり頻繁に更新されることを願っています。私のヒント:

  • 高価なジョブでUIスレッドをブロックしないでください。アプリからの応答がない場合、ユーザーは離れます(AsyncThreadsを使用)。
  • 潜在的なバグがないかAndroidプロジェクトソースをスキャンするLINTを使用ます。

..更新されます..

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.