下位プラットフォーム バージョンの StrictMode
-
25-09-2019 - |
質問
Android StrictMode を使い始めましたが、git で作成した特別なブランチ上だけでなく、開発中に常に実行できれば素晴らしいと思いました。これを行った理由は、アプリが 1.6 以降で実行する必要があるためです。
Android 開発者ブログで、リフレクション経由でアクティブ化するように設定できると読みました。私は、それが実際にはどのようになるのか、そしてそれを使いたい人全員が自分たちで解決するのではなく、これをここ (または他の場所) で文書化することが可能かどうかを考えていました。
他のヒント
私はマンフレッドのブログ記事を読んだが、StrictMode.enableDefaults();
方法が使用できないので、あなたが低く2.3 のよりのターゲットプラットフォームのバージョンを設定している場合、それは仕事をしません。
ここでは反射に完全に依存しており、コンパイルエラーを生成しません、私の解決策はあります:
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);
}
私はあなたのブログの記事を見ました。あなたが唯一のこれまでのJavaファイルに一回、最大でセットアップStrictModeにしたいので、それは次のように何の意味がセットアップのために呼び出すコードを簡素化することになるだろう?
ここでは、代替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にビルダークラスの他の方法を使用しての力を与えます。
上記のテーマの別のバリエーションをまとめて、ブログ投稿で概要を説明しました ここ. 。私のアプローチの主な違いは、ディスクおよび vm ポリシー オブジェクトのラッパーも提供するため、StrictMode に違反するコードを一時的なポリシー変更で簡単にまとめられることです。フィードバックは大歓迎です。
、画素コード私も、この(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);
このような何かにAndroidのマニフェストを設定します。
< 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 より高い場合このコードが有効になります