Support Tor on Android x86 (thanks to n8fr8).

This commit is contained in:
akwizgran
2015-04-16 08:02:57 +01:00
parent 92d26f7867
commit 6135bea2b4
12 changed files with 69 additions and 53 deletions

View File

@@ -27,6 +27,7 @@ import java.io.IOException;
import java.io.PrintStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -38,6 +39,7 @@ import java.util.logging.Logger;
import java.util.regex.Pattern;
import org.briarproject.R;
import org.briarproject.android.util.AndroidUtils;
import org.briarproject.android.util.HorizontalBorder;
import org.briarproject.android.util.LayoutUtils;
import org.briarproject.android.util.ListLoadingProgressBar;
@@ -181,7 +183,6 @@ public class CrashReportActivity extends Activity implements OnClickListener {
// FIXME: Load strings from resources if we're keeping this activity
@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
private Map<String, String> getStatusMap() {
Map<String, String> statusMap = new LinkedHashMap<String, String>();
@@ -202,19 +203,9 @@ public class CrashReportActivity extends Activity implements OnClickListener {
statusMap.put("Android version:", release + " (" + sdk + ")");
// CPU architectures
String arch = null;
if(Build.VERSION.SDK_INT >= 21) {
for(String abi : Build.SUPPORTED_ABIS) {
if(arch == null) arch = abi;
else arch = arch + ", " + abi;
}
} else if(Build.VERSION.SDK_INT >= 8) {
if(Build.CPU_ABI2 == null) arch = Build.CPU_ABI;
else arch = Build.CPU_ABI + ", " + Build.CPU_ABI2;
} else {
arch = Build.CPU_ABI;
}
statusMap.put("Architecture:", arch);
Collection<String> abis = AndroidUtils.getSupportedArchitectures();
String joined = StringUtils.join(abis, ", ");
statusMap.put("Architecture:", joined);
// System memory
Object o = getSystemService(ACTIVITY_SERVICE);

View File

@@ -26,6 +26,7 @@ import java.io.IOException;
import java.io.PrintStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -39,6 +40,7 @@ import java.util.regex.Pattern;
import javax.inject.Inject;
import org.briarproject.R;
import org.briarproject.android.util.AndroidUtils;
import org.briarproject.android.util.ElasticHorizontalSpace;
import org.briarproject.android.util.HorizontalBorder;
import org.briarproject.android.util.LayoutUtils;
@@ -192,7 +194,6 @@ public class TestingActivity extends BriarActivity implements OnClickListener {
// FIXME: Load strings from resources if we're keeping this activity
@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
private Map<String, String> getStatusMap() {
Map<String, String> statusMap = new LinkedHashMap<String, String>();
@@ -212,18 +213,10 @@ public class TestingActivity extends BriarActivity implements OnClickListener {
int sdk = Build.VERSION.SDK_INT;
statusMap.put("Android version:", release + " (" + sdk + ")");
// CPU architecture
String arch = null;
if(Build.VERSION.SDK_INT >= 21) {
for(String abi : Build.SUPPORTED_ABIS) {
if(arch == null) arch = abi;
else arch = arch + ", " + abi;
}
} else {
if(Build.CPU_ABI2 == null) arch = Build.CPU_ABI;
else arch = Build.CPU_ABI + ", " + Build.CPU_ABI2;
}
statusMap.put("Architecture:", arch);
// CPU architectures
Collection<String> abis = AndroidUtils.getSupportedArchitectures();
String joined = StringUtils.join(abis, ", ");
statusMap.put("Architecture:", joined);
// System memory
Object o = getSystemService(ACTIVITY_SERVICE);

View File

@@ -0,0 +1,27 @@
package org.briarproject.android.util;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import android.annotation.SuppressLint;
import android.os.Build;
public class AndroidUtils {
@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
public static Collection<String> getSupportedArchitectures() {
List<String> abis = new ArrayList<String>();
if(Build.VERSION.SDK_INT >= 21) {
for(String abi : Build.SUPPORTED_ABIS) abis.add(abi);
} else if(Build.VERSION.SDK_INT >= 8) {
abis.add(Build.CPU_ABI);
if(Build.CPU_ABI2 != null) abis.add(Build.CPU_ABI2);
} else {
abis.add(Build.CPU_ABI);
}
return Collections.unmodifiableList(abis);
}
}

View File

@@ -75,6 +75,7 @@ class TorPlugin implements DuplexPlugin, EventHandler {
private final Context appContext;
private final LocationUtils locationUtils;
private final DuplexPluginCallback callback;
private final String architecture;
private final int maxLatency, maxIdleTime, pollingInterval, socketTimeout;
private final File torDirectory, torFile, geoIpFile, configFile, doneFile;
private final File cookieFile, hostnameFile;
@@ -89,11 +90,13 @@ class TorPlugin implements DuplexPlugin, EventHandler {
TorPlugin(Executor ioExecutor, Context appContext,
LocationUtils locationUtils, DuplexPluginCallback callback,
int maxLatency, int maxIdleTime, int pollingInterval) {
String architecture, int maxLatency, int maxIdleTime,
int pollingInterval) {
this.ioExecutor = ioExecutor;
this.appContext = appContext;
this.locationUtils = locationUtils;
this.callback = callback;
this.architecture = architecture;
this.maxLatency = maxLatency;
this.maxIdleTime = maxIdleTime;
this.pollingInterval = pollingInterval;
@@ -266,14 +269,9 @@ class TorPlugin implements DuplexPlugin, EventHandler {
}
private InputStream getTorInputStream() throws IOException {
String filename;
if(Build.VERSION.SDK_INT >= 16) {
LOG.info("Installing PIE Tor binary");
filename = "tor-pie.zip";
} else {
LOG.info("Installing non-PIE Tor binary");
filename = "tor.zip";
}
if(LOG.isLoggable(INFO))
LOG.info("Installing Tor binary for " + architecture);
String filename = "tor-" + architecture + ".zip";
InputStream in = appContext.getResources().getAssets().open(filename);
ZipInputStream zin = new ZipInputStream(in);
if(zin.getNextEntry() == null) throw new IOException();

View File

@@ -1,17 +1,15 @@
package org.briarproject.plugins.tor;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.logging.Logger;
import org.briarproject.android.util.AndroidUtils;
import org.briarproject.api.TransportId;
import org.briarproject.api.plugins.duplex.DuplexPlugin;
import org.briarproject.api.plugins.duplex.DuplexPluginCallback;
import org.briarproject.api.plugins.duplex.DuplexPluginFactory;
import org.briarproject.api.system.LocationUtils;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Build;
@@ -39,26 +37,25 @@ public class TorPluginFactory implements DuplexPluginFactory {
return TorPlugin.ID;
}
@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
public DuplexPlugin createPlugin(DuplexPluginCallback callback) {
// Check that we have a Tor binary for this architecture
List<String> abis = new ArrayList<String>();
if(Build.VERSION.SDK_INT >= 21) {
for(String abi : Build.SUPPORTED_ABIS) abis.add(abi);
} else if(Build.VERSION.SDK_INT >= 8) {
abis.add(Build.CPU_ABI);
if(Build.CPU_ABI2 != null) abis.add(Build.CPU_ABI2);
} else {
abis.add(Build.CPU_ABI);
String architecture = null;
for(String abi : AndroidUtils.getSupportedArchitectures()) {
if(abi.startsWith("x86")) {
architecture = "x86";
break;
} else if(abi.startsWith("armeabi")) {
architecture = "arm";
break;
}
}
boolean supported = false;
for(String abi : abis) if(abi.startsWith("armeabi")) supported = true;
if(!supported) {
if(architecture == null) {
LOG.info("Tor is not supported on this architecture");
return null;
}
// Use position-independent executable for SDK >= 16
if(Build.VERSION.SDK_INT >= 16) architecture += "-pie";
return new TorPlugin(ioExecutor,appContext, locationUtils, callback,
MAX_LATENCY, MAX_IDLE_TIME, POLLING_INTERVAL);
architecture, MAX_LATENCY, MAX_IDLE_TIME, POLLING_INTERVAL);
}
}