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


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

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

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

2 61

2 ответа:

этот ответ суммируется из Удаление Неиспользуемых Ресурсов что объясняет, как использовать 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 для удаления путей кода, которые не используются вашим приложением. Это важный шаг в удалении ресурсов из библиотеки. Если пути кода не удаляются, то компилятор все равно будет считать, что на ресурсы ссылается существующий путь кода и не будет удалять их должным образом.

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

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

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

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

defaultConfig {
    resConfig "en"     
}