Open3

Mini-Pkg: Phase1仕様を詰める会

okuokuokuoku

アプリケーションのパッケージングは超クッソ激烈に奥が深く、一発の実装でゴールに到達するのは難しいだろうということで、何段階かにフェーズを分けることにした。

  • Phase1: アプリケーションの動作に必要なDLLやスクリプトのパッケージングに対応する。パッケージングは単体で、パッチやPlay As You Downloadには対応しない
  • Phase2: Play As You Download向けのアセット分割に対応する(自前DL、On Demand Resource)
  • Phase3: 仕向け対応(対応言語やCPU種別)
  • Phase4: アセットの圧縮? -- cwglやcoalとの統合
okuokuokuoku

基本的な構造

アプリケーション本体のビルド同様、アプリケーションのパッケージングもCMakeスクリプトで行う。

アプリケーションの基本的なデータはCMake変数に設定する。

set(APP1_main_executable app) # app は初期実行ファイルとするターゲット
set(APP1_appname "Test application")
set(APP1_appname_ja_JP "テストアプリケーション")

# Android attributes
set(APP1_android_name "org.cltn.testapp")

# APP1で始まる各CMake変数を拾ってアプリケーションを構築する
minipkg_add_apppackage(app1 APP1) 

フィールドは国際化をサポートすることがある。 言語コード(ISO 639-1) および 国または地域コード(ISO 3166-1)のサフィックスを持つ。

サポートするターゲット

  • シングルアーキテクチャ
    • loose
    • single-file (phase2以降)
    • MSIX SDK (phase2以降)
  • マルチアーキテクチャ
    • Android
    • iOS + macOS bundle

loose は、CMakeの add_executable で作成したバイナリと指定されたアセットを同じディレクトリに単にコピーするもの。

single-file はアセットのアーカイブをリソースとして埋め込んだ .exe または、実行可能ファイルの末尾に連結したファイルを生成する。(phase1では実装しない & yuniframe側のサポートが必要)

AndroidやiOSは。。どうやってサポートするのが自然なのかまだ思いついていない。CMake自体はマルチアーキテクチャに対応していないため、一度ビルドしたプロジェクトを別途纏めるプロジェクトを生成する必要がある。

okuokuokuoku

読み書き可能ストレージの管理

iOSにせよAndroidにせよ、アプリがインストールされている場所に直接書き込むことはできない。ゲーム専用機におけるセーブデータのように、専用のデータ領域をリクエストしアクティベート(マウント)する必要がある。

Mini-Pkgとしてのポイントは、これらの制御に必要な権限等をCMake側で宣言できるようにする必要がある点と言える。。

Android

https://developer.android.com/training/data-storage?hl=ja

書き込み方向のストレージは基本的に以下に分類される。

  • "App-specific files": Java側からプレフィックスを getFilesDir getCacheDir getExternalFilesDir getExternalCacheDir で取得できる。
  • メディアファイル: MediaStore APIを使う。歴史的事情でメディアファイルは区別される。また、端末のDCIMフォルダ等を直接アクセスする方法もある。
  • ドキュメントファイル: https://developer.android.com/training/data-storage/shared/documents-files

ドキュメントファイルはアプリケーションがパスをコントロールすることはできない。PCで言うとドラックアンドドロップされるファイルが概念的に近い。

iOS

基本的には NSApplicationSupportDirectory のパスには書き込みできる。が、tvOSでは NSCachesDirectory しか書けるところがない。 CloudKit (や、他のクラウドストレージ)を使う必要がある。CloudKitは基本的に自動同期であるため、除外 https://developer.apple.com/documentation/foundation/optimizing_your_app_s_data_for_icloud_backup?language=objc は手動となる。

パスは NSSearchPathForDirectoriesInDomains で取得できる 。

https://github.com/libsdl-org/SDL/blob/34860b932bd016ea886d82e10239d45d672879c0/src/filesystem/cocoa/SDL_sysfilesystem.m#L81

大きな指針は File System Programming Guideの "Where You Should Put Your App’s Files" が依然有効と言える。

macOS

App Sandbox https://developer.apple.com/documentation/security/app_sandbox/accessing_files_from_the_macos_app_sandbox?language=objc に対応する必要がある。。