6

Ich versuche, die nicht verwendeten Klassen aus der Bibliothek Google Play Services zu entfernen. Ich habe ein brandneues Android-Projekt mit einer einzigen leeren Aktivität erstellt. Das Projekt verwendet nichts aus Google Play Services Bibliothek. So würde ich erwarten, dass, wenn ich Release baue (was beinhaltet, dass proguard in meiner Konfiguration läuft), ich keinen Unterschied in der binären Größe sehen werde, die Gebäude mit/ohne play-services Abhängigkeit vergleicht. Aber eigentlich sehe ich ~ 700 KB Unterschied in apk Größe.Verwenden von Proguard zum Entfernen nicht verwendeter Klassen in der Google Play Services-Bibliothek

Ich habe relatively complex solution, using gradle script gefunden, was das Umpacken von play-services.jar-Datei beinhaltet. Außerdem muss bei dieser Lösung jedes Paket explizit angegeben werden, das nicht verwendet wird. Aber ich verstehe nicht warum funktioniert das nicht proguard in meinem Fall?

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' 
} 

proguard-rules.pro:

-assumenosideeffects class android.util.Log { 
    public static *** d(...); 
} 

AndroidManifest.xml:

<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> 

MainActivity.java:

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); 
    } 
} 
+0

Proguard entfernt nicht verwendete Klassen, aber ich bin mir nicht sicher, ob es 'public static' Daten oder was mit' static initializers' passiert. Ich wette, die Klassen werden nicht entfernt. Da es sich bei Google Play um eine mammooth-Bibliothek mit all ihren miteinander verbundenen Klassen handelt, wird der Ansatz ähnlich dem sein, worauf Sie hindeuten: Versuchen Sie einfach, die benötigten Klassen aus dem Bibliotheksjar zu extrahieren. BTW: Ich benutze ein altes Glas, das viel kleiner ist als die jetzigen, sie sind im letzten Jahr 3 mal größer geworden. – rupps

+0

auch, was Sie tun können, ist Ihre 700kb APK auf eine Website wie http://www.decompileandroid.com/ hochladen, erhalten Sie Ihre APK in Quellcode dekompiliert, und sehen, welche GPS-Klassen enthalten sind und versuchen zu verstehen, warum . Zumindest könnten Sie Regeln definieren, um diese Klassen auszuschließen. Denken Sie daran, die Verschleierung zu deaktivieren, um die enthaltenen Klassen klar zu sehen! – rupps

+1

Sie können auch 'shrinkResources true' hinzufügen auch - siehe [hier] (https://plus.google.com/u/0/+TorNorbye/posts/eHsStybrrBf) – natario

Antwort

9

Von Google Play-Dienste Version 6.5 und darüber hinaus Sie können auswählen, welche einzelne APIs Sie verwenden möchten, und importieren nur jene diejenigen. Vielleicht hilft dir das, die APK-Größe ein wenig zu verringern. Hier ist eine Liste:

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.+ 

Sie mehr über diese here sehen können.

+0

Diese Lösung in Paar mit 'shrinkResources' wie @miav vorgeschlagen sollte die Arbeit tun! Vielen Dank! –