2011-01-06 6 views
12

Android StrictModeの使用を開始し、gitで作成した特別なブランチだけではなく、開発中に常に実行させることは素晴らしいことがわかりました。私がこれをした理由は、1.6以上で動作する私のアプリケーションの要件です。下位プラットフォーム用のStrictMode

私はアンドロイドの開発者ブログで、リフレクションでアクティブにするように設定することができます。私はちょうどそれが実際にどのように見えるのだろうと思っていたし、もし誰もがそれを使いたいと思うよりも、ここに(あるいは他の場所に)これを書かせることが可能かもしれない。

+0

私はここで答えを得られないなら、私はそれをする時間があるときに自分自身を理解します..しかし、現時点でandevconのために準備する必要があります.. –

答えて

8

私は待たずに努力してこれを実装することに決めました。基本的には、StrictModeをラッパークラスにラップし、それをアクティブにできるかどうかをリフレクションによって実行時に決定することです。

詳しくはin a blog postを文書化し、githubで利用可能にしました。

+0

@bla ...親切にあなたのdownvoteを削除私はリンクを固定しました。これは5歳です。物事は周りを移動.. –

+0

ありがとうManfred; downvoteは一般的にリンクを固定する効率的な方法です;)。 MorseFlashApplicationクラスとStrictModeWrapperクラスを確認する必要があります。 – bla

7

あなたのブログ記事を見ました。 JavaファイルごとにStrictModeを設定する必要があるのはたったか1つだけなので、次のようにセットアップを呼び出すコードを単純化する意味はありますか?ここで

が代替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()); 
     } 
    } 
} 

、あなただけの、次の操作を行う必要があります

try { 
    StrictModeWrapper.init(this); 
} 
catch(Throwable throwable) { 
    Log.v("StrictMode", "... is not available. Punting..."); 
} 
このは、あなたの活動やアプリケーションなどのローカル・コンテキスト、ある

または何でも。これは2.3より前のAndroidで動作するように見えますが、StrictModeを望みどおりに設定するために、Builderクラスの他のメソッドを使用することもできます。

+0

はい..それもうまくいくでしょうし、リフレクションを使用しようとしなくてもちょっとだけ短いかもしれませんが、ちょうどinitで完全です。しかし、これはやや柔軟性がありません。しかし、あなたは一度だけこのことをしたいと思うのは事実です。私はちょうどすでにシングルトンであるアプリケーションクラスのonCreateでそれをやっています。 –

+0

Android DevelopersグループのDianne Hackbornから、アプリケーションを拡張することを推奨したのは、これが絶対必要でない場合です。ポリシーはスレッドに適用されるので、ランチャーアクティビティのonCreate()でStrictModeを初期化することができます。アプリケーションからメインスレッドに適用されるように初期化するだけでよいはずです。もちろん、監視したい追加のスレッドを起動しない限り、アプリケーションから初期化した場合でも、それらのスレッドでStrictModeを設定する必要があります。 –

+0

はい。もう一つの可能​​性がある。私もDianneからのその勧告を見ましたが、私が見ている多くのアプリはアプリケーションを拡張し、それはかなりうまく動作します。彼らが言っているように、猫を皮膚につける多くの方法があります;-) –

1

私はブログの記事hereで概説した上記のテーマの別のバリエーションを一緒に投げました。主な相違点は、一時的なポリシーの変更でStrictModeに違反するコードを簡単に囲むことができるように、ディスクおよびVMポリシーオブジェクトのラッパーも提供する点です。フィードバックは大歓迎です。

9

私はManfredのブログ記事を読んだが、ターゲットプラットフォームのバージョンが2.3より低く設定されていると、StrictMode.enableDefaults();メソッドが利用できないため、機能しません。ここで

は反射に完全に依存しており、コンパイルエラーを生成しません、私のソリューションです:ピクセルコードに

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); 
    } 
+0

実装はgithubにあり、多くの人がテストして使用しています。それはうまく動作します。私は毎日それを使用します。しかし、はい...あなたが2.3より下の目標を必要とする場合、あなたのトリックも同様に機能します。 –

+0

@ManfredMoser私が投稿した唯一の理由は、2.3より低いターゲットをサポートする必要があることです。あなたのソリューションは良いですが、この特殊なケースでは機能しません。 – pixel

+0

ありがとう@ManfredMoser –

1

私もこの(StrictMode AndroidのAPIの例に基づいて)を追加しました:

  // 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); 
0

Android Manifestを次のように設定します。

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

onCreateメソッドで次のコードを使用します。

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); 

} 

注:このコードを使用するAndroidのバージョンを確認しているので、警告を無効にしてください。

AndroidバージョンがAndroid 2より高い場合、このコードは有効になります。2

+0

StrictModeクラスが利用可能であると想定されているため、古いAndroidバージョンでは動作しません。 –

+0

Android 2.2で新しいアプリケーションのポップアップFacebookを使用しています。上記のようにターゲットを選択する必要があります。アンドロイドのバージョンが2.3よりも低い場合は、logcatにエラーがあります。デッドコードがあります。 – PravinDodia

+0

古いバージョンについて話すとき、他の解決策は1.1に戻ります... –

関連する問題