Mini-Pkg: Phase1仕様を詰める会
アプリケーションのパッケージングは超クッソ激烈に奥が深く、一発の実装でゴールに到達するのは難しいだろうということで、何段階かにフェーズを分けることにした。
- Phase1: アプリケーションの動作に必要なDLLやスクリプトのパッケージングに対応する。パッケージングは単体で、パッチやPlay As You Downloadには対応しない
- Phase2: Play As You Download向けのアセット分割に対応する(自前DL、On Demand Resource)
- Phase3: 仕向け対応(対応言語やCPU種別)
- Phase4: アセットの圧縮? -- cwglやcoalとの統合
基本的な構造
アプリケーション本体のビルド同様、アプリケーションのパッケージングも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自体はマルチアーキテクチャに対応していないため、一度ビルドしたプロジェクトを別途纏めるプロジェクトを生成する必要がある。
読み書き可能ストレージの管理
iOSにせよAndroidにせよ、アプリがインストールされている場所に直接書き込むことはできない。ゲーム専用機におけるセーブデータのように、専用のデータ領域をリクエストしアクティベート(マウント)する必要がある。
Mini-Pkgとしてのポイントは、これらの制御に必要な権限等をCMake側で宣言できるようにする必要がある点と言える。。
Android
書き込み方向のストレージは基本的に以下に分類される。
- "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
で取得できる 。
大きな指針は 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 に対応する必要がある。。