ruboto 1.5.0 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|