Crashlytics là thư viện rất thông dụng đối với tất cả các iOS Developer rồi. Nó không thể thiếu cho việc thu thập và thống kê những lần crash của ứng dụng. Trong bài này mình sẽ đi từng bước để chúng ta tích hợp Firebase crashlytics vào project có sử dụng bazel.
Để demo cho bài này mình sẽ dùng lại project tại đây: https://github.com/vikage/DemoBazel/tree/swiftlint
1. Khai báo depedency
Bình thường chúng ta dùng Cocoapods, SPM hay Carthage thì điều này cực kỳ đơn giản rồi. Nhưng khi dùng bazel chúng ta phải tự thêm dependency bằng tay. Ở đây mình sẽ thực hiện bằng cách lấy những framework của firebase được build sẵn ở trên github https://github.com/firebase/firebase-ios-sdk/releases. Ở phần release mình sẽ lấy file mới nhất https://github.com/firebase/firebase-ios-sdk/releases/download/v8.15.0/Firebase.zip.
Tiếp theo mình sẽ add bazel dependency vào bằng cách thêm vào file WORKSPACE với nội dung
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "Firebase",
build_file = "@//Thirdparty/Firebase:BUILD",
url = "https://github.com/firebase/firebase-ios-sdk/releases/download/v8.15.0/Firebase.zip",
)
2. Khai báo config setting
Mình sẽ thêm config setting tại config/BUILD để dependency package có thể hiểu được. Tiếp theo mình sẽ khai báo 1 build setting trong file BUILD để nhận biết đang build cho chip arm hay cho x86_64.
config_setting(
name = "is_arm",
values = {
"cpu": "ios_arm64",
},
)
3. Viết build target
Tiếp tục edit file Thirdparty/Firebase. Mình sẽ viết build target để import những thư viện cần thiết cho Firebase Crashlytics như FirebaseCore, FirebaseAnalytics, FirebaseCoreDiagnostics, FirebaseCrashlytics, …
Vì framework cho Firebase đang là dạng xcframework, nên chúng ta cần phải check và chọn dạng framework thích hợp.
Bây giờ chỉ cần khai báo thêm những framework này vào deps để cấu hình FirebaseApp là xong. Vì khi nãy chúng ta đã thêm firebase vào WORKSPACE là 1 dạng depedency. Nên chúng ta sẽ dùng @Firebase thay vì //Thirdparty/Firebase
Tiếp theo mở file AppDelegate.swift và thực hiện cấu hình cho Firebase thôi.
4. Thêm config vào .bazelrc
Để sau khi build thư mục bazel-bin trỏ đúng chỗ ipa và dSYM thì ta cần thêm 1 dòng cấu hình như sau vào .bazelrc
build --use_top_level_targets_for_symlinks
5. Cấu hình tulsi post script
Như bài trước mình có nói về việc tích hợp swiftlint thì chúng ta cần phải cấu hình prebuild. Thì giờ chúng ta cần cấu hình post build để chạy script của firebase crashlytics để upload dsym lên server của firebase.
Đầu tiên chúng ta cần tải file https://github.com/firebase/firebase-ios-sdk/blob/master/Crashlytics/upload-symbols và lưu vào thư mục tools của project.
Tiếp theo chúng ta cần tạo project trên firebase và tạo app(nếu chưa có), tải file GoogleService-Info.plist và lưu vào thư mục App/Resources và thêm list data trong App_Classes
Tiếp theo chúng ta thêm cấu hình post build vào app.tulsigen tương tự như phần trước
"PostBuildPhaseRunScript": {
"t" : {
"//App:ios_app" : "$SRCROOT/tools/upload-symbols -gsp $SRCROOT/App/Resources/GoogleService-Info.plist -p ios $SRCROOT/bazel-bin/App/ios_app.app.dSYM"
}
}
Như vậy là hoàn thành rồi, giờ chỉ cần gen ra project ra xong.
Run thử để kiểm tra thì Xcode đã báo:
Successfully submitted symbols for architecture arm64 with UUID 70a9d49583723fd096b62401bdce6a64 in dSYM: /Users/thanhvu/Downloads/DemoBazelTulsi/bazel-bin/App/ios_app.app.dSYM
Như vậy là hoàn thành rồi. Các dịch vụ khác của Firebase bạn tích hợp tương tự thôi (Đơn giản hơn vì không phải cấu hình post build).
Project demo mình sẽ đặt tại: https://github.com/vikage/DemoBazel/tree/firebase