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テスト方法
- 以下のコードを任意の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));
- ビルドしてアプリを起動して上記Activityの画面まで遷移し、Crashボタンをタップしてクラッシュさせる
- アプリをキルして再起動して、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テスト方法
- 以下のコードをトップの画面のソースに付け加える。
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()
}
- ビルドしてアプリを起動してCrashボタンをタップしてクラッシュさせる
- アプリをキルして再起動して、Firebaseにクラッシュレポートとしてあがってくるのをまつ(最長5分かかるらしい)
※Xcodeと端末を接続してデバッグ状態だとうまく動かないので注意。