Frage

Ich habe mit dem Android StrictMode gestartet und finde, dass es großartig wäre es immer während der Entwicklung laufen zu lassen und nicht nur auf einem speziellen Zweig I in git erstellt. Der Grund, warum ich dies tat, ist meine apps Anforderung mit 1.6 oder höher laufen.

Ich las auf dem Android Entwickler-Blog, dass Sie es einrichten können, so dass Sie es durch Reflexion aktivieren. Ich frage mich, wie das wäre tatsächlich aussehen und wenn es könnte möglich sein, dies hier dokumentiert zu haben (oder woanders), anstatt alle mit, die sie erarbeiten sich nutzen will.

War es hilfreich?

Lösung 2

So will ich nicht warten, und beschlossen, die Mühe zu machen, und dies selbst umzusetzen. Es läuft darauf hinaus grundsätzlich nach unten StrictMode in einer Wrapper-Klasse zu wickeln und zur Laufzeit über Reflexion zu entscheiden, ob wir es aktivieren können.

Ich habe es ausführlich dokumentiert in einem Blog Post und machte es in github .

Andere Tipps

Ich habe Manfred Blog-Post zu lesen, aber es funktioniert nicht, wenn Sie Zielplattform Version niedriger als 2.3 , weil StrictMode.enableDefaults(); Methode ist nicht verfügbar.

Hier ist meine Lösung, die vollständig auf Reflexion beruht und erzeugt keine Kompilierungsfehler:

    try {
        Class<?> strictModeClass = Class.forName("android.os.StrictMode", true, Thread.currentThread()
                .getContextClassLoader());

        Class<?> threadPolicyClass = Class.forName("android.os.StrictMode$ThreadPolicy", true, Thread
                .currentThread().getContextClassLoader());

        Class<?> threadPolicyBuilderClass = Class.forName("android.os.StrictMode$ThreadPolicy$Builder", true,
                Thread.currentThread().getContextClassLoader());

        Method setThreadPolicyMethod = strictModeClass.getMethod("setThreadPolicy", threadPolicyClass);

        Method detectAllMethod = threadPolicyBuilderClass.getMethod("detectAll");
        Method penaltyMethod = threadPolicyBuilderClass.getMethod("penaltyLog");
        Method buildMethod = threadPolicyBuilderClass.getMethod("build");

        Constructor<?> threadPolicyBuilderConstructor = threadPolicyBuilderClass.getConstructor();
        Object threadPolicyBuilderObject = threadPolicyBuilderConstructor.newInstance();

        Object obj = detectAllMethod.invoke(threadPolicyBuilderObject);

        obj = penaltyMethod.invoke(obj);
        Object threadPolicyObject = buildMethod.invoke(obj);
        setThreadPolicyMethod.invoke(strictModeClass, threadPolicyObject);

    } catch (Exception ex) {
        Log.w(TAG, ex);
    }

ich sah Ihr Blog-Post. Da Sie nur höchstens Setup StrictMode wollen je einmal pro Java-Datei, würde es keinen Sinn, den Code zu vereinfachen für die Einrichtung zu nennen wie folgt?

Hier ist eine alternative StrictModeWrapper:

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.os.StrictMode;

public class StrictModeWrapper {
    public static void init(Context context) {
        // check if android:debuggable is set to true
        int applicationFlags = context.getApplicationInfo().flags;
        if ((applicationFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectDiskReads()
                .detectDiskWrites()
                .detectNetwork()
                .penaltyLog()
                .build());
            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectLeakedSqlLiteObjects()
                .penaltyLog()
                .penaltyDeath()
                .build());
        }
    }
}

Von Ihrem Code, müssen Sie nur folgendes tun:

try {
    StrictModeWrapper.init(this);
}
catch(Throwable throwable) {
    Log.v("StrictMode", "... is not available. Punting...");
}

Dabei steht dieses ist der lokale Kontext, wie Ihre Aktivität oder Anwendung oder was auch immer. Dies scheint Arbeit für Pre-2.3 Android, und gibt Ihnen auch die Leistung der anderen Methoden der Builder-Klassen zu konfigurieren StrictMode mit genau so, wie Sie möchten.

Ich habe oben zusammen eine weitere Variation des Themas geworfen, die ich in einem Blog-Post skizziert habe hier . Der wesentliche Unterschied in meinem Ansatz ist, dass es auch Wrapper für die Scheibe und vm Richtlinienobjekte bietet, so dass Sie leicht StrictMode-säumigen Code mit vorübergehenden Änderungen der Politik klammern können. Feedback ist willkommen.

Um Pixel Code, den ich auch dieses (basierend auf StrictMode Android API Beispiel) hinzugefügt:

            // VM policy
            Class<?> VmPolicyClass = Class.forName("android.os.StrictMode$VmPolicy", true, Thread.currentThread().getContextClassLoader());

            Class<?> VmPolicyBuilderClass = Class.forName("android.os.StrictMode$VmPolicy$Builder", true, Thread.currentThread().getContextClassLoader());

            Method setVmPolicyMethod = strictModeClass.getMethod("setVmPolicy", VmPolicyClass);

            Method detectLeakedSqlLiteObjectsMethod = VmPolicyBuilderClass.getMethod("detectLeakedSqlLiteObjects");
            Method detectLeakedClosableObjectsMethod = null; 
            try
            {
                detectLeakedClosableObjectsMethod = VmPolicyBuilderClass.getMethod("detectLeakedClosableObjects");
            }
            catch (Exception e) {}
            Method penaltyLogMethod = VmPolicyBuilderClass.getMethod("penaltyLog");
            Method penaltyDeathMethod = VmPolicyBuilderClass.getMethod("penaltyDeath");
            Method VmbuildMethod = VmPolicyBuilderClass.getMethod("build");

            Constructor<?> VmPolicyBuilderConstructor = VmPolicyBuilderClass.getConstructor();
            Object VmPolicyBuilderObject = VmPolicyBuilderConstructor.newInstance();

            Object Vmobj = detectLeakedSqlLiteObjectsMethod.invoke(VmPolicyBuilderObject);
            if (detectLeakedClosableObjectsMethod != null) Vmobj = detectLeakedClosableObjectsMethod.invoke(Vmobj);
            Vmobj = penaltyLogMethod.invoke(Vmobj);
            Vmobj = penaltyDeathMethod.invoke(Vmobj);

            Object VmPolicyObject = VmbuildMethod.invoke(Vmobj);
            setVmPolicyMethod.invoke(strictModeClass, VmPolicyObject);

Stellen Sie das Android-Manifest zu so etwas wie diese.

< uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" android:maxSdkVersion="16"/ >

die folgenden Code in onCreate Methode verwenden.

int SDK_INT = android.os.Build.VERSION.SDK_INT;

} if (SDK_INT>8){

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy);

}

. Hinweis: Deaktivieren Sie die Warnung, wie Sie bereits überprüft, welche Version des Android wird diesen Code verwenden,

wird dieser Code aktiviert werden, wenn die Android-Version höher als Android 2.2

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top