トグルメニュー

Android デベロッパーが APK ファイルのサイズを縮小するためのヒント

公開: 2015-10-28
ここでは、スタティック フットプリントを削減するための、仲間の Android 開発者向けの推奨事項をいくつか紹介します。 独自の特定のニーズに最適なものを選択できます。

1) プロガード

Truelancer でフリーランサーを雇う

ProGuard などのコード圧縮ツールを使用すると、APK ファイルのサイズを大幅に縮小できます。 このツールは sourceforge で入手できます。 アプリケーションの動作が変わる場合があるため、ProGuard の適用後にすべてのアプリケーションを再テストすることが非常に重要であることに注意してください。 ProGuard はアプリケーション シンボルを置き換えるため、コードを読みにくくするために、アプリケーションのクラッシュを調査する必要がある場合にスタック トレースを元のシンボルに変換できるように、シンボル マッピングを保持することが重要です。

2) デバッグ情報の削除

アプリケーションからデバッグ関連の機能をすべて削除することをお勧めします。 通常、アプリケーションはこのデータを参照したり使用したりしません。Android オペレーティング システムでは、アプリケーションを実行するためにこのデータは必要ありません。 したがって、デバッグ情報はスペースを浪費するだけなので、削除する必要があります。

これを実現するには、すべてのデバッグ関連機能を以下のように条件付きブロックで囲む必要があります。

 静的最終デバッグ = false;
 if (デバッグ) {
 v(タグ、「デバッグ…」)
 }

コンパイラがすべてのデバッグ機能を完全に削除できるようにするには、デバッグ フラグをコンパイル時に設定する (つまり、static final として宣言する) ことが重要です。 myDebugPrint() の呼び出しが条件付きブロックで囲まれていないため、以下に示すような独自のデバッグ メソッドを作成することはお勧めできません。これは、コンパイラが呼び出し元のクラスで myDebugPrint() に関する情報を保持する必要があることを意味します。

 public void myDebugPrint()
場合 (デバッグ)
v(TAG, "デバッグ…");
}
}
…
myDebugPrint()

3) ネイティブ ライブラリからのデバッグ シンボルの削除 デバッグ シンボルの使用は、アプリケーションがまだ開発中であり、デバッグが必要な場合に意味があります。 ただし、リリース ビルドをコンパイルするときにデバッグ シンボルがまだ表示されている場合、およびそれらを削除する場合は、ネイティブ ライブラリ (.so ファイル) からデバッグ シンボルを削除することをお勧めします。 これは、Android NDK の arm-eabi-strip コマンドを使用して行います。

4)推奨されるメディア形式アプリケーションが画像、オーディオ、またはビデオに大きく依存している場合、APK ファイルのサイズを小さくするもう 1 つの方法は、特定のメディア形式を使用することです。 画像、オーディオ、およびビデオには、次のメディア形式を使用することをお勧めします。

  • ビデオ: H264 AVC を使用します。 ビデオをターゲット デバイスの画面解像度以下の解像度にエンコードします (既知の場合)。
  • オーディオ: AAC オーディオは、すべてのオーディオ リソースに推奨されます。 AAC は、mp3 や Ogg Vorbis と比較して、特定の品質でより優れた圧縮を実現します。 WAV などの生の形式は使用しないでください。 WAV 形式を使用する一般的な理由は、圧縮されたオーディオ ストリームをデコードすると、通常、再生時の待ち時間が長くなることです。 ただし、Android は、アプリケーションが高遅延のペナルティなしで圧縮されたオーディオ ストリームを使用できるようにする Sound Pool API を提供します。
  • 画像: PNG または JPEG。 PNG を使用します。 ロスレス形式であるため、圧縮による視覚的なアーティファクトがないため、テクスチャやアートワークに非常に適しています。 スペースに制約がある場合は、JPEG または PNG と JPEG の組み合わせを使用してください。 高品質の JPEG 画像は、JPEG 圧縮スキームが最適化されている、写真のようにリアルな大規模な画像に適しています。
  • 品質を落とさずに PNG サイズを最適化

2015 年に設定する 5 つの財務決議を読む必要があります

PNG 形式を使用する場合、PNG 画像は品質を損なうことなくファイル サイズを縮小できます。 これを行うには、OptiPNG や PNGCrush などのツールを使用します。 どちらも、画質を維持しながら PNG ファイルのサイズを縮小するのに最適です。 PNGcrush は、PNG フィルターと zlib (Deflate) パラメーターを反復処理し、各パラメーター構成を使用して画像を繰り返し圧縮し、最小の圧縮 (IDAT) 出力を生成する構成を選択するオープンソース プログラムです。 一方、OptiPNG は試行全体をメモリ内で実行し、最終的な出力ファイルのみをディスクに書き込みます。 さらに、複数の最適化プリセットをユーザーに提供します。

5) 未使用のリソースを削除する APK ファイルからの削除を検討すべきスペース浪費者のもう 1 つの潜在的なグループは、res ディレクトリ内の未使用のレイアウト、ドローアブル、色などの未使用のリソースです。 削除できる可能性のある APK 内の未使用のリソースを検出するには、android-unused-resources ツールを使用します。 Android Unused Resources は、プロジェクトをスキャンして未使用のリソースを探す Java アプリケーションです。

6) 重複の回避アプリに重複する機能や重複するアセットがないことを確認することは、APK に不要なファイルが含まれないようにするための明らかな方法です。 使用する Android API と、それぞれが提供する完全な機能を理解することが重要です。 ある Android API がすでに別の API の作業を行っている可能性があります。 重複したアセット (文字列、ビットマップなど) もスペースの無駄であり、簡単に回避できます。 程度は低いですが、複製されたコードは配信されるバイナリのサイズを不必要に増加させます。

7) メソッドの数を減らす 熱心なAndroid 開発者は、アプリで頭痛の種となる問題に長い間直面してきました。 アプリが持つことができるメソッドの数は限られています。 そうですね、以前は限定的でした。 とうとう、昨年 10 月に Google の優秀な人々が解決策を提供しましたが、それは理想からは程遠いものでした。 実装は非常に簡単ですが、multidex ソリューションは複雑で、コンパイル時間が大幅に長くなります。 じっとしているのではなく、Lollipop (Android 5.0) 以降、Android 仮想マシン全体が革命を起こし、より耐久性の高いソリューションを提供するようになり、通常のコンパイル時間よりも改善されました。 ただし、当分の間、Lollipop ソリューションも理想的ではありません。 開発者は Lollipop に対してのみ開発する必要があります。これは、ほとんどのアプリがより幅広いユーザー層との互換性を望んでおり、以前の Android バージョンでは利用できない機能を使用することを恐れている可能性があるため、問題になる可能性があります。 現時点では、Lollipop ソリューションは優れた将来の Android ソリューションですが、予見可能な現在にはあまり影響を与えない可能性があります。 では、その間に何ができるでしょうか? 65K の制限に達するのを避けるためだけに、機能をあきらめてはならないということには誰もが同意します。 ただし、アプリケーション メソッドの数を減らすことがベスト プラクティスであることは間違いありません。 では、アプリを特別なものにする小さな火花を失うことなく、メソッド数を減らすにはどうすればよいでしょうか?

フリーランスでキャリアを多様化する: 確実なメリット

簡単な概要: 「これらすべてのメソッドはどこから来たのか?」

メソッド数の制限は、およそ 65K メソッド (正確には 65,536) です。 それは膨大な数のように聞こえます。 あなたが初心者の Android 開発者であれば、「一体どうしてこれほど多くのアプリがこれほど早くこの数に達することができるのか?」と考えているかもしれません。 あなたはおそらくある程度正しいでしょう。 これほど多くのメソッドを自分で作成するのは簡単ではありません。 しかし、アプリ開発者はアプリ全体を自分で作成するわけではありません。 アプリ開発者は、ますます多くのサードパーティ ライブラリ (SDK – ソフトウェア開発キット) を使用しています。これは、そうでなければ完全に独自に開発しなければならない特定の目標と機能を達成するのに役立ちます。 広告から GUI の機能強化、ソーシャル ネットワーク、クラッシュ レポートなど、SDK はさまざまな機能と API を提供して、貴重な開発時間を節約し、アプリをより早くリリースできるようにします。 ただし、SDK ごとにメソッドの数が増え、一部の SDK は、交渉した以上のことを行っています。 もちろん、それは必ずしも悪いことではありません。 しかし、とどめの一撃は Google 自身からもたらされました。 同社の Google Play サービス キットは、28,000 を超えるメソッドを含む大規模な SDK です。 制限が 65K であるため、その数は正確に低くはありません。 また、多くのアプリ開発者は、この SDK を使用したいと考えています。この SDK は、魔法の Google 王国への扉を開くためです。これは、アプリに多くの価値を追加する待望の機能です。 この投稿では、Google Play Services パッケージを選択的に使用する方法を説明するだけでなく、これらのパッケージのそれぞれがアプリに追加するメソッドの数についても概説します. でこぼこ道になるので、席につかまってください。

Google Play サービス プレイグラウンド

では、Google Play Services は実際にいくつのメソッドを追加するのでしょうか? まあ、人生のすべてと同様に、それは単なる最終的な数字よりもはるかに複雑です. しかし、一度に一歩踏み出しましょう。 Google Play Services SDK には、実際には 19 の異なる SDK が含まれています。 Gradle を使用すると、使用するものを選択的に選択できます。 アプリ モジュールのbuild.gradleファイルに次の依存関係を追加するだけです。

 依存関係{
「com.google.android.gms:play-services:7.5.0」をコンパイルします
}

現時点でリリースされている最新の GPS バージョンは 7.5.0 です。 これは、Android SDK Manager 内でリビジョン 25 としてラベル付けされています。 特定のパッケージを選択するには、特定のパッケージを指定して、次の行を必要な数の依存関係行に置き換えます。 たとえば、Google プラス、Google ゲーム、Google 広告、Google マップだけが必要だとします。

 依存関係{
「com.google.android.gms:play-services-plus:7.5.0」をコンパイルします
「com.google.android.gms:play-services-games:7.5.0」をコンパイルします
「com.google.android.gms:play-services-ads:7.5.0」をコンパイルします
「com.google.android.gms:play-services-maps:7.5.0」をコンパイルします
}

それほど難しくはありませんが、ここが最初のキャッチです。 輝かしい 19 の SDK の 1 つは、play-services-base と呼ばれます。 Google Play Service パッケージを含めると、それも自動的に追加されます。 基本パッケージにはいくつのメソッドが含まれていますか? ほぼ 8,000 (以下の正確な数)。

フリーランス起業家の時代を読む必要があります: 新しいレベルのフリーランスを持つ人々

そして、これが2番目のキャッチです。 上記の例では、3 つのパッケージだけを含めていません。 基本パッケージも数えれば、4つも含めませんでした。 実際、私は5つのパッケージを含めました。 なんで? Google ゲームのパッケージは Google ドライブのパッケージを使用しているため、それもインポートされました (実際には、Google 広告 にはタグ マネージャーと呼ばれるパッケージも含まれていますが、ここでは「選択可能な」パッケージのみをカウントしています)。

これで、Google Play Services の各パッケージがアプリに追加するメソッドの数を数えるのが少し難しい理由がわかり始めました。 1 つのパッケージを含めることは、必ずしも他のパッケージを除外することを意味しません。

追加できるパッケージ、追加するメソッドの数、およびパーティーをクラッシュさせるために他のパッケージをもたらす. データは、Google Play Services の最新バージョン (7.5.0 / リビジョン 25) を参照しています。

Android 開発者が APK ファイルのサイズを小さくするためのヒント 2
メソッドの総数: 28175

メソッドの総数: 28,175.これらの数字のいくつかは、認めなければならないことですが、本当にひどいものです。 パノラマ パッケージだけが必要な場合は、9 つ​​のメソッドを取得するだけではなく、8,000 近くのメソッドを取得する必要があります。 非常に多くのアプリが 65K の制限に近づいている、または超えているのも不思議ではありません。

これらの数値の一部は、合計しようとすると少し矛盾しているように見える場合があります。 これもまた、Google Play Services の背後にあるロジックが見た目よりも少しトリッキーであるためです。 たとえば、Google アナリティクスには、アカウントの広告 ID を取得するために、Google 広告からのメソッドが 1 つ含まれています。

各パッケージがアプリに追加する量を計算するときは、必ず二重を除外してください (たとえば、基本パッケージを複数回カウントしないでください)。

すべてを選択的に追加することはできません

そして、ここに最後の刺し傷があります。 Google Play Services 内には、選択的に追加できない 2 つの小さなパッケージがあります。 検索パッケージ (Google Now API へのアクセスを提供) には 22 のメソッドしか含まれていません。 それを使用したい場合は、28,000 以上のメソッド全体、つまり Google Play サービス全体を追加するしかありません。 うまくいけば、これは後のバージョンで修正されるでしょう。

(もう 1 つの「アクセスできない」パッケージは、111 個のメソッドを含むappstateパッケージですが、現在は google-play-games パッケージに含まれているSavedGamesを支持して廃止されています)。

Truelancer でフリーランサーを雇う