8月31日
App Store ConnectのTestFlightで内部テストを行うことができるようにiOS 版 SDKを更新しました。手順についてはアプリの申請を参照してください。ゲームデータを内蔵したアプリを作成し、手元のiPad ProにTestFlightアプリ経由でインストールして問題なく動作することを確認しました。そのままApp Store Connectから審査を経て一般に公開することもできると思いますが、未確認です。
App Store ConnectのTestFlightで内部テストを行うことができるようにiOS 版 SDKを更新しました。手順についてはアプリの申請を参照してください。ゲームデータを内蔵したアプリを作成し、手元のiPad ProにTestFlightアプリ経由でインストールして問題なく動作することを確認しました。そのままApp Store Connectから審査を経て一般に公開することもできると思いますが、未確認です。
バグ報告「一度終了するとアプリが開かなくなる」を元に、ゲームデータをアプリに同梱すると、アプリをインストールした後に2回目以降は起動に失敗するバグを修正しました。
ゲームデータの配布方法を修正し、Play Asset Delivery (PAD) の install-time Asset Pack に対応して、最大1GBまでのゲームデータをアプリに同梱できるようにしました。また、これ以外のゲームデータの配布方法は廃止しました。
バグ報告「一度終了するとアプリが開かなくなる」を元に、bexec命令のバグを修正しました。マニュアルには、引数が1個の文字列変数、もしくは第1引数が文字列変数で第2引数が数値変数の例しか載っていなかったため、bexec命令はこの2パターンにのみ対応していると思っていたのですが、文字列変数と数値変数の任意の組み合わせに対応しているようです。3個以上の引数にも対応しているようですが、実装がたいへんなので、ONScripterでは2個までの引数に対応します。もし3個以上の引数がある既存のゲームが存在する場合は、ご報告いただければ対応を検討します。
Android 版 SDK を更新して、Android Gradle Plugin Version を 4.2.2 から 7.0.4 に変更しました。これ以上高くすると、最初に Android Studio を起動したときに以下のようなエラーが出てしまいます。
Minimum supported Gradle version is ?.?.?. Current version is 7.1.
そして、この状態で File → Project Structure から Gradle Version を設定しようとしてもなぜか反映されません。また、7.0.4 は compileSDK = 31 までしかテストされていないようなので、compileSDK と targetSDK をどちらも 31 にしました。
Android 11 (API 30)における挙動をエミュレータで試そうとしたところ、以下のエラーが出て arm64 のエミュレータが起動しませんでした。x86_64 のエミュレータは問題なく起動します。
The emulator process for AVD *** has terminated.
C:\Users\username\AppData\Local\Google\AndroidStudio2021.2\log\idea.log には以下のメッセージが出力されていました。
PANIC: Avd's CPU Architecture 'arm64' is not supported by the QEMU2 emulator on x86_64 host.
emulator.cppに以下のように書かれており、API 28以降ではホストが x86_64 の場合 arm64 のエミュレータは起動できないようです。
#ifdef __x86_64__ if (sarch == "arm64" && apiLevel >=28) { APANIC("Avd's CPU Architecture '%s' is not supported by the QEMU2 emulator on x86_64 host.\n", avdarch); } #endif
プライバシーポリシーのページを作成しました。また、Android 版 SDK を更新して、アプリ内のメニューのプライバシーポリシーから Intent を使ってこのページを参照できるようにしました。
macOS Monterey で動作確認をしました。実機向けは問題なくビルドと実行ができましたが、シミュレータ向けにビルドしようとすると以下のエラーが出たので、dev_iPhoneSimulator.sh の SDK_CFLAGS から -arch i686 を削除し、また HOST を x86_64-apple-darwin に変更したところ、問題なくビルドと実行ができるようになりました。iOS 版 SDKを更新しました。
ld: unknown/unsupported architecture name for: -arch i686
Android 版 SDK を更新して、ゲームデータの配布方法のうち「パターン2:アプリに内蔵する方法」でアプリのアセットにゲームデータを配置した場合に、インストール時にゲームデータを展開せず、実行中はアセットから直接ファイルを読み込むようにしました。AssetManager.openFd は、アセットをまとめた単一ファイルの記述子を返すため、これを指定したファイルの記述子とみなしてネイティブコードに渡すと正常に動作しなくなります。今まではインストール時にアセットのファイルをすべて展開して、実行時にはそれらを読み込んでいたのですが、ディスク領域が2倍必要になるので無駄でした。今回 Android 版では、fseek, ftell, fgetc, fgets, fread, fopen をラップして、アセットファイルにおける指定したファイルの開始位置を考慮して正常に動作するようにしました。この変更のために本体のソースコードも修正しました。
今回から Google Play では APK ではなく App Bundle 形式でアプリを公開することにしました。
Android 版 SDK を更新して、ゲームデータの配布方法のうち「パターン2:アプリに内蔵する方法」に対応しました。
ONScripter::flushDirect において、画面の更新領域の横幅と縦幅の一方が正で他方が0だと Android 版で落ちるバグを修正しました。
Android 版 20220104 が Android 11 で動作しないとのご報告をいただきました。調べたところ、Android 11 以降では AndroidManifest.xml の android:requestLegacyExternalStorage="true" が無視されるようになっているようで、アプリ固有の領域以外は File API を使ってアクセスできなくなったようです。
以前から書き込みは Storage Access Framework の DocumentFile を使うようにしていたのですが、まず、読み込みについても DocumentFile を使うようにしてみました。しかし、DocumentFile.findFile のソースを見ると TreeDocumentFile.listFiles で ContentResolver.query を実行してディレクトリのファイル一覧を取得し、その各ファイルに対して DocumentsContractApi19.getName でさらに ContentResolver.query を実行しているため非常に遅くなるようです。そこで、ContentResolver.query と DocumentsContract を直接使って効率よくファイルを読み書きするようにして、Android 版 SDK と Android 版アプリを更新しました。Android 10 の実機と Android API 32 のエミュレータで動作することを確認しています。ただし、ゲームデータの配布に関する箇所は修正しておらず、後日修正する予定です。
また、本体のソースコードを修正して TTF_OpenFont ではなく TTF_OpenFontRW を使ってフォントファイルを開くようにし、Android 版では Storage Access Framework 経由してフォントファイルを開くようにしました。
なお、Android Studio からエミュレータを起動しようとすると、vulkan-1.dll が見つからないといったエラーが出て起動しなくなりましたが、以下のファイルを作成したところ起動するようになりました。
c:\users\username\.android\advancedFeatures.iniVulkan = off GLDirectMem = on
最新の Android Studio と Android SDK の環境で Android 版をビルドできるようにしました。従来の Import module による方法では Google Play Licensing Library を組み込むことができなくなっていましたが、組み込み方を変更して対応し、Android 10 の端末で動作することを確認しました。Android 版 SDK と Android 版アプリを更新しました。