Skip to content

Commit ad5935c

Browse files
committed
Update logic for finding (or provide) apkanalyzer
1 parent e8acd9d commit ad5935c

File tree

2 files changed

+24
-5
lines changed

2 files changed

+24
-5
lines changed

lib/fastlane/plugin/wpmreleasetoolkit/actions/android/android_send_app_size_metrics.rb

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def self.run(params)
2626
# Add device-specific 'splits' metrics to the payload if a `:include_split_sizes` is enabled
2727
if params[:include_split_sizes]
2828
check_bundletool_installed!
29-
apkanalyzer_bin = find_apkanalyzer_binary!
29+
apkanalyzer_bin = params[:apkanalyzer_binary] || find_apkanalyzer_binary!
3030
UI.message("[App Size Metrics] Generating the various APK splits from #{params[:aab_path]}...")
3131
Dir.mktmpdir('release-toolkit-android-app-size-metrics') do |tmp_dir|
3232
Action.sh('bundletool', 'build-apks', '--bundle', params[:aab_path], '--output-format', 'DIRECTORY', '--output', tmp_dir)
@@ -61,10 +61,18 @@ def self.check_bundletool_installed!
6161
raise
6262
end
6363

64-
def self.find_apkanalyzer_binary!
64+
def self.find_apkanalyzer_binary
6565
sdk_root = ENV['ANDROID_SDK_ROOT'] || ENV['ANDROID_HOME']
66-
apkanalyzer_bin = sdk_root.nil? ? Action.sh('command', '-v', 'apkanalyzer') : File.join(sdk_root, 'cmdline-tools', 'latest', 'bin', 'apkanalyzer')
67-
UI.user_error!('Unable to find apkanalyzer executable. Make sure you installed the Android SDK Command-line Tools') unless File.executable?(apkanalyzer_bin)
66+
if sdk_root
67+
pattern = File.join(sdk_root, 'cmdline-tools', '{latest,tools}', 'bin', 'apkanalyzer')
68+
apkanalyzer_bin = Dir.glob(pattern).find { |path| File.executable?(path) }
69+
end
70+
apkanalyzer_bin || Action.sh('command', '-v', 'apkanalyzer', print_command_output: false) { |_| nil }
71+
end
72+
73+
def self.find_apkanalyzer_binary!
74+
apkanalyzer_bin = find_apkanalyzer_binary
75+
UI.user_error!('Unable to find `apkanalyzer` executable in `$PATH` nor `$ANDROID_SDK_ROOT`. Make sure you installed the Android SDK Command-line Tools') if apkanalyzer_bin.nil?
6876
apkanalyzer_bin
6977
end
7078

@@ -170,6 +178,17 @@ def self.available_options
170178
type: FastlaneCore::Boolean,
171179
default_value: true
172180
),
181+
FastlaneCore::ConfigItem.new(
182+
key: :apkanalyzer_binary,
183+
env_name: 'FL_ANDROID_SEND_APP_SIZE_METRICS_APKANALYZER_BINARY',
184+
description: 'The path to the `apkanalyzer` binary to use. If not provided explicitly, we will use `$PATH` and `$ANDROID_SDK_HOME` to try to find it',
185+
type: String,
186+
default_value: find_apkanalyzer_binary,
187+
default_value_dynamic: true,
188+
verify_block: proc do |value|
189+
UI.user_error!('You must provide a path to an existing executable for `apkanalyzer`') unless File.executable?(value)
190+
end
191+
),
173192
]
174193
end
175194

spec/android_send_app_size_metrics_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ def test_app_size_action(fake_aab_size:, fake_apks:, expected_payload:, **other_
1313

1414
if other_action_args[:include_split_sizes] != false
1515
# Arrange: fake that apkanalyzer exists
16-
ENV['ANDROID_SDK_ROOT'] = '__ANDROID_SDK_ROOT__FOR_TESTS__'
1716
apkanalyzer_bin = File.join('__ANDROID_SDK_ROOT__FOR_TESTS__', 'cmdline-tools', 'latest', 'bin', 'apkanalyzer')
17+
allow(described_class).to receive(:find_apkanalyzer_binary).and_return(apkanalyzer_bin)
1818
allow(File).to receive(:executable?).with(apkanalyzer_bin).and_return(true)
1919

2020
# Arrange: fake that bundletool exists and mock its call to create fake apks with corresponding apkanalyzer calls mocks

0 commit comments

Comments
 (0)