Обезжириваем apk
Что из себя представляет apk файл?
Это просто архив с ресурсами и кодом приложения.
Если, например, картинки и файлы xml ужать серьезно не получится, то вот сам код ужать можно.
Возможно, это потому, как в каждом проекте есть не используемые части библиотек.
Наше IDE по умолчанию соберёт все, что только есть, и конечный apk получится большим.
Стоить заметить , что в старой виртуальной машине есть ограничение Dalvik 65K methods limit, т.е.вы можете ссылаться на очень большое число методов в DEX файле, но вызывать можете только первые 65536, потому что это вся память, которая у вас есть для инструкции вызова метода, львиную долю которых может съесть одна только Google Play Services.
В недавно в неё включили аналитику, которая до этого была отдельной библиотекой.
Поэтому Google Play Services растет, как на дрожжах.
На помощь нам пришла сама Google, т.к.начиная с версии 6.5 сервисы Google Play могут подключаться в виде нескольких небольших клиентских библиотек.
Нам остается только выбрать необходимые модули, а не таскаться со всей пачкой сервисов.
Весь пакет описанных сервисов подключается в файле build.gralde вот так:
dependencies { compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.google.android.gms:play-services:+' }
Библиотеку поддержки appcompat, я не знаю как можно урезать, а вот вторую знаю, мы возьмем только модуль с рекламой (ads) :
dependencies { compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.google.android.gms:play-services-ads:+' }
Знак + обозначает, что нужно брать последнюю версию.
Чтобы обрезать не нужный код, так же был придуман инструмент ProGuard.
Как ясно сказано в документации, он может обрезать, оптимизировать и обфусцировать (сделать не читаемым) наш код.
Для его включения нужно выставить в build.gralde свойство minifyEnabled в true и добавить файл proguard-rules.txt в папку app.
buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } }
В этом файле нужно прописать правила для работы proguard.
Как я понял, достаточно указать в нем классы, упомянутые в манифесте.
-keep public class <MainActivity>
И так мы можем обрезать все с помощью proguard, можем взять библиотеку полегче, а можем сделать и то и другое, а потом посмотреть на полученный apk.
Теперь покажу, что получилось после всех этих манипуляций.
Разница очевидна, удачного обезжиривания!
Ответить
Хотите присоединиться к обсуждению?Не стесняйтесь вносить свой вклад!