web-dev-qa-db-ja.com

Androidアプリ(apk)サイズを削減

これで、最初のアプリをGoogle Playストアで公開することになります。アプリで使用されている画像は既に圧縮されています。そして、アプリのサイズに関していくつか質問があります。

アプリのサイズが2 MB未満の場合、ユーザーがアプリをアンインストールする可能性は低くなります。

ただし、Windowsでapkファイルを表示すると3.10 MBが表示されますが、アプリ情報から表示されるようにデバイスにインストールされると表示されます:

Total............................8.68 MB
App..............................7.02 MB
USB storage app..................0.00 B
Data.............................1.66 MB (perhaps it is the size of sqlite db + ttf's)
SD card..........................0.00B

だから、なぜアプリのサイズがそんなに大きくなるのか、最小化できますか?

そして、私のプロジェクトでは、Android Private Librariesにある4つのライブラリー(jar)を使用していますが、これらのライブラリーのコピーもこのフォルダーの外にあります。

それらを削除する方が安全ですか?それらを削除するとapkサイズを小さくするのに役立ちますか?

また、Proguardの機能を説明する多くのWebページを訪問しました。Proguardがapkのサイズを削減し、未使用のコードを削除し、クラス、フィールド、メソッドの名前をセマンティックに変更することでコードを縮小、最適化、難読化する方法を本当に理解していますあいまいな名前。その結果、リバースエンジニアリングがより困難な、サイズの小さい.apkファイルが作成されます。しかし、私はproguard-project.txtがどのように見えるはずなのかわかりません。
アプリで4つのライブラリ、つまりeasyfacebookandroidsdk_2.3.jarAndroid-support-v7-appcompat.jargoogle-play-services.jarAndroid-support-v4.jarを使用しています。

現在、私のproguard-properties.txtはこのように見えますが、WebViewも使用していません

# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-Android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
#   http://developer.Android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;  
#}
-keep class com.facebook.** { *; }
-keepattributes Signature

だから、apkサイズを減らすために、未使用の参照、クラスなどを削除できるように、proguard-properties.txtにどの行を追加する必要がありますか?

https://code.google.com/p/Android-unused-resources/ にあるAndroidUnusedResources.jarを使用すると、Androidプロジェクトで未使用のリソースが見つかります。

これはプロガードがすでにやったことと同じだと思いますか?または、プロガードを有効にした後にも使用する必要がありますか?

また、共有する必要があると思われる欠落しているものを回答に記載することもできます。
前もって感謝します...

39
Vivek Warde

アプリのサイズを小さくする方法は次のとおりです。詳細は、次のリンクで説明されています。

https://medium.com/@fahimsakri/put-your-apks-on-diet-cc3f40843c84#.m860q8s1

  • プロガード
  • ベクトルドロウアブル
  • APKの分割
  • PNG画像を最適化する
  • 未使用のリソースを削除する
  • 9パッチ画像
  • Jpegイメージの圧縮
  • デバッグ情報を削除する
  • 重複を避ける
  • 糸くずを広範囲に使用する
  • 可能な限りリソースを再利用する
  • 推奨メディア形式
3
Fahim

だから、なぜアプリのサイズがそれほど大きくなるのか、最小化できますか?

.apkファイル

.apkファイルはまったく魔法ではありません。これはAndroidアプリケーションのコンテンツを表すファイルのバンドルです。アーカイブツール(7Zipなど)で開くと、ブラウザでコンテンツを抽出できます。

このapkファイルはインストール中に抽出されるため、アプリのサイズが増加します。

コンパイルに関する詳細

。Javaファイルはどうなりますか?

まあ、最初にインストールされたJDK実装によって通常コンパイルされます。 (.class-filesに)コンパイルされた後、Android SDKからのdx-toolは、これらの「通常の」JavaクラスをDalvik-Bytecodeにクロスコンパイルします。

この「特別な」Javaコードは、オープンソースのJRE実装Apache Harmonyに基づくDVM(Dalvik Virtual Machine)によって解釈されます。

/ asset-directoryに入れたリソースはどうなりますか?

Androidは、バイナリRAWファイル(SQLiteデータベースなど)を追加するための/ assets-directoryを提供しています。このディレクトリに配置されるファイルはコンパイルも最適化もされません。

このディレクトリにファイルを配置すると、これはAndroidに期待される種類の動作です。

/ res/raw-directoryに入れたリソースはどうなりますか?

/ assets-directoryと同様に、ここにバイナリ(または他の)生ファイル(たとえば、ヘルプページのHTMLファイル)を配置することもできます。これらのファイルはコンパイル/最適化されます(可能な場合)。

マニフェストと他のXMLファイルはどうなりますか?

Android-Manifestおよびその他のXMLファイル(レイアウト、文字列など)は保存され、バイナリXML形式に「コンパイル」されます。これは速度の最適化です。

インストール後にアプリのサイズが大きくなる理由がわかりました。

それらを削除する方が安全ですか(Androidライブラリ)、それらを削除するとapkサイズを小さくするのに役立ちますか?

_google-play-services.jar_は、開発環境でのみ必要であるため、ランタイム環境では必要ないため、削除できます。PlayStoreからインストールするようユーザーに促します。

Proguardへのアクセス::未使用のJavaクラスを削除し、コードの難読化を行います。レイアウトxmlなどの未使用のリソースは削除しません。したがって、私の意見では、ツールを実行して未使用のリソースを削除することです。

サイズを小さくするためのヒントを以下に示します。

_You can remove drawable-ldpi folder if you are using it.Since there are no more devices with ldpi screen resolution._

Reduce the use of image drawables(i.e .png or jpg files).Use xml drawables and 9-patch drawables.

_Remove any debug info related code._

_Avoid code duplication.Follow the principal of Don't Repeat yourself._

これでアプリのサイズを小さくするのに十分だと思います。

3

はるかに小規模なプロジェクトを行っている場合は、アプリ互換ライブラリをすべて削除することを検討してください。 APIの特定のバージョン用にアプリの複数のバージョンを作成した方がよい場合があります。互換性ライブラリを追加するだけで、47Kバイトのアプリバルーンが3Mバイトになるのを見ました。

概要:スペースを節約するために、不要なライブラリを回避します。Googleが提供するライブラリも含めます(ほとんどのテンプレートに含まれています!)。

2
Scott Biggs

http://developer.Android.com/tools/help/proguard.html を有効にしてみてください。難読化されていなくても。依存関係から未使用のJavaコードを削除します。不要な依存関係があるかどうかを確認します-追加したが使用していないJAR。大きな画像やその他のファイルのリソースを確認します。形式や解像度を変更したり、使用していない場合は削除したりします。

1

通常、ProGuardでは、次を使用してAPKを縮小できます(これはモジュールのbuild.gradleファイル):

...

Android {

    ...

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }

    ...

 }
 ...

具体的には、minifyEnabled trueおよびshrinkResources true

minifyEnabledは、コードファイル(Javaなど)を難読化および圧縮します。これはProGuardの主要な機能であり、APKを縮小するだけでなく、リバースエンジニアリングを困難にします。

shrinkResourcesは、未使用のリソースファイル(画像やその他のアセットなど)を削除するために使用されます。たとえば、Androidライブラリでコンパイルしているが、そのAndroidライブラリで一部の画像を使用していない場合、それらは最終版に含まれませんbuild。Android開発者向けのビデオがあります here

https://tinypng.com/ にアクセスできるように、すべてのPNGを圧縮するオプションの1つです。

その後、たとえば不要なライブラリのインポートを削除します。appcompatのv7を既にインポートしている場合、サポートライブラリv4をインポートする必要はありません。

最後に、apkの署名手順の完了後、詳細についてはAndroid-sdkに同梱されているzipalignツールを使用してください http://developer.Android.com/tools/help/zipalign.html を参照してください。

私が知っているのはそれで全てです。

1
Deep Shah

ほとんどの場合、アプリのサイズは、アプリケーションの作成に使用するリソースファイル(画像など)に比例します。常に以下を考慮してください。

  • 最小限の画像を使用してみてください。(ほとんどの場合、Ldpiフォルダーに画像を追加する必要はありません)。
  • すべての画面解像度の画像を配置する代わりに、ベクター画像を使用します。1つの方法は、SVG、9パッチを使用することです
  • Xml drawableを使用して、.png画像の代わりに正方形、長方形、円などの一般的な画像を作成してみてください。いくつかの画像圧縮技術を試してください。
  • Resフォルダーに保存するのではなく、Apiから大きな画像を取得してみてください(必要な場合のみダウンロードしてください)。

ライブラリのインポート

  • アプリストアのビルドを作成する際に、不要なライブラリを削除してください。
  • ライブラリに特定の機能が必要な場合は、ライブラリjar全体をインポートするのではなく、必要なクラスファイルを抽出して使用してください。
  • 未使用のインポートを削除して、クラスをクリーンアップします(ただし、サイズにはほとんど影響しませんが、よりシンプルでまっすぐになります)。
1
Abx

また、アプリでベクタードロウアブルを使用して、さまざまな画面サイズの複数のドロウアブルを削除し、APKサイズを小さくすることもできます。参照: https://stackoverflow.com/a/33984100/5305331

1
Ka Developer

別の答えを試すこともできますが、それらは非常に優れていますが、apkサイズの量を減らすための小さなトリックがあります。
プロジェクトでは多くのライブラリを使用しています。それらの一部はネイティブ言語(c)で開発され、一部はアーキテクチャの特定のバージョン用に開発されました。

いくつかのアーキテクチャがあります:

  • armeabi:Uncommon
  • armeabi-v7a:Common
  • arm64-v8a:Common
  • mips:Rare
  • mips64:Rare
  • x86:Common
  • x86_64:Uncommon

ターゲットアーキテクチャをフィルタリングし、不要なオプションを削除できます。例えば ​​:

buildTypes {
    debug {
        ...
    }
    release {
        ...
        ndk {
            abiFilters "arm64-v8a", "armeabi-v7a", "x86"
        }
    }
}
0
Arash Hatami

APK/Zipを高く再圧縮すると、Android SDK、通常のapkビルドよりも30%節約されます。大量のテキストファイルではなく、大量の画像の場合に便利です。

0
user2642486

ファイルサイズが増加するのは、APKが圧縮ファイルであるためです。 Proguardの使用が役立ちます-ここに良いリソースがあります:

http://developer.sonymobile.com/2012/01/31/tips-for-reducing-apk-file-size/

ただし、ファイルサイズを気にすることなく何百万ものダウンロードを取得できることを保証できます。私の個人的な経験からだけでなく、Google Playからも見ています。ファイルサイズが2 MBを大きく超えるダウンロードが数千あるアプリが何千もあります。実際、20MB程度の多くのものがあります。つまり、サイズを小さくするためにできることを行いますが、使用やダウンロードに影響することを心配しないでください。

0
Jim

まず、ドローアブルに目を向けます。

  1. PSDを使用してアプリの画像を取得している場合、それらの画像はWebおよびデバイス用に最適化されていない可能性があります。 Photoshopで「Webおよびデバイス用に保存」して、画像を最適化します。これにより、多くのKBを削減できます。
  2. 次に、画像をXMLドロアブルに置き換えることができるかどうかを確認します。たとえば、ボタンと背景はXMLを使用して実行できます
0
DanKodi

ブログを確認してください apkサイズを削減するさまざまな方法

主なポイントは次のとおりです。

  • Android.enableR8 = true //新しいR8コードシュリンクを有効にする
  • minifyEnabled true Proguardルールを追加
  • Android StudioのAPKアナライザーを使用してAPKを調べる
  • リソースの縮小を有効にする
  • PNG、JPEG、およびBMPをWebPに変換する
  • 列挙を避け、@ IntDefアノテーションを使用する
  • AaptOptions{cruncherEnabled = false}を使用して画像を圧縮します
  • 未使用リソースの削除Android studio組み込み関数を使用して、アプリケーション内の未使用リソースをすべて削除します
  • コードクリーンアップAndroid studio組み込み関数を使用して削除する

注:有効にしてください! (*すべてが後で機能するかどうかをダブルおよびトリプルチェックするだけです)

0

ProGuardはデフォルトで縮小、最適化、難読化を適用します。これが主な目的です。 Androidビルド、project.propertiesの文書化されたProGuard行を編集することにより、有効にする必要があります。AntおよびEclipseを使用したリリースビルドのProGuard 。Antを使用すると、ビルドログにProGuardの出力が表示されます。

Android documentation> Tools> ProGuard を参照してください。

その後、処理済みのアプリケーションを確認する必要があります。追加の-keepオプションが必要になる場合があります。おそらくGoogle Play Services用。保持できる量が少ないほど、アプリケーションは小さくなります。

0
Eric Lafortune

経験から指摘できることが2つあります。

Eclipseを使用してapkファイルを作成すると、リソースが複製されます(少なくとも私の場合は発生しました)。antとbuild.xmlを使用してapkを作成し、サイズを比較できます。リソースのエイリアシングも調べてください。

0
Uday Kumar