8
9
10
11
12
13
14
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
|
# File 'lib/pindo/module/android/apk_helper.rb', line 8
def build_apk(project_path, debug)
raise ArgumentError, "项目路径不能为空" if project_path.nil? || project_path.empty?
unless build_aab(project_path, debug)
raise RuntimeError, "AAB 构建失败"
end
main_module = get_main_module(project_path)
raise ArgumentError, "无法找到主模块" unless main_module
keystore_config = get_keystore_config(project_path, debug)
raise ArgumentError, "无法从 build.gradle 中获取 keystore 信息" unless keystore_config
bundle_tool = get_build_tools[:bundle_tool]
raise ArgumentError, "找不到 bundletool" unless File.exist?(bundle_tool)
build_type = debug ? 'debug' : 'release'
main_module_name = File.basename(main_module)
output_dir = File.join(project_path, "build/apks")
FileUtils.rm_rf(output_dir)
FileUtils.mkdir_p(output_dir)
paths = {
output_apks: File.join(output_dir, "app.apks"),
bundle: File.join(main_module, "build/outputs/bundle/#{build_type}/#{main_module_name}-#{build_type}.aab"),
universal_apk: File.join(output_dir, "universal.apk")
}
unless File.exist?(paths[:bundle])
raise RuntimeError, "找不到 AAB 文件: #{paths[:bundle]}"
end
begin
compliance_result = Pindo::GPComplianceHelper.check_aab_compliance(paths[:bundle])
if compliance_result.compliant?
puts "\e[32m\e[1m✓ AAB 包符合 Google Play 最新合规要求,可以正常提交\e[0m"
else
puts "\e[31m\e[1m✗ AAB 包不符合 Google Play 提交标准,需要修复合规问题才能提交!!!\e[0m"
end
rescue => e
puts "\e[31mGoogle Play 合规检测失败: #{e.message}\e[0m"
puts "\e[33m建议手动检查包体积、Target SDK 版本和共享库对齐情况\e[0m"
end
ks = keystore_config[:store_file]
ks_pass = keystore_config[:store_password]
key_alias = keystore_config[:key_alias]
key_pass = keystore_config[:key_password]
java_cmd = find_java_command
bundletool_cmd = [
"#{java_cmd} -jar #{bundle_tool} build-apks",
"--bundle=#{paths[:bundle]}",
"--output=#{paths[:output_apks]}",
"--ks=#{ks}",
"--ks-pass=pass:#{ks_pass}",
"--ks-key-alias=#{key_alias}",
"--key-pass=pass:#{key_pass}",
"--mode=universal"
].join(" ")
unless system(bundletool_cmd)
if java_cmd == 'java'
raise RuntimeError, "APKS 构建失败。可能是 Java 版本不兼容,bundletool 需要 Java 11+,请检查 JAVA_HOME 环境变量或安装正确的 Java 版本"
else
raise RuntimeError, "APKS 构建失败。使用的 Java 命令: #{java_cmd}"
end
end
unless system("unzip", "-o", paths[:output_apks], "-d", output_dir)
raise RuntimeError, "APKS 解压失败"
end
unless File.exist?(paths[:universal_apk])
raise RuntimeError, "未找到生成的 APK 文件"
end
paths[:universal_apk]
end
|