ruboto 0.11.0 → 0.12.0.rc.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/README.md +7 -5
- data/Rakefile +3 -4
- data/assets/rakelib/ruboto.rake +138 -87
- data/assets/samples/sample_broadcast_receiver.rb +1 -1
- data/assets/src/InheritingActivity.java +0 -6
- data/assets/src/RubotoActivity.java +4 -1
- data/assets/src/RubotoBroadcastReceiver.java +2 -11
- data/assets/src/RubotoService.java +6 -52
- data/assets/src/org/ruboto/EntryPointActivity.java +276 -36
- data/assets/src/org/ruboto/JRubyAdapter.java +5 -152
- data/assets/src/org/ruboto/Script.java +1 -1
- data/assets/src/org/ruboto/ScriptLoader.java +26 -44
- data/assets/src/org/ruboto/test/InstrumentationTestRunner.java +4 -21
- data/bin/ruboto +0 -6
- data/lib/ruboto/commands/base.rb +58 -48
- data/lib/ruboto/sdk_locations.rb +23 -0
- data/lib/ruboto/sdk_versions.rb +1 -19
- data/lib/ruboto/util/build.rb +32 -32
- data/lib/ruboto/util/setup.rb +240 -0
- data/lib/ruboto/util/update.rb +12 -25
- data/lib/ruboto/util/verify.rb +7 -4
- data/lib/ruboto/util/xml_element.rb +62 -76
- data/lib/ruboto/version.rb +1 -1
- data/test/activity/image_button_activity_test.rb +2 -2
- data/test/activity/image_button_and_button_activity_test.rb +2 -2
- data/test/activity/json_activity.rb +1 -1
- data/test/activity/navigation_activity.rb +12 -12
- data/test/activity/navigation_activity_test.rb +7 -7
- data/test/activity/option_menu_activity.rb +0 -1
- data/test/activity/option_menu_activity_test.rb +2 -2
- data/test/activity/stack_activity_test.rb +10 -20
- data/test/app_test_methods.rb +0 -4
- data/test/broadcast_receiver_test.rb +16 -6
- data/test/minimal_app_test.rb +4 -12
- data/test/rake_test.rb +37 -23
- data/test/ruboto_gen_test.rb +12 -15
- data/test/sqldroid_test.rb +3 -6
- data/test/test_helper.rb +2 -0
- data/test/update_test_methods.rb +9 -9
- metadata +7 -11
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -42,7 +42,7 @@ Command-line Tools
|
|
42
42
|
### Application generator
|
43
43
|
|
44
44
|
$ ruboto gen app --package com.yourdomain.whatever --path path/to/where/you/want/the/app --name NameOfApp --target android-version --min-sdk another-android-version --activity MainActivityName
|
45
|
-
Version values must be specified using'android-' and the sdk level number (e.g., android-
|
45
|
+
Version values must be specified using'android-' and the sdk level number (e.g., android-10 is gingerbread).
|
46
46
|
|
47
47
|
<a name="class_generator"></a>
|
48
48
|
### Class generator
|
@@ -165,7 +165,7 @@ You generate an app with the option `--activity FooActivity`, which means that r
|
|
165
165
|
|
166
166
|
The arguments passed to the methods are the same as the arguments that the java methods take. Consult the Android documentation.
|
167
167
|
|
168
|
-
Activities also have some special methods defined to make things easier. The easiest way to get an idea of what they are is looking over the [demo scripts](http://github.com/ruboto/ruboto-irb/tree/master/assets/demo-scripts/). You can also read the [ruboto.rb file](http://github.com/ruboto/ruboto/blob/master/
|
168
|
+
Activities also have some special methods defined to make things easier. The easiest way to get an idea of what they are is looking over the [demo scripts](http://github.com/ruboto/ruboto-irb/tree/master/assets/demo-scripts/). You can also read the [ruboto.rb file](http://github.com/ruboto/ruboto-irb/blob/master/src/ruboto.rb) where everything is defined.
|
169
169
|
|
170
170
|
Testing
|
171
171
|
-------
|
@@ -231,12 +231,14 @@ Tips & Tricks
|
|
231
231
|
|
232
232
|
### Emulators
|
233
233
|
|
234
|
+
You can start an emulator corresponding to the api level of your project with `rake emulator`. The emulator will be created for you and will be called after the android version of you rproject, like "Android_4.0.3".
|
235
|
+
|
234
236
|
If you're doing a lot of Android development, you'll probably find yourself typing `emulator -avd name_of_emulator` a lot to open emulators. It can be convenient to alias these to shorter commands.
|
235
237
|
|
236
238
|
For example, in your `~/.bashrc`, `~/.zshrc`, or similar file, you might put
|
237
|
-
alias
|
238
|
-
alias
|
239
|
-
If you have an "
|
239
|
+
alias ics="emulator -avd Android_4.0.3"
|
240
|
+
alias jellyb="emulator -avd Android_4.1.2"
|
241
|
+
If you have an "Android_4.0.3" emulator that runs Android 4..0.1 and a "Android_4.1.2" one that runs Android 4.1.2.
|
240
242
|
|
241
243
|
|
242
244
|
Alternatives
|
data/Rakefile
CHANGED
@@ -4,6 +4,7 @@ require 'rexml/document'
|
|
4
4
|
require 'ruboto/version'
|
5
5
|
require 'ruboto/description'
|
6
6
|
require 'ruboto/sdk_versions'
|
7
|
+
require 'ruboto/sdk_locations'
|
7
8
|
require 'uri'
|
8
9
|
require 'net/https'
|
9
10
|
|
@@ -15,7 +16,7 @@ PLATFORM_CURRENT_RELEASE_APK = File.expand_path('tmp/RubotoCore-release.apk', Fi
|
|
15
16
|
MANIFEST_FILE = 'AndroidManifest.xml'
|
16
17
|
GEM_FILE = "ruboto-#{Ruboto::VERSION}.gem"
|
17
18
|
GEM_SPEC_FILE = 'ruboto.gemspec'
|
18
|
-
EXAMPLE_FILE = File.expand_path("examples/RubotoTestApp_#{Ruboto::VERSION}_tools_r#{Ruboto::
|
19
|
+
EXAMPLE_FILE = File.expand_path("examples/RubotoTestApp_#{Ruboto::VERSION}_tools_r#{Ruboto::SdkLocations::ANDROID_TOOLS_REVISION}.tgz", File.dirname(__FILE__))
|
19
20
|
|
20
21
|
CLEAN.include('ruboto-*.gem', 'tmp')
|
21
22
|
|
@@ -330,11 +331,9 @@ namespace :platform do
|
|
330
331
|
desc 'Download the current RubotoCore platform release apk'
|
331
332
|
file PLATFORM_CURRENT_RELEASE_APK do
|
332
333
|
puts 'Downloading the current RubotoCore platform release apk'
|
333
|
-
uri = URI('
|
334
|
+
uri = URI('http://ruboto.org/downloads/RubotoCore-release.apk')
|
334
335
|
begin
|
335
336
|
http = Net::HTTP.new(uri.host, uri.port)
|
336
|
-
http.use_ssl = true
|
337
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
338
337
|
content = http.request(Net::HTTP::Get.new(uri.request_uri)).body
|
339
338
|
File.open(PLATFORM_CURRENT_RELEASE_APK, 'w') { |f| f << content }
|
340
339
|
rescue Exception, SystemExit
|
data/assets/rakelib/ruboto.rake
CHANGED
@@ -4,6 +4,7 @@ require 'time'
|
|
4
4
|
require 'rake/clean'
|
5
5
|
require 'rexml/document'
|
6
6
|
require 'timeout'
|
7
|
+
require 'net/telnet'
|
7
8
|
|
8
9
|
ON_WINDOWS = (RbConfig::CONFIG['host_os'] =~ /mswin|mingw/i)
|
9
10
|
|
@@ -42,18 +43,34 @@ new_dx_content = File.read(dx_filename).dup
|
|
42
43
|
# set defaultXmx=-Xmx1024M
|
43
44
|
|
44
45
|
xmx_pattern = /^defaultMx="-Xmx(\d+)(M|m|G|g|T|t)"/
|
46
|
+
MINIMUM_DX_HEAP_SIZE = 2048
|
45
47
|
if new_dx_content =~ xmx_pattern &&
|
46
|
-
($1.to_i * 1024 ** {'M' => 2, 'G' => 3, 'T' => 4}[$2.upcase]) <
|
47
|
-
puts "Increasing max heap space from #$1#$2 to
|
48
|
-
new_dx_content.sub!(xmx_pattern,
|
48
|
+
($1.to_i * 1024 ** {'M' => 2, 'G' => 3, 'T' => 4}[$2.upcase]) < MINIMUM_DX_HEAP_SIZE*1024**2
|
49
|
+
puts "Increasing max heap space from #$1#$2 to #{MINIMUM_DX_HEAP_SIZE}M in #{dx_filename}"
|
50
|
+
new_dx_content.sub!(xmx_pattern, %Q{defaultMx="-Xmx#{MINIMUM_DX_HEAP_SIZE}M"})
|
49
51
|
File.open(dx_filename, 'w') { |f| f << new_dx_content } rescue puts "\n!!! Unable to increase dx heap size !!!\n\n"
|
52
|
+
puts new_dx_content.lines.grep(xmx_pattern)
|
50
53
|
end
|
51
54
|
|
52
|
-
def manifest;
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
def
|
55
|
+
def manifest;
|
56
|
+
@manifest ||= REXML::Document.new(File.read(MANIFEST_FILE))
|
57
|
+
end
|
58
|
+
|
59
|
+
def package;
|
60
|
+
manifest.root.attribute('package')
|
61
|
+
end
|
62
|
+
|
63
|
+
def build_project_name;
|
64
|
+
@build_project_name ||= REXML::Document.new(File.read('build.xml')).elements['project'].attribute(:name).value
|
65
|
+
end
|
66
|
+
|
67
|
+
def scripts_path;
|
68
|
+
@sdcard_path ||= "/mnt/sdcard/Android/data/#{package}/files/scripts"
|
69
|
+
end
|
70
|
+
|
71
|
+
def app_files_path;
|
72
|
+
@app_files_path ||= "/data/data/#{package}/files"
|
73
|
+
end
|
57
74
|
|
58
75
|
PROJECT_DIR = File.expand_path('..', File.dirname(__FILE__))
|
59
76
|
UPDATE_MARKER_FILE = File.join(PROJECT_DIR, 'bin', 'LAST_UPDATE')
|
@@ -63,7 +80,7 @@ MANIFEST_FILE = File.expand_path 'AndroidManifest.xml'
|
|
63
80
|
PROJECT_PROPS_FILE = File.expand_path 'project.properties'
|
64
81
|
RUBOTO_CONFIG_FILE = File.expand_path 'ruboto.yml'
|
65
82
|
GEM_FILE = File.expand_path 'Gemfile.apk'
|
66
|
-
GEM_LOCK_FILE =
|
83
|
+
GEM_LOCK_FILE = "#{GEM_FILE}.lock"
|
67
84
|
RELEASE_APK_FILE = File.expand_path "bin/#{build_project_name}-release.apk"
|
68
85
|
APK_FILE = File.expand_path "bin/#{build_project_name}-debug.apk"
|
69
86
|
TEST_APK_FILE = File.expand_path "test/bin/#{build_project_name}Test-debug.apk"
|
@@ -74,6 +91,10 @@ RUBY_SOURCE_FILES = Dir[File.expand_path 'src/**/*.rb']
|
|
74
91
|
APK_DEPENDENCIES = [MANIFEST_FILE, RUBOTO_CONFIG_FILE, BUNDLE_JAR] + JRUBY_JARS + JAVA_SOURCE_FILES + RESOURCE_FILES + RUBY_SOURCE_FILES
|
75
92
|
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"
|
76
93
|
KEYSTORE_ALIAS = (key_alias = File.readlines('ant.properties').grep(/^key.alias=/).first) ? key_alias.chomp.sub(/^key.alias=/, '') : build_project_name
|
94
|
+
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+(.*)$/
|
95
|
+
# -rw-r--r-- system system 7487556 2013-04-21 14:01 org.ruboto.example.gps-1.apk
|
96
|
+
# -rw-r--r-- 1 1000 1000 59252 Aug 15 2010 /data/app/org.update_test-1.apk
|
97
|
+
# -rw-r--r-- 1 1000 1000 59265 Aug 15 01:11 /data/app/org.update2_test-1.apk
|
77
98
|
|
78
99
|
CLEAN.include('bin', 'gen', 'test/bin', 'test/gen')
|
79
100
|
|
@@ -161,9 +182,9 @@ task :tag do
|
|
161
182
|
sh 'git push origin master --tags'
|
162
183
|
end
|
163
184
|
|
164
|
-
desc 'Start the emulator
|
185
|
+
desc 'Start the emulator'
|
165
186
|
task :emulator do
|
166
|
-
start_emulator
|
187
|
+
start_emulator(sdk_level)
|
167
188
|
end
|
168
189
|
|
169
190
|
desc 'Start the application on the device/emulator.'
|
@@ -258,39 +279,44 @@ file BUNDLE_JAR => [GEM_FILE, GEM_LOCK_FILE] do
|
|
258
279
|
next unless File.exists? GEM_FILE
|
259
280
|
puts "Generating #{BUNDLE_JAR}"
|
260
281
|
require 'bundler'
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
282
|
+
if Gem::Version.new(Bundler::VERSION) <= Gem::Version.new('1.3.5')
|
283
|
+
require 'bundler/vendored_thor'
|
284
|
+
|
285
|
+
# Store original RubyGems/Bundler environment
|
286
|
+
platforms = Gem.platforms
|
287
|
+
ruby_engine = defined?(RUBY_ENGINE) && RUBY_ENGINE
|
288
|
+
gem_paths = {'GEM_HOME' => Gem.path, 'GEM_PATH' => Gem.dir}
|
289
|
+
|
290
|
+
# Override RUBY_ENGINE (we can bundle from MRI for JRuby)
|
291
|
+
Gem.platforms = [Gem::Platform::RUBY, Gem::Platform.new("universal-dalvik-#{sdk_level}"), Gem::Platform.new('universal-java')]
|
292
|
+
Gem.paths = {'GEM_HOME' => BUNDLE_PATH, 'GEM_PATH' => BUNDLE_PATH}
|
293
|
+
old_verbose, $VERBOSE = $VERBOSE, nil
|
294
|
+
begin
|
295
|
+
Object.const_set('RUBY_ENGINE', 'jruby')
|
296
|
+
ensure
|
297
|
+
$VERBOSE = old_verbose
|
298
|
+
end
|
277
299
|
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
300
|
+
ENV['BUNDLE_GEMFILE'] = GEM_FILE
|
301
|
+
Bundler.ui = Bundler::UI::Shell.new
|
302
|
+
Bundler.bundle_path = Pathname.new BUNDLE_PATH
|
303
|
+
definition = Bundler.definition
|
304
|
+
definition.validate_ruby!
|
305
|
+
Bundler::Installer.install(Bundler.root, definition)
|
284
306
|
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
307
|
+
# Restore RUBY_ENGINE (limit the scope of this hack)
|
308
|
+
old_verbose, $VERBOSE = $VERBOSE, nil
|
309
|
+
begin
|
310
|
+
Object.const_set('RUBY_ENGINE', ruby_engine)
|
311
|
+
ensure
|
312
|
+
$VERBOSE = old_verbose
|
313
|
+
end
|
314
|
+
Gem.platforms = platforms
|
315
|
+
Gem.paths = gem_paths
|
316
|
+
else
|
317
|
+
# Bundler.settings[:platform] = Gem::Platform::DALVIK
|
318
|
+
sh "bundle install --gemfile #{GEM_FILE} --path=#{BUNDLE_PATH} --platform=dalvik#{sdk_level}"
|
291
319
|
end
|
292
|
-
Gem.platforms = platforms
|
293
|
-
Gem.paths = gem_paths
|
294
320
|
|
295
321
|
gem_paths = Dir["#{BUNDLE_PATH}/gems"]
|
296
322
|
raise 'Gem path not found' if gem_paths.empty?
|
@@ -482,36 +508,41 @@ end
|
|
482
508
|
# Return nil if the package is not installed.
|
483
509
|
def package_installed?(test = false)
|
484
510
|
package_name = "#{package}#{'.tests' if test}"
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
return false
|
511
|
-
end
|
512
|
-
end
|
511
|
+
loop do
|
512
|
+
path_line = `adb shell pm path #{package_name}`.chomp
|
513
|
+
|
514
|
+
# FIXME(uwe): Debug travis CI. Remove when Travis CI is OK.
|
515
|
+
puts '*' * 80
|
516
|
+
puts 'Output from pm path'
|
517
|
+
puts '*' * 80
|
518
|
+
puts $?.inspect
|
519
|
+
puts '*' * 80
|
520
|
+
puts path_line
|
521
|
+
puts '*' * 80
|
522
|
+
# EMXIF
|
523
|
+
|
524
|
+
return nil if $? == 0 && path_line.empty?
|
525
|
+
break if $? == 0 && path_line =~ /^package:(.*)$/
|
526
|
+
|
527
|
+
# FIXME(uwe): Debug travis CI. Remove when Travis CI is OK.
|
528
|
+
puts '*' * 80
|
529
|
+
puts 'Unexpected output from pm path'
|
530
|
+
puts '*' * 80
|
531
|
+
puts path_line
|
532
|
+
puts '*' * 80
|
533
|
+
# EMXIF
|
534
|
+
|
535
|
+
sleep 0.5
|
513
536
|
end
|
514
|
-
|
537
|
+
|
538
|
+
path = $1
|
539
|
+
o = `adb shell ls -l #{path}`.chomp
|
540
|
+
raise "Unexpected ls output: #{o}" if o !~ APK_FILE_REGEXP
|
541
|
+
installed_apk_size = $1.to_i
|
542
|
+
installed_timestamp = Time.parse($2)
|
543
|
+
apk_file = test ? TEST_APK_FILE : APK_FILE
|
544
|
+
!File.exists?(apk_file) || (installed_apk_size == File.size(apk_file) &&
|
545
|
+
installed_timestamp >= File.mtime(apk_file))
|
515
546
|
end
|
516
547
|
|
517
548
|
def replace_faulty_code(faulty_file, faulty_code)
|
@@ -542,6 +573,8 @@ def build_apk(t, release)
|
|
542
573
|
if release
|
543
574
|
sh "#{ANT_CMD} release"
|
544
575
|
else
|
576
|
+
p RbConfig::CONFIG['host_os']
|
577
|
+
sh 'free' if RbConfig::CONFIG['host_os'] =~ /linux/
|
545
578
|
sh "#{ANT_CMD} debug"
|
546
579
|
end
|
547
580
|
true
|
@@ -561,7 +594,7 @@ def install_apk
|
|
561
594
|
install_retry_count = 0
|
562
595
|
begin
|
563
596
|
timeout 120 do
|
564
|
-
output = `adb install -r #{APK_FILE} 2>&1`
|
597
|
+
output = `adb install -r "#{APK_FILE}" 2>&1`
|
565
598
|
end
|
566
599
|
rescue Timeout::Error
|
567
600
|
puts "Installing package #{package} timed out."
|
@@ -571,7 +604,7 @@ def install_apk
|
|
571
604
|
retry
|
572
605
|
end
|
573
606
|
puts 'Trying one final time to install the package:'
|
574
|
-
output = `adb install -r #{APK_FILE} 2>&1`
|
607
|
+
output = `adb install -r "#{APK_FILE}" 2>&1`
|
575
608
|
end
|
576
609
|
if $? == 0 && output !~ failure_pattern && output =~ success_pattern
|
577
610
|
clear_update
|
@@ -594,7 +627,7 @@ def install_apk
|
|
594
627
|
install_retry_count = 0
|
595
628
|
begin
|
596
629
|
timeout 120 do
|
597
|
-
output = `adb install #{APK_FILE} 2>&1`
|
630
|
+
output = `adb install "#{APK_FILE}" 2>&1`
|
598
631
|
end
|
599
632
|
rescue Timeout::Error
|
600
633
|
puts "Installing package #{package} timed out."
|
@@ -604,7 +637,7 @@ def install_apk
|
|
604
637
|
retry
|
605
638
|
end
|
606
639
|
puts 'Trying one final time to install the package:'
|
607
|
-
output = `adb install #{APK_FILE} 2>&1`
|
640
|
+
output = `adb install "#{APK_FILE}" 2>&1`
|
608
641
|
end
|
609
642
|
puts output
|
610
643
|
raise "Install failed (#{$?}) #{$1 ? "[#$1}]" : output}" if $? != 0 || output =~ failure_pattern || output !~ success_pattern
|
@@ -646,7 +679,7 @@ def stop_app
|
|
646
679
|
output !~ /Operation not permitted/
|
647
680
|
end
|
648
681
|
|
649
|
-
def start_emulator
|
682
|
+
def start_emulator(sdk_level)
|
650
683
|
STDOUT.sync = true
|
651
684
|
# FIXME(uwe): Use RBConfig instead
|
652
685
|
if `uname -m`.chomp == 'x86_64'
|
@@ -654,7 +687,7 @@ def start_emulator
|
|
654
687
|
else
|
655
688
|
emulator_cmd = 'emulator-arm'
|
656
689
|
end
|
657
|
-
|
690
|
+
|
658
691
|
emulator_opts = '-partition-size 256'
|
659
692
|
if ENV['DISPLAY'].nil?
|
660
693
|
emulator_opts << ' -no-window -no-audio'
|
@@ -662,6 +695,24 @@ def start_emulator
|
|
662
695
|
|
663
696
|
avd_name = "Android_#{sdk_level_name}"
|
664
697
|
new_snapshot = false
|
698
|
+
|
699
|
+
if `adb devices` =~ /emulator-5554/
|
700
|
+
t = Net::Telnet.new('Host' => 'localhost', 'Port' => 5554, 'Prompt' => /^OK/)
|
701
|
+
output = ''
|
702
|
+
t.cmd('avd name') { |c| output << c }
|
703
|
+
if output =~ /OK\n(.*)\nOK/
|
704
|
+
running_avd_name = $1
|
705
|
+
if running_avd_name == avd_name
|
706
|
+
puts "Emulator #{avd_name} is already running."
|
707
|
+
return
|
708
|
+
else
|
709
|
+
puts "Emulator #{running_avd_name} is running."
|
710
|
+
end
|
711
|
+
else
|
712
|
+
puts 'No emulator is running.'
|
713
|
+
end
|
714
|
+
end
|
715
|
+
|
665
716
|
loop do
|
666
717
|
`killall -0 #{emulator_cmd} 2> /dev/null`
|
667
718
|
if $? == 0
|
@@ -703,10 +754,10 @@ def start_emulator
|
|
703
754
|
`sed -i.bak -e "s/vm.heapSize=[0-9]*/vm.heapSize=#{heap_size}/" #{ENV['HOME']}/.android/avd/#{avd_name}.avd/config.ini`
|
704
755
|
new_snapshot = true
|
705
756
|
end
|
706
|
-
|
757
|
+
|
707
758
|
puts 'Start emulator'
|
708
759
|
system "emulator -avd #{avd_name} #{emulator_opts} &"
|
709
|
-
|
760
|
+
|
710
761
|
3.times do |i|
|
711
762
|
sleep 1
|
712
763
|
`killall -0 #{emulator_cmd} 2> /dev/null`
|
@@ -716,7 +767,7 @@ def start_emulator
|
|
716
767
|
if i == 3
|
717
768
|
print 'Waiting for emulator: ...'
|
718
769
|
elsif i > 3
|
719
|
-
|
770
|
+
print '.'
|
720
771
|
end
|
721
772
|
end
|
722
773
|
puts
|
@@ -733,12 +784,12 @@ def start_emulator
|
|
733
784
|
if i == 3
|
734
785
|
print 'Waiting for emulator: ...'
|
735
786
|
elsif i > 3
|
736
|
-
|
787
|
+
print '.'
|
737
788
|
end
|
738
789
|
sleep 1
|
739
790
|
end
|
740
791
|
end
|
741
|
-
|
792
|
+
|
742
793
|
`killall -0 #{emulator_cmd} 2> /dev/null`
|
743
794
|
if $? == 0
|
744
795
|
print 'Emulator started: '
|
@@ -761,8 +812,8 @@ def start_emulator
|
|
761
812
|
puts 'Allow the emulator to calm down a bit.'
|
762
813
|
sleep 15
|
763
814
|
end
|
764
|
-
|
765
|
-
system
|
815
|
+
|
816
|
+
system '(
|
766
817
|
set +e
|
767
818
|
for i in 1 2 3 4 5 6 7 8 9 10 ; do
|
768
819
|
sleep 6
|
@@ -777,9 +828,9 @@ def start_emulator
|
|
777
828
|
echo "Failed to unlock screen"
|
778
829
|
set -e
|
779
830
|
exit 1
|
780
|
-
) &
|
781
|
-
|
782
|
-
system
|
783
|
-
|
831
|
+
) &'
|
832
|
+
|
833
|
+
system 'adb logcat > adb_logcat.log &'
|
834
|
+
|
784
835
|
puts "Emulator #{avd_name} started OK."
|
785
836
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import android.util.Log
|
2
2
|
|
3
3
|
class SampleBroadcastReceiver
|
4
|
-
#
|
4
|
+
# Will get called whenever the BroadcastReceiver receives an intent.
|
5
5
|
def onReceive(context, intent)
|
6
6
|
Log.v 'SampleBroadcastReceiver', 'Broadcast received!'
|
7
7
|
Log.v 'SampleBroadcastReceiver', intent.getExtras.to_s
|