📱

スマホのアプリがネイティブ・Flutter・React Native製かをざっくり見分ける方法

に公開

はじめに

技術選定・プロダクト分析・競合調査・SDK導入の検討など現場では「このアプリはネイティブ? それとも FlutterReact Native?」を外部から推測したい場面が少なくありません。

しかし、一般的な「外観による当て推量」には限界があります。

  • UIの見た目やアニメーションだけだと判別がつかない(どのフレームワークもネイティブ風に作れる)
  • ストアの説明文・採用記事は古い/断片的で、現バージョンと一致しないことがある
  • ネットワーク通信やUser-Agentはカスタムされがちで、根拠として弱い
  • アプリ内部の分解・解析は規約順守の観点で扱いが難しいケースがある

では、利用規約や法令順守の観点でも「手堅く」観察できる情報はなんでしょう?
そこで鍵になるのがアプリ内の「ライセンス(謝辞)」画面です。

結論

  • アプリを実機にインストールし、アプリ内の「設定/情報/ヘルプ」などから 「ライセンス/謝辞」 画面を開く
  • 表示される OSSライブラリの一覧の「固有名詞」 を拾い、複数の痕跡の組み合わせで 確率論的に判定 する
  • 画面が見つからない/情報不足のときは、 APK/IPAの構造上の痕跡 を補助指標として参照(規約順守の範囲で)

このあとに具体的な指標と手順を詳述します。

実例1: 松屋公式アプリのライセンス画面の見方(iOS)

TOP画面

  1. アプリのハンバーガーメニューを開く
    松屋公式アプリのTOP画面

  2. 「ライセンス」をタップする
    松屋公式アプリのハンバーガーメニュー

  3. ライセンス画面の一覧をスクロールして、FlutterやReact Nativeのライブラリが含まれているかを確認する
    松屋公式アプリのライセンス画面

  4. この場合は、Flutterのライブラリが含まれているため、Flutterアプリであることがわかります。

実例2: ChatGPTのライセンス画面の見方(iOS)

  1. iOSの「設定」アプリを開く
  2. 「アプリ」→「ChatGPT」→「ライセンス」をタップする
  3. ライセンス画面の一覧をスクロールして、FlutterやReact Nativeのライブラリが含まれているかを確認する
    ChatGPTのライセンス画面
  4. FlutterやReact Native固有の痕跡が見当たらず、Swift系ライブラリが多数のため、ネイティブアプリの可能性が高いと推定できます。

ライセンス画面はどこにある?

  • iOS
    • アプリ内「設定」「About」→「Licenses」「Acknowledgements」。または前述のChatGPTの例のようにiOSの「設定」アプリ→「アプリ」→アプリ名→「ライセンス」や「謝辞」という経路がある
  • Android
    • アプリ内「設定」「ヘルプ」「情報」→「オープンソースライセンス」「ライセンス」「謝辞」など。Google公式のOSSライセンス画面を採用している例が多く、一覧とライセンス文がまとまって表示される

名称は「OSS」「Third-party notices」「Acknowledgements」「利用規約内のライセンス節」など表記ゆれがあるため、複数の導線を試しましょう。

実際の見分け方(現物確認のプロセス)

  1. アプリを開き、設定画面などからライセンス/謝辞画面を開く
  2. 一覧をスクロールしながら固有名詞(パッケージ名/Pod名/モジュール名)を拾う

Flutterで見えがちな名称

  • flutter, Dart, sky_engine
  • cupertino_icons, collection, characters, vector_math, intl など pub.dev 定番
  • (実装の傾向)アプリの「ライセンス」画面がFlutter標準のLicensePage風だと確度UP
    • Flutterは showLicensePage / LicenseRegistry で依存ライセンスを一括表示する仕組みを持つ

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

Discordのライセンス画面
React Native系のライブラリが多く含まれています。
このアプリは、React Nativeで作られていることがわかります。

2. X(Twitter)

X(Twitter)のライセンス画面
FlutterやReact Native固有の痕跡が見当たらず、ネイティブ系ライブラリ中心。
ネイティブアプリの可能性が高いと推定できます。

3. Slack

Slackのライセンス画面
FlutterやReact Native固有の痕跡が見当たらず、ネイティブ系ライブラリ中心。
ネイティブアプリの可能性が高いと推定できます。

ライセンス画面が見当たらない/弱いときの「追加のあたり」

  • Android(APKの構造)
    • assets/flutter_assets/lib/*/libflutter.soFlutterの可能性が高い
    • assets/index.android.bundle(JSC)または .hbc(Hermes bytecode)libreactnativejni.socom/facebook/react/*React Nativeの可能性が高い
  • iOS(IPA/アプリバンドル)
    • Flutter.framework / Flutter.xcframework を内包 → Flutterの可能性が高い
    • React-Core / RCT* / Folly / Yoga / hermes-engineReact Native強い

落とし穴と注意点

  • ライセンス画面が未整備/不完全なアプリも存在(望ましくはないが現実にはある)
  • ハイブリッド構成(ネイティブ+一部Flutter/React Native)だと両方の痕跡が出る
  • 企業アプリほどライセンス画面が整備されており、この方法の成功率が高い

おわりに

ライセンス画面は、規約順守の観点でも観察しやすく、フレームワークの「痕跡」が最も集まりやすい場所です。
ただし、特定画面だけハイブリッド構成といった例外も現実にはあるので、あくまで簡易的な判別法として利用するのが安全です。またアプリは常に更新されるため、バージョン依存にもご注意ください。

この記事で挙げた指標は、調査作業を標準化する「最低限のチェックリスト」として使えるはずです。もし「このアプリにはこんな痕跡があった」「このケースはこう解釈した」などの知見があれば、以下の ZennのScraps に観察メモを寄せてもらえると嬉しいです。みんなでナレッジを共有し、精度を地道に上げていきましょう。

アプリに使われている開発フレームワーク採用事例まとめ(ネイティブ・Flutter・React Native)
👉 https://zenn.dev/igz0/scraps/c873e138da9d07

誤判定例や訂正情報の報告も歓迎です。
皆さんの知見を寄せ合って、アプリに使われている開発フレームワークの情報を一緒に集めていきましょう!!

参考情報

Flutter(ライセンスUI・ビルド物・資産)

Android(OSSライセンス画面)

iOS(Acknowledgementsの生成)

React Native(Hermesと周辺)

Discussion