Public GitHub Actions builder for the maintained FongMi TV stack. It produces installable, consistently signed Mobile and Leanback release APKs from four source repositories.
| Component | Branch | Build role |
|---|---|---|
| iptvorganization/TV | fongmi |
Android application, Mobile/Leanback UI, subtitle runtime |
| iptvorganization/media | codec-support |
Media3, AV3A renderer, Dolby Vision and HEVC-FLV |
| iptvorganization/VividLib | master |
AV3A/AVS3 native decoder source |
| iptvorganization/sherpa-onnx | master |
Java API and Android JNI speech runtime source |
The source list is machine-readable in config/sources.json.
- A scheduled workflow resolves all four branch SHAs every 15 minutes.
- A build starts only when at least one SHA differs from the last attempted source set.
workflow_dispatchcan force a build at any time.repository_dispatchevents namedsource-updatedorrebuildprovide an immediate external trigger.- Concurrency is serialized so two monitor events cannot publish competing releases.
- Attempted and successful source sets are recorded separately under
state/, preventing retry storms while preserving failure visibility.
GitHub scheduled workflows can be delayed by the platform. repository_dispatch or the Actions Run workflow button is the immediate path.
- Check out all repositories at the exact monitored SHAs.
- Build
libsherpa-onnx-jni.soforarm64-v8aandarmeabi-v7aplus the Java API JAR directly from the monitored sherpa-onnx source. The static ONNX Runtime form keeps one JNI SO per ABI. - Build
libav3aJNI.sofor both ABIs directly from the monitored VividLib source and the companion media JNI bridge. No full FFmpeg build is used. - Run Mobile/Leanback application unit tests.
- Derive an installable CI version from the source release and GitHub run number, then build four R8 release APKs:
TV-mobile-arm64-v8a.apkTV-mobile-armeabi-v7a.apkTV-leanback-arm64-v8a.apkTV-leanback-armeabi-v7a.apk
- Verify all four APK signatures, upload 30-day workflow artifacts, and publish a GitHub release with
SOURCE_REFS.json,BUILD_INFO.json, andSHA256SUMS.txt.
The application source keeps its manually maintained functional release in TV/version.properties:
VERSION_CODEis incremented for an Android feature release.VERSION_NAMEis the user-visible semantic version.
The builder does not edit that source file. For each real build it passes Gradle overrides:
versionCode = VERSION_CODE × 1,000,000 + GITHUB_RUN_NUMBERversionName = VERSION_NAME-autobuild.<run>+<TV short SHA>
This gives each published build a higher install version and makes the exact build visible in the app settings. The effective and base versions are published in BUILD_INFO.json.
The repository uses a dedicated persistent autobuild signing key stored only in GitHub Actions secrets:
AUTOBUILD_KEYSTORE_B64AUTOBUILD_STORE_PASSWORDAUTOBUILD_KEY_PASSWORD
The private key and passwords are never committed. Keeping this key stable, together with the monotonic CI versionCode, allows a later autobuild APK of the same ABI/product to update an earlier autobuild installation.
Open Actions → Monitor sources and build APKs → Run workflow. Leave force_build enabled to rebuild unchanged source SHAs.
An authorized external automation can also send:
curl --request POST \
--header "Authorization: Bearer <token-with-TV-AutoBuild-actions-write>" \
--header "Accept: application/vnd.github+json" \
https://api.github.com/repos/iptvorganization/TV-AutoBuild/dispatches \
--data '{"event_type":"source-updated"}'The public certificate is committed as autobuild-signing-cert.pem. Its SHA-256 certificate fingerprint is:
17:8A:B4:F2:5C:CC:E5:BC:B4:FA:7A:9D:38:B6:7C:7E:1F:3C:54:D2:56:D0:D2:CB:A0:6C:6E:FE:A7:10:A4:AB