Google Play Services делает apk слишком большим

Я установил Google Play Services и создал приложение Hello World, чтобы проверить, что все работает нормально, и я думаю, что размер приложения слишком велик: 4,98 МБ. Я использую Android Studio, и я следил за инструкциями, содержащимися в веб-сайтах разработчиков Android.

Это мой файл gradle:

apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.1" defaultConfig { minSdkVersion 15 targetSdkVersion 19 versionCode 1 versionName "1.0" } buildTypes { release { runProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.google.android.gms:play-services:4.3.23' } 

РЕДАКТИРОВАТЬ

Это мой файл proguard:

 -keep class * extends java.util.ListResourceBundle { protected Object[][] getContents(); } -keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { public static final *** NULL; } -keepnames @com.google.android.gms.common.annotation.KeepName class * -keepclassmembernames class * { @com.google.android.gms.common.annotation.KeepName *; } -keepnames class * implements android.os.Parcelable { public static final ** CREATOR; } 

** РЕДАКТИРОВАТЬ 2 **

Я установил Google Play Services, используя последнюю версию Intellij Idea, и теперь apk составляет 3,52 МБ. Я не знаю, является ли это приемлемым размером.

Это нормально?

Solutions Collecting From Web of "Google Play Services делает apk слишком большим"

Нет, это не нормально – более ранние сборки моего приложения GPSTest, в том числе сервисы Google Play для карт, были всего лишь 808 КБ после того, как они были запутаны с использованием версии Proguard-current (после добавления другой библиотеки) примерно на 1,497 КБ после обфускации.

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

  1. Перейти к корню проекта в командной строке
  2. Run gradlew assembleRelease
  3. Найти подписанную и запутанную APK в папке /app/build/apk

Если вы экспортируете APK через Android Studio, имейте в виду, что существует известная проблема, при которой Android Studio будет экспортировать, используя задачу assembleRelease задачу assembleRelease по умолчанию. В результате любые конфигурации вашего файла build.gradle для запуска Proguard, специфичные для типа buildType, не будут выполнены.

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

  1. В Android Studio откройте «View-> Tool Windows-> Build Variants»,
  2. В открывшемся окне измените «Build Variant» на debug до release .

Теперь, когда вы создаете «Build-> Generate Signed APK …», Android Studio должна запустить выпуск Build Variant, который должен запускать Proguard, если вы правильно настроили его в build.gradle . Вы можете вернуться к варианту отладки во время отладки вашего приложения на обычной основе.

Если вы хотите скопировать мои настройки из 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:4.4.0@aar' 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 v6.5 или выше – это включить только библиотеку для этой функции в сервисах Google Play, которую вы фактически используете.

Например, если единственным API-интерфейсом Google Play Services, который вы используете, является Maps API v2, вместо того, чтобы включать всю библиотеку build.gradle 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 приглашает 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 Cloud Messaging 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 Mobile Ads com.google.android.gms:play-services-ads:7.8.0
  • Mobile Vision 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

Хорошо, наконец, я столкнулся с проблемой (благодаря @Sean Barbeau). Это был файл build.gradle моего модуля. В разделе BuildTypes меня был release вместо debug и я развертывал отладочную версию … Я изменил это, и теперь мое приложение составляет всего 1,17 МБ!

 buildTypes { debug { runProguard true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } 

РЕДАКТИРОВАТЬ

Как указывал @SeanBarbeau, runProguard имеет значение true в режиме отладки. Если я установил false мое приложение снова будет большим (5 МБ).