2015-07-02 17 views
5

Podczas próby optymalizacji kompilacji i szybkości wdrażania w celu debugowania aplikacji znalazłem dużą porcję czasu podczas wykonywania /system/bin/dex2oat podczas instalacji. To jest ART ahead of time compiler.Zastąp android: atrybut vmSafeMode dla kompilacji debugowania

znalazłem podczas kierowania API 22 można teraz zatrzymać kompilację ART AOT:

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

Widziałem zauważalną poprawę szybkości wdrożenia, jednak mam obawy co do możliwych skutków ubocznych wprowadzeniu tej zmiany. Musi spowodować niewielki wzrost wydajności środowiska wykonawczego, ale czy są jakieś inne konsekwencje włączenia opcji android:vmSafeMode?

Czy jest możliwe zastąpienie tego atrybutu dla kompilacji debugowania w pliku kompilacji gradle? Czy tworzenie pliku manifestu specyficznego dla debugowania jest jedynym rozwiązaniem?

Odpowiedz

6

Najlepszym sposobem włączenia android:vmSafeMode tylko w celu utworzenia debugowania jest użycie manifestu debugowania w celu uzupełnienia zawartości głównego pliku AndroidManifest.xml.

Do tego dodać należy utworzyć nowy plik …/app/src/debug/AndroidManifest.xml i dodaj następujący xml:

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

Po dodaniu tej debug oczywisty i zainstalowaniu aplikacji należy wglądu swoje wyjście logcat urządzenia, aby upewnić się, że flaga vmSafeMode jest bycie poprawnie zastosowany po wykonaniu procesu dex2oat. Poszukaj argumentu --compiler-filter=interpret-only. To wyjście informuje również o czasie wykonania procesu dex2oat, aby można było porównać przed i po wprowadzeniu zmiany.

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 

Możliwe jest również użycie narzędzia aapt sprawdzić, jeśli APK ma vmSafeMode włączona:

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

Nie widziałem żadnych raporty błędów powodowanych przez usunięcie z wyprzedzeniem-of-time compilation . Możliwe jednak, że aplikacja może ujawnić problemy, które nie były widoczne przed wprowadzeniem tej zmiany z powodu zmniejszenia wydajności.

Możliwe jest bardzo intensywne przetwarzanie może być powolne wiele razy. Jeśli Twoja aplikacja pasuje do tej kategorii, najlepiej nie usuwać kompilacji z wyprzedzeniem.

1

Wznawiam to dla potomności, ponieważ znam czystsze podejście.

Można użyć manifestu zastępczego w gradle, aby uniknąć konieczności duplikowania całego pliku manifestu.

w build.gradle dodać następujące:

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

a następnie w oczywistego zastosowania tego zamiast

android:vmSafeMode="${vmSafeModeEnabled}" 

gdy Gradle build prowadzi to zastosuje odpowiednią wartość w zależności od rodzaju kompilacji .