スマホのアプリがネイティブ・Flutter・React Native製かをざっくり見分ける方法
はじめに
技術選定・プロダクト分析・競合調査・SDK導入の検討など現場では「このアプリはネイティブ? それとも FlutterかReact Native?」を外部から推測したい場面が少なくありません。
しかし、一般的な「外観による当て推量」には限界があります。
- UIの見た目やアニメーションだけだと判別がつかない(どのフレームワークもネイティブ風に作れる)
- ストアの説明文・採用記事は古い/断片的で、現バージョンと一致しないことがある
- ネットワーク通信やUser-Agentはカスタムされがちで、根拠として弱い
- アプリ内部の分解・解析は規約順守の観点で扱いが難しいケースがある
では、利用規約や法令順守の観点でも「手堅く」観察できる情報はなんでしょう?
そこで鍵になるのがアプリ内の「ライセンス(謝辞)」画面です。
結論
- アプリを実機にインストールし、アプリ内の「設定/情報/ヘルプ」などから 「ライセンス/謝辞」 画面を開く
- 表示される OSSライブラリの一覧の「固有名詞」 を拾い、複数の痕跡の組み合わせで 確率論的に判定 する
- 画面が見つからない/情報不足のときは、 APK/IPAの構造上の痕跡 を補助指標として参照(規約順守の範囲で)
このあとに具体的な指標と手順を詳述します。
実例1: 松屋公式アプリのライセンス画面の見方(iOS)
TOP画面
-
アプリのハンバーガーメニューを開く
-
「ライセンス」をタップする
-
ライセンス画面の一覧をスクロールして、FlutterやReact Nativeのライブラリが含まれているかを確認する
-
この場合は、Flutterのライブラリが含まれているため、Flutterアプリであることがわかります。
実例2: ChatGPTのライセンス画面の見方(iOS)
- iOSの「設定」アプリを開く
- 「アプリ」→「ChatGPT」→「ライセンス」をタップする
- ライセンス画面の一覧をスクロールして、FlutterやReact Nativeのライブラリが含まれているかを確認する
- FlutterやReact Native固有の痕跡が見当たらず、Swift系ライブラリが多数のため、ネイティブアプリの可能性が高いと推定できます。
ライセンス画面はどこにある?
- iOS
- アプリ内「設定」「About」→「Licenses」「Acknowledgements」。または前述のChatGPTの例のようにiOSの「設定」アプリ→「アプリ」→アプリ名→「ライセンス」や「謝辞」という経路がある
- Android
- アプリ内「設定」「ヘルプ」「情報」→「オープンソースライセンス」「ライセンス」「謝辞」など。Google公式のOSSライセンス画面を採用している例が多く、一覧とライセンス文がまとまって表示される
名称は「OSS」「Third-party notices」「Acknowledgements」「利用規約内のライセンス節」など表記ゆれがあるため、複数の導線を試しましょう。
実際の見分け方(現物確認のプロセス)
- アプリを開き、設定画面などからライセンス/謝辞画面を開く
- 一覧をスクロールしながら固有名詞(パッケージ名/Pod名/モジュール名)を拾う
Flutterで見えがちな名称
-
flutter
,Dart
,sky_engine
-
cupertino_icons
,collection
,characters
,vector_math
,intl
など pub.dev 定番 - (実装の傾向)アプリの「ライセンス」画面がFlutter標準のLicensePage風だと確度UP
- Flutterは
showLicensePage
/LicenseRegistry
で依存ライセンスを一括表示する仕組みを持つ
- Flutterは
React Nativeで見えがちな名称
-
react
,react-native
(MIT) -
hermes
/hermes-engine
(JSエンジン) -
Yoga
(レイアウトエンジン),Folly
(Meta製C++ライブラリ),glog
(Google Logging),boost-for-react-native
-
React-Core
,RCTTypeSafety
,React-jsi
,RCT*
など(iOSのPodfile.lockやAcknowledgementsに現れやすい)
ネイティブで見えがちな名称
- iOSだったらSwift系のライブラリが多い
- AndroidだったらKotlin系のライブラリが多い
※ たとえばFlutterやReact Nativeでもネイティブ層との連携で普通に出ることがあるので、あくまで、これだけで断定までは難しいです。ただし、FlutterやReact Nativeのライセンス表記が見当たらない場合は、それらのフレームワークを採用している可能性は低いです。
著名なアプリのライセンス画面
アプリは随時アップデートされるため、必ず自分の端末で同バージョンのライセンス画面を確認してください。以下は記事執筆時点の観察例です。
1. Discord
React Native系のライブラリが多く含まれています。
このアプリは、React Nativeで作られていることがわかります。
2. X(Twitter)
FlutterやReact Native固有の痕跡が見当たらず、ネイティブ系ライブラリ中心。
ネイティブアプリの可能性が高いと推定できます。
3. Slack
FlutterやReact Native固有の痕跡が見当たらず、ネイティブ系ライブラリ中心。
ネイティブアプリの可能性が高いと推定できます。
ライセンス画面が見当たらない/弱いときの「追加のあたり」
- Android(APKの構造)
-
assets/flutter_assets/
、lib/*/libflutter.so
→ Flutterの可能性が高い -
assets/index.android.bundle
(JSC)または.hbc
(Hermes bytecode)、libreactnativejni.so
、com/facebook/react/*
→ React Nativeの可能性が高い
-
- iOS(IPA/アプリバンドル)
-
Flutter.framework
/Flutter.xcframework
を内包 → Flutterの可能性が高い -
React-Core
/RCT*
/Folly
/Yoga
/hermes-engine
→ React Native強い
-
落とし穴と注意点
- ライセンス画面が未整備/不完全なアプリも存在(望ましくはないが現実にはある)
- ハイブリッド構成(ネイティブ+一部Flutter/React Native)だと両方の痕跡が出る
- 企業アプリほどライセンス画面が整備されており、この方法の成功率が高い
おわりに
ライセンス画面は、規約順守の観点でも観察しやすく、フレームワークの「痕跡」が最も集まりやすい場所です。
ただし、特定画面だけハイブリッド構成といった例外も現実にはあるので、あくまで簡易的な判別法として利用するのが安全です。またアプリは常に更新されるため、バージョン依存にもご注意ください。
この記事で挙げた指標は、調査作業を標準化する「最低限のチェックリスト」として使えるはずです。もし「このアプリにはこんな痕跡があった」「このケースはこう解釈した」などの知見があれば、以下の ZennのScraps に観察メモを寄せてもらえると嬉しいです。みんなでナレッジを共有し、精度を地道に上げていきましょう。
アプリに使われている開発フレームワーク採用事例まとめ(ネイティブ・Flutter・React Native)
👉 https://zenn.dev/igz0/scraps/c873e138da9d07
誤判定例や訂正情報の報告も歓迎です。
皆さんの知見を寄せ合って、アプリに使われている開発フレームワークの情報を一緒に集めていきましょう!!
参考情報
Flutter(ライセンスUI・ビルド物・資産)
- showLicensePage(LicensePage)と LicenseRegistry の仕様
https://api.flutter.dev/flutter/material/showLicensePage.html
https://api.flutter.dev/flutter/foundation/LicenseRegistry-class.html - ビルド成果物に同梱される NOTICES.Z(ライセンス束ねファイル)に関する報告
https://github.com/flutter/flutter/issues/145701 - Flutterのアセットバンドル(
flutter_assets
)の解説
https://docs.flutter.dev/ui/assets/assets-and-images
Android(OSSライセンス画面)
- Google公式:OSS Licenses(Gradleプラグイン/SDK、ライセンス情報の収集と表示)
https://developers.google.com/android/guides/opensource
https://github.com/google/play-services-plugins/blob/main/oss-licenses-plugin/README.md
iOS(Acknowledgementsの生成)
- CocoaPods:各ターゲット向けにAcknowledgements(Markdown/Plist)生成
https://github.com/cocoapods/cocoapods/wiki/acknowledgements
https://github.com/CocoaPods/cocoapods-acknowledgements
React Native(Hermesと周辺)
- Hermesはデフォルト(公式ドキュメント/アナウンス)
https://reactnative.dev/docs/hermes
https://reactnative.dev/blog/2022/07/08/hermes-as-the-default - Hermesの .hbc(bytecode) に関する資料・ツール
https://github.com/bongtrop/hbctool
https://payatu.com/blog/understanding-modifying-hermes-bytecode/
(Hermesが無効化されているプロジェクトでは.hbc
が出ない点に注意)
Discussion