3_Androidタブレット対応_実装案.mdのフェーズ1(技術スパイクと方式確定)に基づき、Kotlin + MapLibre Nativeを本線として採用できるか、対象実機とDG-PRO1RWSで検証する。
| 項目 | 値 |
|---|---|
| 機種 | Redmi Pad SE 8.7 (Xiaomi, HyperOS 2.0.203.0.VHXMIXM) |
| Android | 15 (API level 35, ビルド番号 AP3A.240905.015.A2) |
| CPU ABI | arm64-v8a, armeabi-v7a, armeabi |
| 成果条件 | 結果 | 備考 |
|---|---|---|
| 最小Androidプロジェクトが対象実機で起動する | ○ | Gradle 9.1.0 + AGP 9.0.1(従来DSL) + Kotlin 2.2.10 + Compose |
| PMTiles・筆ポリゴンをassetから表示、pan/zoomでクラッシュしない | ○ | asset直読みはクラッシュ。file://方式に変更して解決(下記) |
| 航空写真のasset XYZタイルを表示できる | ○ | 問題なく表示できた |
| DG-PRO1RWSとRFCOMM/SPP接続し生NMEAを受信できる | ○ | DG-PRO1RWS02とペアリング後、GNGGA受信を確認 |
| ネイティブ案の採否と却下条件を記録する | ○ | 本ドキュメント |
実装案は、MapLibre Native Android 11.7.0以降でpmtiles://asset://...によるAPK asset内PMTiles読み込みが可能であり、既知の byte range 不具合(#3304)も#3404・android-v11.8.8で修正済みという前提だった。採用バージョンをその条件を大きく超える12.3.1にした上で実機検証したところ、pmtiles://asset://map/offline-basemap.pmtiles形式での読み込みは以下の手順で再現性のあるクラッシュを起こした。
std::runtime_error: incorrect header check(zlib解凍エラー)がPMTilesFileSourceスレッド、libmaplibre.so内で発生.pmtilesがAndroidの既定no-compress拡張子リストに無く、APK同梱時にdeflate圧縮されるためバイト範囲読み込みとズレる → androidResources { noCompress += "pmtiles" }を追加し、unzip -lvでAPK内がStored(無圧縮)になったことを確認したが、同じクラッシュが再現したpmtiles://file://<internal storage path>方式に切り替えたところ、クラッシュが解消した根本原因は未特定。 noCompress指定は必要だが単独では不十分だった。asset直読みがなぜ失敗するかは、#3304/#3404の対象範囲外の別要因である可能性がある。file://方式(内部ストレージへの初回コピー)は実機で問題なく動作している。
実装案の最低条件(android-v11.8.8以上)に対し、12.3.1を採用した。android-v13.0.0以降はデフォルトrendererがVulkanに変わるため、対象実機のGPU/ドライバ互換性が未確認な段階では避け、OpenGL ES版として実績のある12.x系最終版を選んだ。
DG-PRO1RWS
→ Bluetooth Classic RFCOMM/SPP (標準SPP UUID)
→ NmeaSpikeSource (行単位で受信ログに積むのみ、parserは未実装)
→ BluetoothSpikePanel (暫定UI、地図に重ねて表示)
MapLibre Native 12.3.1 + MapView(AndroidViewでComposeに組込み)
→ basemap: pmtiles://file://<internal storage>/offline-basemap.pmtiles
(assets/map/からfilesDir/map/へ初回コピー)
→ aerial: asset://map/offline-tiles/gsi-seamlessphoto/{z}/{x}/{y}.jpg
→ fude: asset://map/fude-overlay.geojson
apps/android-tablet/
(実装案4節のディレクトリ構成どおり。gradle.propertiesでandroid.newDsl=false /
android.builtInKotlin=falseを指定し、従来DSL + kotlin-android + kotlin.plugin.composeを使用)
主な採用バージョン: Gradle 9.1.0 / AGP 9.0.1 / Kotlin 2.2.10 / Compose BOM 2026.06.00 / JDK 21 / compileSdk・targetSdk 36 / minSdk 35 / MapLibre Native Android 12.3.1。
./gradlew assembleDebug ./gradlew lint(9 warnings, 0 errors) ./gradlew test(対象ソースなし)すべてBUILD SUCCESSFULFixRepositoryとの統合は未実装(フェーズ2・3で実施)dev.drogger.tabletは仮のまま。正式名称は未確認apps/android-tablet/のassets/map/とtools/map/static/の同期は手作業コピーのまま。自動同期タスクは未実装(フェーズ4予定)12.3.1を固定バージョンとして扱う。13.x系へ上げる場合はVulkanレンダラーの実機互換性を再確認してから判断するmaxzoomを付けない(P2 READMEの教訓と同じ、layer側maxzoomを付けるとそのズーム以降で消えて白画面になる)成果条件5点をすべて満たした。PMTiles asset直読みのクラッシュという想定外の問題が見つかったが、実装案が用意していた退避策(file://方式)で解決できることを確認した。Kotlin + MapLibre Nativeを本線として採用し、フェーズ2(NMEAと状態管理)へ進む。