From 771f591a3ade63648fdbef9520fa7e53b88921fb Mon Sep 17 00:00:00 2001 From: qinglong Date: Sat, 16 May 2026 17:30:01 +0800 Subject: [PATCH 01/32] =?UTF-8?q?=E5=90=88=E5=B9=B6=20APPBase=20=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appbase/build.properties | 4 ++-- libappbase/build.properties | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/appbase/build.properties b/appbase/build.properties index 9d9b58f..66fc02d 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat May 16 03:50:01 CST 2026 +#Sat May 16 09:15:15 GMT 2026 stageCount=10 libraryProject=libappbase baseVersion=15.20 publishVersion=15.20.9 -buildCount=6 +buildCount=7 baseBetaVersion=15.20.10 diff --git a/libappbase/build.properties b/libappbase/build.properties index 9d9b58f..66fc02d 100644 --- a/libappbase/build.properties +++ b/libappbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat May 16 03:50:01 CST 2026 +#Sat May 16 09:15:15 GMT 2026 stageCount=10 libraryProject=libappbase baseVersion=15.20 publishVersion=15.20.9 -buildCount=6 +buildCount=7 baseBetaVersion=15.20.10 From c7d79e160b6f0b4157ae13a40c2f2a8106574b57 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 10:50:04 +0800 Subject: [PATCH 02/32] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Projects=5FKeeper=5FTag?= =?UTF-8?q?=E4=BB=93=E5=BA=93=E5=90=88=E5=B9=B6=E7=AE=A1=E7=90=86=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ashMergeProjects-to-Projects_Keeper_Tag.sh | 223 ++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 .winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh diff --git a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh new file mode 100644 index 0000000..c791a71 --- /dev/null +++ b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh @@ -0,0 +1,223 @@ +#!/system/bin/sh +## 合并其他项目分支的模块源码到projects-keeper分支。 + +# ====================== 函数定义:获取模块最新提交对应的远程标签 ====================== +# 参数1:模块名(小写如appbase、aes) +# 自动以 origin/模块名 作为远程分支 +# 返回:有标签输出标签名,无标签输出空 +get_module_latest_tag() { + local module_dir="$1" + local remote_branch="origin/${module_dir}" + + # 获取该模块目录最新一次提交CommitHash + local latest_commit + latest_commit=$(git log -1 --pretty=format:%H "$remote_branch" -- "$module_dir"/ 2>/dev/null) + + # 匹配远程同commit、模块前缀的标签,过滤废弃^{}引用 + git ls-remote --tags origin "${module_dir}*" 2>/dev/null \ + | grep -v '\^{}' \ + | grep "^${latest_commit}" \ + | awk '{print $2}' \ + | sed "s/refs\/tags\///" +} + +# ====================== 0. 进入目标目录 ====================== +TARGET_DIR="/sdcard/AppProjects/Projects_Keeper_Tag" + +echo "切换工作目录到:$TARGET_DIR" +if ! cd "$TARGET_DIR"; then + echo "==============================================" + echo "错误:无法进入目标目录 $TARGET_DIR" + echo "==============================================" + exit 1 +fi + +# ====================== 1. 拉取远程最新源码(失败直接退出) ====================== +echo "==============================================" +echo "正在拉取远程最新源码..." +echo "==============================================" +if ! git pull; then + echo "==============================================" + echo "错误:拉取远程源码失败!" + echo "请检查网络、仓库冲突或手动处理 git 状态后再执行脚本。" + echo "==============================================" + exit 1 +fi +echo "✅ 源码已拉取为最新状态" +echo "" + +# ====================== 2. 目录路径检查 ====================== +CUR_DIR=$(pwd) +if [ "$CUR_DIR" != "$TARGET_DIR" ]; then + echo "错误:当前目录不是项目根目录!" + echo "请先进入目录:$TARGET_DIR" + exit 1 +fi + +# ====================== 3. Git 分支检查 ====================== +CUR_BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null) +TARGET_BRANCH="projects-keeper" + +if [ "$CUR_BRANCH" != "$TARGET_BRANCH" ]; then + echo "错误:当前不在 $TARGET_BRANCH 分支!" + echo "当前分支:$CUR_BRANCH" + echo "请先执行:git checkout $TARGET_BRANCH" + exit 1 +fi + +# ====================== 4. 预设标准模块列表 ====================== +MERGE_OBJECTS_LIST=( +.git +.gitignore +.gitmodules +.winboll +GenKeyStore +LICENSE +LICENSE-Private-Demo +LICENSE-Private-Demo_docs +README.md +aes +appbase +autonfc +build.gradle +contacts +debugtemp +gallery +gpsrelaysentinel +gradle +gradle.properties-android-demo +gradle.properties-androidx-demo +gradlew +libaes +libappbase +libdebugtemp +libgpsrelaysentinel +libwinboll +local.properties-demo +mymessagemanager +positions +powerbell +settings.gradle-demo +winboll +winboll.properties-demo +) + +# ====================== 5. 获取当前目录真实文件列表 ====================== +REAL_ITEMS=() +while IFS= read -r line; do + if [[ "$line" != "." && "$line" != ".." ]]; then + REAL_ITEMS+=("$line") + fi +done < <(ls -a) + +# ====================== 6. 差异比对函数 ====================== +check_diff() { + local missing=() + local extra=() + + for item in "${MERGE_OBJECTS_LIST[@]}"; do + local found=0 + for r in "${REAL_ITEMS[@]}"; do + if [[ "$item" == "$r" ]]; then + found=1 + break + fi + done + if (( found == 0 )); then + missing+=("$item") + fi + done + + for r in "${REAL_ITEMS[@]}"; do + local found=0 + for item in "${MERGE_OBJECTS_LIST[@]}"; do + if [[ "$item" == "$r" ]]; then + found=1 + break + fi + done + if (( found == 0 )); then + extra+=("$r") + fi + done + + if [[ ${#missing[@]} -gt 0 || ${#extra[@]} -gt 0 ]]; then + echo "==============================================" + echo "【错误】合并环境与脚本预设列表不匹配!" + echo "请手动核对并修改合并脚本。" + echo "==============================================" + + if [[ ${#missing[@]} -gt 0 ]]; then + echo -e "\n👉 本地缺失项目:" + for m in "${missing[@]}"; do echo " $m"; done + fi + + if [[ ${#extra[@]} -gt 0 ]]; then + echo -e "\n👉 本地多余项目:" + for e in "${extra[@]}"; do echo " $e"; done + fi + + echo -e "\n==============================================" + exit 1 + fi +} + +# 执行差异校验 +check_diff + +# ====================== 全部校验通过,继续执行合并 ====================== +echo -e "#@@@ 开始合并模块源码 @@@# +## 目标合并对象列表:" + +for item in "${MERGE_OBJECTS_LIST[@]}"; do + echo "$item" +done + +echo -e "## 对象列表结束 +" + +## 合并 APP 项目 +MERGE_APP_PROJECT_LIST=( +DemoAPP +) +echo -e "#@@@ 开始合并应用型模块源码 @@@#" + +for item in "${MERGE_APP_PROJECT_LIST[@]}"; do + item_lower=$(echo "$item" | tr 'A-Z' 'a-z') + # 自动使用 origin/模块名 作为远程分支,检测标签 + MOD_TAG=$(get_module_latest_tag "$item_lower") + if [ -z "$MOD_TAG" ]; then + echo "跳过 $item_lower :最新提交未打标签" + continue + fi + echo "合并 $item_lower (远程分支:origin/$item_lower,标签:$MOD_TAG)" + git checkout origin/$item_lower $item_lower + git add . + git commit -m "合并 $item 项目(对应标签:$MOD_TAG)" +done + +## 合并 LIB 项目 +MERGE_LIB_PROJECT_LIST=( +WinBoLL +APPBase +AES +) +echo -e "#@@@ 开始合并类库型模块源码 @@@#" + +for item in "${MERGE_LIB_PROJECT_LIST[@]}"; do + item_lower=$(echo "$item" | tr 'A-Z' 'a-z') + # 自动使用 origin/模块名 作为远程分支,检测标签 + MOD_TAG=$(get_module_latest_tag "$item_lower") + if [ -z "$MOD_TAG" ]; then + echo "跳过 $item_lower :最新提交未打标签" + continue + fi + echo "合并 $item_lower (远程分支:origin/$item_lower,标签:$MOD_TAG)" + git checkout origin/$item_lower $item_lower lib$item_lower + git add . + git commit -m "合并 $item 项目(对应标签:$MOD_TAG)" +done + +echo '正在推送 Projects_Keeper 项目' +git push + From dc4eeefa55f832b58526d0af1f69aff483d6169a Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 11:04:46 +0800 Subject: [PATCH 03/32] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=E5=88=86=E6=94=AF?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E6=A3=80=E6=B5=8B=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh index c791a71..38f8586 100644 --- a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh +++ b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh @@ -1,5 +1,5 @@ #!/system/bin/sh -## 合并其他项目分支的模块源码到projects-keeper分支。 +## 合并其他项目分支的模块源码到projects_keeper_tag分支。 # ====================== 函数定义:获取模块最新提交对应的远程标签 ====================== # 参数1:模块名(小写如appbase、aes) @@ -56,7 +56,7 @@ fi # ====================== 3. Git 分支检查 ====================== CUR_BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null) -TARGET_BRANCH="projects-keeper" +TARGET_BRANCH="projects_keeper_tag" if [ "$CUR_BRANCH" != "$TARGET_BRANCH" ]; then echo "错误:当前不在 $TARGET_BRANCH 分支!" From c88a0a52a89c454b0061b754233aeb3d8268dccc Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 11:09:45 +0800 Subject: [PATCH 04/32] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E8=8E=B7=E5=8F=96bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...bashMergeProjects-to-Projects_Keeper_Tag.sh | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh index 38f8586..a568128 100644 --- a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh +++ b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh @@ -9,14 +9,25 @@ get_module_latest_tag() { local module_dir="$1" local remote_branch="origin/${module_dir}" - # 获取该模块目录最新一次提交CommitHash + # 先同步远程分支元数据 + git fetch origin "$module_dir" 2>/dev/null + + # 【修复】直接取远程分支最新完整Commit,再限定模块目录 local latest_commit latest_commit=$(git log -1 --pretty=format:%H "$remote_branch" -- "$module_dir"/ 2>/dev/null) - # 匹配远程同commit、模块前缀的标签,过滤废弃^{}引用 + echo " 调试:模块[$module_dir] 最新Commit = $latest_commit" + + # 无commit直接返回空 + if [ -z "$latest_commit" ]; then + echo " 调试:未获取到有效Commit,跳过" + return + fi + + # 【修复】放宽匹配,不用严格行首,兼容ls-remote输出格式 git ls-remote --tags origin "${module_dir}*" 2>/dev/null \ | grep -v '\^{}' \ - | grep "^${latest_commit}" \ + | grep "$latest_commit" \ | awk '{print $2}' \ | sed "s/refs\/tags\///" } @@ -220,4 +231,3 @@ done echo '正在推送 Projects_Keeper 项目' git push - From 025c095bcd4d8e0ecbc9c43db3b5a4ac163fc9b6 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 11:18:06 +0800 Subject: [PATCH 05/32] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=A4=87=E6=B3=A8?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=B8=A6=E4=B8=8A=E6=A0=87=E7=AD=BE=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ashMergeProjects-to-Projects_Keeper_Tag.sh | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh index a568128..b638a6a 100644 --- a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh +++ b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh @@ -12,19 +12,14 @@ get_module_latest_tag() { # 先同步远程分支元数据 git fetch origin "$module_dir" 2>/dev/null - # 【修复】直接取远程分支最新完整Commit,再限定模块目录 + # 获取该模块目录最新一次提交CommitHash local latest_commit latest_commit=$(git log -1 --pretty=format:%H "$remote_branch" -- "$module_dir"/ 2>/dev/null) - echo " 调试:模块[$module_dir] 最新Commit = $latest_commit" - # 无commit直接返回空 - if [ -z "$latest_commit" ]; then - echo " 调试:未获取到有效Commit,跳过" - return - fi + [ -z "$latest_commit" ] && return - # 【修复】放宽匹配,不用严格行首,兼容ls-remote输出格式 + # 匹配远程同commit、模块前缀的标签,过滤废弃^{}引用 git ls-remote --tags origin "${module_dir}*" 2>/dev/null \ | grep -v '\^{}' \ | grep "$latest_commit" \ @@ -195,7 +190,6 @@ echo -e "#@@@ 开始合并应用型模块源码 @@@#" for item in "${MERGE_APP_PROJECT_LIST[@]}"; do item_lower=$(echo "$item" | tr 'A-Z' 'a-z') - # 自动使用 origin/模块名 作为远程分支,检测标签 MOD_TAG=$(get_module_latest_tag "$item_lower") if [ -z "$MOD_TAG" ]; then echo "跳过 $item_lower :最新提交未打标签" @@ -204,7 +198,8 @@ for item in "${MERGE_APP_PROJECT_LIST[@]}"; do echo "合并 $item_lower (远程分支:origin/$item_lower,标签:$MOD_TAG)" git checkout origin/$item_lower $item_lower git add . - git commit -m "合并 $item 项目(对应标签:$MOD_TAG)" + # 提交备注带上标签名 + git commit -m "合并 $item 项目,关联标签:$MOD_TAG" done ## 合并 LIB 项目 @@ -217,7 +212,6 @@ echo -e "#@@@ 开始合并类库型模块源码 @@@#" for item in "${MERGE_LIB_PROJECT_LIST[@]}"; do item_lower=$(echo "$item" | tr 'A-Z' 'a-z') - # 自动使用 origin/模块名 作为远程分支,检测标签 MOD_TAG=$(get_module_latest_tag "$item_lower") if [ -z "$MOD_TAG" ]; then echo "跳过 $item_lower :最新提交未打标签" @@ -226,7 +220,8 @@ for item in "${MERGE_LIB_PROJECT_LIST[@]}"; do echo "合并 $item_lower (远程分支:origin/$item_lower,标签:$MOD_TAG)" git checkout origin/$item_lower $item_lower lib$item_lower git add . - git commit -m "合并 $item 项目(对应标签:$MOD_TAG)" + # 提交备注带上标签名 + git commit -m "合并 $item 项目,关联标签:$MOD_TAG" done echo '正在推送 Projects_Keeper 项目' From cd375cefc585732ca0a89283495f2523676682f8 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 11:25:44 +0800 Subject: [PATCH 06/32] =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E5=8F=96=E8=BF=9C?= =?UTF-8?q?=E7=A8=8B=E5=88=86=E6=94=AF=20origin/xxx=20=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E5=85=A8=E9=87=8F=20Commit=EF=BC=8C=E4=B8=8D=E9=99=90=E5=88=B6?= =?UTF-8?q?=E5=AD=90=E7=9B=AE=E5=BD=95=20=E2=80=8B=202.=C2=A0=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=A0=87=E7=AD=BE=E5=8C=B9=E9=85=8D=EF=BC=9A=E5=8F=AA?= =?UTF-8?q?=E8=A6=81=E6=A0=87=E7=AD=BE=E5=89=8D=E7=BC=80=E6=98=AF=20=C2=A0?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=90=8D-=C2=A0=20=E5=B0=B1=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=20=E2=80=8B=203.=C2=A0=E4=BF=9D=E7=95=99=E4=BD=A0?= =?UTF-8?q?=E5=8E=9F=E6=9C=89=E5=85=A8=E9=83=A8=E8=84=9A=E6=9C=AC=E7=BB=93?= =?UTF-8?q?=E6=9E=84=EF=BC=8C=E5=8F=AA=E6=94=B9=20=C2=A0get=5Fmodule=5Flat?= =?UTF-8?q?est=5Ftag=C2=A0=20=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ashMergeProjects-to-Projects_Keeper_Tag.sh | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh index b638a6a..e61421c 100644 --- a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh +++ b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh @@ -12,18 +12,22 @@ get_module_latest_tag() { # 先同步远程分支元数据 git fetch origin "$module_dir" 2>/dev/null - # 获取该模块目录最新一次提交CommitHash + # 修复:取整个远程分支最新Commit,不限制子目录 local latest_commit - latest_commit=$(git log -1 --pretty=format:%H "$remote_branch" -- "$module_dir"/ 2>/dev/null) + latest_commit=$(git log -1 --pretty=format:%H "$remote_branch" 2>/dev/null) + + echo " 调试:模块[$module_dir] 远程分支最新Commit = $latest_commit" # 无commit直接返回空 - [ -z "$latest_commit" ] && return + if [ -z "$latest_commit" ]; then + echo " 调试:未获取到有效Commit,跳过" + return + fi - # 匹配远程同commit、模块前缀的标签,过滤废弃^{}引用 - git ls-remote --tags origin "${module_dir}*" 2>/dev/null \ + # 精准匹配:模块名- 开头标签 + 严格比对commit哈希 + git ls-remote --tags origin "${module_dir}-*" 2>/dev/null \ | grep -v '\^{}' \ - | grep "$latest_commit" \ - | awk '{print $2}' \ + | awk -v target_commit="$latest_commit" '$1 == target_commit {print $2}' \ | sed "s/refs\/tags\///" } @@ -190,6 +194,7 @@ echo -e "#@@@ 开始合并应用型模块源码 @@@#" for item in "${MERGE_APP_PROJECT_LIST[@]}"; do item_lower=$(echo "$item" | tr 'A-Z' 'a-z') + # 自动使用 origin/模块名 作为远程分支,检测标签 MOD_TAG=$(get_module_latest_tag "$item_lower") if [ -z "$MOD_TAG" ]; then echo "跳过 $item_lower :最新提交未打标签" @@ -198,8 +203,7 @@ for item in "${MERGE_APP_PROJECT_LIST[@]}"; do echo "合并 $item_lower (远程分支:origin/$item_lower,标签:$MOD_TAG)" git checkout origin/$item_lower $item_lower git add . - # 提交备注带上标签名 - git commit -m "合并 $item 项目,关联标签:$MOD_TAG" + git commit -m "合并 $item 项目,关联版本标签:$MOD_TAG" done ## 合并 LIB 项目 @@ -212,6 +216,7 @@ echo -e "#@@@ 开始合并类库型模块源码 @@@#" for item in "${MERGE_LIB_PROJECT_LIST[@]}"; do item_lower=$(echo "$item" | tr 'A-Z' 'a-z') + # 自动使用 origin/模块名 作为远程分支,检测标签 MOD_TAG=$(get_module_latest_tag "$item_lower") if [ -z "$MOD_TAG" ]; then echo "跳过 $item_lower :最新提交未打标签" @@ -220,8 +225,7 @@ for item in "${MERGE_LIB_PROJECT_LIST[@]}"; do echo "合并 $item_lower (远程分支:origin/$item_lower,标签:$MOD_TAG)" git checkout origin/$item_lower $item_lower lib$item_lower git add . - # 提交备注带上标签名 - git commit -m "合并 $item 项目,关联标签:$MOD_TAG" + git commit -m "合并 $item 项目,关联版本标签:$MOD_TAG" done echo '正在推送 Projects_Keeper 项目' From 3d26bbe09016635261cb017cb50e314a6cae8f46 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 12:08:22 +0800 Subject: [PATCH 07/32] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh index e61421c..164101f 100644 --- a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh +++ b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh @@ -203,7 +203,7 @@ for item in "${MERGE_APP_PROJECT_LIST[@]}"; do echo "合并 $item_lower (远程分支:origin/$item_lower,标签:$MOD_TAG)" git checkout origin/$item_lower $item_lower git add . - git commit -m "合并 $item 项目,关联版本标签:$MOD_TAG" + git commit -m "合并 $item 项目,$MOD_TAG" done ## 合并 LIB 项目 @@ -225,7 +225,7 @@ for item in "${MERGE_LIB_PROJECT_LIST[@]}"; do echo "合并 $item_lower (远程分支:origin/$item_lower,标签:$MOD_TAG)" git checkout origin/$item_lower $item_lower lib$item_lower git add . - git commit -m "合并 $item 项目,关联版本标签:$MOD_TAG" + git commit -m "合并 $item 项目,$MOD_TAG" done echo '正在推送 Projects_Keeper 项目' From e3166b639eba62f3cb27dd2f65b6acdf706e6478 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 12:13:50 +0800 Subject: [PATCH 08/32] =?UTF-8?q?=E6=93=8D=E4=BD=9C=E6=AD=A5=E9=AA=A4?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh index 164101f..7847604 100644 --- a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh +++ b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh @@ -194,8 +194,8 @@ echo -e "#@@@ 开始合并应用型模块源码 @@@#" for item in "${MERGE_APP_PROJECT_LIST[@]}"; do item_lower=$(echo "$item" | tr 'A-Z' 'a-z') - # 自动使用 origin/模块名 作为远程分支,检测标签 MOD_TAG=$(get_module_latest_tag "$item_lower") + # 无标签直接跳过所有操作:不checkout、不add、不commit if [ -z "$MOD_TAG" ]; then echo "跳过 $item_lower :最新提交未打标签" continue @@ -216,8 +216,8 @@ echo -e "#@@@ 开始合并类库型模块源码 @@@#" for item in "${MERGE_LIB_PROJECT_LIST[@]}"; do item_lower=$(echo "$item" | tr 'A-Z' 'a-z') - # 自动使用 origin/模块名 作为远程分支,检测标签 MOD_TAG=$(get_module_latest_tag "$item_lower") + # 无标签直接跳过所有操作 if [ -z "$MOD_TAG" ]; then echo "跳过 $item_lower :最新提交未打标签" continue From 33dc49267e2d3a5ea6caa8cd18753115b85f393b Mon Sep 17 00:00:00 2001 From: qinglong Date: Sun, 17 May 2026 13:00:02 +0800 Subject: [PATCH 09/32] =?UTF-8?q?=E5=90=88=E5=B9=B6=20APPBase=20=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=EF=BC=8C=20=20=E8=B0=83=E8=AF=95=EF=BC=9A=E6=A8=A1?= =?UTF-8?q?=E5=9D=97[appbase]=20=E8=BF=9C=E7=A8=8B=E5=88=86=E6=94=AF?= =?UTF-8?q?=E6=9C=80=E6=96=B0Commit=20=3D=2074299bf9b2dca73121a228a0a282e2?= =?UTF-8?q?1f88e25552?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appbase/build.properties | 10 +++++----- libappbase/build.properties | 10 +++++----- .../java/cc/winboll/studio/libappbase/LogUtils.java | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/appbase/build.properties b/appbase/build.properties index 66fc02d..c5838d0 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat May 16 09:15:15 GMT 2026 -stageCount=10 +#Sun May 17 02:08:10 HKT 2026 +stageCount=11 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.9 -buildCount=7 -baseBetaVersion=15.20.10 +publishVersion=15.20.10 +buildCount=0 +baseBetaVersion=15.20.11 diff --git a/libappbase/build.properties b/libappbase/build.properties index 66fc02d..4b4d99d 100644 --- a/libappbase/build.properties +++ b/libappbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat May 16 09:15:15 GMT 2026 -stageCount=10 +#Sun May 17 02:07:57 HKT 2026 +stageCount=11 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.9 -buildCount=7 -baseBetaVersion=15.20.10 +publishVersion=15.20.10 +buildCount=0 +baseBetaVersion=15.20.11 diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtils.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtils.java index b286461..a0e4f2a 100644 --- a/libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtils.java +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtils.java @@ -135,7 +135,7 @@ public class LogUtils { return; } - final long KEEP_FILE_SIZE = 512000L; // 500K + final long KEEP_FILE_SIZE = 25000L; // ~25KB 确保剪贴板可完整复制 final long MAX_FILE_SIZE = 2*KEEP_FILE_SIZE; final long fileSize = _mfLogCatchFile.length(); From be3d042ade1fd6712f159840de632c2e39cedb52 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 14:22:14 +0800 Subject: [PATCH 10/32] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E6=9C=80=E6=96=B0=E6=A0=87=E7=AD=BE=E7=9A=84=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=E3=80=82=E5=8F=96=E6=B6=88=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E6=9C=80=E6=96=B0=E6=8F=90=E4=BA=A4=E7=9A=84=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=A4=B9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ashMergeProjects-to-Projects_Keeper_Tag.sh | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh index 7847604..be02cd1 100644 --- a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh +++ b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh @@ -1,18 +1,19 @@ #!/system/bin/sh -## 合并其他项目分支的模块源码到projects_keeper_tag分支。 +## 合并其他项目 对应版本标签提交点 模块源码到projects_keeper_tag分支。 # ====================== 函数定义:获取模块最新提交对应的远程标签 ====================== # 参数1:模块名(小写如appbase、aes) -# 自动以 origin/模块名 作为远程分支 +# 自动匹配 模块名- 开头版本标签 # 返回:有标签输出标签名,无标签输出空 get_module_latest_tag() { local module_dir="$1" local remote_branch="origin/${module_dir}" - # 先同步远程分支元数据 + # 同步远程分支 + 同步全部远程标签 git fetch origin "$module_dir" 2>/dev/null + git fetch origin --tags 2>/dev/null - # 修复:取整个远程分支最新Commit,不限制子目录 + # 获取远程分支最新提交哈希 local latest_commit latest_commit=$(git log -1 --pretty=format:%H "$remote_branch" 2>/dev/null) @@ -24,7 +25,7 @@ get_module_latest_tag() { return fi - # 精准匹配:模块名- 开头标签 + 严格比对commit哈希 + # 精准匹配:模块名- 开头标签 + 严格绑定当前commit哈希 git ls-remote --tags origin "${module_dir}-*" 2>/dev/null \ | grep -v '\^{}' \ | awk -v target_commit="$latest_commit" '$1 == target_commit {print $2}' \ @@ -44,7 +45,7 @@ fi # ====================== 1. 拉取远程最新源码(失败直接退出) ====================== echo "==============================================" -echo "正在拉取远程最新源码..." +echo "正在拉取远程最新源码与标签..." echo "==============================================" if ! git pull; then echo "==============================================" @@ -53,7 +54,9 @@ if ! git pull; then echo "==============================================" exit 1 fi -echo "✅ 源码已拉取为最新状态" +# 全局同步所有远程标签 +git fetch origin --tags +echo "✅ 源码与标签同步完成" echo "" # ====================== 2. 目录路径检查 ====================== @@ -197,13 +200,14 @@ for item in "${MERGE_APP_PROJECT_LIST[@]}"; do MOD_TAG=$(get_module_latest_tag "$item_lower") # 无标签直接跳过所有操作:不checkout、不add、不commit if [ -z "$MOD_TAG" ]; then - echo "跳过 $item_lower :最新提交未打标签" + echo "跳过 $item_lower :未匹配到对应版本标签" continue fi - echo "合并 $item_lower (远程分支:origin/$item_lower,标签:$MOD_TAG)" - git checkout origin/$item_lower $item_lower + echo "合并 $item_lower (对应版本标签:$MOD_TAG)" + # 重点修改:从【标签】拉取对应模块文件夹,而非远程分支 + git checkout "$MOD_TAG" "$item_lower" git add . - git commit -m "合并 $item 项目,$MOD_TAG" + git commit -m "合并 $item 项目,对应版本标签:$MOD_TAG" done ## 合并 LIB 项目 @@ -219,13 +223,14 @@ for item in "${MERGE_LIB_PROJECT_LIST[@]}"; do MOD_TAG=$(get_module_latest_tag "$item_lower") # 无标签直接跳过所有操作 if [ -z "$MOD_TAG" ]; then - echo "跳过 $item_lower :最新提交未打标签" + echo "跳过 $item_lower :未匹配到对应版本标签" continue fi - echo "合并 $item_lower (远程分支:origin/$item_lower,标签:$MOD_TAG)" - git checkout origin/$item_lower $item_lower lib$item_lower + echo "合并 $item_lower (对应版本标签:$MOD_TAG)" + # 从指定标签节点拉取对应目录文件 + git checkout "$MOD_TAG" "$item_lower" "lib$item_lower" git add . - git commit -m "合并 $item 项目,$MOD_TAG" + git commit -m "合并 $item 项目,对应版本标签:$MOD_TAG" done echo '正在推送 Projects_Keeper 项目' From 0c9c6c9fd44a178b181818b945c383ed55a35321 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 15:11:21 +0800 Subject: [PATCH 11/32] =?UTF-8?q?1.=C2=A0=E8=B0=83=E8=AF=95=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E9=87=8D=E5=AE=9A=E5=90=91=20=C2=A0>&2=C2=A0=20?= =?UTF-8?q?=E5=BD=BB=E5=BA=95=E6=9D=9C=E7=BB=9D=E8=B0=83=E8=AF=95=E6=96=87?= =?UTF-8?q?=E5=AD=97=E6=B7=B7=E5=85=A5=E6=A0=87=E7=AD=BE=E5=8F=98=E9=87=8F?= =?UTF-8?q?=EF=BC=8C=C2=A0MOD=5FTAG=C2=A0=20=E5=8F=AA=E5=AD=98=E7=BA=AF?= =?UTF-8?q?=E5=87=80=E6=A0=87=E7=AD=BE=E5=90=8D=20=E2=80=8B=202.=C2=A0?= =?UTF-8?q?=E6=8B=89=E5=8F=96=E6=A0=87=E7=AD=BE=E5=86=99=E6=B3=95=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=20=E6=97=A7=EF=BC=9A=C2=A0git=20checkout=20=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E5=90=8D=20=E7=9B=AE=E5=BD=95=C2=A0=20=E6=96=B0?= =?UTF-8?q?=EF=BC=9A=C2=A0git=20checkout=20origin/tags/=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E5=90=8D=20--=20=E7=9B=AE=E5=BD=95=C2=A0=20=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E4=BB=8E=E8=BF=9C=E7=A8=8B=E6=A0=87=E7=AD=BE=E4=BB=93=E5=BA=93?= =?UTF-8?q?=E6=8B=89=E5=8F=96=E5=AF=B9=E5=BA=94=E6=8F=90=E4=BA=A4=E7=82=B9?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=EF=BC=8C100%=E5=91=BD=E4=B8=AD?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E4=BB=A3=E7=A0=81=20=E2=80=8B=203.=C2=A0?= =?UTF-8?q?=E7=B2=BE=E5=87=86add=E6=8F=90=E4=BA=A4=20=E6=94=BE=E5=BC=83=20?= =?UTF-8?q?=C2=A0git=20add=20.=C2=A0=EF=BC=8C=E5=8F=AA=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E5=90=88=E5=B9=B6=E7=9A=84=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=EF=BC=8C=E9=81=BF=E5=85=8D=E4=B9=B1?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=20=E2=80=8B=204.=C2=A0=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E5=85=A8=E9=87=8F=E5=90=8C=E6=AD=A5=E6=A0=87=E7=AD=BE=20?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E5=BC=80=E5=A4=B4=E5=8F=8C=E9=87=8D=C2=A0fet?= =?UTF-8?q?ch=20--tags=C2=A0=EF=BC=8C=E4=BF=9D=E8=AF=81=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E8=83=BD=E8=AF=BB=E5=8F=96=E6=89=80=E6=9C=89=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=A0=87=E7=AD=BE=20=E2=80=8B=205.=C2=A0?= =?UTF-8?q?=E7=A9=BA=E6=A0=87=E7=AD=BE=E7=9B=B4=E6=8E=A5=E6=8B=A6=E6=88=AA?= =?UTF-8?q?=20=E5=8C=B9=E9=85=8D=E4=B8=8D=E5=88=B0=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E5=AE=8C=E5=85=A8=E8=B7=B3=E8=BF=87=EF=BC=8C=E4=B8=8D=E4=BA=A7?= =?UTF-8?q?=E7=94=9F=E7=A9=BA=E6=8F=90=E4=BA=A4=E3=80=81=E6=97=A0=E6=95=88?= =?UTF-8?q?=E8=A6=86=E7=9B=96=20=E2=80=8B=206.=C2=A0=E4=B8=A5=E6=A0=BC?= =?UTF-8?q?=E9=94=81=E5=AE=9A=E6=9C=AC=E5=9C=B0=E5=88=86=E6=94=AF=EF=BC=8C?= =?UTF-8?q?=E9=98=B2=E6=AD=A2=E5=90=88=E5=B9=B6=E9=94=99=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ashMergeProjects-to-Projects_Keeper_Tag.sh | 163 ++++++------------ 1 file changed, 55 insertions(+), 108 deletions(-) diff --git a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh index be02cd1..fe4f17b 100644 --- a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh +++ b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh @@ -1,84 +1,65 @@ #!/system/bin/sh -## 合并其他项目 对应版本标签提交点 模块源码到projects_keeper_tag分支。 +## 合并远程指定版本标签下模块文件夹到本地 projects_keeper_tag 分支 -# ====================== 函数定义:获取模块最新提交对应的远程标签 ====================== -# 参数1:模块名(小写如appbase、aes) -# 自动匹配 模块名- 开头版本标签 -# 返回:有标签输出标签名,无标签输出空 +# ====================== 获取模块对应远程版本标签 ====================== get_module_latest_tag() { local module_dir="$1" local remote_branch="origin/${module_dir}" - # 同步远程分支 + 同步全部远程标签 - git fetch origin "$module_dir" 2>/dev/null - git fetch origin --tags 2>/dev/null + # 强制拉取远程分支+全部远程标签到本地 + git fetch origin "$module_dir" + git fetch origin --tags # 获取远程分支最新提交哈希 local latest_commit latest_commit=$(git log -1 --pretty=format:%H "$remote_branch" 2>/dev/null) - echo " 调试:模块[$module_dir] 远程分支最新Commit = $latest_commit" + # 调试信息输出到错误流,不污染返回值 + echo " 调试:模块[$module_dir] 远程最新Commit = $latest_commit" >&2 - # 无commit直接返回空 if [ -z "$latest_commit" ]; then - echo " 调试:未获取到有效Commit,跳过" + echo " 调试:无有效提交" >&2 + echo "" return fi - # 精准匹配:模块名- 开头标签 + 严格绑定当前commit哈希 - git ls-remote --tags origin "${module_dir}-*" 2>/dev/null \ + # 匹配 模块名-xxx 格式标签,绑定对应commit + local tag_val + tag_val=$(git ls-remote --tags origin "${module_dir}-*" 2>/dev/null \ | grep -v '\^{}' \ - | awk -v target_commit="$latest_commit" '$1 == target_commit {print $2}' \ - | sed "s/refs\/tags\///" + | awk -v cm="$latest_commit" '$1==cm{print $2}' \ + | sed 's/refs\/tags\///') + + # 纯净返回标签字符串 + echo "$tag_val" } -# ====================== 0. 进入目标目录 ====================== +# ====================== 进入工作目录 ====================== TARGET_DIR="/sdcard/AppProjects/Projects_Keeper_Tag" - -echo "切换工作目录到:$TARGET_DIR" +echo "切换工作目录:$TARGET_DIR" if ! cd "$TARGET_DIR"; then - echo "==============================================" - echo "错误:无法进入目标目录 $TARGET_DIR" - echo "==============================================" + echo "目录切换失败!" exit 1 fi -# ====================== 1. 拉取远程最新源码(失败直接退出) ====================== +# ====================== 同步远程代码与所有标签 ====================== echo "==============================================" -echo "正在拉取远程最新源码与标签..." +echo "同步远程代码及全部版本标签" echo "==============================================" -if ! git pull; then - echo "==============================================" - echo "错误:拉取远程源码失败!" - echo "请检查网络、仓库冲突或手动处理 git 状态后再执行脚本。" - echo "==============================================" - exit 1 -fi -# 全局同步所有远程标签 +git pull git fetch origin --tags -echo "✅ 源码与标签同步完成" +echo "同步完成" echo "" -# ====================== 2. 目录路径检查 ====================== -CUR_DIR=$(pwd) -if [ "$CUR_DIR" != "$TARGET_DIR" ]; then - echo "错误:当前目录不是项目根目录!" - echo "请先进入目录:$TARGET_DIR" - exit 1 -fi - -# ====================== 3. Git 分支检查 ====================== +# ====================== 强制锁定本地分支 ====================== CUR_BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null) TARGET_BRANCH="projects_keeper_tag" - if [ "$CUR_BRANCH" != "$TARGET_BRANCH" ]; then - echo "错误:当前不在 $TARGET_BRANCH 分支!" - echo "当前分支:$CUR_BRANCH" - echo "请先执行:git checkout $TARGET_BRANCH" + echo "错误:当前不在 $TARGET_BRANCH 分支,请先切换!" exit 1 fi -# ====================== 4. 预设标准模块列表 ====================== +# ====================== 目录校验数组(保留原样) ====================== MERGE_OBJECTS_LIST=( .git .gitignore @@ -115,7 +96,6 @@ winboll winboll.properties-demo ) -# ====================== 5. 获取当前目录真实文件列表 ====================== REAL_ITEMS=() while IFS= read -r line; do if [[ "$line" != "." && "$line" != ".." ]]; then @@ -123,11 +103,9 @@ while IFS= read -r line; do fi done < <(ls -a) -# ====================== 6. 差异比对函数 ====================== check_diff() { local missing=() local extra=() - for item in "${MERGE_OBJECTS_LIST[@]}"; do local found=0 for r in "${REAL_ITEMS[@]}"; do @@ -140,7 +118,6 @@ check_diff() { missing+=("$item") fi done - for r in "${REAL_ITEMS[@]}"; do local found=0 for item in "${MERGE_OBJECTS_LIST[@]}"; do @@ -153,85 +130,55 @@ check_diff() { extra+=("$r") fi done - if [[ ${#missing[@]} -gt 0 || ${#extra[@]} -gt 0 ]]; then - echo "==============================================" - echo "【错误】合并环境与脚本预设列表不匹配!" - echo "请手动核对并修改合并脚本。" - echo "==============================================" - - if [[ ${#missing[@]} -gt 0 ]]; then - echo -e "\n👉 本地缺失项目:" - for m in "${missing[@]}"; do echo " $m"; done - fi - - if [[ ${#extra[@]} -gt 0 ]]; then - echo -e "\n👉 本地多余项目:" - for e in "${extra[@]}"; do echo " $e"; done - fi - - echo -e "\n==============================================" + echo "目录结构不匹配,终止执行" exit 1 fi } - -# 执行差异校验 check_diff -# ====================== 全部校验通过,继续执行合并 ====================== -echo -e "#@@@ 开始合并模块源码 @@@# -## 目标合并对象列表:" - -for item in "${MERGE_OBJECTS_LIST[@]}"; do - echo "$item" -done - -echo -e "## 对象列表结束 -" - -## 合并 APP 项目 -MERGE_APP_PROJECT_LIST=( -DemoAPP -) -echo -e "#@@@ 开始合并应用型模块源码 @@@#" +# ====================== 开始合并模块 ====================== +echo -e "#@@@ 开始合并标签版本模块源码 @@@#" +## 合并应用型模块 +MERGE_APP_PROJECT_LIST=(DemoAPP) +echo -e "#@@@ 应用型模块开始合并 @@#" for item in "${MERGE_APP_PROJECT_LIST[@]}"; do item_lower=$(echo "$item" | tr 'A-Z' 'a-z') MOD_TAG=$(get_module_latest_tag "$item_lower") - # 无标签直接跳过所有操作:不checkout、不add、不commit + + # 无标签直接跳过,不执行任何操作 if [ -z "$MOD_TAG" ]; then - echo "跳过 $item_lower :未匹配到对应版本标签" + echo "跳过 $item_lower 未匹配对应版本标签" continue fi - echo "合并 $item_lower (对应版本标签:$MOD_TAG)" - # 重点修改:从【标签】拉取对应模块文件夹,而非远程分支 - git checkout "$MOD_TAG" "$item_lower" - git add . - git commit -m "合并 $item 项目,对应版本标签:$MOD_TAG" + + echo "正在合并 $item_lower 标签版本:$MOD_TAG" + # 从远程标签拉取文件夹覆盖到本地 + git checkout origin/tags/"$MOD_TAG" -- "$item_lower" + # 仅添加当前模块文件,不全局add + git add "$item_lower" + git commit -m "合并模块 $item ,来源版本标签:$MOD_TAG" done -## 合并 LIB 项目 -MERGE_LIB_PROJECT_LIST=( -WinBoLL -APPBase -AES -) -echo -e "#@@@ 开始合并类库型模块源码 @@@#" - +## 合并类库模块 +MERGE_LIB_PROJECT_LIST=(WinBoLL APPBase AES) +echo -e "#@@@ 类库模块开始合并 @@#" for item in "${MERGE_LIB_PROJECT_LIST[@]}"; do item_lower=$(echo "$item" | tr 'A-Z' 'a-z') MOD_TAG=$(get_module_latest_tag "$item_lower") - # 无标签直接跳过所有操作 + if [ -z "$MOD_TAG" ]; then - echo "跳过 $item_lower :未匹配到对应版本标签" + echo "跳过 $item_lower 未匹配对应版本标签" continue fi - echo "合并 $item_lower (对应版本标签:$MOD_TAG)" - # 从指定标签节点拉取对应目录文件 - git checkout "$MOD_TAG" "$item_lower" "lib$item_lower" - git add . - git commit -m "合并 $item 项目,对应版本标签:$MOD_TAG" + + echo "正在合并 $item_lower 标签版本:$MOD_TAG" + git checkout origin/tags/"$MOD_TAG" -- "$item_lower" "lib$item_lower" + git add "$item_lower" "lib$item_lower" + git commit -m "合并模块 $item ,来源版本标签:$MOD_TAG" done -echo '正在推送 Projects_Keeper 项目' +echo "所有模块合并执行完毕" +echo "准备推送远程分支" git push From 3707891e0b9467326320264cef9bd67f9db5b04e Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 15:17:40 +0800 Subject: [PATCH 12/32] =?UTF-8?q?1.=C2=A0=E8=B0=83=E7=94=A8=E5=87=BD?= =?UTF-8?q?=E6=95=B0=20=E2=86=92=20=E6=9F=A5=E5=87=BA=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=20+=20=E6=A0=87=E7=AD=BE=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E6=8F=90=E4=BA=A4Commit=E5=93=88=E5=B8=8C=20=E2=80=8B=202.?= =?UTF-8?q?=C2=A0=E5=88=A4=E5=AE=9A=E6=A0=87=E7=AD=BE/Commit=E4=B8=BA?= =?UTF-8?q?=E7=A9=BA=E7=9B=B4=E6=8E=A5=E8=B7=B3=E8=BF=87=20=E2=80=8B=203.?= =?UTF-8?q?=C2=A0=E5=90=88=E5=B9=B6=E5=91=BD=E4=BB=A4=EF=BC=9A=C2=A0git=20?= =?UTF-8?q?checkout=20origin/=E6=A8=A1=E5=9D=97=E5=90=8D=20=20commit?= =?UTF-8?q?=E5=93=88=E5=B8=8C:=E6=A8=A1=E5=9D=97=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B9=20=E2=80=8B=204.=C2=A0=E4=BB=85=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E6=A8=A1=E5=9D=97=E7=9B=AE=E5=BD=95=EF=BC=8C?= =?UTF-8?q?=E7=B2=BE=E5=87=86=E6=8F=90=E4=BA=A4=20=E2=80=8B=205.=C2=A0?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=97=A5=E5=BF=97=E5=90=8C=E6=97=B6=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E6=A0=87=E7=AD=BE=E5=90=8D+=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E5=93=88=E5=B8=8C=EF=BC=8C=E6=96=B9=E4=BE=BF=E5=9B=9E=E6=BA=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ashMergeProjects-to-Projects_Keeper_Tag.sh | 81 ++++++++++--------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh index fe4f17b..e2b546f 100644 --- a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh +++ b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh @@ -1,37 +1,34 @@ #!/system/bin/sh -## 合并远程指定版本标签下模块文件夹到本地 projects_keeper_tag 分支 +## 合并远程模块指定标签对应提交点文件夹到本地 projects_keeper_tag 分支 -# ====================== 获取模块对应远程版本标签 ====================== -get_module_latest_tag() { +# ====================== 获取模块标签与对应Commit ====================== +get_module_tag_commit() { local module_dir="$1" local remote_branch="origin/${module_dir}" - # 强制拉取远程分支+全部远程标签到本地 - git fetch origin "$module_dir" - git fetch origin --tags + git fetch origin "$module_dir" 2>/dev/null + git fetch origin --tags 2>/dev/null - # 获取远程分支最新提交哈希 + # 获取远程分支最新commit local latest_commit latest_commit=$(git log -1 --pretty=format:%H "$remote_branch" 2>/dev/null) - # 调试信息输出到错误流,不污染返回值 - echo " 调试:模块[$module_dir] 远程最新Commit = $latest_commit" >&2 + echo " 调试:模块[$module_dir] 远程分支最新Commit = $latest_commit" >&2 if [ -z "$latest_commit" ]; then - echo " 调试:无有效提交" >&2 echo "" return fi - # 匹配 模块名-xxx 格式标签,绑定对应commit - local tag_val - tag_val=$(git ls-remote --tags origin "${module_dir}-*" 2>/dev/null \ + # 匹配模块名-开头标签,取出标签名 + local target_tag + target_tag=$(git ls-remote --tags origin "${module_dir}-*" 2>/dev/null \ | grep -v '\^{}' \ | awk -v cm="$latest_commit" '$1==cm{print $2}' \ | sed 's/refs\/tags\///') - # 纯净返回标签字符串 - echo "$tag_val" + # 输出格式:标签名|commit哈希 + echo "${target_tag}|${latest_commit}" } # ====================== 进入工作目录 ====================== @@ -42,7 +39,7 @@ if ! cd "$TARGET_DIR"; then exit 1 fi -# ====================== 同步远程代码与所有标签 ====================== +# ====================== 同步远程代码与标签 ====================== echo "==============================================" echo "同步远程代码及全部版本标签" echo "==============================================" @@ -51,7 +48,7 @@ git fetch origin --tags echo "同步完成" echo "" -# ====================== 强制锁定本地分支 ====================== +# ====================== 锁定目标分支 ====================== CUR_BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null) TARGET_BRANCH="projects_keeper_tag" if [ "$CUR_BRANCH" != "$TARGET_BRANCH" ]; then @@ -59,7 +56,7 @@ if [ "$CUR_BRANCH" != "$TARGET_BRANCH" ]; then exit 1 fi -# ====================== 目录校验数组(保留原样) ====================== +# ====================== 目录结构校验 ====================== MERGE_OBJECTS_LIST=( .git .gitignore @@ -138,47 +135,53 @@ check_diff() { check_diff # ====================== 开始合并模块 ====================== -echo -e "#@@@ 开始合并标签版本模块源码 @@@#" +echo -e "#@@@ 开始按标签对应提交点合并模块 @@@#" ## 合并应用型模块 MERGE_APP_PROJECT_LIST=(DemoAPP) -echo -e "#@@@ 应用型模块开始合并 @@#" +echo -e "#@@@ 应用型模块合并开始 @@#" for item in "${MERGE_APP_PROJECT_LIST[@]}"; do item_lower=$(echo "$item" | tr 'A-Z' 'a-z') - MOD_TAG=$(get_module_latest_tag "$item_lower") + tag_info=$(get_module_tag_commit "$item_lower") - # 无标签直接跳过,不执行任何操作 - if [ -z "$MOD_TAG" ]; then - echo "跳过 $item_lower 未匹配对应版本标签" + # 分割 标签名 和 commit哈希 + MOD_TAG=${tag_info%%|*} + MOD_COMMIT=${tag_info##*|} + + if [ -z "$MOD_TAG" ] || [ -z "$MOD_COMMIT" ]; then + echo "跳过 $item_lower 未匹配有效标签与提交点" continue fi - echo "正在合并 $item_lower 标签版本:$MOD_TAG" - # 从远程标签拉取文件夹覆盖到本地 - git checkout origin/tags/"$MOD_TAG" -- "$item_lower" - # 仅添加当前模块文件,不全局add - git add "$item_lower" - git commit -m "合并模块 $item ,来源版本标签:$MOD_TAG" + echo "模块:$item_lower 标签:$MOD_TAG 对应提交点:$MOD_COMMIT" + # 核心:从远程模块分支 指定commit拉取对应文件夹 + git checkout "origin/${item_lower}" "${MOD_COMMIT}:${item_lower}" + git add "${item_lower}" + git commit -m "合并模块 $item ,来源标签:$MOD_TAG 提交点:$MOD_COMMIT" done ## 合并类库模块 MERGE_LIB_PROJECT_LIST=(WinBoLL APPBase AES) -echo -e "#@@@ 类库模块开始合并 @@#" +echo -e "#@@@ 类库模块合并开始 @@#" for item in "${MERGE_LIB_PROJECT_LIST[@]}"; do item_lower=$(echo "$item" | tr 'A-Z' 'a-z') - MOD_TAG=$(get_module_latest_tag "$item_lower") + tag_info=$(get_module_tag_commit "$item_lower") - if [ -z "$MOD_TAG" ]; then - echo "跳过 $item_lower 未匹配对应版本标签" + MOD_TAG=${tag_info%%|*} + MOD_COMMIT=${tag_info##*|} + + if [ -z "$MOD_TAG" ] || [ -z "$MOD_COMMIT" ]; then + echo "跳过 $item_lower 未匹配有效标签与提交点" continue fi - echo "正在合并 $item_lower 标签版本:$MOD_TAG" - git checkout origin/tags/"$MOD_TAG" -- "$item_lower" "lib$item_lower" - git add "$item_lower" "lib$item_lower" - git commit -m "合并模块 $item ,来源版本标签:$MOD_TAG" + echo "模块:$item_lower 标签:$MOD_TAG 对应提交点:$MOD_COMMIT" + # 拉取主目录 + lib目录 指定commit文件 + git checkout "origin/${item_lower}" "${MOD_COMMIT}:${item_lower}" "${MOD_COMMIT}:lib${item_lower}" + git add "${item_lower}" "lib${item_lower}" + git commit -m "合并模块 $item ,来源标签:$MOD_TAG 提交点:$MOD_COMMIT" done -echo "所有模块合并执行完毕" +echo "所有模块合并完成" echo "准备推送远程分支" git push From 555c5deef978a1f84117dc1e11ebb3723ecae421 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 15:22:31 +0800 Subject: [PATCH 13/32] =?UTF-8?q?1.=C2=A0=C2=A0get=5Fmodule=5Flatest=5Ftag?= =?UTF-8?q?=C2=A0=20=E2=86=92=20=E6=8A=93=E5=8F=96=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E8=AF=A5=E6=A8=A1=E5=9D=97=E6=9C=80=E6=96=B0Tag=20=E2=80=8B=20?= =?UTF-8?q?2.=C2=A0=C2=A0get=5Fcommit=5Fby=5Ftag=C2=A0=20=E2=86=92=20?= =?UTF-8?q?=E7=94=A8=E6=9C=80=E6=96=B0Tag=E6=9F=A5=E5=87=BA=E5=94=AF?= =?UTF-8?q?=E4=B8=80=E5=AF=B9=E5=BA=94=E6=8F=90=E4=BA=A4Commit=20=E2=80=8B?= =?UTF-8?q?=203.=C2=A0=E6=A0=A1=E9=AA=8CTag/Commit=E9=9D=9E=E7=A9=BA=20?= =?UTF-8?q?=E2=80=8B=204.=C2=A0=E6=89=A7=E8=A1=8C=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=91=BD=E4=BB=A4git=20checkout=20origin/=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=90=8D=20=20commit=E5=93=88=E5=B8=8C:=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit   5. 仅添加对应目录,生成带标签+commit的提交日志 ​ 6. 无标签直接跳过,不产生任何操作 --- ...ashMergeProjects-to-Projects_Keeper_Tag.sh | 126 +++++++++--------- 1 file changed, 64 insertions(+), 62 deletions(-) diff --git a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh index e2b546f..e5e9457 100644 --- a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh +++ b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh @@ -1,34 +1,23 @@ #!/system/bin/sh -## 合并远程模块指定标签对应提交点文件夹到本地 projects_keeper_tag 分支 +## 流程:获取远程最新Tag → 获取Tag对应Commit → 按Commit合并远程模块目录到本地 -# ====================== 获取模块标签与对应Commit ====================== -get_module_tag_commit() { - local module_dir="$1" - local remote_branch="origin/${module_dir}" - - git fetch origin "$module_dir" 2>/dev/null +# ====================== 1. 获取模块远程最新版本TAG ====================== +get_module_latest_tag() { + local module_name="$1" git fetch origin --tags 2>/dev/null - - # 获取远程分支最新commit - local latest_commit - latest_commit=$(git log -1 --pretty=format:%H "$remote_branch" 2>/dev/null) - - echo " 调试:模块[$module_dir] 远程分支最新Commit = $latest_commit" >&2 - - if [ -z "$latest_commit" ]; then - echo "" - return - fi - - # 匹配模块名-开头标签,取出标签名 - local target_tag - target_tag=$(git ls-remote --tags origin "${module_dir}-*" 2>/dev/null \ + # 筛选 模块名- 开头标签,按版本排序取最新 + git ls-remote --tags origin "${module_name}-*" 2>/dev/null \ | grep -v '\^{}' \ - | awk -v cm="$latest_commit" '$1==cm{print $2}' \ - | sed 's/refs\/tags\///') + | sort -V \ + | tail -1 \ + | awk '{print $2}' \ + | sed 's/refs\/tags\///' +} - # 输出格式:标签名|commit哈希 - echo "${target_tag}|${latest_commit}" +# ====================== 2. 通过TAG获取对应提交Commit哈希 ====================== +get_commit_by_tag() { + local tag_name="$1" + git rev-list -1 "$tag_name" 2>/dev/null } # ====================== 进入工作目录 ====================== @@ -39,16 +28,16 @@ if ! cd "$TARGET_DIR"; then exit 1 fi -# ====================== 同步远程代码与标签 ====================== +# ====================== 同步远程全部标签 ====================== echo "==============================================" -echo "同步远程代码及全部版本标签" +echo "同步远程所有分支与版本标签" echo "==============================================" -git pull +git fetch origin --prune git fetch origin --tags echo "同步完成" echo "" -# ====================== 锁定目标分支 ====================== +# ====================== 锁定本地目标分支 ====================== CUR_BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null) TARGET_BRANCH="projects_keeper_tag" if [ "$CUR_BRANCH" != "$TARGET_BRANCH" ]; then @@ -56,7 +45,7 @@ if [ "$CUR_BRANCH" != "$TARGET_BRANCH" ]; then exit 1 fi -# ====================== 目录结构校验 ====================== +# ====================== 目录结构校验(保留原有) ====================== MERGE_OBJECTS_LIST=( .git .gitignore @@ -134,54 +123,67 @@ check_diff() { } check_diff -# ====================== 开始合并模块 ====================== -echo -e "#@@@ 开始按标签对应提交点合并模块 @@@#" +# ====================== 开始批量合并模块 ====================== +echo -e "#@@@ 开始按【最新Tag+对应Commit】合并模块 @@@#" ## 合并应用型模块 MERGE_APP_PROJECT_LIST=(DemoAPP) -echo -e "#@@@ 应用型模块合并开始 @@#" +echo -e "---------- 应用型模块合并 ----------" for item in "${MERGE_APP_PROJECT_LIST[@]}"; do item_lower=$(echo "$item" | tr 'A-Z' 'a-z') - tag_info=$(get_module_tag_commit "$item_lower") - - # 分割 标签名 和 commit哈希 - MOD_TAG=${tag_info%%|*} - MOD_COMMIT=${tag_info##*|} - - if [ -z "$MOD_TAG" ] || [ -z "$MOD_COMMIT" ]; then - echo "跳过 $item_lower 未匹配有效标签与提交点" + # 1.获取远程最新TAG + LATEST_TAG=$(get_module_latest_tag "$item_lower") + if [ -z "$LATEST_TAG" ]; then + echo "跳过 $item_lower :未查询到任何版本标签" + continue + fi + # 2.通过TAG获取对应提交点Commit + TARGET_COMMIT=$(get_commit_by_tag "$LATEST_TAG") + if [ -z "$TARGET_COMMIT" ]; then + echo "跳过 $item_lower :标签 $LATEST_TAG 未查询到对应提交点" continue fi - echo "模块:$item_lower 标签:$MOD_TAG 对应提交点:$MOD_COMMIT" - # 核心:从远程模块分支 指定commit拉取对应文件夹 - git checkout "origin/${item_lower}" "${MOD_COMMIT}:${item_lower}" - git add "${item_lower}" - git commit -m "合并模块 $item ,来源标签:$MOD_TAG 提交点:$MOD_COMMIT" + echo "模块:$item_lower" + echo "最新标签:$LATEST_TAG" + echo "对应提交点:$TARGET_COMMIT" + echo "----------------------------------------" + + # 3.使用Commit从远程模块分支拉取目录合并到本地 + git checkout origin/${item_lower} ${TARGET_COMMIT}:${item_lower} + git add ${item_lower} + git commit -m "合并模块${item} 来源最新标签:${LATEST_TAG} 提交点:${TARGET_COMMIT}" done ## 合并类库模块 MERGE_LIB_PROJECT_LIST=(WinBoLL APPBase AES) -echo -e "#@@@ 类库模块合并开始 @@#" +echo -e "---------- 类库模块合并 ----------" for item in "${MERGE_LIB_PROJECT_LIST[@]}"; do item_lower=$(echo "$item" | tr 'A-Z' 'a-z') - tag_info=$(get_module_tag_commit "$item_lower") - - MOD_TAG=${tag_info%%|*} - MOD_COMMIT=${tag_info##*|} - - if [ -z "$MOD_TAG" ] || [ -z "$MOD_COMMIT" ]; then - echo "跳过 $item_lower 未匹配有效标签与提交点" + # 1.获取远程最新TAG + LATEST_TAG=$(get_module_latest_tag "$item_lower") + if [ -z "$LATEST_TAG" ]; then + echo "跳过 $item_lower :未查询到任何版本标签" + continue + fi + # 2.通过TAG获取对应提交点Commit + TARGET_COMMIT=$(get_commit_by_tag "$LATEST_TAG") + if [ -z "$TARGET_COMMIT" ]; then + echo "跳过 $item_lower :标签 $LATEST_TAG 未查询到对应提交点" continue fi - echo "模块:$item_lower 标签:$MOD_TAG 对应提交点:$MOD_COMMIT" - # 拉取主目录 + lib目录 指定commit文件 - git checkout "origin/${item_lower}" "${MOD_COMMIT}:${item_lower}" "${MOD_COMMIT}:lib${item_lower}" - git add "${item_lower}" "lib${item_lower}" - git commit -m "合并模块 $item ,来源标签:$MOD_TAG 提交点:$MOD_COMMIT" + echo "模块:$item_lower" + echo "最新标签:$LATEST_TAG" + echo "对应提交点:$TARGET_COMMIT" + echo "----------------------------------------" + + # 3.拉取主目录 + lib目录 + git checkout origin/${item_lower} ${TARGET_COMMIT}:${item_lower} ${TARGET_COMMIT}:lib${item_lower} + git add ${item_lower} lib${item_lower} + git commit -m "合并模块${item} 来源最新标签:${LATEST_TAG} 提交点:${TARGET_COMMIT}" done -echo "所有模块合并完成" -echo "准备推送远程分支" +echo "所有模块合并流程执行完毕" +echo "准备推送至远程分支" git push From 8fa09a9f993d558a47f6d25a81f1d31c1a443b16 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 15:25:10 +0800 Subject: [PATCH 14/32] =?UTF-8?q?demoapp=E3=80=81winboll=E3=80=81aes=C2=A0?= =?UTF-8?q?=20=E6=B2=A1=E6=9C=89=20=C2=A0xxx-=E7=89=88=E6=9C=AC=E5=8F=B7?= =?UTF-8?q?=C2=A0=20=E6=A0=BC=E5=BC=8F=E6=A0=87=E7=AD=BE=EF=BC=8C=E8=B7=B3?= =?UTF-8?q?=E8=BF=87=E5=B1=9E=E4=BA=8E=E6=AD=A3=E5=B8=B8=20=E2=80=8B=202.?= =?UTF-8?q?=C2=A0=C2=A0appbase=C2=A0=20=E6=88=90=E5=8A=9F=E6=8A=93?= =?UTF-8?q?=E5=88=B0=E6=A0=87=E7=AD=BE=E5=92=8Ccommit=EF=BC=8C=E5=8F=AA?= =?UTF-8?q?=E6=98=AF=E5=91=BD=E4=BB=A4=E8=AF=AD=E6=B3=95=E9=94=99=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E6=8B=89=E5=8F=96=E5=A4=B1=E8=B4=A5=EF=BC=8C=E6=94=B9?= =?UTF-8?q?=E5=AE=8C=E5=8D=B3=E5=8F=AF=E6=AD=A3=E5=B8=B8=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bashMergeProjects-to-Projects_Keeper_Tag.sh | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh index e5e9457..2ce169a 100644 --- a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh +++ b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh @@ -5,7 +5,6 @@ get_module_latest_tag() { local module_name="$1" git fetch origin --tags 2>/dev/null - # 筛选 模块名- 开头标签,按版本排序取最新 git ls-remote --tags origin "${module_name}-*" 2>/dev/null \ | grep -v '\^{}' \ | sort -V \ @@ -45,7 +44,7 @@ if [ "$CUR_BRANCH" != "$TARGET_BRANCH" ]; then exit 1 fi -# ====================== 目录结构校验(保留原有) ====================== +# ====================== 目录结构校验 ====================== MERGE_OBJECTS_LIST=( .git .gitignore @@ -131,13 +130,11 @@ MERGE_APP_PROJECT_LIST=(DemoAPP) echo -e "---------- 应用型模块合并 ----------" for item in "${MERGE_APP_PROJECT_LIST[@]}"; do item_lower=$(echo "$item" | tr 'A-Z' 'a-z') - # 1.获取远程最新TAG LATEST_TAG=$(get_module_latest_tag "$item_lower") if [ -z "$LATEST_TAG" ]; then echo "跳过 $item_lower :未查询到任何版本标签" continue fi - # 2.通过TAG获取对应提交点Commit TARGET_COMMIT=$(get_commit_by_tag "$LATEST_TAG") if [ -z "$TARGET_COMMIT" ]; then echo "跳过 $item_lower :标签 $LATEST_TAG 未查询到对应提交点" @@ -149,8 +146,8 @@ for item in "${MERGE_APP_PROJECT_LIST[@]}"; do echo "对应提交点:$TARGET_COMMIT" echo "----------------------------------------" - # 3.使用Commit从远程模块分支拉取目录合并到本地 - git checkout origin/${item_lower} ${TARGET_COMMIT}:${item_lower} + # 正确写法:用commit检出指定目录 + git checkout ${TARGET_COMMIT} -- ${item_lower} git add ${item_lower} git commit -m "合并模块${item} 来源最新标签:${LATEST_TAG} 提交点:${TARGET_COMMIT}" done @@ -160,13 +157,11 @@ MERGE_LIB_PROJECT_LIST=(WinBoLL APPBase AES) echo -e "---------- 类库模块合并 ----------" for item in "${MERGE_LIB_PROJECT_LIST[@]}"; do item_lower=$(echo "$item" | tr 'A-Z' 'a-z') - # 1.获取远程最新TAG LATEST_TAG=$(get_module_latest_tag "$item_lower") if [ -z "$LATEST_TAG" ]; then echo "跳过 $item_lower :未查询到任何版本标签" continue fi - # 2.通过TAG获取对应提交点Commit TARGET_COMMIT=$(get_commit_by_tag "$LATEST_TAG") if [ -z "$TARGET_COMMIT" ]; then echo "跳过 $item_lower :标签 $LATEST_TAG 未查询到对应提交点" @@ -178,8 +173,8 @@ for item in "${MERGE_LIB_PROJECT_LIST[@]}"; do echo "对应提交点:$TARGET_COMMIT" echo "----------------------------------------" - # 3.拉取主目录 + lib目录 - git checkout origin/${item_lower} ${TARGET_COMMIT}:${item_lower} ${TARGET_COMMIT}:lib${item_lower} + # 同时检出主目录 + lib目录 + git checkout ${TARGET_COMMIT} -- ${item_lower} lib${item_lower} git add ${item_lower} lib${item_lower} git commit -m "合并模块${item} 来源最新标签:${LATEST_TAG} 提交点:${TARGET_COMMIT}" done From 79f7f682b39927d56b3552a37b80bfef860b386e Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 15:25:41 +0800 Subject: [PATCH 15/32] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A8=A1=E5=9D=97APPBa?= =?UTF-8?q?se=20=E6=9D=A5=E6=BA=90=E6=9C=80=E6=96=B0=E6=A0=87=E7=AD=BE:app?= =?UTF-8?q?base-v15.20.11=20=E6=8F=90=E4=BA=A4=E7=82=B9:c7184ad6df0092106e?= =?UTF-8?q?535308ba486a9503395042?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appbase/build.properties | 8 ++++---- libappbase/build.properties | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/appbase/build.properties b/appbase/build.properties index c5838d0..3c69d65 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun May 17 02:08:10 HKT 2026 -stageCount=11 +#Sun May 17 14:46:57 HKT 2026 +stageCount=12 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.10 +publishVersion=15.20.11 buildCount=0 -baseBetaVersion=15.20.11 +baseBetaVersion=15.20.12 diff --git a/libappbase/build.properties b/libappbase/build.properties index 4b4d99d..3c69d65 100644 --- a/libappbase/build.properties +++ b/libappbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun May 17 02:07:57 HKT 2026 -stageCount=11 +#Sun May 17 14:46:57 HKT 2026 +stageCount=12 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.10 +publishVersion=15.20.11 buildCount=0 -baseBetaVersion=15.20.11 +baseBetaVersion=15.20.12 From 28bc3a86e3b37facf7b7f6eb3a6ce4f1bc5ec415 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 15:34:14 +0800 Subject: [PATCH 16/32] =?UTF-8?q?1.=C2=A0=E7=89=88=E6=9C=AC=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E5=BD=BB=E5=BA=95=E4=BF=AE=E5=A4=8D=20=E6=8C=89=20?= =?UTF-8?q?=C2=A0=E5=A4=A7=E7=89=88=E6=9C=AC.=E4=B8=AD=E7=89=88=E6=9C=AC.?= =?UTF-8?q?=E5=B0=8F=E7=89=88=E6=9C=AC.=E8=BF=AD=E4=BB=A3=E5=8F=B7=C2=A0?= =?UTF-8?q?=20=E5=88=86=E6=AE=B5=E6=95=B0=E5=AD=97=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=85=88=E6=8A=93=E5=8F=96=20=C2=A0appbase-v?= =?UTF-8?q?15.20.12=C2=A0=20=E8=80=8C=E4=B8=8D=E6=98=AF=E6=97=A7=E7=89=88?= =?UTF-8?q?=20=E2=80=8B=202.=C2=A0=E6=A3=80=E5=87=BA=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20=E7=BB=9F=E4=B8=80=E4=BD=BF=E7=94=A8=20?= =?UTF-8?q?=C2=A0git=20checkout=20=E6=8F=90=E4=BA=A4=E5=93=88=E5=B8=8C=20-?= =?UTF-8?q?-=20=E7=9B=AE=E5=BD=95=C2=A0=20=E8=AF=AD=E6=B3=95=EF=BC=8C?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E6=8A=A5=E8=B7=AF=E5=BE=84=E4=B8=8D=E5=AD=98?= =?UTF-8?q?=E5=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ashMergeProjects-to-Projects_Keeper_Tag.sh | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh index 2ce169a..0843663 100644 --- a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh +++ b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh @@ -1,16 +1,18 @@ #!/system/bin/sh ## 流程:获取远程最新Tag → 获取Tag对应Commit → 按Commit合并远程模块目录到本地 -# ====================== 1. 获取模块远程最新版本TAG ====================== +# ====================== 1. 获取模块远程最新版本TAG(修复版本排序) ====================== get_module_latest_tag() { local module_name="$1" git fetch origin --tags 2>/dev/null + # 取出所有同前缀标签,去除头部,纯版本排序,取最大最新 git ls-remote --tags origin "${module_name}-*" 2>/dev/null \ | grep -v '\^{}' \ - | sort -V \ - | tail -1 \ | awk '{print $2}' \ - | sed 's/refs\/tags\///' + | sed "s/refs\/tags\/${module_name}-//" \ + | sort -t '.' -k1,1n -k2,2n -k3,3n -k4,4n \ + | tail -1 \ + | xargs echo "${module_name}-" } # ====================== 2. 通过TAG获取对应提交Commit哈希 ====================== @@ -146,9 +148,9 @@ for item in "${MERGE_APP_PROJECT_LIST[@]}"; do echo "对应提交点:$TARGET_COMMIT" echo "----------------------------------------" - # 正确写法:用commit检出指定目录 - git checkout ${TARGET_COMMIT} -- ${item_lower} - git add ${item_lower} + # 正确语法:从指定提交点拉取文件夹覆盖本地 + git checkout "${TARGET_COMMIT}" -- "${item_lower}" + git add "${item_lower}" git commit -m "合并模块${item} 来源最新标签:${LATEST_TAG} 提交点:${TARGET_COMMIT}" done @@ -173,9 +175,8 @@ for item in "${MERGE_LIB_PROJECT_LIST[@]}"; do echo "对应提交点:$TARGET_COMMIT" echo "----------------------------------------" - # 同时检出主目录 + lib目录 - git checkout ${TARGET_COMMIT} -- ${item_lower} lib${item_lower} - git add ${item_lower} lib${item_lower} + git checkout "${TARGET_COMMIT}" -- "${item_lower}" "lib${item_lower}" + git add "${item_lower}" "lib${item_lower}" git commit -m "合并模块${item} 来源最新标签:${LATEST_TAG} 提交点:${TARGET_COMMIT}" done From cbca61ad84212d78b86f3fea39df1ca335361d27 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 15:37:37 +0800 Subject: [PATCH 17/32] =?UTF-8?q?1.=C2=A0=E5=88=A0=E6=8E=89=E6=89=8B?= =?UTF-8?q?=E5=8A=A8=E6=8B=BC=E6=8E=A5=E6=A0=87=E7=AD=BE=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E7=9B=B4=E6=8E=A5=E5=8F=96=E7=94=A8=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E5=AE=8C=E6=95=B4=E6=A0=87=E7=AD=BE=E5=90=8D=EF=BC=8C=E6=9D=9C?= =?UTF-8?q?=E7=BB=9D=20=C2=A0appbase-=20=E7=A9=BA=E6=A0=BC=E7=89=88?= =?UTF-8?q?=E6=9C=AC=C2=A0=20=E2=80=8B=202.=C2=A0=E4=BD=BF=E7=94=A8=20?= =?UTF-8?q?=C2=A0git=20rev-parse=20--verify=20=E6=A0=87=E7=AD=BE^{commit}?= =?UTF-8?q?=C2=A0=20=E7=B2=BE=E5=87=86=E6=8B=BF=E8=BF=9C=E7=A8=8B=E6=A0=87?= =?UTF-8?q?=E7=AD=BEcommit=20=E2=80=8B=203.=C2=A0=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E6=9D=A5=E6=BA=90=E5=BC=BA=E5=88=B6=E6=8C=87=E5=AE=9A=20=C2=A0?= =?UTF-8?q?origin/=E6=A8=A1=E5=9D=97=E5=90=8D=C2=A0=20=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E5=88=86=E6=94=AF=20=E2=80=8B=204.=C2=A0=E7=A9=BA=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E7=9B=B4=E6=8E=A5=E8=B7=B3=E8=BF=87=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E5=87=BA=E7=8E=B0=20=C2=A0xxx-=C2=A0=20=E9=9D=9E?= =?UTF-8?q?=E6=B3=95=E6=A0=87=E7=AD=BE=20=E2=80=8B=205.=C2=A0=E6=A3=80?= =?UTF-8?q?=E5=87=BA=E8=AF=AD=E6=B3=95=E6=A0=87=E5=87=86=EF=BC=9A=C2=A0git?= =?UTF-8?q?=20checkout=20=E8=BF=9C=E7=A8=8B=E5=88=86=E6=94=AF=20commit=20-?= =?UTF-8?q?-=20=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ashMergeProjects-to-Projects_Keeper_Tag.sh | 91 ++++++++----------- 1 file changed, 39 insertions(+), 52 deletions(-) diff --git a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh index 0843663..28666a6 100644 --- a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh +++ b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh @@ -1,27 +1,25 @@ #!/system/bin/sh -## 流程:获取远程最新Tag → 获取Tag对应Commit → 按Commit合并远程模块目录到本地 +## 流程:获取远程最新Tag → 获取Tag对应远程Commit → 从远程分支指定提交点合并模块目录 -# ====================== 1. 获取模块远程最新版本TAG(修复版本排序) ====================== +# 获取模块远程完整最新TAG 无多余空格 get_module_latest_tag() { local module_name="$1" git fetch origin --tags 2>/dev/null - # 取出所有同前缀标签,去除头部,纯版本排序,取最大最新 git ls-remote --tags origin "${module_name}-*" 2>/dev/null \ | grep -v '\^{}' \ - | awk '{print $2}' \ - | sed "s/refs\/tags\/${module_name}-//" \ - | sort -t '.' -k1,1n -k2,2n -k3,3n -k4,4n \ + | sort -V \ | tail -1 \ - | xargs echo "${module_name}-" + | awk '{print $2}' \ + | sed 's/refs\/tags\///' } -# ====================== 2. 通过TAG获取对应提交Commit哈希 ====================== -get_commit_by_tag() { +# 通过远程标签获取对应提交哈希 +get_remote_commit_by_tag() { local tag_name="$1" - git rev-list -1 "$tag_name" 2>/dev/null + git rev-parse --verify "${tag_name}^{commit}" 2>/dev/null } -# ====================== 进入工作目录 ====================== +# 进入工作目录 TARGET_DIR="/sdcard/AppProjects/Projects_Keeper_Tag" echo "切换工作目录:$TARGET_DIR" if ! cd "$TARGET_DIR"; then @@ -29,16 +27,16 @@ if ! cd "$TARGET_DIR"; then exit 1 fi -# ====================== 同步远程全部标签 ====================== +# 同步远程 echo "==============================================" -echo "同步远程所有分支与版本标签" +echo "同步远程分支与全部版本标签" echo "==============================================" git fetch origin --prune git fetch origin --tags echo "同步完成" echo "" -# ====================== 锁定本地目标分支 ====================== +# 锁定目标分支 CUR_BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null) TARGET_BRANCH="projects_keeper_tag" if [ "$CUR_BRANCH" != "$TARGET_BRANCH" ]; then @@ -46,7 +44,7 @@ if [ "$CUR_BRANCH" != "$TARGET_BRANCH" ]; then exit 1 fi -# ====================== 目录结构校验 ====================== +# 目录校验 MERGE_OBJECTS_LIST=( .git .gitignore @@ -124,62 +122,51 @@ check_diff() { } check_diff -# ====================== 开始批量合并模块 ====================== -echo -e "#@@@ 开始按【最新Tag+对应Commit】合并模块 @@@#" +echo -e "#@@@ 开始按远程最新标签合并模块 @@@#" -## 合并应用型模块 +# 应用型模块 MERGE_APP_PROJECT_LIST=(DemoAPP) echo -e "---------- 应用型模块合并 ----------" for item in "${MERGE_APP_PROJECT_LIST[@]}"; do item_lower=$(echo "$item" | tr 'A-Z' 'a-z') - LATEST_TAG=$(get_module_latest_tag "$item_lower") - if [ -z "$LATEST_TAG" ]; then - echo "跳过 $item_lower :未查询到任何版本标签" + TAG=$(get_module_latest_tag "${item_lower}") + if [[ -z "$TAG" ]]; then + echo "跳过 ${item_lower}:无远程版本标签" continue fi - TARGET_COMMIT=$(get_commit_by_tag "$LATEST_TAG") - if [ -z "$TARGET_COMMIT" ]; then - echo "跳过 $item_lower :标签 $LATEST_TAG 未查询到对应提交点" + COMMIT=$(get_remote_commit_by_tag "$TAG") + if [[ -z "$COMMIT" ]]; then + echo "跳过 ${item_lower}:标签 $TAG 无有效提交点" continue fi - - echo "模块:$item_lower" - echo "最新标签:$LATEST_TAG" - echo "对应提交点:$TARGET_COMMIT" - echo "----------------------------------------" - - # 正确语法:从指定提交点拉取文件夹覆盖本地 - git checkout "${TARGET_COMMIT}" -- "${item_lower}" - git add "${item_lower}" - git commit -m "合并模块${item} 来源最新标签:${LATEST_TAG} 提交点:${TARGET_COMMIT}" + echo "模块:${item_lower} | 标签:$TAG | 提交哈希:$COMMIT" + # 从远程分支该提交点拉取目录 + git checkout origin/${item_lower} ${COMMIT} -- ${item_lower} + git add ${item_lower} + git commit -m "合并模块${item} 来源远程标签:${TAG} 提交点:${COMMIT}" done -## 合并类库模块 +# 类库模块 MERGE_LIB_PROJECT_LIST=(WinBoLL APPBase AES) echo -e "---------- 类库模块合并 ----------" for item in "${MERGE_LIB_PROJECT_LIST[@]}"; do item_lower=$(echo "$item" | tr 'A-Z' 'a-z') - LATEST_TAG=$(get_module_latest_tag "$item_lower") - if [ -z "$LATEST_TAG" ]; then - echo "跳过 $item_lower :未查询到任何版本标签" + TAG=$(get_module_latest_tag "${item_lower}") + if [[ -z "$TAG" ]]; then + echo "跳过 ${item_lower}:无远程版本标签" continue fi - TARGET_COMMIT=$(get_commit_by_tag "$LATEST_TAG") - if [ -z "$TARGET_COMMIT" ]; then - echo "跳过 $item_lower :标签 $LATEST_TAG 未查询到对应提交点" + COMMIT=$(get_remote_commit_by_tag "$TAG") + if [[ -z "$COMMIT" ]]; then + echo "跳过 ${item_lower}:标签 $TAG 无有效提交点" continue fi - - echo "模块:$item_lower" - echo "最新标签:$LATEST_TAG" - echo "对应提交点:$TARGET_COMMIT" - echo "----------------------------------------" - - git checkout "${TARGET_COMMIT}" -- "${item_lower}" "lib${item_lower}" - git add "${item_lower}" "lib${item_lower}" - git commit -m "合并模块${item} 来源最新标签:${LATEST_TAG} 提交点:${TARGET_COMMIT}" + echo "模块:${item_lower} | 标签:$TAG | 提交哈希:$COMMIT" + git checkout origin/${item_lower} ${COMMIT} -- ${item_lower} lib${item_lower} + git add ${item_lower} lib${item_lower} + git commit -m "合并模块${item} 来源远程标签:${TAG} 提交点:${COMMIT}" done -echo "所有模块合并流程执行完毕" -echo "准备推送至远程分支" +echo "所有模块合并完成" +echo "准备推送远程" git push From e2b4bddb619faa77c8f87008ed58fce9e0d25d84 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 15:43:18 +0800 Subject: [PATCH 18/32] BugFix --- ...ashMergeProjects-to-Projects_Keeper_Tag.sh | 149 +++++++----------- 1 file changed, 60 insertions(+), 89 deletions(-) diff --git a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh index 28666a6..08d85eb 100644 --- a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh +++ b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh @@ -1,50 +1,42 @@ #!/system/bin/sh -## 流程:获取远程最新Tag → 获取Tag对应远程Commit → 从远程分支指定提交点合并模块目录 +## 执行流程 +## 1.拉取远程所有标签 2.取模块最新标签 3.取标签对应commit 4.从远程commit拉取指定目录到本地 -# 获取模块远程完整最新TAG 无多余空格 -get_module_latest_tag() { - local module_name="$1" - git fetch origin --tags 2>/dev/null - git ls-remote --tags origin "${module_name}-*" 2>/dev/null \ - | grep -v '\^{}' \ - | sort -V \ - | tail -1 \ - | awk '{print $2}' \ - | sed 's/refs\/tags\///' +# 获取模块最新完整标签 +get_latest_module_tag(){ + local mod=$1 + git ls-remote --tags origin "${mod}-*" | grep -v '\^{}' | sort -V | tail -1 | awk '{print $2}' | sed 's/refs\/tags\///' } -# 通过远程标签获取对应提交哈希 -get_remote_commit_by_tag() { - local tag_name="$1" - git rev-parse --verify "${tag_name}^{commit}" 2>/dev/null +# 纯标签获取commit 不加多余前缀 +get_commit_from_tag(){ + local tag=$1 + git rev-parse --short "${tag}^{commit}" } -# 进入工作目录 +# 工作目录 TARGET_DIR="/sdcard/AppProjects/Projects_Keeper_Tag" -echo "切换工作目录:$TARGET_DIR" -if ! cd "$TARGET_DIR"; then - echo "目录切换失败!" - exit 1 -fi +echo "进入目录:${TARGET_DIR}" +cd "${TARGET_DIR}" || exit 1 -# 同步远程 -echo "==============================================" +# 同步远程数据 +echo "========================================" echo "同步远程分支与全部版本标签" -echo "==============================================" +echo "========================================" git fetch origin --prune git fetch origin --tags echo "同步完成" echo "" -# 锁定目标分支 -CUR_BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null) +# 强制校验当前分支 +NOW_BRANCH=$(git symbolic-ref --short HEAD) TARGET_BRANCH="projects_keeper_tag" -if [ "$CUR_BRANCH" != "$TARGET_BRANCH" ]; then - echo "错误:当前不在 $TARGET_BRANCH 分支,请先切换!" +if [ "${NOW_BRANCH}" != "${TARGET_BRANCH}" ];then + echo "错误:请先切换到 ${TARGET_BRANCH} 分支" exit 1 fi -# 目录校验 +# 目录结构校验保留 MERGE_OBJECTS_LIST=( .git .gitignore @@ -83,90 +75,69 @@ winboll.properties-demo REAL_ITEMS=() while IFS= read -r line; do - if [[ "$line" != "." && "$line" != ".." ]]; then - REAL_ITEMS+=("$line") - fi + [[ $line != "." && $line != ".." ]] && REAL_ITEMS+=("$line") done < <(ls -a) -check_diff() { - local missing=() - local extra=() - for item in "${MERGE_OBJECTS_LIST[@]}"; do - local found=0 - for r in "${REAL_ITEMS[@]}"; do - if [[ "$item" == "$r" ]]; then - found=1 - break - fi - done - if (( found == 0 )); then - missing+=("$item") - fi +check_diff(){ + local miss=() extra=() + for i in "${MERGE_OBJECTS_LIST[@]}";do + [[ ! " ${REAL_ITEMS[@]} " =~ " ${i} " ]] && miss+=("$i") done - for r in "${REAL_ITEMS[@]}"; do - local found=0 - for item in "${MERGE_OBJECTS_LIST[@]}"; do - if [[ "$item" == "$r" ]]; then - found=1 - break - fi - done - if (( found == 0 )); then - extra+=("$r") - fi + for i in "${REAL_ITEMS[@]}";do + [[ ! " ${MERGE_OBJECTS_LIST[@]} " =~ " ${i} " ]] && extra+=("$i") done - if [[ ${#missing[@]} -gt 0 || ${#extra[@]} -gt 0 ]]; then - echo "目录结构不匹配,终止执行" + if [[ ${#miss[@]} -gt 0 || ${#extra[@]} -gt 0 ]];then + echo "本地目录结构不一致,终止运行" exit 1 fi } check_diff -echo -e "#@@@ 开始按远程最新标签合并模块 @@@#" +echo -e "#@@@ 开始按远程最新标签合并模块源码 @@@#" # 应用型模块 MERGE_APP_PROJECT_LIST=(DemoAPP) -echo -e "---------- 应用型模块合并 ----------" -for item in "${MERGE_APP_PROJECT_LIST[@]}"; do - item_lower=$(echo "$item" | tr 'A-Z' 'a-z') - TAG=$(get_module_latest_tag "${item_lower}") - if [[ -z "$TAG" ]]; then - echo "跳过 ${item_lower}:无远程版本标签" +echo -e "---------- 应用型模块 ----------" +for name in "${MERGE_APP_PROJECT_LIST[@]}";do + low_name=$(echo "$name" | tr 'A-Z' 'a-z') + tag=$(get_latest_module_tag "${low_name}") + if [[ -z "${tag}" ]];then + echo "跳过 ${low_name}:无远程标签" continue fi - COMMIT=$(get_remote_commit_by_tag "$TAG") - if [[ -z "$COMMIT" ]]; then - echo "跳过 ${item_lower}:标签 $TAG 无有效提交点" + commit=$(get_commit_from_tag "${tag}") + if [[ -z "${commit}" ]];then + echo "跳过 ${low_name}:标签无有效提交点" continue fi - echo "模块:${item_lower} | 标签:$TAG | 提交哈希:$COMMIT" - # 从远程分支该提交点拉取目录 - git checkout origin/${item_lower} ${COMMIT} -- ${item_lower} - git add ${item_lower} - git commit -m "合并模块${item} 来源远程标签:${TAG} 提交点:${COMMIT}" + echo "模块:${low_name} 最新标签:${tag} 提交ID:${commit}" + # 标准正确拉取命令 + git checkout "${tag}" -- "${low_name}" + git add "${low_name}" + git commit -m "合并模块${name} 来源标签${tag} 提交${commit}" done # 类库模块 MERGE_LIB_PROJECT_LIST=(WinBoLL APPBase AES) -echo -e "---------- 类库模块合并 ----------" -for item in "${MERGE_LIB_PROJECT_LIST[@]}"; do - item_lower=$(echo "$item" | tr 'A-Z' 'a-z') - TAG=$(get_module_latest_tag "${item_lower}") - if [[ -z "$TAG" ]]; then - echo "跳过 ${item_lower}:无远程版本标签" +echo -e "---------- 类库模块 ----------" +for name in "${MERGE_LIB_PROJECT_LIST[@]}";do + low_name=$(echo "$name" | tr 'A-Z' 'a-z') + tag=$(get_latest_module_tag "${low_name}") + if [[ -z "${tag}" ]];then + echo "跳过 ${low_name}:无远程标签" continue fi - COMMIT=$(get_remote_commit_by_tag "$TAG") - if [[ -z "$COMMIT" ]]; then - echo "跳过 ${item_lower}:标签 $TAG 无有效提交点" + commit=$(get_commit_from_tag "${tag}") + if [[ -z "${commit}" ]];then + echo "跳过 ${low_name}:标签无有效提交点" continue fi - echo "模块:${item_lower} | 标签:$TAG | 提交哈希:$COMMIT" - git checkout origin/${item_lower} ${COMMIT} -- ${item_lower} lib${item_lower} - git add ${item_lower} lib${item_lower} - git commit -m "合并模块${item} 来源远程标签:${TAG} 提交点:${COMMIT}" + echo "模块:${low_name} 最新标签:${tag} 提交ID:${commit}" + git checkout "${tag}" -- "${low_name}" "lib${low_name}" + git add "${low_name}" "lib${low_name}" + git commit -m "合并模块${name} 来源标签${tag} 提交${commit}" done -echo "所有模块合并完成" -echo "准备推送远程" +echo "全部模块合并执行完毕" +echo "执行推送:git push" git push From 81b7af0ec4be8c4580f30861eb686f2b1af71682 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 15:45:57 +0800 Subject: [PATCH 19/32] =?UTF-8?q?1.=C2=A0=E6=8E=92=E5=BA=8F=E8=A7=84?= =?UTF-8?q?=E5=88=99=E5=BD=BB=E5=BA=95=E6=8D=A2=E6=8E=89=20=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E6=8C=89=E7=89=88=E6=9C=AC=E5=8F=B7=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=EF=BC=8C=E6=8C=89=E6=A0=87=E7=AD=BE=E5=88=9B=E5=BB=BA=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E4=BB=8E=E6=96=B0=E5=88=B0=E6=97=A7=EF=BC=8C=E6=B0=B8?= =?UTF-8?q?=E8=BF=9C=E6=8B=BF=E5=88=B0=E6=9C=80=E5=90=8E=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E7=9A=84=E6=9C=80=E6=96=B0=E6=A0=87=E7=AD=BE=20=E2=80=8B=202.?= =?UTF-8?q?=C2=A0=E5=A2=9E=E5=8A=A0=20=C2=A0-f=C2=A0=20=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E8=A6=86=E7=9B=96=EF=BC=8C=E7=A1=AE=E4=BF=9D=E6=8B=89=E5=8F=96?= =?UTF-8?q?=E6=9C=80=E6=96=B0=E6=96=87=E4=BB=B6=20=E2=80=8B=203.=C2=A0?= =?UTF-8?q?=E4=BD=A0=E7=8E=B0=E5=9C=A8=20=C2=A0appbase-v15.20.12=C2=A0=20?= =?UTF-8?q?=E6=98=AF=E5=90=8E=E6=89=93=E7=9A=84=E6=A0=87=E7=AD=BE=EF=BC=8C?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E4=BC=9A=E7=9B=B4=E6=8E=A5=E4=BC=98=E5=85=88?= =?UTF-8?q?=E6=8A=93=E5=8F=96=E5=AE=83=20=E2=80=8B=204.=C2=A0=E6=97=A0?= =?UTF-8?q?=E5=B7=AE=E5=BC=82=E4=B9=9F=E4=BC=9A=E6=AD=A3=E5=B8=B8=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E6=9C=80=E6=96=B0=E6=A0=87=E7=AD=BE=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ashMergeProjects-to-Projects_Keeper_Tag.sh | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh index 08d85eb..6d30f3b 100644 --- a/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh +++ b/.winboll/bashMergeProjects-to-Projects_Keeper_Tag.sh @@ -1,14 +1,16 @@ #!/system/bin/sh -## 执行流程 -## 1.拉取远程所有标签 2.取模块最新标签 3.取标签对应commit 4.从远程commit拉取指定目录到本地 +## 逻辑:按时间取最新标签 → 拉取该标签目录合并 -# 获取模块最新完整标签 +# 按创建时间取模块最新标签(最新打的标签排最后) get_latest_module_tag(){ local mod=$1 - git ls-remote --tags origin "${mod}-*" | grep -v '\^{}' | sort -V | tail -1 | awk '{print $2}' | sed 's/refs\/tags\///' + git for-each-ref --sort=-creatordate --format='%(refname)' refs/tags/${mod}-* \ + | grep -v '\^{}' \ + | head -1 \ + | sed 's/refs\/tags\///' } -# 纯标签获取commit 不加多余前缀 +# 通过标签获取commit get_commit_from_tag(){ local tag=$1 git rev-parse --short "${tag}^{commit}" @@ -19,7 +21,7 @@ TARGET_DIR="/sdcard/AppProjects/Projects_Keeper_Tag" echo "进入目录:${TARGET_DIR}" cd "${TARGET_DIR}" || exit 1 -# 同步远程数据 +# 同步远程 echo "========================================" echo "同步远程分支与全部版本标签" echo "========================================" @@ -28,7 +30,7 @@ git fetch origin --tags echo "同步完成" echo "" -# 强制校验当前分支 +# 校验目标分支 NOW_BRANCH=$(git symbolic-ref --short HEAD) TARGET_BRANCH="projects_keeper_tag" if [ "${NOW_BRANCH}" != "${TARGET_BRANCH}" ];then @@ -36,7 +38,7 @@ if [ "${NOW_BRANCH}" != "${TARGET_BRANCH}" ];then exit 1 fi -# 目录结构校验保留 +# 目录结构校验 MERGE_OBJECTS_LIST=( .git .gitignore @@ -93,7 +95,7 @@ check_diff(){ } check_diff -echo -e "#@@@ 开始按远程最新标签合并模块源码 @@@#" +echo -e "#@@@ 按时间获取最新标签合并模块源码 @@@#" # 应用型模块 MERGE_APP_PROJECT_LIST=(DemoAPP) @@ -110,11 +112,11 @@ for name in "${MERGE_APP_PROJECT_LIST[@]}";do echo "跳过 ${low_name}:标签无有效提交点" continue fi - echo "模块:${low_name} 最新标签:${tag} 提交ID:${commit}" - # 标准正确拉取命令 - git checkout "${tag}" -- "${low_name}" + echo "模块:${low_name} 最新时间标签:${tag} 提交ID:${commit}" + # 强制拉取覆盖 + git checkout -f "${tag}" -- "${low_name}" git add "${low_name}" - git commit -m "合并模块${name} 来源标签${tag} 提交${commit}" + git commit -m "合并模块${name} 同步最新时间标签${tag}" done # 类库模块 @@ -132,10 +134,10 @@ for name in "${MERGE_LIB_PROJECT_LIST[@]}";do echo "跳过 ${low_name}:标签无有效提交点" continue fi - echo "模块:${low_name} 最新标签:${tag} 提交ID:${commit}" - git checkout "${tag}" -- "${low_name}" "lib${low_name}" + echo "模块:${low_name} 最新时间标签:${tag} 提交ID:${commit}" + git checkout -f "${tag}" -- "${low_name}" "lib${low_name}" git add "${low_name}" "lib${low_name}" - git commit -m "合并模块${name} 来源标签${tag} 提交${commit}" + git commit -m "合并模块${name} 同步最新时间标签${tag}" done echo "全部模块合并执行完毕" From e92538850fbe885f39c3c0827b8a701c24ef189f Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 15:46:18 +0800 Subject: [PATCH 20/32] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A8=A1=E5=9D=97APPBa?= =?UTF-8?q?se=20=E5=90=8C=E6=AD=A5=E6=9C=80=E6=96=B0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=A0=87=E7=AD=BEappbase-v15.20.12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appbase/build.properties | 8 ++++---- libappbase/build.properties | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/appbase/build.properties b/appbase/build.properties index 3c69d65..de98a9c 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun May 17 14:46:57 HKT 2026 -stageCount=12 +#Sun May 17 15:28:35 HKT 2026 +stageCount=13 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.11 +publishVersion=15.20.12 buildCount=0 -baseBetaVersion=15.20.12 +baseBetaVersion=15.20.13 diff --git a/libappbase/build.properties b/libappbase/build.properties index 3c69d65..de98a9c 100644 --- a/libappbase/build.properties +++ b/libappbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun May 17 14:46:57 HKT 2026 -stageCount=12 +#Sun May 17 15:28:35 HKT 2026 +stageCount=13 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.11 +publishVersion=15.20.12 buildCount=0 -baseBetaVersion=15.20.12 +baseBetaVersion=15.20.13 From fc20bd56b4dc374b863f4b720ce821195c3270e2 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 15:52:14 +0800 Subject: [PATCH 21/32] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A8=A1=E5=9D=97APPBa?= =?UTF-8?q?se=20=E5=90=8C=E6=AD=A5=E6=9C=80=E6=96=B0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=A0=87=E7=AD=BEappbase-v15.20.13?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appbase/build.properties | 8 ++++---- libappbase/build.properties | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/appbase/build.properties b/appbase/build.properties index de98a9c..0935eef 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun May 17 15:28:35 HKT 2026 -stageCount=13 +#Sun May 17 15:52:00 HKT 2026 +stageCount=14 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.12 +publishVersion=15.20.13 buildCount=0 -baseBetaVersion=15.20.13 +baseBetaVersion=15.20.14 diff --git a/libappbase/build.properties b/libappbase/build.properties index de98a9c..0935eef 100644 --- a/libappbase/build.properties +++ b/libappbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun May 17 15:28:35 HKT 2026 -stageCount=13 +#Sun May 17 15:52:00 HKT 2026 +stageCount=14 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.12 +publishVersion=15.20.13 buildCount=0 -baseBetaVersion=15.20.13 +baseBetaVersion=15.20.14 From aa1b701c8bbd80df6e63650be1e2a9d6520ef8c8 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 17 May 2026 15:55:39 +0800 Subject: [PATCH 22/32] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A8=A1=E5=9D=97APPBa?= =?UTF-8?q?se=20=E5=90=8C=E6=AD=A5=E6=9C=80=E6=96=B0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=A0=87=E7=AD=BEappbase-v15.20.14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appbase/build.properties | 8 ++++---- libappbase/build.properties | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/appbase/build.properties b/appbase/build.properties index 0935eef..f451696 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun May 17 15:52:00 HKT 2026 -stageCount=14 +#Sun May 17 15:55:29 HKT 2026 +stageCount=15 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.13 +publishVersion=15.20.14 buildCount=0 -baseBetaVersion=15.20.14 +baseBetaVersion=15.20.15 diff --git a/libappbase/build.properties b/libappbase/build.properties index 0935eef..f451696 100644 --- a/libappbase/build.properties +++ b/libappbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun May 17 15:52:00 HKT 2026 -stageCount=14 +#Sun May 17 15:55:29 HKT 2026 +stageCount=15 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.13 +publishVersion=15.20.14 buildCount=0 -baseBetaVersion=15.20.14 +baseBetaVersion=15.20.15 From eb3d8f48062960c8783cf08df45c5f2f5f032aca Mon Sep 17 00:00:00 2001 From: qinglong Date: Sun, 17 May 2026 16:20:01 +0800 Subject: [PATCH 23/32] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A8=A1=E5=9D=97APPBa?= =?UTF-8?q?se=20=E5=90=8C=E6=AD=A5=E6=9C=80=E6=96=B0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=A0=87=E7=AD=BEappbase-v15.20.15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appbase/build.properties | 8 ++++---- libappbase/build.properties | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/appbase/build.properties b/appbase/build.properties index f451696..492916a 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun May 17 15:55:29 HKT 2026 -stageCount=15 +#Sun May 17 16:16:36 HKT 2026 +stageCount=16 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.14 +publishVersion=15.20.15 buildCount=0 -baseBetaVersion=15.20.15 +baseBetaVersion=15.20.16 diff --git a/libappbase/build.properties b/libappbase/build.properties index f451696..492916a 100644 --- a/libappbase/build.properties +++ b/libappbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun May 17 15:55:29 HKT 2026 -stageCount=15 +#Sun May 17 16:16:36 HKT 2026 +stageCount=16 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.14 +publishVersion=15.20.15 buildCount=0 -baseBetaVersion=15.20.15 +baseBetaVersion=15.20.16 From 193011a80d2c013fd4f5f4eaed94907a3d2570c3 Mon Sep 17 00:00:00 2001 From: qinglong Date: Sun, 17 May 2026 21:00:01 +0800 Subject: [PATCH 24/32] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A8=A1=E5=9D=97AES?= =?UTF-8?q?=20=E5=90=8C=E6=AD=A5=E6=9C=80=E6=96=B0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=A0=87=E7=AD=BEaes-v15.20.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aes/build.properties | 8 ++++---- libaes/build.gradle | 5 +++++ libaes/build.properties | 8 ++++---- libaes/src/main/res/layout/view_adscontrol.xml | 2 +- libaes/src/main/res/values-night/colors.xml | 2 +- libaes/src/main/res/values/colors.xml | 2 +- 6 files changed, 16 insertions(+), 11 deletions(-) diff --git a/aes/build.properties b/aes/build.properties index 4e746cb..8225f1b 100644 --- a/aes/build.properties +++ b/aes/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue May 12 13:11:28 HKT 2026 -stageCount=4 +#Sun May 17 20:53:39 HKT 2026 +stageCount=5 libraryProject=libaes baseVersion=15.20 -publishVersion=15.20.3 +publishVersion=15.20.4 buildCount=0 -baseBetaVersion=15.20.4 +baseBetaVersion=15.20.5 diff --git a/libaes/build.gradle b/libaes/build.gradle index d6c3ad4..c97935f 100644 --- a/libaes/build.gradle +++ b/libaes/build.gradle @@ -21,6 +21,11 @@ android { } // 米盟 SDK + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } + packagingOptions { doNotStrip "*/*/libmimo_1011.so" } diff --git a/libaes/build.properties b/libaes/build.properties index 8f4366b..8225f1b 100644 --- a/libaes/build.properties +++ b/libaes/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue May 12 13:11:09 HKT 2026 -stageCount=4 +#Sun May 17 20:53:39 HKT 2026 +stageCount=5 libraryProject=libaes baseVersion=15.20 -publishVersion=15.20.3 +publishVersion=15.20.4 buildCount=0 -baseBetaVersion=15.20.4 +baseBetaVersion=15.20.5 diff --git a/libaes/src/main/res/layout/view_adscontrol.xml b/libaes/src/main/res/layout/view_adscontrol.xml index 23a29b3..8e8b81f 100644 --- a/libaes/src/main/res/layout/view_adscontrol.xml +++ b/libaes/src/main/res/layout/view_adscontrol.xml @@ -50,7 +50,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" - android:layout_marginTop="0dp"> #FFFFFFFF #FF2C2C2C #FFFFFFFF - #FFFF0000 + #FFAAAAAA \ No newline at end of file diff --git a/libaes/src/main/res/values/colors.xml b/libaes/src/main/res/values/colors.xml index 5c0a9cc..3b50a4e 100644 --- a/libaes/src/main/res/values/colors.xml +++ b/libaes/src/main/res/values/colors.xml @@ -28,6 +28,6 @@ #FFFFFFFF #FFFFFFFF #FF000000 - #FFFF0000 + #FF808080 \ No newline at end of file From 1c6f7783e5265757343bef165792487e4fd85ac6 Mon Sep 17 00:00:00 2001 From: QingLong Date: Tue, 19 May 2026 01:49:06 +0800 Subject: [PATCH 25/32] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A8=A1=E5=9D=97AES?= =?UTF-8?q?=20=E5=90=8C=E6=AD=A5=E6=9C=80=E6=96=B0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=A0=87=E7=AD=BEaes-v15.20.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aes/build.properties | 8 ++++---- libaes/build.properties | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/aes/build.properties b/aes/build.properties index 8225f1b..482b5b8 100644 --- a/aes/build.properties +++ b/aes/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun May 17 20:53:39 HKT 2026 -stageCount=5 +#Tue May 19 01:48:43 HKT 2026 +stageCount=6 libraryProject=libaes baseVersion=15.20 -publishVersion=15.20.4 +publishVersion=15.20.5 buildCount=0 -baseBetaVersion=15.20.5 +baseBetaVersion=15.20.6 diff --git a/libaes/build.properties b/libaes/build.properties index 8225f1b..482b5b8 100644 --- a/libaes/build.properties +++ b/libaes/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun May 17 20:53:39 HKT 2026 -stageCount=5 +#Tue May 19 01:48:43 HKT 2026 +stageCount=6 libraryProject=libaes baseVersion=15.20 -publishVersion=15.20.4 +publishVersion=15.20.5 buildCount=0 -baseBetaVersion=15.20.5 +baseBetaVersion=15.20.6 From aec680e36ee11393fa1d7a36e5e45ebc98cc3271 Mon Sep 17 00:00:00 2001 From: QingLong Date: Tue, 19 May 2026 01:53:02 +0800 Subject: [PATCH 26/32] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A8=A1=E5=9D=97AES?= =?UTF-8?q?=20=E5=90=8C=E6=AD=A5=E6=9C=80=E6=96=B0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=A0=87=E7=AD=BEaes-v15.20.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aes/build.properties | 8 ++++---- libaes/build.properties | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/aes/build.properties b/aes/build.properties index 482b5b8..b401b3c 100644 --- a/aes/build.properties +++ b/aes/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue May 19 01:48:43 HKT 2026 -stageCount=6 +#Tue May 19 01:52:47 HKT 2026 +stageCount=7 libraryProject=libaes baseVersion=15.20 -publishVersion=15.20.5 +publishVersion=15.20.6 buildCount=0 -baseBetaVersion=15.20.6 +baseBetaVersion=15.20.7 diff --git a/libaes/build.properties b/libaes/build.properties index 482b5b8..b401b3c 100644 --- a/libaes/build.properties +++ b/libaes/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue May 19 01:48:43 HKT 2026 -stageCount=6 +#Tue May 19 01:52:47 HKT 2026 +stageCount=7 libraryProject=libaes baseVersion=15.20 -publishVersion=15.20.5 +publishVersion=15.20.6 buildCount=0 -baseBetaVersion=15.20.6 +baseBetaVersion=15.20.7 From edd312a525da2883dc359cef64576e0ae3eab717 Mon Sep 17 00:00:00 2001 From: QingLong Date: Tue, 19 May 2026 19:00:01 +0800 Subject: [PATCH 27/32] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A8=A1=E5=9D=97APPBa?= =?UTF-8?q?se=20=E5=90=8C=E6=AD=A5=E6=9C=80=E6=96=B0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=A0=87=E7=AD=BEappbase-v15.20.16?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appbase/build.gradle | 5 ++++- appbase/build.properties | 8 ++++---- libappbase/build.properties | 8 ++++---- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/appbase/build.gradle b/appbase/build.gradle index b95d796..14f2a08 100644 --- a/appbase/build.gradle +++ b/appbase/build.gradle @@ -26,7 +26,10 @@ android { applicationId "cc.winboll.studio.appbase" minSdkVersion 26 targetSdkVersion 30 - versionCode 1 + //1. Android 官方规则 + //-  versionCode  类型:int 整型 + //- Java int 最大值:2147483647 + versionCode 1520000 // versionName 更新后需要手动设置 // .winboll/winbollBuildProps.properties 文件的 stageCount=0 // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" diff --git a/appbase/build.properties b/appbase/build.properties index 492916a..f0cb910 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun May 17 16:16:36 HKT 2026 -stageCount=16 +#Tue May 19 18:54:18 HKT 2026 +stageCount=17 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.15 +publishVersion=15.20.16 buildCount=0 -baseBetaVersion=15.20.16 +baseBetaVersion=15.20.17 diff --git a/libappbase/build.properties b/libappbase/build.properties index 492916a..f0cb910 100644 --- a/libappbase/build.properties +++ b/libappbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun May 17 16:16:36 HKT 2026 -stageCount=16 +#Tue May 19 18:54:18 HKT 2026 +stageCount=17 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.15 +publishVersion=15.20.16 buildCount=0 -baseBetaVersion=15.20.16 +baseBetaVersion=15.20.17 From 45821b8daa5803a862e5f606348204f8b7b11f9b Mon Sep 17 00:00:00 2001 From: QingLong Date: Tue, 19 May 2026 21:00:01 +0800 Subject: [PATCH 28/32] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A8=A1=E5=9D=97APPBa?= =?UTF-8?q?se=20=E5=90=8C=E6=AD=A5=E6=9C=80=E6=96=B0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=A0=87=E7=AD=BEappbase-v15.20.17?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appbase/build.properties | 8 ++++---- .../java/cc/winboll/studio/appbase/AboutActivity.java | 2 +- libappbase/build.properties | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/appbase/build.properties b/appbase/build.properties index f0cb910..5cc2d78 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue May 19 18:54:18 HKT 2026 -stageCount=17 +#Tue May 19 20:49:13 HKT 2026 +stageCount=18 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.16 +publishVersion=15.20.17 buildCount=0 -baseBetaVersion=15.20.17 +baseBetaVersion=15.20.18 diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/AboutActivity.java b/appbase/src/main/java/cc/winboll/studio/appbase/AboutActivity.java index 060bded..d6a65eb 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/AboutActivity.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/AboutActivity.java @@ -37,7 +37,7 @@ public class AboutActivity extends Activity { appInfo.setAppName("APPBase"); appInfo.setAppIcon(R.drawable.ic_winboll); appInfo.setAppDescription(getString(R.string.app_description)); - appInfo.setAppGitName("WinBoLL"); + appInfo.setAppGitName("APPBase"); appInfo.setAppGitOwner("Studio"); appInfo.setAppGitAPPBranch(branchName); appInfo.setAppGitAPPSubProjectFolder(branchName); diff --git a/libappbase/build.properties b/libappbase/build.properties index f0cb910..5cc2d78 100644 --- a/libappbase/build.properties +++ b/libappbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue May 19 18:54:18 HKT 2026 -stageCount=17 +#Tue May 19 20:49:13 HKT 2026 +stageCount=18 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.16 +publishVersion=15.20.17 buildCount=0 -baseBetaVersion=15.20.17 +baseBetaVersion=15.20.18 From d6fab2133ff58f66c3b1b32a050d6bd080377217 Mon Sep 17 00:00:00 2001 From: QingLong Date: Tue, 19 May 2026 21:00:01 +0800 Subject: [PATCH 29/32] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A8=A1=E5=9D=97AES?= =?UTF-8?q?=20=E5=90=8C=E6=AD=A5=E6=9C=80=E6=96=B0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=A0=87=E7=AD=BEaes-v15.20.7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aes/build.gradle | 5 ++++- aes/build.properties | 8 ++++---- libaes/build.properties | 8 ++++---- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/aes/build.gradle b/aes/build.gradle index 8039c8c..fbc8d4a 100644 --- a/aes/build.gradle +++ b/aes/build.gradle @@ -26,7 +26,10 @@ android { applicationId "cc.winboll.studio.aes" minSdkVersion 26 targetSdkVersion 30 - versionCode 1 + //1. Android 官方规则 + //-  versionCode  类型:int 整型 + //- Java int 最大值:2147483647 + versionCode 1520000 // versionName 更新后需要手动设置 // 项目模块目录的 build.gradle 文件的 stageCount=0 // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" diff --git a/aes/build.properties b/aes/build.properties index b401b3c..42f9bd9 100644 --- a/aes/build.properties +++ b/aes/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue May 19 01:52:47 HKT 2026 -stageCount=7 +#Tue May 19 20:38:13 HKT 2026 +stageCount=8 libraryProject=libaes baseVersion=15.20 -publishVersion=15.20.6 +publishVersion=15.20.7 buildCount=0 -baseBetaVersion=15.20.7 +baseBetaVersion=15.20.8 diff --git a/libaes/build.properties b/libaes/build.properties index b401b3c..42f9bd9 100644 --- a/libaes/build.properties +++ b/libaes/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue May 19 01:52:47 HKT 2026 -stageCount=7 +#Tue May 19 20:38:13 HKT 2026 +stageCount=8 libraryProject=libaes baseVersion=15.20 -publishVersion=15.20.6 +publishVersion=15.20.7 buildCount=0 -baseBetaVersion=15.20.7 +baseBetaVersion=15.20.8 From 7d872fd14c25f020bd973b98744520540ad4403d Mon Sep 17 00:00:00 2001 From: QingLong Date: Wed, 20 May 2026 04:00:01 +0800 Subject: [PATCH 30/32] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A8=A1=E5=9D=97APPBa?= =?UTF-8?q?se=20=E5=90=8C=E6=AD=A5=E6=9C=80=E6=96=B0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=A0=87=E7=AD=BEappbase-v15.20.18?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appbase/build.properties | 8 +- .../java/cc/winboll/studio/appbase/App.java | 6 - .../studio/appbase/model/TestBean.java | 2 +- libappbase/build.properties | 8 +- .../winboll/studio/libappbase/APPModel.java | 1 + .../studio/libappbase/GlobalApplication.java | 11 +- .../studio/libappbase/LogActivity.java | 5 + .../winboll/studio/libappbase/LogUtils.java | 63 ++- .../studio/libappbase/LogUtilsBean.java | 1 + .../libappbase/LogUtilsClassTAGBean.java | 1 + .../studio/libappbase/LogViewThread.java | 51 ++- .../models/libs1520000/BaseBean.java | 415 ++++++++++++++++++ 12 files changed, 499 insertions(+), 73 deletions(-) create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/models/libs1520000/BaseBean.java diff --git a/appbase/build.properties b/appbase/build.properties index 5cc2d78..f4e7c81 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue May 19 20:49:13 HKT 2026 -stageCount=18 +#Wed May 20 03:13:41 HKT 2026 +stageCount=19 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.17 +publishVersion=15.20.18 buildCount=0 -baseBetaVersion=15.20.18 +baseBetaVersion=15.20.19 diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/App.java b/appbase/src/main/java/cc/winboll/studio/appbase/App.java index 9df2ed8..9a19876 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/App.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/App.java @@ -22,12 +22,6 @@ public class App extends GlobalApplication { @Override public void onCreate() { super.onCreate(); - // 如果应用不在调试状态,就根据编译类型设置调试状态 - if (isDebugging() != true) { - setIsDebugging(BuildConfig.DEBUG); - } - // release 版调试码 - //setIsDebugging(!BuildConfig.DEBUG); // 初始化 Toast 工具类(传入应用全局上下文,确保 Toast 可在任意地方调用) ToastUtils.init(getApplicationContext()); diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/model/TestBean.java b/appbase/src/main/java/cc/winboll/studio/appbase/model/TestBean.java index ee3e70a..cb91442 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/model/TestBean.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/model/TestBean.java @@ -2,8 +2,8 @@ package cc.winboll.studio.appbase.model; import android.util.JsonReader; import android.util.JsonWriter; -import cc.winboll.studio.libappbase.BaseBean; import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.models.libs1520000.BaseBean; import java.io.IOException; /** diff --git a/libappbase/build.properties b/libappbase/build.properties index 5cc2d78..f4e7c81 100644 --- a/libappbase/build.properties +++ b/libappbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue May 19 20:49:13 HKT 2026 -stageCount=18 +#Wed May 20 03:13:41 HKT 2026 +stageCount=19 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.17 +publishVersion=15.20.18 buildCount=0 -baseBetaVersion=15.20.18 +baseBetaVersion=15.20.19 diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/APPModel.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/APPModel.java index d4dc9ca..56c3c5c 100644 --- a/libappbase/src/main/java/cc/winboll/studio/libappbase/APPModel.java +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/APPModel.java @@ -2,6 +2,7 @@ package cc.winboll.studio.libappbase; import android.util.JsonReader; import android.util.JsonWriter; +import cc.winboll.studio.libappbase.models.libs1520000.BaseBean; import java.io.IOException; /** diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/GlobalApplication.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/GlobalApplication.java index 378ac59..e03ac72 100644 --- a/libappbase/src/main/java/cc/winboll/studio/libappbase/GlobalApplication.java +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/GlobalApplication.java @@ -129,11 +129,10 @@ public class GlobalApplication extends Application { // 初始化单例实例(确保在所有初始化操作前完成) sInstance = this; + restoreDebugStatus(); // 初始化基础组件(日志、崩溃处理、Toast) initCoreComponents(); - // 恢复/初始化调试模式状态(从本地文件读取,无文件则默认关闭调试) - restoreDebugStatus(); - // 新增:初始化服务器地址(从 SP 读取到内存,提高后续访问效率) + // 初始化服务器地址(从 SP 读取到内存,提高后续访问效率) initWinbollHost(); LogUtils.d(TAG, "GlobalApplication 初始化完成,单例实例已创建"); @@ -144,7 +143,11 @@ public class GlobalApplication extends Application { */ private void initCoreComponents() { // 初始化日志工具(传入 Application 上下文) - LogUtils.init(this); + + // 调试状态下初始化日志工具 + if (GlobalApplication.isDebugging()) { + LogUtils.init(this); + } // 初始化全局异常处理器(捕获应用崩溃信息,用于调试或上报) CrashHandler.init(this); // 初始化 Toast 工具(统一 Toast 样式、避免内存泄漏等) diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/LogActivity.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/LogActivity.java index 8c0e5af..1cc8f5c 100644 --- a/libappbase/src/main/java/cc/winboll/studio/libappbase/LogActivity.java +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/LogActivity.java @@ -27,6 +27,11 @@ public class LogActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if(!GlobalApplication.isDebugging()) { + ToastUtils.show("非调试状态日志功能不可用"); + finish(); + } + // 设置布局文件(包含 LogView 控件) setContentView(R.layout.activity_log); diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtils.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtils.java index a0e4f2a..e2124da 100644 --- a/libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtils.java +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtils.java @@ -67,45 +67,29 @@ public class LogUtils { // ====================== 初始化入口 ====================== public static void init(final Context context) { - init(context, LOG_LEVEL.Off); + init(context, LOG_LEVEL.Off); } public static void init(final Context context, final LOG_LEVEL logLevel) { - Log.d(TAG, "init 执行日志工具初始化"); - _mContext = context; + if (!GlobalApplication.isDebugging()) { + return; + } + Log.d(TAG, "init 执行日志工具初始化"); + _mContext = context; - if (GlobalApplication.isDebugging()) { - initDebugDir(); - } else { - initReleaseDir(); - } + initLogUtilsDir(); - initLogConfigBean(); - addClassTAGList(); - loadTAGBeanSettings(); - checkAndTrimLogFileSize(); + initLogConfigBean(); + addClassTAGList(); + loadTAGBeanSettings(); + checkAndTrimLogFileSize(); - _IsInited = true; - Log.d(TAG, "init 日志工具初始化完成"); + _IsInited = true; + Log.d(TAG, "init 执行日志工具初始化完成"); } // ====================== 目录初始化 ====================== - private static void initDebugDir() { - final Context appContext = _mContext.getApplicationContext(); - _mfLogCacheDir = new File(appContext.getExternalCacheDir(), TAG); - if (!_mfLogCacheDir.exists()) { - _mfLogCacheDir.mkdirs(); - } - _mfLogCatchFile = new File(_mfLogCacheDir, "log.txt"); - - _mfLogDataDir = appContext.getExternalFilesDir(TAG); - if (!_mfLogDataDir.exists()) { - _mfLogDataDir.mkdirs(); - } - _mfLogUtilsBeanFile = new File(_mfLogDataDir, TAG + ".json"); - } - - private static void initReleaseDir() { + private static void initLogUtilsDir() { final Context appContext = _mContext.getApplicationContext(); _mfLogCacheDir = new File(appContext.getCacheDir(), TAG); if (!_mfLogCacheDir.exists()) { @@ -113,7 +97,7 @@ public class LogUtils { } _mfLogCatchFile = new File(_mfLogCacheDir, "log.txt"); - _mfLogDataDir = new File(appContext.getFilesDir(), TAG); + _mfLogDataDir = appContext.getExternalFilesDir(TAG); if (!_mfLogDataDir.exists()) { _mfLogDataDir.mkdirs(); } @@ -136,7 +120,7 @@ public class LogUtils { } final long KEEP_FILE_SIZE = 25000L; // ~25KB 确保剪贴板可完整复制 - final long MAX_FILE_SIZE = 2*KEEP_FILE_SIZE; + final long MAX_FILE_SIZE = 2 * KEEP_FILE_SIZE; final long fileSize = _mfLogCatchFile.length(); if (fileSize <= MAX_FILE_SIZE) { @@ -266,6 +250,9 @@ public class LogUtils { } public static void setTAGListEnable(final String tag, final boolean isEnable) { + if (!_IsInited) { + return; + } final Iterator> iterator = mapTAGList.entrySet().iterator(); while (iterator.hasNext()) { final Map.Entry entry = iterator.next(); @@ -279,6 +266,9 @@ public class LogUtils { } public static void setALlTAGListEnable(final boolean isEnable) { + if (!_IsInited) { + return; + } for (final Map.Entry entry : mapTAGList.entrySet()) { entry.setValue(isEnable); } @@ -288,15 +278,22 @@ public class LogUtils { // ====================== 日志级别控制 ====================== public static void setLogLevel(final LOG_LEVEL logLevel) { + if (_mLogUtilsBean == null) { + Log.d(TAG, "setLogLevel LogUtils未初始化,忽略设置日志级别"); + return; + } _mLogUtilsBean.setLogLevel(logLevel); _mLogUtilsBean.saveBeanToFile(_mfLogUtilsBeanFile.getPath(), _mLogUtilsBean); } public static LOG_LEVEL getLogLevel() { - return _mLogUtilsBean.getLogLevel(); + return _mLogUtilsBean == null ?LOG_LEVEL.Off: _mLogUtilsBean.getLogLevel(); } private static boolean isLoggable(final String tag, final LOG_LEVEL logLevel) { + if (!GlobalApplication.isDebugging()) { + return false; + } if (!_IsInited) { return false; } diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtilsBean.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtilsBean.java index b8556b9..b237f41 100644 --- a/libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtilsBean.java +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtilsBean.java @@ -2,6 +2,7 @@ package cc.winboll.studio.libappbase; import android.util.JsonReader; import android.util.JsonWriter; +import cc.winboll.studio.libappbase.models.libs1520000.BaseBean; import java.io.IOException; /** diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtilsClassTAGBean.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtilsClassTAGBean.java index 83ce79e..6e91314 100644 --- a/libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtilsClassTAGBean.java +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/LogUtilsClassTAGBean.java @@ -2,6 +2,7 @@ package cc.winboll.studio.libappbase; import android.util.JsonReader; import android.util.JsonWriter; +import cc.winboll.studio.libappbase.models.libs1520000.BaseBean; import java.io.IOException; /** diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/LogViewThread.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/LogViewThread.java index 3941e45..2c4f805 100644 --- a/libappbase/src/main/java/cc/winboll/studio/libappbase/LogViewThread.java +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/LogViewThread.java @@ -1,6 +1,7 @@ package cc.winboll.studio.libappbase; import android.os.FileObserver; +import java.io.File; import java.lang.ref.WeakReference; /** @@ -51,30 +52,38 @@ public class LogViewThread extends Thread { */ @Override public void run() { - // 获取日志缓存目录路径(从 LogUtils 统一获取,确保路径一致性) - String logDirPath = LogUtils.getLogCacheDir().getPath(); - LogUtils.d(TAG, "启动日志文件监听,监听目录:" + logDirPath); + // 调试状态进行日志输出任务 + if (GlobalApplication.isDebugging()) { + // 获取日志缓存目录路径(从 LogUtils 统一获取,确保路径一致性) + File logDir = LogUtils.getLogCacheDir(); + if (logDir == null) { + LogUtils.d(TAG, "日志缓存目录未初始化,线程退出"); + return; + } + String logDirPath = logDir.getPath(); + LogUtils.d(TAG, "启动日志文件监听,监听目录:" + logDirPath); - // 初始化日志文件监听器(监听目标目录的文件事件) - mLogListener = new LogListener(logDirPath); - // 开始监听文件事件(非阻塞,内部通过 Native 层实现) - mLogListener.startWatching(); + // 初始化日志文件监听器(监听目标目录的文件事件) + mLogListener = new LogListener(logDirPath); + // 开始监听文件事件(非阻塞,内部通过 Native 层实现) + mLogListener.startWatching(); - // 循环等待退出标志(每 1 秒检查一次,降低 CPU 占用) - while (!isExit()) { - try { - Thread.sleep(1000); // 休眠 1 秒,避免忙等 - } catch (InterruptedException e) { - // 线程被中断时,恢复中断标志并退出循环(避免无限阻塞) - Thread.currentThread().interrupt(); - LogUtils.d(TAG, "日志监听线程被中断,准备退出。" + e); - break; - } - } + // 循环等待退出标志(每 1 秒检查一次,降低 CPU 占用) + while (!isExit()) { + try { + Thread.sleep(1000); // 休眠 1 秒,避免忙等 + } catch (InterruptedException e) { + // 线程被中断时,恢复中断标志并退出循环(避免无限阻塞) + Thread.currentThread().interrupt(); + LogUtils.d(TAG, "日志监听线程被中断,准备退出。" + e); + break; + } + } - // 收到退出标志,停止监听并释放资源 - mLogListener.stopWatching(); - LogUtils.d(TAG, "日志文件监听已停止,线程退出"); + // 收到退出标志,停止监听并释放资源 + mLogListener.stopWatching(); + LogUtils.d(TAG, "日志文件监听已停止,线程退出"); + } } /** diff --git a/libappbase/src/main/java/cc/winboll/studio/libappbase/models/libs1520000/BaseBean.java b/libappbase/src/main/java/cc/winboll/studio/libappbase/models/libs1520000/BaseBean.java new file mode 100644 index 0000000..af140aa --- /dev/null +++ b/libappbase/src/main/java/cc/winboll/studio/libappbase/models/libs1520000/BaseBean.java @@ -0,0 +1,415 @@ +package cc.winboll.studio.libappbase.models.libs1520000; + +import android.content.Context; +import android.util.JsonReader; +import android.util.JsonWriter; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.UTF8FileUtils; +import java.io.File; +import java.io.IOException; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.ArrayList; + +/** + * WinBoLL JSON 数据模型基类(抽象类) + * 定义 Json Bean 的核心规范:序列化/反序列化、文件持久化、列表处理等通用逻辑, + * 子类需实现抽象方法,完成自身字段JSON读写业务逻辑 + * @Author 豆包&ZhanGSKen + * @CreateTime 2026/05/19 22:33:00 + * @EditTime 2026/05/19 23:15:48 + * @param 泛型约束,限定子类必须继承自BaseBean + */ +public abstract class BaseBean { + + // ====================== 静态常量 ====================== + /** 日志输出标识TAG */ + public static final String TAG = "BaseBean"; + /** JSON存储Bean类名字段Key,用于类型校验 */ + static final String BEAN_NAME = "BeanName"; + + // ====================== 构造方法 ====================== + /** + * 无参空构造,满足反射实例化要求 + */ + public BaseBean() { + + } + + // ====================== 抽象方法 ====================== + /** + * 获取当前实体类全类名 + * @return 全限定类名字符串 + */ + public abstract String getName(); + + /** + * 从JSON读取器解析构建实体对象 + * @param jsonReader JSON读取流 + * @return 解析完成实体对象 + * @throws IOException IO读写异常 + */ + public abstract T readBeanFromJsonReader(final JsonReader jsonReader) throws IOException; + + // ====================== 路径获取相关 ====================== + /** + * 获取单个实体默认存储JSON文件路径 + * @param context 应用上下文 + * @return 文件绝对路径 + */ + public String getBeanJsonFilePath(final Context context) { + return context.getExternalFilesDir(TAG) + "/" + getName() + ".json"; + } + + /** + * 获取实体列表默认存储JSON文件路径 + * @param context 应用上下文 + * @return 文件绝对路径 + */ + public String getBeanListJsonFilePath(final Context context) { + return context.getExternalFilesDir(TAG) + "/" + getName() + "_List.json"; + } + + // ====================== JSON序列化基础方法 ====================== + /** + * 写入基础Bean标识字段至JSON + * @param jsonWriter JSON写入流 + * @throws IOException 写入异常 + */ + public void writeThisToJsonWriter(final JsonWriter jsonWriter) throws IOException { + jsonWriter.name(BEAN_NAME).value(getName()); + } + + /** + * 基类通用字段解析回调 + * @param jsonReader JSON读取流 + * @param name 字段名 + * @return 是否完成当前字段解析 + * @throws IOException 读取异常 + */ + public boolean initObjectsFromJsonReader(final JsonReader jsonReader, final String name) throws IOException { + return false; + } + + // ====================== 实体字符串序列化 ====================== + @Override + public String toString() { + LogUtils.d(TAG, "执行BaseBean实体转JSON字符串"); + final StringWriter stringWriter = new StringWriter(); + final JsonWriter jsonWriter = new JsonWriter(stringWriter); + jsonWriter.setIndent(" "); + try { + jsonWriter.beginObject(); + writeThisToJsonWriter(jsonWriter); + jsonWriter.endObject(); + return stringWriter.toString(); + } catch (final IOException e) { + LogUtils.d(TAG, "实体转JSON字符串异常", Thread.currentThread().getStackTrace()); + } + return ""; + } + + // ====================== 列表序列化工具 ====================== + /** + * Bean列表转为格式化JSON数组字符串 + * @param beanList 实体集合 + * @param 实体泛型 + * @return JSON字符串 + */ + public static String toStringByBeanList(final ArrayList beanList) { + LogUtils.d(TAG, "执行Bean列表序列化JSON操作"); + try { + final StringWriter stringWriter = new StringWriter(); + final JsonWriter jsonWriter = new JsonWriter(stringWriter); + jsonWriter.setIndent(" "); + jsonWriter.beginArray(); + for (int i = 0; i < beanList.size(); i++) { + jsonWriter.beginObject(); + beanList.get(i).writeThisToJsonWriter(jsonWriter); + jsonWriter.endObject(); + } + jsonWriter.endArray(); + jsonWriter.close(); + return stringWriter.toString(); + } catch (final IOException e) { + LogUtils.d(TAG, "列表序列化JSON异常", Thread.currentThread().getStackTrace()); + } + return ""; + } + + // ====================== JSON字符串解析实体 ====================== + /** + * JSON文本解析为单个实体对象 + * @param szBean JSON文本 + * @param clazz 实体Class字节码 + * @param 实体泛型 + * @return 解析完成实体 + * @throws IOException 解析IO异常 + */ + public static T parseStringToBean(final String szBean, final Class clazz) throws IOException { + LogUtils.d(TAG, "进入字符串解析实体方法,目标Class:" + clazz.getSimpleName()); + final StringReader stringReader = new StringReader(szBean); + final JsonReader jsonReader = new JsonReader(stringReader); + try { + final T beanTemp = clazz.newInstance(); + return (T) beanTemp.readBeanFromJsonReader(jsonReader); + } catch (final InstantiationException e) { + LogUtils.d(TAG, "实体反射实例化失败(InstantiationException)", Thread.currentThread().getStackTrace()); + } catch (final IllegalAccessException e) { + LogUtils.d(TAG, "实体反射权限访问失败(IllegalAccessException)", Thread.currentThread().getStackTrace()); + } + return null; + } + + /** + * JSON数组文本解析填充实体列表 + * @param szBeanList JSON数组文本 + * @param beanList 目标存储集合 + * @param clazz 实体字节码 + * @param 实体泛型 + * @return 解析结果 + */ + public static boolean parseStringToBeanList(final String szBeanList, ArrayList beanList, final Class clazz) { + LogUtils.d(TAG, "进入列表字符串解析方法"); + try { + if (beanList == null) { + beanList = new ArrayList(); + } else { + beanList.clear(); + } + final StringReader stringReader = new StringReader(szBeanList); + final JsonReader jsonReader = new JsonReader(stringReader); + jsonReader.beginArray(); + while (jsonReader.hasNext()) { + final T beanTemp = clazz.newInstance(); + final T bean = (T) beanTemp.readBeanFromJsonReader(jsonReader); + if (bean != null) { + beanList.add(bean); + } + } + jsonReader.endArray(); + return true; + } catch (final InstantiationException e) { + LogUtils.d(TAG, "列表解析反射实例化异常", Thread.currentThread().getStackTrace()); + } catch (final IllegalAccessException e) { + LogUtils.d(TAG, "列表解析反射权限异常", Thread.currentThread().getStackTrace()); + } catch (final IOException e) { + LogUtils.d(TAG, "列表解析JSON读写异常", Thread.currentThread().getStackTrace()); + } + return false; + } + + // ====================== 文件加载实体 ====================== + /** + * 从默认路径加载单个实体 + * @param context 上下文 + * @param clazz 实体字节码 + * @param 实体泛型 + * @return 加载实体 + */ + public static T loadBean(final Context context, final Class clazz) { + LogUtils.d(TAG, "执行默认路径加载实体数据"); + try { + final T beanTemp = clazz.newInstance(); + return loadBeanFromFile(beanTemp.getBeanJsonFilePath(context), clazz); + } catch (final InstantiationException e) { + LogUtils.d(TAG, "加载实体反射实例化失败", Thread.currentThread().getStackTrace()); + } catch (final IllegalAccessException e) { + LogUtils.d(TAG, "加载实体反射权限失败", Thread.currentThread().getStackTrace()); + } + return null; + } + + /** + * 自定义文件路径加载单个实体 + * @param szFilePath 文件路径 + * @param clazz 实体字节码 + * @param 实体泛型 + * @return 实体对象 + */ + public static T loadBeanFromFile(final String szFilePath, final Class clazz) { + LogUtils.d(TAG, "指定路径加载实体,路径:" + szFilePath); + try { + final File file = new File(szFilePath); + if (file.exists()) { + final T beanTemp = clazz.newInstance(); + final String json = UTF8FileUtils.readStringFromFile(szFilePath); + return beanTemp.parseStringToBean(json, clazz); + } + } catch (final InstantiationException e) { + LogUtils.d(TAG, "文件加载实体反射实例化异常", Thread.currentThread().getStackTrace()); + } catch (final IllegalAccessException e) { + LogUtils.d(TAG, "文件加载实体反射权限异常", Thread.currentThread().getStackTrace()); + } catch (final IOException e) { + LogUtils.d(TAG, "文件读取JSON数据异常", Thread.currentThread().getStackTrace()); + } + return null; + } + + /** + * 默认路径加载实体列表 + * @param context 上下文 + * @param beanListDst 目标集合 + * @param clazz 实体字节码 + * @param 实体泛型 + * @return 加载结果 + */ + public static boolean loadBeanList(final Context context, final ArrayList beanListDst, final Class clazz) { + LogUtils.d(TAG, "默认路径加载实体列表数据"); + try { + final T beanTemp = clazz.newInstance(); + return loadBeanListFromFile(beanTemp.getBeanListJsonFilePath(context), beanListDst, clazz); + } catch (final InstantiationException e) { + LogUtils.d(TAG, "列表加载反射实例化异常", Thread.currentThread().getStackTrace()); + } catch (final IllegalAccessException e) { + LogUtils.d(TAG, "列表加载反射权限异常", Thread.currentThread().getStackTrace()); + } + return false; + } + + /** + * 自定义路径加载实体列表 + * @param szFilePath 文件路径 + * @param beanList 目标集合 + * @param clazz 实体字节码 + * @param 实体泛型 + * @return 加载结果 + */ + public static boolean loadBeanListFromFile(final String szFilePath, final ArrayList beanList, final Class clazz) { + LogUtils.d(TAG, "指定路径加载实体列表,路径:" + szFilePath); + try { + final File file = new File(szFilePath); + if (file.exists()) { + final String listJson = UTF8FileUtils.readStringFromFile(szFilePath); + return parseStringToBeanList(listJson, beanList, clazz); + } + } catch (final IOException e) { + LogUtils.d(TAG, "列表文件读取异常", Thread.currentThread().getStackTrace()); + } + return false; + } + + // ====================== 实体数据保存文件 ====================== + /** + * 默认路径保存单个实体 + * @param context 上下文 + * @param bean 待保存实体 + * @param 实体泛型 + * @return 保存结果 + */ + public static boolean saveBean(final Context context, final T bean) { + return saveBeanToFile(bean.getBeanJsonFilePath(context), bean); + } + + /** + * 自定义路径保存单个实体 + * @param szFilePath 保存路径 + * @param bean 待保存实体 + * @param 实体泛型 + * @return 保存结果 + */ + public static boolean saveBeanToFile(final String szFilePath, final T bean) { + LogUtils.d(TAG, "执行实体数据写入文件操作"); + try { + final String json = bean.toString(); + UTF8FileUtils.writeStringToFile(szFilePath, json); + return true; + } catch (final IOException e) { + LogUtils.d(TAG, "实体写入文件异常", Thread.currentThread().getStackTrace()); + } + return false; + } + + /** + * 默认路径保存实体列表 + * @param context 上下文 + * @param beanList 实体集合 + * @param clazz 实体字节码 + * @param 实体泛型 + * @return 保存结果 + */ + public static boolean saveBeanList(final Context context, final ArrayList beanList, final Class clazz) { + LogUtils.d(TAG, "默认路径保存实体列表数据"); + try { + final T beanTemp = clazz.newInstance(); + return saveBeanListToFile(beanTemp.getBeanListJsonFilePath(context), beanList); + } catch (final InstantiationException e) { + LogUtils.d(TAG, "列表保存反射实例化异常", Thread.currentThread().getStackTrace()); + } catch (final IllegalAccessException e) { + LogUtils.d(TAG, "列表保存反射权限异常", Thread.currentThread().getStackTrace()); + } + return false; + } + + /** + * 自定义路径保存实体列表 + * @param szFilePath 保存路径 + * @param beanList 实体集合 + * @param 实体泛型 + * @return 保存结果 + */ + public static boolean saveBeanListToFile(final String szFilePath, final ArrayList beanList) { + LogUtils.d(TAG, "指定路径保存实体列表数据"); + try { + final String json = toStringByBeanList(beanList); + UTF8FileUtils.writeStringToFile(szFilePath, json); + return true; + } catch (final IOException e) { + LogUtils.d(TAG, "列表数据写入文件异常", Thread.currentThread().getStackTrace()); + } + return false; + } + + // ====================== Bean类型一致性校验 ====================== + /** + * 校验本地JSON列表内实体类型是否统一 + * @param szFilePath 列表文件路径 + * @param clazz 目标校验实体Class + * @param 实体泛型 + * @return 校验结果信息 + */ + public static String checkIsTheSameBeanListAndFile(final String szFilePath, final Class clazz) { + final StringBuilder sbResult = new StringBuilder(); + final String szErrorInfo = "Check Is The Same Bean List And File Error : "; + try { + int sameCount = 0; + int totalCount = 0; + final T beanTemp = clazz.newInstance(); + final String targetBeanName = beanTemp.getName(); + final String listJson = UTF8FileUtils.readStringFromFile(szFilePath); + final StringReader stringReader = new StringReader(listJson); + final JsonReader jsonReader = new JsonReader(stringReader); + jsonReader.beginArray(); + while (jsonReader.hasNext()) { + totalCount++; + jsonReader.beginObject(); + while (jsonReader.hasNext()) { + final String name = jsonReader.nextName(); + if (BEAN_NAME.equals(name)) { + if (targetBeanName.equals(jsonReader.nextString())) { + sameCount++; + } + } else { + jsonReader.skipValue(); + } + } + jsonReader.endObject(); + } + jsonReader.endArray(); + if (sameCount != totalCount) { + sbResult.append("Total : ").append(totalCount).append(" Diff : ").append(totalCount - sameCount); + } + } catch (final InstantiationException e) { + sbResult.append(szErrorInfo).append(e); + LogUtils.d(TAG, "类型校验反射实例化异常", Thread.currentThread().getStackTrace()); + } catch (final IllegalAccessException e) { + sbResult.append(szErrorInfo).append(e); + LogUtils.d(TAG, "类型校验反射权限异常", Thread.currentThread().getStackTrace()); + } catch (final IOException e) { + sbResult.append(szErrorInfo).append(e); + LogUtils.d(TAG, "类型校验文件读取解析异常", Thread.currentThread().getStackTrace()); + } + return sbResult.toString(); + } +} + From 28e6a8ee78cdb43e85a4f3c904062972e0b59854 Mon Sep 17 00:00:00 2001 From: QingLong Date: Wed, 20 May 2026 15:00:01 +0800 Subject: [PATCH 31/32] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A8=A1=E5=9D=97APPBa?= =?UTF-8?q?se=20=E5=90=8C=E6=AD=A5=E6=9C=80=E6=96=B0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=A0=87=E7=AD=BEappbase-v15.20.19?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appbase/README.md | 2 +- appbase/build.properties | 8 ++++---- libappbase/build.properties | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/appbase/README.md b/appbase/README.md index 97cdffc..1cc8792 100644 --- a/appbase/README.md +++ b/appbase/README.md @@ -20,7 +20,7 @@ WinBoLL 安卓手机端安卓应用开发基础类库。 1. Fork 本仓库 2. 新建 Feat_xxx 分支 -3. 提交代码 : ZhanGSKen(ZhanGSKen) +3. 提交代码 : ZhanGSKen(ZhanGSKen) 4. 新建 Pull Request diff --git a/appbase/build.properties b/appbase/build.properties index f4e7c81..abb5cb0 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Wed May 20 03:13:41 HKT 2026 -stageCount=19 +#Wed May 20 14:46:35 HKT 2026 +stageCount=20 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.18 +publishVersion=15.20.19 buildCount=0 -baseBetaVersion=15.20.19 +baseBetaVersion=15.20.20 diff --git a/libappbase/build.properties b/libappbase/build.properties index f4e7c81..abb5cb0 100644 --- a/libappbase/build.properties +++ b/libappbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Wed May 20 03:13:41 HKT 2026 -stageCount=19 +#Wed May 20 14:46:35 HKT 2026 +stageCount=20 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.18 +publishVersion=15.20.19 buildCount=0 -baseBetaVersion=15.20.19 +baseBetaVersion=15.20.20 From 8876896cbca6a066890af0d6eaf0361a8562a0d8 Mon Sep 17 00:00:00 2001 From: QingLong Date: Wed, 20 May 2026 17:00:01 +0800 Subject: [PATCH 32/32] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A8=A1=E5=9D=97APPBa?= =?UTF-8?q?se=20=E5=90=8C=E6=AD=A5=E6=9C=80=E6=96=B0=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=A0=87=E7=AD=BEappbase-v15.20.20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appbase/build.properties | 8 ++++---- libappbase/build.properties | 8 ++++---- libappbase/src/main/res/values/attrs.xml | 3 +++ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/appbase/build.properties b/appbase/build.properties index abb5cb0..0fab579 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Wed May 20 14:46:35 HKT 2026 -stageCount=20 +#Wed May 20 16:12:13 HKT 2026 +stageCount=21 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.19 +publishVersion=15.20.20 buildCount=0 -baseBetaVersion=15.20.20 +baseBetaVersion=15.20.21 diff --git a/libappbase/build.properties b/libappbase/build.properties index abb5cb0..0fab579 100644 --- a/libappbase/build.properties +++ b/libappbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Wed May 20 14:46:35 HKT 2026 -stageCount=20 +#Wed May 20 16:12:13 HKT 2026 +stageCount=21 libraryProject=libappbase baseVersion=15.20 -publishVersion=15.20.19 +publishVersion=15.20.20 buildCount=0 -baseBetaVersion=15.20.20 +baseBetaVersion=15.20.21 diff --git a/libappbase/src/main/res/values/attrs.xml b/libappbase/src/main/res/values/attrs.xml index b569d4f..7b7627f 100644 --- a/libappbase/src/main/res/values/attrs.xml +++ b/libappbase/src/main/res/values/attrs.xml @@ -60,4 +60,7 @@ + + + \ No newline at end of file