From 644cc3993b31853e23b7e158a0f1f1d4523e90be Mon Sep 17 00:00:00 2001 From: Kuek Hao Yang <143677684+KuekHaoYang@users.noreply.github.com> Date: Thu, 2 Apr 2026 21:03:02 +0800 Subject: [PATCH] Fix Android TV APK distribution (#139) * Fix Android TV APK distribution * Fix Android TV Gradle settings * Run Android TV APK checks on branch pushes * Add Android TV launcher assets --- .github/workflows/android-tv-apk.yml | 101 +++++++ README.md | 29 +- android-tv/app/build.gradle.kts | 15 +- android-tv/app/src/main/AndroidManifest.xml | 2 + .../main/java/com/kvideo/tv/MainActivity.kt | 136 +++++++++- .../app/src/main/res/drawable/tv_banner.xml | 24 ++ .../app/src/main/res/layout/activity_main.xml | 98 +++++++ .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 5552 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 3346 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 8482 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 16804 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 26983 bytes .../app/src/main/res/values/strings.xml | 11 + android-tv/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 63375 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- android-tv/gradlew | 248 ++++++++++++++++++ android-tv/gradlew.bat | 92 +++++++ android-tv/settings.gradle.kts | 2 +- 18 files changed, 739 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/android-tv-apk.yml create mode 100644 android-tv/app/src/main/res/drawable/tv_banner.xml create mode 100644 android-tv/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android-tv/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android-tv/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android-tv/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android-tv/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android-tv/gradle/wrapper/gradle-wrapper.jar create mode 100755 android-tv/gradlew create mode 100644 android-tv/gradlew.bat diff --git a/.github/workflows/android-tv-apk.yml b/.github/workflows/android-tv-apk.yml new file mode 100644 index 0000000..ba896b2 --- /dev/null +++ b/.github/workflows/android-tv-apk.yml @@ -0,0 +1,101 @@ +name: Android TV APK + +on: + pull_request: + paths: + - "android-tv/**" + - ".github/workflows/android-tv-apk.yml" + push: + paths: + - "android-tv/**" + - ".github/workflows/android-tv-apk.yml" + workflow_dispatch: + inputs: + release_tag: + description: "Optional release tag used to publish the built APK" + required: false + type: string + release_title: + description: "Optional release title" + required: false + type: string + kvideo_url: + description: "Optional default KVideo URL baked into the APK" + required: false + type: string + +permissions: + contents: write + +jobs: + build_android_tv_apk: + runs-on: ubuntu-latest + env: + KVIDEO_URL: ${{ github.event_name == 'workflow_dispatch' && inputs.kvideo_url || '' }} + defaults: + run: + working-directory: android-tv + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Java 17 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "17" + cache: gradle + + - name: Set up Android SDK + uses: android-actions/setup-android@v3 + + - name: Install Android SDK packages + run: sdkmanager "platforms;android-34" "build-tools;34.0.0" + + - name: Make Gradle wrapper executable + run: chmod +x ./gradlew + + - name: Build debug APK + run: ./gradlew --no-daemon assembleDebug -PkvideoUrl="$KVIDEO_URL" + + - name: Upload APK artifact + uses: actions/upload-artifact@v4 + with: + name: kvideo-android-tv-apk + path: android-tv/app/build/outputs/apk/debug/app-debug.apk + if-no-files-found: error + + - name: Publish GitHub release + if: ${{ github.event_name == 'workflow_dispatch' && inputs.release_tag != '' }} + working-directory: . + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RELEASE_TAG: ${{ inputs.release_tag }} + RELEASE_TITLE: ${{ inputs.release_title }} + run: | + release_notes="$(mktemp)" + effective_title="${RELEASE_TITLE:-Android TV APK ${RELEASE_TAG}}" + default_url_text="${KVIDEO_URL:-未预置,首次启动时手动填写}" + + cat >"$release_notes" </dev/null 2>&1; then + gh release upload "$RELEASE_TAG" "android-tv/app/build/outputs/apk/debug/app-debug.apk#KVideo-AndroidTV.apk" --clobber + gh release edit "$RELEASE_TAG" --title "$effective_title" --notes-file "$release_notes" + else + gh release create "$RELEASE_TAG" "android-tv/app/build/outputs/apk/debug/app-debug.apk#KVideo-AndroidTV.apk" \ + --title "$effective_title" \ + --notes-file "$release_notes" \ + --target "$GITHUB_SHA" + fi diff --git a/README.md b/README.md index 571a1e6..e810162 100644 --- a/README.md +++ b/README.md @@ -781,6 +781,11 @@ npm start 项目内置了一个轻量的 Android TV WebView 壳应用,可以将 KVideo 打包成 APK 安装到 Android TV 或机顶盒上。 +**直接下载:** + +- 仓库维护者可以通过 GitHub Actions 的 `Android TV APK` 工作流直接发布预构建 APK 到 **Releases** +- 用户下载安装后,首次启动时填写自己的 KVideo 地址即可,不需要再改源码重新编译 + **前置要求:** - [Android Studio](https://developer.android.com/studio)(推荐)或 Android SDK Command-line Tools @@ -788,33 +793,41 @@ npm start **步骤:** -1. **修改目标 URL**:编辑 `android-tv/app/src/main/java/com/kvideo/tv/MainActivity.kt`,将 `KVIDEO_URL` 改为你的部署地址: - ```kotlin - private const val KVIDEO_URL = "https://your-kvideo-instance.com" - ``` - -2. **使用 Android Studio 构建(推荐)**: +1. **使用 Android Studio 构建(推荐)**: - 用 Android Studio 打开 `android-tv/` 目录 - 等待 Gradle 同步完成 - 点击 **Build → Build Bundle(s) / APK(s) → Build APK(s)** - APK 输出在 `android-tv/app/build/outputs/apk/debug/app-debug.apk` -3. **使用命令行构建**: +2. **使用命令行构建**: ```bash cd android-tv ./gradlew assembleDebug ``` APK 输出在 `app/build/outputs/apk/debug/app-debug.apk` -4. **安装到 Android TV**: + 如果你希望在构建时预置默认地址,可额外传入 `-PkvideoUrl`: + ```bash + cd android-tv + ./gradlew assembleDebug -PkvideoUrl="https://your-kvideo-instance.com" + ``` + +3. **安装到 Android TV**: ```bash adb install app/build/outputs/apk/debug/app-debug.apk ``` 或通过 U 盘、文件管理器等方式侧载安装。 +4. **首次启动配置**: + - 首次打开 APK 时输入你的 KVideo 部署地址 + - 保存后应用会记住该地址,后续直接打开即可 + - 需要修改地址时,可在站点根页按返回,或使用部分遥控器的菜单键重新打开设置页 + > **注意**:此 APK 是一个 WebView 壳应用,需要你的 KVideo 实例已经部署并可访问。APK 本身不包含 KVideo 代码,仅作为 TV 端的浏览器入口。 > > **最低系统要求**:Android 8.0 (API 26) 及以上。Android 7.0 及更低版本的 WebView 不支持本项目使用的 ES2017+ JavaScript 特性和现代 CSS,可能导致白屏。如遇白屏问题,请升级系统 WebView 或使用 Android 8.0+ 设备。 +> +> **发布方式**:GitHub Actions 的 `Android TV APK` 工作流会持续验证壳应用可构建;如需对外发布预构建 APK,可手动触发该工作流并填写 `release_tag`,生成对应的 GitHub Release 资产。 #### 选项 6:Apple TV 应用构建 diff --git a/android-tv/app/build.gradle.kts b/android-tv/app/build.gradle.kts index b8bc021..374c98e 100644 --- a/android-tv/app/build.gradle.kts +++ b/android-tv/app/build.gradle.kts @@ -3,16 +3,25 @@ plugins { id("org.jetbrains.kotlin.android") version "1.9.22" } +val defaultKVideoUrl = providers + .gradleProperty("kvideoUrl") + .orElse("") + .get() + .replace("\\", "\\\\") + .replace("\"", "\\\"") + android { namespace = "com.kvideo.tv" compileSdk = 34 defaultConfig { applicationId = "com.kvideo.tv" - minSdk = 21 + minSdk = 26 targetSdk = 34 versionCode = 1 versionName = "1.0.0" + + buildConfigField("String", "DEFAULT_KVIDEO_URL", "\"$defaultKVideoUrl\"") } buildTypes { @@ -32,6 +41,10 @@ android { kotlinOptions { jvmTarget = "17" } + + buildFeatures { + buildConfig = true + } } dependencies { diff --git a/android-tv/app/src/main/AndroidManifest.xml b/android-tv/app/src/main/AndroidManifest.xml index 2dfe8bc..1cd30f1 100644 --- a/android-tv/app/src/main/AndroidManifest.xml +++ b/android-tv/app/src/main/AndroidManifest.xml @@ -14,9 +14,11 @@ + + + + + + + + + + + + + + diff --git a/android-tv/app/src/main/res/layout/activity_main.xml b/android-tv/app/src/main/res/layout/activity_main.xml index 298970e..3fc11bc 100644 --- a/android-tv/app/src/main/res/layout/activity_main.xml +++ b/android-tv/app/src/main/res/layout/activity_main.xml @@ -8,4 +8,102 @@ android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" /> + + + + + + + + + + + + + + + +