Class: Pindo::GradleHelper
- Inherits:
-
Object
- Object
- Pindo::GradleHelper
- Defined in:
- lib/pindo/module/android/gradle_helper.rb
Constant Summary collapse
- GRADLE_CACHE_DIR =
Gradle缓存目录
File.("~/.pindo/android_tools/gradle-cache")
- GRADLE_PLUGIN_VERSION_MAP =
Gradle 插件版本映射表(AGP版本映射)仅升级旧版本到 4.2.2,不降级新版本
{ # 旧版本升级到 4.2.2 '3.4.0' => '4.2.2', '3.4.1' => '4.2.2', '3.5.0' => '4.2.2', '3.5.1' => '4.2.2', '3.6.0' => '4.2.2', '3.6.1' => '4.2.2', '4.0.0' => '4.2.2', '4.0.1' => '4.2.2', '4.1.0' => '4.2.2', '4.2.0' => '4.2.2', '4.2.1' => '4.2.2', '4.2.2' => '4.2.2' # 保持当前版本 }
Class Method Summary collapse
-
.check_gradle_with_project(project_path, configure_main: false) ⇒ Object
核心功能 ===================.
-
.extract_gradle_version(properties_path) ⇒ Object
提取 gradle 版本(parse_gradle_version 的别名).
-
.get_gradle_paths(project_path) ⇒ Hash
获取项目的 Gradle 配置路径(统一管理三种工程结构的路径).
-
.parse_gradle_version(properties_path) ⇒ Object
解析gradle版本.
-
.setup_gradle_wrapper(gradle_dir, wrapper_properties_path) ⇒ Object
设置 Gradle Wrapper(简化后的核心函数).
-
.setup_gradle_wrapper_with_version(gradle_dir, wrapper_properties_path, gradle_version) ⇒ Object
使用指定版本设置 Gradle Wrapper.
- .update_build_gradle(project_path) ⇒ Object
Class Method Details
.check_gradle_with_project(project_path, configure_main: false) ⇒ Object
核心功能 ===================
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
# File 'lib/pindo/module/android/gradle_helper.rb', line 84 def check_gradle_with_project(project_path, configure_main: false) Funlog.("检查Gradle Wrapper配置") # 使用统一的路径获取方法 paths = get_gradle_paths(project_path) if paths[:type] == :unity_as_lib if configure_main # 配置主工程的 Gradle(在 SO 编译完成后调用) Funlog.info("配置主工程的Gradle Wrapper用于编译APK...") unless File.exist?(paths[:main_wrapper_properties]) Funlog.("未找到主工程的gradle-wrapper.properties: #{paths[:main_wrapper_properties]}") return false end main_gradle_version = extract_gradle_version(paths[:main_wrapper_properties]) Funlog.info("主工程Gradle版本: #{main_gradle_version}") # 确保主工程的 Gradle 缓存存在 unless ensure_gradle_available(main_gradle_version) Funlog.("无法获取主工程的Gradle #{main_gradle_version}") return false end # 配置主工程的 Gradle Wrapper unless setup_gradle_wrapper(paths[:main_gradle_dir], paths[:main_wrapper_properties]) Funlog.("主工程Gradle Wrapper配置失败") return false end Funlog.("主工程Gradle配置完成,准备编译APK") true else # 配置 Unity 模块的 Gradle(默认行为,在 SO 编译前调用) Funlog.info("检测到 Unity as lib 工程,配置Unity模块的Gradle") # 1. 配置 Unity 模块的 Gradle(7.5.1 + Java 11,用于编译SO库) unless File.exist?(paths[:unity_wrapper_properties]) Funlog.("未找到Unity模块的gradle-wrapper.properties: #{paths[:unity_wrapper_properties]}") return false end unity_gradle_version = extract_gradle_version(paths[:unity_wrapper_properties]) Funlog.info("配置Unity模块的Gradle Wrapper (版本: #{unity_gradle_version})...") unless setup_gradle_wrapper(paths[:unity_gradle_dir], paths[:unity_wrapper_properties]) Funlog.("Unity模块Gradle Wrapper配置失败") return false end # 2. 检查主工程的 Gradle 配置文件是否存在 unless File.exist?(paths[:main_wrapper_properties]) Funlog.("未找到主工程的gradle-wrapper.properties: #{paths[:main_wrapper_properties]}") return false end main_gradle_version = extract_gradle_version(paths[:main_wrapper_properties]) Funlog.info("主工程Gradle配置 (版本: #{main_gradle_version}),待SO编译完成后配置") # 确保主工程的 Gradle 缓存存在 unless ensure_gradle_available(main_gradle_version) Funlog.info("下载主工程所需的Gradle #{main_gradle_version}...") end Funlog.info("Unity模块: Gradle #{unity_gradle_version} + Java 11 (编译SO库)") Funlog.info("主工程: Gradle #{main_gradle_version} + Java 17 (编译APK)") Funlog.("Unity模块Gradle配置完成,准备编译SO库") true end else # Unity standalone 或原生 Android 工程:只配置一个 Gradle unless File.exist?(paths[:wrapper_properties]) Funlog.("未找到gradle-wrapper.properties文件: #{paths[:wrapper_properties]}") return false end if setup_gradle_wrapper(paths[:gradle_dir], paths[:wrapper_properties]) Funlog.("Gradle Wrapper配置成功") true else Funlog.("Gradle Wrapper配置失败") false end end end |
.extract_gradle_version(properties_path) ⇒ Object
提取 gradle 版本(parse_gradle_version 的别名)
229 230 231 |
# File 'lib/pindo/module/android/gradle_helper.rb', line 229 def extract_gradle_version(properties_path) parse_gradle_version(properties_path) end |
.get_gradle_paths(project_path) ⇒ Hash
获取项目的 Gradle 配置路径(统一管理三种工程结构的路径)
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/pindo/module/android/gradle_helper.rb', line 37 def get_gradle_paths(project_path) paths = {} if Pindo::AndroidProjectHelper.unity_android_project?(project_path) # Unity 独立工程 paths[:type] = :unity_standalone paths[:gradle_dir] = project_path paths[:wrapper_properties] = File.join(project_path, "gradle/wrapper/gradle-wrapper.properties") paths[:build_gradle] = File.join(project_path, "build.gradle") paths[:build_gradle_kts] = File.join(project_path, "build.gradle.kts") elsif Pindo::AndroidProjectHelper.unity_as_lib_android_project?(project_path) # Unity 作为 lib 的原生工程 - 需要处理两套配置 paths[:type] = :unity_as_lib # Unity 模块的路径 paths[:unity_gradle_dir] = File.join(project_path, "Unity") paths[:unity_wrapper_properties] = File.join(project_path, "Unity/gradle/wrapper/gradle-wrapper.properties") paths[:unity_build_gradle] = File.join(project_path, "Unity/build.gradle") paths[:unity_build_gradle_kts] = File.join(project_path, "Unity/build.gradle.kts") # 主工程的路径 paths[:main_gradle_dir] = project_path paths[:main_wrapper_properties] = File.join(project_path, "gradle/wrapper/gradle-wrapper.properties") paths[:main_build_gradle] = File.join(project_path, "build.gradle") paths[:main_build_gradle_kts] = File.join(project_path, "build.gradle.kts") # 保留原有路径以兼容其他代码 paths[:gradle_dir] = paths[:unity_gradle_dir] paths[:wrapper_properties] = paths[:unity_wrapper_properties] paths[:build_gradle] = paths[:unity_build_gradle] paths[:build_gradle_kts] = paths[:unity_build_gradle_kts] else # Android 原生工程 paths[:type] = :native_android paths[:gradle_dir] = project_path paths[:wrapper_properties] = File.join(project_path, "gradle/wrapper/gradle-wrapper.properties") paths[:build_gradle] = File.join(project_path, "build.gradle") paths[:build_gradle_kts] = File.join(project_path, "build.gradle.kts") end paths end |
.parse_gradle_version(properties_path) ⇒ Object
解析gradle版本
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
# File 'lib/pindo/module/android/gradle_helper.rb', line 212 def parse_gradle_version(properties_path) content = File.read(properties_path) # 匹配distributionUrl中的gradle版本 if content =~ /distributionUrl=.*gradle-(\d+\.\d+(?:\.\d+)?(?:-.*)?)-bin\.zip/ return $1 end # 匹配gradleVersion属性 if content =~ /gradleVersion=(\d+\.\d+(?:\.\d+)?(?:-.*)?)/ return $1 end nil end |
.setup_gradle_wrapper(gradle_dir, wrapper_properties_path) ⇒ Object
设置 Gradle Wrapper(简化后的核心函数)
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 |
# File 'lib/pindo/module/android/gradle_helper.rb', line 193 def setup_gradle_wrapper(gradle_dir, wrapper_properties_path) # 解析gradle版本 gradle_version = parse_gradle_version(wrapper_properties_path) if gradle_version.nil? Funlog.error("无法解析gradle版本") return false end # 下载并设置 Gradle unless ensure_gradle_available(gradle_version) Funlog.error("无法获取 Gradle #{gradle_version}") return false end # 生成 Wrapper generate_gradle_wrapper(gradle_dir, gradle_version) end |
.setup_gradle_wrapper_with_version(gradle_dir, wrapper_properties_path, gradle_version) ⇒ Object
使用指定版本设置 Gradle Wrapper
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 |
# File 'lib/pindo/module/android/gradle_helper.rb', line 234 def setup_gradle_wrapper_with_version(gradle_dir, wrapper_properties_path, gradle_version) if gradle_version.nil? Funlog.error("Gradle版本不能为空") return false end # 下载并设置 Gradle unless ensure_gradle_available(gradle_version) Funlog.error("无法获取 Gradle #{gradle_version}") return false end # 生成 Wrapper generate_gradle_wrapper(gradle_dir, gradle_version) end |
.update_build_gradle(project_path) ⇒ Object
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
# File 'lib/pindo/module/android/gradle_helper.rb', line 171 def update_build_gradle(project_path) paths = get_gradle_paths(project_path) if paths[:type] == :unity_as_lib # Unity as lib 工程:只更新 Unity 模块的 build.gradle # 主工程的 AGP 保持原版本(如 8.8.0),因为它使用独立的 Gradle 8.10.2 Funlog.info("检测到 Unity as lib 工程,仅更新Unity模块的AGP版本") # 更新 Unity 模块的 build.gradle(根据映射表更新旧版本) if paths[:unity_build_gradle] || paths[:unity_build_gradle_kts] Funlog.info("更新Unity模块的build.gradle...") update_single_build_gradle(paths[:unity_build_gradle], paths[:unity_build_gradle_kts]) end Funlog.info("Unity模块的AGP版本更新完成(主工程保持原版本)") else # Unity standalone 或原生 Android 工程:只更新一个 build.gradle update_single_build_gradle(paths[:build_gradle], paths[:build_gradle_kts]) end end |