163 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
	
 | 
						|
// 2011/04/15 this document is a bit out of date. We will be updating to use
 | 
						|
// the standalone cross-compiler that is offered by the Android NDK soon
 | 
						|
 | 
						|
This document explains how to properly build an Android package of Orbot from
 | 
						|
source. It covers building on Debian Lenny (5.0.3).
 | 
						|
 | 
						|
Please install the following prerequisites (instructions for each follows):
 | 
						|
	ant: http://ant.apache.org/
 | 
						|
	Android OS SDK: http://source.android.com/download
 | 
						|
	droid-wrapper: http://github.com/tmurakam/droid-wrapper
 | 
						|
	libevent source (1.4.12-stable from svn)
 | 
						|
	Tor source (most recent git master branch)
 | 
						|
	Privoxy source (http://sourceforge.net/projects/ijbswa/)
 | 
						|
 | 
						|
Install and prepare the Android OS SDK ( http://source.android.com/download )
 | 
						|
on Debian Lenny:
 | 
						|
 | 
						|
	sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf \
 | 
						|
		libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip \
 | 
						|
		curl libncurses5-dev zlib1g-dev valgrind libtool automake \
 | 
						|
		ruby subversion
 | 
						|
	update-java-alternatives -s java-1.5.0-sun
 | 
						|
 | 
						|
	curl http://android.git.kernel.org/repo >~/bin/repo
 | 
						|
	chmod a+x ~/bin/repo
 | 
						|
 | 
						|
	mkdir ~/mydroid
 | 
						|
	cd ~/mydroid
 | 
						|
 | 
						|
	repo init -u git://android.git.kernel.org/platform/manifest.git
 | 
						|
	repo sync
 | 
						|
 | 
						|
	# Paste in key from http://source.android.com/download next...
 | 
						|
	gpg --import
 | 
						|
 | 
						|
	cd ~/mydroid
 | 
						|
 | 
						|
	# This takes a long while...
 | 
						|
	make
 | 
						|
 | 
						|
Install droid-wrapper:
 | 
						|
 | 
						|
	cd /tmp
 | 
						|
	git clone git://github.com/tmurakam/droid-wrapper.git
 | 
						|
	cd droid-wrapper
 | 
						|
	sudo make install
 | 
						|
 | 
						|
zlib and OpenSSL are included with the Android OS SDK. You'll need to build
 | 
						|
libevent, Privoxy and finally Tor. We'll create an externals directory for this code:
 | 
						|
 | 
						|
	mkdir -p ~/mydroid/external/{libevent,tor,privoxy}
 | 
						|
 | 
						|
We need to set to environment variables for droid-gcc:
 | 
						|
	export DROID_ROOT=~/mydroid/
 | 
						|
	export DROID_TARGET=generic
 | 
						|
 | 
						|
Fetch and build Privoxy:
 | 
						|
	cd ~/mydroid/external/privoxy
 | 
						|
	wget http://sourceforge.net/projects/ijbswa/files/Sources/3.0.12%20%28stable%29/privoxy-3.0.12-stable-src.tar.gz/download
 | 
						|
	tar xzvf privoxy-3.0.12-stable-src.tar.gz
 | 
						|
	cd privoxy-3.0.12-stable
 | 
						|
	autoheader
 | 
						|
	autoconf
 | 
						|
	#need to disable setpgrp check in configure
 | 
						|
	export ac_cv_func_setpgrp_void=yes
 | 
						|
	#replace FOO with your actual username
 | 
						|
	CC=droid-gcc LD=droid-ld CPPFLAGS="-I/home/FOO/mydroid/external/zlib/" ./configure --host=arm-none-linux-gnueabi
 | 
						|
	#don't mind the "unrecognized option '-pthread'" error message that you'll see when you run make
 | 
						|
	make
 | 
						|
	
 | 
						|
Fetch and build libevent:
 | 
						|
 | 
						|
	cd ~/mydroid/external/libevent
 | 
						|
	svn co https://levent.svn.sourceforge.net/svnroot/levent/tags/release-1.4.12-stable/libevent/ .
 | 
						|
	export LIBEVENTDIR=`cd $DROID_ROOT/external/libevent && pwd`
 | 
						|
	./autogen.sh
 | 
						|
	# Put the contents of http://pastebin.ca/1577207 in /tmp/libevent-patch
 | 
						|
	patch < /tmp/libevent-patch
 | 
						|
	CC=droid-gcc LD=droid-ld ./configure --host=arm-none-linux-gnueabi
 | 
						|
	make
 | 
						|
 | 
						|
Copy over the libevent library:
 | 
						|
	cp .libs/libevent.a $DROID_ROOT/out/target/product/generic/obj/lib
 | 
						|
 | 
						|
Fetch and build Tor:
 | 
						|
 | 
						|
	export OPENSSLDIR=`cd $DROID_ROOT/external/openssl/include/ && pwd`
 | 
						|
	export ZLIBDIR=`cd $DROID_ROOT/external/zlib && pwd`
 | 
						|
 | 
						|
	cd $DROID_ROOT/external/tor
 | 
						|
	git clone git://git.torproject.org/git/tor.git
 | 
						|
	cd tor/
 | 
						|
	./autogen.sh
 | 
						|
	CC=droid-gcc LD=droid-ld ./configure --host=arm-none-linux-gnueabi \
 | 
						|
	--with-libevent-dir=$LIBEVENTDIR --with-openssl-dir=$OPENSSLDIR \
 | 
						|
	--with-zlib-dir=$ZLIBDIR --disable-asciidoc
 | 
						|
	make
 | 
						|
 | 
						|
At this point, you'll have a Tor binary that can be run on an Android handset.
 | 
						|
You can verify the ARM binary was properly built using the following command:
 | 
						|
 | 
						|
file src/or/tor
 | 
						|
	
 | 
						|
You should see something like:
 | 
						|
src/or/tor: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
 | 
						|
 | 
						|
This isn't enough though and we'll now sew up the binary into a small package
 | 
						|
that will handle basic Tor controlling features.
 | 
						|
 | 
						|
We need to get the TorControl library for Java:
 | 
						|
(see also https://svn.torproject.org/svn/torctl/trunk/doc/howto.txt)
 | 
						|
 | 
						|
	git clone git://git.torproject.org/git/jtorctl
 | 
						|
	cd jtorctl
 | 
						|
	mkdir bin
 | 
						|
	javac net/freehaven/tor/control/TorControlConnection.java -d bin
 | 
						|
	cd bin
 | 
						|
	jar cvf jtorctrl.jar *
 | 
						|
	cp jtorctrl.jar {Orbot Home}/libs
 | 
						|
	
 | 
						|
Finally, we'll make a proper Android package with ant and the Android App SDK:
 | 
						|
 | 
						|
	export APP_SDK=~/Documents/projects/android/android-sdk-linux_x86-1.5_r3/tools
 | 
						|
	cd ../Orbot/
 | 
						|
	cp $DROID_ROOT/external/privoxy/privoxy-3.0.12-stable/privoxy assets/privoxy
 | 
						|
	cp $DROID_ROOT/external/tor/tor/src/or/tor assets/tor
 | 
						|
	$APP_SDK/android update project --name Orbot --target 3 --path .
 | 
						|
	ant release
 | 
						|
 | 
						|
This will produce an unsigned Tor package in ./bin/Orbot-unsigned.apk!
 | 
						|
 | 
						|
To produce a usable package, you'll need to sign the .apk. The basics on
 | 
						|
signing can be found on the Android developer site:
 | 
						|
 | 
						|
	http://developer.android.com/guide/publishing/app-signing.html
 | 
						|
 | 
						|
The three steps are quite simple. First, you'll generate a key. Secondly,
 | 
						|
you'll sign the application. Thirdly, you'll verify the the apk.
 | 
						|
 | 
						|
Generating a signing key:
 | 
						|
 | 
						|
	keytool -genkey -v -keystore my-release-key.keystore \
 | 
						|
		-alias orbots_key -keyalg RSA -validity 10000
 | 
						|
 | 
						|
Sign the apk:
 | 
						|
 | 
						|
	jarsigner -verbose -keystore my-release-key.keystore \
 | 
						|
		bin/Orbot-unsigned.apk orbots_key
 | 
						|
 | 
						|
Verify the signature for the apk:
 | 
						|
 | 
						|
	jarsigner -verify bin/Orbot-unsigned.apk
 | 
						|
	mv bin/Orbot-unsigned.apk bin/Orbot-signed-alpha.apk
 | 
						|
 | 
						|
You can also GPG sign the apk and generate an .asc:
 | 
						|
 | 
						|
	gpg -ab Orbot-signed-alpha.apk
 | 
						|
 | 
						|
Now you should have a fully signed and production ready alpha release of Orbot!
 | 
						|
Give bin/Orbot-signed-alpha.apk an install and send us bug reports!
 | 
						|
 |