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);
}
}
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
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
Sie können auch 'shrinkResources true' hinzufügen auch - siehe [hier] (https://plus.google.com/u/0/+TorNorbye/posts/eHsStybrrBf) – natario