diff --git a/winboll/build.properties b/winboll/build.properties index ecbfe65..d52fadf 100644 --- a/winboll/build.properties +++ b/winboll/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Mon Jan 19 06:49:40 GMT 2026 +#Mon Jan 19 07:19:47 GMT 2026 stageCount=11 libraryProject= baseVersion=15.11 publishVersion=15.11.10 -buildCount=26 +buildCount=36 baseBetaVersion=15.11.11 diff --git a/winboll/src/main/java/cc/winboll/studio/winboll/unittest/TermuxEnvTestActivity.java b/winboll/src/main/java/cc/winboll/studio/winboll/unittest/TermuxEnvTestActivity.java index 0c6810b..07bddcc 100644 --- a/winboll/src/main/java/cc/winboll/studio/winboll/unittest/TermuxEnvTestActivity.java +++ b/winboll/src/main/java/cc/winboll/studio/winboll/unittest/TermuxEnvTestActivity.java @@ -23,10 +23,10 @@ import java.nio.charset.StandardCharsets; /** * @Author 豆包&ZhanGSKen * @Date 2026/01/19 11:11:00 - * @LastEditTime 2026/01/20 15:30:00 + * @LastEditTime 2026/01/21 10:45:00 * @Describe Termux环境测试工具(跨包+sharedUserId模式) * 适配不同应用包名(当前包:cc.winboll.studio.winboll.beta / Termux包:com.termux) - * 支持Termux目录读取、命令执行及结果展示,基于sharedUserId实现跨包权限适配 + * 支持Termux目录读取、Gradle命令执行(唤起窗口显示输出),基于sharedUserId实现跨包权限适配 */ public class TermuxEnvTestActivity extends BaseWinBoLLActivity { // 常量属性(置顶排列) @@ -70,6 +70,7 @@ public class TermuxEnvTestActivity extends BaseWinBoLLActivity { initMsg.append("当前应用包名:").append(getPackageName()).append("\n"); initMsg.append("Termux应用包名:com.termux\n"); initMsg.append("sharedUserId:com.termux(需一致)\n"); + initMsg.append("支持功能:目录读取、Gradle命令执行(唤起Termux窗口)\n"); initMsg.append("-------------------------\n"); tvMessage.setText(initMsg.toString()); @@ -121,8 +122,8 @@ public class TermuxEnvTestActivity extends BaseWinBoLLActivity { if (createSuccess) { LogUtils.d(TAG, "initTermuxDirectory() Termux目录创建成功:" + TERMUX_HOME_PATH); tvMessage.append("Termux目录创建成功:"); - tvMessage.append(TERMUX_HOME_PATH); - tvMessage.append("\n"); + tvMessage.append(TERMUX_HOME_PATH); + tvMessage.append("\n"); } else { LogUtils.e(TAG, "initTermuxDirectory() 错误:Termux目录创建失败"); tvMessage.append("警告:Termux目录创建失败!\n请检查:\n1.AndroidManifest.xml中sharedUserId是否为com.termux\n2.设备是否已root(部分机型需root才能跨包写私有目录)\n"); @@ -138,60 +139,68 @@ public class TermuxEnvTestActivity extends BaseWinBoLLActivity { String fileListStr = readTermuxHomeFileList(); tvMessage.append(fileListStr); - tvMessage.append("\n-------------------------\n"); + tvMessage.append("\n-------------------------\n"); LogUtils.d(TAG, "onTestTermuxEnv() 执行完成,读取结果长度:" + fileListStr.length() + "字符"); } /** - * 测试执行Termux命令(按钮点击事件) + * 测试执行Gradle命令(唤起Termux窗口,修复source加载+目录容错) */ + public void onTestTermuxCMD(View view) { + LogUtils.d(TAG, "onTestTermuxCMD() 按钮点击,执行Gradle命令(修复环境变量加载)"); + tvMessage.append("\n【测试:执行Gradle命令(Termux窗口)】\n"); + + // 1. 校验Termux是否安装 + if (!TermuxCommandExecutor.isTermuxInstalled(this)) { + LogUtils.e(TAG, "onTestTermuxCMD() 错误:未安装Termux应用"); + tvMessage.append("错误:未安装Termux应用(包名:com.termux)\n"); + return; + } + + // 2. 定义核心路径(确保路径与Termux中一致) + String gradleFullPath = "/data/data/com.termux/files/home/gradle/gradle-7.5.1/bin/gradle"; + String projectPath = TERMUX_HOME_PATH + "/Sources/WinBoLL"; // 项目目录 + + // 3. 构造命令(关键修复:&&前后加空格,目录容错,双重环境变量保障) + String targetCmd = ""; + // 步骤1:进入项目目录(不存在则创建,避免cd失败) + targetCmd += "cd " + projectPath + " || (mkdir -p " + projectPath + " && cd " + projectPath + ") && "; + // 步骤2:加载bash环境变量(&&前后加空格,确保解析) + targetCmd += "source ~/.bashrc && "; + // 步骤3:显式添加Gradle路径到PATH(双重保障,避免source失效) + targetCmd += "export PATH=/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/home/gradle/gradle-7.5.1/bin:$PATH && "; + // 步骤4:执行Gradle版本查询(指定完整路径,三重保障) + //targetCmd += gradleFullPath + " -v && "; + targetCmd += gradleFullPath + " task --all | grep assemble && "; + // 步骤5:执行成功提示,保持窗口打开 + targetCmd += "echo '\n✅ 命令执行成功!' && echo '\n📌 项目目录:" + projectPath + "' && read -p '按回车键关闭终端...'"; + + LogUtils.d(TAG, "onTestTermuxCMD() 执行命令:" + targetCmd); + + // 4. 执行命令(终端会话模式,唤起Termux窗口) + boolean cmdSuccess = TermuxCommandExecutor.executeTerminalCommand(this, targetCmd); + if (!cmdSuccess) { + LogUtils.e(TAG, "onTestTermuxCMD() 错误:命令发送失败"); + tvMessage.append("命令发送失败!\n可能原因:\n1.Termux未开启外部应用调用权限(执行termux-setup-storage后配置)\n2.sharedUserId配置不一致\n3.设备未root导致目录创建失败\n"); + return; + } + + // 5. 应用内详细提示 + tvMessage.append("已唤起Termux窗口,执行流程:\n"); + tvMessage.append("1. 检查并创建项目目录:"); + tvMessage.append(projectPath); + tvMessage.append("\n"); + tvMessage.append("2. 加载Termux环境变量(source ~/.bashrc)\n"); + tvMessage.append("3. 执行Gradle版本查询\n"); + tvMessage.append("⚙️ Gradle路径:"); + tvMessage.append(gradleFullPath); + tvMessage.append("\n"); + tvMessage.append("-------------------------\n"); + } + /** - * 测试执行Termux命令(按钮点击事件,唤起Termux窗口并直接显示输出) - */ - public void onTestTermuxCMD(View view) { - LogUtils.d(TAG, "onTestTermuxCMD() 按钮点击,开始执行Termux命令(终端会话模式)"); - tvMessage.append("\n【测试:执行Termux命令(唤起窗口)】\n"); - - // 1. 校验Termux是否安装 - if (!TermuxCommandExecutor.isTermuxInstalled(this)) { - LogUtils.e(TAG, "onTestTermuxCMD() 错误:未安装Termux应用"); - tvMessage.append("错误:未安装Termux应用(包名:com.termux)\n"); - return; - } - - // 2. 校验目录是否存在 - File termuxDir = new File(TERMUX_HOME_PATH); - if (!termuxDir.exists()) { - LogUtils.e(TAG, "onTestTermuxCMD() 错误:Termux目录不存在,路径:" + TERMUX_HOME_PATH); - tvMessage.append("错误:Termux目录不存在,无法执行命令\n"); - return; - } - - // 3. 构造命令(无重定向,直接在Termux窗口执行) - tvMessage.append("正在唤起Termux窗口并执行命令...\n"); - //String targetCmd = "ls -la " + TERMUX_HOME_PATH + " && echo '\n系统信息:' && uname -a && echo '\n当前用户:' && whoami"; - // 命令末尾添加read,执行完后等待用户按回车 - String targetCmd = "ls -la " + TERMUX_HOME_PATH + " && echo '\n系统信息:' && uname -a && echo '\n当前用户:' && whoami && read -p '按回车键关闭终端...'"; - LogUtils.d(TAG, "onTestTermuxCMD() 执行命令:" + targetCmd); - - // 关键修改:调用executeTerminalCommand(默认终端会话模式,唤起Termux窗口) - // 移除输出重定向,让命令直接在Termux窗口中显示 - boolean cmdSuccess = TermuxCommandExecutor.executeTerminalCommand(this, targetCmd); - if (!cmdSuccess) { - LogUtils.e(TAG, "onTestTermuxCMD() 错误:命令发送失败"); - tvMessage.append("命令发送失败!\n可能原因:\n1.Termux未开启外部应用调用权限\n2.sharedUserId配置不一致\n"); - return; - } - - // 提示用户查看Termux窗口 - tvMessage.append("已唤起Termux窗口,命令输出将直接显示在Termux中\n"); - tvMessage.append("-------------------------\n"); - } - - /** - * 跨包读取Termux命令结果文件 - * @return 命令执行结果字符串 + * 跨包读取Termux命令结果文件(保留原功能,兼容其他场景) */ private String readCmdResultDirectly() { LogUtils.d(TAG, "readCmdResultDirectly() 开始读取命令结果,文件路径:" + CMD_RESULT_FILE); @@ -238,7 +247,7 @@ public class TermuxEnvTestActivity extends BaseWinBoLLActivity { } /** - * 删除命令结果临时文件 + * 删除命令结果临时文件(保留原功能) */ private void deleteCmdResultFile() { LogUtils.d(TAG, "deleteCmdResultFile() 开始删除临时文件,路径:" + CMD_RESULT_FILE); @@ -263,8 +272,7 @@ public class TermuxEnvTestActivity extends BaseWinBoLLActivity { } /** - * 跨包读取Termux目录文件列表 - * @return 目录文件列表字符串 + * 跨包读取Termux目录文件列表(保留原功能) */ private String readTermuxHomeFileList() { LogUtils.d(TAG, "readTermuxHomeFileList() 开始读取目录,路径:" + TERMUX_HOME_PATH); @@ -313,8 +321,6 @@ public class TermuxEnvTestActivity extends BaseWinBoLLActivity { /** * 格式化文件大小(B→KB→MB) - * @param length 文件长度(字节) - * @return 格式化后的文件大小字符串 */ private String formatFileSize(long length) { LogUtils.d(TAG, "formatFileSize() 调用,文件长度:" + length + "B");