2012-11-13

Obfuskera Androidapp

Den Androidapp jag ska obfuskera är MantisDroid och den består av ett library (MantisDroidLibrary) och 2 appar: en gratisversion (MantisDroid Free) och en betalversion (MantisDroid).
Jag använder ProGuard för obfuskering och optimering. Det verktyget följer med Android SDK:n.

Först måste konfigurationsfilerna för ProGuard rättas till. I foldern <android-sdk>/tools/proguard/ ska filerna proguard-android.txt och proguard-android-optimize.txt editeras:
#-keep public class com.google.vending.licensing.ILicensingService
#-keep public class com.android.vending.licensing.ILicensingService
Dvs. kommentera bort de 2 raderna eftersom de annars ger fel i obfuskeringen.

Jag använder Ant för att bygga mina projekt så om du inte redan gjort det så kör följande kommando i din projektkatalog:
android update project -p .
Den skapar upp bland annat build.xml och lite andra filer som behövs.

Börja med projektet MantisDroidLibrary.
Den ska inte obfuskeras i sitt projekt utan gör det när apparna byggs och obfuskeras.
Se till att obfuskering inte är aktiverad genom att titta i project.properties och verifiera att direktivet proguard.config inte är aktiverad.

De två apparna har precis samma inställningar så gör samma sak i båda.
Öppna project.properties och kommentera fram följande för endast obfuskering:
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
Om du vill ha både obfuskering och optimering så lägg till följande:
proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt

I filen proguard-project.txt i projekt så ska nu projektspecifika regler läggas till. Skapa filen om den inte redan finns.
I min skriver jag:
-dontwarn org.xmlpull.v1.**
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}
-keep public class com.google.android.vending.licensing.ILicensingService

Den första regeln döljer alla varningar för klasser i paketet org.xmlpull.v1. Det gör jag eftersom det blir krockar mellan klasser i android.jar och ett library (ksoap2-android) som jag använder. I mitt fall är det ingen fara utan helt ok.
Den andra regeln är en optimeringsregel som ser till att optimera bort alla anrop till Log.d(...) och Log.v(...). Anledningen till det är att de loggningarna inte ska komma ut i mina apk:er eftersom de avslöjar vad olika delar av min kod gör. Samtidigt så ska inte debug- och verbose-loggning finnas ute i kundernas installationer.
Den tredje regeln är för att jag använder Google Play Licensing och inte vill att den ska optimeras bort.

För att signeringen ska fungera så behöver man fylla i key.store och key.alias i filen ant.properties:
key.store=mantisdroid_release_key.keystore
key.alias=mantisdroid

key.alias.password=[your_password]
key.store.password=[your_password]
Library-projektet behöver inte signeras så skriv inte någon key.store eller key.alias där.

Kompilera, obfuskera, optimera och signera sedan appen med Ant genom att köra (i projektets folder):
ant release