を使用してクラッシュレポートをテストしたいのですacra
が、最初のステップは、コードを使用してAndroidで致命的なクラッシュをシミュレートする必要があることです。
何か案が?
Just execute this code: divide by zero
更新:これを試すこともできますメソッドを作成し、
public void stackOverflow() {
this.stackOverflow();
}
そしてこれをどこか/buttonClickと呼んでください
または、キャッチされなかった例外をスローするだけです
throw new RuntimeException("This is a crash");
ビンゴ!
Androidマニフェストでアクティビティを宣言しないでください。
NullPointer例外を試すことができます。
Integer i = null;
次に、オブジェクトの任意のメソッドを呼び出します。
i.byteValue();
初期化されていないオブジェクトでメソッドを呼び出すと、アプリがクラッシュします。
非常に単純なアプローチ...そしてそれが起こった理由を理解することは非常に重要です。
メソッドの前に変数を開始してから、それを使用してメソッドまたは変数を呼び出すか、リスナーに登録してみてください。onCreate()
setContentView()
例えば:
Button b;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
b = (Button)findViewById(R.id.butt);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
}
});
setContentView(R.layout.main);
}
main.xmlレイアウトのcomponents/viewのいずれもIDを取得する前に 、これはクラッシュしました。setContentView()
main.xmlに次のようなボタンを作成するだけです。
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="crash"
android:text="Crash me" />
次に、アプリを実行し、クリックしてクラッシュします
私が知っている最も単純なもの:nullをスローします。
nullをスローできないため、NullPointerExceptionが発生します。
throw null;
単純なヌルポイント例外でクラッシュする可能性があります。
throw new NullPointerException();
@ vinnet-shuklaの回答に加えて:
「または単にキャッチされない例外をスローする」
キャッチされなかった例外をスローしてクラッシュを実行することは、スタックのどこかで例外がキャッチされる可能性があるため、悪い考えです。特に、現在どこにいるかわからない場合はそうです:)
よりエレガントな方法は、ERRORを使用することです
エラーはThrowableのサブクラスであり、妥当なアプリケーションがキャッチしようとしてはならない重大な問題を示します。そのようなエラーのほとんどは異常な状態です。ThreadDeathエラーは、「通常の」状態ですが、ほとんどのアプリケーションがそれをキャッチしようとすべきではないため、Errorのサブクラスでもあります。
したがって、独自のErrorサブクラスを作成して使用できます。
/*
* usage:
*
* CrashError.doCrash();
*
*/
public class CrashError extends Error {
public CrashError() {
this("simulated crash");
}
public CrashError(String msg) {
super(msg);
}
public static void doCrash() {
throw new CrashError();
}
}
しかし、他の可能性について話す場合は、例外をスローすることもできます:)
これは、特にクラスがVM実装で利用できない場合に、sun.misc.Unsafeを使用する以外の方法でチェックされた例外を再スローする方法のレッスンにもなります:)
@SuppressWarnings("unchecked")
public static <E extends Throwable> void throwAnyT(Throwable e) throws E {
throw (E) e;
}
public static void throwUnchecked(Throwable e) {
throwAny(e);
// should never get there.
throw new InternalError();
}
public static void crash() {
throwUnchecked(new java.io.IOException("simulated crash"));
}
@audric回答に加えて:
「ヌルを投げることはできません」
はい、できます:)これはまさにあなたの例で行っていることであり、catchブロックがThrowableを使用しない場合、検出されなくなる可能性があります-NPXはスローされず、コードが実行されるときに通常のフローが発生します。 ANDROID DALVIKでこれを見て、自分で体験したことでしょう:)
そして何について..?多分それはあなたのニーズを満たすことができますか?
Java固有(Androidでも):
- Runtime.getRuntime().exit(int);
- System.exit(int);
- Runtime.getRuntime().halt(int);
アンドロイド固有:
- android.os.Process.killProcess(int);
- android.os.Process.killProcessQuiet(int);
- android.os.Process.sendSignal(int,int);
- android.system.Os.kill(int);
Firebase Crashlyticsを使用している場合は、これを行う非常に簡単な方法があります。彼らの文書にも言及されています。
val crashlytics = FirebaseCrashlytics.getInstance()
crashlytics.log("my message")
kotlinの場合:
val test = ("0")
println(test[1])
このコード行だけでアプリケーションをクラッシュさせることができます。
throw new RuntimeException("Test Crash"); // Force a crash
メッセージ(この場合は「TestCrash」)を渡すことができます。これは後で参照するのに役立ちます。
一歩先に、 アプリケーションのクラスファイルのいずれにも以下のようなUncaughtExceptionHandlerインターフェイスが実装されていないことを確認してください。
public class MyApplication extends Application implements Thread.UncaughtExceptionHandler{
そうしないと、上記の例外またはその問題に関する例外がそのクラスによってキャッチ/消費され、アプリがクラッシュしなくなります。ただし、以下のようにuncaughtException(Thread t、Throwable e)メソッドでその例外を取得し、必要なアクションを実行できます。あなたの場合、サポートされているSDKメソッドを使用してAcraに報告します。
@Override
public void uncaughtException(Thread t, Throwable e) {
Log.e("MyApplication", "Error", e);
}
次のコードを使用します。
String xyz=null;
system.out.println(xyz);