ホームページ  >  記事  >  ウェブフロントエンド  >  apk痩身シリーズ③:無駄なリソースファイルを削除_html/css_WEB-ITnose

apk痩身シリーズ③:無駄なリソースファイルを削除_html/css_WEB-ITnose

WBOY
WBOYオリジナル
2016-06-21 08:54:551194ブラウズ

無駄なコードは削除できますし、もちろん無駄なリソースファイルも削除できます。この機能を有効にするには、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ファイルに含まれます。

resConfigs で定義できる画面密度属性は 1 つだけであることに注意してください。異なる画面密度を処理するには、後で完了する異なるバージョンの分割画面公開機能を使用できます。

resources.arsc の設定項目が緩い問題

このセクションで説明する問題は、通常、数千のリソース ファイルを使用する大規模なプロジェクトに当てはまります。

resources.arsc ファイルが不当に多くのスペースを占有していることが判明した場合、その原因は設定項目が緩いことが原因である可能性が高くなります。 この問題の原因を確認する例を見てみましょう:

デフォルトの文字列構成ファイル (values/strings.xml) に 5 つの文字列があるとします。これら 5 つの文字列の値は文字列プールで定義され、各文字列の識別子と対応するプール アドレスは別の場所に保存されます。そして、最終的に resource.arsc にコンパイルされたこれら 5 つの文字列の内容は、次のようになります。

android {    defaultConfig {        ...        resConfigs "en", "zh"    }}
android {    defaultConfig {        ...        resConfigs "en", "zh"    }}
Java

ここで、アプリケーションに新しい機能を追加するとします。その機能は API 21 以降にのみ存在します。新しい機能では、別の文字列コンテンツを表示する必要があるため、values-v21/strings.xml に文字列を追加することを選択します。

新しい 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
アプリケーションに -v21、-land、-en-land-v21 などのさまざまな構成項目がある場合。より多くのスペースが必要になります。

実際のシナリオでは、アプリケーションに 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!**
リソース ID は通常、xxx_xxxx.png などの長い名前になります。難読化コードのようにリソース ファイルを難読化できる場合は、resources.arsc のサイズに応じて削減することもできます。このファイルを使用すると、DexGuard または WeChat チームのリソース難読化ツールを使用して、この機能を実現できます。リソースの混乱の原則については、こちらを参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。