Gelöschter Account
- Forum-Beiträge: 694
01.09.2012, 14:59:06 via Website
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:
3.) Wenn noch nicht geschehen, tragt diese neue Klasse im Manifest ein:
4.) Erstellt eine neue Klasse:
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}
: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" >
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}
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}
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.