Ich weiß nicht einmal, welchen Titel ich geben soll, es ist so seltsam. Ich habe ein kleines Android-Logikrätsel erstellt, das Farbwerte in einer ARGB-Ganzzahl verwendet Format. Um die Farben für die Animation zu mischen, wenn Sie eine Ebene abgeschlossen haben, habe ich die folgende Funktion:
%Vor%Ich rufe diese Funktion während der Animation mit diesem Code auf (inkl. debug print statement):
%Vor% Hier ist pos
einfach ein Doppelwert, der von 0.0 bis 1.0 zählt.
Wenn ich diesen Code in Eclipse über das Android-Entwickler-Plugin direkt auf meinem Telefon austrage, funktioniert alles einwandfrei.
ABER: Wenn ich die App paketiere und die APK installiere, wird zuverlässig verschraubt, was mir eine ähnliche Ausgabe gibt:
%Vor%In diesem Beispiel ist bis zur Position 0.89 alles in Ordnung. Dann beginnen die Dinge zu oszillieren zwischen dem Arbeiten und dem Verschrauben nur der R-Komponente (auf 0 gesetzt; es ist immer die R-Komponente, die verschraubt wird) und schließlich, beginnend bei 0,93 in diesem Beispiel, Dinge vermasseln immer. Und wenn ich dann die gleiche Animation erneut starte, fängt es sofort an zu versauen ...
Wie ist das möglich? Verletzt dieser ProGuard meinen Code? Wenn das eine Möglichkeit ist, gibt es einen Weg, es herauszufinden? Ich habe hier wirklich einen Verlust an Ideen ... Und wie kann es probabilistisch sein, ob es funktioniert oder nicht? Oder verpasse ich hier gerade etwas völlig Offensichtliches?
Wenn es sich um ein ProGuard-Problem handeln könnte, welche Art von Optimierungen könnten sich auf diesen Teil des Codes auswirken? Gibt es eine Liste von Schaltern, die ich versuchen könnte, einzeln auszuschalten, um den flockigen zu finden?
UPDATE:
Meine project.properties
-Datei sieht so aus (Kommentarzeilen gelöscht):
und proguard-project.txt
gefällt das:
proguard-android.txt
im SDK-Verzeichnis sollte immer noch so sein, wie es mit den SDK Tools v24.1.2 geliefert wurde (vorausgesetzt, das ist das Paket, das ProGuard enthält ...; Kommentare werden wieder ausgeschlossen):
UPDATE 2:
Ich glaube, ich fand die kompilierte Ausgabe von dem, was ProGuard mit der blend
-Methode in der dump.txt
-Datei macht:
UPDATE 3 :
Ich habe versucht, die Blend-Methode auf diese neu zu schreiben (Idee ist, dass, wenn ich alle Komponenten gleich behandle, es nicht möglich sein sollte, nur eine mehr zu vermasseln):
%Vor%Es überrascht nicht, dass dieser Code nun genauso funktioniert, wie er sollte! Aber das bringt mich immer noch nicht näher zu verstehen, warum der ursprüngliche Code versagt hat und an welchen anderen Stellen meiner App etwas ähnlich Triviales auf unerwartete Weise scheitern könnte.
UPDATE 4:
Durch einfaches Umordnen der Zeilen wird das Problem behoben:
%Vor%Es muss eine lokale Variable-Wiederverwendungs-Sache sein, ich weiß einfach nicht, warum das nicht aus der dump.txt-Datei oben ersichtlich ist ... Ist das etwas, das Dalvik macht (aber nur für signierte APKs !? !)?
Ein wirklich interessantes Thema, um es zu untersuchen und zu lösen, wird definitiv Ihre Kenntnisse mit (möglicherweise) ProGuard erhöhen, aber um das Gesamtbild zu betrachten, würde ich empfehlen, bestehende Werkzeuge zur Animation von Farbänderungen zu verwenden:)
ArgbEvaluator (oder ValueAnimator # ofArgb (int ...) für API 21+) zur Rettung!
API 21 +:
%Vor%API 11 +:
%Vor%Es erlaubt Ihnen, es nach Ihren Wünschen zu optimieren (verschiedene Interpolatoren, Verzögerungen, Listener usw.) und auch da es von der Plattform kommt, gibt es eine große Chance, dass ProGuard es nicht anfassen wird
PS. Ich möchte immer noch die Ursache für das Problem sehen, das Sie gerade erleben:)
Ich habe keine Antwort über das Progard-Zeug, aber es gibt einige Color
Hilfsmethoden, die Ihnen aus irgendeinem Grund das richtige Ergebnis geben können. Zumindest wird es Ihren Code lesbarer machen. Versuchen Sie Folgendes:
Tags und Links android android-proguard