ruboto 1.5.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +4 -4
- data/RELEASE_CANDICATE_DOC.md +4 -4
- data/RELEASE_DOC.md +24 -36
- data/Rakefile +15 -14
- data/Vagrantfile +2 -1
- data/assets/rakelib/ruboto.device.rb +58 -43
- data/assets/rakelib/ruboto.rake +21 -11
- data/assets/rakelib/ruboto.stdlib.rake +0 -16
- data/assets/src/ruboto/activity/reload.rb +5 -3
- data/assets/src/ruboto/util/stack.rb +2 -2
- data/assets/test/src/test_helper.rb +5 -1
- data/lib/ruboto/commands/base.rb +21 -19
- data/lib/ruboto/sdk_versions.rb +3 -3
- data/lib/ruboto/util/emulator.rb +101 -54
- data/lib/ruboto/util/setup.rb +11 -3
- data/lib/ruboto/util/update.rb +1 -1
- data/lib/ruboto/util/verify.rb +7 -4
- data/lib/ruboto/version.rb +1 -1
- data/test/activity/location_activity_test.rb +2 -2
- data/test/activity/navigation_activity_test.rb +1 -0
- data/test/activity/ssl_activity.rb +2 -2
- data/test/activity/stack_activity_test.rb +2 -1
- data/test/app_test_methods.rb +8 -0
- data/test/arjdbc_test.rb +1 -1
- data/test/rake_test.rb +1 -1
- data/test/ruboto_activity_test.rb +8 -6
- data/test/ruboto_gen_test.rb +2 -1
- data/test/ruboto_setup_test.rb +4 -3
- data/test/sqldroid_test.rb +1 -7
- data/test/test_helper.rb +6 -32
- metadata +10 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 722d788ed8cf384285ca9fda8e6d810dbb8f53d8
|
|
4
|
+
data.tar.gz: b9c965d06f1ad9e654c7dfdc812091eb9cbfa730
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 87fafecf9b75f9f5693b0a1bc89ea745abd400c4f51dccce0e0bebd1952768323f6a9bd425ff2a38b8eab30d89befa372af1ecadcd6d0e47f1e39553007bf010
|
|
7
|
+
data.tar.gz: 8b70573fda9f044cdbe0ee8e3ae77219be65de682094be742bb65269db9d170d9df040d5526c0226e1812e9f665ba82a1abb399ff70adfa8b3d706c25153b9d2
|
data/Gemfile.lock
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
ruboto (1.
|
|
4
|
+
ruboto (1.6.0)
|
|
5
5
|
main (~> 5.2)
|
|
6
6
|
net-telnet (~> 0.1.1)
|
|
7
|
-
rake (
|
|
7
|
+
rake (>= 11.3, < 13)
|
|
8
8
|
rubyzip (~> 1.0)
|
|
9
9
|
|
|
10
10
|
GEM
|
|
@@ -22,13 +22,13 @@ GEM
|
|
|
22
22
|
pry (>= 0.9)
|
|
23
23
|
map (6.6.0)
|
|
24
24
|
method_source (0.8.2)
|
|
25
|
-
minitest (5.
|
|
25
|
+
minitest (5.10.1)
|
|
26
26
|
net-telnet (0.1.1)
|
|
27
27
|
pry (0.10.4)
|
|
28
28
|
coderay (~> 1.1.0)
|
|
29
29
|
method_source (~> 0.8.1)
|
|
30
30
|
slop (~> 3.4)
|
|
31
|
-
rake (
|
|
31
|
+
rake (12.0.0)
|
|
32
32
|
rubyzip (1.2.0)
|
|
33
33
|
slop (3.6.0)
|
|
34
34
|
|
data/RELEASE_CANDICATE_DOC.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
Subject: [ANN] Ruboto 1.
|
|
1
|
+
Subject: [ANN] Ruboto 1.6.0 release candidate
|
|
2
2
|
|
|
3
3
|
Hi all!
|
|
4
4
|
|
|
5
|
-
The Ruboto 1.
|
|
5
|
+
The Ruboto 1.6.0 release candidate is now available.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
In this release we add support for Android 7.0 and 7.1 "Nougat" and update
|
|
8
|
+
the Android SDK to level 25.
|
|
9
9
|
|
|
10
10
|
As always we need your help and feedback to ensure the quality of the release. Please install the release candidate using
|
|
11
11
|
|
data/RELEASE_DOC.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Subject: [ANN] Ruboto 1.
|
|
1
|
+
Subject: [ANN] Ruboto 1.6.0 released!
|
|
2
2
|
|
|
3
|
-
The Ruboto team is pleased to announce the release of Ruboto 1.
|
|
3
|
+
The Ruboto team is pleased to announce the release of Ruboto 1.6.0.
|
|
4
4
|
|
|
5
5
|
Ruboto (JRuby on Android) is a platform for developing full stand-alone
|
|
6
6
|
apps for Android using the Ruby language and libraries. It includes
|
|
@@ -8,59 +8,47 @@ support libraries and generators for creating projects, classes, tests,
|
|
|
8
8
|
and more. The complete APIs of Android, Java, and Ruby are available to
|
|
9
9
|
you using the Ruby language.
|
|
10
10
|
|
|
11
|
-
New in version 1.
|
|
11
|
+
New in version 1.6.0:
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
In this release we add support for Android 7.0 and 7.1 "Nougat" and update
|
|
14
|
+
the Android SDK to level 25.
|
|
15
15
|
|
|
16
16
|
API Changes:
|
|
17
17
|
|
|
18
|
-
* Issue #
|
|
19
|
-
|
|
18
|
+
* Issue #816 Set default api level for new apps to 19 (Android 4.4
|
|
19
|
+
KitKat)
|
|
20
|
+
* Issue #821 Update to Android SDK Tools 25
|
|
21
|
+
* Issue #826 Rename 'assert_matches' to 'assert_match' for Minitest
|
|
22
|
+
compatibility
|
|
20
23
|
|
|
21
24
|
Features:
|
|
22
25
|
|
|
23
|
-
* Issue #
|
|
24
|
-
* Issue #
|
|
25
|
-
* Issue #
|
|
26
|
-
* Issue #
|
|
27
|
-
* Issue #798 ruboto.yml emulator config (donv)
|
|
28
|
-
* Issue #805 Add support for the new emulator 2.0
|
|
26
|
+
* Issue #815 Add support for Android 7 Nougat
|
|
27
|
+
* Issue #817 Add support for Android 7.1
|
|
28
|
+
* Issue #819 Add support for concurrent-ruby gem
|
|
29
|
+
* Issue #820 Reload scripts with large stack during 'rake boing'
|
|
29
30
|
|
|
30
31
|
Bugfixes:
|
|
31
32
|
|
|
32
|
-
* Issue #
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
* Issue #796 Adds a setting in "ruboto.yml" for the desired
|
|
36
|
-
dex_heap_size (lucasallan)
|
|
37
|
-
* Issue #807 Fix SDK_DOWNLOAD_PAGE link (LucianoPC)
|
|
33
|
+
* Issue #813 ArgumentError creating new emulator image (AVD)
|
|
34
|
+
* Issue #818 Error when creating a new emulator image for an app with
|
|
35
|
+
empty ruboto.yml
|
|
38
36
|
|
|
39
37
|
Support:
|
|
40
38
|
|
|
41
|
-
* Issue #
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
Community:
|
|
47
|
-
|
|
48
|
-
* Issue #666 Set up donations and sponsoring of the Ruboto project
|
|
49
|
-
|
|
50
|
-
Pull requests:
|
|
51
|
-
|
|
52
|
-
* Issue #794 Test ssl (donv)
|
|
53
|
-
* Issue #812 Set ANDROID_EMULATOR_FORCE_32BIT to fix broken build
|
|
54
|
-
(celeduc)
|
|
39
|
+
* Issue #809 [Solved] JRuby 1.7.22 and Crosswalk issue (multidex)
|
|
40
|
+
Verification error in java.io.File[]
|
|
41
|
+
org.jruby.util.JRubyFile.listRoots()
|
|
42
|
+
* Issue #822 How well does Ruboto work with Shoes 4?
|
|
55
43
|
|
|
56
44
|
Internal:
|
|
57
45
|
|
|
58
|
-
* Issue #
|
|
59
|
-
* Issue #
|
|
46
|
+
* Issue #828 More test parts (donv)
|
|
47
|
+
* Issue #829 Use the new authenticated protocol to manage emulators
|
|
60
48
|
|
|
61
49
|
You can find a complete list of issues here:
|
|
62
50
|
|
|
63
|
-
* https://github.com/ruboto/ruboto/issues?state=closed&milestone=
|
|
51
|
+
* https://github.com/ruboto/ruboto/issues?state=closed&milestone=42
|
|
64
52
|
|
|
65
53
|
|
|
66
54
|
Installation:
|
data/Rakefile
CHANGED
|
@@ -538,38 +538,39 @@ task :get_jruby_jars_snapshots do
|
|
|
538
538
|
end
|
|
539
539
|
end
|
|
540
540
|
|
|
541
|
+
def test_parts(api)
|
|
542
|
+
(api == 23) ? 6 : 3
|
|
543
|
+
end
|
|
544
|
+
|
|
541
545
|
task '.travis.yml' do
|
|
542
546
|
puts "Regenerating #{'.travis.yml'}"
|
|
543
547
|
source = File.read('.travis.yml')
|
|
544
|
-
test_parts = 3
|
|
545
548
|
matrix = ''
|
|
546
549
|
allow_failures = ''
|
|
547
550
|
|
|
548
|
-
# FIXME(uwe): JRuby 1.7.13 works for Nettbuss. Keep for 2016.
|
|
549
551
|
# FIXME(uwe): Test all of these that work
|
|
550
552
|
[
|
|
551
553
|
# ['CURRENT', [nil]], # Running standalone is the most important way now
|
|
552
554
|
# ['FROM_GEM', [:MASTER, :STABLE]], # Running standalone is the most important way now
|
|
553
|
-
['STANDALONE', [:MASTER, :STABLE, '1.7.25'
|
|
555
|
+
['STANDALONE', [:MASTER, :STABLE, '1.7.25']],
|
|
554
556
|
].each do |platform, versions|
|
|
555
557
|
versions.each do |v|
|
|
556
558
|
# FIXME(uwe): Test the newest and most common api levels
|
|
557
|
-
# FIXME(uwe): Nettbuss uses api level 15. Keep for 2017.
|
|
558
559
|
# FIXME(uwe): https://github.com/ruboto/ruboto/issues/426
|
|
559
|
-
[23, 22, 21, 19
|
|
560
|
-
(1..test_parts).each do |n|
|
|
561
|
-
line = " - ANDROID_TARGET=#{api} RUBOTO_PLATFORM=#{platform.ljust(10)} TEST_PART=#{n}of#{test_parts}#{" JRUBY_JARS_VERSION=#{v}" if v}\n"
|
|
562
|
-
|
|
563
|
-
next if
|
|
560
|
+
[25, 24, 23, 22, 21, 19].each do |api|
|
|
561
|
+
(1..test_parts(api)).each do |n|
|
|
562
|
+
line = " - ANDROID_TARGET=#{api} RUBOTO_PLATFORM=#{platform.ljust(10)} TEST_PART=#{n}of#{test_parts(api)}#{" JRUBY_JARS_VERSION=#{v}" if v}\n"
|
|
563
|
+
|
|
564
|
+
next if v == :MASTER || v == :STABLE
|
|
565
|
+
next if api == 25 # FIXME(uwe): Remove when Android 7.1 is green. No runnable ABIs on travis.
|
|
566
|
+
# next if api == 24 # FIXME(uwe): Remove when Android 7.0 is green. No space left on device on travis.
|
|
567
|
+
next if api == 23 # FIXME(uwe): Remove when Android 7.0 is green. No space left on device on travis.
|
|
564
568
|
next if api == 22 # FIXME(uwe): Remove when Android 5.1 is green. Must use slow ARM emulator due to missing HAXM.
|
|
565
569
|
next if api == 22 && platform == 'STANDALONE' && v == :STABLE # FIXME(uwe): Remove when Android 5.1 is green. Must use slow ARM emulator due to missing HAXM.
|
|
566
570
|
next if api == 21 # FIXME(uwe): Remove when Android 5.0 is green.
|
|
567
|
-
next if api == 17 # FIXME(uwe): Remove when Android 4.2 is green.
|
|
568
571
|
|
|
569
|
-
if
|
|
570
|
-
|
|
571
|
-
next
|
|
572
|
-
end
|
|
572
|
+
(allow_failures << line.gsub('-', '- env:')) if api == 24 # FIXME(uwe): Remove when Android 6.0 is green. Unable to start emulator on travis.
|
|
573
|
+
|
|
573
574
|
matrix << line
|
|
574
575
|
end
|
|
575
576
|
end
|
data/Vagrantfile
CHANGED
|
@@ -27,7 +27,7 @@ Vagrant.configure(2) do |config|
|
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
config.vm.define 'ubuntu' do |ubuntu|
|
|
30
|
-
ubuntu.vm.box = 'ubuntu/
|
|
30
|
+
ubuntu.vm.box = 'ubuntu/precise64'
|
|
31
31
|
ubuntu.vm.provision :shell, inline: create_swap(1536)
|
|
32
32
|
ubuntu.vm.provision :shell, inline: <<-SHELL
|
|
33
33
|
sudo apt-get -y install git libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 lib32z1
|
|
@@ -36,6 +36,7 @@ Vagrant.configure(2) do |config|
|
|
|
36
36
|
su - vagrant -c 'mkdir -p ruboto'
|
|
37
37
|
su - vagrant -c 'rsync -acPuv --exclude adb_logcat.log --exclude /tmp /vagrant/* ruboto/'
|
|
38
38
|
sudo apt-get -y autoremove
|
|
39
|
+
sudo timedatectl set-timezone #{Time.now.zone}
|
|
39
40
|
SHELL
|
|
40
41
|
end
|
|
41
42
|
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
# Methods for package installation
|
|
4
4
|
#
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
# Android 7.1: -rw-r--r-- 1 system system 9462614 2016-11-24 13:20 /data/app/org.ruboto.test_app-1/base.apk
|
|
7
|
+
# Android 6.0: -rw-r--r-- system system 9462797 2016-11-24 13:05 base.apk
|
|
8
|
+
APK_FILE_REGEXP = /^-rw-r--r--(?:\s+\d+)?\s+(?:system|\d+\s+\d+)\s+(?:system|\d+)\s+(\d+)\s+(\d{4}-\d{2}-\d{2} \d{2}:\d{2}|\w{3} \d{2}\s+(?:\d{4}|\d{2}:\d{2}))\s+(.*)$/
|
|
7
9
|
PROJECT_DIR = File.expand_path('..', File.dirname(__FILE__))
|
|
8
10
|
UPDATE_MARKER_FILE = File.join(PROJECT_DIR, 'bin', 'LAST_UPDATE')
|
|
9
11
|
|
|
@@ -15,8 +17,8 @@ def package_installed?(package_name, apk_file)
|
|
|
15
17
|
loop do
|
|
16
18
|
path_line = `adb shell pm path #{package_name}`.chomp
|
|
17
19
|
path_line.gsub! /^WARNING:.*$/, ''
|
|
18
|
-
return nil if $?
|
|
19
|
-
break if
|
|
20
|
+
return nil if $? != 0 || path_line.empty?
|
|
21
|
+
break if path_line =~ /^package:(.*)$/
|
|
20
22
|
puts path_line
|
|
21
23
|
sleep 0.5
|
|
22
24
|
end
|
|
@@ -58,8 +60,8 @@ def clear_update(package, apk_file)
|
|
|
58
60
|
end
|
|
59
61
|
|
|
60
62
|
def device_path_exists?(path)
|
|
61
|
-
path_output
|
|
62
|
-
path_output.
|
|
63
|
+
path_output = `adb shell ls #{path} 2>&1`.chomp
|
|
64
|
+
path_output.empty? || path_output !~ /No such file or directory|opendir failed, Permission denied/
|
|
63
65
|
end
|
|
64
66
|
|
|
65
67
|
def wait_for_valid_device
|
|
@@ -70,73 +72,86 @@ def wait_for_valid_device
|
|
|
70
72
|
end
|
|
71
73
|
end
|
|
72
74
|
|
|
75
|
+
# Synchronize device system time with development system time.
|
|
76
|
+
def set_device_time
|
|
77
|
+
# TODO: (uwe) Remove when we stop supporting Android 6.0 and older
|
|
78
|
+
if sdk_level <= 23
|
|
79
|
+
return sh "adb shell date -s #{Time.now.strftime '%Y%m%d.%H%M%S'}"
|
|
80
|
+
end
|
|
81
|
+
# ODOT
|
|
82
|
+
|
|
83
|
+
sh "adb shell date +'%Y%m%d.%H%M%S' #{Time.now.strftime '%Y%m%d.%H%M%S'}"
|
|
84
|
+
end
|
|
85
|
+
|
|
73
86
|
def install_apk(package, apk_file)
|
|
74
87
|
wait_for_valid_device
|
|
75
|
-
|
|
76
88
|
failure_pattern = /^Failure \[(.*)\]/
|
|
77
89
|
success_pattern = /^Success/
|
|
78
|
-
install_timeout =
|
|
90
|
+
install_timeout = 5 * 60
|
|
79
91
|
case package_installed?(package, apk_file)
|
|
80
92
|
when true
|
|
81
93
|
puts "Package #{package} already installed."
|
|
82
94
|
return
|
|
83
95
|
when false
|
|
84
|
-
puts "Package #{package} already installed, but of different size or timestamp.
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
96
|
+
puts "Package #{package} already installed, but of different size or timestamp."
|
|
97
|
+
replace_apk = true
|
|
98
|
+
else
|
|
99
|
+
# Package not installed.
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
set_device_time
|
|
103
|
+
output = nil
|
|
104
|
+
5.times do |install_retry_count|
|
|
105
|
+
if install_retry_count > 0
|
|
106
|
+
puts output
|
|
107
|
+
puts 'Retrying install...'
|
|
108
|
+
end
|
|
109
|
+
# replace_apk ||= install_retry_count >= 3
|
|
110
|
+
puts "#{replace_apk ? 'Replacing' : 'Installing'} package #{package}"
|
|
111
|
+
|
|
112
|
+
install_start = Time.now
|
|
88
113
|
begin
|
|
89
114
|
Timeout.timeout install_timeout do
|
|
90
|
-
output = `adb install -r "#{apk_file}" 2>&1`
|
|
115
|
+
output = `adb install #{'-r' if replace_apk} "#{apk_file}" 2>&1`
|
|
91
116
|
end
|
|
92
117
|
rescue Timeout::Error
|
|
93
118
|
puts "Installing package #{package} timed out after #{install_timeout}s."
|
|
94
|
-
|
|
95
|
-
if install_retry_count <= 3
|
|
96
|
-
puts 'Retrying install...'
|
|
97
|
-
retry
|
|
98
|
-
end
|
|
99
|
-
puts 'Trying one final time to install the package:'
|
|
100
|
-
output = `adb install -r "#{apk_file}" 2>&1`
|
|
119
|
+
next
|
|
101
120
|
end
|
|
121
|
+
|
|
102
122
|
if $? == 0 && output !~ failure_pattern && output =~ success_pattern
|
|
123
|
+
puts "Install took #{(Time.now - install_start).to_i}s."
|
|
103
124
|
clear_update(package, apk_file)
|
|
104
125
|
return
|
|
105
126
|
end
|
|
106
127
|
case $1
|
|
107
128
|
when 'INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES'
|
|
108
129
|
puts 'Found package signed with different certificate. Uninstalling it and retrying install.'
|
|
130
|
+
when 'INSTALL_FAILED_INVALID_URI', %r{failed to copy '(?:.*)' to '(.*)/RubotoTestApp-debug.apk': Read-only file system}
|
|
131
|
+
push_dir = $1 || '/data/local/tmp'
|
|
132
|
+
puts "Maybe wrong write permissions for APK push directory #{push_dir.inspect}. Changing permissions."
|
|
133
|
+
puts `adb shell ls -l #{File.dirname(push_dir)}`
|
|
134
|
+
puts `adb shell chmod a+rwx #{push_dir}`
|
|
135
|
+
puts `adb shell ls -l #{File.dirname(push_dir)}`
|
|
136
|
+
when 'INSTALL_FAILED_ALREADY_EXISTS'
|
|
137
|
+
puts 'Package allready exists.'
|
|
138
|
+
if replace_apk
|
|
139
|
+
puts 'Uninstalling package.'
|
|
140
|
+
else
|
|
141
|
+
replace_apk = true
|
|
142
|
+
next
|
|
143
|
+
end
|
|
109
144
|
else
|
|
110
145
|
puts "'adb install' returned an unknown error: (#$?) #{$1 ? "[#$1}]" : output}."
|
|
111
146
|
puts "Uninstalling #{package} and retrying install."
|
|
112
147
|
end
|
|
148
|
+
|
|
113
149
|
uninstall_apk(package, apk_file)
|
|
114
|
-
|
|
115
|
-
# Package not installed.
|
|
116
|
-
sh "adb shell date -s #{Time.now.strftime '%Y%m%d.%H%M%S'}"
|
|
150
|
+
replace_apk = false
|
|
117
151
|
end
|
|
118
|
-
|
|
119
|
-
output = nil
|
|
120
|
-
install_retry_count = 0
|
|
121
|
-
begin
|
|
122
|
-
Timeout.timeout install_timeout do
|
|
123
|
-
output = `adb install "#{apk_file}" 2>&1`
|
|
124
|
-
end
|
|
125
|
-
rescue Timeout::Error
|
|
126
|
-
puts "Installing package #{package} timed out after #{install_timeout}s."
|
|
127
|
-
install_retry_count += 1
|
|
128
|
-
if install_retry_count <= 3
|
|
129
|
-
puts 'Retrying install...'
|
|
130
|
-
retry
|
|
131
|
-
end
|
|
132
|
-
puts 'Trying one final time to install the package:'
|
|
133
|
-
install_start = Time.now
|
|
134
|
-
output = `adb install "#{apk_file}" 2>&1`
|
|
135
|
-
puts "Install took #{(Time.now - install_start).to_i}s."
|
|
136
|
-
end
|
|
137
|
-
puts output
|
|
138
|
-
raise "Install failed (#{$?}) #{$1 ? "[#$1}]" : output}" if $? != 0 || output =~ failure_pattern || output !~ success_pattern
|
|
152
|
+
|
|
139
153
|
clear_update(package, apk_file)
|
|
154
|
+
raise "Install failed (#{$?}) #{$1 ? "[#$1}]" : output}"
|
|
140
155
|
end
|
|
141
156
|
|
|
142
157
|
def uninstall_apk(package_name, apk_file)
|
data/assets/rakelib/ruboto.rake
CHANGED
|
@@ -231,16 +231,8 @@ file File.basename(MANIFEST_FILE) => MANIFEST_FILE
|
|
|
231
231
|
file MANIFEST_FILE => PROJECT_PROPS_FILE do
|
|
232
232
|
old_manifest = File.read(MANIFEST_FILE)
|
|
233
233
|
manifest = old_manifest.dup
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
if sdk_level == 21
|
|
237
|
-
manifest.sub!(/(android:minSdkVersion=').*?(')/) { "#{$1}L#{$2}" }
|
|
238
|
-
manifest.sub!(/(android:targetSdkVersion=').*?(')/) { "#{$1}L#{$2}" }
|
|
239
|
-
else
|
|
240
|
-
manifest.sub!(/(android:minSdkVersion=').*?(')/) { "#{$1}#{sdk_level}#{$2}" }
|
|
241
|
-
manifest.sub!(/(android:targetSdkVersion=').*?(')/) { "#{$1}#{sdk_level}#{$2}" }
|
|
242
|
-
end
|
|
243
|
-
# EMXIF
|
|
234
|
+
manifest.sub!(/(android:minSdkVersion=').*?(')/) { "#{$1}#{sdk_level}#{$2}" }
|
|
235
|
+
manifest.sub!(/(android:targetSdkVersion=').*?(')/) { "#{$1}#{sdk_level}#{$2}" }
|
|
244
236
|
|
|
245
237
|
if manifest != old_manifest
|
|
246
238
|
puts "\nUpdating #{File.basename MANIFEST_FILE} with target from #{File.basename PROJECT_PROPS_FILE}\n\n"
|
|
@@ -820,6 +812,24 @@ rescue Exception
|
|
|
820
812
|
puts $!
|
|
821
813
|
puts $!.backtrace.join("\n")
|
|
822
814
|
raise
|
|
815
|
+
end
|
|
816
|
+
END_CODE
|
|
817
|
+
elsif jar =~ %r{concurrent_ruby_ext.jar$}
|
|
818
|
+
puts "Adding JRuby extension library initialization."
|
|
819
|
+
jar_load_code = <<-END_CODE
|
|
820
|
+
require 'jruby'
|
|
821
|
+
puts 'Starting ConcurrentRubyExtService'
|
|
822
|
+
public
|
|
823
|
+
begin
|
|
824
|
+
with_large_stack(2048) do
|
|
825
|
+
Java::ConcurrentRubyExtService.new.basicLoad(JRuby.runtime)
|
|
826
|
+
end
|
|
827
|
+
rescue Exception
|
|
828
|
+
puts "Exception starting ConcurrentRubyExtService"
|
|
829
|
+
puts "\#{$!.class} \#{$!.message}"
|
|
830
|
+
puts $!
|
|
831
|
+
puts $!.backtrace.join("\n")
|
|
832
|
+
raise
|
|
823
833
|
end
|
|
824
834
|
END_CODE
|
|
825
835
|
else
|
|
@@ -920,7 +930,7 @@ end
|
|
|
920
930
|
# Methods
|
|
921
931
|
|
|
922
932
|
def sdk_level
|
|
923
|
-
File.read(PROJECT_PROPS_FILE).scan(/(?:target=android-)(\d+)/)[0][0].to_i
|
|
933
|
+
File.read(PROJECT_PROPS_FILE).scan(/(?:target=(?:android|google_apis)-)(\d+)/)[0][0].to_i
|
|
924
934
|
end
|
|
925
935
|
|
|
926
936
|
def strings(name)
|
|
@@ -259,22 +259,6 @@ def cleanup_jars
|
|
|
259
259
|
Java::json.ext.ParserService.new.basicLoad(JRuby.runtime)
|
|
260
260
|
END_CODE
|
|
261
261
|
elsif j =~ %r{jopenssl.jar$}
|
|
262
|
-
# FIXME(uwe): Use our own patched version of OpenSSL until jruby-openssl 0.9.16 is released
|
|
263
|
-
# FIXME(uwe): Remove before Ruboto release!
|
|
264
|
-
# FIXME(uwe): Remove after jruby-openssl 0.9.16 is added to the jruby-1_7 branch
|
|
265
|
-
if File.exists? 'org/jruby/ext/openssl/OpenSSL.class'
|
|
266
|
-
puts '*' * 80
|
|
267
|
-
puts 'Patching OpenSSL'
|
|
268
|
-
FileUtils.rm 'org/jruby/ext/openssl/OpenSSL.class'
|
|
269
|
-
FileUtils.mkdir_p '../../../src/org/jruby/ext/openssl'
|
|
270
|
-
# require 'ruboto'
|
|
271
|
-
# FileUtils.cp "#{Ruboto::ASSETS}/src/org/jruby/ext/openssl/OpenSSL.java",
|
|
272
|
-
# '../../../src/org/jruby/ext/openssl/OpenSSL.java'
|
|
273
|
-
FileUtils.cp File.expand_path('../../../assets/src/org/jruby/ext/openssl/OpenSSL.java', File.dirname(__FILE__)),
|
|
274
|
-
'../../../src/org/jruby/ext/openssl/OpenSSL.java'
|
|
275
|
-
puts '*' * 80
|
|
276
|
-
end
|
|
277
|
-
# EMXIF
|
|
278
262
|
jar_load_code = <<-END_CODE
|
|
279
263
|
require 'jruby'
|
|
280
264
|
puts 'Starting JOpenSSL Service'
|
|
@@ -44,9 +44,11 @@ module Ruboto::Activity::Reload
|
|
|
44
44
|
if file_string
|
|
45
45
|
scripts_dir = @activity.getExternalFilesDir(nil).absolute_path + '/scripts'
|
|
46
46
|
files = file_string.split(/(?<!&);/).map { |f| f.gsub(/&(.)/) { |m| m[1] } }
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
with_large_stack(size: 256) do
|
|
48
|
+
files.each do |file|
|
|
49
|
+
Log.d "load file: #{scripts_dir}/#{file}"
|
|
50
|
+
load "#{scripts_dir}/#{file}"
|
|
51
|
+
end
|
|
50
52
|
end
|
|
51
53
|
Log.d 'restart activity'
|
|
52
54
|
if @activity.intent.action == android.content.Intent::ACTION_MAIN ||
|
|
@@ -31,8 +31,8 @@ class Thread
|
|
|
31
31
|
block_with_logging = proc do
|
|
32
32
|
begin
|
|
33
33
|
block.call
|
|
34
|
-
rescue Exception
|
|
35
|
-
STDERR.puts "Exception in #{name}: #{
|
|
34
|
+
rescue Exception => e
|
|
35
|
+
STDERR.puts "Exception in #{name}: #{e.class} #{e}\n#{e.backtrace.join("\n")}"
|
|
36
36
|
raise
|
|
37
37
|
end
|
|
38
38
|
end
|
|
@@ -16,6 +16,10 @@ def assert_less_than_or_equal(limit, actual, message = nil)
|
|
|
16
16
|
raise "#{"#{message}\n" if message}Expected '#{actual}' to be less than or equal to '#{limit}'" unless actual <= limit
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
def
|
|
19
|
+
def assert_match(pattern, actual, message = nil)
|
|
20
20
|
raise "#{"#{message}\n" if message}'#{pattern}' expected, but got '#{actual}'" unless pattern =~ actual
|
|
21
21
|
end
|
|
22
|
+
def assert_matches(*args)
|
|
23
|
+
warn '"assert_matches" is deprecated. Use "assert_match" instead, for Minitest compatibility.'
|
|
24
|
+
assert_match(*args)
|
|
25
|
+
end
|
data/lib/ruboto/commands/base.rb
CHANGED
|
@@ -19,10 +19,10 @@ module Ruboto
|
|
|
19
19
|
include Ruboto::SdkVersions
|
|
20
20
|
include Ruboto::Util::Verify
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
API_LEVEL_PATTERN = /^(android|google_apis)-(\d+)$/
|
|
23
|
+
API_NUMBER_PATTERN = /(\d+)/
|
|
24
|
+
VERSION_HELP_TEXT = "(e.g., 'android-19' or '19' for kitkat, " \
|
|
25
|
+
"'google_apis-23' for Android 6.0 with Google APIs)"
|
|
26
26
|
|
|
27
27
|
def self.main
|
|
28
28
|
Main do
|
|
@@ -51,17 +51,16 @@ module Ruboto
|
|
|
51
51
|
argument :required
|
|
52
52
|
description 'Path to where you want your app. Defaults to the last part of the package name.'
|
|
53
53
|
}
|
|
54
|
-
# FIXME(uwe): Change to cast to integer for better comparison
|
|
55
54
|
option('target', 't') {
|
|
56
55
|
argument :required
|
|
57
56
|
defaults DEFAULT_TARGET_SDK
|
|
58
|
-
description "Android version to target
|
|
57
|
+
description "Android version to target #{VERSION_HELP_TEXT}"
|
|
59
58
|
cast { |t| t =~ API_NUMBER_PATTERN ? "android-#$1" : t }
|
|
60
59
|
validate { |t| t =~ API_LEVEL_PATTERN }
|
|
61
60
|
}
|
|
62
61
|
option('min-sdk') {
|
|
63
62
|
argument :required
|
|
64
|
-
description "Minimum android version supported.
|
|
63
|
+
description "Minimum android version supported. #{VERSION_HELP_TEXT}"
|
|
65
64
|
cast { |t| t =~ API_NUMBER_PATTERN ? "android-#$1" : t }
|
|
66
65
|
validate { |t| t =~ API_LEVEL_PATTERN }
|
|
67
66
|
}
|
|
@@ -95,11 +94,13 @@ module Ruboto
|
|
|
95
94
|
force = params['force'].value
|
|
96
95
|
|
|
97
96
|
abort "Path (#{path}) must be to a directory that does not yet exist. It will be created." if !force && File.exists?(path)
|
|
98
|
-
|
|
97
|
+
unless target =~ API_LEVEL_PATTERN
|
|
98
|
+
abort "Target must match #{API_LEVEL_PATTERN}: got #{target}"
|
|
99
|
+
end
|
|
99
100
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
101
|
+
if $2.to_i < MINIMUM_SUPPORTED_SDK_LEVEL
|
|
102
|
+
abort "Minimum Android api level is #{MINIMUM_SUPPORTED_SDK}: got #{target}"
|
|
103
|
+
end
|
|
103
104
|
|
|
104
105
|
root = File.expand_path(path)
|
|
105
106
|
puts "\nGenerating Android app #{name} in #{root}..."
|
|
@@ -359,7 +360,7 @@ module Ruboto
|
|
|
359
360
|
# FIXME(uwe): Change to cast to integer for better comparison
|
|
360
361
|
option('target', 't') {
|
|
361
362
|
argument :required
|
|
362
|
-
description "Android version to target
|
|
363
|
+
description "Android version to target #{VERSION_HELP_TEXT}"
|
|
363
364
|
cast { |t| t =~ API_NUMBER_PATTERN ? "android-#$1" : t }
|
|
364
365
|
validate { |t| t =~ API_LEVEL_PATTERN }
|
|
365
366
|
}
|
|
@@ -387,11 +388,13 @@ module Ruboto
|
|
|
387
388
|
end
|
|
388
389
|
|
|
389
390
|
if (target = params['target'].value)
|
|
390
|
-
|
|
391
|
+
unless target =~ API_LEVEL_PATTERN
|
|
392
|
+
abort "Target must match #{API_LEVEL_PATTERN}: got #{target}"
|
|
393
|
+
end
|
|
391
394
|
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
+
unless $2.to_i >= MINIMUM_SUPPORTED_SDK_LEVEL
|
|
396
|
+
abort "Minimum Android api level is #{MINIMUM_SUPPORTED_SDK}: got #{target}"
|
|
397
|
+
end
|
|
395
398
|
|
|
396
399
|
target_level = target[API_NUMBER_PATTERN]
|
|
397
400
|
update_android(target_level)
|
|
@@ -437,7 +440,7 @@ module Ruboto
|
|
|
437
440
|
include Ruboto::Util::Setup
|
|
438
441
|
|
|
439
442
|
option('target', 't') {
|
|
440
|
-
description
|
|
443
|
+
description "sets the target Android API level to set up for #{VERSION_HELP_TEXT}"
|
|
441
444
|
argument :required
|
|
442
445
|
default DEFAULT_TARGET_SDK
|
|
443
446
|
arity -1
|
|
@@ -482,11 +485,10 @@ module Ruboto
|
|
|
482
485
|
argument :required
|
|
483
486
|
default(api_level) if api_level
|
|
484
487
|
cast { |t| t =~ API_NUMBER_PATTERN ? "android-#$1" : t }
|
|
485
|
-
validate { |t| t =~ API_LEVEL_PATTERN && sdk_level_name($
|
|
488
|
+
validate { |t| t =~ API_LEVEL_PATTERN && sdk_level_name($2.to_i) }
|
|
486
489
|
}
|
|
487
490
|
|
|
488
491
|
option('no-snapshot', 's') {
|
|
489
|
-
extend Ruboto::Util::Emulator
|
|
490
492
|
description 'do not use a snapshot when starting the emulator'
|
|
491
493
|
}
|
|
492
494
|
|
data/lib/ruboto/sdk_versions.rb
CHANGED
|
@@ -7,17 +7,17 @@ module Ruboto
|
|
|
7
7
|
'3.0' => 11, '3.1' => 12, '3.2' => 13, '4.0.1' => 14, '4.0.3' => 15,
|
|
8
8
|
'4.0.4' => 15, '4.1' => 16, '4.1.1' => 16, '4.1.2' => 16, '4.2' => 17,
|
|
9
9
|
'4.2.2' => 17, '4.3' => 18, '4.3.1' => 18, '4.4.2' => 19, '5.0.1' => 21,
|
|
10
|
-
'5.1' => 22, '6.0' => 23
|
|
10
|
+
'5.1' => 22, '6.0' => 23, '7.0' => 24, '7.1.1' => 25
|
|
11
11
|
}
|
|
12
12
|
API_LEVEL_TO_VERSION = {
|
|
13
13
|
10 => '2.3.3', 11 => '3.0', 12 => '3.1', 13 => '3.2', 14 => '4.0',
|
|
14
14
|
15 => '4.0.3', 16 => '4.1.2', 17 => '4.2.2', 18 => '4.3.1',
|
|
15
|
-
19 => '4.4.2', 21 => '5.0.1', 22 => '5.1', 23 => '6.0'
|
|
15
|
+
19 => '4.4.2', 21 => '5.0.1', 22 => '5.1', 23 => '6.0', 24 => '7.0', 25 => '7.1.1'
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
MINIMUM_SUPPORTED_SDK_LEVEL = 15
|
|
19
19
|
MINIMUM_SUPPORTED_SDK = "android-#{MINIMUM_SUPPORTED_SDK_LEVEL}"
|
|
20
|
-
DEFAULT_TARGET_SDK_LEVEL =
|
|
20
|
+
DEFAULT_TARGET_SDK_LEVEL = 19
|
|
21
21
|
DEFAULT_TARGET_SDK = "android-#{DEFAULT_TARGET_SDK_LEVEL}"
|
|
22
22
|
end
|
|
23
23
|
end
|
data/lib/ruboto/util/emulator.rb
CHANGED
|
@@ -10,7 +10,6 @@ module Ruboto
|
|
|
10
10
|
ON_WINDOWS = (RbConfig::CONFIG['host_os'] =~ /mswin|mingw/i)
|
|
11
11
|
ON_MAC_OS_X = RbConfig::CONFIG['host_os'] =~ /^darwin/
|
|
12
12
|
ON_LINUX = RbConfig::CONFIG['host_os'] =~ /linux/
|
|
13
|
-
ON_TRAVIS = ENV['TRAVIS'] == 'true'
|
|
14
13
|
|
|
15
14
|
def sdk_level_name(sdk_level)
|
|
16
15
|
Ruboto::SdkVersions::API_LEVEL_TO_VERSION[sdk_level.to_i] || sdk_level
|
|
@@ -21,7 +20,7 @@ module Ruboto
|
|
|
21
20
|
STDOUT.sync = true
|
|
22
21
|
if RbConfig::CONFIG['host_cpu'] == 'x86_64'
|
|
23
22
|
if ON_MAC_OS_X
|
|
24
|
-
emulator_cmd = '-m "emulator64-(crash-service|arm|x86)"'
|
|
23
|
+
emulator_cmd = '-m "emulator64-(crash-service|arm|x86)|qemu-system-x86_64"'
|
|
25
24
|
elsif ON_LINUX
|
|
26
25
|
emulator_cmd = '-r "emulator64-(arm|x86)"'
|
|
27
26
|
else
|
|
@@ -36,24 +35,45 @@ module Ruboto
|
|
|
36
35
|
android_device = (emulator_config && emulator_config['device']) || "Nexus One"
|
|
37
36
|
new_snapshot = false
|
|
38
37
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
38
|
+
running_emulators = `adb devices`.scan(/emulator-(\d+)/)
|
|
39
|
+
if running_emulators.any?
|
|
40
|
+
desired_emulator_is_running = false
|
|
41
|
+
running_emulators.each do |port, _|
|
|
42
|
+
t = Net::Telnet.new('Host' => 'localhost', 'Port' => port, 'Prompt' => /^OK\n|^KO:/)
|
|
43
|
+
begin
|
|
44
|
+
intro = t.waitfor(/^OK\n/)
|
|
45
|
+
rescue Net::ReadTimeout
|
|
46
|
+
puts "Timeout waiting for emulator intro."
|
|
47
|
+
kill_emulator(t)
|
|
48
|
+
next
|
|
49
|
+
end
|
|
50
|
+
if %r{Android Console: you can find your <auth_token> in\s+'(?<auth_file>.*)'} =~ intro
|
|
51
|
+
auth_token = File.read auth_file
|
|
52
|
+
t.cmd("auth #{auth_token}")
|
|
53
|
+
end
|
|
54
|
+
output = t.cmd('avd name')
|
|
55
|
+
if output =~ /(.*)\nOK\n/
|
|
56
|
+
running_avd_name = $1
|
|
57
|
+
if running_avd_name == avd_name
|
|
58
|
+
if desired_emulator_is_running
|
|
59
|
+
puts "Stopping duplicate #{running_avd_name} emulator."
|
|
60
|
+
kill_emulator(t)
|
|
61
|
+
else
|
|
62
|
+
puts "Emulator #{avd_name} is already running."
|
|
63
|
+
desired_emulator_is_running = true
|
|
64
|
+
end
|
|
65
|
+
else
|
|
66
|
+
puts "Stopping #{running_avd_name} emulator."
|
|
67
|
+
kill_emulator(t)
|
|
68
|
+
end
|
|
50
69
|
else
|
|
51
|
-
puts "
|
|
70
|
+
puts "Unexpected response from emulator: #{output.inspect}"
|
|
71
|
+
puts 'Assuming wrong emulator is running.'
|
|
72
|
+
kill_emulator(t)
|
|
52
73
|
end
|
|
53
|
-
|
|
54
|
-
puts "Unexpected response from emulator: #{output.inspect}"
|
|
55
|
-
puts 'Assuming wrong emulator is running.'
|
|
74
|
+
t.close
|
|
56
75
|
end
|
|
76
|
+
return if desired_emulator_is_running
|
|
57
77
|
else
|
|
58
78
|
puts 'No emulator is running.'
|
|
59
79
|
end
|
|
@@ -64,32 +84,11 @@ module Ruboto
|
|
|
64
84
|
emulator_opts << ' -noskin' unless android_device
|
|
65
85
|
emulator_opts << ' -no-snapshot' if no_snapshot
|
|
66
86
|
if !ON_MAC_OS_X && !ON_WINDOWS && ENV['DISPLAY'].nil?
|
|
67
|
-
emulator_opts << ' -no-window
|
|
87
|
+
emulator_opts << ' -no-window'
|
|
88
|
+
ENV['QEMU_AUDIO_DRV'] = 'none'
|
|
68
89
|
end
|
|
69
90
|
|
|
70
|
-
|
|
71
|
-
if $? == 0
|
|
72
|
-
`killall #{emulator_cmd}`
|
|
73
|
-
10.times do |i|
|
|
74
|
-
`killall -0 #{emulator_cmd} 2> /dev/null`
|
|
75
|
-
if $? != 0
|
|
76
|
-
break
|
|
77
|
-
end
|
|
78
|
-
if i == 3
|
|
79
|
-
print 'Waiting for emulator to die: ...'
|
|
80
|
-
elsif i > 3
|
|
81
|
-
print '.'
|
|
82
|
-
end
|
|
83
|
-
sleep 1
|
|
84
|
-
end
|
|
85
|
-
puts
|
|
86
|
-
`killall -0 #{emulator_cmd} 2> /dev/null`
|
|
87
|
-
if $? == 0
|
|
88
|
-
puts 'Emulator still running.'
|
|
89
|
-
`killall -9 #{emulator_cmd}`
|
|
90
|
-
sleep 1
|
|
91
|
-
end
|
|
92
|
-
end
|
|
91
|
+
kill_all_emulators(emulator_cmd)
|
|
93
92
|
|
|
94
93
|
avd_home = "#{ENV['HOME'].gsub('\\', '/')}/.android/avd/#{avd_name}.avd"
|
|
95
94
|
manifest_file = 'AndroidManifest.xml'
|
|
@@ -104,7 +103,13 @@ module Ruboto
|
|
|
104
103
|
end
|
|
105
104
|
|
|
106
105
|
puts "Start emulator #{avd_name}#{' without snapshot' if no_snapshot}"
|
|
107
|
-
|
|
106
|
+
start_cmd = "emulator -avd #{avd_name} #{emulator_opts} #{'&' unless ON_WINDOWS}"
|
|
107
|
+
|
|
108
|
+
# FIXME: (uwe) Remove debug
|
|
109
|
+
puts start_cmd
|
|
110
|
+
# EMXIF
|
|
111
|
+
|
|
112
|
+
system start_cmd
|
|
108
113
|
return if ON_WINDOWS
|
|
109
114
|
|
|
110
115
|
3.times do |i|
|
|
@@ -193,6 +198,40 @@ EOF
|
|
|
193
198
|
puts "Emulator #{avd_name} started OK."
|
|
194
199
|
end
|
|
195
200
|
|
|
201
|
+
def kill_emulator(telnet)
|
|
202
|
+
begin
|
|
203
|
+
telnet.cmd('kill')
|
|
204
|
+
rescue Errno::ECONNRESET
|
|
205
|
+
puts "Emulator reset connection."
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def kill_all_emulators(emulator_cmd)
|
|
210
|
+
`killall -0 #{emulator_cmd} 2> /dev/null`
|
|
211
|
+
if $? == 0
|
|
212
|
+
`killall #{emulator_cmd}`
|
|
213
|
+
10.times do |i|
|
|
214
|
+
`killall -0 #{emulator_cmd} 2> /dev/null`
|
|
215
|
+
if $? != 0
|
|
216
|
+
break
|
|
217
|
+
end
|
|
218
|
+
if i == 3
|
|
219
|
+
print 'Waiting for emulator to die: ...'
|
|
220
|
+
elsif i > 3
|
|
221
|
+
print '.'
|
|
222
|
+
end
|
|
223
|
+
sleep 1
|
|
224
|
+
end
|
|
225
|
+
puts
|
|
226
|
+
`killall -0 #{emulator_cmd} 2> /dev/null`
|
|
227
|
+
if $? == 0
|
|
228
|
+
puts 'Emulator still running.'
|
|
229
|
+
`killall -9 #{emulator_cmd}`
|
|
230
|
+
sleep 1
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
196
235
|
def create_avd(avd_home, avd_name, android_device, heap_size, sdk_level)
|
|
197
236
|
puts "Creating AVD #{avd_name}"
|
|
198
237
|
|
|
@@ -206,6 +245,7 @@ EOF
|
|
|
206
245
|
end
|
|
207
246
|
|
|
208
247
|
abis = target.slice(/(?<=ABIs : ).*/).split(', ')
|
|
248
|
+
puts "Available abis: #{abis.inspect}"
|
|
209
249
|
has_x86 = abis.find { |a| a =~ /x86/ }
|
|
210
250
|
has_x86_64 = has_x86 && abis.find { |a| a =~ /x86_64/ }
|
|
211
251
|
|
|
@@ -213,23 +253,28 @@ EOF
|
|
|
213
253
|
# FIXME(uwe): or the x86(_64) emulators don't require HAXM anymore
|
|
214
254
|
# Newer Android SDK tools (V24) require HAXM to run x86 emulators.
|
|
215
255
|
# HAXM is not available on travis-ci.
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
256
|
+
avoid_x86 = ON_TRAVIS && sdk_level.to_i >= 22
|
|
257
|
+
if avoid_x86
|
|
258
|
+
abis.reject!{|a| a =~ /x86/}
|
|
259
|
+
has_x86_64 = nil
|
|
260
|
+
has_x86 = nil
|
|
261
|
+
end
|
|
262
|
+
# EMXIF
|
|
263
|
+
|
|
264
|
+
if has_x86
|
|
220
265
|
if has_x86_64
|
|
221
|
-
abi_opt =
|
|
266
|
+
abi_opt = "--abi #{has_x86_64}"
|
|
222
267
|
else
|
|
223
|
-
abi_opt =
|
|
268
|
+
abi_opt = "--abi #{has_x86}"
|
|
224
269
|
end
|
|
225
270
|
else
|
|
226
|
-
abi_opt =
|
|
271
|
+
abi_opt = "--abi #{abis.first || 'armeabi-v7a'}"
|
|
227
272
|
end
|
|
228
273
|
|
|
229
274
|
ruboto_config_filename = 'ruboto.yml'
|
|
230
275
|
if File.exists?(ruboto_config_filename)
|
|
231
276
|
ruboto_config = YAML.load_file(ruboto_config_filename)
|
|
232
|
-
skin = ruboto_config['emulator'] && ruboto_config['emulator']['skin']
|
|
277
|
+
skin = ruboto_config && ruboto_config['emulator'] && ruboto_config['emulator']['skin']
|
|
233
278
|
end
|
|
234
279
|
skin ||= '768x1280'
|
|
235
280
|
# skin_filename = "#{Ruboto::SdkLocations::ANDROID_HOME}/platforms/android-#{sdk_level}/skins/#{skin}/hardware.ini"
|
|
@@ -241,7 +286,7 @@ EOF
|
|
|
241
286
|
# File.write(skin_filename, new_skin_config) if new_skin_config != old_skin_config
|
|
242
287
|
# end
|
|
243
288
|
|
|
244
|
-
puts `echo no | android create avd -a -n #{avd_name} -t android-#{sdk_level} #{abi_opt} -c 64M #{"-s #{skin}" if skin} -d "#{android_device}"`
|
|
289
|
+
puts `echo no | android create avd #{'-a' unless avoid_x86} -n #{avd_name} -t android-#{sdk_level} #{abi_opt} -c 64M #{"-s #{skin}" if skin} -d "#{android_device}"`
|
|
245
290
|
|
|
246
291
|
if $? != 0
|
|
247
292
|
puts 'Failed to create AVD.'
|
|
@@ -265,7 +310,7 @@ EOF
|
|
|
265
310
|
end
|
|
266
311
|
end
|
|
267
312
|
|
|
268
|
-
def patch_config_ini(avd_home, heap_size, no_snapshot)
|
|
313
|
+
def patch_config_ini(avd_home, heap_size, no_snapshot = nil)
|
|
269
314
|
avd_config_file_name = "#{avd_home}/config.ini"
|
|
270
315
|
old_avd_config = File.read(avd_config_file_name)
|
|
271
316
|
new_avd_config = old_avd_config.dup
|
|
@@ -276,12 +321,14 @@ EOF
|
|
|
276
321
|
# add_property(new_avd_config, 'hw.lcd.density', '160')
|
|
277
322
|
add_property(new_avd_config, 'hw.mainKeys', 'no')
|
|
278
323
|
# add_property(new_avd_config, 'hw.sdCard', 'yes')
|
|
279
|
-
|
|
324
|
+
unless no_snapshot.nil?
|
|
325
|
+
add_property(new_avd_config, 'snapshot.present', (!no_snapshot).to_s)
|
|
326
|
+
end
|
|
280
327
|
File.write(avd_config_file_name, new_avd_config) if new_avd_config != old_avd_config
|
|
281
328
|
end
|
|
282
329
|
|
|
283
330
|
def device_ready?
|
|
284
|
-
`adb get-state`.gsub(/^WARNING:.*$/, '').chomp == 'device'
|
|
331
|
+
`adb get-state 2>&1`.gsub(/^WARNING:.*$/, '').chomp == 'device'
|
|
285
332
|
end
|
|
286
333
|
|
|
287
334
|
def read_property(config, property_name)
|
data/lib/ruboto/util/setup.rb
CHANGED
|
@@ -268,6 +268,8 @@ module Ruboto
|
|
|
268
268
|
def check_for_android_sdk
|
|
269
269
|
@android_loc = check_for('android', 'Android Package Installer',
|
|
270
270
|
File.join(android_package_directory, 'tools', windows? ? 'android.bat' : 'android'))
|
|
271
|
+
check_for('sdkmanager', 'Android SDK Manager',
|
|
272
|
+
File.join(android_package_directory, 'tools', 'bin', windows? ? 'sdkmanager.bat' : 'sdkmanager'))
|
|
271
273
|
end
|
|
272
274
|
|
|
273
275
|
def check_for(cmd, pretty_name=nil, alt_dir=nil)
|
|
@@ -617,7 +619,7 @@ module Ruboto
|
|
|
617
619
|
end
|
|
618
620
|
if accept_all || a == 'Y' || a.empty?
|
|
619
621
|
android_cmd = windows? ? 'android.bat' : 'android'
|
|
620
|
-
update_cmd = "#{android_cmd} --silent update sdk --no-ui --filter build-tools-#{get_tools_version('build-tool')},extra-intel-Hardware_Accelerated_Execution_Manager,platform-tool,tool -a"
|
|
622
|
+
update_cmd = "#{android_cmd} --silent update sdk --no-ui --filter build-tools-#{get_tools_version('build-tool')[0]},extra-intel-Hardware_Accelerated_Execution_Manager,platform-tool,tool -a"
|
|
621
623
|
update_sdk(update_cmd, accept_all)
|
|
622
624
|
check_for_build_tools
|
|
623
625
|
check_for_platform_tools
|
|
@@ -707,8 +709,14 @@ module Ruboto
|
|
|
707
709
|
if accept_all || a == 'Y' || a.empty?
|
|
708
710
|
android_cmd = windows? ? 'android.bat' : 'android'
|
|
709
711
|
|
|
710
|
-
# FIXME(uwe)
|
|
711
|
-
|
|
712
|
+
# FIXME: (uwe) Change to only install the best image for this system corresponding to the abi chosen when creating an emulator
|
|
713
|
+
level = api_level[/\d+/]
|
|
714
|
+
arches = %w(x86 x86_64 armeabi-v7a arm64-v8a)
|
|
715
|
+
arches -= %w(x86 x86_64) if ON_TRAVIS && level.to_i >= 22 # TODO: (uwe) Remove when travis can run x86 images
|
|
716
|
+
abi_list = arches.product(%w(android google_apis))
|
|
717
|
+
.map{|arch, vendor| "sys-img-#{arch}-#{vendor}-#{level}"}
|
|
718
|
+
puts "Installing #{abi_list}"
|
|
719
|
+
update_cmd = "#{android_cmd} update sdk --no-ui --filter #{api_level},#{abi_list.join(',')} --all"
|
|
712
720
|
# EMXIF
|
|
713
721
|
|
|
714
722
|
update_sdk(update_cmd, accept_all)
|
data/lib/ruboto/util/update.rb
CHANGED
|
@@ -457,7 +457,7 @@ module Ruboto
|
|
|
457
457
|
raise "Unpacking jruby-core jar failed: #$?" unless $? == 0
|
|
458
458
|
File.delete jruby_core
|
|
459
459
|
gem_version = Gem::Version.new(jruby_core_version.to_s.tr('-', '.'))
|
|
460
|
-
if gem_version >= Gem::Version.new('9.0.5.0
|
|
460
|
+
if gem_version >= Gem::Version.new('9.0.5.0')
|
|
461
461
|
#noinspection RubyLiteralArrayInspection
|
|
462
462
|
excluded_core_packages = [
|
|
463
463
|
|
data/lib/ruboto/util/verify.rb
CHANGED
|
@@ -4,15 +4,18 @@ require 'yaml'
|
|
|
4
4
|
module Ruboto
|
|
5
5
|
module Util
|
|
6
6
|
module Verify
|
|
7
|
+
ON_TRAVIS = ENV['TRAVIS'] == 'true' # TODO: (uwe) Maybe check "/dev/kvm" ?
|
|
8
|
+
|
|
7
9
|
###########################################################################
|
|
8
10
|
#
|
|
9
11
|
# Verify the presence of important components
|
|
10
12
|
#
|
|
11
13
|
|
|
12
|
-
def verify_manifest
|
|
13
|
-
return @manifest if @manifest
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
def verify_manifest(reload: false)
|
|
15
|
+
return @manifest if @manifest && !reload
|
|
16
|
+
unless File.exists? 'AndroidManifest.xml'
|
|
17
|
+
abort "cannot find your AndroidManifest.xml to extract info from it. Make sure you're in the root directory of your app"
|
|
18
|
+
end
|
|
16
19
|
@manifest = REXML::Document.new(File.read('AndroidManifest.xml')).root
|
|
17
20
|
end
|
|
18
21
|
|
data/lib/ruboto/version.rb
CHANGED
|
@@ -12,6 +12,6 @@ end
|
|
|
12
12
|
|
|
13
13
|
test('distanceBetween') do |activity|
|
|
14
14
|
assert_equal '12531.119140625', activity.find_view_by_id(42).text.to_s
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
assert_match /27.2149505615234/, activity.find_view_by_id(43).text.to_s
|
|
16
|
+
assert_match /27.3007125854492/, activity.find_view_by_id(44).text.to_s
|
|
17
17
|
end
|
|
@@ -91,6 +91,7 @@ def start_activity_by_button(activity, button_id, activity_class_name = 'org.rub
|
|
|
91
91
|
waitForIdleSync
|
|
92
92
|
puts 'wait_for_monitor_with_timeout'
|
|
93
93
|
current_activity = monitor.wait_for_activity_with_timeout(10000)
|
|
94
|
+
puts "current_activity: #{current_activity.inspect}"
|
|
94
95
|
ensure
|
|
95
96
|
removeMonitor(monitor)
|
|
96
97
|
end
|
|
@@ -29,7 +29,7 @@ class SslActivity
|
|
|
29
29
|
@open_uri_thread.join
|
|
30
30
|
run_on_ui_thread { @response_view.text = 'open-uri loaded OK!' }
|
|
31
31
|
puts 'before open'
|
|
32
|
-
open('https://google.com/', ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE) do |f|
|
|
32
|
+
open('https://www.google.com/', ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE) do |f|
|
|
33
33
|
puts 'inside open'
|
|
34
34
|
body = f.read
|
|
35
35
|
puts 'body'
|
|
@@ -39,7 +39,7 @@ class SslActivity
|
|
|
39
39
|
run_on_ui_thread { @response_view.text = heading }
|
|
40
40
|
end
|
|
41
41
|
rescue Exception
|
|
42
|
-
puts "Exception
|
|
42
|
+
puts "Exception resume: #{$!.class} #{$!.message}"
|
|
43
43
|
run_on_ui_thread { @response_view.text = $!.to_s }
|
|
44
44
|
end
|
|
45
45
|
end
|
|
@@ -20,12 +20,13 @@ end
|
|
|
20
20
|
# ANDROID: 21, PLATFORM: 1.0.2, JRuby: 1.7.12 '[28, 33, 44, 61]' expected, but got '[28, 33, 43, 60]'
|
|
21
21
|
# ANDROID: 22, PLATFORM: STANDALONE, JRuby: 1.7.20 '[28, 33, 44, 61]' expected, but got '[28, 33, 43, 60]'
|
|
22
22
|
# ANDROID: 23, PLATFORM: STANDALONE, JRuby: 1.7.19 '[28, 33, 43, 60]' expected, but got '[26, 31, 40, 57]'
|
|
23
|
+
# ANDROID: 25, PLATFORM: STANDALONE, JRuby: 1.7.25 '[28, 33, 43, 60]' expected, but got '[26, 31, 40, 57]
|
|
23
24
|
test('stack depth') do |activity|
|
|
24
25
|
os_offset =
|
|
25
26
|
case android.os.Build::VERSION::SDK_INT
|
|
26
27
|
when 13 then [1, 1, 1, 1]
|
|
27
28
|
when (15..19) then [0, 0, 1, 1]
|
|
28
|
-
when 23 then [-2, -2, -3, -3]
|
|
29
|
+
when (23..25) then [-2, -2, -3, -3]
|
|
29
30
|
else [0, 0, 0, 0]
|
|
30
31
|
end
|
|
31
32
|
jruby_offset =
|
data/test/app_test_methods.rb
CHANGED
|
@@ -72,6 +72,14 @@ module AppTestMethods
|
|
|
72
72
|
next if file =~ /button|fragment|margins|navigation|psych|rss|spinner|startup_exception|subclass/ && has_stupid_crash
|
|
73
73
|
# EMXIF
|
|
74
74
|
|
|
75
|
+
# FIXME(uwe): Crash when compiling proxy classes...investigate!
|
|
76
|
+
next if file =~ /dialog_fragment|ssl|subclass/ && ANDROID_OS == 24
|
|
77
|
+
# EMXIF
|
|
78
|
+
|
|
79
|
+
# FIXME(uwe): Remove when we stop testing Android <= 5.0
|
|
80
|
+
next if file =~ /ssl/ && ANDROID_OS <= 21
|
|
81
|
+
# EMXIF
|
|
82
|
+
|
|
75
83
|
if file =~ /_test.rb$/
|
|
76
84
|
next unless file =~ /#{ENV['ACTIVITY_TEST_PATTERN']}/
|
|
77
85
|
snake_name = file.chomp('_test.rb')
|
data/test/arjdbc_test.rb
CHANGED
data/test/rake_test.rb
CHANGED
|
@@ -2,23 +2,25 @@ require File.expand_path('test_helper', File.dirname(__FILE__))
|
|
|
2
2
|
|
|
3
3
|
class RubotoActivityTest < Minitest::Test
|
|
4
4
|
def setup
|
|
5
|
+
super
|
|
5
6
|
generate_app
|
|
6
7
|
end
|
|
7
8
|
|
|
8
9
|
def teardown
|
|
9
10
|
cleanup_app
|
|
11
|
+
super
|
|
10
12
|
end
|
|
11
13
|
|
|
12
14
|
def test_ruboto_activity_as_entry_point
|
|
13
15
|
check_platform_installation
|
|
14
16
|
Dir.chdir APP_DIR do
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
package = 'org.ruboto.test_app'
|
|
18
|
+
app_element = verify_manifest(reload: true).elements['application']
|
|
19
|
+
activity_element = app_element.elements["activity[@android:name='org.ruboto.RubotoActivity']"]
|
|
20
|
+
activity_element.attributes['android:exported'] = true
|
|
21
|
+
save_manifest
|
|
19
22
|
system 'rake install'
|
|
20
|
-
|
|
21
|
-
system "adb shell am start -n org.ruboto.test_app/org.ruboto.RubotoActivity -e ClassName RubotoTestAppActivity"
|
|
23
|
+
system "adb shell am start -n #{package}/org.ruboto.RubotoActivity -e ClassName RubotoTestAppActivity"
|
|
22
24
|
assert_equal 0, $?, "tests failed with return code #$?"
|
|
23
25
|
# FIXME(uwe): Assert that the activity was started correctly.
|
|
24
26
|
end
|
data/test/ruboto_gen_test.rb
CHANGED
|
@@ -86,7 +86,8 @@ class RubotoGenTest < Minitest::Test
|
|
|
86
86
|
# APK was 7006.1KB. PLATFORM: STANDALONE, ANDROID_TARGET: 15, JRuby: 1.7.23
|
|
87
87
|
# APK was 7083.4KB. PLATFORM: STANDALONE, ANDROID_TARGET: 15, JRuby: 1.7.24
|
|
88
88
|
# APK was 8596.6KB. PLATFORM: STANDALONE, ANDROID_TARGET: 19, JRuby: 1.7.24
|
|
89
|
-
# APK was 7081.8KB. PLATFORM: STANDALONE, ANDROID_TARGET: 15, JRuby: 1.7.25
|
|
89
|
+
# APK was 7081.8KB. PLATFORM: STANDALONE, ANDROID_TARGET: 15, JRuby: 1.7.25
|
|
90
|
+
# APK was 8730.8KB. PLATFORM: STANDALONE, ANDROID_TARGET: 19, JRuby: 1.7.25
|
|
90
91
|
# APK was 4633.2KB. PLATFORM: STANDALONE, ANDROID_TARGET: 22, JRuby: 9.0.0.0.SNAPSHOT
|
|
91
92
|
# APK was 8762.6KB. PLATFORM: STANDALONE, ANDROID_TARGET: 23, JRuby: 9.0.5.0.SNAPSHOT
|
|
92
93
|
LIMITS = {
|
data/test/ruboto_setup_test.rb
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
require_relative 'test_helper'
|
|
2
2
|
require 'net/http'
|
|
3
3
|
|
|
4
4
|
class RubotoSetupTest < Minitest::Test
|
|
5
5
|
include Ruboto::Util::Setup
|
|
6
6
|
|
|
7
|
+
# TODO: (uwe) The following tests verify internals of Ruboto setup. Should test API instead.
|
|
7
8
|
def test_if_sdk_page_still_exists?
|
|
8
9
|
uri = URI.parse(SDK_DOWNLOAD_PAGE)
|
|
9
10
|
res = Net::HTTP.get_response(uri)
|
|
@@ -26,10 +27,10 @@ class RubotoSetupTest < Minitest::Test
|
|
|
26
27
|
end
|
|
27
28
|
|
|
28
29
|
def test_if_regex_still_applies_to_sdk
|
|
29
|
-
regex = '(\>
|
|
30
|
+
regex = '(\>tools_r.*.zip)'
|
|
30
31
|
page_content = Net::HTTP.get(URI.parse(SDK_DOWNLOAD_PAGE))
|
|
31
32
|
link = page_content.scan(/#{regex}/).to_s
|
|
32
|
-
assert_match /\d+(\.\d+)?(\.\d+)?/, link
|
|
33
|
+
assert_match /\d+(\.\d+)?(\.\d+)?/, link, page_content
|
|
33
34
|
end
|
|
34
35
|
|
|
35
36
|
describe 'Upgrade HAXM' do
|
data/test/sqldroid_test.rb
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
require File.expand_path('test_helper', File.dirname(__FILE__))
|
|
2
2
|
|
|
3
|
-
# FIXME(uwe): Remove check when we stop supporting Android < 4.0.3
|
|
4
|
-
if RubotoTest::ANDROID_OS >= 15 || RubotoTest::RUBOTO_PLATFORM != 'STANDALONE'
|
|
5
|
-
|
|
6
3
|
class SqldroidTest < Minitest::Test
|
|
7
4
|
def setup
|
|
8
5
|
generate_app :bundle => :sqldroid
|
|
@@ -74,7 +71,4 @@ EOF
|
|
|
74
71
|
run_app_tests
|
|
75
72
|
end
|
|
76
73
|
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
end
|
|
80
|
-
# EMXIF
|
|
74
|
+
end if RubotoTest::ANDROID_OS != 24 # FIXME: (uwe) Remove check when the proxy compile is fixed
|
data/test/test_helper.rb
CHANGED
|
@@ -44,29 +44,12 @@ module RubotoTest
|
|
|
44
44
|
TMP_DIR = File.join PROJECT_DIR, 'tmp'
|
|
45
45
|
APP_DIR = File.join TMP_DIR, APP_NAME
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
if (ENV['ANDROID_TARGET'] && ENV['ANDROID_TARGET'] =~ /(?:android-)?L/)
|
|
49
|
-
ANDROID_TARGET = 'L'
|
|
50
|
-
else
|
|
51
|
-
ANDROID_TARGET = (ENV['ANDROID_TARGET'] && ENV['ANDROID_TARGET'].slice(/\d+/).to_i) || MINIMUM_SUPPORTED_SDK_LEVEL
|
|
52
|
-
end
|
|
53
|
-
# EMXIF
|
|
47
|
+
ANDROID_TARGET = (ENV['ANDROID_TARGET'] && ENV['ANDROID_TARGET'].slice(/\d+/).to_i) || MINIMUM_SUPPORTED_SDK_LEVEL
|
|
54
48
|
|
|
55
49
|
def self.version_from_device
|
|
56
50
|
puts 'Reading OS version from device/emulator'
|
|
57
51
|
system 'adb wait-for-device'
|
|
58
|
-
|
|
59
|
-
if line =~ /sdk-eng (.*?) .*? .*? test-keys/
|
|
60
|
-
version = $1
|
|
61
|
-
api_level = VERSION_TO_API_LEVEL[version]
|
|
62
|
-
raise "Unknown version: #{version}" if api_level.nil?
|
|
63
|
-
return "android-#{api_level}"
|
|
64
|
-
end
|
|
65
|
-
if line =~ /\[ro\.build\.version\.sdk\]: \[(\d+)\]/
|
|
66
|
-
return $1
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
raise 'Unable to read device/emulator apilevel'
|
|
52
|
+
`adb shell getprop ro.build.version.sdk`
|
|
70
53
|
end
|
|
71
54
|
|
|
72
55
|
def uninstall_jruby_jars_gem
|
|
@@ -103,10 +86,6 @@ module RubotoTest
|
|
|
103
86
|
|
|
104
87
|
ANDROID_OS = (ENV['ANDROID_OS'] || version_from_device).slice(/\d+/).to_i
|
|
105
88
|
|
|
106
|
-
# FIXME(uwe): Remove when Android L has been released
|
|
107
|
-
ANDROID_OS = 21 if ANDROID_OS == 0
|
|
108
|
-
# EMXIF
|
|
109
|
-
|
|
110
89
|
puts "ANDROID_OS: #{ANDROID_OS}"
|
|
111
90
|
puts "ANDROID_TARGET: #{ANDROID_TARGET}"
|
|
112
91
|
|
|
@@ -123,14 +102,7 @@ module RubotoTest
|
|
|
123
102
|
elsif ENV['JRUBY_JARS_VERSION']
|
|
124
103
|
JRUBY_JARS_VERSION = Gem::Version.new(ENV['JRUBY_JARS_VERSION'])
|
|
125
104
|
else
|
|
126
|
-
|
|
127
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.8.0')
|
|
128
|
-
gem_spec = Gem::Specification.find_by_path 'jruby-jars'
|
|
129
|
-
else
|
|
130
|
-
gem_spec = Gem.searcher.find('jruby-jars')
|
|
131
|
-
end
|
|
132
|
-
# EMXIF
|
|
133
|
-
|
|
105
|
+
gem_spec = Gem::Specification.find_by_path 'jruby-jars'
|
|
134
106
|
raise StandardError.new("Can't find Gem specification jruby-jars.") unless gem_spec
|
|
135
107
|
JRUBY_JARS_VERSION = gem_spec.version
|
|
136
108
|
end
|
|
@@ -212,7 +184,7 @@ class Minitest::Test
|
|
|
212
184
|
if example
|
|
213
185
|
Dir.chdir TMP_DIR do
|
|
214
186
|
system "tar xzf #{PROJECT_DIR}/examples/#{APP_NAME}_#{example}.tgz"
|
|
215
|
-
Dir.chdir(APP_NAME) { system
|
|
187
|
+
Dir.chdir(APP_NAME) { system "#{RUBOTO_CMD} setup -y" }
|
|
216
188
|
end
|
|
217
189
|
Dir.chdir APP_DIR do
|
|
218
190
|
File.open('local.properties', 'w') { |f| f.puts "sdk.dir=#{ANDROID_HOME}" }
|
|
@@ -256,6 +228,8 @@ class Minitest::Test
|
|
|
256
228
|
|
|
257
229
|
Dir.chdir APP_DIR do
|
|
258
230
|
write_android_manifest
|
|
231
|
+
sleep 1
|
|
232
|
+
FileUtils.touch('project.properties')
|
|
259
233
|
File.write('res/layout/dummy_layout.xml', <<-EOF)
|
|
260
234
|
<?xml version="1.0" encoding="utf-8"?>
|
|
261
235
|
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ruboto
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Daniel Jackoway
|
|
@@ -11,7 +11,7 @@ authors:
|
|
|
11
11
|
autorequire:
|
|
12
12
|
bindir: bin
|
|
13
13
|
cert_chain: []
|
|
14
|
-
date: 2016-
|
|
14
|
+
date: 2016-12-28 00:00:00.000000000 Z
|
|
15
15
|
dependencies:
|
|
16
16
|
- !ruby/object:Gem::Dependency
|
|
17
17
|
name: main
|
|
@@ -45,16 +45,22 @@ dependencies:
|
|
|
45
45
|
name: rake
|
|
46
46
|
requirement: !ruby/object:Gem::Requirement
|
|
47
47
|
requirements:
|
|
48
|
-
- - "
|
|
48
|
+
- - ">="
|
|
49
49
|
- !ruby/object:Gem::Version
|
|
50
50
|
version: '11.3'
|
|
51
|
+
- - "<"
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '13'
|
|
51
54
|
type: :runtime
|
|
52
55
|
prerelease: false
|
|
53
56
|
version_requirements: !ruby/object:Gem::Requirement
|
|
54
57
|
requirements:
|
|
55
|
-
- - "
|
|
58
|
+
- - ">="
|
|
56
59
|
- !ruby/object:Gem::Version
|
|
57
60
|
version: '11.3'
|
|
61
|
+
- - "<"
|
|
62
|
+
- !ruby/object:Gem::Version
|
|
63
|
+
version: '13'
|
|
58
64
|
- !ruby/object:Gem::Dependency
|
|
59
65
|
name: rubyzip
|
|
60
66
|
requirement: !ruby/object:Gem::Requirement
|