diff --git a/android/Vagrant.README.md b/android/Vagrant.README.md new file mode 100644 index 0000000000..b597df5ccb --- /dev/null +++ b/android/Vagrant.README.md @@ -0,0 +1,40 @@ +## Goals + +Provide a turn-key VM for Android development + +## Requirements + +* [Vagrant](https://www.vagrantup.com/downloads.html) +* [VirtualBox](https://www.virtualbox.org/wiki/Downloads) +* Host: + * 4 CPU cores (2 used by VM) + * ~18 GB disk space + * 4 GB RAM (2 used by VM) +* Download volume (once): ~3.5 GB + +## HOWTO + +1. On your host: open a terminal + 1. `cd /android` + 1. `vagrant up` + 1. Wait until the final reboot finished + 1. **From this point on you don't need Vagrant anymore** + 1. Don't run `vagrant up` again! + 1. Just use VirtualBox to stop/start your new shiny VM +1. In the VM: + 1. Log in with `vagrant/vagrant` + 1. Open a terminal + 1. `cd BOINC/android` + 1. `./build_all.sh` + 1. Start Android Studio + 1. No need to change anything in the setup assitant (just complete it) + * OK / Next / Next / Finish / Finish + 1. Import the BOINC App as *Gradle* project from: `~/BOINC/android/BOINC` + 1. Ignore potential Gradle Plugin warning: *Don't remind me again* +1. Hook up your Android device via USB (and remember to attach it to VirtualBox) +1. Happy hacking :-) + +## Known limitations + +* The Android Virtual Device Manager might not work properly as it needs virtualization + which isn't possible within a virtual machine (at least not using VirtualBox). diff --git a/android/Vagrantfile b/android/Vagrantfile new file mode 100644 index 0000000000..bca034d4a7 --- /dev/null +++ b/android/Vagrantfile @@ -0,0 +1,135 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# All Vagrant configuration is done below. The "2" in Vagrant.configure +# configures the configuration version (we support older styles for +# backwards compatibility). Please don't change it unless you know what +# you're doing. +Vagrant.configure("2") do |config| + # The most common configuration options are documented and commented below. + # For a complete reference, please see the online documentation at + # https://docs.vagrantup.com. + + # Every Vagrant development environment requires a box. You can search for + # boxes at https://atlas.hashicorp.com/search. + config.vm.box = "bento/ubuntu-16.04" + + # Disable automatic box update checking. If you disable this, then + # boxes will only be checked for updates when the user runs + # `vagrant box outdated`. This is not recommended. + # config.vm.box_check_update = false + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine. In the example below, + # accessing "localhost:8080" will access port 80 on the guest machine. + # config.vm.network "forwarded_port", guest: 80, host: 8080 + + # Create a private network, which allows host-only access to the machine + # using a specific IP. + # config.vm.network "private_network", ip: "192.168.33.10" + + # Create a public network, which generally matched to bridged network. + # Bridged networks make the machine appear as another physical device on + # your network. + # config.vm.network "public_network" + + # Share an additional folder to the guest VM. The first argument is + # the path on the host to the actual folder. The second argument is + # the path on the guest to mount the folder. And the optional third + # argument is a set of non-required options. + # config.vm.synced_folder "../data", "/vagrant_data" + + # Provider-specific configuration so you can fine-tune various + # backing providers for Vagrant. These expose provider-specific options. + # Example for VirtualBox: + # + config.vm.provider "virtualbox" do |vb| + # Set VM name + vb.name = "BOINC-Android-Development" + + # Display the VirtualBox GUI when booting the machine + vb.gui = true + + # Customize the number of CPU cores on the VM: + vb.cpus = 2 + + # Customize the amount of memory on the VM: + vb.memory = "2048" + + # Increase video memory to 128 MB + vb.customize ["modifyvm", :id, "--vram", "128"] + + # Enable 3D acceleration + vb.customize ["modifyvm", :id, "--accelerate3d", "on"] + + # Enable USB + vb.customize ["modifyvm", :id, "--usb", "on"] + vb.customize ["modifyvm", :id, "--usbxhci", "on"] + end + # + # View the documentation for the provider you are using for more + # information on available options. + + # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies + # such as FTP and Heroku are also available. See the documentation at + # https://docs.vagrantup.com/v2/push/atlas.html for more information. + # config.push.define "atlas" do |push| + # push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME" + # end + + # Enable provisioning with a shell script. Additional provisioners such as + # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the + # documentation for more information about their specific syntax and use. + config.vm.provision "shell", name: "Preparing desktop environment...", inline: <<-SHELL + add-apt-repository ppa:ubuntu-desktop/ubuntu-make + apt-get update + apt-get upgrade + apt-get --assume-yes install ubuntu-mate-core virtualbox-guest-x11 + apt-get --assume-yes install ubuntu-make git automake libtool + update-locale LC_ALL=en_US.UTF-8 + SHELL + + config.vm.provision "shell" do |s| + s.name = "Installing Android Studio..." + s.privileged = false + s.inline = <<-SHELL + umake --verbose android android-studio --accept-license $HOME/Android/Android-Studio + printf "\n# umake fix-up\nexport ANDROID_HOME=\$HOME/Android/Sdk\n" >> $HOME/.profile + umake --verbose android android-sdk --accept-license $HOME/Android/Sdk + printf "\n# umake fix-up\nexport NDK_ROOT=\$HOME/Android/Ndk\n" >> $HOME/.profile + umake --verbose android android-ndk --accept-license $HOME/Android/Ndk + yes | $HOME/Android/Sdk/tools/bin/sdkmanager --update + yes | $HOME/Android/Sdk/tools/bin/sdkmanager "extras;android;m2repository" "extras;google;m2repository" + mkdir $HOME/Desktop + cp $HOME/.local/share/applications/android-studio.desktop $HOME/Desktop/ + chmod +x $HOME/Desktop/android-studio.desktop + SHELL + end + + config.vm.provision "shell" do |s| + s.name = "Clone BOINC repository and configuring toolchain..." + s.privileged = false + s.inline = <<-SHELL + export OPENSSL_VERSION=1.0.2k + export CURL_VERSION=7.53.1 + git clone https://github.com/BOINC/boinc.git $HOME/BOINC + export BUILD_TOOLS=`sed -n "s/.*buildToolsVersion\\s*\\"\\(.*\\)\\"/\\1/p" $HOME/BOINC/android/BOINC/app/build.gradle` + export COMPILE_SDK=`sed -n "s/.*compileSdkVersion\\s*\\(\\d*\\)/\\1/p" $HOME/BOINC/android/BOINC/app/build.gradle` + yes | $HOME/Android/Sdk/tools/bin/sdkmanager "build-tools;${BUILD_TOOLS}" + yes | $HOME/Android/Sdk/tools/bin/sdkmanager "platforms;android-${COMPILE_SDK}" + printf "\n# Build toolchains\nexport ANDROID_TC=\$HOME/Android/Toolchains\n" >> $HOME/.profile + mkdir $HOME/3rdParty + wget -O /tmp/openssl.tgz https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz + tar xzf /tmp/openssl.tgz --directory=$HOME/3rdParty + printf "\n# OpenSSL sources\nexport OPENSSL_SRC=\$HOME/3rdParty/openssl-${OPENSSL_VERSION}\n" >> $HOME/.profile + wget -O /tmp/curl.tgz https://curl.haxx.se/download/curl-${CURL_VERSION}.tar.gz + tar xzf /tmp/curl.tgz --directory=$HOME/3rdParty + printf "\n# cURL sources\nexport CURL_SRC=\$HOME/3rdParty/curl-${CURL_VERSION}\n" >> $HOME/.profile + SHELL + end + + config.vm.provision "shell", name: "Final cleanup and reboot...", inline: <<-SHELL + apt-get clean + reboot + SHELL +end