generated from dellevin/template
Compare commits
5 Commits
8a0e5e4bd3
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
049ba31ccd | ||
|
|
35b6c0b446 | ||
|
|
83aa139ea7 | ||
|
|
5d41b7e922 | ||
|
|
f896ab7bbe |
53
.github/workflows/android-release.yml
vendored
53
.github/workflows/android-release.yml
vendored
@@ -15,7 +15,7 @@ concurrency:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-apks:
|
build-apks:
|
||||||
name: 构建 Debug 与 Release APK
|
name: 构建 Debug APK
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 40
|
timeout-minutes: 40
|
||||||
|
|
||||||
@@ -43,62 +43,25 @@ jobs:
|
|||||||
- name: 安装 Android SDK 37
|
- name: 安装 Android SDK 37
|
||||||
run: sdkmanager --channel=3 "platforms;android-37.0"
|
run: sdkmanager --channel=3 "platforms;android-37.0"
|
||||||
|
|
||||||
- name: 还原发布证书
|
- name: 构建 Debug APK
|
||||||
env:
|
|
||||||
ETA_RELEASE_KEYSTORE_BASE64: ${{ secrets.ETA_RELEASE_KEYSTORE_BASE64 }}
|
|
||||||
ETA_RELEASE_STORE_PASSWORD: ${{ secrets.ETA_RELEASE_STORE_PASSWORD }}
|
|
||||||
ETA_RELEASE_KEY_ALIAS: ${{ secrets.ETA_RELEASE_KEY_ALIAS }}
|
|
||||||
ETA_RELEASE_KEY_PASSWORD: ${{ secrets.ETA_RELEASE_KEY_PASSWORD }}
|
|
||||||
run: |
|
|
||||||
if [[ -z "$ETA_RELEASE_KEYSTORE_BASE64" ||
|
|
||||||
-z "$ETA_RELEASE_STORE_PASSWORD" ||
|
|
||||||
-z "$ETA_RELEASE_KEY_ALIAS" ||
|
|
||||||
-z "$ETA_RELEASE_KEY_PASSWORD" ]]; then
|
|
||||||
echo "::error::缺少 Release 签名 Secrets,请检查仓库的 Actions Secrets。"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
printf '%s' "$ETA_RELEASE_KEYSTORE_BASE64" \
|
|
||||||
| base64 --decode \
|
|
||||||
> "$RUNNER_TEMP/eta-release.jks"
|
|
||||||
|
|
||||||
- name: 构建 Debug 与 Release APK
|
|
||||||
env:
|
|
||||||
ETA_RELEASE_STORE_FILE: ${{ runner.temp }}/eta-release.jks
|
|
||||||
ETA_RELEASE_STORE_PASSWORD: ${{ secrets.ETA_RELEASE_STORE_PASSWORD }}
|
|
||||||
ETA_RELEASE_KEY_ALIAS: ${{ secrets.ETA_RELEASE_KEY_ALIAS }}
|
|
||||||
ETA_RELEASE_KEY_PASSWORD: ${{ secrets.ETA_RELEASE_KEY_PASSWORD }}
|
|
||||||
run: >-
|
run: >-
|
||||||
./gradlew --no-daemon --no-configuration-cache
|
./gradlew --no-daemon --no-configuration-cache
|
||||||
:app:assembleDebug :app:assembleRelease
|
:app:assembleDebug
|
||||||
|
|
||||||
- name: 验证并整理 APK
|
- name: 验证并整理 APK
|
||||||
id: apk
|
id: apk
|
||||||
run: |
|
run: |
|
||||||
debug_apk="app/build/outputs/apk/debug/app-debug.apk"
|
debug_apk="app/build/outputs/apk/debug/app-debug.apk"
|
||||||
release_apk="app/build/outputs/apk/release/app-release.apk"
|
|
||||||
output_dir="$RUNNER_TEMP/apks"
|
output_dir="$RUNNER_TEMP/apks"
|
||||||
apksigner_path="$(find "$ANDROID_HOME/build-tools" \
|
|
||||||
-type f -name apksigner | sort -V | tail -n 1)"
|
|
||||||
|
|
||||||
if [[ ! -f "$debug_apk" ]]; then
|
if [[ ! -f "$debug_apk" ]]; then
|
||||||
echo "::error::未找到 Debug APK。"
|
echo "::error::未找到 Debug APK。"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
if [[ ! -f "$release_apk" ]]; then
|
|
||||||
echo "::error::未找到 Release APK。"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if [[ -z "$apksigner_path" ]]; then
|
|
||||||
echo "::error::未找到 apksigner。"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
"$apksigner_path" verify "$release_apk"
|
|
||||||
mkdir -p "$output_dir"
|
mkdir -p "$output_dir"
|
||||||
cp "$debug_apk" "$output_dir/app-debug.apk"
|
cp "$debug_apk" "$output_dir/app-debug.apk"
|
||||||
cp "$release_apk" "$output_dir/app-release.apk"
|
|
||||||
echo "debug_path=$output_dir/app-debug.apk" >> "$GITHUB_OUTPUT"
|
echo "debug_path=$output_dir/app-debug.apk" >> "$GITHUB_OUTPUT"
|
||||||
echo "release_path=$output_dir/app-release.apk" >> "$GITHUB_OUTPUT"
|
|
||||||
|
|
||||||
- name: 上传 Debug APK
|
- name: 上传 Debug APK
|
||||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
||||||
@@ -106,12 +69,4 @@ jobs:
|
|||||||
path: ${{ steps.apk.outputs.debug_path }}
|
path: ${{ steps.apk.outputs.debug_path }}
|
||||||
archive: false
|
archive: false
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
retention-days: 14
|
retention-days: 14
|
||||||
|
|
||||||
- name: 上传 Release APK
|
|
||||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
|
|
||||||
with:
|
|
||||||
path: ${{ steps.apk.outputs.release_path }}
|
|
||||||
archive: false
|
|
||||||
if-no-files-found: error
|
|
||||||
retention-days: 14
|
|
||||||
@@ -5,8 +5,6 @@
|
|||||||
$env:JAVA_HOME = "D:/Environment/Java/java25" && .\gradlew.bat assembleDebug
|
$env:JAVA_HOME = "D:/Environment/Java/java25" && .\gradlew.bat assembleDebug
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**面向 Android 的第三方系统级 AI Agent**
|
**面向 Android 的第三方系统级 AI Agent**
|
||||||
|
|
||||||
Eta 借助 Root 与 LSPosed 越过 App 沙盒,直接进入系统底层:Hook 系统组件,接管电源键与厂商助手入口,读取原厂与第三方应用的私有数据。这些接近原厂、又比原厂更自由的能力,全部开放给你自己接入的模型(ChatGPT、DeepSeek、Kimi 等,自带 API Key——BYOK):
|
Eta 借助 Root 与 LSPosed 越过 App 沙盒,直接进入系统底层:Hook 系统组件,接管电源键与厂商助手入口,读取原厂与第三方应用的私有数据。这些接近原厂、又比原厂更自由的能力,全部开放给你自己接入的模型(ChatGPT、DeepSeek、Kimi 等,自带 API Key——BYOK):
|
||||||
@@ -26,7 +24,6 @@ Eta 可以看着屏幕、替你点一杯奶茶,但点屏幕不该是终点。
|
|||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> 完整能力需要 **Root** 与支持 libxposed API 102 的 **LSPosed**。App 本体不限特定厂商设备;ColorOS(小布助手)只是当前系统助手入口的适配范围。
|
> 完整能力需要 **Root** 与支持 libxposed API 102 的 **LSPosed**。App 本体不限特定厂商设备;ColorOS(小布助手)只是当前系统助手入口的适配范围。
|
||||||
|
|
||||||
|
|
||||||
## 核心能力
|
## 核心能力
|
||||||
|
|
||||||
Agent 不会问一句答一句就结束:模型发指令,Eta 执行,结果写回上下文,模型再决定下一步,直到做完。四条执行路径可以组合使用:
|
Agent 不会问一句答一句就结束:模型发指令,Eta 执行,结果写回上下文,模型再决定下一步,直到做完。四条执行路径可以组合使用:
|
||||||
@@ -185,7 +182,4 @@ Eta 的源代码公开,欢迎用于个人学习、研究、修改和非商业
|
|||||||
|
|
||||||
第三方依赖、图标和品牌素材适用各自的许可证,不由 Eta 的许可证重新授权,详情见[第三方声明](docs/THIRD_PARTY_NOTICES.md)。
|
第三方依赖、图标和品牌素材适用各自的许可证,不由 Eta 的许可证重新授权,详情见[第三方声明](docs/THIRD_PARTY_NOTICES.md)。
|
||||||
|
|
||||||
为确保项目能够统一授予商业许可,外部代码贡献需要在贡献者许可协议(CLA)流程建立后才能合并;在此之前欢迎通过 Issue 提交建议和问题。
|
为确保项目能够统一授予商业许可,外部代码贡献需要在贡献者许可协议(CLA)流程建立后才能合并;在此之前欢迎通过 Issue 提交建议和问题。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
buildscript {
|
buildscript {
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
maven(url = "https://maven.aliyun.com/repository/google")
|
||||||
mavenCentral()
|
maven(url = "https://maven.aliyun.com/repository/public")
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
// AGP 9 内置 KGP 2.2.10,但 miuix 0.9.3 与 Compose Multiplatform 1.11.1 需要 Kotlin 2.4.0,
|
// AGP 9 内置 KGP 2.2.10,但 miuix 0.9.3 与 Compose Multiplatform 1.11.1 需要 Kotlin 2.4.0,
|
||||||
|
|||||||
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip
|
distributionUrl=https\://mirrors.aliyun.com/gradle/gradle-9.6.1-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
retries=0
|
retries=0
|
||||||
retryBackOffMs=500
|
retryBackOffMs=500
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
pluginManagement {
|
pluginManagement {
|
||||||
repositories {
|
repositories {
|
||||||
google {
|
maven(url = "https://maven.aliyun.com/repository/google") {
|
||||||
content {
|
content {
|
||||||
includeGroupByRegex("com\\.android.*")
|
includeGroupByRegex("com\\.android.*")
|
||||||
includeGroupByRegex("com\\.google.*")
|
includeGroupByRegex("com\\.google.*")
|
||||||
includeGroupByRegex("androidx.*")
|
includeGroupByRegex("androidx.*")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mavenCentral()
|
maven(url = "https://maven.aliyun.com/repository/public")
|
||||||
gradlePluginPortal()
|
maven(url = "https://maven.aliyun.com/repository/gradle-plugin")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
plugins {
|
plugins {
|
||||||
@@ -17,8 +17,9 @@ plugins {
|
|||||||
dependencyResolutionManagement {
|
dependencyResolutionManagement {
|
||||||
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
maven(url = "https://maven.aliyun.com/repository/google")
|
||||||
mavenCentral()
|
maven(url = "https://maven.aliyun.com/repository/public")
|
||||||
|
maven(url = "https://maven.aliyun.com/repository/gradle-plugin")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user