diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index b589d56..b86273d 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
index b268ef3..beaae08 100644
--- a/.idea/deploymentTargetSelector.xml
+++ b/.idea/deploymentTargetSelector.xml
@@ -4,6 +4,14 @@
+
+
+
+
+
+
+
+
diff --git a/.idea/deviceManager.xml b/.idea/deviceManager.xml
new file mode 100644
index 0000000..91f9558
--- /dev/null
+++ b/.idea/deviceManager.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 2e7eabd..b2c751a 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,7 +1,6 @@
-
-
+
diff --git a/FIX_GRADLE_WARNINGS.md b/FIX_GRADLE_WARNINGS.md
new file mode 100644
index 0000000..4d361bd
--- /dev/null
+++ b/FIX_GRADLE_WARNINGS.md
@@ -0,0 +1,138 @@
+# Gradle 构建警告修复完成报告
+
+## 🎉 修复成果总结
+
+经过本次优化,我们成功解决了项目中的大部分 Gradle 构建警告:
+
+✅ **已完成的修复:**
+- 移除了项目中重复的仓库定义
+- 统一了仓库配置到 settings.gradle.kts
+- 创建了符合最新语法规范的本地初始化脚本
+- 项目内部已无 Convention API 警告
+
+⚠️ **仍存在的警告:**
+- 用户全局 Gradle 初始化脚本 (`C:\Users\xiaji\.gradle\init.gradle`) 中的已弃用语法警告
+
+## 📁 新增文件说明
+
+### 1. 本地初始化脚本
+`gradle/init/init.gradle` - 符合最新 Gradle 语法规范的初始化脚本
+
+### 2. 构建脚本
+`build.ps1` - PowerShell 脚本,可使用本地初始化脚本进行构建
+
+## 🚀 使用方法
+
+### 方法一:使用本地初始化脚本(推荐)
+```powershell
+powershell -ExecutionPolicy Bypass -File .\build.ps1
+```
+
+### 方法二:直接使用 Gradle 命令
+```bash
+.\gradlew clean build
+```
+
+## 📊 当前状态
+
+执行 `./gradlew clean --warning-mode=all` 后:
+- 项目内部警告已全部解决 ✅
+- 仅剩用户全局配置的警告(不影响项目构建)
+- 构建过程正常完成 ✅
+
+## 📝 后续建议
+
+如需完全消除所有警告,建议:
+1. 备份当前的 `C:\Users\xiaji\.gradle\init.gradle`
+2. 将其中的 `url 'xxx'` 语法修改为 `url = uri('xxx')`
+3. 或者删除该文件,让项目使用我们提供的本地配置
+
+---
+
+# 原始修复指南
+
+## 问题分析
+
+当前构建过程中出现两类警告:
+
+1. **Groovy DSL 已弃用语法警告** (12个)
+ - 位置:用户全局 Gradle 初始化脚本 `C:\Users\xiaji\.gradle\init.gradle`
+ - 原因:使用了 `url 'xxx'` 语法,应改为 `url = uri('xxx')`
+
+2. **Convention API 已弃用警告** (2个)
+ - 位置:项目构建配置中
+ - 原因:使用了已弃用的 Convention API
+
+## 解决方案
+
+### 1. 修复用户全局 Gradle 初始化脚本
+
+将 `C:\Users\xiaji\.gradle\init.gradle` 文件中的以下语法:
+
+```groovy
+// ❌ 错误写法(已弃用)
+maven { url 'https://repo.huaweicloud.com/repository/gradle/' }
+
+// ✅ 正确写法
+maven { url = uri('https://repo.huaweicloud.com/repository/gradle/') }
+```
+
+需要修改的所有位置:
+- 第7行:pluginManagement.repositories.maven.url
+- 第8行:pluginManagement.repositories.maven.url
+- 第9行:pluginManagement.repositories.maven.url
+- 第18行:dependencyResolutionManagement.repositories.maven.url
+- 第19行:dependencyResolutionManagement.repositories.maven.url
+- 第20行:dependencyResolutionManagement.repositories.maven.url
+- 第31行:buildscript.repositories.maven.url
+- 第32行:buildscript.repositories.maven.url
+- 第33行:buildscript.repositories.maven.url
+- 第37行:repositories.maven.url
+- 第38行:repositories.maven.url
+- 第39行:repositories.maven.url
+
+### 2. 项目配置优化建议
+
+虽然项目本身配置正确,但可以进一步优化:
+
+#### 修改 settings.gradle.kts
+```kotlin
+dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) // 保持现状
+ repositories {
+ google()
+ mavenCentral()
+ maven { url = uri("https://jitpack.io") }
+ // 移除重复的阿里云镜像,因为已在全局配置中设置
+ }
+}
+```
+
+#### 修改 build.gradle.kts
+```kotlin
+allprojects {
+ repositories {
+ // 移除这些仓库定义,因为已在 settings 中统一管理
+ // google()
+ // mavenCentral()
+ // maven { url = uri("https://jitpack.io") }
+ // 阿里云镜像源也移除(由全局配置处理)
+ }
+}
+```
+
+## 验证修复结果
+
+执行以下命令验证警告是否消除:
+
+```bash
+./gradlew clean --warning-mode=all
+```
+
+预期结果:应该不再出现 Groovy DSL 语法警告和 Convention API 警告。
+
+## 注意事项
+
+1. 修改全局 init.gradle 文件会影响所有 Gradle 项目
+2. 如果只希望影响当前项目,可以将镜像配置移到项目本地的 settings.gradle.kts 中
+3. 建议备份原始 init.gradle 文件后再进行修改
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_second.xml b/app/src/main/res/layout/activity_second.xml
index 90a9ace..e2d9cf1 100644
--- a/app/src/main/res/layout/activity_second.xml
+++ b/app/src/main/res/layout/activity_second.xml
@@ -87,24 +87,30 @@
android:layout_marginTop="16dp"
android:orientation="vertical" />
+
+ android:text="点击按钮选择图片作为背景"
+ android:layout_below="@id/buttonChooseImage"
+ android:layout_centerHorizontal="true"
+ android:layout_marginTop="10dp" />
+ android:text="选择图片"
+ android:layout_centerHorizontal="true"
+ android:layout_marginTop="20dp" />
+
+
@@ -177,27 +183,5 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_second_fixed.xml b/app/src/main/res/layout/activity_second_fixed.xml
new file mode 100644
index 0000000..e2d9cf1
--- /dev/null
+++ b/app/src/main/res/layout/activity_second_fixed.xml
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26 && mv CUsersxiajiAndroidStudioProjectsflomoaiappsrcmainresmipmap-anydpiic_launcher_round.xml CUsersxiajiAndroidStudioProjectsflomoaiappsrcmainresmipmap-anydpi-v26 b/app/src/main/res/mipmap-anydpi-v26 && mv CUsersxiajiAndroidStudioProjectsflomoaiappsrcmainresmipmap-anydpiic_launcher_round.xml CUsersxiajiAndroidStudioProjectsflomoaiappsrcmainresmipmap-anydpi-v26
new file mode 100644
index 0000000..6f3b755
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26 && mv CUsersxiajiAndroidStudioProjectsflomoaiappsrcmainresmipmap-anydpiic_launcher_round.xml CUsersxiajiAndroidStudioProjectsflomoaiappsrcmainresmipmap-anydpi-v26
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build-quick.bat b/build-quick.bat
new file mode 100644
index 0000000..8c4c5f4
--- /dev/null
+++ b/build-quick.bat
@@ -0,0 +1,37 @@
+@echo off
+REM 快速构建脚本 - 使用项目本地配置避免警告
+
+echo ========================================
+echo Flomo-AI 项目快速构建脚本
+echo ========================================
+echo.
+
+REM 检查是否提供了参数
+if "%1"=="" (
+ echo 用法: build-quick.bat [gradle命令参数]
+ echo 示例: build-quick.bat clean
+ echo build-quick.bat assembleDebug
+ echo build-quick.bat test
+ echo.
+ pause
+ exit /b 1
+)
+
+echo 正在使用项目本地 Gradle 配置进行构建...
+echo 命令: %*
+
+REM 设置使用项目本地初始化脚本
+set LOCAL_INIT_SCRIPT=%~dp0gradle\init\init.gradle
+set GRADLE_OPTS=%GRADLE_OPTS% -Dorg.gradle.daemon=false
+
+echo 初始化脚本路径: %LOCAL_INIT_SCRIPT%
+echo.
+
+REM 执行构建
+call "%~dp0gradlew.bat" %* --init-script="%LOCAL_INIT_SCRIPT%" --warning-mode=summary
+
+echo.
+echo ========================================
+echo 构建完成
+echo ========================================
+pause
\ No newline at end of file
diff --git a/build.gradle.kts b/build.gradle.kts
index fccf768..cd80691 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,16 +1,7 @@
plugins {
- alias(libs.plugins.android.application).apply(false)
- alias(libs.plugins.kotlin.android).apply(false)
+ alias(libs.plugins.android.application) apply false
+ alias(libs.plugins.kotlin.android) apply false
}
-buildscript {
- repositories {
- google()
- mavenCentral()
- }
- dependencies {
- classpath(libs.gradle) // 确保这里的版本号是最新的
- classpath(libs.kotlin.gradle.plugin) // 确保这里的版本号是最新的
- classpath(libs.gson) // 使用 classpath 而不是 implementation
- }
-}
+// 仓库配置已移至 settings.gradle.kts 中统一管理
+// 避免重复定义和潜在的配置冲突
diff --git a/build.ps1 b/build.ps1
new file mode 100644
index 0000000..95701a1
--- /dev/null
+++ b/build.ps1
@@ -0,0 +1,12 @@
+# Local Gradle init script PowerShell wrapper
+
+Write-Host "Using local Gradle init script..." -ForegroundColor Green
+
+# Set environment variable
+$env:GRADLE_OPTS = "-Dorg.gradle.init.script=$PWD\gradle\init\init.gradle"
+
+# Execute Gradle command
+& "$PWD\gradlew.bat" clean --warning-mode=all
+
+Write-Host ""
+Write-Host "Build completed with local init script." -ForegroundColor Green
\ No newline at end of file
diff --git a/gradle/init/init.gradle b/gradle/init/init.gradle
new file mode 100644
index 0000000..4079c58
--- /dev/null
+++ b/gradle/init/init.gradle
@@ -0,0 +1,52 @@
+// 项目本地 Gradle 初始化脚本:阿里云镜像源配置
+// 用于替代用户全局配置,避免已弃用语法警告
+
+// 1. 插件管理仓库配置
+gradle.settingsEvaluated { settings ->
+ settings.pluginManagement {
+ repositories {
+ maven { url = uri('https://maven.aliyun.com/repository/google') }
+ maven { url = uri('https://maven.aliyun.com/repository/gradle-plugin') }
+ mavenCentral()
+ gradlePluginPortal()
+ // 备用官方源
+ google {
+ content {
+ includeGroupByRegex("com\\.android.*")
+ includeGroupByRegex("com\\.google.*")
+ includeGroupByRegex("androidx.*")
+ }
+ }
+ }
+ }
+
+ // 2. 依赖解析管理配置
+ settings.dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
+ repositories {
+ maven { url = uri('https://maven.aliyun.com/repository/google') }
+ maven { url = uri('https://maven.aliyun.com/repository/central') }
+ mavenCentral()
+ google()
+ maven { url = uri('https://jitpack.io') }
+ }
+ }
+}
+
+// 3. 兼容旧版 Gradle 的配置
+allprojects {
+ buildscript {
+ repositories {
+ maven { url = uri('https://maven.aliyun.com/repository/google') }
+ maven { url = uri('https://maven.aliyun.com/repository/gradle-plugin') }
+ mavenCentral()
+ }
+ }
+ repositories {
+ maven { url = uri('https://maven.aliyun.com/repository/google') }
+ maven { url = uri('https://maven.aliyun.com/repository/central') }
+ mavenCentral()
+ google()
+ maven { url = uri('https://jitpack.io') }
+ }
+}
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 31adb6c..f52eee5 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Thu Sep 05 19:22:20 CST 2024
+#Thu Feb 26 22:34:06 CST 2026
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
+distributionUrl=https\://repo.huaweicloud.com/gradle/gradle-9.0-milestone-1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/gradlew-local.bat b/gradlew-local.bat
new file mode 100644
index 0000000..6743268
--- /dev/null
+++ b/gradlew-local.bat
@@ -0,0 +1,13 @@
+@echo off
+REM 使用项目本地的 Gradle 初始化脚本,避免全局配置的已弃用语法警告
+
+echo 正在使用项目本地 Gradle 初始化脚本...
+
+REM 设置 Gradle 初始化脚本路径
+set GRADLE_OPTS=%GRADLE_OPTS% -Dorg.gradle.init.script=%~dp0gradle\init\init.gradle
+
+REM 执行 Gradle 命令
+call "%~dp0gradlew.bat" %*
+
+echo.
+echo 构建完成。使用了项目本地的初始化脚本以避免警告。
\ No newline at end of file
diff --git a/mumu-pytest/__pycache__/conftest.cpython-313-pytest-8.3.4.pyc b/mumu-pytest/__pycache__/conftest.cpython-313-pytest-8.3.4.pyc
new file mode 100644
index 0000000..a37988a
Binary files /dev/null and b/mumu-pytest/__pycache__/conftest.cpython-313-pytest-8.3.4.pyc differ
diff --git a/mumu-pytest/__pycache__/test_mumu.cpython-313-pytest-8.3.4.pyc b/mumu-pytest/__pycache__/test_mumu.cpython-313-pytest-8.3.4.pyc
new file mode 100644
index 0000000..0815029
Binary files /dev/null and b/mumu-pytest/__pycache__/test_mumu.cpython-313-pytest-8.3.4.pyc differ
diff --git a/mumu-pytest/conftest.py b/mumu-pytest/conftest.py
index 5ac1ce2..d90607d 100644
--- a/mumu-pytest/conftest.py
+++ b/mumu-pytest/conftest.py
@@ -100,6 +100,36 @@ class MumuEmulator:
pyautogui.press("enter")
print("按下回车")
+ def press_home(self):
+ """按 Home 键返回桌面"""
+ pyautogui.press("home")
+ print("按下 Home 键")
+
+ def right_click(self):
+ """右键点击"""
+ pyautogui.rightClick()
+ print("右键点击")
+
+ def wait_for_image(self, image_name, confidence=0.8, timeout=30):
+ """等待图片出现并返回位置"""
+ image_path = os.path.join(self.script_dir, f"{image_name}.png")
+ if not os.path.exists(image_path):
+ print(f"图片不存在: {image_path}")
+ return None
+
+ start_time = time.time()
+ while time.time() - start_time < timeout:
+ try:
+ location = pyautogui.locateOnScreen(image_path, confidence=confidence)
+ if location:
+ print(f"找到图片: {image_name}")
+ return location
+ except Exception:
+ pass
+ time.sleep(1)
+ print(f"未找到图片: {image_name}")
+ return None
+
def wait_for_boot(self, timeout=120):
"""等待模拟器启动完成"""
boot_completed = False
@@ -126,7 +156,7 @@ class MumuEmulator:
def run_sequence(self):
"""按顺序执行任务"""
self.bring_to_front()
- time.sleep(30)
+ time.sleep(5)
sequence = [
"web",
"web_address",
@@ -141,7 +171,7 @@ class MumuEmulator:
for image_name in sequence:
if image_name == "web_address":
- for _ in range(60):
+ for _ in range(10):
if self.check_image_exists("web_address"):
time.sleep(1)
self.type_text(WEB_URL)
@@ -152,7 +182,7 @@ class MumuEmulator:
else:
print("web_address 图片不存在,跳过输入URL")
else:
- self.find_and_click(image_name, timeout=60)
+ self.find_and_click(image_name, timeout=10)
time.sleep(2)
def close(self):
@@ -161,6 +191,44 @@ class MumuEmulator:
subprocess.run(["taskkill", "/F", "/IM", self.process_name])
except Exception:
pass
+
+ def uninstall_app_ui(self):
+ """通过 UI 卸载 app:按 Home 键 -> 找到 flomo -> 右键 -> Uninstall -> Uninstall Confirm"""
+ self.bring_to_front()
+ time.sleep(2)
+
+ self.press_home()
+ time.sleep(3)
+
+ location = self.wait_for_image("flomo", timeout=30)
+ if not location:
+ print("未找到 flomo 应用图标")
+ return False
+
+ center = pyautogui.center(location)
+ pyautogui.rightClick(center)
+ time.sleep(1)
+
+ location = self.wait_for_image("uninstall", timeout=10)
+ if not location:
+ print("未找到 uninstall 选项")
+ return False
+
+ center = pyautogui.center(location)
+ pyautogui.click(center)
+ time.sleep(1)
+
+ location = self.wait_for_image("uninstall-confirm", timeout=10)
+ if not location:
+ print("未找到卸载确认按钮")
+ return False
+
+ center = pyautogui.center(location)
+ pyautogui.click(center)
+ time.sleep(2)
+
+ print("卸载完成")
+ return True
class AdbHelper:
diff --git a/mumu-pytest/flomo.png b/mumu-pytest/flomo.png
new file mode 100644
index 0000000..eb387d8
Binary files /dev/null and b/mumu-pytest/flomo.png differ
diff --git a/mumu-pytest/test_mumu.py b/mumu-pytest/test_mumu.py
index ec6d849..43fb49f 100644
--- a/mumu-pytest/test_mumu.py
+++ b/mumu-pytest/test_mumu.py
@@ -57,3 +57,13 @@ def test_close_emulator(emulator):
if emulator.is_running():
emulator.close()
assert not emulator.is_running(), "模拟器关闭失败"
+
+
+def test_uninstall_app(emulator):
+ """测试卸载 flomo app"""
+ time.sleep(3)
+ if not emulator.is_running():
+ pytest.skip("模拟器未运行")
+
+ result = emulator.uninstall_app_ui()
+ assert result, "卸载 app 失败"
diff --git a/mumu-pytest/uninstall-confirm.png b/mumu-pytest/uninstall-confirm.png
new file mode 100644
index 0000000..eb1b551
Binary files /dev/null and b/mumu-pytest/uninstall-confirm.png differ
diff --git a/mumu-pytest/uninstall.png b/mumu-pytest/uninstall.png
new file mode 100644
index 0000000..16e2f10
Binary files /dev/null and b/mumu-pytest/uninstall.png differ
diff --git a/settings.gradle.kts b/settings.gradle.kts
index dac4470..bffadbb 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -1,5 +1,11 @@
pluginManagement {
repositories {
+ // 使用阿里云镜像加速
+ maven { url = uri("https://maven.aliyun.com/repository/google") }
+ maven { url = uri("https://maven.aliyun.com/repository/gradle-plugin") }
+ mavenCentral()
+ gradlePluginPortal()
+ // 备用官方源
google {
content {
includeGroupByRegex("com\\.android.*")
@@ -7,15 +13,18 @@ pluginManagement {
includeGroupByRegex("androidx.*")
}
}
- mavenCentral()
- gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
- google()
+ // 使用阿里云镜像加速
+ maven { url = uri("https://maven.aliyun.com/repository/google") }
+ maven { url = uri("https://maven.aliyun.com/repository/central") }
mavenCentral()
+ google()
+ // 添加 JitPack 仓库以支持 PermissionX 等开源库
+ maven { url = uri("https://jitpack.io") }
}
}