Class: Pindo::AndroidBuildConfigHelper

Inherits:
Object
  • Object
show all
Includes:
BaseAndroidHelper
Defined in:
lib/pindo/module/android/android_build_config_helper.rb

Class 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

Class Method Details

.add_test_scheme(project_dir: nil, scheme_name: nil) ⇒ Boolean

添加测试scheme到Android工程

Parameters:

  • project_dir (String) (defaults to: nil)

    Android项目目录路径

  • scheme_name (String) (defaults to: nil)

    要添加的scheme名称

Returns:

  • (Boolean)

    是否成功添加



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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/pindo/module/android/android_build_config_helper.rb', line 141

def self.add_test_scheme(project_dir: nil, scheme_name: nil)
    # 参数验证
    if scheme_name.nil?
        Funlog.instance.fancyinfo_error("需要提供scheme名称")
        return false
    end

    if project_dir.nil? || !File.directory?(project_dir)
        Funlog.instance.fancyinfo_error("项目路径无效: #{project_dir}")
        return false
    end

    scheme_name = scheme_name.to_s.gsub(/[^a-zA-Z0-9]/, '').downcase
    puts "正在为Android项目添加自定义scheme: #{scheme_name}"

    # 创建helper实例以使用基类方法
    helper = self.new

    # 查找所有可能的模块
    main_module = helper.get_main_module(project_dir)
    search_modules = ["app", "unityLibrary"]
    search_modules << main_module if main_module
    search_modules = search_modules.compact.uniq

    puts "搜索的模块: #{search_modules.join(', ')}"

    # 查找所有可能的AndroidManifest.xml文件
    manifest_candidates = find_manifests(project_dir, search_modules)

    if manifest_candidates.empty?
        Funlog.instance.fancyinfo_error("未找到任何AndroidManifest.xml文件")
        return false
    end

    puts "找到#{manifest_candidates.size}个AndroidManifest.xml文件"

    # 寻找最佳的AndroidManifest.xml和Activity
    manifest_path, main_activity, android_prefix = find_best_activity(manifest_candidates)

    if manifest_path.nil? || main_activity.nil?
        Funlog.instance.fancyinfo_error("无法找到合适的Activity")
        return false
    end

    puts "已选择 #{manifest_path} 文件中的 #{main_activity['android:name'] || '主Activity'}"

    # 检查scheme是否已存在
    scheme_exists, existing_scheme = check_scheme_exists(main_activity, android_prefix, scheme_name)

    # 如果scheme已存在,检查是否需要更新格式
    if scheme_exists
        activity_name = main_activity["#{android_prefix}:name"] || "主Activity"
        if existing_scheme != scheme_name
            # 格式不同,需要更新
            if update_existing_scheme(manifest_path, main_activity, android_prefix, existing_scheme, scheme_name)
                Funlog.instance.fancyinfo_update("已将scheme从'#{existing_scheme}'更新为'#{scheme_name}'")
            else
                Funlog.instance.fancyinfo_update("scheme已存在: #{existing_scheme}")
            end
        else
            puts "  ✓ scheme已存在: #{scheme_name}"
        end
        return true
    end

    # 尝试使用DOM添加
    success = add_scheme_with_dom(manifest_path, main_activity, android_prefix, scheme_name)

    unless success
        # DOM方法失败,尝试文本替换
        success = add_scheme_with_text_replace(manifest_path, scheme_name)
    end

    if success
        puts "  ✓ 成功添加scheme: #{scheme_name}"
    else
        Funlog.instance.fancyinfo_error("无法添加scheme: #{scheme_name}")
    end

    return success
end

.update_android_project_version(project_dir: nil, version_name: nil, version_code: nil) ⇒ Boolean

更新Android工程版本号

Parameters:

  • project_dir (String) (defaults to: nil)

    Android项目目录路径

  • version_name (String) (defaults to: nil)

    版本名

  • version_code (Integer) (defaults to: nil)

    版本号

Returns:

  • (Boolean)

    是否成功更新

Raises:

  • (ArgumentError)


15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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
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
123
124
125
# File 'lib/pindo/module/android/android_build_config_helper.rb', line 15

def self.update_android_project_version(project_dir: nil, version_name: nil, version_code: nil)
    raise ArgumentError, "项目目录不能为空" if project_dir.nil?
    raise ArgumentError, "版本名不能为空" if version_name.nil?
    raise ArgumentError, "版本号不能为空" if version_code.nil?

    # 验证version_code的有效性
    unless valid_build_number?(version_code)
        Funlog.instance.fancyinfo_error("Android versionCode必须在1到#{2**31-1}之间,当前值:#{version_code}")
        return false
    end

    Funlog.instance.fancyinfo_start("正在更新Android工程版本信息...")

    begin
        # 创建helper实例以使用基类方法
        helper = self.new

        # 获取主模块路径
        main_module = helper.get_main_module(project_dir)

        if main_module.nil?
            # 如果无法获取主模块,尝试常见的模块名
            ["app", "application", "main"].each do |module_name|
                module_path = File.join(project_dir, module_name)
                if File.exist?(File.join(module_path, "build.gradle")) ||
                   File.exist?(File.join(module_path, "build.gradle.kts"))
                    main_module = module_path
                    break
                end
            end
        end

        if main_module.nil?
            Funlog.instance.fancyinfo_error("未找到Android主模块")
            return false
        end

        # 查找build.gradle或build.gradle.kts文件
        gradle_file = nil
        if File.exist?(File.join(main_module, "build.gradle"))
            gradle_file = File.join(main_module, "build.gradle")
        elsif File.exist?(File.join(main_module, "build.gradle.kts"))
            gradle_file = File.join(main_module, "build.gradle.kts")
        end

        if gradle_file.nil?
            Funlog.instance.fancyinfo_error("未找到build.gradle文件")
            return false
        end

        # 读取并更新gradle文件
        content = File.read(gradle_file)
        original_content = content.dup

        # 更新versionCode
        if content =~ /versionCode\s+\d+/
            content.gsub!(/versionCode\s+\d+/, "versionCode #{version_code}")
        elsif content =~ /versionCode\s*=\s*\d+/
            content.gsub!(/versionCode\s*=\s*\d+/, "versionCode = #{version_code}")
        end

        # 更新versionName
        if content =~ /versionName\s+["'][^"']*["']/
            content.gsub!(/versionName\s+["'][^"']*["']/, "versionName \"#{version_name}\"")
        elsif content =~ /versionName\s*=\s*["'][^"']*["']/
            content.gsub!(/versionName\s*=\s*["'][^"']*["']/, "versionName = \"#{version_name}\"")
        end

        # 如果内容有变化,写回文件
        if content != original_content
            File.write(gradle_file, content)
            Funlog.instance.fancyinfo_success("Android版本更新完成!")
            puts "  ✓ versionName已更新: #{version_name}"
            puts "  ✓ versionCode已更新: #{version_code}"
            puts "  ✓ 更新的文件: #{gradle_file}"
            return true
        else
            # 如果没有找到版本字段,尝试在defaultConfig块中添加
            if content =~ /defaultConfig\s*\{([^}]*)\}/m
                default_config = $1
                if !default_config.include?("versionCode") || !default_config.include?("versionName")
                    Funlog.instance.fancyinfo_update("gradle文件中未找到版本字段,尝试添加...")

                    # 在defaultConfig块中添加版本信息
                    new_default_config = default_config
                    unless default_config.include?("versionCode")
                        new_default_config += "\n        versionCode #{version_code}"
                    end
                    unless default_config.include?("versionName")
                        new_default_config += "\n        versionName \"#{version_name}\""
                    end

                    content.gsub!(/defaultConfig\s*\{[^}]*\}/m, "defaultConfig {#{new_default_config}\n    }")
                    File.write(gradle_file, content)

                    Funlog.instance.fancyinfo_success("Android版本更新完成!")
                    puts "  ✓ versionName已添加: #{version_name}"
                    puts "  ✓ versionCode已添加: #{version_code}"
                    return true
                end
            end

            Funlog.instance.fancyinfo_error("无法在gradle文件中找到或添加版本信息")
            return false
        end

    rescue StandardError => e
        Funlog.instance.fancyinfo_error("更新Android版本失败: #{e.message}")
        return false
    end
end

.valid_build_number?(build_number) ⇒ Boolean

验证Build号是否在有效范围内

Parameters:

  • build_number (Integer)

    Build号

Returns:

  • (Boolean)

    是否有效



130
131
132
133
134
135
# File 'lib/pindo/module/android/android_build_config_helper.rb', line 130

def self.valid_build_number?(build_number)
    return false if build_number.nil?

    # Android versionCode的有效范围是1到2^31-1
    build_number >= 1 && build_number <= 2**31 - 1
end