無駄なコードは削除できますし、もちろん無駄なリソースファイルも削除できます。この機能を有効にするには、gradle 属性 shrinResources を true に設定するだけです。
build.gradle
Java
android { ... buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}
android { ... buildTypes { release { minifyEnabledtrue shrinkResourcestrue proguardFilesgetDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}
一部のリソースが誤って削除された場合、コードが (リフレクション経由で) 使用される場合、これらのリソースは tools:keep 属性を通じて保持できます。管理を容易にするために、ProGuard の構成ファイルと同様に、保持する必要があるすべてのリソースを保持する別のファイルを作成することもできます:
res/raw/keep.xml
🎜>
<?xml version="1.0" encoding="utf-8"?><resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"/>
<?xmlversion="1.0" encoding="utf-8"?><resourcesxmlns:tools="http://schemas.android.com/tools" tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"/>
ResConfigs を使用して不要な構成タイプを削除します
さまざまなサードパーティ ライブラリが文字列リソースをさまざまな言語に変換します。たとえば、サポート ライブラリや Google Play サービスは数十の言語をサポートしています。ただし、アプリケーションは 1 つまたは複数の言語のみをサポートする場合があります。resConfigs オプションを使用して、アプリケーションがこれらの構成された言語のみをサポートすることをコンパイラーに伝えることができます。
build .gradle
Java
<?xml version="1.0" encoding="utf-8"?><resources xmlns:tools="http://schemas.android.com/tools" tools:shrinkMode="safe" tools:discard="@layout/unused2"/>
<?xmlversion="1.0" encoding="utf-8"?><resourcesxmlns:tools="http://schemas.android.com/tools" tools:shrinkMode="safe" tools:discard="@layout/unused2"/>
上記の構成では、中国語と英語のリソース ファイルのみが保持されます。他のリソース ファイルは保持されません。最終的なapkファイルに含まれます。
resources.arsc の設定項目が緩い問題
このセクションで説明する問題は、通常、数千のリソース ファイルを使用する大規模なプロジェクトに当てはまります。
resources.arsc ファイルが不当に多くのスペースを占有していることが判明した場合、その原因は設定項目が緩いことが原因である可能性が高くなります。 この問題の原因を確認する例を見てみましょう:
デフォルトの文字列構成ファイル (values/strings.xml) に 5 つの文字列があるとします。これら 5 つの文字列の値は文字列プールで定義され、各文字列の識別子と対応するプール アドレスは別の場所に保存されます。そして、最終的に resource.arsc にコンパイルされたこれら 5 つの文字列の内容は、次のようになります。
android { defaultConfig { ... resConfigs "en", "zh" }}
android { defaultConfig { ... resConfigs "en", "zh" }}
新しい v21 文字列を追加するだけで、resources.arsc の内容は次のようになります:
Java
各構成項目はすべてのリソース ファイルのスペースを占有しますが、実際には、他の文字列が指すアドレスは v21 では null ですが、依然として同じバイト数を占有します。識別子ごとに 4 バイト。
String pool: "My App", "Hello", "Exit", "Settings", "Feature" Default config: string/myapp 0x00000001string/hello 0x00000002string/exit 0x00000003string/settings 0x00000004string/feature 0x00000005
String pool: "My App", "Hello", "Exit", "Settings", "Feature" Default config: string/myapp 0x00000001string/hello 0x00000002string/exit 0x00000003string/settings 0x00000004string/feature 0x00000005
実際のシナリオでは、アプリケーションに 3500 個の文字列があるが、別の構成項目で別途定義された特別な文字列があり、変更された文字列を他の 50 の言語に翻訳する必要があるとします (つまり、つまり、values-en-land、-pl-land、-de-land、-fr-land... などの 50 個のディレクトリが存在し、次の追加スペースが必要になります:
4 バイト * 3500 個の null エントリ * 50 言語 = 700 キロバイト
この特別な文字列を削除すると、700 KB のスペースを節約できます。 一部の大規模プロジェクトでは、3 つのリソースを削除するだけで 2.5M のスペースを節約できます。
この特殊なケースでは、ほんの数文字列を追加するだけで APK ファイルが非常に大きくなることがわかった場合、これらの特殊な文字列をデフォルトの構成項目で定義し、実行時にどの文字列を追加するかを検討できます。使用はシステム構成に基づいて動的に選択されます。
リソース ID の難読化String pool: "My App", "Hello", "Exit", "Settings", "Feature", "New feature" Default config: -v21 config:string/myapp 0x00000001 NO_ENTRYstring/hello 0x00000002 NO_ENTRYstring/exit 0x00000003 NO_ENTRYstring/settings 0x00000004 NO_ENTRYstring/feature 0x00000005 0x00000006 ========== ==========Config size: 20 bytes **20 bytes!**
String pool: "My App", "Hello", "Exit", "Settings", "Feature", "New feature" Default config: -v21config:string/myapp 0x00000001 NO_ENTRYstring/hello 0x00000002 NO_ENTRYstring/exit 0x00000003 NO_ENTRYstring/settings 0x00000004 NO_ENTRYstring/feature 0x00000005 0x00000006 ========== ==========Configsize: 20 bytes **20 bytes!**