Android 谷歌Play服务让apk变得太大

Android 谷歌Play服务让apk变得太大,android,android-studio,google-play-services,Android,Android Studio,Google Play Services,我已经安装了Google Play服务,并创建了一个Hello World应用程序来测试一切是否正常,我认为应用程序的大小太大了:4.98 MB。 我使用的是Android Studio,我遵循了Android开发者网站上的详细说明 这是我的gradle文件: apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.1" defaultConfig {

我已经安装了Google Play服务,并创建了一个Hello World应用程序来测试一切是否正常,我认为应用程序的大小太大了:4.98 MB。 我使用的是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**

我已经使用Intellij Idea的最新版本安装了Google Play服务,现在apk是3.52 MB。我不知道这个尺寸是否可以接受


这正常吗?

不,这不正常-我的早期版本(包括Google Play Services for maps)在使用Proguard进行模糊处理后仅为808KB-当前版本(添加另一个库后)在模糊处理后约为1497KB

我建议使用以下步骤从命令行导出APK,以避免Android Studio的潜在问题:

  • 在命令行中转到项目的根目录
  • 运行
    gradlew assembleerelease
  • /app/build/APK
    文件夹中查找已签名和模糊的APK
  • 如果您是通过Android Studio导出APK,请注意,在默认情况下,Android Studio将使用
    assembleDebug
    任务而不是
    assembleRelease
    任务导出APK。因此,将不会执行
    build.gradle
    文件中运行Proguard的、特定于发行版buildType的任何配置

    作为通过Android Studio导出的变通方法,您可以通过以下步骤更改默认构建变量:

  • 在Android Studio中,打开“查看->工具窗口->构建变体”
  • 在打开的窗口中,将“构建变量”从
    debug
    更改为
    release
  • 现在,当您执行“Build->Generate Signed APK…”时,Android Studio应该运行release Build Variant,如果您在
    Build.gradle
    中正确配置了它,它应该运行Proguard。在正常情况下调试应用程序时,您可以切换回
    debug
    variant

    如果您想从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);
    }
    
    如果您想将其用作示例,则整个GPSTest源代码都是可用的

    编辑

    当使用Google Play Services v6.5或更高版本的功能时,另一种帮助缩小APK的方法是只在Google Play Services中包含您实际使用的功能库

    例如,如果您使用的唯一Google Play Services API是Maps API v2,而不是将整个Google Play Services库包含在
    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'
    }
    
    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的详细信息,请参见本节。以下是截至2015年9月的清单:

    • 谷歌+
      com.Google.android.gms:play services plus:7.8.0
    • 谷歌账号登录
      com.Google.android.gms:play服务标识:7.8.0
    • Google Actions,Base Client Library
      com.Google.android.gms:play services Base:7.8.0
    • 谷歌应用程序索引
      com.Google.android.gms:play services应用程序索引:7.8.0
    • 谷歌应用邀请
      com.Google.android.gms:play services应用邀请: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
    • 谷歌云消息
      com.Google.android.gms:play services gcm:7.8.0
    • 谷歌硬盘
      com.Google.android.gms:play services硬盘:7.8.0
    • Google Fit
      com.Google.android.gms:play services fitness:7.8.0
    • 谷歌位置、活动识别和地点
      com.Google.android.gms:playservices位置:7.8.0
    • 谷歌地图
      com.Google.android.gms:play services地图:7.8.0
    • 谷歌移动广告
      com.Google.android.gms:play服务广告:7.8.0
    • Mobile Vision
      com.google.android.gms:play services Vision:7.8.0
    • 谷歌附近
      com.Google.android.gms:附近播放服务:7.8.0
    • Google Panorama Viewer
      com.Google.android.gms:play services Panorama:7.8.0
    • Google Play Game services
      com.Google.android.gms:Play services games:7.8.0
    • SafetyNet
      com.google.android.gms:play services SafetyNet:7.8.0
    • 谷歌钱包
      com.Google.android.gms:play services钱包:7.8.0
    • Android Wear
      com.google.Android.gms:play services wearable:7.8.0

      • 好的,我终于遇到了这个问题(多亏了@Sean Barbeau)。这是我模块的
        build.gradle
        文件。在
        BuildTypes
        部分,我使用了
        release
        而不是
        debug
        ,并且我正在部署调试版本。。。我已经改变了,现在我的应用程序只有1.17MB

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


        正如@SeanBarbeau所指出的,
        runProguard
        在调试模式下设置为
        true
        。如果我设置了
        false
        ,那么我的应用程序又变大了(5 MB大小)。

        如果你将
        runProguard
        设置为
        true
        ,会怎么样?我已经试过了。相同的apk大小为4.98MB,因此您以错误的方式配置它。Proguard将apk大小减少了一半。我已经包含了我的Proguard文件。谢谢。我看到你有
        proguard.cfg
        ,我的是
        proguard rules.txt
        。也许它们是不同的文件?我没有任何其他proguard文件。我创建了一个与您类似的
        proguard.cfg
        (不完全相同)并更新了
        build.gradle
        ,但仍然获得相同的apk大小。还有一个问题,谷歌Play服务需要Android支持库吗?因为它包含在我的项目的外部库中。您正在使用
        gradlew assembleerelease
        打包APK吗?我不认为你需要加入