diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index bc3364d..2e79402 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -7,6 +7,7 @@ on:
push:
tags:
- "v*"
+ workflow_dispatch:
jobs:
build:
@@ -34,17 +35,14 @@ jobs:
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- - name: Build Debug APK
- run: ./gradlew assembleDebug -PbuildSuffix=release
+ - name: Decode Keystore
+ run: echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > release-key.jks
- name: Build and Sign Release APK
run: ./gradlew assembleRelease -PbuildSuffix=release
- - name: Upload Debug APK
- uses: actions/upload-artifact@v7
- with:
- name: app-debug
- path: app/build/outputs/apk/debug/*.apk
+ - name: Build Debug APK
+ run: ./gradlew assembleDebug -PbuildSuffix=release
- name: Upload Release APK
uses: actions/upload-artifact@v7
@@ -52,13 +50,16 @@ jobs:
name: app-release
path: app/build/outputs/apk/release/*.apk
+ - name: Upload Debug APK
+ uses: actions/upload-artifact@v7
+ with:
+ name: app-debug
+ path: app/build/outputs/apk/debug/*.apk
+
- name: Generate Changelog
id: changelog
run: |
- # Get the previous tag
PREVIOUS_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
-
- # Generate changelog
if [ -z "$PREVIOUS_TAG" ]; then
echo "### 🎉 Initial Release" > changelog.md
else
@@ -66,29 +67,25 @@ jobs:
echo "" >> changelog.md
git log --pretty=format:"- %s" $PREVIOUS_TAG..HEAD >> changelog.md
fi
-
echo "" >> changelog.md
+ - name: Create tag if manual trigger
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ git config user.name "github-actions[bot]"
+ git config user.email "github-actions[bot]@users.noreply.github.com"
+ NEW_TAG="v$(date +%Y%m%d.%H%M%S)"
+ git tag "$NEW_TAG"
+ git push origin "$NEW_TAG"
+ echo "RELEASE_TAG=$NEW_TAG" >> $GITHUB_ENV
+
- name: Create Release and Upload Asset
uses: softprops/action-gh-release@v2
with:
- files: app/build/outputs/apk/release/*.apk
+ tag_name: ${{ github.ref_name || env.RELEASE_TAG }}
+ files: |
+ app/build/outputs/apk/release/*.apk
+ app/build/outputs/apk/debug/*.apk
body_path: changelog.md
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-
- - name: Prepare Changelog for Xposed Repo
- run: |
- echo "https://github.com/killerprojecte/REAREye/releases/tag/${{ github.ref_name }}" > changelog_xposed.md
- cat changelog.md >> changelog_xposed.md
-
- - name: Publish to Xposed Modules Repo
- uses: softprops/action-gh-release@v2
- with:
- repository: Xposed-Modules-Repo/hk.uwu.reareye
- token: ${{ secrets.XPOSED_REPO_TOKEN }}
- tag_name: ${{ github.ref_name }}
- name: ${{ github.ref_name }}
- generate_release_notes: false
- body_path: changelog_xposed.md
- files: app/build/outputs/apk/release/*.apk
diff --git a/CARD_MAKER_USAGE.md b/CARD_MAKER_USAGE.md
new file mode 100644
index 0000000..16b0a95
--- /dev/null
+++ b/CARD_MAKER_USAGE.md
@@ -0,0 +1,93 @@
+# 卡片制作器配合 REAREye 使用说明
+
+[REAREye 卡片制作器](https://guocheng1378.github.io/rear-eye-card-maker/) 是一个在线工具,可以为小米背屏制作 MAML 卡片模板。通过 REAREye 模块,可以将制作好的卡片导入到背屏上显示。
+
+## 前提条件
+
+- 小米 17 Pro / Pro Max(带背屏)
+- 已安装 LSPosed 并启用 REAREye 模块
+- REAREye 作用域包含 `com.xiaomi.subscreencenter`
+
+## 流程
+
+### 1. 制作并导出卡片
+
+1. 打开 [卡片制作器](https://guocheng1378.github.io/rear-eye-card-maker/)
+2. 选择模板(时钟、天气、音乐等 17 个预设),或从「自定义」开始
+3. 编辑元素、调整样式、选择字体
+4. 点击 **📦 导出 ZIP** 下载 `{卡片名}.zip`
+
+ZIP 包结构:
+```
+卡片名.zip
+├── manifest.xml ← MAML 模板(核心文件)
+├── var_config.xml ← 变量配置(非自定义模板才有)
+├── images/ ← 图片资源
+└── videos/ ← 视频资源
+```
+
+> 也可以点「📋 复制 XML」直接复制 MAML 代码手动粘贴。
+
+### 2. 在 REAREye 中导入模板
+
+1. 打开 REAREye 模块应用
+2. 进入 **组件模板管理器**
+3. 点击「导入模板」,选择 ZIP 文件或粘贴 XML
+4. 为模板指定一个 **business 名称**(例如 `my_clock`、`my_weather`)
+ - business 是模板的唯一标识符
+
+模板会部署到:
+```
+/data/system/theme_magic/users/{用户ID}/subscreencenter/smart_assistant/{business}/
+```
+
+### 3. 绑定卡片到背屏
+
+1. 进入 REAREye **卡片管理器**
+2. 添加新卡片:
+ - **标题**:自定义名称
+ - **目标包名**:`com.xiaomi.subscreencenter`(默认)
+ - **business**:与第二步设置的名称一致
+ - **优先级**:数字越大越靠前,默认 500
+ - **常驻**:勾选后卡片一直显示
+3. 保存
+
+### 4. 生效
+
+- 修改配置后,重启 `com.xiaomi.subscreencenter` 或重启系统
+
+## 模板类型说明
+
+| 模板类型 | 浏览器预览 | 背屏真机 |
+|---------|-----------|---------|
+| 普通模板(时钟、名言等) | 可正常预览 | 正常显示 |
+| 真实设备模板(天气/音乐) | 显示占位数据 | 绑定系统数据,显示真实内容 |
+
+使用天气/音乐真实模板时,需确保 REAREye 相关 hook 功能已启用。
+
+## 设备分辨率
+
+| 设备 | 分辨率 | 摄像头区域 |
+|------|--------|-----------|
+| Pro Max | 976×596 | 30% |
+| Pro | 904×572 | 30% |
+| 标准版 | 840×520 | 28% |
+| Ultra | 1020×620 | 32% |
+
+## 常见问题
+
+**Q:导入后背屏没显示?**
+- 检查 business 名称是否一致
+- 重启背屏中心或重启系统
+- 确认 REAREye 已启用且作用域包含 `com.xiaomi.subscreencenter`
+
+**Q:修改已导入的模板?**
+- 重新编辑 → 导出 → 用同一 business 名称重新导入覆盖
+
+**Q:多个卡片?**
+- 每个模板用不同 business 名称导入,分别绑定即可
+
+## 相关链接
+
+- 卡片制作器:
+- 卡片制作器仓库:
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 47e8c67..6c09f9b 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -74,7 +74,11 @@ android {
buildTypes {
getByName("debug") {
- signingConfig = signingConfigs.getByName("release")
+ // Use release signing if keystore secrets are configured
+ if (System.getenv("KEYSTORE_PASSWORD") != null) {
+ signingConfig = signingConfigs.getByName("release")
+ }
+ // Otherwise use default debug keystore (CI builds without secrets)
}
release {
isMinifyEnabled = true
diff --git a/rear-widget-api/build.gradle.kts b/rear-widget-api/build.gradle.kts
index 2c42703..c6a6582 100644
--- a/rear-widget-api/build.gradle.kts
+++ b/rear-widget-api/build.gradle.kts
@@ -12,7 +12,12 @@ val apiVersion = "1.0.1"
android {
namespace = "hk.uwu.reareye.widgetapi"
- compileSdk = gropify.project.android.compileSdk
+ compileSdk {
+ version =
+ release(gropify.project.android.compileSdk) {
+ minorApiLevel = gropify.project.android.compileSdkMinor
+ }
+ }
defaultConfig {
minSdk = gropify.project.android.minSdk