Class: Pindo::GradleHelper

Inherits:
Object
  • Object
show all
Defined in:
lib/pindo/module/android/gradle_helper.rb

Constant Summary collapse

GRADLE_CACHE_DIR =

Gradle缓存目录

File.expand_path("~/.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

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.fancyinfo_start("检查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.fancyinfo_error("未找到主工程的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.fancyinfo_error("无法获取主工程的Gradle #{main_gradle_version}")
        return false
      end

      # 配置主工程的 Gradle Wrapper
      unless setup_gradle_wrapper(paths[:main_gradle_dir], paths[:main_wrapper_properties])
        Funlog.fancyinfo_error("主工程Gradle Wrapper配置失败")
        return false
      end

      Funlog.fancyinfo_success("主工程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.fancyinfo_error("未找到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.fancyinfo_error("Unity模块Gradle Wrapper配置失败")
        return false
      end

      # 2. 检查主工程的 Gradle 配置文件是否存在
      unless File.exist?(paths[:main_wrapper_properties])
        Funlog.fancyinfo_error("未找到主工程的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.fancyinfo_success("Unity模块Gradle配置完成,准备编译SO库")
      true
    end
  else
    # Unity standalone 或原生 Android 工程:只配置一个 Gradle
    unless File.exist?(paths[:wrapper_properties])
      Funlog.fancyinfo_error("未找到gradle-wrapper.properties文件: #{paths[:wrapper_properties]}")
      return false
    end

    if setup_gradle_wrapper(paths[:gradle_dir], paths[:wrapper_properties])
      Funlog.fancyinfo_success("Gradle Wrapper配置成功")
      true
    else
      Funlog.fancyinfo_error("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 配置路径(统一管理三种工程结构的路径)

Parameters:

  • project_path (String)

    项目路径

Returns:

  • (Hash)

    包含各种路径信息和项目类型



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