web-dev-qa-db-ja.com

最適化Androidリリース前のアプリケーション

私は、プログラムの効率について「special」状況にあります。今、私はアプリケーションのパフォーマンスを改善し、バッテリー消費を減らす必要がある段階にいます。

質問の前に:

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

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

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

素晴らしい開発者が知識を共有することを奨励するため、素晴らしい回答に投票してください。

120
Wroclai

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

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

67
unholysampler

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

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

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

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

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

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

37
olivierg

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

22
Aleadam

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

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

adb Shell dumpsys meminfo 'your apps package name'
16
NickT

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

15
Heiko Rupp

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

  • リストアダプターにはconvertViewを使用します-Adapter.getView()内に新しいビューを作成すると、リスト内のすべての位置に対してこのルーチンが呼び出されるため、非常に高価になります。 convertViewを使用すると、作成済みのビューを再利用できます。良い例(ViewHolderの使用と一緒に)は ApiDemos にあります。

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

  • 背景のドローアブルを削除します-Androidフレームワークを使用していた(まだ持っていますか?) 問題 どのビューが描画されるべきかを検出します。デフォルト)背景ドロアブルは、不透明なUIによって非表示になるようにのみ描画されます。この無駄な描画を取り除くには、背景ドロアブルを削除します。

カスタムスタイルを使用して実行できます

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

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

  • ネットワークの種類を確認し、ユーザーがWi-Fiまたは3Gを使用して(ローミングではなく)エリアに到着するまで待ち、その後のみ接続を使用できるようにします。

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

  • リサイクル複合体Java XmlPullParserFactory/BitmapFactory/StringBuilder/Matcherなどのオブジェクト。

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

13
youri

考えるべきこと:巨大なループなどで文字列を使いすぎないでください。これにより、GCが必要な多くのStringオブジェクトが作成されます。 「Bad coding」の例では、ループごとに2つの文字列オブジェクトが生成されます。次の例では、1つの最終的なStringと1つのstringbuilderのみを生成します。これは、速度のために巨大なループを最適化するときに大きな違いを生みます。 Wordlist Pro Androidアプリを作成する際にstringbuilderを頻繁に使用しました。

    //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);
    }

私はこの問題についてより詳細なブログ記事を書きました。 ここを読む

9
ernell

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

6
Stan

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

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

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

6
Pēteris Caune

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

5
Naresh

DDMSを使用して、システムで実行中のすべてのスレッドを追跡してください。たとえば、webviewを使用してhtmlコンテンツを表示していることに気付きました。Cookie管理セッション管理などのスレッドをほとんど作成しないことに気付きました。したがって、複雑なhtmlを表示する必要がない限り、Androidで通常のユーティリティクラス "Html"を使用してhtmlコンテンツを表示してみてください。eulaには典型的なhtmlテキスト。

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

5
Naresh

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

4
luvieere

Android Resource Tracker を使用して、プロジェクト内の削除可能な未使用のリソースを見つけます。

4
FrVaBe

私はこの会話に少し後で参加することを知っていますが、1か所で多くの良いヒントを持っていることは完璧だと思います。私のヒント:

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

..更新されます..

3
Ewoks