Class: Env

Inherits:
Object
  • Object
show all
Defined in:
lib/calabash-android/env.rb

Class Method Summary collapse

Class Method Details

.adb_executableObject



120
121
122
# File 'lib/calabash-android/env.rb', line 120

def self.adb_executable
  is_windows? ? 'adb.exe' : 'adb'
end

.adb_pathObject



146
147
148
# File 'lib/calabash-android/env.rb', line 146

def self.adb_path
  %Q("#{android_home_path}/platform-tools/#{adb_executable}")
end

.android_home_pathObject



61
62
63
64
65
66
67
68
69
# File 'lib/calabash-android/env.rb', line 61

def self.android_home_path
  path_if_android_home(ENV["ANDROID_HOME"]) ||
  if is_windows?
    path_if_android_home(read_registry(::Win32::Registry::HKEY_LOCAL_MACHINE, 'SOFTWARE\\Android SDK Tools', 'Path')) ||
    path_if_android_home("C:\\Android\\android-sdk")
  else
    path_if_android_home(read_attribute_from_monodroid_config('android-sdk', 'path'))
  end
end

.android_platform_pathObject



170
171
172
173
174
175
176
# File 'lib/calabash-android/env.rb', line 170

def self.android_platform_path
  Dir.chdir(android_home_path) do
    platforms = Dir["platforms/android-*"].sort_by { |item| '%08s' % item.split('-').last }
    raise "No Android SDK found in #{android_home_path}/platforms/" if platforms.empty?
    File.expand_path(platforms.last)
  end
end

.ant_pathObject



124
125
126
# File 'lib/calabash-android/env.rb', line 124

def self.ant_path
  is_windows? ? "ant.bat" : "ant"
end

.exit_if_env_not_set_upObject



6
7
8
9
# File 'lib/calabash-android/env.rb', line 6

def self.exit_if_env_not_set_up
  exit_unless_jdk_is_available
  exit_unless_android_sdk_is_available
end

.exit_unless_android_sdk_is_availableObject



11
12
13
14
15
16
17
18
19
20
# File 'lib/calabash-android/env.rb', line 11

def self.exit_unless_android_sdk_is_available
  if android_home_path
    log "Android SDK found at: #{android_home_path}"
    return
  end
  puts "Could not find an Android SDK please make sure it is installed."
  puts "You can read about how Calabash-Android is searching for an Android SDK and how you can help here:"
  puts "https://github.com/calabash/calabash-android/blob/master/documentation/installation.md#prerequisites"
  exit 1
end

.exit_unless_jdk_is_availableObject



27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/calabash-android/env.rb', line 27

def self.exit_unless_jdk_is_available
  jdk = jdk_path
  if find_executable_on_path(keytool_executable) || jdk
    log "JDK found on PATH." if find_executable_on_path(keytool_executable)
    log "JDK found at: #{jdk}" if jdk
    return
  end
  puts "Could not find Java Development Kit please make sure it is installed."
  puts "You can read about how Calabash-Android is searching for a JDK and how you can help here:"
  puts "https://github.com/calabash/calabash-android/blob/master/documentation/installation.md#prerequisites"
  exit 1
end

.find_executable_on_path(executable) ⇒ Object



71
72
73
74
75
76
77
# File 'lib/calabash-android/env.rb', line 71

def self.find_executable_on_path(executable)
  path_elements.each do |x|
    f = File.join(x, executable)
    return "\"#{f}\"" if File.exists?(f)
  end
  nil
end

.is_windows?Boolean

Returns:

  • (Boolean)


128
129
130
# File 'lib/calabash-android/env.rb', line 128

def self.is_windows?
  (RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/)
end

.jarsigner_executableObject



108
109
110
# File 'lib/calabash-android/env.rb', line 108

def self.jarsigner_executable
  is_windows? ? 'jarsigner.exe' : 'jarsigner'
end

.jarsigner_pathObject



40
41
42
43
# File 'lib/calabash-android/env.rb', line 40

def self.jarsigner_path
  find_executable_on_path(jarsigner_executable) ||
  "\"#{jdk_path}/bin/#{jarsigner_executable}\""
end

.java_executableObject



112
113
114
# File 'lib/calabash-android/env.rb', line 112

def self.java_executable
  is_windows? ? 'java.exe' : 'java'
end

.java_pathObject



45
46
47
48
# File 'lib/calabash-android/env.rb', line 45

def self.java_path
  find_executable_on_path(java_executable) ||
  "\"#{jdk_path}/bin/#{java_executable}\""
end

.jdk_pathObject



50
51
52
53
54
55
56
57
58
59
# File 'lib/calabash-android/env.rb', line 50

def self.jdk_path
  path_if_jdk(ENV['JAVA_HOME']) ||
  if is_windows?
    path_if_jdk(read_registry(::Win32::Registry::HKEY_LOCAL_MACHINE, 'SOFTWARE\\JavaSoft\\Java Development Kit\\1.8', 'JavaHome')) ||
    path_if_jdk(read_registry(::Win32::Registry::HKEY_LOCAL_MACHINE, 'SOFTWARE\\JavaSoft\\Java Development Kit\\1.7', 'JavaHome')) ||
    path_if_jdk(read_registry(::Win32::Registry::HKEY_LOCAL_MACHINE, 'SOFTWARE\\JavaSoft\\Java Development Kit\\1.6', 'JavaHome'))
  else
    path_if_jdk(read_attribute_from_monodroid_config('java-sdk', 'path'))
  end
end

.keytool_executableObject



116
117
118
# File 'lib/calabash-android/env.rb', line 116

def self.keytool_executable
  is_windows? ? 'keytool.exe' : 'keytool'
end

.keytool_pathObject



22
23
24
25
# File 'lib/calabash-android/env.rb', line 22

def self.keytool_path
  find_executable_on_path(keytool_executable) ||
  "\"#{jdk_path}/bin/#{keytool_executable}\""
end

.path_elementsObject



154
155
156
157
# File 'lib/calabash-android/env.rb', line 154

def self.path_elements
  return [] unless ENV['PATH']
  ENV['PATH'].split (/[:;]/)
end

.path_if_android_home(path) ⇒ Object



150
151
152
# File 'lib/calabash-android/env.rb', line 150

def self.path_if_android_home(path)
  path if path && File.exists?(File.join(path, 'platform-tools', adb_executable))
end

.path_if_jdk(path) ⇒ Object



79
80
81
# File 'lib/calabash-android/env.rb', line 79

def self.path_if_jdk(path)
  path if path && File.exists?(File.join(path, 'bin', jarsigner_executable))
end

.read_attribute_from_monodroid_config(element, attribute) ⇒ Object



159
160
161
162
163
164
165
166
167
168
# File 'lib/calabash-android/env.rb', line 159

def self.read_attribute_from_monodroid_config(element, attribute)
  monodroid_config_file = File.expand_path("~/.config/xbuild/monodroid-config.xml")
  if File.exists?(monodroid_config_file)
    require 'rexml/document'
    begin
      return REXML::Document.new(IO.read(monodroid_config_file)).elements["//#{element}"].attributes[attribute]
    rescue
    end
  end
end

.read_registry(root_key, key, value) ⇒ Object



178
179
180
181
182
183
184
# File 'lib/calabash-android/env.rb', line 178

def self.read_registry(root_key, key, value)
  begin
    root_key.open(key)[value]
  rescue
    nil
  end
end

.tools_dirObject



132
133
134
135
136
# File 'lib/calabash-android/env.rb', line 132

def self.tools_dir
  tools_dir = tools_directories.first
  log "Found tools directory at '#{tools_dir}'"
  tools_dir
end

.tools_directoriesObject



138
139
140
141
142
143
144
# File 'lib/calabash-android/env.rb', line 138

def self.tools_directories
  Dir.chdir(android_home_path) do
    dirs = Dir["build-tools/*"] + Dir["platform-tools"]
    raise "Could not find tools directory in #{android_home_path}" if dirs.empty?
    dirs.map {|dir| File.expand_path(dir)}
  end
end

.zipalign_executableObject



104
105
106
# File 'lib/calabash-android/env.rb', line 104

def self.zipalign_executable
  is_windows? ? 'zipalign.exe' : 'zipalign'
end

.zipalign_pathObject



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/calabash-android/env.rb', line 83

def self.zipalign_path
  zipalign_path = File.join(android_home_path, 'tools', zipalign_executable)

  unless File.exists?(zipalign_path)
    log "Did not find zipalign at '#{zipalign_path}'. Trying to find zipalign in tools directories."

    tools_directories.each do |dir|
      zipalign_path = File.join(dir, zipalign_executable)
      break if File.exists?(zipalign_path)
    end
  end

  if File.exists?(zipalign_path)
    log "Found zipalign at '#{zipalign_path}'"
    zipalign_path
  else
    log("Did not find zipalign in any of '#{tools_directories.join("','")}'.", true)
    raise 'Could not find zipalign'
  end
end