StrictMode: Alle Prüfungen des OS abschalten

  • Antworten:4
Gelöschter Account
  • Forum-Beiträge: 694

01.09.2012, 14:59:06 via Website

Android hat im Laufe der vergangenen Versionen immer mehr Prüfungen eingebaut und die auch immer mehr verschärft. Diese Prüfungen überwachen ob sich eine App konform zu den Android-Regeln verhält. Wird Netzwerk-Kommunikation in einem Thread ausgeführt oder wird fälschlicherweise der UI-Thread benutzt? Sind alle Zugriffe auf die Speicherkarten sauber, und, und, und, ...

Das Problem mit diesen Prüfungen ist - man weiß nicht was Google noch so alles einfällt. Eine App die wunderbar unter 2.3.x lief kracht plötzlich unter 3.x runter. Eine andere übersteht noch 3.x stürzt aber unter 4.x ab. Was wird mit 5.x sein?

Das Schlechte: Man weiß nicht ob es einen erwischt. Das Gute: Man kann diese Prüfungen abschalten. Um es vorweg zusagen - ich halte vom Abschalten solcher Prüfungen überhaupt nichts - ich befürworte sie auch nicht. Gleichzeitig muss ich gestehen - ich habe die Abschaltung in jeder App drin. Warum? Ich möchte nicht das meine App beim Benutzer runterkracht nur weil der eine neuere Version auf seinem Gerät hat als die, mit der ich testen kann. Finde ich in den API Neuerungen Hinweise auf Verschärfungen so baue ich die App um und rolle das über einen Update aus. Das der Benutzer der leidtragende ist möchte ich nicht.

Das Problem heißt StrictMode. Man kann diesen auf Activity- oder auch auf App-Ebene abschalten. Man kann auch individuelle Prüfungen abschalten. Hier zeige ich wie man alle Prüfungen für die komplette App abschaltet.

1.) Zunächst muss der API-Level des Projektes auf mindestens API-9, besser API-11 (3.0) gesetzt werden. Ihr wisst wie das geht.

2.) Das Abschalten erfolgt über eine Subclass von Application. Ihr erstellt also eine neue Klasse MyApplication oder erweitert Eure eigene Subclass von Application. Beachtet bitte das der StrictMode ab API-16 zweimal abgeschaltet wird. Android wurde cleverer und schaltet nach Beendigung von Application.onCreate() alle Prüfungen wieder an. Mit dem Handler wird das zweite Abschalten hinter das onCreate() geschoben:

1public class MyApplication extends Application {
2
3 @Override
4 public void onCreate() {
5 super.onCreate();
6
7 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
8 try {
9 processEnableStrictMode();
10 } catch (Throwable throwable) {
11 }
12 }
13
14 // Kein "else if" da die Policy im onCreate als auch danach gelten soll
15 if (Build.VERSION.SDK_INT >= 16) {
16 new Handler().postAtFrontOfQueue(new Runnable() {
17
18 @Override
19 public void run() {
20 try {
21 processEnableStrictMode();
22 } catch (Throwable throwable) {
23 }
24 }
25 });
26 }
27 }
28
29 private void processEnableStrictMode() {
30 MyStrictModeWrapper.checkAvailable();
31 MyStrictModeWrapper.setThreadPolicy();
32 }
33}
:

3.) Wenn noch nicht geschehen, tragt diese neue Klasse im Manifest ein:

1<application
2 ...
3 android:name="MyApplication" >

4.) Erstellt eine neue Klasse:

1public class MyStrictModeWrapper {
2
3 static {
4 try {
5 Class.forName("android.os.StrictMode");
6 } catch (Exception exception) {
7 throw new RuntimeException(exception);
8 }
9 }
10
11 public static void checkAvailable() {
12 }
13
14 @SuppressLint("NewApi")
15 public static void setThreadPolicy() {
16 StrictMode.ThreadPolicy strictModeThreadPolicy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
17 StrictMode.setThreadPolicy(strictModeThreadPolicy);
18 }
19}

Gelöschter Account

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

25.11.2012, 01:38:49 via Website

Wenn Ich das sehe stehen mir die Harre zu berge!

Wie wäre es den Strict Mode während des Entwicklungsprozesses zu nutzen ?
Entkoppel den IO von UI richtig und du wirst keine sorgen damit haben. Nutze try/catch/finally um deine Connections zu schließen!


In diesem Sinne : "Be a good Android citizen" .....

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

25.11.2012, 10:58:59 via Website

Woher kommt diese Behauptung ?

Bei den APP die Ich so geschrieben habe hatten wir nie ein solches Problem gesehen, und die haben hohe Verbreitung.
Wenn du sowas in deine APP "einbaust" erlaubst du dir lediglich weiter "schlampig" zu Arbeiten ... etwas übertrieben ausgedrückt vielleicht.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten