Ответ 1
Нет, это не нормально - более ранние сборки моего приложения GPSTest, в которое включены сервисы Google Play для карт, были только 808 КБ после того, как были запутаны с использованием Proguard- текущая версия (после добавления другой библиотеки) составляет около 1,497 КБ после обфускации.
Я бы рекомендовал экспортировать APK из командной строки, выполнив следующие шаги, чтобы избежать возможных проблем с Android Studio:
- Перейти к корню проекта в командной строке
- Выполнить
gradlew assembleRelease
- Найти подписанный и обфусканный APK в папке
/app/build/apk
Если вы экспортируете APK через Android Studio, имейте в виду, что существует известная проблема , где Android Studio будет экспортировать с помощью assembleDebug
вместо задачи assembleRelease
по умолчанию. В результате любые конфигурации вашего файла build.gradle
для запуска Proguard, специфичные для типа buildType, не будут выполнены.
В качестве обходного пути для экспорта через Android Studio вы можете изменить стандартный вариант сборки, выполнив следующие шаги:
- В Android Studio откройте "View- > Tool Windows- > Build Variants"
- В открывшемся окне измените "Build Variant" с
debug
наrelease
.
Теперь, когда вы создаете "Build- > Generate Signed APK...", Android Studio должна запустить версию Build Variant, которая должна запускать Proguard, если вы правильно настроили ее в build.gradle
. Вы можете вернуться к варианту debug
во время отладки вашего приложения на обычной основе.
Если вы хотите скопировать мои настройки из GPSTest, здесь proguard.cfg
:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.preference.Preference
-keepclasseswithmembers class * {
native <methods>;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-keep class * extends java.util.ListResourceBundle {
protected Object[][] getContents();
}
-dontwarn **CompatHoneycomb
-dontwarn **CompatCreatorHoneycombMR2
-dontwarn **AccessibilityServiceInfoCompatJellyBeanMr2
-dontwarn android.support.v4.view.**
-dontwarn android.support.v4.media.**
-dontwarn com.actionbarsherlock.internal.**
-keep class android.support.v4.** { *; }
-keepattributes *Annotation*
-keep public class * extends android.view.View
-keep public class * extends android.view.ViewGroup
-keep public class * extends android.support.v4.app.Fragment
-keepclassmembers class * extends com.actionbarsherlock.ActionBarSherlock {
<init>(android.app.Activity, int);
}
... и build.gradle
:
apply plugin: 'android'
android {
compileSdkVersion 19
buildToolsVersion "19.0.0"
defaultConfig {
minSdkVersion 8
targetSdkVersion 19
}
if (project.hasProperty("secure.properties")
&& new File(project.property("secure.properties")).exists()) {
Properties props = new Properties()
props.load(new FileInputStream(file(project.property("secure.properties"))))
signingConfigs {
debug {
storeFile file("gpstest.debug.keystore")
}
release {
storeFile file(props['key.store'])
keyAlias props['key.alias']
storePassword "askmelater"
keyPassword "askmelater"
}
}
} else {
signingConfigs {
debug {
storeFile file("gpstest.debug.keystore")
}
release {
// Nothing here
}
}
}
buildTypes {
release {
runProguard true
proguardFile 'proguard.cfg'
signingConfig signingConfigs.release
}
}
}
task askForPasswords << {
// Must create String because System.readPassword() returns char[]
// (and assigning that below fails silently)
def storePw = new String(System.console().readPassword("\nKeystore password: "))
def keyPw = new String(System.console().readPassword("Key password: "))
android.signingConfigs.release.storePassword = storePw
android.signingConfigs.release.keyPassword = keyPw
}
tasks.whenTaskAdded { theTask ->
if (theTask.name.equals("packageRelease")) {
theTask.dependsOn "askForPasswords"
}
}
dependencies {
compile project(':ShowcaseViewLibrary')
compile 'com.google.android.gms:play-services:3.2.65'
compile 'com.actionbarsherlock:actionbarsherlock:[email protected]'
compile 'org.jraf:android-switch-backport:1.2'
compile 'com.google.maps.android:android-maps-utils:0.2.1'
}
Целый исходный код GPSTest доступен в Github, если вы хотите использовать его в качестве образца.
ИЗМЕНИТЬ
Другой способ уменьшить APK при использовании функций из Google Play Services версии 6.5 или выше - это включить только библиотеку для этой функции в сервисах Google Play, которую вы фактически используете.
Например, если единственным API-интерфейсом Google Play Services, который вы используете, является API Карт v2 вместо того, чтобы включать всю библиотеку Служб Google Play в build.gradle
:
compile 'com.google.android.gms:play-services:7.8.0'
... вы можете просто добавить часть Maps API v2:
compile 'com.google.android.gms:play-services-maps:7.8.0'
Подробнее о том, какие API вы можете разделить, см. в разделе "Службы Google Play -" Выборочная компиляция API в ваш исполняемый файл". Вот список по состоянию на сентябрь 2015 года:
- Google+
com.google.android.gms:play-services-plus:7.8.0
- Вход в учетную запись Google
com.google.android.gms:play-services-identity:7.8.0
- Действия Google, базовая клиентская библиотека
com.google.android.gms:play-services-base:7.8.0
- Индексирование приложений Google
com.google.android.gms:play-services-appindexing:7.8.0
- Google App Invites
com.google.android.gms:play-services-appinvite:7.8.0
- Google Analytics
com.google.android.gms:play-services-analytics:7.8.0
- Google Cast
com.google.android.gms:play-services-cast:7.8.0
- Облачные сообщения Google
com.google.android.gms:play-services-gcm:7.8.0
- Google Диск
com.google.android.gms:play-services-drive:7.8.0
- Google Fit
com.google.android.gms:play-services-fitness:7.8.0
- Местоположение Google, Распознавание активности и места
com.google.android.gms:playservices-location:7.8.0
- Карты Google
com.google.android.gms:play-services-maps:7.8.0
- Объявления Google для мобильных устройств
com.google.android.gms:play-services-ads:7.8.0
- Мобильное зрение
com.google.android.gms:play-services-vision:7.8.0
- Google поблизости
com.google.android.gms:play-services-nearby:7.8.0
- Google Panorama Viewer
com.google.android.gms:play-services-panorama:7.8.0
- Службы Google Play Game
com.google.android.gms:play-services-games:7.8.0
- SafetyNet
com.google.android.gms:play-services-safetynet:7.8.0
- Google Кошелек
com.google.android.gms:play-services-wallet:7.8.0
- Android Wear
com.google.android.gms:play-services-wearable:7.8.0