Slide 1

Slide 1 text

Customize Error Message @magie_pooh shibuya.apk #16

Slide 2

Slide 2 text

ࣗݾ঺հ ౻ాୖຏ @magie_pooh @magiepooh

Slide 3

Slide 3 text

Customize Error Message @magie_pooh shibuya.apk #16

Slide 4

Slide 4 text

Crash Reporting Tool • Crashlytics • Firebase Crash Reporting • Play Console

Slide 5

Slide 5 text

Crash Reporting Tool • Crashlytics • Firebase Crash Reporting • Play Console

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

͜͜ΛΧελϚΠζ͍ͨ͠

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

ফ͍ͨ͠

Slide 12

Slide 12 text

private static Thread.UncaughtExceptionHandler defaultUEH;
 private static Thread.UncaughtExceptionHandler caughtExceptionHandler =
 new Thread.UncaughtExceptionHandler() {
 @TargetApi(Build.VERSION_CODES.KITKAT) @Override
 public void uncaughtException(Thread thread, Throwable throwable) {
 // do something defaultUEH.uncaughtException(thread, throwable);
 }
 }; @Override public void onCreate() {
 super.onCreate();
 Fabric.with(this, new Crashlytics());
 defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
 Thread.setDefaultUncaughtExceptionHandler(caughtExceptionHandler);
 } ApplicationΫϥε

Slide 13

Slide 13 text

private static Thread.UncaughtExceptionHandler defaultUEH;
 private static Thread.UncaughtExceptionHandler caughtExceptionHandler =
 new Thread.UncaughtExceptionHandler() {
 @TargetApi(Build.VERSION_CODES.KITKAT) @Override
 public void uncaughtException(Thread thread, Throwable throwable) {
 // do something defaultUEH.uncaughtException(thread, throwable);
 }
 }; @Override public void onCreate() {
 super.onCreate();
 Fabric.with(this, new Crashlytics());
 defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
 Thread.setDefaultUncaughtExceptionHandler(caughtExceptionHandler);
 } ApplicationΫϥε

Slide 14

Slide 14 text

private static Thread.UncaughtExceptionHandler defaultUEH;
 private static Thread.UncaughtExceptionHandler caughtExceptionHandler =
 new Thread.UncaughtExceptionHandler() {
 @TargetApi(Build.VERSION_CODES.KITKAT) @Override
 public void uncaughtException(Thread thread, Throwable throwable) {
 // do something defaultUEH.uncaughtException(thread, throwable);
 }
 }; @Override public void onCreate() {
 super.onCreate();
 Fabric.with(this, new Crashlytics());
 defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
 Thread.setDefaultUncaughtExceptionHandler(caughtExceptionHandler);
 } ApplicationΫϥε

Slide 15

Slide 15 text

private static Thread.UncaughtExceptionHandler defaultUEH;
 private static Thread.UncaughtExceptionHandler caughtExceptionHandler =
 new Thread.UncaughtExceptionHandler() {
 @TargetApi(Build.VERSION_CODES.KITKAT) @Override
 public void uncaughtException(Thread thread, Throwable throwable) {
 // do something defaultUEH.uncaughtException(thread, throwable);
 }
 }; @Override public void onCreate() {
 super.onCreate();
 Fabric.with(this, new Crashlytics());
 defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
 Thread.setDefaultUncaughtExceptionHandler(caughtExceptionHandler);
 } ApplicationΫϥε

Slide 16

Slide 16 text

private static Thread.UncaughtExceptionHandler defaultUEH;
 private static Thread.UncaughtExceptionHandler caughtExceptionHandler =
 new Thread.UncaughtExceptionHandler() {
 @TargetApi(Build.VERSION_CODES.KITKAT) @Override
 public void uncaughtException(Thread thread, Throwable throwable) {
 // do something defaultUEH.uncaughtException(thread, throwable);
 }
 }; @Override public void onCreate() {
 super.onCreate();
 Fabric.with(this, new Crashlytics());
 defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
 Thread.setDefaultUncaughtExceptionHandler(caughtExceptionHandler);
 } ApplicationΫϥε

Slide 17

Slide 17 text

private static Thread.UncaughtExceptionHandler defaultUEH;
 private static Thread.UncaughtExceptionHandler caughtExceptionHandler =
 new Thread.UncaughtExceptionHandler() {
 @TargetApi(Build.VERSION_CODES.KITKAT) @Override
 public void uncaughtException(Thread thread, Throwable throwable) {
 // do something defaultUEH.uncaughtException(thread, throwable);
 }
 }; @Override public void onCreate() {
 super.onCreate();
 Fabric.with(this, new Crashlytics());
 defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
 Thread.setDefaultUncaughtExceptionHandler(caughtExceptionHandler);
 } ApplicationΫϥε

Slide 18

Slide 18 text

Field field = Throwable.class .getDeclaredField("detailMessage");
 field.setAccessible(true);
 field.set(throwable, ""); ExceptionͷϝοηʔδΛͻͨ͢Βফ͢

Slide 19

Slide 19 text

ফ͑ͨʂʂʂ

Slide 20

Slide 20 text

Crashlyticsͷ࢓૊Έ • Fabric.with(this, new Crashlytics());

Slide 21

Slide 21 text

Crashlyticsͷ࢓૊Έ • Fabric.with(this, new Crashlytics()); • CrashlyticsCore#onPreExecute()಺Ͱ CrashlyticsControllerΛੜ੒

Slide 22

Slide 22 text

Crashlyticsͷ࢓૊Έ • Fabric.with(this, new Crashlytics()); • CrashlyticsCore#onPreExecute()಺Ͱ CrashlyticsControllerΛੜ੒ • CrashlyticsControllerΫϥεͰ CrashlyticsUncaughtExceptionHandlerΛੜ੒

Slide 23

Slide 23 text

·ͱΊ • UncaughtExceptionHandlerΛ࢖͑͹ΧελϚΠζͰ͖Δ • ଞͷCrash Reporting Tool͸ະௐࠪͳͷͰɺͲͳ͔ͨڭ͑ ͍ͯͩ͘͞ • Firebase Crash ReportingͰ͸ݸਓ৘ใʹؔΘΔ෦෼͸ ʮREDACTED_PERSONAL_IDENTIFICATION_NUMBER ʯʹͳΔΒ͍͠ɻ୭͔ڭ͍͑ͯͩ͘͞