2016-07-06 24 views
0

Ich benutze Samsung's Motion library, um einen Schrittzähler für Samsung-Handys zu erstellen. Wenn ich ein APK ohne Verkleinerung in der Gradle-Konfigurationsdatei erstelle, funktioniert das System. Jedoch wenn ich versuche, minification anzuwenden, bevor in den Laden LoslassenAndroid: Verkleinerung verschleiern dynamisch zugegriffen Klassen

buildTypes { 
    release { 
     minifyEnabled true 
     signingConfig signingConfigs.config 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     debuggable false 
     jniDebuggable false 
    } 

bekam ich Fehler behaupten, die einige Bibliotheken (z android.hardware.motion) nicht vorhanden ist. Ich habe überprüft und:

  • android.hardware.motion ist kein Standard-Bibliothek (? Wahrscheinlich nur in Samsung Handys vorhanden) in android.hardware
  • diese Klassen sind dynamisch Zugriffe (? Vielleicht, weil nicht Standard), z.B. Class.forName("android.hardware.scontext.SContextManager");

Wenn ich die Linie minifyEnabled wahr entferne ich keine Fehlermeldung anzeigt, so muss der Code-Verschleierung sein.

habe ich versucht, meine proguard Regeln Datei Aussagen wie

-keep class android.hardware.** { *; } 
-keep class com.samsung.android.sdk.** { *; } 

aber das scheint hinzufügen nicht zu funktionieren. Irgendeine Idee? Vielen Dank!

+0

Haben Sie versucht, proguard zu deaktivieren und Freigabe .apk zu überprüfen? –

+0

I eingefügt: '-dontoptimize -dontshrink -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose' aber es hat – FabioC

+0

nicht helfen Wenn Sie gradle verwenden (das empfohlen wird), die Sie gerade Linie entfernen müssen, beginnend mit' proguardFiles' ('android.buildTypes.release' Abschnitt). –

Antwort

1

Die fehlenden Klassen sind tatsächlich nur auf dem tatsächlichen Gerät verfügbar. Um ProGuard Prozess Ihrer Anwendung zu lassen, werden Sie die folgende Konfiguration enthalten müssen:

-dontwarn com.samsung.android.sdk.motion.** 
-dontnote com.samsung.android.sdk.motion.** 

Dadurch werden die Warnungen und Hinweise aus der Samsung-sdk Ursprung ignorieren.

+0

Das ist korrekt, obwohl per se nicht ausreichend. Wie auch immer, ich habe es korrekt markiert, weil du mich auf die richtige Spur gebracht hast. Die richtige Lösung ist zu haben: '-dontwarn com.samsung.android ** -dontnote com.samsung.android ** -keep Klasse com.samsung ** {*;... } -Halten Klasse android.hardware. ** {*; } ' – FabioC

+0

Ich bezweifle kaum, dass alle genannten Regeln notwendig sind. Besonders '-Halten Klasse android.hardware. ** {*; } ist bedeutungslos, da dieses Paket auf dem Gerät installiert ist und daher von ProGuard nicht berücksichtigt wird. Ich habe das Beispielprojekt aus dem Samsung SDK getestet und meine Regeln waren ausreichend, um es erfolgreich zu erstellen. –

+0

Sie haben Recht. Außer dass Samsung den Android hinzufügt.Hardware-Paket und damit was passiert ist, war, dass der neue Teil verschleiert wurde. Jede kleinere Teilmenge funktionierte nicht für mich – FabioC