Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用Proguard删除Google Play Services库中未使用的类_Android_Google Play Services_Proguard_Android Gradle Plugin_Build.gradle - Fatal编程技术网

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
配合使用应该可以完成这项工作!谢谢