pindo 5.12.2 → 5.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pindo/base/git_handler.rb +692 -0
  3. data/lib/pindo/command/android/autobuild.rb +2 -2
  4. data/lib/pindo/command/android.rb +0 -1
  5. data/lib/pindo/command/appstore/adhocbuild.rb +258 -311
  6. data/lib/pindo/command/appstore/autobuild.rb +203 -0
  7. data/lib/pindo/command/appstore/autoresign.rb +35 -17
  8. data/lib/pindo/command/appstore/bundleid.rb +120 -0
  9. data/lib/pindo/command/appstore/cert.rb +212 -0
  10. data/lib/pindo/command/appstore/configproj.rb +81 -0
  11. data/lib/pindo/command/{deploy → appstore}/getitcinfo.rb +76 -91
  12. data/lib/pindo/command/appstore/iap.rb +788 -24
  13. data/lib/pindo/command/appstore/initconfig.rb +105 -0
  14. data/lib/pindo/command/appstore/itcapp.rb +95 -13
  15. data/lib/pindo/command/{deploy → appstore}/itcinfo.rb +90 -118
  16. data/lib/pindo/command/appstore/pem.rb +136 -0
  17. data/lib/pindo/command/appstore/pullconfig.rb +99 -0
  18. data/lib/pindo/command/appstore/quswark.rb +87 -0
  19. data/lib/pindo/command/appstore/quswauth.rb +67 -0
  20. data/lib/pindo/command/appstore/tag.rb +77 -0
  21. data/lib/pindo/command/appstore.rb +13 -1
  22. data/lib/pindo/command/env/quarkenv.rb +11 -13
  23. data/lib/pindo/command/env/swarkenv.rb +11 -16
  24. data/lib/pindo/command/ios/autobuild.rb +64 -43
  25. data/lib/pindo/command/ios/autoresign.rb +34 -19
  26. data/lib/pindo/command/ios/build.rb +10 -7
  27. data/lib/pindo/command/ios/cert.rb +27 -20
  28. data/lib/pindo/command/jps/upload.rb +3 -3
  29. data/lib/pindo/command/unity/autobuild.rb +2 -2
  30. data/lib/pindo/command/utils/clearcert.rb +2 -17
  31. data/lib/pindo/command/{deploy → utils}/fabric.rb +13 -13
  32. data/lib/pindo/command/utils/renewcert.rb +62 -38
  33. data/lib/pindo/command/utils/renewproj.rb +0 -3
  34. data/lib/pindo/command/{deploy → utils}/updateconfig.rb +6 -7
  35. data/lib/pindo/command/utils.rb +2 -0
  36. data/lib/pindo/command/web/autobuild.rb +2 -2
  37. data/lib/pindo/command.rb +30 -3
  38. data/lib/pindo/config/build_info_manager.rb +176 -0
  39. data/lib/pindo/config/ios_config_parser.rb +404 -0
  40. data/lib/pindo/module/android/android_build_helper.rb +110 -0
  41. data/lib/pindo/module/android/android_config_helper.rb +9 -5
  42. data/lib/pindo/module/android/gradle_helper.rb +88 -0
  43. data/lib/pindo/module/appstore/bundleid_helper.rb +349 -0
  44. data/lib/pindo/module/appstore/itcapp_helper.rb +228 -0
  45. data/lib/pindo/module/build/build_helper.rb +12 -0
  46. data/lib/pindo/module/build/swark_helper.rb +116 -77
  47. data/lib/pindo/module/cert/cert_helper.rb +74 -0
  48. data/lib/pindo/module/cert/pem_helper.rb +72 -0
  49. data/lib/pindo/module/cert/{xcodecerthelper.rb → xcode_cert_helper.rb} +208 -6
  50. data/lib/pindo/module/task/model/appstore/appstore_task.rb +18 -0
  51. data/lib/pindo/module/task/model/appstore/appstore_upload_ipa_task.rb +151 -0
  52. data/lib/pindo/module/task/model/appstore/appstore_upload_metadata_task.rb +250 -0
  53. data/lib/pindo/module/task/model/appstore/appstore_upload_screenshot_task.rb +276 -0
  54. data/lib/pindo/module/task/model/build/android_build_adhoc_task.rb +210 -0
  55. data/lib/pindo/module/task/model/build/{android_dev_build_task.rb → android_build_dev_task.rb} +2 -2
  56. data/lib/pindo/module/task/model/build/android_build_gplay_task.rb +210 -0
  57. data/lib/pindo/module/task/model/build/android_build_task.rb +13 -0
  58. data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +197 -0
  59. data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +367 -0
  60. data/lib/pindo/module/task/model/build/{ios_dev_build_task.rb → ios_build_dev_task.rb} +37 -27
  61. data/lib/pindo/module/task/model/build/ios_build_task.rb +13 -0
  62. data/lib/pindo/module/task/model/build/{web_dev_build_task.rb → web_build_dev_task.rb} +1 -1
  63. data/lib/pindo/module/task/model/build_task.rb +15 -12
  64. data/lib/pindo/module/task/model/jps_resign_task.rb +185 -0
  65. data/lib/pindo/module/task/model/{upload_task.rb → jps_upload_task.rb} +3 -3
  66. data/lib/pindo/module/task/model/unity_export_task.rb +3 -1
  67. data/lib/pindo/module/task/pindo_task.rb +19 -10
  68. data/lib/pindo/module/unity/unity_helper.rb +2 -1
  69. data/lib/pindo/module/xcode/ipa_resign_helper.rb +210 -0
  70. data/lib/pindo/module/xcode/{xcodeappconfig.rb → xcode_app_config.rb} +79 -0
  71. data/lib/pindo/module/xcode/xcode_build_config.rb +152 -17
  72. data/lib/pindo/module/xcode/xcode_build_helper.rb +151 -1
  73. data/lib/pindo/module/xcode/xcode_swark_helper.rb +341 -0
  74. data/lib/pindo/options/core/global_options_state.rb +268 -0
  75. data/lib/pindo/options/core/option_configuration.rb +206 -0
  76. data/lib/pindo/options/core/option_initializer.rb +51 -0
  77. data/lib/pindo/options/core/option_item.rb +144 -0
  78. data/lib/pindo/options/core/option_value_parser.rb +54 -0
  79. data/lib/pindo/options/groups/build_options.rb +60 -0
  80. data/lib/pindo/options/groups/jps_options.rb +70 -0
  81. data/lib/pindo/options/groups/option_group.rb +73 -0
  82. data/lib/pindo/options/helpers/bundleid_selector.rb +103 -0
  83. data/lib/pindo/options/options.rb +14 -0
  84. data/lib/pindo/version.rb +1 -1
  85. metadata +49 -41
  86. data/lib/pindo/command/android/build.rb +0 -186
  87. data/lib/pindo/command/appstore/import.rb +0 -259
  88. data/lib/pindo/command/deploy/build.rb +0 -250
  89. data/lib/pindo/command/deploy/bundleid.rb +0 -259
  90. data/lib/pindo/command/deploy/cert.rb +0 -202
  91. data/lib/pindo/command/deploy/check.rb +0 -93
  92. data/lib/pindo/command/deploy/configproj.rb +0 -120
  93. data/lib/pindo/command/deploy/confusecode.rb +0 -262
  94. data/lib/pindo/command/deploy/confuseproj.rb +0 -122
  95. data/lib/pindo/command/deploy/iap.rb +0 -826
  96. data/lib/pindo/command/deploy/initconfig.rb +0 -138
  97. data/lib/pindo/command/deploy/itcapp.rb +0 -146
  98. data/lib/pindo/command/deploy/pem.rb +0 -55
  99. data/lib/pindo/command/deploy/pullconfig.rb +0 -56
  100. data/lib/pindo/command/deploy/pushconfig.rb +0 -93
  101. data/lib/pindo/command/deploy/quswark.rb +0 -156
  102. data/lib/pindo/command/deploy/quswauth.rb +0 -76
  103. data/lib/pindo/command/deploy/reportbug.rb +0 -145
  104. data/lib/pindo/command/deploy/resign.rb +0 -300
  105. data/lib/pindo/command/deploy/tag.rb +0 -108
  106. data/lib/pindo/command/deploy/uploadipa.rb +0 -73
  107. data/lib/pindo/command/deploy.rb +0 -42
  108. data/lib/pindo/command/dev/autobuild.rb +0 -117
  109. data/lib/pindo/command/dev/build.rb +0 -94
  110. data/lib/pindo/command/dev/debug.rb +0 -112
  111. data/lib/pindo/module/task/model/build/android_release_build_task.rb +0 -29
  112. data/lib/pindo/module/task/model/build/ios_adhoc_build_task.rb +0 -53
  113. data/lib/pindo/module/task/model/build/ios_release_build_task.rb +0 -53
  114. data/lib/pindo/options/appconfigoptions.rb +0 -24
  115. data/lib/pindo/options/deployoptions.rb +0 -372
@@ -0,0 +1,276 @@
1
+ require_relative 'appstore_task'
2
+ require_relative '../task_config'
3
+
4
+ module Pindo
5
+ module TaskSystem
6
+ # App Store Screenshot 上传任务
7
+ # 上传应用截图到 App Store Connect
8
+ class AppStoreUploadScreenshotTask < AppStoreTask
9
+ attr_reader :app_id, :screenshot_path
10
+
11
+ # 重试配置
12
+ def self.default_retry_mode
13
+ RetryMode::DELAYED # 延迟重试
14
+ end
15
+
16
+ def self.default_retry_count
17
+ 2 # 默认可以重试 2 次
18
+ end
19
+
20
+ def self.default_retry_delay
21
+ 15 # 默认延迟 15 秒
22
+ end
23
+
24
+ # 初始化 Screenshot 上传任务
25
+ # @param app_id [String] App Store Connect 应用 ID
26
+ # @param screenshot_path [String] 截图目录路径
27
+ # @param options [Hash] 选项
28
+ # @option options [String] :apple_id Apple ID(App Store Connect 账号)
29
+ # @option options [String] :api_key_id API Key ID(使用 API Key 认证)
30
+ # @option options [String] :api_issuer_id API Issuer ID
31
+ # @option options [String] :api_key_path API Key 文件路径(.p8 文件)
32
+ # @option options [String] :locale 语言区域(默认 "zh-Hans")
33
+ # @option options [Array<String>] :device_types 设备类型(如 ["iPhone 6.5", "iPad Pro"])
34
+ # @option options [Boolean] :overwrite 是否覆盖已有截图(默认 false)
35
+ def initialize(app_id, screenshot_path, options = {})
36
+ @app_id = app_id # App Store Connect 应用 ID
37
+ @screenshot_path = screenshot_path # 截图目录路径
38
+
39
+ # App Store Connect 认证配置
40
+ @apple_id = options[:apple_id]
41
+ @api_key_id = options[:api_key_id]
42
+ @api_issuer_id = options[:api_issuer_id]
43
+ @api_key_path = options[:api_key_path]
44
+
45
+ # 截图配置
46
+ @locale = options[:locale] || "zh-Hans"
47
+ @device_types = options[:device_types] || []
48
+ @overwrite = options[:overwrite] || false
49
+
50
+ # 设置上传任务的优先级为 LOW(截图上传可以最后执行)
51
+ options[:priority] ||= TaskPriority::LOW
52
+
53
+ super("上传 Screenshot 到 App Store", options)
54
+ end
55
+
56
+ def validate
57
+ # 验证基本参数
58
+ unless @app_id && !@app_id.empty?
59
+ @error = "缺少必需参数: app_id"
60
+ return false
61
+ end
62
+
63
+ unless @screenshot_path && !@screenshot_path.empty?
64
+ @error = "缺少必需参数: screenshot_path"
65
+ return false
66
+ end
67
+
68
+ # 验证截图路径
69
+ unless File.directory?(@screenshot_path)
70
+ @error = "截图路径不存在或不是目录: #{@screenshot_path}"
71
+ return false
72
+ end
73
+
74
+ # 验证认证信息(Apple ID 或 API Key)
75
+ has_apple_id_auth = @apple_id && !@apple_id.empty?
76
+ has_api_key_auth = @api_key_id && @api_issuer_id && @api_key_path
77
+
78
+ unless has_apple_id_auth || has_api_key_auth
79
+ @error = "缺少认证信息:需要提供 Apple ID 或 API Key"
80
+ return false
81
+ end
82
+
83
+ true
84
+ end
85
+
86
+ protected
87
+
88
+ def do_work
89
+ # 1. 扫描截图文件
90
+ screenshots = scan_screenshots
91
+
92
+ if screenshots.empty?
93
+ puts " 警告: 未找到任何截图文件"
94
+ return {
95
+ success: true,
96
+ app_id: @app_id,
97
+ screenshot_count: 0
98
+ }
99
+ end
100
+
101
+ # 2. 上传截图到 App Store Connect
102
+ upload_screenshots(screenshots)
103
+
104
+ {
105
+ success: true,
106
+ app_id: @app_id,
107
+ locale: @locale,
108
+ screenshot_count: screenshots.size
109
+ }
110
+ end
111
+
112
+ private
113
+
114
+ # 扫描截图文件
115
+ def scan_screenshots
116
+ puts " 扫描截图目录: #{@screenshot_path}"
117
+
118
+ screenshots = []
119
+
120
+ # 支持的截图格式
121
+ valid_extensions = ['.png', '.jpg', '.jpeg']
122
+
123
+ # 扫描目录结构
124
+ # 标准 Fastlane 结构: screenshots/{locale}/{device_type}/*.png
125
+ locale_path = File.join(@screenshot_path, @locale)
126
+
127
+ if File.directory?(locale_path)
128
+ # 有语言目录
129
+ scan_locale_directory(locale_path, screenshots, valid_extensions)
130
+ else
131
+ # 直接扫描根目录
132
+ scan_root_directory(@screenshot_path, screenshots, valid_extensions)
133
+ end
134
+
135
+ puts " 找到 #{screenshots.size} 个截图文件"
136
+ screenshots
137
+ end
138
+
139
+ # 扫描语言目录
140
+ def scan_locale_directory(locale_path, screenshots, valid_extensions)
141
+ # 遍历设备类型目录
142
+ Dir.glob(File.join(locale_path, "*")).each do |device_dir|
143
+ next unless File.directory?(device_dir)
144
+
145
+ device_type = File.basename(device_dir)
146
+
147
+ # 如果指定了设备类型,跳过不匹配的
148
+ unless @device_types.empty?
149
+ next unless @device_types.include?(device_type)
150
+ end
151
+
152
+ # 扫描设备目录下的截图
153
+ Dir.glob(File.join(device_dir, "*")).each do |file|
154
+ next unless File.file?(file)
155
+ next unless valid_extensions.include?(File.extname(file).downcase)
156
+
157
+ screenshots << {
158
+ path: file,
159
+ device_type: device_type,
160
+ locale: @locale,
161
+ filename: File.basename(file)
162
+ }
163
+ end
164
+ end
165
+ end
166
+
167
+ # 扫描根目录(无语言/设备分类)
168
+ def scan_root_directory(root_path, screenshots, valid_extensions)
169
+ Dir.glob(File.join(root_path, "**", "*")).each do |file|
170
+ next unless File.file?(file)
171
+ next unless valid_extensions.include?(File.extname(file).downcase)
172
+
173
+ screenshots << {
174
+ path: file,
175
+ device_type: 'unknown',
176
+ locale: @locale,
177
+ filename: File.basename(file)
178
+ }
179
+ end
180
+ end
181
+
182
+ # 上传截图到 App Store Connect
183
+ def upload_screenshots(screenshots)
184
+ puts "\n开始上传 Screenshot 到 App Store Connect..."
185
+ puts " App ID: #{@app_id}"
186
+ puts " 语言区域: #{@locale}"
187
+ puts " 截图数量: #{screenshots.size}"
188
+ puts " 覆盖模式: #{@overwrite}"
189
+
190
+ # 按设备类型分组
191
+ screenshots_by_device = screenshots.group_by { |s| s[:device_type] }
192
+
193
+ screenshots_by_device.each do |device_type, device_screenshots|
194
+ puts "\n 上传 #{device_type} 截图 (#{device_screenshots.size} 张)..."
195
+
196
+ device_screenshots.each_with_index do |screenshot, index|
197
+ puts " [#{index + 1}/#{device_screenshots.size}] #{screenshot[:filename]}"
198
+ end
199
+ end
200
+
201
+ # 使用 Fastlane deliver 或 API 上传截图
202
+ if use_api_key?
203
+ upload_with_api(screenshots)
204
+ else
205
+ upload_with_fastlane(screenshots)
206
+ end
207
+
208
+ puts "✓ Screenshot 上传成功"
209
+ end
210
+
211
+ # 判断是否使用 API Key 认证
212
+ def use_api_key?
213
+ @api_key_id && @api_issuer_id && @api_key_path
214
+ end
215
+
216
+ # 使用 App Store Connect API 上传
217
+ def upload_with_api(screenshots)
218
+ puts " 使用 App Store Connect API 上传..."
219
+
220
+ # 这里需要调用 App Store Connect API Helper
221
+ # require 'pindo/module/appstore/appstore_metadata_connect_api_helper'
222
+
223
+ # 示例实现(需要根据实际 Helper 调整)
224
+ # screenshots.each do |screenshot|
225
+ # AppstoreMetadataConnectApiHelper.upload_screenshot(
226
+ # app_id: @app_id,
227
+ # api_key_id: @api_key_id,
228
+ # api_issuer_id: @api_issuer_id,
229
+ # api_key_path: @api_key_path,
230
+ # locale: screenshot[:locale],
231
+ # device_type: screenshot[:device_type],
232
+ # screenshot_path: screenshot[:path],
233
+ # overwrite: @overwrite
234
+ # )
235
+ # end
236
+
237
+ # 临时占位实现
238
+ puts " TODO: 实现 API 上传逻辑"
239
+ raise "API 上传功能尚未实现,请使用 Fastlane 方式"
240
+ end
241
+
242
+ # 使用 Fastlane deliver 上传
243
+ def upload_with_fastlane(screenshots)
244
+ puts " 使用 Fastlane deliver 上传..."
245
+
246
+ # 构建 deliver 命令参数
247
+ fastlane_cmd = ["fastlane", "deliver"]
248
+ fastlane_cmd << "--app_identifier" << @app_id
249
+ fastlane_cmd << "--username" << @apple_id if @apple_id
250
+
251
+ # 截图路径
252
+ fastlane_cmd << "--screenshots_path" << @screenshot_path
253
+
254
+ # 覆盖已有截图
255
+ if @overwrite
256
+ fastlane_cmd << "--overwrite_screenshots"
257
+ end
258
+
259
+ # 跳过元数据上传
260
+ fastlane_cmd << "--skip_metadata"
261
+
262
+ # 跳过二进制文件上传
263
+ fastlane_cmd << "--skip_binary_upload"
264
+
265
+ # 执行命令
266
+ puts " 执行命令: #{fastlane_cmd.join(' ')}"
267
+
268
+ success = system(*fastlane_cmd)
269
+
270
+ unless success
271
+ raise "上传失败:Fastlane deliver 命令执行出错(退出码: #{$?.exitstatus})"
272
+ end
273
+ end
274
+ end
275
+ end
276
+ end
@@ -0,0 +1,210 @@
1
+ require_relative 'android_build_task'
2
+ require 'pindo/module/build/build_helper'
3
+ require 'pindo/module/build/version_helper'
4
+ require 'pindo/module/build/git_repo_helper'
5
+ require 'pindo/module/android/android_config_helper'
6
+ require 'pindo/module/android/android_build_helper'
7
+ require 'pindo/module/pgyer/pgyerhelper'
8
+ require 'pindo/base/githelper'
9
+
10
+ module Pindo
11
+ module TaskSystem
12
+ # Android AdHoc 模式构建任务
13
+ # 使用 Release 模式编译 Android 工程(AdHoc 版本)
14
+ class AndroidBuildAdhocTask < AndroidBuildTask
15
+ include Pindo::Githelper
16
+
17
+ def initialize(options = {})
18
+ @bundle_name = options[:bundle_name]
19
+ @proj_name = options[:proj_name]
20
+ @upload_flag = options[:upload] || false
21
+ @send_flag = options[:send] || false
22
+
23
+ # 接收外部传入的 JPS 配置
24
+ @app_info_obj = options[:app_info_obj]
25
+ @workflow_info = options[:workflow_info]
26
+
27
+ super(:android, :adhoc, options)
28
+ end
29
+
30
+ protected
31
+
32
+ def build_task_name
33
+ "构建 APK (AdHoc)"
34
+ end
35
+
36
+ def prepare_build
37
+ # 校验必需的参数
38
+ Dir.chdir(@project_path)
39
+ validate_workflow_info
40
+ check_git_tag if @upload_flag
41
+ update_project_config
42
+ update_version_info
43
+ handle_bundle_name_config if @bundle_name
44
+ add_application_id_scheme
45
+ end
46
+
47
+ def execute_build
48
+ build_android_project
49
+ end
50
+
51
+ def find_output
52
+ # 搜索 APK 和 AAB 文件
53
+ search_paths = []
54
+ search_paths.concat(TaskConfig::BUILD_OUTPUT_PATTERNS[:apk].map { |p| File.join(@project_path, p) })
55
+ search_paths.concat(TaskConfig::BUILD_OUTPUT_PATTERNS[:aab].map { |p| File.join(@project_path, p) })
56
+
57
+ package_files = []
58
+ search_paths.each do |pattern|
59
+ package_files.concat(Dir.glob(pattern))
60
+ end
61
+
62
+ # 过滤测试包和未签名包
63
+ package_files.reject! do |f|
64
+ basename = File.basename(f).downcase
65
+ TaskConfig::EXCLUDED_PATTERNS.any? { |pattern| basename.include?(pattern) }
66
+ end
67
+
68
+ if package_files.any?
69
+ # 优先返回 AAB,其次 APK
70
+ aab_files = package_files.select { |f| f.end_with?(".aab") }
71
+ apk_files = package_files.select { |f| f.end_with?(".apk") }
72
+
73
+ latest_package = if aab_files.any?
74
+ aab_files.max_by { |f| File.mtime(f) }
75
+ elsif apk_files.any?
76
+ apk_files.max_by { |f| File.mtime(f) }
77
+ else
78
+ package_files.max_by { |f| File.mtime(f) }
79
+ end
80
+
81
+ puts " 找到 Android 包文件: #{latest_package}"
82
+ latest_package
83
+ else
84
+ puts " 警告: 未找到 APK/AAB 文件"
85
+ nil
86
+ end
87
+ end
88
+
89
+ private
90
+
91
+ # 校验工作流信息
92
+ def validate_workflow_info
93
+ unless @workflow_info && @workflow_info[:package_name]
94
+ raise Informative, "未提供工作流信息,请在创建任务时传入 workflow_info 参数"
95
+ end
96
+ end
97
+
98
+ # Git 标签检查
99
+ def check_git_tag
100
+ git_repo_helper = Pindo::GitRepoHelper.share_instance
101
+ is_need_add_tag, tag_action_params = git_repo_helper.check_is_need_add_tag?(@project_path)
102
+ if is_need_add_tag
103
+ git_repo_helper.create_and_push_tag(
104
+ project_dir: @project_path,
105
+ mode: 'minor',
106
+ force_retag: tag_action_params&.include?('--retag') || false,
107
+ custom_tag: nil,
108
+ release_branch: 'master'
109
+ )
110
+ end
111
+ end
112
+
113
+ # 更新工程配置
114
+ def update_project_config
115
+ workflow_packname = @workflow_info[:package_name]
116
+
117
+ puts "\n使用工作流配置更新 Android 项目:"
118
+ puts " Workflow Package Name: #{workflow_packname}"
119
+
120
+ # 更新 App Name、Application ID 和 URL Schemes
121
+ Pindo::AndroidConfigHelper.update_project_with_workflow(
122
+ project_dir: @project_path,
123
+ workflow_packname: workflow_packname
124
+ )
125
+
126
+ # 下载并替换 Icon
127
+ if @app_info_obj && @app_info_obj["projectIcon"] && !@app_info_obj["projectIcon"].empty?
128
+ icon_replace_success = Pindo::AndroidConfigHelper.download_and_replace_icon_from_url(
129
+ project_dir: @project_path,
130
+ icon_url: @app_info_obj["projectIcon"]
131
+ )
132
+
133
+ unless icon_replace_success
134
+ raise Informative, "Icon 下载或替换失败,请检查 Icon URL 是否有效: #{@app_info_obj["projectIcon"]}"
135
+ end
136
+ else
137
+ Funlog.warning("未配置 Icon URL,跳过 Icon 替换")
138
+ end
139
+ end
140
+
141
+ # 更新版本号
142
+ def update_version_info
143
+ version_helper = Pindo::VersionHelper.share_instance
144
+ version_info = version_helper.get_version_info(project_dir: @project_path)
145
+
146
+ if version_info[:is_git_repo]
147
+ Pindo::AndroidConfigHelper.update_android_project_version(
148
+ project_dir: @project_path,
149
+ version_name: version_info[:version],
150
+ version_code: version_info[:build_number]
151
+ )
152
+ else
153
+ Funlog.warning("非Git仓库,保持工程原有版本号")
154
+ end
155
+ end
156
+
157
+ # 处理 Bundle Name 特殊配置
158
+ def handle_bundle_name_config
159
+ return unless @bundle_name && !@bundle_name.empty?
160
+
161
+ puts "\n正在处理指定的 Bundle Name: #{@bundle_name}..."
162
+
163
+ # 检查是否为通配符
164
+ is_wildcard = @bundle_name.include?('*') ||
165
+ @bundle_name.end_with?('.') ||
166
+ ['com.test', 'com.example', 'com.demo'].include?(@bundle_name)
167
+
168
+ if is_wildcard
169
+ puts " ⚠️ 检测到通配符或通用 Bundle Name: #{@bundle_name}"
170
+ puts " ⚠️ 跳过 google-services.json 和 Application ID 更新"
171
+ else
172
+ # 拉取配置仓库
173
+ config_repo_dir = clong_buildconfig_repo(repo_name: @bundle_name)
174
+
175
+ if config_repo_dir && File.exist?(config_repo_dir)
176
+ # 拷贝 google-services.json
177
+ Pindo::AndroidConfigHelper.copy_google_services_from_config_repo(
178
+ config_repo_dir: config_repo_dir,
179
+ project_dir: @project_path
180
+ )
181
+
182
+ # 更新 Application ID
183
+ Pindo::AndroidConfigHelper.update_application_id(
184
+ project_dir: @project_path,
185
+ application_id: @bundle_name
186
+ )
187
+
188
+ puts " ✓ Bundle Name 配置处理完成"
189
+ else
190
+ raise Informative, "无法获取配置仓库"
191
+ end
192
+ end
193
+ end
194
+
195
+ # 添加基于 Application ID 的 Scheme
196
+ def add_application_id_scheme
197
+ Pindo::AndroidConfigHelper.add_application_id_based_scheme(
198
+ project_dir: @project_path
199
+ )
200
+ end
201
+
202
+ # 构建 Android 工程
203
+ def build_android_project
204
+ android_build_helper = Pindo::AndroidBuildHelper.share_instance
205
+ # 第二个参数 false 表示 release 模式
206
+ android_build_helper.auto_build_apk(@project_path, false)
207
+ end
208
+ end
209
+ end
210
+ end
@@ -1,4 +1,4 @@
1
- require_relative '../build_task'
1
+ require_relative 'android_build_task'
2
2
  require 'pindo/module/build/build_helper'
3
3
  require 'pindo/module/build/version_helper'
4
4
  require 'pindo/module/build/git_repo_helper'
@@ -11,7 +11,7 @@ module Pindo
11
11
  module TaskSystem
12
12
  # Android Dev 模式构建任务
13
13
  # 使用 Debug 模式编译 Android 工程
14
- class AndroidDevBuildTask < BuildTask
14
+ class AndroidBuildDevTask < AndroidBuildTask
15
15
  include Pindo::Githelper
16
16
  def initialize(options = {})
17
17
  @bundle_name = options[:bundle_name]