Как удалить неиспользуемые ресурсы из сторонних библиотек Ive, включенных в Android?

Сторонние библиотеки, которые я связываю с моим приложением, часто включают файлы ресурсов, которые не используются моим приложением, и, как таковые, заканчивают раздувание моего APK.

Например, включая библиотеку сервисов Google Play, но не используя функциональность кнопки входа в систему; все эти ресурсы изображения и компоновки заканчиваются в моей окончательной сборке.

Поскольку эти ресурсы включены в скомпилированную библиотеку, как я могу удалить их из своей сборки?

Ответ 1

Этот ответ обобщен из Удаление неиспользуемых ресурсов, в котором объясняется, как использовать minifyEnabled и shrinkResources, которые более подробно рассматриваются в Официальная страница документа.

Его общая проблема для сторонних библиотек заключается в том, чтобы включать в себя активы, которые не используются в коде приложения, и критически важно удалить эти активы для создания небольших файлов APK для ваших пользователей. К счастью, последняя версия Gradle и Android Studio предоставляет решение для помощи.

Установив minifyEnabled и shrinkResources в true в конфигурации Gradle, система продолжит удаление неиспользуемых ресурсов из вашего приложения.

android {
    ...

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

Важно отметить, что для удаления неиспользуемых ресурсов требуется установить флаг minifyEnabled. Этот флаг (как указано в Удаление неиспользуемого кода) заставит ProGuard удалить пути кода, которые не используются в вашем приложении. Это важный шаг в удалении ресурсов из включенных библиотек. Если код path arents удален, то компилятор по-прежнему будет считать, что ресурсы ссылаются на существующую кодировку и не удаляют их должным образом.

Стоит отметить, что это довольно обширная система. Например, он будет просматривать конкретные строковые константы в вашем коде, а также различные ресурсы res/raw, которые ищут любые URL-адреса в форме file:///…. для сохранения. Это даже дойдет до анализа CSS, HTML и файлов JavaScript.

Теперь могут быть случаи ложных срабатываний или ложных негативов. Активы могут быть сокращены или сохранены, когда вы хотите иметь противоположное поведение. (Чтобы быть справедливым, сокращение ресурсов имеет тенденцию быть чрезмерным...) Чтобы настроить это, вы можете добавить атрибуты tools: keep и : отменить, чтобы определить желаемое поведение, по соглашению в файле res/raw/keep.xml.

<resources xmlns:tools="http://schemas.android.com/tools"
     tools:keep= "@layout/l_used*_c,  @layout/l_used_b*"
     tools:discard="@layout/unused2"
/>

Ответ 2

Если вы не можете использовать shrinkResources по некоторым причинам, по крайней мере, мы можем использовать resConfig для удаления языков, которые мы не поддерживаем.

defaultConfig {
    resConfig "en"     
}