Module: AppiumInstrumenter

Defined in:
lib/appium_instrumenter.rb,
lib/appium_instrumenter/version.rb

Constant Summary collapse

VERSION =
"0.1.5"

Class Method Summary collapse

Class Method Details

.instrument(app_under_test) ⇒ Object



6
7
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
# File 'lib/appium_instrumenter.rb', line 6

def self.instrument(app_under_test)
  test_server_apk = File.join(File.dirname(__FILE__), 'appium_instrumenter/resources/appium-uiautomator2-server-debug-androidTest.apk')
  #iornically
  useless_needed_server_apk = File.join(File.dirname(__FILE__), 'appium_instrumenter/resources/appium-uiautomator2-server-v3.2.2.apk')

  apk_fingerprint = fingerprint_from_apk(app_under_test)
  log "#{app_under_test} was signed with a certificate with fingerprint #{apk_fingerprint}"

  keystores = JavaKeystore.get_keystores
  if keystores.empty?
    puts "No keystores found."
    exit 1
  end
  keystore = keystores.find { |k| k.fingerprint == apk_fingerprint}

  unless keystore
    puts "#{app_under_test} is not signed with any of the available keystores."
    puts "Tried the following keystores:"
    keystores.each do |k|
      puts k.location
    end
    puts ""
    puts "You can resign the app_under_test with #{keystores.first.location} by running:
  appium_instrumenter resign #{app_under_test}"

    puts ""
    puts "Notice that resigning an app_under_test might break some functionality."
    puts "Getting a copy of the certificate used when the app_under_test was built will in general be more reliable."

    exit 1
  end

  test_server_file_name = 'test_servers/appium-uiautomator2-server-debug-androidTest.apk'
  FileUtils.mkdir_p File.dirname(test_server_file_name) unless File.exist? File.dirname(test_server_file_name)

  unsign_apk(test_server_apk)
  test_server_manifest = File.join(File.dirname(__FILE__), 'appium_instrumenter/resources/AndroidManifest.xml')

  Dir.mktmpdir do |workspace_dir|
    Dir.chdir(workspace_dir) do
      FileUtils.cp(test_server_apk, "TestServer.apk")
      FileUtils.cp(test_server_manifest, "AndroidManifest.xml")

      unless system %Q{"#{RbConfig.ruby}" -pi.bak -e "gsub(/#targetPackage#/, '#{package_name(app_under_test)}')" AndroidManifest.xml}
        raise "Could not replace package name in manifest"
      end

      unless system %Q{"#{Calabash::Android::Dependencies.aapt_path}" package -M AndroidManifest.xml  -I "#{Calabash::Android::Dependencies.android_jar_path}" -F dummy.apk}
        raise "Could not create dummy.apk"
      end

      Calabash::Utils.with_silent_zip do
        Zip::File.new("dummy.apk").extract("AndroidManifest.xml","customAndroidManifest.xml")
        Zip::File.open("TestServer.apk") do |zip_file|

          zip_file.remove("AndroidManifest.xml")
          zip_file.add("AndroidManifest.xml", "customAndroidManifest.xml")
        end
      end
    end
    keystore.sign_apk("#{workspace_dir}/TestServer.apk", test_server_file_name)
    begin

    rescue => e
      log e
      raise "Could not sign test server"
    end
  end
  FileUtils.cp(useless_needed_server_apk, "./test_servers")
  puts "Done signing the test server. Moved it to #{test_server_file_name}"
end

.unsign_and_resign_apk(apk_path) ⇒ Object



78
79
80
# File 'lib/appium_instrumenter.rb', line 78

def self.unsign_and_resign_apk(apk_path)
  resign_apk(apk_path)
end