[Android][iOS]Crashlytics導入メモ

# 1. Androidメモ
## 難読化への対応

**build.gradle(app)への設定の注意**

```
Execution failed for task
‘:app:uploadCrashlyticsMappingFileRelease’.
> Expected file collection to contain exactly one file, however, it contains no files.
```
とかいうエラーが出た時の原因と対処

**前提**
build.gradleで「minify true」を設定している場合、ビルド時に難読化が適用され、mapping.txtが作成される。
「minify false」の場合、ビルド時に難読化されず、mapping.txtは作成されない。

**原因と対処**
「minify false」かつ「mappingFileUploadEnabled true」を設定すると、ビルド時にmapping.txtが作成されていなくても、FirebaseSDKはmapping.txtをFirebaseにアップロードしようとして、上記のエラーが発生する。

したがって、「minify false」を設定する場合は、「mappingFileUploadEnabled false」(またはmappingFileUploadEnabled自体を書かないデフォルトfalseだから)を設定する必要があり、
「minify true」を設定する場合は、「mappingFileUploadEnabled trueまたはfalse」どちらでもよい（ただし、mappingFileUploadEnabled falseの場合、Firebaseのクラッシュログは難読化されているので、クラッシュログ見てもよくわかんなくなりそう）。

**参考**

- https://firebase.google.com/docs/crashlytics/upgrade-sdk?platform=android#firebase-crashlytics-sdk_7
- https://developer.android.com/studio/build/shrink-code#enable



## Crashテスト方法
1. 以下のコードを任意のActivityのonCreate()に仕込む

```
 Button crashButton = new Button(this);
        crashButton.setText("Crash!");
        crashButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                throw new RuntimeException("Test Crash"); // Force a crash
            }
        });

        addContentView(crashButton, new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));
```

2. ビルドしてアプリを起動して上記Activityの画面まで遷移し、Crashボタンをタップしてクラッシュさせる
3. アプリをキルして再起動して、Firebaseにクラッシュレポートとしてあがってくるのをまつ(最長5分かかるらしい)

なお、なんでボタンが必要なの？という疑問があり、ボタン無しでソッコークラッシュするようにしたところ、クラッシュレポートをアプリから上げる前にクラッシュすることがあるみたいで、一生Firebaseに上がってこなかった・・・・

そもそも仕組みとしてクラッシュした次の起動後にレポートを上げる、というもののようで。


# 2. iOSメモ
## 難読化への対応
Crashテストして、FirebaseコンソールからCrashlyticsを確認すると、
「不足している X 個の dSYM ファイルをアップロードしてください。これにより Y 件のクラッシュが処理されます」
と表示されることがある。

先輩に教えていただいた感じ、以下の理解。

- Crashlyticsが導入されているipaが難読化されている場合はdSYM ファイル(Androidでいうところのmapping.txt)のアップロードが必要。
- dSYMファイルはビルド時に生成される。・・・が、そもそもビルド時の設定で、「Debug Information Format」フィールドが「DWARF with dSYM File」になっていないと生成されない(これはTARGET, Debug/Release毎にフィールドが存在するので全て確認しないとダメ)。
- ビルドがRun/ArchveでDebug/Releaseどちらが採用されるか決まる。
- ビルド後に生成されるdSYMファイルは手動でアップロードしてやらないとダメ。
- dSYMファイルが生成先のファイルパスは、ipaビルドが終わったあとに表示されるウィンドウ(Window > Organizerからも到達可)でビルドしたipaのレコードを右クリックしてShow in Finderでわかる(★)。
- 手動アップロードのコマンドは、以下の通り(プロジェクトルート直下にいる場合)

```
Pods/FirebaseCrashlytics/upload-symbols -gsp <GoogleService-Info.plistへのパス> -p ios <★のファイルパスでdSYMsまで>
```

## Crashテスト方法

1. 以下のコードをトップの画面のソースに付け加える。

```
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

        let button = UIButton(type: .roundedRect)
        button.frame = CGRect(x: 20, y: 50, width: 100, height: 30)
        button.setTitle("Crash", for: [])
        button.addTarget(self, action: #selector(self.crashButtonTapped(_:)), for: .touchUpInside)
        view.addSubview(button)
    }

    @IBAction func crashButtonTapped(_ sender: AnyObject) {
        fatalError()
    }
```

2. ビルドしてアプリを起動してCrashボタンをタップしてクラッシュさせる
3. アプリをキルして再起動して、Firebaseにクラッシュレポートとしてあがってくるのをまつ(最長5分かかるらしい)

※Xcodeと端末を接続してデバッグ状態だとうまく動かないので注意。

- 参考  https://firebase.google.com/docs/crashlytics/test-implementation?hl=ja