2015-07-02 5 views
5

Beim Versuch, die Build- und Deployment-Geschwindigkeit zum Debuggen einer App zu optimieren, habe ich während der Installation einen großen Teil der Zeit für die Ausführung von /system/bin/dex2oat aufgewendet. Dies ist die ART ahead of time compiler.Override android: vmSafeMode-Attribut für Debug-Builds

fand ich als 22-API-Targeting Sie jetzt die ART AOT Compilation stoppen:

<application 
    ... 
    android:vmSafeMode="true"> 
</application> 

ich eine spürbare Verbesserung Entfaltungsgeschwindigkeit sah jedoch habe ich Bedenken über mögliche Nebenwirkungen von dieser Änderung. Es muss einen kleinen Runtime-Performance-Hit verursachen, aber gibt es noch andere Konsequenzen, wenn Sie die Option android:vmSafeMode aktivieren?

Ist es möglich, dieses Attribut für Debug-Builds in der Gradle-Build-Datei zu überschreiben? Oder ist das Erstellen einer Debug-spezifischen Manifest-Datei die einzige Lösung?

Antwort

6

Die beste Möglichkeit, android:vmSafeMode nur für das Debug-Build zu aktivieren, besteht darin, ein Debug-Manifest zu verwenden, um den Inhalt Ihrer Haupt-AndroidManifest.xml zu ergänzen.

dies hinzuzufügen, erstellen Sie eine neue Datei …/app/src/debug/AndroidManifest.xml und fügen Sie den folgenden xml:

<manifest 
xmlns:android="http://schemas.android.com/apk/res/android"> 
<application android:vmSafeMode="true" /> 
</manifest> 

Nach dem Hinzufügen dieser Debug-Manifest und die App zu installieren Sie Ihr Gerät logcat Ausgang, um sicherzustellen, überprüfen sollen, dass die vmSafeMode Flagge sein wird Wird korrekt angewendet, wenn der Prozess dex2oat ausgeführt wird. Suchen Sie nach dem Argument --compiler-filter=interpret-only. Dieser Ausgang gibt auch die Zeit an, die für die Ausführung des Prozesses dex2oat benötigt wird, damit Sie vor und nach der Änderung vergleichen können.

I/dex2oat﹕ /system/bin/dex2oat --zip-fd=6 --zip-location=/data/app/com.testing.sample.myapp-1/base.apk --oat-fd=7 --oat-location=/data/dalvik-cache/arm/[email protected]@[email protected]@classes.dex --instruction-set=arm --instruction-set-features=div --runtime-arg -Xms64m --runtime-arg -Xmx512m --compiler-filter=interpret-only --swap-fd=8 
I/dex2oat﹕ dex2oat took 1.258ms (threads: 4) arena alloc=0B java alloc=2MB native alloc=502KB free=7MB 

Es ist auch möglich, das aapt-Tool zu verwenden, um zu überprüfen, ob eine APK hat vmSafeMode aktiviert:

aapt list -a myapkfile.apk 
... 
A: android:vmSafeMode(0x010102b8)=(type 0x12)0xffffffff 
... 

Ich habe keine Berichte über Bugs durch Entfernen der Voraus-Kompilierung verursacht gesehen . Es ist jedoch möglich, dass Ihre Anwendung möglicherweise Probleme aufzeigt, die nicht sichtbar waren, bevor Sie diese Änderung aufgrund der Leistungsminderung vornehmen.

Es ist möglich, sehr intensive Verarbeitung kann um ein Vielfaches langsamer sein. Wenn Ihre App in diese Kategorie passt, sollten Sie die Kompilierung im Voraus nicht entfernen.

1

Ich revive das für die Nachwelt, weil ich einen saubereren Ansatz kenne.

Sie können Manifest-Platzhalter in Gradle verwenden, um zu vermeiden, dass Sie die gesamte Manifestdatei duplizieren müssen.

in Ihrem build.gradle fügen Sie folgendes:

default { 
     manifestPlaceholders = [vmSafeModeEnabled: "true"] 
} 
buildTypes{ 
    release { 
     manifestPlaceholders = [vmSafeModeEnabled: "false"] 
    } 
} 

und dann im manifesten Verwendung dieses anstelle

android:vmSafeMode="${vmSafeModeEnabled}" 

wenn der gradle Build läuft wird es den entsprechenden Wert anwenden, basierend auf Buildtyp .