過去の開発日誌

2022年

1月23日

Android 版 SDK を更新して、ゲームデータの配布方法のうち「パターン2:アプリに内蔵する方法」でアプリのアセットにゲームデータを配置した場合に、インストール時にゲームデータを展開せず、実行中はアセットから直接ファイルを読み込むようにしました。AssetManager.openFd は、アセットをまとめた単一ファイルの記述子を返すため、これを指定したファイルの記述子とみなしてネイティブコードに渡すと正常に動作しなくなります。今まではインストール時にアセットのファイルをすべて展開して、実行時にはそれらを読み込んでいたのですが、ディスク領域が2倍必要になるので無駄でした。今回 Android 版では、fseek, ftell, fgetc, fgets, fread, fopen をラップして、アセットファイルにおける指定したファイルの開始位置を考慮して正常に動作するようにしました。この変更のために本体のソースコードも修正しました。

今回から Google Play では APK ではなく App Bundle 形式でアプリを公開することにしました。

1月18日

Android 版 SDK を更新して、ゲームデータの配布方法のうち「パターン2:アプリに内蔵する方法」に対応しました。

1月15日

ONScripter::flushDirect において、画面の更新領域の横幅と縦幅の一方が正で他方が0だと Android 版で落ちるバグを修正しました。

1月10日

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.ini
Vulkan = off
GLDirectMem = on

1月4日

最新の Android Studio と Android SDK の環境で Android 版をビルドできるようにしました。従来の Import module による方法では Google Play Licensing Library を組み込むことができなくなっていましたが、組み込み方を変更して対応し、Android 10 の端末で動作することを確認しました。Android 版 SDK と Android 版アプリを更新しました。