【ReactNative】Android 14(SDK 34) へのアップグレード

ReactNative

はじめに

2024/08/31までにtargetSdkVersionを34(Android 14)にしないとリリースができないとGoogleさんから要件が上がってますね。

(2024/11に延伸することも可能みたいです。)

筆者の扱っているReactNativeのバージョンが0.70.0だったがために少し躓いたので、同じく困っている方が解決できるように解決方法を展開します。

筆者の環境

npx react-native info

OS: macOS 13.6.4
CPU: (8) arm64 Apple M2
Memory: 83.45 MB / 24.00 GB
Shell: 5.9 - /bin/zsh
Binaries:
Node: 18.0.0 - ~/.nodenv/versions/18.0.0/bin/node
Yarn: 1.22.19 - ~/.nodenv/versions/18.0.0/bin/yarn
npm: 8.6.0 - ~/.nodenv/versions/18.0.0/bin/npm
Watchman: 2023.10.02.00 - /opt/homebrew/bin/watchman
Managers:
CocoaPods: 1.13.0 - /Users/sanoasami/.rbenv/shims/pod
SDKs:
iOS SDK:
Platforms: DriverKit 23.2, iOS 17.2, macOS 14.2, tvOS 17.2, visionOS 1.0, watchOS 10.2
Android SDK: Not Found
IDEs:
Android Studio: 2022.2 AI-222.4459.24.2221.10121639
Xcode: 15.2/15C500b - /usr/bin/xcodebuild
Languages:
Java: 11.0.11 - /usr/bin/javac
npmPackages:
@react-native-community/cli: Not Found
react: 18.1.0 => 18.1.0
react-native: 0.70.0 => 0.70.0
react-native-macos: Not Found
npmGlobalPackages:
react-native: Not Found

アップデート手順

android/build.gradletargetSdkVersion/compileSdkVersion と紐づく情報をあげる

    targetSdkVersion = 34
    compileSdkVersion = 34
    
    // ここら辺は環境に合わせてあげてください。
    minSdkVersion = 23
    buildToolsVersion = "33.0.0"

    一旦これだけ対応してビルドを通してみてください。

    筆者の場合はビルドも通るしエラーも吐かないし、Android12系では普通に動きました。

    Android14系だとクラッシュしてしまい、アプリが起動しませんでした。

    ReactNativeのバージョンが古いとsdk34系ではクラッシュしてしまう?

    困り果てていたところにちょうど同じことで悩んでいる方がいらっしゃいました。

    App Crashes - On upgrading to Android 14(SDK 34) · Issue #41288 · facebook/react-native
    Description Currently, my codebase supports Android 13 (SDK version: 33). I wanted to upgrade to SDK 33(Android 14) On Android 14 updates, the following changes...

    このやりとりによると、RNのバージョンが最新でないと使えないよ。という内容が記載されてました。

    I upgraded to 0.73 from RN0.72.7 and android sdk 34,encountered an issue where the App Crashes immediately on the launch

    (バージョンを上げれるアプリはあげたほうが良いのですが、筆者のアプリはあげてしまうと危険なライブラリがあるためできればあげたくないのです・・・・)

    RNのバージョンを最新にできない場合の解決策

    ① パッチを当てる

    For targeting SDK 34 - Added RECEIVER_EXPORTED/RECEIVER_NOT_EXPORTED flag support in DevSupportManagerBase by apuruni · Pull Request #38256 · facebook/react-native
    Summary:Add RECEIVER_EXPORTED/RECEIVER_NOT_EXPORTED flag support to DevSupportManagerBase for Android 14 change. See

    このパッチをreact-native向けに当てます。

    patch-packageが入っていることが前提です。

    MainApplication.java にメソッドを追加

      @Override
      public Intent registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter) {
        if (Build.VERSION.SDK_INT >= 34 && getApplicationInfo().targetSdkVersion >= 34) {
          return super.registerReceiver(receiver, filter, Context.RECEIVER_EXPORTED);
        } else {
          return super.registerReceiver(receiver, filter);
        }
      }

    これでビルドし直したらアプリが立ち上がるようになりました。

    コメント