ruboto 0.13.0.rc.0 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile.lock +4 -2
- data/README.md +183 -81
- data/RELEASE_CANDICATE_DOC +33 -0
- data/RELEASE_DOC +110 -0
- data/Rakefile +81 -30
- data/assets/rakelib/ruboto.rake +53 -185
- data/assets/src/RubotoActivity.java +18 -2
- data/assets/src/RubotoBroadcastReceiver.java +2 -5
- data/assets/src/org/ruboto/ScriptInfo.java +20 -9
- data/assets/src/ruboto/activity.rb +29 -12
- data/assets/src/ruboto/base.rb +6 -0
- data/assets/src/ruboto/service.rb +2 -4
- data/assets/src/ruboto/widget.rb +3 -2
- data/lib/java_class_gen/android_api.xml +1 -1
- data/lib/ruboto/commands/base.rb +24 -5
- data/lib/ruboto/util/emulator.rb +184 -0
- data/lib/ruboto/util/setup.rb +17 -28
- data/lib/ruboto/util/verify.rb +20 -0
- data/lib/ruboto/version.rb +1 -1
- data/test/activity/navigation_activity.rb +18 -21
- data/test/activity/navigation_activity_test.rb +19 -2
- data/test/rake_test.rb +2 -2
- data/test/ruboto_activity_test.rb +27 -0
- data/test/test_helper.rb +0 -4
- metadata +43 -36
data/RELEASE_DOC
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
Subject: [ANN] Ruboto 0.13.0 released!
|
2
|
+
|
3
|
+
The Ruboto team is pleased to announce the release of Ruboto 0.13.0.
|
4
|
+
|
5
|
+
Ruboto (JRuby on Android) is a platform for developing full stand-alone
|
6
|
+
apps for Android using the Ruby language and libraries. It includes
|
7
|
+
support libraries and generators for creating projects, classes, tests,
|
8
|
+
and more. The complete APIs of Android, Java, and Ruby are available to
|
9
|
+
you using the Ruby language.
|
10
|
+
|
11
|
+
New in version 0.13.0:
|
12
|
+
|
13
|
+
In this release we add support for Android API level 17 and the Android
|
14
|
+
SDK r22. There are improvements on the "ruboto setup" command, and
|
15
|
+
general preparations for the 1.0 release.
|
16
|
+
|
17
|
+
Features:
|
18
|
+
|
19
|
+
* Issue #176 Add option to allocate large heap at startup
|
20
|
+
* Issue #252 View constant conversion errors aren't very clear
|
21
|
+
* Issue #333 Prettier design for the Ruboto platform apk
|
22
|
+
* Issue #405 "ruboto setup" on Windows
|
23
|
+
* Issue #408 Setup: Need to look up the latest Android tool version
|
24
|
+
(instead of hard coding it) if we can
|
25
|
+
* Issue #409 Add support for Android SDK r22
|
26
|
+
* Issue #410 Add -y option to "ruboto setup" to automatically install
|
27
|
+
components, accept licenses, and add to configuration
|
28
|
+
* Issue #412 Enable starting the emulator without a project
|
29
|
+
* Issue #414 Add -t --target parameter to "ruboto setup" to set up for a
|
30
|
+
specific api level
|
31
|
+
* Issue #415 Update API xml file to cover android-17
|
32
|
+
* Issue #416 Add code for generating the API xml file
|
33
|
+
* Issue #422 Put RubotoActivity intent data directly in the Intent instead
|
34
|
+
of inside a Bundle
|
35
|
+
* Issue #423 Focus the "start_ruboto_activity" API
|
36
|
+
|
37
|
+
Bugfixes:
|
38
|
+
|
39
|
+
* Issue #264 Force rebuild of (release) apk when jar file is removed from
|
40
|
+
the libs directory
|
41
|
+
* Issue #268 Callback for Audio Focus
|
42
|
+
* Issue #285 Look into pause/restart issues for secondary Activities
|
43
|
+
* Issue #407 Process::Status#to_int not implemented (NotImplementedError)
|
44
|
+
with jruby 1.7.x and ruboto 0.11.0
|
45
|
+
|
46
|
+
Support:
|
47
|
+
|
48
|
+
* Issue #303 Ruboto should synchronise target in project.properties and
|
49
|
+
targetSdkVersion in AndroidManifest.xml
|
50
|
+
* Issue #314 Tool confusion: ruboto vs rake
|
51
|
+
* Issue #424 Initiliaze the new App
|
52
|
+
|
53
|
+
Documentation:
|
54
|
+
|
55
|
+
* Issue #258 Add welcome and information with links to RubotoCore
|
56
|
+
* Issue #427 Add sidebar to the WIKI
|
57
|
+
|
58
|
+
Internal:
|
59
|
+
|
60
|
+
* Issue #411 Use "ruboto setup -y" to install components in travis-ci
|
61
|
+
automated testing
|
62
|
+
|
63
|
+
Rejected:
|
64
|
+
|
65
|
+
* Issue #175 Rename "update_scripts" rake task to "update" for less typing
|
66
|
+
* Issue #259 Link RubotoCore platform apk version to JRuby version
|
67
|
+
* Issue #261 Rename RubotoCore platform apk display name to Ruboto
|
68
|
+
* Issue #337 Change default for "ruboto gen app" to include JRuby in the
|
69
|
+
app
|
70
|
+
|
71
|
+
You can find a complete list of issues here:
|
72
|
+
|
73
|
+
* https://github.com/ruboto/ruboto/issues?state=closed&milestone=25
|
74
|
+
|
75
|
+
|
76
|
+
Installation:
|
77
|
+
|
78
|
+
To use Ruboto, you need to install a Ruby implementation. Then do
|
79
|
+
(possibly as root/administrator)
|
80
|
+
|
81
|
+
gem install ruboto
|
82
|
+
ruboto setup
|
83
|
+
|
84
|
+
To create a project do
|
85
|
+
|
86
|
+
ruboto gen app --package <your.package.name>
|
87
|
+
cd <project directory>
|
88
|
+
ruboto setup
|
89
|
+
|
90
|
+
To run an emulator for your project
|
91
|
+
|
92
|
+
cd <project directory>
|
93
|
+
ruboto emulator
|
94
|
+
|
95
|
+
To run your project
|
96
|
+
|
97
|
+
cd <project directory>
|
98
|
+
rake install start
|
99
|
+
|
100
|
+
You can find an introductory tutorial at
|
101
|
+
https://github.com/ruboto/ruboto/wiki
|
102
|
+
|
103
|
+
If you have any problems or questions, come see us at http://ruboto.org/
|
104
|
+
|
105
|
+
Enjoy!
|
106
|
+
|
107
|
+
|
108
|
+
--
|
109
|
+
The Ruboto Team
|
110
|
+
http://ruboto.org/
|
data/Rakefile
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
$:.unshift('lib') unless $:.include?('lib')
|
2
|
+
require 'date'
|
2
3
|
require 'rake/clean'
|
3
4
|
require 'rexml/document'
|
4
5
|
require 'ruboto/version'
|
@@ -7,6 +8,7 @@ require 'ruboto/sdk_versions'
|
|
7
8
|
require 'uri'
|
8
9
|
require 'net/https'
|
9
10
|
|
11
|
+
PROJECT_DIR = File.expand_path(File.dirname(__FILE__))
|
10
12
|
PLATFORM_PROJECT = File.expand_path('tmp/RubotoCore', File.dirname(__FILE__))
|
11
13
|
PLATFORM_DEBUG_APK = "#{PLATFORM_PROJECT}/bin/RubotoCore-debug.apk"
|
12
14
|
PLATFORM_DEBUG_APK_BAK = "#{PLATFORM_PROJECT}/bin/RubotoCore-debug.apk.bak"
|
@@ -15,6 +17,10 @@ PLATFORM_CURRENT_RELEASE_APK = File.expand_path('tmp/RubotoCore-release.apk', Fi
|
|
15
17
|
MANIFEST_FILE = 'AndroidManifest.xml'
|
16
18
|
GEM_FILE = "ruboto-#{Ruboto::VERSION}.gem"
|
17
19
|
GEM_SPEC_FILE = 'ruboto.gemspec'
|
20
|
+
README_FILE = 'README.md'
|
21
|
+
BLOG_DIR = "#{File.dirname PROJECT_DIR}/ruboto.github.com/_posts"
|
22
|
+
RELEASE_BLOG = "#{BLOG_DIR}/#{Date.today}-Ruboto-#{Ruboto::VERSION}-release-doc.md"
|
23
|
+
RELEASE_BLOG_GLOB = "#{BLOG_DIR}/*-Ruboto-#{Ruboto::VERSION}-release-doc.md"
|
18
24
|
|
19
25
|
CLEAN.include('ruboto-*.gem', 'tmp')
|
20
26
|
|
@@ -66,8 +72,8 @@ desc 'Generate an example app'
|
|
66
72
|
task :example => :install do
|
67
73
|
require 'ruboto/sdk_locations'
|
68
74
|
EXAMPLE_FILE = File.expand_path("examples/RubotoTestApp_#{Ruboto::VERSION}_tools_r#{Ruboto::SdkLocations::ANDROID_TOOLS_REVISION}.tgz", File.dirname(__FILE__))
|
69
|
-
|
70
|
-
sh "git rm #{
|
75
|
+
EXAMPLES_GLOB = "#{EXAMPLE_FILE.slice(/^.*?_\d+\.\d+\.\d+/)}*"
|
76
|
+
sh "git rm #{EXAMPLES_GLOB}" unless Dir[EXAMPLES_GLOB].empty?
|
71
77
|
puts "Creating example app #{EXAMPLE_FILE}"
|
72
78
|
app_name = 'RubotoTestApp'
|
73
79
|
Dir.chdir File.dirname(EXAMPLE_FILE) do
|
@@ -84,9 +90,14 @@ class String
|
|
84
90
|
end
|
85
91
|
end
|
86
92
|
|
93
|
+
desc 'Update the README with the Ruboto description.'
|
94
|
+
file README_FILE => 'lib/ruboto/description.rb' do
|
95
|
+
File.write(README_FILE, File.read(README_FILE).sub(/(?<=\n\n).*(?=\nInstallation)/m, Ruboto::DESCRIPTION))
|
96
|
+
end
|
97
|
+
|
87
98
|
desc 'Generate release docs for a given milestone'
|
88
|
-
|
89
|
-
|
99
|
+
|
100
|
+
def get_github_issues
|
90
101
|
puts 'GitHub login:'
|
91
102
|
begin
|
92
103
|
require 'rubygems'
|
@@ -129,7 +140,11 @@ task :release_docs do
|
|
129
140
|
milestone_name = issues[0] ? issues[0]['milestone']['title'] : "No issues for milestone #{milestone}"
|
130
141
|
milestone_description = issues[0] ? issues[0]['milestone']['description'] : "No issues for milestone #{milestone}"
|
131
142
|
milestone_description = milestone_description.split("\r\n").map(&:wrap).join("\r\n")
|
132
|
-
categories = {
|
143
|
+
categories = {
|
144
|
+
'Features' => 'feature', 'Bugfixes' => 'bug', 'Support' => 'support',
|
145
|
+
'Documentation' => 'documentation', 'Pull requests' => nil,
|
146
|
+
'Internal' => 'internal', 'Rejected' => 'rejected', 'Other' => nil
|
147
|
+
}
|
133
148
|
grouped_issues = issues.group_by do |i|
|
134
149
|
labels = i['labels'].map { |l| l['name'] }
|
135
150
|
cat = nil
|
@@ -143,10 +158,16 @@ task :release_docs do
|
|
143
158
|
cat ||= 'Other'
|
144
159
|
cat
|
145
160
|
end
|
161
|
+
return categories, grouped_issues, milestone, milestone_description, milestone_name
|
162
|
+
end
|
163
|
+
|
164
|
+
task :release_docs do
|
165
|
+
raise "\n This task requires Ruby 1.9 or newer to parse JSON as YAML.\n\n" if RUBY_VERSION == '1.8.7'
|
166
|
+
categories, grouped_issues, milestone, milestone_description, milestone_name = get_github_issues
|
146
167
|
|
147
168
|
puts '=' * 80
|
148
169
|
puts
|
149
|
-
|
170
|
+
release_candidate_doc = <<EOF
|
150
171
|
Subject: [ANN] Ruboto #{milestone_name} release candidate
|
151
172
|
|
152
173
|
Hi all!
|
@@ -178,30 +199,35 @@ If you find a bug or have a suggestion, please file an issue in the issue tracke
|
|
178
199
|
--
|
179
200
|
The Ruboto Team
|
180
201
|
http://ruboto.org/
|
181
|
-
|
182
202
|
EOF
|
183
203
|
|
184
|
-
puts
|
185
|
-
|
186
|
-
|
187
|
-
puts
|
188
|
-
puts "The Ruboto team is pleased to announce the release of Ruboto #{milestone_name}."
|
189
|
-
puts
|
190
|
-
puts Ruboto::DESCRIPTION.gsub("\n", ' ').wrap
|
191
|
-
puts
|
192
|
-
puts "New in version #{milestone_name}:\n"
|
193
|
-
puts
|
194
|
-
puts milestone_description
|
204
|
+
puts release_candidate_doc
|
205
|
+
File.write('RELEASE_CANDICATE_DOC', release_candidate_doc)
|
206
|
+
|
195
207
|
puts
|
196
|
-
|
197
|
-
puts "#{cat}:\n\n"
|
198
|
-
grouped_issues[cat].each { |i| puts %Q{* Issue ##{i['number']} #{i['title']}}.wrap(2) }
|
199
|
-
puts
|
200
|
-
end
|
201
|
-
puts "You can find a complete list of issues here:\n\n"
|
202
|
-
puts "* https://github.com/ruboto/ruboto/issues?state=closed&milestone=#{milestone}\n\n"
|
208
|
+
puts '=' * 80
|
203
209
|
puts
|
204
|
-
|
210
|
+
release_doc = <<EOF
|
211
|
+
Subject: [ANN] Ruboto #{milestone_name} released!
|
212
|
+
|
213
|
+
The Ruboto team is pleased to announce the release of Ruboto #{milestone_name}.
|
214
|
+
|
215
|
+
#{Ruboto::DESCRIPTION.gsub("\n", ' ').wrap}
|
216
|
+
|
217
|
+
New in version #{milestone_name}:
|
218
|
+
|
219
|
+
#{milestone_description}
|
220
|
+
|
221
|
+
#{(categories.keys & grouped_issues.keys).map do |cat|
|
222
|
+
"#{cat}:\n
|
223
|
+
#{grouped_issues[cat].map { |i| %Q{* Issue ##{i['number']} #{i['title']}}.wrap(2) }.join("\n")}
|
224
|
+
"
|
225
|
+
end.join("\n")}
|
226
|
+
You can find a complete list of issues here:
|
227
|
+
|
228
|
+
* https://github.com/ruboto/ruboto/issues?state=closed&milestone=#{milestone}
|
229
|
+
|
230
|
+
|
205
231
|
Installation:
|
206
232
|
|
207
233
|
To use Ruboto, you need to install a Ruby implementation. Then do
|
@@ -219,7 +245,7 @@ To create a project do
|
|
219
245
|
To run an emulator for your project
|
220
246
|
|
221
247
|
cd <project directory>
|
222
|
-
|
248
|
+
ruboto emulator
|
223
249
|
|
224
250
|
To run your project
|
225
251
|
|
@@ -237,9 +263,34 @@ Enjoy!
|
|
237
263
|
--
|
238
264
|
The Ruboto Team
|
239
265
|
http://ruboto.org/
|
240
|
-
|
241
266
|
EOF
|
267
|
+
|
268
|
+
puts release_doc
|
269
|
+
puts
|
242
270
|
puts '=' * 80
|
271
|
+
|
272
|
+
unless Gem::Version.new(Ruboto::VERSION).prerelease?
|
273
|
+
header = <<EOF
|
274
|
+
---
|
275
|
+
title : Ruboto #{Ruboto::VERSION}
|
276
|
+
layout: post
|
277
|
+
---
|
278
|
+
EOF
|
279
|
+
File.write('RELEASE_DOC', release_doc)
|
280
|
+
Dir.chdir BLOG_DIR do
|
281
|
+
output = `git status --porcelain`
|
282
|
+
old_blog_posts = Dir[RELEASE_BLOG_GLOB] - [RELEASE_BLOG]
|
283
|
+
sh "git rm -f #{old_blog_posts.join(' ')}" unless old_blog_posts.empty?
|
284
|
+
File.write(RELEASE_BLOG, header + release_doc)
|
285
|
+
sh "git add -f #{RELEASE_BLOG}"
|
286
|
+
if output.empty?
|
287
|
+
`git commit -m "* Added release blog for Ruboto #{Ruboto::VERSION}"`
|
288
|
+
sh 'git push'
|
289
|
+
else
|
290
|
+
puts "Workspace not clean!\n#{output}"
|
291
|
+
end
|
292
|
+
end
|
293
|
+
end
|
243
294
|
end
|
244
295
|
|
245
296
|
desc 'Fetch download stats form rubygems.org'
|
@@ -320,7 +371,7 @@ task :stats do
|
|
320
371
|
end
|
321
372
|
|
322
373
|
desc 'Push the gem to RubyGems'
|
323
|
-
task :release => [:clean, :gem] do
|
374
|
+
task :release => [:clean, README_FILE, :release_docs, :gem] do
|
324
375
|
output = `git status --porcelain`
|
325
376
|
raise "Workspace not clean!\n#{output}" unless output.empty?
|
326
377
|
sh "git tag #{Ruboto::VERSION}"
|
@@ -328,7 +379,7 @@ task :release => [:clean, :gem] do
|
|
328
379
|
sh "gem push #{GEM_FILE}"
|
329
380
|
Rake::Task[:example].invoke
|
330
381
|
sh "git add #{EXAMPLE_FILE}"
|
331
|
-
sh "git commit -m '* Added example app for Ruboto #{Ruboto::VERSION} tools r#{Ruboto::SdkLocations::ANDROID_TOOLS_REVISION}' \"#{
|
382
|
+
sh "git commit -m '* Added example app for Ruboto #{Ruboto::VERSION} tools r#{Ruboto::SdkLocations::ANDROID_TOOLS_REVISION}' \"#{EXAMPLES_GLOB}\""
|
332
383
|
sh 'git push'
|
333
384
|
end
|
334
385
|
|
data/assets/rakelib/ruboto.rake
CHANGED
@@ -4,7 +4,6 @@ require 'time'
|
|
4
4
|
require 'rake/clean'
|
5
5
|
require 'rexml/document'
|
6
6
|
require 'timeout'
|
7
|
-
require 'net/telnet'
|
8
7
|
|
9
8
|
ON_WINDOWS = (RbConfig::CONFIG['host_os'] =~ /mswin|mingw/i)
|
10
9
|
|
@@ -50,7 +49,7 @@ end
|
|
50
49
|
new_dx_content = File.read(dx_filename).dup
|
51
50
|
|
52
51
|
xmx_pattern = ON_WINDOWS ? /^set defaultXmx=-Xmx(\d+)(M|m|G|g|T|t)/ : /^defaultMx="-Xmx(\d+)(M|m|G|g|T|t)"/
|
53
|
-
MINIMUM_DX_HEAP_SIZE =
|
52
|
+
MINIMUM_DX_HEAP_SIZE = 1600
|
54
53
|
if new_dx_content =~ xmx_pattern &&
|
55
54
|
($1.to_i * 1024 ** {'M' => 2, 'G' => 3, 'T' => 4}[$2.upcase]) < MINIMUM_DX_HEAP_SIZE*1024**2
|
56
55
|
puts "Increasing max heap space from #$1#$2 to #{MINIMUM_DX_HEAP_SIZE}M in #{dx_filename}"
|
@@ -86,22 +85,34 @@ GEM_LOCK_FILE = "#{GEM_FILE}.lock"
|
|
86
85
|
RELEASE_APK_FILE = File.expand_path "bin/#{build_project_name}-release.apk"
|
87
86
|
APK_FILE = File.expand_path "bin/#{build_project_name}-debug.apk"
|
88
87
|
TEST_APK_FILE = File.expand_path "test/bin/#{build_project_name}Test-debug.apk"
|
89
|
-
JRUBY_JARS = Dir[File.expand_path 'libs/jruby
|
88
|
+
JRUBY_JARS = Dir[File.expand_path 'libs/{jruby-*,dx}.jar']
|
89
|
+
JARS = Dir[File.expand_path 'libs/*.jar'] - JRUBY_JARS
|
90
90
|
RESOURCE_FILES = Dir[File.expand_path 'res/**/*']
|
91
91
|
JAVA_SOURCE_FILES = Dir[File.expand_path 'src/**/*.java']
|
92
92
|
RUBY_SOURCE_FILES = Dir[File.expand_path 'src/**/*.rb']
|
93
|
-
|
93
|
+
CLASSES_CACHE = "#{PROJECT_DIR}/bin/#{build_project_name}-debug-unaligned.apk.d"
|
94
|
+
APK_DEPENDENCIES = [MANIFEST_FILE, RUBOTO_CONFIG_FILE, BUNDLE_JAR, CLASSES_CACHE] + JRUBY_JARS + JARS + JAVA_SOURCE_FILES + RESOURCE_FILES + RUBY_SOURCE_FILES
|
94
95
|
KEYSTORE_FILE = (key_store = File.readlines('ant.properties').grep(/^key.store=/).first) ? File.expand_path(key_store.chomp.sub(/^key.store=/, '').sub('${user.home}', '~')) : "#{build_project_name}.keystore"
|
95
96
|
KEYSTORE_ALIAS = (key_alias = File.readlines('ant.properties').grep(/^key.alias=/).first) ? key_alias.chomp.sub(/^key.alias=/, '') : build_project_name
|
96
97
|
APK_FILE_REGEXP = /^-rw-r--r--\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+(.*)$/
|
97
|
-
|
98
|
-
# -rw-r--r-- 1 1000 1000 59252 Aug 15 2010 /data/app/org.update_test-1.apk
|
99
|
-
# -rw-r--r-- 1 1000 1000 59265 Aug 15 01:11 /data/app/org.update2_test-1.apk
|
98
|
+
JRUBY_ADAPTER_FILE = "#{PROJECT_DIR}/src/org/ruboto/JRubyAdapter.java"
|
100
99
|
|
101
100
|
CLEAN.include('bin', 'gen', 'test/bin', 'test/gen')
|
102
101
|
|
103
102
|
task :default => :debug
|
104
103
|
|
104
|
+
if File.exists?(CLASSES_CACHE)
|
105
|
+
expected_jars = File.readlines(CLASSES_CACHE).grep(%r{#{PROJECT_DIR}/libs/(.*\.jar) \\}).map { |l| l =~ %r{#{PROJECT_DIR}/libs/(.*\.jar) \\}; $1 }
|
106
|
+
actual_jars = Dir['libs/*.jar'].map { |f| f =~ /libs\/(.*\.jar)/; $1 }
|
107
|
+
changed_jars = ((expected_jars | actual_jars) - (expected_jars & actual_jars))
|
108
|
+
unless changed_jars.empty?
|
109
|
+
puts "Jars have changed: #{changed_jars.join(', ')}"
|
110
|
+
FileUtils.touch(CLASSES_CACHE)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
file CLASSES_CACHE
|
115
|
+
|
105
116
|
file JRUBY_JARS => RUBOTO_CONFIG_FILE do
|
106
117
|
next unless File.exists? RUBOTO_CONFIG_FILE
|
107
118
|
jruby_jars_mtime = JRUBY_JARS.map { |f| File.mtime(f) }.min
|
@@ -124,7 +135,7 @@ task :debug => APK_FILE
|
|
124
135
|
|
125
136
|
namespace :debug do
|
126
137
|
desc 'build debug package if compiled files have changed'
|
127
|
-
task :quick =>
|
138
|
+
task :quick => APK_DEPENDENCIES - RUBY_SOURCE_FILES do |t|
|
128
139
|
build_apk(t, false)
|
129
140
|
end
|
130
141
|
end
|
@@ -184,10 +195,13 @@ task :tag do
|
|
184
195
|
sh 'git push origin master --tags'
|
185
196
|
end
|
186
197
|
|
187
|
-
|
198
|
+
# FIXME(uwe): Remove December 2013
|
199
|
+
desc 'Deprecated: Use "ruboto emulator" instead.'
|
188
200
|
task :emulator do
|
189
|
-
|
201
|
+
puts '"rake emulator" is deprecated. Use "ruboto emulator" instead.'
|
202
|
+
sh 'ruboto emulator'
|
190
203
|
end
|
204
|
+
# EMXIF
|
191
205
|
|
192
206
|
desc 'Start the application on the device/emulator.'
|
193
207
|
task :start do
|
@@ -212,11 +226,38 @@ file MANIFEST_FILE => PROJECT_PROPS_FILE do
|
|
212
226
|
manifest = old_manifest.dup
|
213
227
|
manifest.sub!(/(android:minSdkVersion=').*?(')/) { "#$1#{sdk_level}#$2" }
|
214
228
|
manifest.sub!(/(android:targetSdkVersion=').*?(')/) { "#$1#{sdk_level}#$2" }
|
215
|
-
|
229
|
+
if manifest != old_manifest
|
230
|
+
puts "\nUpdating #{File.basename MANIFEST_FILE} with target from #{File.basename PROJECT_PROPS_FILE}\n\n"
|
231
|
+
File.open(MANIFEST_FILE, 'w') { |f| f << manifest }
|
232
|
+
end
|
216
233
|
end
|
217
234
|
|
218
235
|
file RUBOTO_CONFIG_FILE
|
219
236
|
|
237
|
+
file JRUBY_ADAPTER_FILE => RUBOTO_CONFIG_FILE do
|
238
|
+
require 'yaml'
|
239
|
+
if (heap_alloc = YAML.load(File.read(RUBOTO_CONFIG_FILE))['heap_alloc'])
|
240
|
+
config = <<EOF
|
241
|
+
// BEGIN Ruboto HeapAlloc
|
242
|
+
@SuppressWarnings("unused")
|
243
|
+
byte[] arrayForHeapAllocation = new byte[#{heap_alloc} * 1024 * 1024];
|
244
|
+
arrayForHeapAllocation = null;
|
245
|
+
// END Ruboto HeapAlloc
|
246
|
+
EOF
|
247
|
+
else
|
248
|
+
config = <<EOF
|
249
|
+
// BEGIN Ruboto HeapAlloc
|
250
|
+
// @SuppressWarnings("unused")
|
251
|
+
// byte[] arrayForHeapAllocation = new byte[13 * 1024 * 1024];
|
252
|
+
// arrayForHeapAllocation = null;
|
253
|
+
// END Ruboto HeapAlloc
|
254
|
+
EOF
|
255
|
+
end
|
256
|
+
source = File.read(JRUBY_ADAPTER_FILE)
|
257
|
+
heap_alloc_pattern = %r{^\s*// BEGIN Ruboto HeapAlloc\n.*^\s*// END Ruboto HeapAlloc\n}m
|
258
|
+
File.open(JRUBY_ADAPTER_FILE, 'w'){|f| f << source.sub(heap_alloc_pattern, config)}
|
259
|
+
end
|
260
|
+
|
220
261
|
file APK_FILE => APK_DEPENDENCIES do |t|
|
221
262
|
build_apk(t, false)
|
222
263
|
end
|
@@ -455,15 +496,6 @@ end
|
|
455
496
|
|
456
497
|
# Methods
|
457
498
|
|
458
|
-
API_LEVEL_TO_VERSION = {
|
459
|
-
7 => '2.1', 8 => '2.2', 10 => '2.3.3', 11 => '3.0', 12 => '3.1',
|
460
|
-
13 => '3.2', 14 => '4.0', 15 => '4.0.3', 16 => '4.1.2', 17 => '4.2.2',
|
461
|
-
}
|
462
|
-
|
463
|
-
def sdk_level_name
|
464
|
-
API_LEVEL_TO_VERSION[sdk_level]
|
465
|
-
end
|
466
|
-
|
467
499
|
def sdk_level
|
468
500
|
File.read(PROJECT_PROPS_FILE).scan(/(?:target=android-)(\d+)/)[0][0].to_i
|
469
501
|
end
|
@@ -545,7 +577,7 @@ def build_apk(t, release)
|
|
545
577
|
apk_file = release ? RELEASE_APK_FILE : APK_FILE
|
546
578
|
if File.exist?(apk_file)
|
547
579
|
changed_prereqs = t.prerequisites.select do |p|
|
548
|
-
File.file?(p) && !Dir[p].empty? && Dir[p].map { |f| File.mtime(f) }.max > File.mtime(
|
580
|
+
File.file?(p) && !Dir[p].empty? && Dir[p].map { |f| File.mtime(f) }.max > File.mtime(apk_file)
|
549
581
|
end
|
550
582
|
return false if changed_prereqs.empty?
|
551
583
|
changed_prereqs.each { |f| puts "#{f} changed." }
|
@@ -662,167 +694,3 @@ def stop_app
|
|
662
694
|
output = `adb shell ps | grep #{package} | awk '{print $2}' | xargs adb shell kill`
|
663
695
|
output !~ /Operation not permitted/
|
664
696
|
end
|
665
|
-
|
666
|
-
def start_emulator(sdk_level)
|
667
|
-
STDOUT.sync = true
|
668
|
-
if RbConfig::CONFIG['host_cpu'] == 'x86_64'
|
669
|
-
emulator_cmd = 'emulator64-arm'
|
670
|
-
else
|
671
|
-
emulator_cmd = 'emulator-arm'
|
672
|
-
end
|
673
|
-
|
674
|
-
emulator_opts = '-partition-size 256'
|
675
|
-
if !ON_WINDOWS && ENV['DISPLAY'].nil?
|
676
|
-
emulator_opts << ' -no-window -no-audio'
|
677
|
-
end
|
678
|
-
|
679
|
-
avd_name = "Android_#{sdk_level_name}"
|
680
|
-
new_snapshot = false
|
681
|
-
|
682
|
-
if `adb devices` =~ /emulator-5554/
|
683
|
-
t = Net::Telnet.new('Host' => 'localhost', 'Port' => 5554, 'Prompt' => /^OK\n/)
|
684
|
-
t.waitfor(/^OK\n/)
|
685
|
-
output = ''
|
686
|
-
t.cmd('avd name') { |c| output << c }
|
687
|
-
t.close
|
688
|
-
if output =~ /(.*)\nOK\n/
|
689
|
-
running_avd_name = $1
|
690
|
-
if running_avd_name == avd_name
|
691
|
-
puts "Emulator #{avd_name} is already running."
|
692
|
-
return
|
693
|
-
else
|
694
|
-
puts "Emulator #{running_avd_name} is running."
|
695
|
-
end
|
696
|
-
else
|
697
|
-
raise "Unexpected response from emulator: #{output.inspect}"
|
698
|
-
end
|
699
|
-
else
|
700
|
-
puts 'No emulator is running.'
|
701
|
-
end
|
702
|
-
|
703
|
-
loop do
|
704
|
-
`killall -0 #{emulator_cmd} 2> /dev/null`
|
705
|
-
if $? == 0
|
706
|
-
`killall #{emulator_cmd}`
|
707
|
-
10.times do |i|
|
708
|
-
`killall -0 #{emulator_cmd} 2> /dev/null`
|
709
|
-
if $? != 0
|
710
|
-
break
|
711
|
-
end
|
712
|
-
if i == 3
|
713
|
-
print 'Waiting for emulator to die: ...'
|
714
|
-
elsif i > 3
|
715
|
-
print '.'
|
716
|
-
end
|
717
|
-
sleep 1
|
718
|
-
end
|
719
|
-
puts
|
720
|
-
`killall -0 #{emulator_cmd} 2> /dev/null`
|
721
|
-
if $? == 0
|
722
|
-
puts 'Emulator still running.'
|
723
|
-
`killall -9 #{emulator_cmd}`
|
724
|
-
sleep 1
|
725
|
-
end
|
726
|
-
end
|
727
|
-
|
728
|
-
if [17, 16, 15, 13, 11].include? sdk_level
|
729
|
-
abi_opt = '--abi armeabi-v7a'
|
730
|
-
elsif sdk_level == 10
|
731
|
-
abi_opt = '--abi armeabi'
|
732
|
-
end
|
733
|
-
|
734
|
-
unless File.exists? "#{ENV['HOME']}/.android/avd/#{avd_name}.avd"
|
735
|
-
puts "Creating AVD #{avd_name}"
|
736
|
-
puts `echo n | android create avd -a -n #{avd_name} -t android-#{sdk_level} #{abi_opt} -c 64M -s HVGA`
|
737
|
-
if $? != 0
|
738
|
-
puts 'Failed to create AVD.'
|
739
|
-
exit 3
|
740
|
-
end
|
741
|
-
avd_config_file_name = "#{ENV['HOME']}/.android/avd/#{avd_name}.avd/config.ini"
|
742
|
-
old_avd_config = File.read(avd_config_file_name)
|
743
|
-
heap_size = (File.read('AndroidManifest.xml') =~ /largeHeap/) ? 256 : 48
|
744
|
-
new_avd_config = old_avd_config.gsub(/vm.heapSize=([0-9]*)/){|m| p m ; m.to_i < heap_size ? "vm.heapSize=#{heap_size}" : m}
|
745
|
-
File.write(avd_config_file_name, new_avd_config) if new_avd_config != old_avd_config
|
746
|
-
new_snapshot = true
|
747
|
-
end
|
748
|
-
|
749
|
-
puts 'Start emulator'
|
750
|
-
system "emulator -avd #{avd_name} #{emulator_opts} #{'&' unless ON_WINDOWS}"
|
751
|
-
return if ON_WINDOWS
|
752
|
-
|
753
|
-
3.times do |i|
|
754
|
-
sleep 1
|
755
|
-
`killall -0 #{emulator_cmd} 2> /dev/null`
|
756
|
-
if $? == 0
|
757
|
-
break
|
758
|
-
end
|
759
|
-
if i == 3
|
760
|
-
print 'Waiting for emulator: ...'
|
761
|
-
elsif i > 3
|
762
|
-
print '.'
|
763
|
-
end
|
764
|
-
end
|
765
|
-
puts
|
766
|
-
`killall -0 #{emulator_cmd} 2> /dev/null`
|
767
|
-
if $? != 0
|
768
|
-
puts 'Unable to start the emulator. Retrying without loading snapshot.'
|
769
|
-
system "emulator -no-snapshot-load -avd #{avd_name} #{emulator_opts} #{'&' unless ON_WINDOWS}"
|
770
|
-
10.times do |i|
|
771
|
-
`killall -0 #{emulator_cmd} 2> /dev/null`
|
772
|
-
if $? == 0
|
773
|
-
new_snapshot = true
|
774
|
-
break
|
775
|
-
end
|
776
|
-
if i == 3
|
777
|
-
print 'Waiting for emulator: ...'
|
778
|
-
elsif i > 3
|
779
|
-
print '.'
|
780
|
-
end
|
781
|
-
sleep 1
|
782
|
-
end
|
783
|
-
end
|
784
|
-
|
785
|
-
`killall -0 #{emulator_cmd} 2> /dev/null`
|
786
|
-
if $? == 0
|
787
|
-
print 'Emulator started: '
|
788
|
-
50.times do
|
789
|
-
if `adb get-state`.chomp == 'device'
|
790
|
-
break
|
791
|
-
end
|
792
|
-
print '.'
|
793
|
-
sleep 1
|
794
|
-
end
|
795
|
-
puts
|
796
|
-
if `adb get-state`.chomp == 'device'
|
797
|
-
break
|
798
|
-
end
|
799
|
-
end
|
800
|
-
puts 'Unable to start the emulator.'
|
801
|
-
end
|
802
|
-
|
803
|
-
if new_snapshot
|
804
|
-
puts 'Allow the emulator to calm down a bit.'
|
805
|
-
sleep 15
|
806
|
-
end
|
807
|
-
|
808
|
-
system '(
|
809
|
-
set +e
|
810
|
-
for i in 1 2 3 4 5 6 7 8 9 10 ; do
|
811
|
-
sleep 6
|
812
|
-
adb shell input keyevent 82 >/dev/null 2>&1
|
813
|
-
if [ "$?" == "0" ] ; then
|
814
|
-
set -e
|
815
|
-
adb shell input keyevent 82 >/dev/null 2>&1
|
816
|
-
adb shell input keyevent 4 >/dev/null 2>&1
|
817
|
-
exit 0
|
818
|
-
fi
|
819
|
-
done
|
820
|
-
echo "Failed to unlock screen"
|
821
|
-
set -e
|
822
|
-
exit 1
|
823
|
-
) &'
|
824
|
-
|
825
|
-
system 'adb logcat > adb_logcat.log &'
|
826
|
-
|
827
|
-
puts "Emulator #{avd_name} started OK."
|
828
|
-
end
|