Tutorial: Build OpenCPN untuk Android dari Fork abewartech (Lengkap)
OpenCPN adalah software navigasi laut open source yang dipakai banyak pelaut dan pemancing: bisa menampilkan peta laut (chart), posisi GPS, rute, sampai data AIS kapal lain. Versi Android-nya sudah lama ada, tapi port Android di upstream sudah tua — manifest masih menarget SDK 19, GPS pakai API lawas, dan tidak ada CI untuk Android.
Karena itu saya mem-fork OpenCPN dan memodernisasi build Android-nya sampai build arm64 hijau (fork: abewartech/OpenCPN). Tutorial ini menunjukkan langkah lengkapnya dari nol sampai APK, dengan perintah yang bisa di-copy-paste.
1. Yang Kamu Butuhkan
Siapkan di Linux (atau WSL/macOS):
JDK 17 CMake >= 3.16, Ninja, gettext Android SDK command-line tools Android NDK r26.1.10909125 Android platform android-35 Qt 5.15 for Android (hanya untuk perakitan APK final)
Targetnya: arm64 (prioritas), armhf opsional. Manifest fork ini pakai minSdk 24, targetSdk 35.
2. Setup Android SDK (Sekali Saja)
export JAVA_HOME=/path/to/jdk-17
export ANDROID_HOME=$HOME/android-sdk
export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$PATH
sdkmanager "platform-tools" "platforms;android-35" \
"build-tools;35.0.0" "ndk;26.1.10909125"
Pastikan JAVA_HOME menunjuk ke JDK 17 yang asli, bukan JRE.
3. Clone Fork
git clone https://github.com/abewartech/OpenCPN.git cd OpenCPN
4. Build Native Corelib (arm64)
Ini bagian terberat: chart engine, CM93, S57, renderer GL, dan JNI bridge dikompilasi jadi libgorp.so.
TOOL_BASE=$ANDROID_HOME/ndk/26.1.10909125/toolchains/llvm/prebuilt/linux-x86_64 cmake -S . -B build-android-arm64 -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DOCPN_TARGET_TUPLE:STRING="Android-arm64;21;arm64" \ -Dtool_base="$TOOL_BASE" \ -DOCPN_BUILD_TEST=OFF -DOCPN_BUNDLE_DOCS=OFF cmake --build build-android-arm64 # hasil: build-android-arm64/libgorp.so
Catatan: configure pertama mengunduh ~311 MB prebuilt Qt5/wxWidgets/OpenSSL (OCPNAndroidCoreBuildSupport v1.2) ke folder cache/. Configure berikutnya memakai ulang cache itu. Hasil build yang terverifikasi: libgorp.so 226 MB, ELF aarch64.
5. Build armhf (Opsional)
cmake -S . -B build-android-armhf -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DOCPN_TARGET_TUPLE:STRING="Android-armhf;21;armhf" \ -Dtool_base="$TOOL_BASE" \ -DOCPN_BUILD_TEST=OFF -DOCPN_BUNDLE_DOCS=OFF cmake --build build-android-armhf
6. Cek Java Layer
Tanpa Qt pun kamu bisa memverifikasi semua file Java Android terkompilasi bersih terhadap android.jar:
bash buildandroid/ci-compile-java.sh \ $ANDROID_HOME/platforms/android-35/android.jar
Skrip ini memakai stub Qt minimal yang tidak ikut di-package. Di fork ini 43 file Java lolos compile terhadap android-35.
7. Jalankan Unit Test
cmake -S android/tests -B build-android-tests cmake --build build-android-tests ctest --test-dir build-android-tests --output-on-failure
Test mencakup parsing kontrak getSystemDirs(), penanganan SAF tree-URI, dan validasi direktori dataset CM93. Hasil terverifikasi: 29 passed, 0 failed.
8. Rakit APK (Langkah Manual)
APK butuh Qt 5.15 for Android plus stack wxQt-for-Android dari support bundle. Langkahnya:
1. Build/install Qt 5.15.x for Android (arm64),
atau pakai Qt prebuilt di cache/OCPNAndroidCoreBuildSupport/qt5/build_arm64_O3
2. Letakkan libgorp.so di tempat yang diharapkan androiddeployqt
3. Dari buildandroid/android jalankan:
androiddeployqt --input android-libopencpn.so-deployment-settings.json \
--output android-build
4. Sign dengan keystore sendiri: apksigner
Catatan manifest (buildandroid/android/AndroidManifest.xml): GPS tracking berjalan sebagai foreground service (org.opencpn.GPSServer, foregroundServiceType="location"). Cek lisensi Play bersifat opt-in — build terbuka melewatinya. Jangan pernah commit Google Maps API key asli; manifest memakai placeholder __GOOGLE_MAPS_API_KEY__.
9. Yang Diperbaiki Fork Ini
Supaya build di atas bisa hijau, fork ini memperbaiki bug nyata di port Android lama:
Manifest modern: minSdk 24/target 35, permission modern, exported flags, posture scoped-storage, alur Ministro yang mati dihapus, dan Play Licensing jadi opt-in.
GPS ditulis ulang: foreground service + GnssStatus/callback NMEA modern, deteksi fix basi (stale-fix detection), dan cleanup single-listener. startForeground 3-arg yang crash di API < 29 sudah di-guard.
JNI tidak bocor lagi: GetStringUTFChars yang bocor dibungkus RAII (JniUtfChars), dan onTrimMemory membersihkan tekstur GL.
Storage/SAF: dialog file SAF diimplementasikan ulang (CheckSAFPermission/DoSAFPermissionDialog + onActivityResult), plus MANAGE_EXTERNAL_STORAGE untuk direktori chart di shared storage pada targetSdk 35.
CM93 tetap kuat: discovery CM93 tetap generik dan case-insensitive terhadap cm93obj.dic — find, scan, load, render, zoom, pan, rotate, reload, dan restart-safe, tanpa merusak chart tipe lain.
10. Troubleshooting
Configure gagal soal toolchain: pastikan tool_base menunjuk ke toolchains/llvm/prebuilt/linux-x86_64 di dalam NDK r26 (layout sysroot baru, bukan platforms/).
Download cache lambat/berulang: arahkan ulang dengan -DOCPN_ANDROID_CACHEDIR=/path/ke/cache supaya tidak unduh ulang 311 MB.
androiddeployqt tidak jalan: pastikan memakai Qt 5.15, bukan Qt 6 — port Android ini masih Qt5/wxQt.
CI merah: workflow .github/workflows/android.yml menjalankan build corelib arm64+armhf, java-check, dan unit test di setiap push. Build merah menggagalkan job; warning tidak disembunyikan.
Kesimpulan
Dengan langkah di atas kamu bisa me-reproduce build Android OpenCPN dari fork abewartech/OpenCPN sampai level native + Java + test hijau, lalu merakit APK sendiri dengan Qt 5.15. Kalau kamu pelaut yang butuh chart plotter Android modern dengan dukungan CM93 yang kuat, fork ini titik awal yang bagus.
Komentar
Posting Komentar