Module: Pindo::GradleHelper

Includes:
BaseAndroidHelper
Included in:
AndroidBuildHelper
Defined in:
lib/pindo/module/android/gradle_helper.rb

Constant Summary collapse

'7.6.4'
MIN_GRADLE_WRAPPER_JAR_SIZE =

50KB

50_000
DOWNLOAD_TIMEOUT =

30秒

30

Instance Method Summary collapse

Methods included from BaseAndroidHelper

#build_jdk_path_from_unity_root, #check_and_replace_unity_jdk, #check_and_update_unity_jdk, #create_and_install_openjdk, #ensure_java_version_compliance, #extract_config_block_groovy, #extract_config_block_kts, #extract_keystore_fields_common, #extract_keystore_fields_groovy, #extract_keystore_fields_kts, #extract_signing_configs_groovy, #extract_signing_configs_kts, #extract_var_or_value, #find_android_subproject, #find_java11_installation, #find_java_command, #find_unity_editor_paths, #fix_store_file_path, #get_build_tools, #get_ext_values, #get_keystore_config, #get_keystore_config_groovy, #get_keystore_config_kts, #get_main_module, #install_adoptium_java_11, #install_java_11, #install_java_11_macos, #modify_il2cpp_config, #remove_desktop_google_service, #remove_groovy_comments, #remove_kts_comments, #replace_unity_jdk_with_java11, #resolve_var, #unity_android_project?, #verify_java_version

Instance Method Details

#check_gradle_files(project_path) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/pindo/module/android/gradle_helper.rb', line 15

def check_gradle_files(project_path)
  puts "\e[36m=== 检查Gradle Wrapper配置 ===\e[0m"
  
  # 优先使用基于gradle-wrapper.properties的自动配置
  if File.exist?(File.join(project_path, "gradle/wrapper/gradle-wrapper.properties"))
    puts "检测到gradle-wrapper.properties文件,使用自动配置..."
    if setup_gradle_wrapper_from_properties(project_path)
      puts "\e[32m✓ 基于gradle-wrapper.properties的自动配置成功\e[0m"
      return true
    else
      puts "\e[33m⚠ 自动配置失败,回退到传统方式\e[0m"
    end
  end

  # 回退到传统的文件复制方式
  puts "使用传统方式配置Gradle Wrapper..."
  setup_gradle_wrapper_traditional(project_path)
end

#setup_gradle_wrapper_from_properties(project_path) ⇒ Object

基于gradle-wrapper.properties自动配置gradle工具



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
# File 'lib/pindo/module/android/gradle_helper.rb', line 125

def setup_gradle_wrapper_from_properties(project_path)
  wrapper_properties_path = File.join(project_path, "gradle/wrapper/gradle-wrapper.properties")
  
  unless File.exist?(wrapper_properties_path)
    puts "\e[33m⚠ 未找到gradle-wrapper.properties文件: #{wrapper_properties_path}\e[0m"
    return false
  end

  # 解析gradle-wrapper.properties文件
  gradle_version = parse_gradle_version(wrapper_properties_path)
  if gradle_version.nil?
    puts "\e[31m✗ 无法解析gradle版本\e[0m"
    return false
  end

  puts "\e[36m=== 自动配置Gradle Wrapper ===\e[0m"
  puts "检测到Gradle版本: #{gradle_version}"

  # 确保gradle wrapper目录存在
  wrapper_dir = File.join(project_path, "gradle/wrapper")
  FileUtils.mkdir_p(wrapper_dir)

  # 下载并配置gradle-wrapper.jar
  unless download_gradle_wrapper_jar(wrapper_dir, gradle_version)
    puts "\e[31m✗ 下载gradle-wrapper.jar失败\e[0m"
    return false
  end

  # 生成gradlew脚本
  unless generate_gradlew_script(project_path)
    puts "\e[31m✗ 生成gradlew脚本失败\e[0m"
    return false
  end

  puts "\e[32m✓ Gradle Wrapper配置完成\e[0m"
  true
end

#setup_gradle_wrapper_traditional(project_path) ⇒ Object

传统的gradle wrapper配置方式(作为回退方案)



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/pindo/module/android/gradle_helper.rb', line 35

def setup_gradle_wrapper_traditional(project_path)
  # 检查是否存在 gradlew 文件 如果没有则执行复制操作
  gradlew_path = File.join(project_path, "gradlew")
  if File.exist?(gradlew_path)
    puts "gradlew file already exists, skip copying."
  else
     # 复制gradle相关文件
    gradlew_content = File.read(get_build_tools[:gradlew])
    File.write(gradlew_path, gradlew_content)
  end
  # 设置gradlew可执行权限
  system("chmod", "777", gradlew_path)

  wrapper_jar_path = File.join(project_path, "gradle/wrapper/gradle-wrapper.jar")
  if File.exist?(wrapper_jar_path)
    puts "gradle-wrapper.jar file already exists, skip copying."
  else
    FileUtils.mkdir_p(File.dirname(wrapper_jar_path))
    gradle_wrapper_content = File.read(get_build_tools[:gradle_wrapper])
    File.write(wrapper_jar_path, gradle_wrapper_content)
  end
end

#update_build_gradle(project_path) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/pindo/module/android/gradle_helper.rb', line 58

def update_build_gradle(project_path)
  # 更新build.gradle 或 build.gradle.kts
  build_gradle_path = File.join(project_path, "build.gradle")
  build_gradle_kts_path = File.join(project_path, "build.gradle.kts")
  
  # 优先使用 build.gradle.kts,如果不存在则使用 build.gradle
  if File.exist?(build_gradle_kts_path)
    build_gradle_path = build_gradle_kts_path
  elsif !File.exist?(build_gradle_path)
    return
  end
  
  content = File.read(build_gradle_path)
  content.gsub!("classpath 'com.android.tools.build:gradle:4.0.1'",
                "classpath 'com.android.tools.build:gradle:4.2.2'")
  File.write(build_gradle_path, content)
end

#update_gradle_version(project_path) ⇒ Object



76
77
78
79
80
81
82
83
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
# File 'lib/pindo/module/android/gradle_helper.rb', line 76

def update_gradle_version(project_path)
  # 智能更新gradle wrapper版本
  wrapper_path = File.join(project_path, "gradle/wrapper/gradle-wrapper.properties")
  
  unless File.exist?(wrapper_path)
    puts "\e[33m⚠ 未找到gradle-wrapper.properties文件,跳过版本更新\e[0m"
    return false
  end

  content = File.read(wrapper_path)
  original_content = content.dup
  
  # 解析当前版本
  current_version = parse_gradle_version(wrapper_path)
  if current_version.nil?
    puts "\e[33m⚠ 无法解析当前Gradle版本\e[0m"
    return false
  end

  puts "当前Gradle版本: #{current_version}"
  
  # 根据当前版本智能选择目标版本
  target_version = determine_target_gradle_version(current_version)
  
  if target_version == current_version
    puts "\e[32m✓ Gradle版本已是最新,无需更新\e[0m"
    return true
  end

  puts "更新Gradle版本: #{current_version} -> #{target_version}"
  
  # 更新版本
  content.gsub!("gradle-#{current_version}-bin.zip", "gradle-#{target_version}-bin.zip")
  content.gsub!("gradleVersion=#{current_version}", "gradleVersion=#{target_version}")
  
  if content != original_content
    File.write(wrapper_path, content)
    puts "\e[32m✓ Gradle版本更新完成\e[0m"
    
    # 重新配置gradle wrapper
    setup_gradle_wrapper_from_properties(project_path)
    return true
  else
    puts "\e[33m⚠ Gradle版本更新失败,未找到匹配的版本字符串\e[0m"
    return false
  end
end

#verify_gradle_wrapper_setup(project_path) ⇒ Object

检查gradle wrapper配置是否完整



164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/pindo/module/android/gradle_helper.rb', line 164

def verify_gradle_wrapper_setup(project_path)
  wrapper_dir = File.join(project_path, "gradle/wrapper")
  wrapper_jar_path = File.join(wrapper_dir, "gradle-wrapper.jar")
  gradlew_path = File.join(project_path, "gradlew")
  properties_path = File.join(wrapper_dir, "gradle-wrapper.properties")

  all_exist = File.exist?(wrapper_jar_path) && 
              File.exist?(gradlew_path) && 
              File.exist?(properties_path)

  if all_exist
    puts "\e[32m✓ Gradle Wrapper配置完整\e[0m"
    return true
  else
    puts "\e[33m⚠ Gradle Wrapper配置不完整:\e[0m"
    puts "  gradle-wrapper.jar: #{File.exist?(wrapper_jar_path) ? '' : ''}"
    puts "  gradlew: #{File.exist?(gradlew_path) ? '' : ''}"
    puts "  gradle-wrapper.properties: #{File.exist?(properties_path) ? '' : ''}"
    return false
  end
end