Commit 3a6f2345 authored by Administrator's avatar Administrator

添加代理框架代码

parent 1c1b2221
Pipeline #1743 failed with stages
...@@ -11,16 +11,33 @@ android { ...@@ -11,16 +11,33 @@ android {
versionCode 1 versionCode 1
versionName "1.0" versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true
}
signingConfigs {
release {
storeFile rootProject.file('deploy/hermes_key')
storePassword "hermes"
keyAlias "hermes"
keyPassword "hermes"
}
} }
buildTypes { buildTypes {
release { release {
minifyEnabled false minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug {
signingConfig signingConfigs.release
} }
} }
packagingOptions {
exclude 'META-INF/INDEX.LIST'
exclude 'META-INF/io.netty.versions.properties'
}
} }
dependencies { dependencies {
...@@ -28,7 +45,11 @@ dependencies { ...@@ -28,7 +45,11 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1' api project(':echo-lib')
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
//引入netty之后,class直接就爆炸了。考虑实现API精简
implementation 'com.android.support:multidex:1.0.3'
annotationProcessor 'org.projectlombok:lombok:1.18.2'
} }
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.virjar.echo.adr"> package="com.virjar.echo.adr">
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application <application
android:allowBackup="true" android:allowBackup="true"
...@@ -16,6 +21,47 @@ ...@@ -16,6 +21,47 @@
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<service
android:name="com.virjar.echo.adr.HttpProxyService"
android:enabled="true"
android:exported="true"
tools:ignore="ExportedService">
<intent-filter android:priority="1000">
<action android:name="com.virjar.g4proxy.service" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
<!--开机自启服务-->
<receiver
android:name="com.virjar.echo.adr.StartOnBootBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.BOOT_COMPLETED" />
<!-- <category android:name="android.intent.category.DEFAULT" /> -->
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.MEDIA_UNMOUNTED" />
<action android:name="android.intent.action.MEDIA_EJECT" />
</intent-filter>
</receiver>
<!--覆盖安装后唤醒service-->
<!--有些机器会报错-->
<receiver android:name="com.virjar.echo.adr.StartOnBootBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
</application> </application>
</manifest> </manifest>
\ No newline at end of file
package com.virjar.echo.adr;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Build;
import android.os.IBinder;
import android.util.Log;
import androidx.annotation.Nullable;
import androidx.multidex.BuildConfig;
import com.virjar.echo.nat.client.EchoClient;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;
public class HttpProxyService extends Service {
private EchoClient echoClient;
@Nullable
@android.support.annotation.Nullable
@Override
public IBinder onBind(Intent intent) {
startService();
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
startService();
return START_STICKY;
}
private AtomicBoolean serviceStarted = new AtomicBoolean(false);
private void startService() {
if (serviceStarted.compareAndSet(false, true)) {
startServiceInternal();
}
}
private void setNotifyChannel() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
return;
}
NotificationChannel notificationChannel = new NotificationChannel(BuildConfig.APPLICATION_ID,
"channel", NotificationManager.IMPORTANCE_HIGH);
notificationChannel.enableLights(true);
notificationChannel.setLightColor(Color.YELLOW);
notificationChannel.setShowBadge(true);
notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
if (manager == null) {
return;
}
manager.createNotificationChannel(notificationChannel);
}
private void startServiceInternal() {
setNotifyChannel();
Notification.Builder builder = new Notification.Builder(this.getApplicationContext()); //获取一个Notification构造器
// 设置PendingIntent
Intent nfIntent = new Intent(this, MainActivity.class);
builder.setContentIntent(PendingIntent.getActivity(this, 0, nfIntent, FLAG_UPDATE_CURRENT))
.setLargeIcon(BitmapFactory.decodeResource(this.getResources(), R.mipmap.ic_launcher)) // 设置下拉列表中的图标(大图标)
.setContentTitle("EchoProxy")
.setSmallIcon(R.mipmap.ic_launcher)
.setContentText("代理服务agent")
.setWhen(System.currentTimeMillis());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
builder.setChannelId(BuildConfig.APPLICATION_ID);
}
Notification notification = builder.build();
notification.defaults = Notification.DEFAULT_SOUND;
startForeground(110, notification);
//TODO 设备ID生成算法
String clientKey = UUID.randomUUID().toString();
Log.i("weijia", "start EchoProxy front service");
//TODO 设置服务器信息
echoClient = new EchoClient(
"echo.virjar.com", 5698,
clientKey);
echoClient.startUp();
}
}
package com.virjar.echo.adr; package com.virjar.echo.adr;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
...@@ -10,5 +11,7 @@ public class MainActivity extends AppCompatActivity { ...@@ -10,5 +11,7 @@ public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); setContentView(R.layout.activity_main);
startService(new Intent(this, HttpProxyService.class));
} }
} }
package com.virjar.echo.adr;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class StartOnBootBroadcastReceiver extends BroadcastReceiver {
@SuppressLint("UnsafeProtectedBroadcastReceiver")
@Override
public void onReceive(Context context, Intent intent) {
Log.i("weijia", "receive start service broadcast");
context.startService(new Intent(context, HttpProxyService.class));
// clearAbortBroadcast();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment