Module: Ruflet::CLI::AndroidSdk

Included in:
BuildCommand, ExtraCommand
Defined in:
lib/ruflet/cli/android_sdk.rb

Overview

Provisions the Android toolchain so ‘ruflet build apk|aab|android` works on a fresh machine:

* a JDK (Gradle itself is bootstrapped by the project's Gradle
  wrapper, but the wrapper needs Java)
* the Android SDK command-line tools
* platform-tools / a platform / build-tools via sdkmanager
* accepted SDK licenses

An existing SDK (ANDROID_HOME, ANDROID_SDK_ROOT, or the standard per-OS install location) is always preferred; otherwise a Ruflet-managed SDK is created under ~/.ruflet/android-sdk.

Constant Summary collapse

CMDLINE_TOOLS_VERSION =
"11076708"
CMDLINE_TOOLS_BASE =
"https://dl.google.com/android/repository".freeze
ANDROID_PLATFORM =
"android-35"
ANDROID_BUILD_TOOLS =
"35.0.0"
MINIMUM_JAVA_MAJOR =
17
JDK_PACKAGES =
{
  apt: "openjdk-17-jdk",
  dnf: "java-17-openjdk-devel",
  pacman: "jdk17-openjdk",
  zypper: "java-17-openjdk-devel",
  apk: "openjdk17",
  brew: "openjdk@17",
  winget: "EclipseAdoptium.Temurin.17.JDK",
  choco: "temurin17"
}.freeze

Instance Method Summary collapse

Instance Method Details

#android_build_env(env) ⇒ Object

Environment for invoking Flutter/Gradle Android builds.



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/ruflet/cli/android_sdk.rb', line 83

def android_build_env(env)
  merged = env.dup
  sdk_root = detect_android_sdk_root
  if sdk_root
    merged["ANDROID_HOME"] ||= sdk_root
    merged["ANDROID_SDK_ROOT"] ||= sdk_root
    platform_tools = File.join(sdk_root, "platform-tools")
    if Dir.exist?(platform_tools)
      merged["PATH"] = "#{platform_tools}#{File::PATH_SEPARATOR}#{merged.fetch('PATH', ENV.fetch('PATH', ''))}"
    end
  end
  java_home = detect_java_home
  merged["JAVA_HOME"] ||= java_home if java_home
  merged
end

#android_environment_setup!(fix: false, verbose: false) ⇒ Object



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
# File 'lib/ruflet/cli/android_sdk.rb', line 40

def android_environment_setup!(fix: false, verbose: false)
  issues = []

  java = ensure_java!(fix: fix, verbose: verbose)
  if java
    puts "  Java: #{java[:version]} (#{java[:path]})"
  else
    issues << "missing JDK #{MINIMUM_JAVA_MAJOR}+"
    warn "  Java: missing — Android builds need a JDK (Gradle wrapper requirement)."
    warn "    #{jdk_install_hint}"
    return issues unless fix
  end

  sdk_root = detect_android_sdk_root
  if sdk_root
    puts "  Android SDK: #{sdk_root}"
  elsif fix
    unless java
      warn "  Android SDK: skipped (sdkmanager needs Java)"
      return issues
    end
    sdk_root = install_managed_android_sdk(java, verbose: verbose)
    unless sdk_root
      issues << "Android SDK install failed"
      warn "  Android SDK: install failed"
      return issues
    end
    puts "  Android SDK: #{sdk_root} (installed)"
  else
    issues << "missing Android SDK"
    warn "  Android SDK: missing — run `ruflet doctor --fix` to install it under #{managed_android_sdk_root}."
    return issues
  end

  if fix && java
    ensure_android_packages(sdk_root, java, verbose: verbose)
    accept_android_licenses(sdk_root, java, verbose: verbose)
  end

  issues
end

#detect_android_sdk_rootObject



99
100
101
102
103
104
105
106
107
# File 'lib/ruflet/cli/android_sdk.rb', line 99

def detect_android_sdk_root
  candidates = [
    ENV["ANDROID_HOME"],
    ENV["ANDROID_SDK_ROOT"],
    default_android_sdk_location,
    managed_android_sdk_root
  ]
  candidates.compact.find { |root| android_sdk_present?(root) }
end

#managed_android_sdk_rootObject



109
110
111
# File 'lib/ruflet/cli/android_sdk.rb', line 109

def managed_android_sdk_root
  File.join(Dir.home, ".ruflet", "android-sdk")
end