Packet Capture v1.4.7版本的 MD5 值为:edce2fbbf748df1d1d0ca3d6f00c9bc3
以下内容为反编译后的 MyVpnService.java 源代码,内容仅作参考
package app.greyshirts.firewall.app;
import android.content.Intent;
import android.net.VpnService;
import android.os.Handler;
import android.os.ParcelFileDescriptor;
import android.util.Log;
import android.widget.Toast;
import app.greyshirts.firewall.app.debuglog.PersistentLog;
import app.greyshirts.firewall.proxy.ProxyWorker;
import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
public class MyVpnService extends VpnService implements Runnable {
private Handler handler = null;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
PersistentLog.getInstance(this).i("VpnService: onStartCommand intent=" + (intent != null ? intent.toString() : "(null)") + " flags=" + flags, new Object[0]);
Log.i("NRFW", "VpnService onStartCommand intent=" + (intent != null ? intent.toString() : "(null)") + " flags=" + flags);
if (intent == null) {
Toast.makeText(this, "Service restarted", 0).show();
Log.i("NRFW", "service restarted");
PersistentLog.getInstance(this).i("VpnService: intent=null. that means server is restarted automatically. Send STARTVPN command myself", new Object[0]);
Answers.getInstance().logCustom(new CustomEvent("service restarted"));
intent = new Intent();
intent.putExtra("cmd", 1);
}
int cmd2 = intent.getIntExtra("cmd", -1);
switch (cmd2) {
case 1:
PersistentLog.getInstance(this).i("VpnService: CMD_STARTVPN", new Object[0]);
this.handler = new Handler();
new VpnStartThread(this).start();
return 1;
case 2:
PersistentLog.getInstance(this).i("VpnService: CMD_STOPVPN", new Object[0]);
stopVpn();
PersistentLog.getInstance(this).i("VpnService: call stopSelf()", new Object[0]);
stopSelf();
return 1;
default:
Answers.getInstance().logCustom(new CustomEvent("unkonwn service cmd").putCustomAttribute("flags", Integer.valueOf(flags)).putCustomAttribute("startId", Integer.valueOf(startId)).putCustomAttribute("intent", intent.toString()));
return 1;
}
}
@Override
public void run() {
setupVpn();
Log.i("NRFW", "thread end");
}
private void setupVpn() {
PersistentLog.getInstance(this).i("VpnService: try to setup VPN.", new Object[0]);
VpnService.Builder builder = new VpnService.Builder(this);
builder.setSession("firewall");
builder.addAddress("10.0.8.1", 32);
builder.addRoute("0.0.0.0", 0);
try {
ParcelFileDescriptor pfd = builder.establish();
if (pfd == null) {
PersistentLog.getInstance(this).i("VpnService: builder.establish() failed. pfd==null", new Object[0]);
if (this.handler != null) {
this.handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MyVpnService.this, "Cannot establish VPN (app not prepared)", 1).show();
}
});
return;
}
return;
}
PersistentLog.getInstance(this).i("VpnService: call ProxyWorker.start()", new Object[0]);
ProxyWorker.getInstance().start(this, pfd);
} catch (IllegalStateException e) {
PersistentLog.getInstance(this).i("VpnService: builder.establish() failed. e=" + e.toString(), new Object[0]);
if (this.handler != null) {
this.handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MyVpnService.this, "Cannot establish VPN (" + e.toString() + ")", 1).show();
}
});
}
}
}
private void stopVpn() {
PersistentLog.getInstance(this).i("VpnService: call ProxyWorker.stop()", new Object[0]);
ProxyWorker.getInstance().stop();
}
@Override
public void onRevoke() {
Log.i("NRFW", "VpnService: onRevoke() called. ");
PersistentLog.getInstance(this).i("VpnService: onRevoke() called", new Object[0]);
stopVpn();
PersistentLog.getInstance(this).i("VpnService: call stopSelf()", new Object[0]);
stopSelf();
}
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
PersistentLog.getInstance(this).i("VpnService: onTrimMemory() called. level=%d", Integer.valueOf(level));
}
@Override
public void onDestroy() {
Log.i("NRFW", "VpnService onDestroy() called");
PersistentLog.getInstance(this).i("VpnService: onDestroy() called", new Object[0]);
}
class VpnStartThread extends Thread {
public VpnStartThread(Runnable runnable) {
super(runnable, "vpnservice");
MyVpnService.this.handler = new Handler();
}
}
}