Android 使用Proguard删除Google Play Services库中未使用的类
我试图从Android 使用Proguard删除Google Play Services库中未使用的类,android,google-play-services,proguard,android-gradle-plugin,build.gradle,Android,Google Play Services,Proguard,Android Gradle Plugin,Build.gradle,我试图从googleplayservices库中删除未使用的类。我已经创建了一个全新的android项目,只有一个空活动。项目不使用Google Play Services库中的任何内容。所以我希望,当我构建发行版(包括在我的配置中运行proguard)时,我将看到,与构建有/没有播放服务依赖项相比,二进制大小没有任何差异。但事实上,我看到在apk大小上有约700kb的差异 我发现,这涉及到重新打包play-services.jar文件。此外,此解决方案需要明确指定不使用的每个包。但是我不明白为
googleplayservices
库中删除未使用的类。我已经创建了一个全新的android项目,只有一个空活动。项目不使用Google Play Services
库中的任何内容。所以我希望,当我构建发行版(包括在我的配置中运行proguard)时,我将看到,与构建有/没有播放服务
依赖项相比,二进制大小没有任何差异。但事实上,我看到在apk
大小上有约700kb的差异
我发现,这涉及到重新打包play-services.jar文件。此外,此解决方案需要明确指定不使用的每个包。但是我不明白为什么在我的情况下,proguard
不这样做
build.gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.1"
defaultConfig {
minSdkVersion 10
targetSdkVersion 21
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
// !!! when I comment the line below, release APK is 700 KB smaller !!! //
compile 'com.google.android.gms:play-services:6.5.87'
}
-assumenosideeffects class android.util.Log {
public static *** d(...);
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.noplayservices">
<application android:allowBackup="true"
android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme">
<activity android:name=".ui.activities.MainActivity" android:icon="@drawable/ic_launcher">
<intent-filter>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
package com.test.noplayservices.ui.activities;
import android.app.Activity;
import android.os.Bundle;
import com.test.noplayservices.R;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
setContentView(R.layout.main_activity);
}
}
proguard规则。pro:
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.1"
defaultConfig {
minSdkVersion 10
targetSdkVersion 21
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
// !!! when I comment the line below, release APK is 700 KB smaller !!! //
compile 'com.google.android.gms:play-services:6.5.87'
}
-assumenosideeffects class android.util.Log {
public static *** d(...);
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.noplayservices">
<application android:allowBackup="true"
android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme">
<activity android:name=".ui.activities.MainActivity" android:icon="@drawable/ic_launcher">
<intent-filter>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
package com.test.noplayservices.ui.activities;
import android.app.Activity;
import android.os.Bundle;
import com.test.noplayservices.R;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
setContentView(R.layout.main_activity);
}
}
AndroidManifest.xml:
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.1"
defaultConfig {
minSdkVersion 10
targetSdkVersion 21
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
// !!! when I comment the line below, release APK is 700 KB smaller !!! //
compile 'com.google.android.gms:play-services:6.5.87'
}
-assumenosideeffects class android.util.Log {
public static *** d(...);
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.noplayservices">
<application android:allowBackup="true"
android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme">
<activity android:name=".ui.activities.MainActivity" android:icon="@drawable/ic_launcher">
<intent-filter>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
package com.test.noplayservices.ui.activities;
import android.app.Activity;
import android.os.Bundle;
import com.test.noplayservices.R;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
setContentView(R.layout.main_activity);
}
}
从Google Play Services 6.5版及更高版本中,您可以选择要使用的单个API,并仅导入这些API。也许这将帮助您减少一点APK大小。以下是一份清单:
Google+ com.google.android.gms:play-services-plus:6.5.+
Google Account Login com.google.android.gms:play-services-identity:6.5.+
Google Activity Recognition com.google.android.gms:play-services-location:6.5.+
Google App Indexing com.google.android.gms:play-services-appindexing:6.5.+
Google Cast com.google.android.gms:play-services-cast:6.5.+
Google Drive com.google.android.gms:play-services-drive:6.5.+
Google Fit com.google.android.gms:play-services-fitness:6.5.+
Google Maps com.google.android.gms:play-services-maps:6.5.+
Google Mobile Ads com.google.android.gms:play-services-ads:6.5.+
Google Panorama Viewer com.google.android.gms:play-services-panorama:6.5.+
Google Play Game services com.google.android.gms:play-services-games:6.5.+
Google Wallet com.google.android.gms:play-services-wallet:6.5.+
Android Wear com.google.android.gms:play-services-wearable:6.5.+
Google Actions
Google Analytics
Google Cloud Messaging com.google.android.gms:play-services-base:6.5.+
您可以了解更多信息。Proguard删除了未使用的类,但我不确定它是否会删除
公共静态数据,或者静态初始值设定项会发生什么情况。我打赌这些课程没有被删除。由于GooglePlay服务是一个庞大的库,它的所有类都是相互关联的,我想这种方法与您的观点类似:只需尝试从库jar中提取您需要的类。顺便说一句,我使用的是一个比现在小得多的旧罐子,去年它们的大小增长了3倍。另外,你可以做的是,将你的700kb APK上传到一个网站,将你的APK反编译成源代码,看看包含了哪些GPS类,并试着理解其中的原因。至少可以定义规则来排除这些类。记住要禁用模糊处理,清楚地看到包含的类!您可能还需要添加shrinkResources true
-请参阅@miav谢谢!这正是我需要的@miav,不幸的是,它并没有真正改变什么。实际上,从播放服务
中,我只需要广告
和分析
ads
作为独立软件包提供,但analytics
是base
软件包的一部分,该软件包包含600KB的资源(ads
或analytics
均不使用这些资源)。所以我预计shirnkResources将删除大部分600KB,但它没有。我仍然有700KB的apk此解决方案与@miav建议的shrinkResources
配合使用应该可以完成这项工作!谢谢