Android 谷歌Play服务让apk变得太大
我已经安装了Google Play服务,并创建了一个Hello World应用程序来测试一切是否正常,我认为应用程序的大小太大了:4.98 MB。 我使用的是Android Studio,我遵循了Android开发者网站上的详细说明 这是我的gradle文件: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 {
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
文件夹中查找已签名和模糊的APKassembleDebug
任务而不是assembleRelease
任务导出APK。因此,将不会执行build.gradle
文件中运行Proguard的、特定于发行版buildType的任何配置
作为通过Android Studio导出的变通方法,您可以通过以下步骤更改默认构建变量:
debug
更改为release
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吗?我不认为你需要加入