From c4d0022c42c437aaabd24985ae5ee2fd862d28f8 Mon Sep 17 00:00:00 2001
From: lwb <q3213421wrwqr>
Date: 星期二, 02 三月 2021 11:45:26 +0800
Subject: [PATCH] 9527 bt2

---
 SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load05.png                    |    0 
 SdkProject/plugins/quick/java/com/secondworld/sdk/QuickSdkMgr.java               |  331 ++++++++++++++++
 SdkProject/library/src/main/java/com/secondworld/sdk/PermissionManager.java      |   13 
 SdkProject/library/build.gradle                                                  |    3 
 SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdInstallAPK.java  |    6 
 SdkProject/channel/GTGame/java/com/secondworld/sdk/MySdkMgr.java                 |   24 
 SdkProject/channel/qkbt2game/java/com/secondworld/sdk/BtGameMain.java            |   89 ++++
 SdkProject/plugins/quick/res/xml/filepaths.xml                                   |    6 
 SdkProject/plugins/quick/java/com/secondworld/sdk/SplashActivity.java            |   21 +
 SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load06.png                    |    0 
 SdkProject/plugins/quick/deps.gradle                                             |    3 
 SdkProject/channel/qkbt2game/deps.gradle                                         |    1 
 SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdRoleLogin.java      |   38 +
 SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdCopyContent.java |    6 
 SdkProject/library/src/main/java/com/secondworld/sdk/utils/FileUtil.java         |   14 
 Channel/Android/qkbt2game/deps.gradle                                            |    4 
 Channel/Android/qkbt2game/debug/libs/library-debug-qkbt2game.aar                 |    0 
 SdkProject/plugins/quick/java/com/secondworld/sdk/QuickApp.java                  |   19 
 SdkProject/library/src/main/java/com/secondworld/sdk/UnityMsgHandler.java        |    5 
 SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load07.png                    |    0 
 SdkProject/library/src/main/java/com/secondworld/sdk/utils/SPUtils.java          |    4 
 SdkProject/channel/qkbt2game/build.gradle                                        |    4 
 SdkProject/library/src/main/java/com/secondworld/sdk/PlatformSdkMgr.java         |    3 
 Channel/Android/qkbt2game/release/libs/library-release-qkbt2game.aar             |    0 
 SdkProject/plugins/quick/libs/armeabi/libqkcheck.so                              |    0 
 SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load08.png                    |    0 
 SdkProject/channel/qkbt2game/java/com/secondworld/sdk/BtGameApp.java             |   21 +
 SdkProject/library/src/main/java/com/secondworld/sdk/utils/DeviceUtil.java       |   16 
 SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdPlatformLogout.java |   18 
 SdkProject/plugins/quick/libs/armeabi-v7a/libqkcheck.so                          |    0 
 SdkProject/channel/gtgame/java/com/secondworld/sdk/GTGameApp.java                |   19 
 SdkProject/plugins/quick/libs/quicksdk_v2.7.1_20200309.jar                       |    0 
 SdkProject/channel/qkbt2game/config.properties                                   |    1 
 SdkProject/app/src/main/AndroidManifest.xml                                      |    2 
 SdkProject/library/src/main/java/com/secondworld/sdk/GameAppProxy.java           |   50 ++
 SdkProject/plugins/quick/res/values/qk_game_style.xml                            |   15 
 SdkProject/plugins/quick/res/layout/qk_game_view_loading.xml                     |   14 
 SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load01.png                    |    0 
 SdkProject/plugins/quick/res/drawable-hdpi/qk_game_loadbg.png                    |    0 
 SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdRoleLevelUp.java    |   38 +
 build.gradle                                                                     |   37 +
 SdkProject/library/src/main/AndroidManifest.xml                                  |    1 
 SdkProject/app/src/main/java/com/secondworld/demo/MyApp.java                     |   18 
 SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load02.png                    |    0 
 SdkProject/channel/qkbt2game/java/com/secondworld/sdk/BtGamePlatform.java        |    9 
 SdkProject/library/src/main/java/com/secondworld/sdk/GameActivity.java           |   30 +
 SdkProject/library/src/main/java/com/secondworld/sdk/GameActivityProxy.java      |   21 
 SdkProject/plugins/quick/res/drawable/qk_game_loading.xml                        |   30 +
 SdkProject/channel/qkbt2game/AndroidManifest.xml                                 |   44 ++
 SdkProject/plugins/appsflyer/java/com/secondworld/sdk/AppsFlyerUtil.java         |    6 
 SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdPlatformPay.java    |   60 +++
 SdkProject/library/src/main/java/com/secondworld/sdk/utils/RequestCode.java      |    6 
 SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdPlatformLogin.java  |   18 
 SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load03.png                    |    0 
 SdkProject/app/src/main/java/com/secondworld/demo/MainActivity.java              |   35 +
 SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdInit.java        |    6 
 SdkProject/plugins/quick/libs/x86/libqkcheck.so                                  |    0 
 SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdRestartApp.java  |    4 
 /dev/null                                                                        |    0 
 SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdPayFinished.java    |   16 
 SdkProject/channel/GTGame/java/com/secondworld/sdk/command/CmdPlatformPay.java   |    4 
 SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load04.png                    |    0 
 SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdCreateRole.java     |   37 +
 SdkProject/gradle.properties                                                     |    2 
 SdkProject/library/src/main/java/com/secondworld/sdk/utils/BatteryUtil.java      |    6 
 65 files changed, 1,091 insertions(+), 87 deletions(-)

diff --git a/Channel/Android/qkbt2game/debug/libs/library-debug-qkbt2game.aar b/Channel/Android/qkbt2game/debug/libs/library-debug-qkbt2game.aar
new file mode 100644
index 0000000..2872a99
--- /dev/null
+++ b/Channel/Android/qkbt2game/debug/libs/library-debug-qkbt2game.aar
Binary files differ
diff --git a/Channel/Android/qkbt2game/deps.gradle b/Channel/Android/qkbt2game/deps.gradle
new file mode 100644
index 0000000..7526ca5
--- /dev/null
+++ b/Channel/Android/qkbt2game/deps.gradle
@@ -0,0 +1,4 @@
+//姝よ剼鏈负娓犻亾鐨勭涓夋柟杩滅▼渚濊禆搴撻厤缃紝浼氬鍒跺埌unity涓敤浜庢瀯寤�
+dependencies {
+
+}
diff --git a/Channel/Android/qkbt2game/release/libs/library-release-qkbt2game.aar b/Channel/Android/qkbt2game/release/libs/library-release-qkbt2game.aar
new file mode 100644
index 0000000..91b85eb
--- /dev/null
+++ b/Channel/Android/qkbt2game/release/libs/library-release-qkbt2game.aar
Binary files differ
diff --git a/SdkProject/app/src/main/AndroidManifest.xml b/SdkProject/app/src/main/AndroidManifest.xml
index 898f0d5..0a0be1d 100644
--- a/SdkProject/app/src/main/AndroidManifest.xml
+++ b/SdkProject/app/src/main/AndroidManifest.xml
@@ -6,7 +6,7 @@
     <uses-permission android:name="android.permission.INTERNET" />
 
     <application
-        android:name=".MyApp"
+        android:name="com.secondworld.sdk.BtGameApp"
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
diff --git a/SdkProject/app/src/main/java/com/secondworld/demo/MainActivity.java b/SdkProject/app/src/main/java/com/secondworld/demo/MainActivity.java
index c0fc998..bb0eb5b 100644
--- a/SdkProject/app/src/main/java/com/secondworld/demo/MainActivity.java
+++ b/SdkProject/app/src/main/java/com/secondworld/demo/MainActivity.java
@@ -5,7 +5,9 @@
 import android.support.annotation.NonNull;
 import android.widget.RelativeLayout;
 
+import com.secondworld.sdk.BtGameMain;
 import com.secondworld.sdk.GameActivityProxy;
+import com.secondworld.sdk.GameAppProxy;
 import com.secondworld.sdk.UnityMsgHandler;
 import com.secondworld.sdk.utils.CodeU2A;
 import com.secondworld.sdk.utils.LogUtil;
@@ -16,7 +18,7 @@
 
 public class MainActivity extends Activity {
 
-    private static Class<? extends GameActivityProxy> proxyClass;
+    private static Class<? extends GameActivityProxy> proxyClass= BtGameMain.class;
 
     GameActivityProxy proxy;
 
@@ -28,6 +30,7 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        GameAppProxy.isDemo=true;
         setContentView(R.layout.activity_main);
         RelativeLayout webContainer = findViewById(com.secondworld.sdk.R.id.webContainer);
         WebViewUtil.I.init(this, webContainer);
@@ -59,13 +62,23 @@
         findViewById(R.id.pay).setOnClickListener((v -> {
             JSONObject json = new JSONObject();
             try {
+                json.put("sid","10");
+                json.put("serverName","bt2server");
+                json.put("roleName","hahaha");
+                json.put("roleID","123");
+                json.put("money","110");
+                json.put("vipLevel","5");
+                json.put("level","10");
+                json.put("familyName","hengha");
+                json.put("createTime","");
+
                 json.put("code", CodeU2A.PlatformPay);
                 json.put("cpInfo", "com.sanxiagame.zmjgp099");
                 json.put("orderId", System.currentTimeMillis() / 1000 + "");
                 json.put("sid", "1");
                 json.put("roleID", "test_role");
                 json.put("title", "goods_100");
-                json.put("mount", "0.01");
+                json.put("mount", "0.009999999776482582");
             } catch (JSONException e) {
                 e.printStackTrace();
             }
@@ -84,7 +97,23 @@
         });
 
         findViewById(R.id.btnB).setOnClickListener(v -> {
-            unityMessage(CodeU2A.ShareToFaceBook);
+            JSONObject json = new JSONObject();
+            try {
+                json.put("sid","bt2");
+                json.put("serverName","bt2server");
+                json.put("roleName","hahaha");
+                json.put("roleID","123");
+                json.put("money","110");
+                json.put("vipLevel","5");
+                json.put("level","10");
+                json.put("familyName","hengha");
+                json.put("createTime","");
+
+                json.put("code", CodeU2A.CreateRole);
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+            UnityMsgHandler.onUnityMessage(json.toString());
         });
     }
 
diff --git a/SdkProject/app/src/main/java/com/secondworld/demo/MyApp.java b/SdkProject/app/src/main/java/com/secondworld/demo/MyApp.java
index 6af5ddc..db80e71 100644
--- a/SdkProject/app/src/main/java/com/secondworld/demo/MyApp.java
+++ b/SdkProject/app/src/main/java/com/secondworld/demo/MyApp.java
@@ -1,21 +1,19 @@
 package com.secondworld.demo;
 
-import com.secondworld.sdk.GTGameApp;
-import com.secondworld.sdk.GTGameMain;
+import android.app.Application;
 
-public class MyApp extends GTGameApp {
+import com.secondworld.sdk.BtGameMain;
+import com.secondworld.sdk.GameAppProxy;
+
+public class MyApp extends Application {
 
     @Override
     public void onCreate() {
-        isDemo=true;
         super.onCreate();
-    }
-
-    @Override
-    protected void registerProxy() {
-        super.registerProxy();
+        GameAppProxy.create(this,null);
+        GameAppProxy.isDemo=true;
         //涓荤晫闈唬鐞嗘敞鍐�
-        MainActivity.registerProxy(GTGameMain.class);
+        MainActivity.registerProxy(BtGameMain.class);
     }
 
 }
diff --git a/SdkProject/channel/GTGame/java/com/secondworld/sdk/MySdkMgr.java b/SdkProject/channel/GTGame/java/com/secondworld/sdk/MySdkMgr.java
index 991d060..e00dfaa 100644
--- a/SdkProject/channel/GTGame/java/com/secondworld/sdk/MySdkMgr.java
+++ b/SdkProject/channel/GTGame/java/com/secondworld/sdk/MySdkMgr.java
@@ -37,7 +37,7 @@
             case UNKNOWN: {
                 if (GTGameMain.I.activity != null)
                     init(GTGameMain.I.activity);
-                Toast.makeText(GameApp.I, "姝e湪鍒濆鍖栦腑锛岃绋嶇瓑", Toast.LENGTH_LONG).show();
+                Toast.makeText(GameAppProxy.app, "姝e湪鍒濆鍖栦腑锛岃绋嶇瓑", Toast.LENGTH_LONG).show();
                 break;
             }
             case SUCCEED: {
@@ -45,14 +45,13 @@
                 break;
             }
             case LOADING: {
-                Toast.makeText(GameApp.I, "姝e湪鍒濆鍖栦腑锛岃绋嶇瓑", Toast.LENGTH_LONG).show();
+                Toast.makeText(GameAppProxy.app, "姝e湪鍒濆鍖栦腑锛岃绋嶇瓑", Toast.LENGTH_LONG).show();
                 break;
             }
         }
     }
 
     public void setListener() {
-        args = new HashMap<>();
         // 鍒濆鍖栫洃鍚�
         SdkManager.getInstance().setInitListener(new InitListener() {
             @Override
@@ -82,7 +81,7 @@
                     info.put("game_id", SdkManager.getInstance().getGameId());
                     info.put("session_id", SdkManager.getInstance().getSessionId());
                     args.put("info", info);
-                    UnityMsgHandler.sendMessageToUnity(CodeA2U.PlatformLoginOk,args);
+                    UnityMsgHandler.sendMessageToUnity(CodeA2U.PlatformLoginOk, args);
                 } catch (JSONException e) {
                     e.printStackTrace();
                     LogUtil.e("SdkManager 鐧诲綍鎴愬姛", e);
@@ -95,7 +94,7 @@
                 LogUtil.e("SdkManager", "娉ㄥ唽鎴愬姛" + " isNewReg锛�" + isNewReg + "  type锛�" + reg_type);
                 args.clear();
                 args.put("reg_type", reg_type);
-                UnityMsgHandler.sendMessageToUnity(CodeA2U.PlatformRegisterOk,args);
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.PlatformRegisterOk, args);
             }
 
             @Override
@@ -115,16 +114,19 @@
             @Override
             public void onSuccess(String status, String orderId) {
                 LogUtil.debug("SdkManager", "onSuccess status:" + status + ",orderId:" + orderId);
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.PlatformPayOk);
             }
 
             @Override
             public void onError() {
                 LogUtil.e("SdkManager", "onError");
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.PlatformPayFail);
             }
 
             @Override
             public void onCancel() {
                 LogUtil.debug("SdkManager", "onCancel");
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.PlatformPayCancel);
             }
         });
 
@@ -177,7 +179,7 @@
             public void onSuccess(String type) {
                 Map<String, Object> args = new HashMap<>();
                 args.put("state", CallBackState.Success);
-                UnityMsgHandler.sendMessageToUnity(CodeA2U.ShareState,args);
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.ShareState, args);
                 LogUtil.debug("鍒嗕韩鍥炶皟", "onSuccess锛�" + type);
             }
 
@@ -185,7 +187,7 @@
             public void onError(String type, String msg) {
                 Map<String, Object> args = new HashMap<>();
                 args.put("state", CallBackState.Error);
-                UnityMsgHandler.sendMessageToUnity(CodeA2U.ShareState,args);
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.ShareState, args);
                 LogUtil.debug("鍒嗕韩鍥炶皟", "type锛�" + type + ";msg锛�" + msg);
             }
 
@@ -193,7 +195,7 @@
             public void onCancel(String type) {
                 Map<String, Object> args = new HashMap<>();
                 args.put("state", CallBackState.Cancel);
-                UnityMsgHandler.sendMessageToUnity( CodeA2U.ShareState,args);
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.ShareState, args);
                 LogUtil.debug("鍒嗕韩鍥炶皟", type + "锛歰nCancel");
             }
         });
@@ -204,7 +206,7 @@
             public void onSuccess() {
                 Map<String, Object> args = new HashMap<>();
                 args.put("state", CallBackState.Success);
-                UnityMsgHandler.sendMessageToUnity(CodeA2U.ReviewState,args);
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.ReviewState, args);
                 LogUtil.debug("璇勫垎鍥炶皟", "鎴愬姛");
             }
 
@@ -212,7 +214,7 @@
             public void onError(String s) {
                 Map<String, Object> args = new HashMap<>();
                 args.put("state", CallBackState.Error);
-                UnityMsgHandler.sendMessageToUnity(CodeA2U.ReviewState,args);
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.ReviewState, args);
                 LogUtil.debug("璇勫垎鍥炶皟", "澶辫触锛�" + s);
             }
 
@@ -220,7 +222,7 @@
             public void onCancel() {
                 Map<String, Object> args = new HashMap<>();
                 args.put("state", CallBackState.Cancel);
-                UnityMsgHandler.sendMessageToUnity(CodeA2U.ReviewState,args);
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.ReviewState, args);
                 LogUtil.debug("璇勫垎鍥炶皟", "鍙栨秷");
             }
         });
diff --git a/SdkProject/channel/GTGame/java/com/secondworld/sdk/command/CmdPlatformPay.java b/SdkProject/channel/GTGame/java/com/secondworld/sdk/command/CmdPlatformPay.java
index 5364240..b66722d 100644
--- a/SdkProject/channel/GTGame/java/com/secondworld/sdk/command/CmdPlatformPay.java
+++ b/SdkProject/channel/GTGame/java/com/secondworld/sdk/command/CmdPlatformPay.java
@@ -3,7 +3,7 @@
 import android.util.Base64;
 
 import com.cy.yyjia.sdk.center.SdkManager;
-import com.secondworld.sdk.GameApp;
+import com.secondworld.sdk.GameAppProxy;
 import com.secondworld.sdk.utils.CodeU2A;
 
 import org.json.JSONObject;
@@ -19,7 +19,7 @@
     @Override
     public void process(JSONObject json) throws Exception {
         JSONObject extraData = new JSONObject();
-        extraData.put("appid", GameApp.I.appId);
+        extraData.put("appid", GameAppProxy.appId);
         extraData.put("cpinfo", json.getString("cpInfo"));
         extraData.put("cporderid", json.getString("orderId"));
         byte[] bytes = extraData.toString().getBytes(StandardCharsets.UTF_8);
diff --git a/SdkProject/channel/gtgame/java/com/secondworld/sdk/GTGameApp.java b/SdkProject/channel/gtgame/java/com/secondworld/sdk/GTGameApp.java
index ef4e096..c34aa63 100644
--- a/SdkProject/channel/gtgame/java/com/secondworld/sdk/GTGameApp.java
+++ b/SdkProject/channel/gtgame/java/com/secondworld/sdk/GTGameApp.java
@@ -1,26 +1,25 @@
 package com.secondworld.sdk;
 
-public class GTGameApp extends GameApp {
+import android.app.Application;
 
+public class GTGameApp extends Application {
 
     @Override
+    public void onCreate() {
+        super.onCreate();
+        GameAppProxy.create(this,new GTGamePlatform());
+        registerProxy();
+        initSdk();
+    }
+
     protected void registerProxy() {
-        super.registerProxy();
         //涓荤晫闈唬鐞嗘敞鍐�
         GameActivity.registerProxy(GTGameMain.class);
         AppsFlyerUtil.init();
     }
 
-    @Override
-    protected void initPlatformDiff() {
-        PlatformDiff.I = new GTGamePlatform();
-    }
-
-    @Override
     protected void initSdk() {
-        super.initSdk();
         MySdkMgr.I.setListener();
     }
-
 
 }
diff --git a/SdkProject/channel/qkbt2game/AndroidManifest.xml b/SdkProject/channel/qkbt2game/AndroidManifest.xml
new file mode 100644
index 0000000..68ae4b3
--- /dev/null
+++ b/SdkProject/channel/qkbt2game/AndroidManifest.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    package="com.secondworld.sdk">
+
+    <uses-permission android:name="android.permission.GET_TASKS" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
+    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
+
+    <application
+        android:name=".BtGameApp"
+        android:allowBackup="true"
+        android:requestLegacyExternalStorage="true"
+        android:usesCleartextTraffic="true"
+        tools:replace="android:name">
+
+        <meta-data
+            android:name="unityplayer.ForwardNativeEventsToDalvik"
+            android:value="true" />
+
+        <activity
+            android:name="com.secondworld.sdk.SplashActivity"
+            android:screenOrientation="sensorLandscape">
+        </activity>
+
+        <provider
+            android:name="android.support.v4.content.FileProvider"
+            android:authorities="quicksdk_packName.Provider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/filepaths" />
+        </provider>
+
+
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/SdkProject/channel/qkbt2game/build.gradle b/SdkProject/channel/qkbt2game/build.gradle
new file mode 100644
index 0000000..c8f58a8
--- /dev/null
+++ b/SdkProject/channel/qkbt2game/build.gradle
@@ -0,0 +1,4 @@
+//褰撳墠鑴氭湰涓烘笭閬撶殑宸紓鍖栭厤缃�
+dependencies {
+//    implementation project(path: ':quick')
+}
\ No newline at end of file
diff --git a/SdkProject/channel/qkbt2game/config.properties b/SdkProject/channel/qkbt2game/config.properties
new file mode 100644
index 0000000..4218897
--- /dev/null
+++ b/SdkProject/channel/qkbt2game/config.properties
@@ -0,0 +1 @@
+PLUGINS=quick
\ No newline at end of file
diff --git a/SdkProject/channel/qkbt2game/deps.gradle b/SdkProject/channel/qkbt2game/deps.gradle
new file mode 100644
index 0000000..124a6b8
--- /dev/null
+++ b/SdkProject/channel/qkbt2game/deps.gradle
@@ -0,0 +1 @@
+//姝よ剼鏈负娓犻亾鐨勭涓夋柟杩滅▼渚濊禆搴撻厤缃紝浼氬鍒跺埌unity涓敤浜庢瀯寤�
\ No newline at end of file
diff --git a/SdkProject/channel/qkbt2game/java/com/secondworld/sdk/BtGameApp.java b/SdkProject/channel/qkbt2game/java/com/secondworld/sdk/BtGameApp.java
new file mode 100644
index 0000000..8dbf6f4
--- /dev/null
+++ b/SdkProject/channel/qkbt2game/java/com/secondworld/sdk/BtGameApp.java
@@ -0,0 +1,21 @@
+package com.secondworld.sdk;
+
+public class BtGameApp extends QuickApp {
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        QuickSdkMgr.I.register("25969262062227241391437599980432","93995626");
+    }
+
+    @Override
+    protected PlatformDiff getPlatform() {
+        return new BtGamePlatform();
+    }
+
+    @Override
+    protected Class<? extends GameActivityProxy> getMainProxy() {
+        return BtGameMain.class;
+    }
+
+}
diff --git a/SdkProject/channel/qkbt2game/java/com/secondworld/sdk/BtGameMain.java b/SdkProject/channel/qkbt2game/java/com/secondworld/sdk/BtGameMain.java
new file mode 100644
index 0000000..3878320
--- /dev/null
+++ b/SdkProject/channel/qkbt2game/java/com/secondworld/sdk/BtGameMain.java
@@ -0,0 +1,89 @@
+package com.secondworld.sdk;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.support.annotation.NonNull;
+import android.view.KeyEvent;
+
+import com.quicksdk.QuickSDK;
+import com.quicksdk.Sdk;
+
+public class BtGameMain extends GameActivityProxy {
+
+    @Override
+    public void onCreate(Activity activity) {
+        super.onCreate(activity);
+        QuickSdkMgr.I.requestPermissions(activity);
+        com.quicksdk.Sdk.getInstance().onCreate(activity);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        com.quicksdk.Sdk.getInstance().onStart(activity);
+    }
+
+    @Override
+    public void onRestart() {
+        super.onRestart();
+        com.quicksdk.Sdk.getInstance().onRestart(activity);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        com.quicksdk.Sdk.getInstance().onResume(activity);
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        com.quicksdk.Sdk.getInstance().onStop(activity);
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        com.quicksdk.Sdk.getInstance().onDestroy(activity);
+    }
+
+    @Override
+    public void onNewIntent(Intent intent) {
+        super.onNewIntent(intent);
+        com.quicksdk.Sdk.getInstance().onNewIntent(intent);
+    }
+
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        QuickSdkMgr.I.onActivityResult(activity, requestCode);
+        com.quicksdk.Sdk.getInstance().onActivityResult(activity, requestCode, resultCode, data);
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+        QuickSdkMgr.I.onRequestPermissionsResult(activity, requestCode, grantResults);
+    }
+
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        if (keyCode == KeyEvent.KEYCODE_BACK) {
+            if (QuickSDK.getInstance().isShowExitDialog()) {
+                Sdk.getInstance().exit(activity);
+            } else {
+                // 娓告垙璋冪敤鑷韩鐨勯��鍑哄璇濇锛岀偣鍑荤‘瀹氬悗锛岃皟鐢╭uick鐨別xit鎺ュ彛
+                new AlertDialog.Builder(activity).setTitle("閫�鍑�").setMessage("鏄惁閫�鍑烘父鎴�?").setPositiveButton("纭畾", new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface arg0, int arg1) {
+                        Sdk.getInstance().exit(activity);
+                    }
+                }).setNegativeButton("鍙栨秷", null).show();
+            }
+            return true;
+        }
+        return super.onKeyDown(keyCode, event);
+    }
+}
diff --git a/SdkProject/channel/qkbt2game/java/com/secondworld/sdk/BtGamePlatform.java b/SdkProject/channel/qkbt2game/java/com/secondworld/sdk/BtGamePlatform.java
new file mode 100644
index 0000000..f86841f
--- /dev/null
+++ b/SdkProject/channel/qkbt2game/java/com/secondworld/sdk/BtGamePlatform.java
@@ -0,0 +1,9 @@
+                                               package com.secondworld.sdk;
+
+public class BtGamePlatform extends PlatformDiff {
+
+    @Override
+    public String platformName() {
+        return "sanxia";
+    }
+}
diff --git a/SdkProject/gradle.properties b/SdkProject/gradle.properties
index 636bdd6..4af83fa 100644
--- a/SdkProject/gradle.properties
+++ b/SdkProject/gradle.properties
@@ -18,4 +18,4 @@
 ## Automatically convert third-party libraries to use AndroidX
 android.enableJetifier=false
 #褰撳墠鏋勫缓鐨勬笭閬撳悕绉�
-CHANNEL_NAME=gtgame
\ No newline at end of file
+CHANNEL_NAME=qkbt2game
diff --git a/SdkProject/library/build.gradle b/SdkProject/library/build.gradle
index 0d9da87..f7a0d8a 100644
--- a/SdkProject/library/build.gradle
+++ b/SdkProject/library/build.gradle
@@ -186,6 +186,9 @@
 //    implementation 'com.github.pqpo:Log4a:1.4.2@aar'
 
     implementation fileTree(dir: "../channel/${CHANNEL_NAME}/libs/", include: ['*.jar'])
+    plugins.each {
+        implementation fileTree(dir: "${rootPath}/plugins/${it}/libs/", include: ['*.jar'])
+    }
     implementation fileTree(dir: 'libs', include: ['*.jar'], exclude: ['unity-classes.jar'])
     compileOnly files('libs/unity-classes.jar')
 }
\ No newline at end of file
diff --git a/SdkProject/library/src/main/AndroidManifest.xml b/SdkProject/library/src/main/AndroidManifest.xml
index 2db666b..b4a7691 100644
--- a/SdkProject/library/src/main/AndroidManifest.xml
+++ b/SdkProject/library/src/main/AndroidManifest.xml
@@ -13,7 +13,6 @@
     <uses-permission android:name="android.permission.RECORD_AUDIO" />
 
     <application
-        android:name="com.secondworld.sdk.GameApp"
         android:allowBackup="true"
         android:supportsRtl="true">
 
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/GameActivity.java b/SdkProject/library/src/main/java/com/secondworld/sdk/GameActivity.java
index 16c23a6..0181734 100644
--- a/SdkProject/library/src/main/java/com/secondworld/sdk/GameActivity.java
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/GameActivity.java
@@ -1,7 +1,9 @@
 package com.secondworld.sdk;
 
+import android.content.Intent;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
+import android.view.KeyEvent;
 import android.webkit.WebView;
 import android.widget.FrameLayout;
 import android.widget.RelativeLayout;
@@ -53,6 +55,13 @@
     }
 
     @Override
+    protected void onRestart() {
+        super.onRestart();
+        if (proxy != null)
+            proxy.onRestart();
+    }
+
+    @Override
     protected void onResume() {
         super.onResume();
         if (proxy != null)
@@ -81,10 +90,31 @@
     }
 
     @Override
+    protected void onNewIntent(Intent intent) {
+        super.onNewIntent(intent);
+        if (proxy != null)
+            proxy.onNewIntent(intent);
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (proxy != null)
+            proxy.onActivityResult(requestCode, resultCode, data);
+    }
+
+    @Override
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
         if (proxy != null)
             proxy.onRequestPermissionsResult(requestCode, permissions, grantResults);
     }
 
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        if (proxy == null)
+            return super.onKeyDown(keyCode, event);
+        boolean b = proxy.onKeyDown(keyCode, event);
+        return b ? b : super.onKeyDown(keyCode, event);
+    }
 }
\ No newline at end of file
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/GameActivityProxy.java b/SdkProject/library/src/main/java/com/secondworld/sdk/GameActivityProxy.java
index 00de247..409a520 100644
--- a/SdkProject/library/src/main/java/com/secondworld/sdk/GameActivityProxy.java
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/GameActivityProxy.java
@@ -1,7 +1,9 @@
 package com.secondworld.sdk;
 
 import android.app.Activity;
+import android.content.Intent;
 import android.support.annotation.NonNull;
+import android.view.KeyEvent;
 
 
 /**
@@ -9,7 +11,7 @@
  */
 public class GameActivityProxy {
 
-    protected Activity activity;
+    public Activity activity;
 
     public static GameActivityProxy I;
 
@@ -19,6 +21,10 @@
     }
 
     public void onStart() {
+
+    }
+
+    public void onRestart() {
 
     }
 
@@ -39,8 +45,19 @@
         I = null;
     }
 
+    public void onNewIntent(Intent intent) {
+    }
+
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+
+    }
+
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
-        PermissionManager.I.onRequestPermissionsResult(activity,requestCode, permissions, grantResults);
+        PermissionManager.I.onRequestPermissionsResult(activity, requestCode, permissions, grantResults);
+    }
+
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        return false;
     }
 
 }
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/GameApp.java b/SdkProject/library/src/main/java/com/secondworld/sdk/GameApp.java
deleted file mode 100644
index 163abee..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/sdk/GameApp.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package com.secondworld.sdk;
-
-import android.app.Application;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.os.Handler;
-
-import com.secondworld.sdk.utils.LogUtil;
-import com.unity3d.player.UnityPlayer;
-
-public abstract class GameApp extends Application {
-
-    public static GameApp I;
-
-    public String appId = "";
-
-    protected boolean isDemo = false;
-
-    @Override
-    public void onCreate() {
-        super.onCreate();
-        newInstance();
-        initPlatformDiff();
-        LogUtil.Init(this);
-        UnityMsgHandler.initCommandMap();
-        registerProxy();
-        initSdk();
-    }
-
-    protected void newInstance() {
-        I = this;
-    }
-
-    protected abstract void initPlatformDiff();
-
-    protected void registerProxy() {
-
-    }
-
-    protected void initSdk() {
-    }
-
-    public void appExit() {
-        new Handler().postDelayed(new Runnable() {
-            @Override
-            public void run() {
-                android.os.Process.killProcess(android.os.Process.myPid());// 鏉�杩涚▼
-            }
-        }, 1000);
-        if (UnityPlayer.currentActivity != null)
-            UnityPlayer.currentActivity.finish();
-    }
-
-    public void restartApp() {
-        new Handler().postDelayed(() -> {
-            String _pn = I.getPackageName();
-            PackageManager packageManager = I.getPackageManager();
-            Intent intent = packageManager.getLaunchIntentForPackage(_pn);
-            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
-            I.startActivity(intent);
-            android.os.Process.killProcess(android.os.Process.myPid());// 鏉�杩涚▼
-        }, 1000);
-        if (UnityPlayer.currentActivity != null)
-            UnityPlayer.currentActivity.finish();
-    }
-
-    //鏄惁浣峝emo
-    public boolean isDemo() {
-        return isDemo;
-    }
-
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/GameAppProxy.java b/SdkProject/library/src/main/java/com/secondworld/sdk/GameAppProxy.java
new file mode 100644
index 0000000..dd3404d
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/GameAppProxy.java
@@ -0,0 +1,50 @@
+package com.secondworld.sdk;
+
+import android.app.Application;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Handler;
+
+import com.unity3d.player.UnityPlayer;
+
+public class GameAppProxy {
+
+    public static Application app;
+
+    public static String appId = "";
+
+    public static boolean isDemo = false;
+
+    public static void create(Application app, PlatformDiff diff) {
+        PlatformDiff.I = diff;
+        GameAppProxy.app = app;
+        UnityMsgHandler.initCommandMap();
+    }
+
+    public static void appExit() {
+        new Handler().postDelayed(() -> {
+            android.os.Process.killProcess(android.os.Process.myPid());// 鏉�杩涚▼
+        }, 1000);
+        if (UnityPlayer.currentActivity != null)
+            UnityPlayer.currentActivity.finish();
+    }
+
+    public static void restartApp() {
+        new Handler().postDelayed(() -> {
+            String _pn = app.getPackageName();
+            PackageManager packageManager = app.getPackageManager();
+            Intent intent = packageManager.getLaunchIntentForPackage(_pn);
+            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+            app.startActivity(intent);
+            android.os.Process.killProcess(android.os.Process.myPid());// 鏉�杩涚▼
+        }, 1000);
+        if (UnityPlayer.currentActivity != null)
+            UnityPlayer.currentActivity.finish();
+    }
+
+    //鏄惁浣峝emo
+    public static boolean isDemo() {
+        return isDemo;
+    }
+
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/PermissionManager.java b/SdkProject/library/src/main/java/com/secondworld/sdk/PermissionManager.java
index 7163eac..e49a265 100644
--- a/SdkProject/library/src/main/java/com/secondworld/sdk/PermissionManager.java
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/PermissionManager.java
@@ -9,6 +9,7 @@
 
 import com.secondworld.sdk.utils.CallBackState;
 import com.secondworld.sdk.utils.CodeA2U;
+import com.secondworld.sdk.utils.RequestCode;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -20,14 +21,12 @@
 
     public static PermissionManager I = new PermissionManager();
 
-    private static final int  REQUEST_CODE = 9527;
-
     /**
      * 鏌ヨ鏄惁鏈夋潈闄�
      */
     public boolean hasPermission(String permission) {
-        return ContextCompat.checkSelfPermission(GameApp.I, permission) == PackageManager.PERMISSION_GRANTED
-                && PermissionChecker.checkSelfPermission(GameApp.I, permission) == PackageManager.PERMISSION_GRANTED;
+        return ContextCompat.checkSelfPermission(GameAppProxy.app, permission) == PackageManager.PERMISSION_GRANTED
+                && PermissionChecker.checkSelfPermission(GameAppProxy.app, permission) == PackageManager.PERMISSION_GRANTED;
     }
 
     /**
@@ -36,15 +35,15 @@
     public void requestPermissions(String permission) {
         if (GameActivityProxy.I == null || GameActivityProxy.I.activity == null)
             return;
-        ActivityCompat.requestPermissions(GameActivityProxy.I.activity, new String[]{permission}, REQUEST_CODE);
+        ActivityCompat.requestPermissions(GameActivityProxy.I.activity, new String[]{permission}, RequestCode.UNITY);
     }
 
 
     public void onRequestPermissionsResult(Activity activity, int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
-        if (activity == null||permissions.length==0||requestCode!=REQUEST_CODE)
+        if (activity == null || permissions.length == 0 || requestCode != RequestCode.UNITY)
             return;
         Map<String, Object> map = new HashMap<>();
-        map.put("permission",permissions[0]);
+        map.put("permission", permissions[0]);
         if (hasPermission(permissions[0])) {
             map.put("state", CallBackState.Success);
         } else {
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/PlatformSdkMgr.java b/SdkProject/library/src/main/java/com/secondworld/sdk/PlatformSdkMgr.java
index 4593281..d212a95 100644
--- a/SdkProject/library/src/main/java/com/secondworld/sdk/PlatformSdkMgr.java
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/PlatformSdkMgr.java
@@ -1,5 +1,6 @@
 package com.secondworld.sdk;
 
+import java.util.HashMap;
 import java.util.Map;
 
 public class PlatformSdkMgr {
@@ -11,7 +12,7 @@
         LOADING//姝e湪鍒濆鍖�
     }
 
-    protected Map<String, Object> args;
+    protected Map<String, Object> args = new HashMap<>();;
 
     public SdkInitState sdkInitState = SdkInitState.UNKNOWN; //sdk鍒濆鍖栫姸鎬�
 
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/UnityMsgHandler.java b/SdkProject/library/src/main/java/com/secondworld/sdk/UnityMsgHandler.java
index 9077d87..c0cdbe8 100644
--- a/SdkProject/library/src/main/java/com/secondworld/sdk/UnityMsgHandler.java
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/UnityMsgHandler.java
@@ -2,7 +2,6 @@
 
 import com.secondworld.sdk.command.CmdInit;
 import com.secondworld.sdk.command.ICommand;
-import com.secondworld.sdk.utils.CodeA2U;
 import com.secondworld.sdk.utils.LogUtil;
 import com.secondworld.sdk.utils.StaticDefine;
 import com.unity3d.player.UnityPlayer;
@@ -75,7 +74,7 @@
      */
     public static List<String> getClassName(String packageName) throws IOException {
         List<String> classNameList = new ArrayList<String>();
-        DexFile df = new DexFile(GameApp.I.getPackageCodePath());//閫氳繃DexFile鏌ユ壘褰撳墠鐨凙PK涓彲鎵ц鏂囦欢
+        DexFile df = new DexFile(GameAppProxy.app.getPackageCodePath());//閫氳繃DexFile鏌ユ壘褰撳墠鐨凙PK涓彲鎵ц鏂囦欢
         Enumeration<String> enumeration = df.entries();//鑾峰彇df涓殑鍏冪礌  杩欓噷鍖呭惈浜嗘墍鏈夊彲鎵ц鐨勭被鍚� 璇ョ被鍚嶅寘鍚簡鍖呭悕+绫诲悕鐨勬柟寮�
         while (enumeration.hasMoreElements()) {//閬嶅巻
             String className = (String) enumeration.nextElement();
@@ -100,7 +99,7 @@
             args = new HashMap<>();
         args.put("code", code);
         JSONObject jsonObject = new JSONObject(args);
-        if (GameApp.I.isDemo()) {
+        if (GameAppProxy.isDemo()) {
             LogUtil.debug("鍙戦�佹秷鎭埌unity", jsonObject.toString());
             return;
         }
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdCopyContent.java b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdCopyContent.java
index 9e34fdd..4d8ecbc 100644
--- a/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdCopyContent.java
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdCopyContent.java
@@ -4,12 +4,10 @@
 import android.content.ClipboardManager;
 import android.content.Context;
 
-import com.secondworld.sdk.AsyncTaskOperator;
-import com.secondworld.sdk.GameApp;
+import com.secondworld.sdk.GameAppProxy;
 import com.secondworld.sdk.utils.CodeU2A;
 import com.secondworld.sdk.utils.LogUtil;
 
-import org.json.JSONException;
 import org.json.JSONObject;
 
 public class CmdCopyContent implements ICommand {
@@ -23,7 +21,7 @@
     public void process(JSONObject json) {
         try {
             String content = json.getString("content");
-            ClipboardManager mgr = (ClipboardManager) GameApp.I.getSystemService(
+            ClipboardManager mgr = (ClipboardManager) GameAppProxy.app.getSystemService(
                     Context.CLIPBOARD_SERVICE);
             ClipData data = ClipData.newPlainText("playerId", content);
             mgr.setPrimaryClip(data);
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdInit.java b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdInit.java
index 1e54fda..f1cce9d 100644
--- a/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdInit.java
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdInit.java
@@ -3,7 +3,7 @@
 
 import android.app.AlertDialog;
 
-import com.secondworld.sdk.GameApp;
+import com.secondworld.sdk.GameAppProxy;
 import com.secondworld.sdk.PlatformDiff;
 import com.secondworld.sdk.UnityMsgHandler;
 import com.secondworld.sdk.utils.CodeA2U;
@@ -31,7 +31,7 @@
 
     @Override
     public void process(JSONObject json) throws JSONException {
-        GameApp.I.appId = json.getString("appID");
+        GameAppProxy.appId = json.getString("appID");
 
         long size = DeviceUtil.getTotalRAMSize() / 1024 / 1024;
         LogUtil.debug("CmdInit", "鍐呭瓨锛�" + size + " mb");
@@ -42,7 +42,7 @@
             _builder.setCancelable(false);
             _builder.setMessage("鎮ㄧ殑璁惧杩愯鍐呭瓨涓嶆弧瓒宠姹�,鏃犳硶姝e父杩愯娓告垙");
             _builder.setPositiveButton("纭畾", (dialogInterface, i) -> {
-                GameApp.I.appExit();
+                GameAppProxy.appExit();
             });
             _builder.show();
             return;
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdInstallAPK.java b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdInstallAPK.java
index 05cf764..74cfe73 100644
--- a/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdInstallAPK.java
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdInstallAPK.java
@@ -4,7 +4,7 @@
 import android.net.Uri;
 import android.widget.Toast;
 
-import com.secondworld.sdk.GameApp;
+import com.secondworld.sdk.GameAppProxy;
 import com.secondworld.sdk.utils.CodeU2A;
 import com.secondworld.sdk.utils.LogUtil;
 
@@ -25,14 +25,14 @@
             File file = new File(path);
             if (!file.exists()) {
                 LogUtil.w("InstallApp", "鏂囦欢涓嶅瓨鍦�");
-                Toast.makeText(GameApp.I, "鎵句笉瀹夎鏂囦欢", Toast.LENGTH_SHORT).show();
+                Toast.makeText(GameAppProxy.app, "鎵句笉瀹夎鏂囦欢", Toast.LENGTH_SHORT).show();
                 return;
             }
             Intent _intent = new Intent(Intent.ACTION_VIEW);
             _intent.setDataAndType(Uri.fromFile(file),
                     "application/vnd.android.package-archive");
             _intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-            GameApp.I.startActivity(_intent);
+            GameAppProxy.app.startActivity(_intent);
         } catch (Exception e) {
             LogUtil.e("CmdInstallAPK", e);
         }
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdRestartApp.java b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdRestartApp.java
index 0ffcfd1..1f12873 100644
--- a/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdRestartApp.java
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdRestartApp.java
@@ -1,6 +1,6 @@
 package com.secondworld.sdk.command;
 
-import com.secondworld.sdk.GameApp;
+import com.secondworld.sdk.GameAppProxy;
 import com.secondworld.sdk.utils.CodeU2A;
 
 import org.json.JSONObject;
@@ -13,6 +13,6 @@
 
     @Override
     public void process(JSONObject json) {
-        GameApp.I.restartApp();
+        GameAppProxy.restartApp();
     }
 }
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/utils/BatteryUtil.java b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/BatteryUtil.java
index b72978e..3ab7e57 100644
--- a/SdkProject/library/src/main/java/com/secondworld/sdk/utils/BatteryUtil.java
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/BatteryUtil.java
@@ -6,7 +6,7 @@
 import android.content.IntentFilter;
 import android.os.BatteryManager;
 
-import com.secondworld.sdk.GameApp;
+import com.secondworld.sdk.GameAppProxy;
 import com.secondworld.sdk.UnityMsgHandler;
 
 import java.util.HashMap;
@@ -35,13 +35,13 @@
     public void start() {
         m_BatteryBroadCastReceiver = new BatteryBroadCastReceiver();
         IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
-        GameApp.I.registerReceiver(m_BatteryBroadCastReceiver, filter);
+        GameAppProxy.app.registerReceiver(m_BatteryBroadCastReceiver, filter);
     }
 
     public void stop() {
         if (m_BatteryBroadCastReceiver != null) {
             try {
-                GameApp.I.unregisterReceiver(m_BatteryBroadCastReceiver);
+                GameAppProxy.app.unregisterReceiver(m_BatteryBroadCastReceiver);
                 m_BatteryBroadCastReceiver = null;
             } catch (IllegalArgumentException e) {
                 if (!Objects.requireNonNull(e.getMessage()).contains("Receiver not registered")) {
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/utils/DeviceUtil.java b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/DeviceUtil.java
index df62599..81ac489 100644
--- a/SdkProject/library/src/main/java/com/secondworld/sdk/utils/DeviceUtil.java
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/DeviceUtil.java
@@ -9,7 +9,7 @@
 import android.os.Build;
 import android.provider.Settings;
 
-import com.secondworld.sdk.GameApp;
+import com.secondworld.sdk.GameAppProxy;
 
 import java.net.NetworkInterface;
 import java.util.Enumeration;
@@ -25,9 +25,9 @@
     public static long getVersionCode() {
         long appVersionCode = 0;
         try {
-            PackageInfo packageInfo = GameApp.I.getApplicationContext()
+            PackageInfo packageInfo = GameAppProxy.app.getApplicationContext()
                     .getPackageManager()
-                    .getPackageInfo(GameApp.I.getPackageName(), 0);
+                    .getPackageInfo(GameAppProxy.app.getPackageName(), 0);
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                 appVersionCode = packageInfo.getLongVersionCode();
             } else {
@@ -43,9 +43,9 @@
     public static String getVersionName() {
         String appVersionName = "";
         try {
-            PackageInfo packageInfo = GameApp.I.getApplicationContext()
+            PackageInfo packageInfo = GameAppProxy.app.getApplicationContext()
                     .getPackageManager()
-                    .getPackageInfo(GameApp.I.getPackageName(), 0);
+                    .getPackageInfo(GameAppProxy.app.getPackageName(), 0);
             appVersionName = packageInfo.versionName;
         } catch (PackageManager.NameNotFoundException e) {
             LogUtil.e("getAppVersionName", e);
@@ -60,14 +60,14 @@
      * @return
      */
     public static long getTotalRAMSize() {
-        ActivityManager manager = (ActivityManager) GameApp.I.getSystemService(Context.ACTIVITY_SERVICE);
+        ActivityManager manager = (ActivityManager) GameAppProxy.app.getSystemService(Context.ACTIVITY_SERVICE);
         ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
         manager.getMemoryInfo(info);
         return info.totalMem;
     }
 
     public static String getAndroidId() {
-        String ANDROID_ID = Settings.System.getString(GameApp.I.getContentResolver(), Settings.System.ANDROID_ID);
+        String ANDROID_ID = Settings.System.getString(GameAppProxy.app.getContentResolver(), Settings.System.ANDROID_ID);
         if (ANDROID_ID == null || ANDROID_ID.equals("9774d56d682e549c"))
             return "";
         return ANDROID_ID;
@@ -129,7 +129,7 @@
                     break;
                 }
             } else {
-                WifiManager wifi = (WifiManager) GameApp.I.getSystemService(Context.WIFI_SERVICE);
+                WifiManager wifi = (WifiManager) GameAppProxy.app.getSystemService(Context.WIFI_SERVICE);
                 if (wifi != null) {
                     WifiInfo wifiInfo = wifi.getConnectionInfo();
                     if (wifiInfo != null) {
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/utils/FileUtil.java b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/FileUtil.java
index 8cefb12..443a481 100644
--- a/SdkProject/library/src/main/java/com/secondworld/sdk/utils/FileUtil.java
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/FileUtil.java
@@ -2,7 +2,7 @@
 
 import android.content.res.AssetManager;
 
-import com.secondworld.sdk.GameApp;
+import com.secondworld.sdk.GameAppProxy;
 import com.secondworld.sdk.UnityMsgHandler;
 
 import java.io.File;
@@ -37,8 +37,8 @@
             return;
         }
 
-        String _dest = GameApp.I.getExternalFilesDir("").getAbsolutePath();
-        AssetManager _assetMgr = GameApp.I.getAssets();
+        String _dest = GameAppProxy.app.getExternalFilesDir("").getAbsolutePath();
+        AssetManager _assetMgr = GameAppProxy.app.getAssets();
         try {
             String[] _fileNames = _assetMgr.list("android");
             if (_fileNames != null) {
@@ -64,7 +64,7 @@
      */
     public static void copyOneAsset(String fileName) {
         String originalPath = "android" + File.separator + fileName;
-        String destPath = GameApp.I.getExternalFilesDir(
+        String destPath = GameAppProxy.app.getExternalFilesDir(
                 "").getAbsolutePath() + File.separator + fileName;
         String _destDir = destPath.substring(0, destPath.lastIndexOf('/') + 1);
         File _file = new File(_destDir);
@@ -72,7 +72,7 @@
             boolean mkdir = _file.mkdir();
         }
         try {
-            InputStream _is = GameApp.I.getAssets().open(originalPath);
+            InputStream _is = GameAppProxy.app.getAssets().open(originalPath);
             FileOutputStream _fos = new FileOutputStream(new File(destPath));
             byte[] _buffer = new byte[1024];
             int _byteCount;
@@ -89,7 +89,7 @@
 
     public static void copy(String original, String dest) {
         try {
-            String[] fileNames = GameApp.I.getAssets().list(original);
+            String[] fileNames = GameAppProxy.app.getAssets().list(original);
             if (fileNames.length > 0) {
                 File dir = new File(dest);
                 String mkdir = dir.mkdir() ? "鎴愬姛" : "澶辫触";
@@ -99,7 +99,7 @@
                             dest + File.separator + _fileName);
                 }
             } else {
-                InputStream _is = GameApp.I.getAssets().open(original);
+                InputStream _is = GameAppProxy.app.getAssets().open(original);
                 FileOutputStream _fos = new FileOutputStream(new File(dest));
                 byte[] _buffer = new byte[1024];
                 int _byteCount;
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/utils/RequestCode.java b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/RequestCode.java
new file mode 100644
index 0000000..8bd38a2
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/RequestCode.java
@@ -0,0 +1,6 @@
+package com.secondworld.sdk.utils;
+
+public interface RequestCode {
+    int UNITY=1000;
+    int QUICK = 1001;
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/utils/SPUtils.java b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/SPUtils.java
index d0b02a6..c0c145a 100644
--- a/SdkProject/library/src/main/java/com/secondworld/sdk/utils/SPUtils.java
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/SPUtils.java
@@ -3,7 +3,7 @@
 import android.content.Context;
 import android.content.SharedPreferences;
 
-import com.secondworld.sdk.GameApp;
+import com.secondworld.sdk.GameAppProxy;
 
 public class SPUtils {
 
@@ -11,7 +11,7 @@
 
     public static SharedPreferences get() {
         if (data == null)
-            data = GameApp.I.getSharedPreferences("data", Context.MODE_PRIVATE);
+            data = GameAppProxy.app.getSharedPreferences("data", Context.MODE_PRIVATE);
         return data;
     }
 
diff --git a/SdkProject/plugins/appsflyer/java/com/secondworld/sdk/AppsFlyerUtil.java b/SdkProject/plugins/appsflyer/java/com/secondworld/sdk/AppsFlyerUtil.java
index b2f5006..a52e0f4 100644
--- a/SdkProject/plugins/appsflyer/java/com/secondworld/sdk/AppsFlyerUtil.java
+++ b/SdkProject/plugins/appsflyer/java/com/secondworld/sdk/AppsFlyerUtil.java
@@ -41,15 +41,15 @@
             }
         };
 
-        AppsFlyerLib.getInstance().init(AF_DEV_KEY, conversionListener, GameApp.I);
-        AppsFlyerLib.getInstance().startTracking(GameApp.I);
+        AppsFlyerLib.getInstance().init(AF_DEV_KEY, conversionListener, GameAppProxy.app);
+        AppsFlyerLib.getInstance().startTracking(GameAppProxy.app);
     }
 
     //缁熻浜嬩欢
     public static void trackEvent(String eventName, Map<String, Object> eventValues) {
         if (eventValues == null)
             eventValues = new HashMap<>();
-        AppsFlyerLib.getInstance().trackEvent(GameApp.I, eventName, eventValues);
+        AppsFlyerLib.getInstance().trackEvent(GameAppProxy.app, eventName, eventValues);
     }
 
 }
diff --git a/SdkProject/plugins/bugly/build.gradle b/SdkProject/plugins/bugly/build.gradle
deleted file mode 100644
index e69de29..0000000
--- a/SdkProject/plugins/bugly/build.gradle
+++ /dev/null
diff --git a/SdkProject/plugins/quick/deps.gradle b/SdkProject/plugins/quick/deps.gradle
new file mode 100644
index 0000000..0ce6a16
--- /dev/null
+++ b/SdkProject/plugins/quick/deps.gradle
@@ -0,0 +1,3 @@
+dependencies {
+
+}
\ No newline at end of file
diff --git a/SdkProject/plugins/quick/java/com/secondworld/sdk/QuickApp.java b/SdkProject/plugins/quick/java/com/secondworld/sdk/QuickApp.java
new file mode 100644
index 0000000..a03683c
--- /dev/null
+++ b/SdkProject/plugins/quick/java/com/secondworld/sdk/QuickApp.java
@@ -0,0 +1,19 @@
+package com.secondworld.sdk;
+
+import com.quicksdk.QuickSdkApplication;
+
+public abstract class QuickApp extends QuickSdkApplication {
+
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        GameAppProxy.create(this, getPlatform());
+        GameActivity.registerProxy(getMainProxy());
+    }
+
+    protected abstract PlatformDiff getPlatform();
+
+    protected abstract Class<? extends GameActivityProxy> getMainProxy();
+
+}
diff --git a/SdkProject/plugins/quick/java/com/secondworld/sdk/QuickSdkMgr.java b/SdkProject/plugins/quick/java/com/secondworld/sdk/QuickSdkMgr.java
new file mode 100644
index 0000000..a4b0e47
--- /dev/null
+++ b/SdkProject/plugins/quick/java/com/secondworld/sdk/QuickSdkMgr.java
@@ -0,0 +1,331 @@
+package com.secondworld.sdk;
+
+
+import android.Manifest;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.provider.Settings;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
+import android.widget.Toast;
+
+import com.quicksdk.BaseCallBack;
+import com.quicksdk.Extend;
+import com.quicksdk.FuncType;
+import com.quicksdk.Payment;
+import com.quicksdk.QuickSDK;
+import com.quicksdk.Sdk;
+import com.quicksdk.User;
+import com.quicksdk.entity.GameRoleInfo;
+import com.quicksdk.entity.OrderInfo;
+import com.quicksdk.entity.UserInfo;
+import com.quicksdk.notifier.ExitNotifier;
+import com.quicksdk.notifier.InitNotifier;
+import com.quicksdk.notifier.LoginNotifier;
+import com.quicksdk.notifier.LogoutNotifier;
+import com.quicksdk.notifier.PayNotifier;
+import com.quicksdk.notifier.SwitchAccountNotifier;
+import com.secondworld.sdk.utils.CodeA2U;
+import com.secondworld.sdk.utils.LogUtil;
+import com.secondworld.sdk.utils.RequestCode;
+import com.unity3d.player.UnityPlayer;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+public class QuickSdkMgr extends PlatformSdkMgr {
+
+    public static QuickSdkMgr I = new QuickSdkMgr();
+
+    String productCode;
+    String productKey;
+
+    int REQUEST_RECORD_PERMISSION_SETTING = 110;
+
+    private boolean hasPermissions(Activity activity) {
+        return (ContextCompat.checkSelfPermission(activity,
+                Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED)
+                && (ContextCompat.checkSelfPermission(activity,
+                Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED);
+    }
+
+    public void requestPermissions(Activity activity) {
+        try {
+            // check鏉冮檺
+            if (!hasPermissions(activity)) {
+                // 娌℃湁鍒欑敵璇锋潈闄�
+                ActivityCompat.requestPermissions(activity, new String[]{
+                        Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, RequestCode.QUICK);
+            } else {
+                QuickSdkMgr.I.init(activity);
+            }
+        } catch (Exception e) {
+            QuickSdkMgr.I.init(activity);
+        }
+    }
+
+    public void onRequestPermissionsResult(Activity activity, int requestCode, int[] grantResults) {
+        if (requestCode != RequestCode.QUICK) return;
+        if (hasPermissions(activity)) {
+            QuickSdkMgr.I.init(activity);
+            return;
+        }
+        final AlertDialog.Builder normalDialog = new AlertDialog.Builder(activity);
+        normalDialog.setTitle("鏉冮檺璁剧疆");
+        normalDialog.setMessage("娓告垙闇�瑕侀儴鍒嗘潈闄愭墠鑳芥甯歌繍琛岋紝璇峰墠寰�璁剧疆涓墦寮�鐢佃瘽鏉冮檺涓庡瓨鍌ㄦ潈闄�");
+        normalDialog.setPositiveButton("鍓嶅線璁剧疆", new DialogInterface.OnClickListener() {
+            @Override
+            public void onClick(DialogInterface dialog, int which) {
+                Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+                Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
+                intent.setData(uri);
+                activity.startActivityForResult(intent, REQUEST_RECORD_PERMISSION_SETTING);
+                dialog.dismiss();
+            }
+        });
+        normalDialog.setNegativeButton("閫�鍑�", new DialogInterface.OnClickListener() {
+            @Override
+            public void onClick(DialogInterface dialog, int which) {
+                GameAppProxy.appExit();
+            }
+        });
+        // 鏄剧ず
+        normalDialog.show();
+    }
+
+    public void onActivityResult(Activity activity, int requestCode) {
+        if (requestCode == REQUEST_RECORD_PERMISSION_SETTING)
+            requestPermissions(activity);
+    }
+
+    public void init(Activity activity) {
+        sdkInitState = SdkInitState.LOADING;
+        Sdk.getInstance().init(activity, productCode, productKey);
+    }
+
+    public void login() {
+        switch (sdkInitState) {
+            case FAILED:
+            case UNKNOWN: {
+                if (GameActivityProxy.I.activity == null)
+                    return;
+                if (hasPermissions(GameActivityProxy.I.activity)) {
+                    init(BtGameMain.I.activity);
+                    Toast.makeText(GameAppProxy.app, "姝e湪鍒濆鍖栦腑锛岃绋嶇瓑", Toast.LENGTH_LONG).show();
+                }
+                break;
+            }
+            case SUCCEED: {
+                User.getInstance().login(GameActivityProxy.I.activity);
+                break;
+            }
+            case LOADING: {
+                Toast.makeText(GameAppProxy.app, "姝e湪鍒濆鍖栦腑锛岃绋嶇瓑", Toast.LENGTH_LONG).show();
+                break;
+            }
+        }
+    }
+
+    public void loginOut() {
+        if (GameActivityProxy.I.activity == null)
+            return;
+        User.getInstance().logout(GameActivityProxy.I.activity);
+    }
+
+    public void setGameRoleInfo(GameRoleInfo roleInfo, boolean createRole) {
+        if (GameActivityProxy.I.activity == null)
+            return;
+        User.getInstance().setGameRoleInfo(GameActivityProxy.I.activity, roleInfo, createRole);
+    }
+
+    public void pay(OrderInfo orderInfo, GameRoleInfo roleInfo) {
+        if (GameActivityProxy.I.activity == null)
+            return;
+        Payment.getInstance().pay(GameActivityProxy.I.activity, orderInfo, roleInfo);
+    }
+
+    public void verifyRealName() {
+        if (GameActivityProxy.I.activity == null)
+            return;
+        // 鍒ゆ柇娓犻亾鏄惁鏀寔瀹炲悕璁よ瘉鍔熻兘
+        if (Extend.getInstance().isFunctionSupported(FuncType.REAL_NAME_REGISTER)) {
+            Extend.getInstance().callFunctionWithParamsCallBack(GameActivityProxy.I.activity, FuncType.REAL_NAME_REGISTER, new BaseCallBack() {
+                @Override
+                public void onSuccess(Object... arg0) {
+                    if (arg0 != null && arg0.length > 0) {
+                        JSONObject jsonObject = (JSONObject) arg0[0];
+                        try {
+                            // 鐢ㄦ埛id
+                            String uid = jsonObject.getString("uid");
+                            // 骞撮緞, 濡傛灉娓犻亾娌¤繑鍥為粯璁や负-1
+                            int age = jsonObject.getInt("age");
+                            // 鏄惁宸插疄鍚� true琛ㄧず宸插疄鍚�
+                            // false琛ㄧず鏈疄鍚�,濡傛灉娓犻亾娌¤繑鍥為粯璁や负false
+                            boolean realName = jsonObject.getBoolean("realName");
+                            // oppo瀹炲悕璁よ瘉澶辫触涔嬪悗鏄惁鍙互缁х画娓告垙 true琛ㄧず鍙互
+                            // false琛ㄧず涓嶅彲浠�,濡傛灉娓犻亾娌¤繑鍥為粯璁や负true
+                            boolean resumeGame = jsonObject.getBoolean("resumeGame");
+                            // 棰勭暀瀛楁,濡傛灉娓犻亾娌¤繑鍥為粯璁や负""鐨勫瓧绗︿覆
+                            String other = jsonObject.getString("other");
+                            // 娓告垙鏍规嵁杩斿洖淇℃伅鍋氬搴旂殑閫昏緫澶勭悊
+
+                        } catch (JSONException e) {
+
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailed(Object... arg0) {
+
+                }
+            });
+        }
+    }
+
+    public void register(String productCode, String productKey) {
+        this.productCode = productCode;
+        this.productKey = productKey;
+        QuickSDK.getInstance().setInitNotifier(new InitNotifier() {
+            @Override
+            public void onSuccess() {
+                //鍒濆鍖栨垚鍔�
+                sdkInitState = SdkInitState.SUCCEED;
+                LogUtil.debug("SdkManager", "鍒濆鍖栨垚鍔�");
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.PlatformInitOk);
+            }
+
+            @Override
+            public void onFailed(String message, String trace) {
+                //鍒濆鍖栧け璐�
+                sdkInitState = SdkInitState.FAILED;
+                LogUtil.e("SdkManager", "鍒濆鍖栧け璐� msg锛�" + message);
+                LogUtil.e("SdkManager", "鍒濆鍖栧け璐� trace锛�" + trace);
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.PlatformInitFail);
+            }
+        });
+        QuickSDK.getInstance().setLoginNotifier(new LoginNotifier() {
+            @Override
+            public void onSuccess(UserInfo userInfo) {
+                //鐧诲綍鎴愬姛锛岃幏鍙栧埌鐢ㄦ埛淇℃伅userInfo
+                //閫氳繃userInfo涓殑UID銆乼oken鍋氭湇鍔″櫒鐧诲綍璁よ瘉
+                LogUtil.e("SdkManager", "鐧诲綍鎴愬姛");
+                try {
+                    args.clear();
+                    JSONObject info = new JSONObject();
+                    String cid = com.quicksdk.Extend.getInstance().getExtrasConfig("cid");
+                    if (cid == null || cid.isEmpty())
+                        cid = com.quicksdk.Extend.getInstance().getChannelType() + "";
+                    String account = userInfo.getUID() + "@" + cid;
+                    info.put("account", account);
+                    info.put("userName", userInfo.getUID());
+                    info.put("token", userInfo.getToken());
+                    args.put("info", info);
+                    UnityMsgHandler.sendMessageToUnity(CodeA2U.PlatformLoginOk, args);
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                    LogUtil.e("SdkManager 鐧诲綍鎴愬姛", e);
+                }
+                verifyRealName();
+            }
+
+            @Override
+            public void onCancel() {
+                //鐧诲綍鍙栨秷
+                LogUtil.e("SdkManager", "鐧诲綍澶辫触锛�");
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.PlatformLoginFail);
+            }
+
+            @Override
+            public void onFailed(final String message, String trace) {
+                //鐧诲綍澶辫触
+                LogUtil.e("SdkManager", "鐧诲綍澶辫触锛�");
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.PlatformLoginFail);
+            }
+        });
+        QuickSDK.getInstance().setLogoutNotifier(new LogoutNotifier() {
+            @Override
+            public void onSuccess() {
+                //娉ㄩ攢鎴愬姛
+                //娉ㄩ攢鎴愬姛,闇�瑕佹妸娓告垙鍒囨崲鍥炵櫥闄嗗墠鐨勫満鏅�,骞堕噸鏂板脊鍑虹櫥褰曟绛夋搷浣�
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.PlatformLogoutOk);
+            }
+
+            @Override
+            public void onFailed(String message, String trace) {
+                //娉ㄩ攢澶辫触锛屼笉鍋氬鐞�
+            }
+        });
+        QuickSDK.getInstance().setSwitchAccountNotifier(new SwitchAccountNotifier() {
+            @Override
+            public void onSuccess(UserInfo userInfo) {
+                //鍒囨崲璐﹀彿鎴愬姛鐨勫洖璋冿紝杩斿洖鏂拌处鍙风殑userInfo
+                LogUtil.e("SdkManager", "鍒囨崲璐﹀彿鎴愬姛");
+                try {
+                    args.clear();
+                    JSONObject info = new JSONObject();
+                    String cid = com.quicksdk.Extend.getInstance().getExtrasConfig("cid");
+                    if (cid == null || cid.isEmpty())
+                        cid = com.quicksdk.Extend.getInstance().getChannelType() + "";
+                    String account = userInfo.getUID() + "@" + cid;
+                    info.put("account", account);
+                    info.put("userName", userInfo.getUID());
+                    info.put("token", userInfo.getToken());
+                    args.put("info", info);
+                    UnityMsgHandler.sendMessageToUnity(CodeA2U.PlatformSwitchAccountOk, args);
+                } catch (JSONException e) {
+                    e.printStackTrace();
+                    LogUtil.e("SdkManager 鐧诲綍鎴愬姛", e);
+                }
+            }
+
+            @Override
+            public void onCancel() {
+                //鍒囨崲璐﹀彿鍙栨秷
+            }
+
+            @Override
+            public void onFailed(String message, String trace) {
+                //鍒囨崲璐﹀彿澶辫触
+            }
+        });
+        QuickSDK.getInstance().setPayNotifier(new PayNotifier() {
+            @Override
+            public void onSuccess(String sdkOrderID, String cpOrderID,
+                                  String extrasParams) {
+                //鏀粯鎴愬姛
+                //sdkOrderID:quick璁㈠崟鍙� cpOrderID锛氭父鎴忚鍗曞彿
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.PlatformPayOk);
+            }
+
+            @Override
+            public void onCancel(String cpOrderID) {
+                //鏀粯鍙栨秷
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.PlatformPayCancel);
+            }
+
+            @Override
+            public void onFailed(String cpOrderID, String message, String trace) {
+                //鏀粯澶辫触
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.PlatformPayFail);
+            }
+        });
+        QuickSDK.getInstance().setExitNotifier(new ExitNotifier() {
+            @Override
+            public void onSuccess() {
+                //閫�鍑烘垚鍔燂紝娓告垙鍦ㄦ鍋氳嚜韬殑閫�鍑洪�昏緫澶勭悊
+                UnityMsgHandler.sendMessageToUnity(CodeA2U.ExitGame);
+            }
+
+            @Override
+            public void onFailed(String message, String trace) {
+                //閫�鍑哄け璐ワ紝涓嶅仛澶勭悊
+            }
+        });
+    }
+
+}
diff --git a/SdkProject/plugins/quick/java/com/secondworld/sdk/SplashActivity.java b/SdkProject/plugins/quick/java/com/secondworld/sdk/SplashActivity.java
new file mode 100644
index 0000000..a007eee
--- /dev/null
+++ b/SdkProject/plugins/quick/java/com/secondworld/sdk/SplashActivity.java
@@ -0,0 +1,21 @@
+package com.secondworld.sdk;
+
+import android.content.Intent;
+import android.graphics.Color;
+
+import com.quicksdk.QuickSdkSplashActivity;
+
+public class SplashActivity extends QuickSdkSplashActivity {
+
+    @Override
+    public int getBackgroundColor() {
+        return Color.WHITE;
+    }
+
+    @Override
+    public void onSplashStop() {
+        Intent intent = new Intent(this, GameActivity.class);
+        startActivity(intent);
+        this.finish();
+    }
+}
diff --git a/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdCreateRole.java b/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdCreateRole.java
new file mode 100644
index 0000000..e459504
--- /dev/null
+++ b/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdCreateRole.java
@@ -0,0 +1,37 @@
+package com.secondworld.sdk.command;
+
+import com.quicksdk.entity.GameRoleInfo;
+import com.secondworld.sdk.QuickSdkMgr;
+import com.secondworld.sdk.utils.CodeU2A;
+
+import org.json.JSONObject;
+
+public class CmdCreateRole implements ICommand {
+    @Override
+    public int getCode() {
+        return CodeU2A.CreateRole;
+    }
+
+    @Override
+    public void process(JSONObject json) throws Exception {
+        GameRoleInfo roleInfo = new GameRoleInfo();
+        roleInfo.setServerID(json.getString("sid"));
+        roleInfo.setServerName(json.getString("serverName"));
+        roleInfo.setGameRoleName(json.getString("roleName").trim().replace(" ", ""));
+        roleInfo.setGameRoleID(json.getString("roleID"));
+        roleInfo.setGameBalance(json.getString("money"));
+        roleInfo.setVipLevel( json.getString("vipLevel"));  //璁剧疆褰撳墠鐢ㄦ埛vip绛夌骇锛屽繀椤讳负鏁板瓧鏁村瀷瀛楃涓�,璇峰嬁浼�"vip1"绛夌被浼煎瓧绗︿覆
+        roleInfo.setGameUserLevel(json.getString("level"));//璁剧疆娓告垙瑙掕壊绛夌骇
+        roleInfo.setPartyName(json.getString("familyName").trim().replace(" ",""));//璁剧疆甯淳鍚嶇О
+        roleInfo.setRoleCreateTime( json.getString("createTime")); //UC锛屽綋涔愪笌1881锛孴T娓犻亾蹇呬紶锛屽�间负10浣嶆暟鏃堕棿鎴�
+
+        roleInfo.setPartyId("1100"); //360娓犻亾鍙傛暟锛岃缃府娲緄d锛屽繀椤讳负鏁村瀷瀛楃涓�
+        roleInfo.setGameRolePower("38"); //360,TT璇煶娓犻亾鍙傛暟锛岃缃鑹叉垬鍔涳紝蹇呴』涓烘暣鍨嬪瓧绗︿覆
+        roleInfo.setPartyRoleId("11"); //360娓犻亾鍙傛暟锛岃缃鑹插湪甯淳涓殑id
+        roleInfo.setPartyRoleName("甯富"); //360娓犻亾鍙傛暟锛岃缃鑹插湪甯淳涓殑鍚嶇О
+        roleInfo.setProfessionId("38"); //360娓犻亾鍙傛暟锛岃缃鑹茶亴涓歩d锛屽繀椤讳负鏁村瀷瀛楃涓�
+        roleInfo.setProfession("娉曞笀"); //360娓犻亾鍙傛暟锛岃缃鑹茶亴涓氬悕绉�
+        roleInfo.setFriendlist("鏃�"); //360娓犻亾鍙傛暟锛岃缃ソ鍙嬪叧绯诲垪琛紝鏍煎紡璇峰弬鑰冿細http://open.quicksdk.net/help/detail/aid/190
+        QuickSdkMgr.I.setGameRoleInfo(roleInfo, true);
+    }
+}
diff --git a/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdPayFinished.java b/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdPayFinished.java
new file mode 100644
index 0000000..5938411
--- /dev/null
+++ b/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdPayFinished.java
@@ -0,0 +1,16 @@
+package com.secondworld.sdk.command;
+
+import com.secondworld.sdk.utils.CodeU2A;
+
+import org.json.JSONObject;
+
+public class CmdPayFinished implements  ICommand{
+    @Override
+    public int getCode() {
+        return CodeU2A.PayFinished;
+    }
+
+    @Override
+    public void process(JSONObject json) throws Exception {
+    }
+}
diff --git a/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdPlatformLogin.java b/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdPlatformLogin.java
new file mode 100644
index 0000000..f133a40
--- /dev/null
+++ b/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdPlatformLogin.java
@@ -0,0 +1,18 @@
+package com.secondworld.sdk.command;
+
+import com.secondworld.sdk.QuickSdkMgr;
+import com.secondworld.sdk.utils.CodeU2A;
+
+import org.json.JSONObject;
+
+public class CmdPlatformLogin implements ICommand {
+    @Override
+    public int getCode() {
+        return CodeU2A.PlatformLogin;
+    }
+
+    @Override
+    public void process(JSONObject json) throws Exception {
+        QuickSdkMgr.I.login();
+    }
+}
diff --git a/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdPlatformLogout.java b/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdPlatformLogout.java
new file mode 100644
index 0000000..fd1d7d7
--- /dev/null
+++ b/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdPlatformLogout.java
@@ -0,0 +1,18 @@
+package com.secondworld.sdk.command;
+
+import com.secondworld.sdk.QuickSdkMgr;
+import com.secondworld.sdk.utils.CodeU2A;
+
+import org.json.JSONObject;
+
+public class CmdPlatformLogout implements ICommand {
+    @Override
+    public int getCode() {
+        return CodeU2A.PlatformLogout;
+    }
+
+    @Override
+    public void process(JSONObject json) throws Exception {
+        QuickSdkMgr.I.loginOut();
+    }
+}
diff --git a/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdPlatformPay.java b/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdPlatformPay.java
new file mode 100644
index 0000000..25b5140
--- /dev/null
+++ b/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdPlatformPay.java
@@ -0,0 +1,60 @@
+package com.secondworld.sdk.command;
+
+import com.quicksdk.entity.GameRoleInfo;
+import com.quicksdk.entity.OrderInfo;
+import com.secondworld.sdk.GameAppProxy;
+import com.secondworld.sdk.QuickSdkMgr;
+import com.secondworld.sdk.utils.CodeU2A;
+
+import org.json.JSONObject;
+
+import java.net.URLEncoder;
+
+public class CmdPlatformPay implements ICommand {
+    @Override
+    public int getCode() {
+        return CodeU2A.PlatformPay;
+    }
+
+    @Override
+    public void process(JSONObject json) throws Exception {
+
+
+        JSONObject extraData = new JSONObject();
+        extraData.put("appid", GameAppProxy.appId);
+        extraData.put("cpinfo", json.getString("cpInfo"));
+        extraData.put("cporderid", json.getString("orderId"));
+
+        GameRoleInfo roleInfo = new GameRoleInfo();
+        roleInfo.setServerID(json.getString("sid"));
+        roleInfo.setServerName(json.getString("serverName"));
+        roleInfo.setGameRoleName(json.getString("roleName").trim().replace(" ", ""));
+        roleInfo.setGameRoleID(json.getString("roleID"));
+        roleInfo.setGameBalance(json.getString("money"));
+        roleInfo.setVipLevel(json.getString("vipLevel"));  //璁剧疆褰撳墠鐢ㄦ埛vip绛夌骇锛屽繀椤讳负鏁板瓧鏁村瀷瀛楃涓�,璇峰嬁浼�"vip1"绛夌被浼煎瓧绗︿覆
+        roleInfo.setGameUserLevel(json.getString("level"));//璁剧疆娓告垙瑙掕壊绛夌骇
+        roleInfo.setPartyName(json.getString("familyName").trim().replace(" ", ""));//璁剧疆甯淳鍚嶇О
+        roleInfo.setRoleCreateTime(json.getString("createTime")); //UC锛屽綋涔愪笌1881锛孴T娓犻亾蹇呬紶锛屽�间负10浣嶆暟鏃堕棿鎴�
+
+        roleInfo.setPartyId("1100"); //360娓犻亾鍙傛暟锛岃缃府娲緄d锛屽繀椤讳负鏁村瀷瀛楃涓�
+        roleInfo.setGameRolePower("38"); //360,TT璇煶娓犻亾鍙傛暟锛岃缃鑹叉垬鍔涳紝蹇呴』涓烘暣鍨嬪瓧绗︿覆
+        roleInfo.setPartyRoleId("11"); //360娓犻亾鍙傛暟锛岃缃鑹插湪甯淳涓殑id
+        roleInfo.setPartyRoleName("甯富"); //360娓犻亾鍙傛暟锛岃缃鑹插湪甯淳涓殑鍚嶇О
+        roleInfo.setProfessionId("38"); //360娓犻亾鍙傛暟锛岃缃鑹茶亴涓歩d锛屽繀椤讳负鏁村瀷瀛楃涓�
+        roleInfo.setProfession("娉曞笀"); //360娓犻亾鍙傛暟锛岃缃鑹茶亴涓氬悕绉�
+        roleInfo.setFriendlist("鏃�"); //360娓犻亾鍙傛暟锛岃缃ソ鍙嬪叧绯诲垪琛紝鏍煎紡璇峰弬鑰冿細http://open.quicksdk.net/help/detail/aid/190
+
+
+        OrderInfo orderInfo = new OrderInfo();
+        orderInfo.setCpOrderID(json.getString("orderId"));
+        orderInfo.setGoodsName(json.getString("title"));//鍟嗗搧鍚嶇О锛屼笉甯︽暟閲�
+        orderInfo.setCount(1);//娓告垙甯佹暟閲�
+        orderInfo.setAmount((float) json.getDouble("mount"));
+        orderInfo.setGoodsID(json.getString("cpInfo"));
+        orderInfo.setGoodsDesc(json.getString("title"));
+        orderInfo.setExtrasParams(
+                URLEncoder.encode(extraData.toString(), "utf-8"));
+
+        QuickSdkMgr.I.pay(orderInfo, roleInfo);
+    }
+}
diff --git a/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdRoleLevelUp.java b/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdRoleLevelUp.java
new file mode 100644
index 0000000..57e6d06
--- /dev/null
+++ b/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdRoleLevelUp.java
@@ -0,0 +1,38 @@
+package com.secondworld.sdk.command;
+
+import com.quicksdk.entity.GameRoleInfo;
+import com.secondworld.sdk.QuickSdkMgr;
+import com.secondworld.sdk.utils.CodeU2A;
+
+import org.json.JSONObject;
+
+public class CmdRoleLevelUp implements ICommand {
+    @Override
+    public int getCode() {
+        return CodeU2A.RoleLevelUp;
+    }
+
+    @Override
+    public void process(JSONObject json) throws Exception {
+        GameRoleInfo roleInfo = new GameRoleInfo();
+        roleInfo.setServerID(json.getString("sid"));
+        roleInfo.setServerName(json.getString("serverName"));
+        roleInfo.setGameRoleName(json.getString("roleName").trim().replace(" ", ""));
+        roleInfo.setGameRoleID(json.getString("roleID"));
+        roleInfo.setGameBalance(json.getString("money"));
+        roleInfo.setVipLevel(json.getString("vipLevel"));  //璁剧疆褰撳墠鐢ㄦ埛vip绛夌骇锛屽繀椤讳负鏁板瓧鏁村瀷瀛楃涓�,璇峰嬁浼�"vip1"绛夌被浼煎瓧绗︿覆
+        roleInfo.setGameUserLevel(json.getString("level"));//璁剧疆娓告垙瑙掕壊绛夌骇
+        roleInfo.setPartyName(json.getString("familyName").trim().replace(" ", ""));//璁剧疆甯淳鍚嶇О
+        roleInfo.setRoleCreateTime(json.getString("createTime")); //UC锛屽綋涔愪笌1881锛孴T娓犻亾蹇呬紶锛屽�间负10浣嶆暟鏃堕棿鎴�
+
+        roleInfo.setPartyId("1100"); //360娓犻亾鍙傛暟锛岃缃府娲緄d锛屽繀椤讳负鏁村瀷瀛楃涓�
+        roleInfo.setGameRolePower("38"); //360,TT璇煶娓犻亾鍙傛暟锛岃缃鑹叉垬鍔涳紝蹇呴』涓烘暣鍨嬪瓧绗︿覆
+        roleInfo.setPartyRoleId("11"); //360娓犻亾鍙傛暟锛岃缃鑹插湪甯淳涓殑id
+        roleInfo.setPartyRoleName("甯富"); //360娓犻亾鍙傛暟锛岃缃鑹插湪甯淳涓殑鍚嶇О
+        roleInfo.setProfessionId("38"); //360娓犻亾鍙傛暟锛岃缃鑹茶亴涓歩d锛屽繀椤讳负鏁村瀷瀛楃涓�
+        roleInfo.setProfession("娉曞笀"); //360娓犻亾鍙傛暟锛岃缃鑹茶亴涓氬悕绉�
+        roleInfo.setFriendlist("鏃�"); //360娓犻亾鍙傛暟锛岃缃ソ鍙嬪叧绯诲垪琛紝鏍煎紡璇峰弬鑰冿細http://open.quicksdk.net/help/detail/aid/190
+
+        QuickSdkMgr.I.setGameRoleInfo(roleInfo, false);
+    }
+}
diff --git a/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdRoleLogin.java b/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdRoleLogin.java
new file mode 100644
index 0000000..91ac99e
--- /dev/null
+++ b/SdkProject/plugins/quick/java/com/secondworld/sdk/command/CmdRoleLogin.java
@@ -0,0 +1,38 @@
+package com.secondworld.sdk.command;
+
+import com.quicksdk.entity.GameRoleInfo;
+import com.secondworld.sdk.QuickSdkMgr;
+import com.secondworld.sdk.utils.CodeU2A;
+
+import org.json.JSONObject;
+
+public class CmdRoleLogin implements ICommand {
+    @Override
+    public int getCode() {
+        return CodeU2A.RoleLogin;
+    }
+
+    @Override
+    public void process(JSONObject json) throws Exception {
+        GameRoleInfo roleInfo = new GameRoleInfo();
+        roleInfo.setServerID(json.getString("sid"));
+        roleInfo.setServerName(json.getString("serverName"));
+        roleInfo.setGameRoleName(json.getString("roleName").trim().replace(" ", ""));
+        roleInfo.setGameRoleID(json.getString("roleID"));
+        roleInfo.setGameBalance(json.getString("money"));
+        roleInfo.setVipLevel(json.getString("vipLevel"));  //璁剧疆褰撳墠鐢ㄦ埛vip绛夌骇锛屽繀椤讳负鏁板瓧鏁村瀷瀛楃涓�,璇峰嬁浼�"vip1"绛夌被浼煎瓧绗︿覆
+        roleInfo.setGameUserLevel(json.getString("level"));//璁剧疆娓告垙瑙掕壊绛夌骇
+        roleInfo.setPartyName(json.getString("familyName").trim().replace(" ", ""));//璁剧疆甯淳鍚嶇О
+        roleInfo.setRoleCreateTime(json.getString("createTime")); //UC锛屽綋涔愪笌1881锛孴T娓犻亾蹇呬紶锛屽�间负10浣嶆暟鏃堕棿鎴�
+
+        roleInfo.setPartyId("1100"); //360娓犻亾鍙傛暟锛岃缃府娲緄d锛屽繀椤讳负鏁村瀷瀛楃涓�
+        roleInfo.setGameRolePower("38"); //360,TT璇煶娓犻亾鍙傛暟锛岃缃鑹叉垬鍔涳紝蹇呴』涓烘暣鍨嬪瓧绗︿覆
+        roleInfo.setPartyRoleId("11"); //360娓犻亾鍙傛暟锛岃缃鑹插湪甯淳涓殑id
+        roleInfo.setPartyRoleName("甯富"); //360娓犻亾鍙傛暟锛岃缃鑹插湪甯淳涓殑鍚嶇О
+        roleInfo.setProfessionId("38"); //360娓犻亾鍙傛暟锛岃缃鑹茶亴涓歩d锛屽繀椤讳负鏁村瀷瀛楃涓�
+        roleInfo.setProfession("娉曞笀"); //360娓犻亾鍙傛暟锛岃缃鑹茶亴涓氬悕绉�
+        roleInfo.setFriendlist("鏃�"); //360娓犻亾鍙傛暟锛岃缃ソ鍙嬪叧绯诲垪琛紝鏍煎紡璇峰弬鑰冿細http://open.quicksdk.net/help/detail/aid/190
+
+        QuickSdkMgr.I.setGameRoleInfo(roleInfo, false);
+    }
+}
diff --git a/SdkProject/plugins/quick/libs/armeabi-v7a/libqkcheck.so b/SdkProject/plugins/quick/libs/armeabi-v7a/libqkcheck.so
new file mode 100644
index 0000000..8afb828
--- /dev/null
+++ b/SdkProject/plugins/quick/libs/armeabi-v7a/libqkcheck.so
Binary files differ
diff --git a/SdkProject/plugins/quick/libs/armeabi/libqkcheck.so b/SdkProject/plugins/quick/libs/armeabi/libqkcheck.so
new file mode 100644
index 0000000..e5f9d2e
--- /dev/null
+++ b/SdkProject/plugins/quick/libs/armeabi/libqkcheck.so
Binary files differ
diff --git a/SdkProject/plugins/quick/libs/quicksdk_v2.7.1_20200309.jar b/SdkProject/plugins/quick/libs/quicksdk_v2.7.1_20200309.jar
new file mode 100644
index 0000000..ddb3cb4
--- /dev/null
+++ b/SdkProject/plugins/quick/libs/quicksdk_v2.7.1_20200309.jar
Binary files differ
diff --git a/SdkProject/plugins/quick/libs/x86/libqkcheck.so b/SdkProject/plugins/quick/libs/x86/libqkcheck.so
new file mode 100644
index 0000000..6f95276
--- /dev/null
+++ b/SdkProject/plugins/quick/libs/x86/libqkcheck.so
Binary files differ
diff --git a/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load01.png b/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load01.png
new file mode 100644
index 0000000..1719063
--- /dev/null
+++ b/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load01.png
Binary files differ
diff --git a/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load02.png b/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load02.png
new file mode 100644
index 0000000..e3bda2f
--- /dev/null
+++ b/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load02.png
Binary files differ
diff --git a/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load03.png b/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load03.png
new file mode 100644
index 0000000..220e840
--- /dev/null
+++ b/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load03.png
Binary files differ
diff --git a/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load04.png b/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load04.png
new file mode 100644
index 0000000..bf8a5de
--- /dev/null
+++ b/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load04.png
Binary files differ
diff --git a/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load05.png b/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load05.png
new file mode 100644
index 0000000..8bb753f
--- /dev/null
+++ b/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load05.png
Binary files differ
diff --git a/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load06.png b/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load06.png
new file mode 100644
index 0000000..6761071
--- /dev/null
+++ b/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load06.png
Binary files differ
diff --git a/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load07.png b/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load07.png
new file mode 100644
index 0000000..57f8458
--- /dev/null
+++ b/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load07.png
Binary files differ
diff --git a/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load08.png b/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load08.png
new file mode 100644
index 0000000..fb44182
--- /dev/null
+++ b/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_load08.png
Binary files differ
diff --git a/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_loadbg.png b/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_loadbg.png
new file mode 100644
index 0000000..3cc9f72
--- /dev/null
+++ b/SdkProject/plugins/quick/res/drawable-hdpi/qk_game_loadbg.png
Binary files differ
diff --git a/SdkProject/plugins/quick/res/drawable/qk_game_loading.xml b/SdkProject/plugins/quick/res/drawable/qk_game_loading.xml
new file mode 100644
index 0000000..5891d83
--- /dev/null
+++ b/SdkProject/plugins/quick/res/drawable/qk_game_loading.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
+    android:oneshot="false" >
+
+    <item
+        android:drawable="@drawable/qk_game_load01"
+        android:duration="50"/>
+    <item
+        android:drawable="@drawable/qk_game_load02"
+        android:duration="50"/>
+    <item
+        android:drawable="@drawable/qk_game_load03"
+        android:duration="50"/>
+    <item
+        android:drawable="@drawable/qk_game_load04"
+        android:duration="50"/>
+    <item
+        android:drawable="@drawable/qk_game_load05"
+        android:duration="50"/>
+    <item
+        android:drawable="@drawable/qk_game_load06"
+        android:duration="50"/>
+    <item
+        android:drawable="@drawable/qk_game_load07"
+        android:duration="50"/>
+    <item
+        android:drawable="@drawable/qk_game_load08"
+        android:duration="50"/>
+
+</animation-list>
\ No newline at end of file
diff --git a/SdkProject/plugins/quick/res/layout/qk_game_view_loading.xml b/SdkProject/plugins/quick/res/layout/qk_game_view_loading.xml
new file mode 100644
index 0000000..846151c
--- /dev/null
+++ b/SdkProject/plugins/quick/res/layout/qk_game_view_loading.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:orientation="vertical" >
+
+    <ImageView
+        android:id="@+id/qk_img_loading"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:scaleType="center"
+        android:src="@drawable/qk_game_loading" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/SdkProject/plugins/quick/res/values/qk_game_style.xml b/SdkProject/plugins/quick/res/values/qk_game_style.xml
new file mode 100644
index 0000000..4e6b020
--- /dev/null
+++ b/SdkProject/plugins/quick/res/values/qk_game_style.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <!-- 鑷畾涔塴oading dialog -->
+    <style name="qk_game_style_loading" parent="android:style/Theme.Dialog">
+        <item name="android:windowFrame">@null</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowBackground">@drawable/qk_game_loadbg</item>
+        <item name="android:windowIsFloating">true</item>
+        <item name="android:windowContentOverlay">@null</item>
+    </style>
+    
+    
+
+</resources>
\ No newline at end of file
diff --git a/SdkProject/plugins/quick/res/xml/filepaths.xml b/SdkProject/plugins/quick/res/xml/filepaths.xml
new file mode 100644
index 0000000..f188c4e
--- /dev/null
+++ b/SdkProject/plugins/quick/res/xml/filepaths.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<paths xmlns:android="http://schemas.android.com/apk/res/android">
+    <external-path
+        name="external"
+        path="." />
+</paths>
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..2aecd9e
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,37 @@
+plugins {
+    id 'com.android.library'
+}
+
+android {
+    compileSdkVersion 29
+    buildToolsVersion "30.0.2"
+
+    defaultConfig {
+        minSdkVersion 21
+        targetSdkVersion 29
+        versionCode 1
+        versionName "1.0"
+
+        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+        consumerProguardFiles "consumer-rules.pro"
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+}
+
+dependencies {
+
+    implementation 'com.android.support:appcompat-v7:28.0.0'
+    testImplementation 'junit:junit:4.+'
+    androidTestImplementation 'com.android.support.test:runner:1.0.2'
+    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+}
\ No newline at end of file

--
Gitblit v1.8.0