diff options
-rw-r--r-- | Cargo.lock | 2 | ||||
-rw-r--r-- | ports/servo/Cargo.toml | 2 | ||||
-rw-r--r-- | ports/servo/main.rs | 115 | ||||
-rw-r--r-- | support/android/apk/jni/main.c | 58 | ||||
-rw-r--r-- | support/android/apk/src/com/mozilla/servo/MainActivity.java | 4 | ||||
-rw-r--r-- | support/android/build-apk/src/main.rs | 190 |
6 files changed, 126 insertions, 245 deletions
diff --git a/Cargo.lock b/Cargo.lock index eeb141d150f..9ca04db7bfc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2463,7 +2463,6 @@ dependencies = [ name = "servo" version = "0.0.1" dependencies = [ - "android_glue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "android_injected_glue 0.2.1 (git+https://github.com/mmatyas/android-rs-injected-glue)", "backtrace 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "browserhtml 0.1.17 (git+https://github.com/browserhtml/browserhtml?branch=crate)", @@ -2471,7 +2470,6 @@ dependencies = [ "gfx_tests 0.0.1", "glutin_app 0.0.1", "layout_tests 0.0.1", - "libc 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)", "libservo 0.0.1", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "net_tests 0.0.1", diff --git a/ports/servo/Cargo.toml b/ports/servo/Cargo.toml index 082d17db90b..ea46d7f4f9a 100644 --- a/ports/servo/Cargo.toml +++ b/ports/servo/Cargo.toml @@ -46,6 +46,4 @@ libservo = {path = "../../components/servo"} sig = "0.1" [target.'cfg(target_os = "android")'.dependencies] -libc = "0.2" -android_glue = "0.2" android_injected_glue = {git = "https://github.com/mmatyas/android-rs-injected-glue"} diff --git a/ports/servo/main.rs b/ports/servo/main.rs index cefc093af7a..b24e550ff2d 100644 --- a/ports/servo/main.rs +++ b/ports/servo/main.rs @@ -18,15 +18,10 @@ #![feature(start, core_intrinsics)] #[cfg(target_os = "android")] -#[macro_use] -extern crate android_glue; -#[cfg(target_os = "android")] extern crate android_injected_glue; extern crate backtrace; // The window backed by glutin extern crate glutin_app as app; -#[cfg(target_os = "android")] -extern crate libc; #[macro_use] extern crate log; // The Servo engine @@ -65,9 +60,10 @@ fn install_crash_handler() { use std::thread; fn handler(_sig: i32) { - let name = thread::current().name() - .map(|n| format!(" for thread \"{}\"", n)) - .unwrap_or("".to_owned()); + let name = thread::current() + .name() + .map(|n| format!(" for thread \"{}\"", n)) + .unwrap_or("".to_owned()); println!("Stack trace{}\n{:?}", name, Backtrace::new()); unsafe { abort(); @@ -81,8 +77,7 @@ fn install_crash_handler() { } #[cfg(target_os = "android")] -fn install_crash_handler() { -} +fn install_crash_handler() {} fn main() { install_crash_handler(); @@ -106,15 +101,21 @@ fn main() { warn!("Panic hook called."); let msg = match info.payload().downcast_ref::<&'static str>() { Some(s) => *s, - None => match info.payload().downcast_ref::<String>() { - Some(s) => &**s, - None => "Box<Any>", + None => { + match info.payload().downcast_ref::<String>() { + Some(s) => &**s, + None => "Box<Any>", + } }, }; let current_thread = thread::current(); let name = current_thread.name().unwrap_or("<unnamed>"); if let Some(location) = info.location() { - println!("{} (thread {}, at {}:{})", msg, name, location.file(), location.line()); + println!("{} (thread {}, at {}:{})", + msg, + name, + location.file(), + location.line()); } else { println!("{} (thread {})", msg, name); } @@ -128,7 +129,7 @@ fn main() { setup_logging(); if let Some(token) = content_process_token { - return servo::run_content_process(token) + return servo::run_content_process(token); } if opts::get().is_printing_version { @@ -155,17 +156,16 @@ fn main() { loop { let should_continue = browser.browser.handle_events(window.wait_events()); if !should_continue { - break + break; } - }; + } unregister_glutin_resize_handler(&window); platform::deinit() } -fn register_glutin_resize_handler(window: &Rc<app::window::Window>, - browser: &mut BrowserWrapper) { +fn register_glutin_resize_handler(window: &Rc<app::window::Window>, browser: &mut BrowserWrapper) { unsafe { window.set_nested_event_loop_listener(browser); } @@ -188,7 +188,7 @@ impl app::NestedEventLoopListener for BrowserWrapper { _ => false, }; if !self.browser.handle_events(vec![event]) { - return false + return false; } if is_resize { self.browser.repaint_synchronously() @@ -199,12 +199,14 @@ impl app::NestedEventLoopListener for BrowserWrapper { #[cfg(target_os = "android")] fn setup_logging() { - android::setup_logging(); + // Piping logs from stdout/stderr to logcat happens in android_injected_glue. + ::std::env::set_var("RUST_LOG", "debug"); + + unsafe { android_injected_glue::ffi::app_dummy() }; } #[cfg(not(target_os = "android"))] -fn setup_logging() { -} +fn setup_logging() {} #[cfg(target_os = "android")] /// Attempt to read parameters from a file since they are not passed to us in Android environments. @@ -233,11 +235,10 @@ fn args() -> Vec<String> { vec }, Err(e) => { - debug!("Failed to open params file '{}': {}", PARAMS_FILE, Error::description(&e)); - vec![ - "servo".to_owned(), - "http://en.wikipedia.org/wiki/Rust".to_owned() - ] + debug!("Failed to open params file '{}': {}", + PARAMS_FILE, + Error::description(&e)); + vec!["servo".to_owned(), "http://en.wikipedia.org/wiki/Rust".to_owned()] }, } } @@ -254,61 +255,5 @@ fn args() -> Vec<String> { #[inline(never)] #[allow(non_snake_case)] pub extern "C" fn android_main(app: *mut ()) { - android_injected_glue::android_main2(app as *mut _, move |_, _| { main() }); -} - - -#[cfg(target_os = "android")] -mod android { - extern crate android_glue; - extern crate android_injected_glue; - extern crate libc; - - use self::libc::c_int; - use std::borrow::ToOwned; - - pub fn setup_logging() { - use self::libc::{STDERR_FILENO, STDOUT_FILENO}; - //use std::env; - - //env::set_var("RUST_LOG", "servo,gfx,msg,util,layers,js,std,rt,extra"); - redirect_output(STDERR_FILENO); - redirect_output(STDOUT_FILENO); - - unsafe { android_injected_glue::ffi::app_dummy() }; - } - - struct FilePtr(*mut self::libc::FILE); - - unsafe impl Send for FilePtr {} - - fn redirect_output(file_no: c_int) { - use self::libc::{pipe, dup2}; - use self::libc::fdopen; - use self::libc::fgets; - use std::ffi::CStr; - use std::ffi::CString; - use std::str::from_utf8; - use std::thread; - - unsafe { - let mut pipes: [c_int; 2] = [ 0, 0 ]; - pipe(pipes.as_mut_ptr()); - dup2(pipes[1], file_no); - let mode = CString::new("r").unwrap(); - let input_file = FilePtr(fdopen(pipes[0], mode.as_ptr())); - thread::Builder::new().name("android-logger".to_owned()).spawn(move || { - static READ_SIZE: usize = 1024; - let mut read_buffer = vec![0; READ_SIZE]; - let FilePtr(input_file) = input_file; - loop { - fgets(read_buffer.as_mut_ptr(), (read_buffer.len() as i32)-1, input_file); - let c_str = CStr::from_ptr(read_buffer.as_ptr()); - let slice = from_utf8(c_str.to_bytes()).unwrap(); - android_glue::write_log(slice); - } - }); - } - } - + android_injected_glue::android_main2(app as *mut _, move |_, _| main()); } diff --git a/support/android/apk/jni/main.c b/support/android/apk/jni/main.c deleted file mode 100644 index beddf906059..00000000000 --- a/support/android/apk/jni/main.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -//BEGIN_INCLUDE(all) -#include <jni.h> -#include <errno.h> -#include <dlfcn.h> -#include <stdlib.h> - -#include <android/log.h> -#include <android_native_app_glue.h> - -#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "servo-wrapper", __VA_ARGS__)) -#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "servo-wrapper", __VA_ARGS__)) - -/** - * This is the main entry point of a native application that is using - * android_native_app_glue. It runs in its own thread, with its own - * event loop for receiving input events and doing other things. - */ -void android_main(struct android_app* state) { - LOGI("in android_main"); - void* libservo = dlopen("libservo.so", RTLD_NOW); - if (libservo == NULL) { - LOGI("failed to load servo lib: %s", dlerror()); - return; - } - - LOGI("loaded libservo.so"); - void (*android_main)(struct android_app*); - *(void**)(&android_main) = dlsym(libservo, "android_main"); - if (android_main) { - LOGI("go into android_main()"); - (*android_main)(state); - return; - } -} -//END_INCLUDE(all) - -int main(int argc, char* argv[]) -{ - LOGI("WAT"); - return 0; -} diff --git a/support/android/apk/src/com/mozilla/servo/MainActivity.java b/support/android/apk/src/com/mozilla/servo/MainActivity.java index f85146fc0ff..31973499cc0 100644 --- a/support/android/apk/src/com/mozilla/servo/MainActivity.java +++ b/support/android/apk/src/com/mozilla/servo/MainActivity.java @@ -16,10 +16,12 @@ import java.util.zip.ZipFile; public class MainActivity extends android.app.NativeActivity { - private static final String LOGTAG="servo_wrapper"; + private static final String LOGTAG="ServoWrapper"; static { Log.i(LOGTAG, "Loading the NativeActivity"); + // libmain.so contains all of Servo native code with the injected glue. System.loadLibrary("main"); + Log.i(LOGTAG, "libmain.so loaded"); } private void set_url(String url) { diff --git a/support/android/build-apk/src/main.rs b/support/android/build-apk/src/main.rs index e836eb859ce..10a140540ff 100644 --- a/support/android/build-apk/src/main.rs +++ b/support/android/build-apk/src/main.rs @@ -72,11 +72,11 @@ fn main() { } let ndkcmd = Command::new(ndk_path.join("ndk-build")) - .arg("-B") - .stdout(Stdio::inherit()) - .stderr(Stdio::inherit()) - .current_dir(directory.clone()) - .status(); + .arg("-B") + .stdout(Stdio::inherit()) + .stderr(Stdio::inherit()) + .current_dir(directory.clone()) + .status(); if ndkcmd.is_err() || ndkcmd.unwrap().code().unwrap() != 0 { println!("Error while executing program `ndk-build`, or missing program."); process::exit(1); @@ -91,13 +91,13 @@ fn main() { // Copy over the resources let cpcmd = Command::new("cp") - .arg("-R") - .arg(&resdir) - .arg(&directory.join("assets")) - .stdout(Stdio::inherit()) - .stderr(Stdio::inherit()) - .current_dir(directory.clone()) - .status(); + .arg("-R") + .arg(&resdir) + .arg(&directory.join("assets")) + .stdout(Stdio::inherit()) + .stderr(Stdio::inherit()) + .current_dir(directory.clone()) + .status(); if cpcmd.is_err() || cpcmd.unwrap().code().unwrap() != 0 { println!("Error while copying files from the resources dir to the assets dir"); process::exit(1); @@ -105,18 +105,18 @@ fn main() { // Update the project let androidcmd = Command::new(sdk_path.join("tools").join("android")) - .arg("update") - .arg("project") - .arg("--name") - .arg("Servo") - .arg("--target") - .arg(&android_platform) - .arg("--path") - .arg(".") - .stdout(Stdio::inherit()) - .stderr(Stdio::inherit()) - .current_dir(directory.clone()) - .status(); + .arg("update") + .arg("project") + .arg("--name") + .arg("Servo") + .arg("--target") + .arg(&android_platform) + .arg("--path") + .arg(".") + .stdout(Stdio::inherit()) + .stderr(Stdio::inherit()) + .current_dir(directory.clone()) + .status(); if androidcmd.is_err() || androidcmd.unwrap().code().unwrap() != 0 { println!("Error while updating the project with the android command"); process::exit(1); @@ -129,8 +129,7 @@ fn main() { } else { antcmd.arg("release"); } - let antresult = antcmd - .stdout(Stdio::inherit()) + let antresult = antcmd.stdout(Stdio::inherit()) .stderr(Stdio::inherit()) .current_dir(directory.clone()) .status(); @@ -143,73 +142,72 @@ fn main() { // Release builds also need to be signed. For now, we use a simple debug // signing key. if debug { - fs::copy(&directory.join("bin").join("Servo-debug.apk"), - &args.output).unwrap(); + fs::copy(&directory.join("bin").join("Servo-debug.apk"), &args.output).unwrap(); } else { let keystore_dir = env::home_dir().expect("Please have a home directory"); let keystore_dir = Path::new(&keystore_dir).join(".keystore"); let keytoolcmd = Command::new("keytool") - .arg("-list") - .arg("-storepass") - .arg("android") - .arg("-alias") - .arg("androiddebugkey") - .arg("-keystore") - .arg(&keystore_dir) - .stdout(Stdio::inherit()) - .stderr(Stdio::inherit()) - .current_dir(directory.clone()) - .status(); + .arg("-list") + .arg("-storepass") + .arg("android") + .arg("-alias") + .arg("androiddebugkey") + .arg("-keystore") + .arg(&keystore_dir) + .stdout(Stdio::inherit()) + .stderr(Stdio::inherit()) + .current_dir(directory.clone()) + .status(); if keytoolcmd.is_err() || keytoolcmd.unwrap().code().unwrap() != 0 { let keytoolcreatecmd = Command::new("keytool") - .arg("-genkeypair") - .arg("-keystore") - .arg(&keystore_dir) - .arg("-storepass") - .arg("android") - .arg("-alias") - .arg("androiddebugkey") - .arg("-keypass") - .arg("android") - .arg("-dname") - .arg("CN=Android Debug,O=Android,C=US") - .arg("-keyalg") - .arg("RSA") - .arg("-validity") - .arg("365") - .stdout(Stdio::inherit()) - .stderr(Stdio::inherit()) - .current_dir(directory.clone()) - .status(); - if keytoolcreatecmd.is_err() || - keytoolcreatecmd.unwrap().code().unwrap() != 0 { - println!("Error while using `keytool` to create the debug keystore."); - process::exit(1); - } + .arg("-genkeypair") + .arg("-keystore") + .arg(&keystore_dir) + .arg("-storepass") + .arg("android") + .arg("-alias") + .arg("androiddebugkey") + .arg("-keypass") + .arg("android") + .arg("-dname") + .arg("CN=Android Debug,O=Android,C=US") + .arg("-keyalg") + .arg("RSA") + .arg("-validity") + .arg("365") + .stdout(Stdio::inherit()) + .stderr(Stdio::inherit()) + .current_dir(directory.clone()) + .status(); + if keytoolcreatecmd.is_err() || keytoolcreatecmd.unwrap().code().unwrap() != 0 { + println!("Error while using `keytool` to create the debug keystore."); + process::exit(1); + } } let jarsigncmd = Command::new("jarsigner") - .arg("-digestalg") - .arg("SHA1") - .arg("-sigalg") - .arg("MD5withRSA") - .arg("-storepass") - .arg("android") - .arg("-keystore") - .arg(&keystore_dir) - .arg(&directory.join("bin").join("Servo-release-unsigned.apk")) - .arg("androiddebugkey") - .stdout(Stdio::inherit()) - .stderr(Stdio::inherit()) - .current_dir(directory.clone()) - .status(); + .arg("-digestalg") + .arg("SHA1") + .arg("-sigalg") + .arg("MD5withRSA") + .arg("-storepass") + .arg("android") + .arg("-keystore") + .arg(&keystore_dir) + .arg(&directory.join("bin").join("Servo-release-unsigned.apk")) + .arg("androiddebugkey") + .stdout(Stdio::inherit()) + .stderr(Stdio::inherit()) + .current_dir(directory.clone()) + .status(); if jarsigncmd.is_err() || jarsigncmd.unwrap().code().unwrap() != 0 { println!("Error while using `jarsign` to sign the APK."); process::exit(1); } fs::copy(&directory.join("bin").join("Servo-release-unsigned.apk"), - &args.output).unwrap(); + &args.output) + .unwrap(); } } @@ -233,16 +231,16 @@ fn parse_arguments() -> (Args, Vec<String>) { loop { let arg = match args.next() { - None => return ( - Args { + None => { + return (Args { output: result_output.expect("Could not find -o argument"), root_path: result_root_path.expect("Could not find -r enlistment root argument"), target_path: result_target_path.expect("Could not find -t target path argument"), shared_libraries: result_shared_libraries, }, - result_passthrough - ), - Some(arg) => arg + result_passthrough) + }, + Some(arg) => arg, }; match &*arg { @@ -250,12 +248,12 @@ fn parse_arguments() -> (Args, Vec<String>) { result_output = Some(PathBuf::from(args.next().expect("-o must be followed by the output name"))); }, "-r" => { - result_root_path = - Some(PathBuf::from(args.next().expect("-r must be followed by the enlistment root directory"))); + result_root_path = Some(PathBuf::from(args.next() + .expect("-r must be followed by the enlistment root directory"))); }, "-t" => { - result_target_path = - Some(PathBuf::from(args.next().expect("-t must be followed by the target output directory"))); + result_target_path = Some(PathBuf::from(args.next() + .expect("-t must be followed by the target output directory"))); }, "-l" => { let name = args.next().expect("-l must be followed by a library name"); @@ -264,13 +262,13 @@ fn parse_arguments() -> (Args, Vec<String>) { // Also pass these through. result_passthrough.push(arg); result_passthrough.push(name); - } + }, _ => { if arg.starts_with("-l") { result_shared_libraries.insert(vec!["lib", &arg[2..], ".so"].concat()); } result_passthrough.push(arg) - } + }, }; } } @@ -287,15 +285,13 @@ fn find_native_libs(args: &Args) -> HashMap<String, PathBuf> { (Some(file_name), Some(extension)) => { let file_name = file_name.to_str().unwrap(); - if file_name.starts_with("lib") && - extension == "so" && - args.shared_libraries.contains(file_name) { - println!("Adding the file {:?}", file_name); - native_shared_libs.insert(file_name.to_string(), path.to_path_buf().clone()); - break; + if file_name.starts_with("lib") && extension == "so" && args.shared_libraries.contains(file_name) { + println!("Adding the file {:?}", file_name); + native_shared_libs.insert(file_name.to_string(), path.to_path_buf().clone()); + break; } - } - _ => {} + }, + _ => {}, } } |