From 7d62c45726746fd3a4e9360642e81d7da6d76757 Mon Sep 17 00:00:00 2001
From: lwb <q3213421wrwqr>
Date: 星期四, 19 十一月 2020 15:06:16 +0800
Subject: [PATCH] 9527 新版本sdk

---
 SdkProject/library/src/main/java/com/secondworld/sdk/UnityPlayerActivity.java                   |  132 ++++++
 SdkProject/library/src/main/java/com/secondworld/sdk/utils/CodeA2U.java                         |    2 
 SdkProject/library/build.gradle                                                                 |   41 +
 SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdInstallAPK.java                 |   40 +
 SdkProject/app/src/androidTest/java/com/secondworld/sdk/ExampleInstrumentedTest.java            |    2 
 SdkProject/app/src/test/java/com/secondworld/sdk/ExampleUnitTest.java                           |    2 
 SdkProject/app/src/main/AndroidManifest.xml                                                     |    7 
 SdkProject/library/src/main/java/com/secondworld/sdk/utils/StaticDefine.java                    |   12 
 SdkProject/library/src/main/res/layout/activity_main.xml                                        |   12 
 SdkProject/library/src/main/java/com/secondworld/sdk/GameApp.java                               |   54 ++
 SdkProject/app/build.gradle                                                                     |    4 
 SdkProject/library/src/main/AndroidManifest.xml                                                 |   14 
 SdkProject/library/src/main/java/com/secondworld/sdk/utils/LogUtil.java                         |    4 
 SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdOpenWebView.java                |   17 
 SdkProject/library/src/main/java/com/secondworld/sdk/utils/Util.java                            |   33 +
 SdkProject/library/src/main/java/com/secondworld/sdk/utils/CodeU2A.java                         |   16 
 SdkProject/library/src/main/res/values/strings.xml                                              |    1 
 SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdCopyContent.java                |   35 +
 SdkProject/library/src/main/java/com/secondworld/sdk/GameActivity.java                          |   26 +
 SdkProject/library/src/main/java/com/secondworld/sdk/utils/FileUtil.java                        |  136 ++++++
 SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdUniqueID.java                   |   17 
 SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdBatteryListenStop.java          |   18 
 SdkProject/app/src/main/res/layout/activity_main.xml                                            |   16 
 SdkProject/library/libs/unity-classes.jar                                                       |    0 
 SdkProject/library/src/main/java/com/secondworld/sdk/UnityMsgHandler.java                       |   98 ++++
 SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdRequestManifestPermissions.java |   17 
 SdkProject/app/src/main/java/com/secondworld/demo/MainActivity.java                             |   35 +
 SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdInit.java                       |   61 ++
 SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdRestartApp.java                 |   18 
 SdkProject/library/src/main/java/com/secondworld/sdk/utils/SPUtils.java                         |   23 +
 /dev/null                                                                                       |   19 
 SdkProject/library/src/test/java/com/secondworld/sdk/ExampleUnitTest.java                       |    2 
 SdkProject/library/src/main/java/com/secondworld/sdk/AsyncTaskOperator.java                     |   24 +
 SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdBatteryListenStart.java         |   18 
 SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdCopyAsset.java                  |   19 
 SdkProject/library/src/androidTest/java/com/secondworld/sdk/ExampleInstrumentedTest.java        |    2 
 SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdRequestPermission.java          |   18 
 SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdCopyOneAsset.java               |   21 
 SdkProject/library/src/main/java/com/secondworld/sdk/utils/BatteryUtil.java                     |  108 ++++
 SdkProject/library/src/main/java/com/secondworld/sdk/utils/DeviceUtil.java                      |  157 +++++++
 SdkProject/channel/test/java/com/secondworld/sdk/MyApplication.java                             |    4 
 SdkProject/library/src/main/java/com/secondworld/sdk/command/ICommand.java                      |   14 
 42 files changed, 1,244 insertions(+), 55 deletions(-)

diff --git a/SdkProject/app/build.gradle b/SdkProject/app/build.gradle
index 8a32f5c..5f72e7b 100644
--- a/SdkProject/app/build.gradle
+++ b/SdkProject/app/build.gradle
@@ -7,7 +7,7 @@
     buildToolsVersion "30.0.2"
 
     defaultConfig {
-        applicationId "com.secondworld.sdk"
+        applicationId "com.secondworld.demo"
         minSdkVersion 21
         targetSdkVersion 29
         versionCode 1
@@ -32,7 +32,7 @@
 
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'com.google.android.material:material:1.2.1'
-    implementation 'androidx.constraintlayout:constraintlayout:2.0.3'
+    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
     implementation project(path: ':library')
     testImplementation 'junit:junit:4.+'
     androidTestImplementation 'androidx.test.ext:junit:1.1.2'
diff --git a/SdkProject/app/src/androidTest/java/com/secondworld/universalsdk/ExampleInstrumentedTest.java b/SdkProject/app/src/androidTest/java/com/secondworld/sdk/ExampleInstrumentedTest.java
similarity index 94%
rename from SdkProject/app/src/androidTest/java/com/secondworld/universalsdk/ExampleInstrumentedTest.java
rename to SdkProject/app/src/androidTest/java/com/secondworld/sdk/ExampleInstrumentedTest.java
index f293dd9..3e0893f 100644
--- a/SdkProject/app/src/androidTest/java/com/secondworld/universalsdk/ExampleInstrumentedTest.java
+++ b/SdkProject/app/src/androidTest/java/com/secondworld/sdk/ExampleInstrumentedTest.java
@@ -1,4 +1,4 @@
-package com.secondworld.universalsdk;
+package com.secondworld.sdk;
 
 import android.content.Context;
 
diff --git a/SdkProject/app/src/main/AndroidManifest.xml b/SdkProject/app/src/main/AndroidManifest.xml
index d4fa29f..0946b58 100644
--- a/SdkProject/app/src/main/AndroidManifest.xml
+++ b/SdkProject/app/src/main/AndroidManifest.xml
@@ -1,6 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.secondworld.universalsdk">
+    package="com.secondworld.demo">
+
+    <uses-permission android:name="android.permission.INTERNET" />
 
     <application
         android:allowBackup="true"
@@ -8,15 +10,14 @@
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
-        android:name=".BaseApplication"
         android:theme="@style/Theme.SdkProject">
         <activity android:name=".MainActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+
     </application>
 
 </manifest>
\ No newline at end of file
diff --git a/SdkProject/app/src/main/java/com/secondworld/demo/MainActivity.java b/SdkProject/app/src/main/java/com/secondworld/demo/MainActivity.java
new file mode 100644
index 0000000..4f235b1
--- /dev/null
+++ b/SdkProject/app/src/main/java/com/secondworld/demo/MainActivity.java
@@ -0,0 +1,35 @@
+package com.secondworld.demo;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import com.secondworld.sdk.UnityMsgHandler;
+import com.secondworld.sdk.utils.CodeU2A;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.UUID;
+
+public class MainActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+
+        findViewById(R.id.btnInit).setOnClickListener((v ->
+        {
+            JSONObject json = new JSONObject();
+            try {
+                json.put("code", CodeU2A.CopyContent);
+                json.put("content", "杩欐槸澶嶅埗鍐呭鍝︼細" + UUID.randomUUID().toString());
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+            UnityMsgHandler.onUnityMessage(json.toString());
+        }));
+
+    }
+
+}
\ No newline at end of file
diff --git a/SdkProject/app/src/main/java/com/secondworld/universalsdk/MainActivity.java b/SdkProject/app/src/main/java/com/secondworld/universalsdk/MainActivity.java
deleted file mode 100644
index 80cbb87..0000000
--- a/SdkProject/app/src/main/java/com/secondworld/universalsdk/MainActivity.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.secondworld.universalsdk;
-
-import androidx.appcompat.app.AppCompatActivity;
-
-import android.os.Bundle;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-public class MainActivity extends AppCompatActivity {
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_main);
-        JSONObject json = new JSONObject();
-        try {
-            json.put("code", 9);
-        } catch (JSONException e) {
-            e.printStackTrace();
-        }
-        H2EngineSDK.HandleUnityMessage(json.toString());
-    }
-}
\ No newline at end of file
diff --git a/SdkProject/app/src/main/res/layout/activity_main.xml b/SdkProject/app/src/main/res/layout/activity_main.xml
index 0b15a20..4c76793 100644
--- a/SdkProject/app/src/main/res/layout/activity_main.xml
+++ b/SdkProject/app/src/main/res/layout/activity_main.xml
@@ -1,9 +1,19 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context=".MainActivity">
+    android:gravity="center">
 
-</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
+    <Button
+        android:id="@+id/btnInit"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="24dp"
+        android:text="init"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/editTextNumber" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/SdkProject/app/src/test/java/com/secondworld/universalsdk/ExampleUnitTest.java b/SdkProject/app/src/test/java/com/secondworld/sdk/ExampleUnitTest.java
similarity index 90%
rename from SdkProject/app/src/test/java/com/secondworld/universalsdk/ExampleUnitTest.java
rename to SdkProject/app/src/test/java/com/secondworld/sdk/ExampleUnitTest.java
index 604ec98..8f67092 100644
--- a/SdkProject/app/src/test/java/com/secondworld/universalsdk/ExampleUnitTest.java
+++ b/SdkProject/app/src/test/java/com/secondworld/sdk/ExampleUnitTest.java
@@ -1,4 +1,4 @@
-package com.secondworld.universalsdk;
+package com.secondworld.sdk;
 
 import org.junit.Test;
 
diff --git a/SdkProject/channel/test/java/com/secondworld/sdk/MyApplication.java b/SdkProject/channel/test/java/com/secondworld/sdk/MyApplication.java
new file mode 100644
index 0000000..2fcc132
--- /dev/null
+++ b/SdkProject/channel/test/java/com/secondworld/sdk/MyApplication.java
@@ -0,0 +1,4 @@
+package com.secondworld.sdk;
+
+public class MyApplication extends GameApp {
+}
diff --git a/SdkProject/channel/test/java/com/secondworld/universalsdk/MyApplication.java b/SdkProject/channel/test/java/com/secondworld/universalsdk/MyApplication.java
deleted file mode 100644
index 0821d14..0000000
--- a/SdkProject/channel/test/java/com/secondworld/universalsdk/MyApplication.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.secondworld.universalsdk;
-
-public class MyApplication extends BaseApplication {
-}
diff --git a/SdkProject/library/build.gradle b/SdkProject/library/build.gradle
index 3c23e87..3d152fe 100644
--- a/SdkProject/library/build.gradle
+++ b/SdkProject/library/build.gradle
@@ -112,32 +112,51 @@
     }
 }
 
-//鎷疯礉娓呭崟鏂囦欢浣滀负unity鐩存帴浣跨敤
+//鎷疯礉娓呭崟鏂囦欢
+task copyDebugManifest(type: Copy) {
+    from zipTree("build/outputs/aar/library-debug-${CHANNEL_NAME}.aar")
+    include "AndroidManifest.xml"
+    into "${outPutPath}\\${CHANNEL_NAME}\\debug"
+}
+
 task copyManifest(type: Copy) {
-    dependsOn 'assembleRelease'
+    dependsOn 'copyDebugManifest'
     from zipTree("build/outputs/aar/library-release-${CHANNEL_NAME}.aar")
     include "AndroidManifest.xml"
-    into "${outPutPath}\\${CHANNEL_NAME}\\"
+    into "${outPutPath}\\${CHANNEL_NAME}\\release"
+}
+
+task copyDebugSdk(type: Copy) {
+    from "build/outputs/aar/"
+    include "library-debug-${CHANNEL_NAME}.aar"
+    into "${outPutPath}\\${CHANNEL_NAME}\\debug\\libs\\"
 }
 
 //鎵ц鎵撳寘浠诲姟浠ュ強鎷疯礉鍒板閮�
 task assembleAndCopySdk(type: Copy) {
-    dependsOn copyManifest
+    delete "${outPutPath}\\${CHANNEL_NAME}"
+
+    dependsOn 'assembleMerger'
+//    dependsOn copyManifest
+    dependsOn copyDebugSdk
+
     from "build/outputs/aar/"
     include "library-release-${CHANNEL_NAME}.aar"
-    into "${outPutPath}\\${CHANNEL_NAME}\\libs\\"
+    into "${outPutPath}\\${CHANNEL_NAME}\\release\\libs\\"
 }
 
 dependencies {
-    implementation 'androidx.appcompat:appcompat:1.2.0'
-    implementation 'com.google.android.material:material:1.2.1'
-    implementation 'androidx.constraintlayout:constraintlayout:2.0.3'
-    implementation 'androidx.navigation:navigation-fragment:2.3.1'
-    implementation 'androidx.navigation:navigation-ui:2.3.1'
     testImplementation 'junit:junit:4.13.1'
     androidTestImplementation 'androidx.test.ext:junit:1.1.2'
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
 
+    implementation 'androidx.appcompat:appcompat:1.2.0'
+    implementation 'com.google.android.material:material:1.2.1'
+    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
+    implementation 'androidx.navigation:navigation-fragment:2.3.1'
+    implementation 'androidx.navigation:navigation-ui:2.3.1'
     implementation 'com.github.pqpo:Log4a:1.4.2@aar'
-    implementation files('libs/unity-classes.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/libs/unity-classes.jar b/SdkProject/library/libs/unity-classes.jar
index 3c32bf7..502ff04 100644
--- a/SdkProject/library/libs/unity-classes.jar
+++ b/SdkProject/library/libs/unity-classes.jar
Binary files differ
diff --git a/SdkProject/library/src/androidTest/java/com/secondworld/universalsdk/ExampleInstrumentedTest.java b/SdkProject/library/src/androidTest/java/com/secondworld/sdk/ExampleInstrumentedTest.java
similarity index 94%
rename from SdkProject/library/src/androidTest/java/com/secondworld/universalsdk/ExampleInstrumentedTest.java
rename to SdkProject/library/src/androidTest/java/com/secondworld/sdk/ExampleInstrumentedTest.java
index 3f00010..16fb2ad 100644
--- a/SdkProject/library/src/androidTest/java/com/secondworld/universalsdk/ExampleInstrumentedTest.java
+++ b/SdkProject/library/src/androidTest/java/com/secondworld/sdk/ExampleInstrumentedTest.java
@@ -1,4 +1,4 @@
-package com.secondworld.universalsdk;
+package com.secondworld.sdk;
 
 import android.content.Context;
 
diff --git a/SdkProject/library/src/main/AndroidManifest.xml b/SdkProject/library/src/main/AndroidManifest.xml
index d5df5a9..857b950 100644
--- a/SdkProject/library/src/main/AndroidManifest.xml
+++ b/SdkProject/library/src/main/AndroidManifest.xml
@@ -1,7 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.secondworld.universalsdk">
+    package="com.secondworld.sdk">
 
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+
+    <application
+        android:name="com.secondworld.sdk.GameApp"
+        android:allowBackup="true"
+        android:supportsRtl="true">
+
+        <activity android:name="com.secondworld.sdk.GameActivity"/>
+
+    </application>
 
 </manifest>
\ No newline at end of file
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/AsyncTaskOperator.java b/SdkProject/library/src/main/java/com/secondworld/sdk/AsyncTaskOperator.java
new file mode 100644
index 0000000..115b8cd
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/AsyncTaskOperator.java
@@ -0,0 +1,24 @@
+package com.secondworld.sdk;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+//鑰楁椂浠诲姟鎿嶄綔
+public class AsyncTaskOperator {
+
+    public static AsyncTaskOperator I = new AsyncTaskOperator();
+
+    private ExecutorService cachedThreadPool;
+
+    private ExecutorService getCachedThreadPool() {
+        if (cachedThreadPool == null) {
+            cachedThreadPool = Executors.newCachedThreadPool();
+        }
+        return cachedThreadPool;
+    }
+
+    public void run(Runnable runnable) {
+        getCachedThreadPool().execute(runnable);
+    }
+
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/GameActivity.java b/SdkProject/library/src/main/java/com/secondworld/sdk/GameActivity.java
new file mode 100644
index 0000000..669f692
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/GameActivity.java
@@ -0,0 +1,26 @@
+package com.secondworld.sdk;
+
+import android.os.Bundle;
+import android.view.View;
+import android.widget.FrameLayout;
+
+public class GameActivity extends UnityPlayerActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+//        setContentView(R.layout.activity_main);
+        checkPermission();
+//        addUnityView();
+    }
+
+    private void checkPermission() {
+    }
+
+    protected void addUnityView() {
+        FrameLayout _frameLayout = findViewById(R.id.unity_view);
+        View unityView = mUnityPlayer.getView();
+        _frameLayout.addView(unityView);
+    }
+
+}
\ No newline at end of file
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/GameApp.java b/SdkProject/library/src/main/java/com/secondworld/sdk/GameApp.java
new file mode 100644
index 0000000..c48b662
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/GameApp.java
@@ -0,0 +1,54 @@
+package com.secondworld.sdk;
+
+import android.app.AlarmManager;
+import android.app.Application;
+import android.app.PendingIntent;
+import android.content.Context;
+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 class GameApp extends Application {
+
+    public static GameApp I;
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        I = this;
+        InitSdk();
+    }
+
+    public void InitSdk() {
+        LogUtil.Init(this);
+        UnityMsgHandler.initCommandMap();
+    }
+
+    public static 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 static 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();
+    }
+
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/UnityMsgHandler.java b/SdkProject/library/src/main/java/com/secondworld/sdk/UnityMsgHandler.java
new file mode 100644
index 0000000..50c53db
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/UnityMsgHandler.java
@@ -0,0 +1,98 @@
+package com.secondworld.sdk;
+
+import com.secondworld.sdk.command.CmdInit;
+import com.secondworld.sdk.command.ICommand;
+import com.secondworld.sdk.utils.LogUtil;
+import com.secondworld.sdk.utils.StaticDefine;
+import com.unity3d.player.UnityPlayer;
+
+import org.json.JSONObject;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import dalvik.system.DexFile;
+
+
+public class UnityMsgHandler {
+
+    private static final HashMap<Integer, ICommand> allCommand = new HashMap<>();
+
+    /**
+     * 鍒濆鍖栨墍鏈夊懡浠�
+     */
+    public static void initCommandMap() {
+        try {
+            allCommand.clear();
+            new CmdInit();
+            List<String> classesName = getClassName("com.secondworld.sdk.command");
+            for (String name : classesName) {
+                Class<?> aClass = Class.forName(name);
+                LogUtil.debug("initCommandMap", name);
+                if (!aClass.isInterface() && ICommand.class.isAssignableFrom(aClass))//姝ゅ蹇呴』鍒ゆ柇鏄惁涓篒Command瀛愮被锛屽洜涓哄尶鍚嶇被涔熶細鐢熸垚鑷虫鍖�
+                    addCommand((ICommand) aClass.newInstance());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            LogUtil.e("initCommandMap", e);
+        }
+    }
+
+    public static void addCommand(ICommand command) {
+        allCommand.put(command.getCode(), command);
+    }
+
+    /**
+     * 澶勭悊unity 鍙戞潵鐨勬秷鎭�
+     *
+     * @param json
+     */
+    public static void onUnityMessage(String json) {
+        try {
+            LogUtil.debug("onUnityMessage", json);
+            JSONObject _json = new JSONObject(json);
+            int code = _json.getInt("code");
+            ICommand command = allCommand.get(code);
+            if (command == null)
+                LogUtil.w("onUnityMessage", "鏈煡鍛戒护" + code);
+            else
+                command.process(_json);
+        } catch (Exception e) {
+            LogUtil.e("onUnityMessage", e);
+        }
+    }
+
+    /**
+     * 閫氳繃鍙嶅皠璇诲彇鎸囧畾鍖呭悕涓嬬殑鎵�鏈夌被鍚�
+     *
+     * @param
+     * @return
+     */
+    public static List<String> getClassName(String packageName) throws IOException {
+        List<String> classNameList = new ArrayList<String>();
+        DexFile df = new DexFile(GameApp.I.getPackageCodePath());//閫氳繃DexFile鏌ユ壘褰撳墠鐨凙PK涓彲鎵ц鏂囦欢
+        Enumeration<String> enumeration = df.entries();//鑾峰彇df涓殑鍏冪礌  杩欓噷鍖呭惈浜嗘墍鏈夊彲鎵ц鐨勭被鍚� 璇ョ被鍚嶅寘鍚簡鍖呭悕+绫诲悕鐨勬柟寮�
+        while (enumeration.hasMoreElements()) {//閬嶅巻
+            String className = (String) enumeration.nextElement();
+            if (className.contains(packageName)) {//鍦ㄥ綋鍓嶆墍鏈夊彲鎵ц鐨勭被閲岄潰鏌ユ壘鍖呭惈鏈夎鍖呭悕鐨勬墍鏈夌被
+                classNameList.add(className);
+            }
+        }
+        return classNameList;
+    }
+
+    public static void sendMessageToUnity(Map<String, Object> jsonMap) {
+        if (jsonMap == null || jsonMap.isEmpty()) {
+            return;
+        }
+        JSONObject _jsonObject = new JSONObject(jsonMap);
+        UnityPlayer.UnitySendMessage(StaticDefine.UnityGameObjectName,
+                StaticDefine.UnityHandleFuncName,
+                _jsonObject.toString());
+    }
+
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/UnityPlayerActivity.java b/SdkProject/library/src/main/java/com/secondworld/sdk/UnityPlayerActivity.java
new file mode 100644
index 0000000..e438f13
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/UnityPlayerActivity.java
@@ -0,0 +1,132 @@
+// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN
+package com.secondworld.sdk;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.os.Process;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.Window;
+
+import com.unity3d.player.IUnityPlayerLifecycleEvents;
+import com.unity3d.player.UnityPlayer;
+
+public class UnityPlayerActivity extends Activity implements IUnityPlayerLifecycleEvents
+{
+    protected UnityPlayer mUnityPlayer; // don't change the name of this variable; referenced from native code
+
+    // Override this in your custom UnityPlayerActivity to tweak the command line arguments passed to the Unity Android Player
+    // The command line arguments are passed as a string, separated by spaces
+    // UnityPlayerActivity calls this from 'onCreate'
+    // Supported: -force-gles20, -force-gles30, -force-gles31, -force-gles31aep, -force-gles32, -force-gles, -force-vulkan
+    // See https://docs.unity3d.com/Manual/CommandLineArguments.html
+    // @param cmdLine the current command line arguments, may be null
+    // @return the modified command line string or null
+    protected String updateUnityCommandLineArguments(String cmdLine)
+    {
+        return cmdLine;
+    }
+
+    // Setup activity layout
+    @Override protected void onCreate(Bundle savedInstanceState)
+    {
+        requestWindowFeature(Window.FEATURE_NO_TITLE);
+        super.onCreate(savedInstanceState);
+
+        String cmdLine = updateUnityCommandLineArguments(getIntent().getStringExtra("unity"));
+        getIntent().putExtra("unity", cmdLine);
+
+        mUnityPlayer = new UnityPlayer(this, this);
+        setContentView(mUnityPlayer);
+        mUnityPlayer.requestFocus();
+    }
+
+    // When Unity player unloaded move task to background
+    @Override public void onUnityPlayerUnloaded() {
+        moveTaskToBack(true);
+    }
+
+    // When Unity player quited kill process
+    @Override public void onUnityPlayerQuitted() {
+        Process.killProcess(Process.myPid());
+    }
+
+    @Override protected void onNewIntent(Intent intent)
+    {
+        // To support deep linking, we need to make sure that the client can get access to
+        // the last sent intent. The clients access this through a JNI api that allows them
+        // to get the intent set on launch. To update that after launch we have to manually
+        // replace the intent with the one caught here.
+        setIntent(intent);
+        mUnityPlayer.newIntent(intent);
+    }
+
+    // Quit Unity
+    @Override protected void onDestroy ()
+    {
+        mUnityPlayer.destroy();
+        super.onDestroy();
+    }
+
+    // Pause Unity
+    @Override protected void onPause()
+    {
+        super.onPause();
+        mUnityPlayer.pause();
+    }
+
+    // Resume Unity
+    @Override protected void onResume()
+    {
+        super.onResume();
+        mUnityPlayer.resume();
+    }
+
+    // Low Memory Unity
+    @Override public void onLowMemory()
+    {
+        super.onLowMemory();
+        mUnityPlayer.lowMemory();
+    }
+
+    // Trim Memory Unity
+    @Override public void onTrimMemory(int level)
+    {
+        super.onTrimMemory(level);
+        if (level == TRIM_MEMORY_RUNNING_CRITICAL)
+        {
+            mUnityPlayer.lowMemory();
+        }
+    }
+
+    // This ensures the layout will be correct.
+    @Override public void onConfigurationChanged(Configuration newConfig)
+    {
+        super.onConfigurationChanged(newConfig);
+        mUnityPlayer.configurationChanged(newConfig);
+    }
+
+    // Notify Unity of the focus change.
+    @Override public void onWindowFocusChanged(boolean hasFocus)
+    {
+        super.onWindowFocusChanged(hasFocus);
+        mUnityPlayer.windowFocusChanged(hasFocus);
+    }
+
+    // For some reason the multiple keyevent type is not supported by the ndk.
+    // Force event injection by overriding dispatchKeyEvent().
+    @Override public boolean dispatchKeyEvent(KeyEvent event)
+    {
+        if (event.getAction() == KeyEvent.ACTION_MULTIPLE)
+            return mUnityPlayer.injectEvent(event);
+        return super.dispatchKeyEvent(event);
+    }
+
+    // Pass any events not handled by (unfocused) views straight to UnityPlayer
+    @Override public boolean onKeyUp(int keyCode, KeyEvent event)     { return mUnityPlayer.injectEvent(event); }
+    @Override public boolean onKeyDown(int keyCode, KeyEvent event)   { return mUnityPlayer.injectEvent(event); }
+    @Override public boolean onTouchEvent(MotionEvent event)          { return mUnityPlayer.injectEvent(event); }
+    /*API12*/ public boolean onGenericMotionEvent(MotionEvent event)  { return mUnityPlayer.injectEvent(event); }
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdBatteryListenStart.java b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdBatteryListenStart.java
new file mode 100644
index 0000000..203f865
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdBatteryListenStart.java
@@ -0,0 +1,18 @@
+package com.secondworld.sdk.command;
+
+import com.secondworld.sdk.utils.BatteryUtil;
+import com.secondworld.sdk.utils.CodeU2A;
+
+import org.json.JSONObject;
+
+public class CmdBatteryListenStart implements  ICommand {
+    @Override
+    public int getCode() {
+        return CodeU2A.BatteryListenStart;
+    }
+
+    @Override
+    public void process(JSONObject json) {
+        BatteryUtil.getInstance().start();
+    }
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdBatteryListenStop.java b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdBatteryListenStop.java
new file mode 100644
index 0000000..38c88b9
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdBatteryListenStop.java
@@ -0,0 +1,18 @@
+package com.secondworld.sdk.command;
+
+import com.secondworld.sdk.utils.BatteryUtil;
+import com.secondworld.sdk.utils.CodeU2A;
+
+import org.json.JSONObject;
+
+public class CmdBatteryListenStop implements  ICommand {
+    @Override
+    public int getCode() {
+        return CodeU2A.BatteryListenStop;
+    }
+
+    @Override
+    public void process(JSONObject json) {
+        BatteryUtil.getInstance().stop();
+    }
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdCopyAsset.java b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdCopyAsset.java
new file mode 100644
index 0000000..cb065ee
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdCopyAsset.java
@@ -0,0 +1,19 @@
+package com.secondworld.sdk.command;
+
+import com.secondworld.sdk.AsyncTaskOperator;
+import com.secondworld.sdk.utils.CodeU2A;
+import com.secondworld.sdk.utils.FileUtil;
+
+import org.json.JSONObject;
+
+public class CmdCopyAsset implements ICommand {
+    @Override
+    public int getCode() {
+        return CodeU2A.CopyAsset;
+    }
+
+    @Override
+    public void process(JSONObject json) {
+        AsyncTaskOperator.I.run(FileUtil::copyAssets);
+    }
+}
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
new file mode 100644
index 0000000..9e34fdd
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdCopyContent.java
@@ -0,0 +1,35 @@
+package com.secondworld.sdk.command;
+
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.content.Context;
+
+import com.secondworld.sdk.AsyncTaskOperator;
+import com.secondworld.sdk.GameApp;
+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 {
+
+    @Override
+    public int getCode() {
+        return CodeU2A.CopyContent;
+    }
+
+    @Override
+    public void process(JSONObject json) {
+        try {
+            String content = json.getString("content");
+            ClipboardManager mgr = (ClipboardManager) GameApp.I.getSystemService(
+                    Context.CLIPBOARD_SERVICE);
+            ClipData data = ClipData.newPlainText("playerId", content);
+            mgr.setPrimaryClip(data);
+        } catch (Exception e) {
+            LogUtil.e("CmdCopyContent", e);
+        }
+    }
+
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdCopyOneAsset.java b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdCopyOneAsset.java
new file mode 100644
index 0000000..38262c5
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdCopyOneAsset.java
@@ -0,0 +1,21 @@
+package com.secondworld.sdk.command;
+
+import com.secondworld.sdk.AsyncTaskOperator;
+import com.secondworld.sdk.utils.CodeU2A;
+import com.secondworld.sdk.utils.FileUtil;
+
+import org.json.JSONObject;
+
+public class CmdCopyOneAsset implements ICommand {
+    @Override
+    public int getCode() {
+        return CodeU2A.CopyOneAsset;
+    }
+
+    @Override
+    public void process(JSONObject json) {
+        AsyncTaskOperator.I.run(() -> {
+            FileUtil.copyOneAsset(json.toString());
+        });
+    }
+}
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
new file mode 100644
index 0000000..611d047
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdInit.java
@@ -0,0 +1,61 @@
+package com.secondworld.sdk.command;
+
+import android.app.AlertDialog;
+
+import com.secondworld.sdk.GameApp;
+import com.secondworld.sdk.UnityMsgHandler;
+import com.secondworld.sdk.utils.CodeA2U;
+import com.secondworld.sdk.utils.CodeU2A;
+import com.secondworld.sdk.utils.DeviceUtil;
+import com.secondworld.sdk.utils.LogUtil;
+import com.unity3d.player.UnityPlayer;
+
+import org.json.JSONObject;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * 娓告垙鍒濆鍖�
+ */
+public class CmdInit implements ICommand {
+
+    @Override
+    public int getCode() {
+        return CodeU2A.Init;
+    }
+
+    @Override
+    public void process(JSONObject json) {
+        long size = DeviceUtil.getTotalRAMSize() / 1024 / 1024;
+        LogUtil.debug("CmdInit", "鍐呭瓨锛�" + size + " mb");
+        if (size < 1024) {
+            LogUtil.w("CmdInit", "妫�娴嬭澶囧唴瀛樹笉婊¤冻杩愯绋嬪簭鏍囧噯锛屽唴瀛橈細" + size + " mb");
+            AlertDialog.Builder _builder = new AlertDialog.Builder(UnityPlayer.currentActivity);
+            _builder.setTitle("璀﹀憡");
+            _builder.setCancelable(false);
+            _builder.setMessage("鎮ㄧ殑璁惧杩愯鍐呭瓨涓嶆弧瓒宠姹�,鏃犳硶姝e父杩愯娓告垙");
+            _builder.setPositiveButton("纭畾", (dialogInterface, i) -> {
+                GameApp.AppExit();
+            });
+            _builder.show();
+            return;
+        }
+        //鍙戦�佽澶囦俊鎭�
+        Map<String, Object> _msgStruct = new HashMap<>();
+        _msgStruct.put("code", CodeA2U.DeviceInfo);
+        _msgStruct.put("userAgent", System.getProperty("http.agent"));
+        _msgStruct.put("mac", DeviceUtil.getLocalMac());
+        _msgStruct.put("imei", "");
+        _msgStruct.put("android_id", DeviceUtil.getAndroidId());
+        _msgStruct.put("unique_id", DeviceUtil.getUniqueID());
+        _msgStruct.put("memoryTotal", size);
+        UnityMsgHandler.sendMessageToUnity(_msgStruct);
+        //閫氱煡sdk鍒濆鍖栧畬鎴�
+        _msgStruct.clear();
+        _msgStruct.put("code", CodeA2U.SdkInitComplete);
+        UnityMsgHandler.sendMessageToUnity(_msgStruct);
+        LogUtil.debug("CmdInit", "Sdk鍒濆鍖栧畬鎴�");
+    }
+}
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
new file mode 100644
index 0000000..05cf764
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdInstallAPK.java
@@ -0,0 +1,40 @@
+package com.secondworld.sdk.command;
+
+import android.content.Intent;
+import android.net.Uri;
+import android.widget.Toast;
+
+import com.secondworld.sdk.GameApp;
+import com.secondworld.sdk.utils.CodeU2A;
+import com.secondworld.sdk.utils.LogUtil;
+
+import org.json.JSONObject;
+
+import java.io.File;
+
+public class CmdInstallAPK implements ICommand {
+    @Override
+    public int getCode() {
+        return CodeU2A.InstallAPK;
+    }
+
+    @Override
+    public void process(JSONObject json) {
+        try {
+            String path = json.getString("path");
+            File file = new File(path);
+            if (!file.exists()) {
+                LogUtil.w("InstallApp", "鏂囦欢涓嶅瓨鍦�");
+                Toast.makeText(GameApp.I, "鎵句笉瀹夎鏂囦欢", 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);
+        } catch (Exception e) {
+            LogUtil.e("CmdInstallAPK", e);
+        }
+    }
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdOpenWebView.java b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdOpenWebView.java
new file mode 100644
index 0000000..78ca40d
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdOpenWebView.java
@@ -0,0 +1,17 @@
+package com.secondworld.sdk.command;
+
+import com.secondworld.sdk.utils.CodeU2A;
+
+import org.json.JSONObject;
+
+public class CmdOpenWebView implements  ICommand {
+    @Override
+    public int getCode() {
+        return CodeU2A.OpenWebView;
+    }
+
+    @Override
+    public void process(JSONObject json) {
+
+    }
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdRequestManifestPermissions.java b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdRequestManifestPermissions.java
new file mode 100644
index 0000000..df9171f
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdRequestManifestPermissions.java
@@ -0,0 +1,17 @@
+package com.secondworld.sdk.command;
+
+import com.secondworld.sdk.utils.CodeU2A;
+
+import org.json.JSONObject;
+
+public class CmdRequestManifestPermissions implements ICommand {
+    @Override
+    public int getCode() {
+        return CodeU2A.RequestManifestPermissions;
+    }
+
+    @Override
+    public void process(JSONObject json) {
+
+    }
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdRequestPermission.java b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdRequestPermission.java
new file mode 100644
index 0000000..97cc5a8
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdRequestPermission.java
@@ -0,0 +1,18 @@
+package com.secondworld.sdk.command;
+
+import com.secondworld.sdk.utils.CodeU2A;
+
+import org.json.JSONObject;
+
+public class CmdRequestPermission implements  ICommand {
+
+    @Override
+    public int getCode() {
+        return CodeU2A.RequestPermission;
+    }
+
+    @Override
+    public void process(JSONObject json) {
+
+    }
+}
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
new file mode 100644
index 0000000..56001ee
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdRestartApp.java
@@ -0,0 +1,18 @@
+package com.secondworld.sdk.command;
+
+import com.secondworld.sdk.GameApp;
+import com.secondworld.sdk.utils.CodeU2A;
+
+import org.json.JSONObject;
+
+public class CmdRestartApp implements ICommand {
+    @Override
+    public int getCode() {
+        return CodeU2A.RestartApp;
+    }
+
+    @Override
+    public void process(JSONObject json) {
+        GameApp.RestartApp();
+    }
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdUniqueID.java b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdUniqueID.java
new file mode 100644
index 0000000..07fb7de
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/command/CmdUniqueID.java
@@ -0,0 +1,17 @@
+package com.secondworld.sdk.command;
+
+import com.secondworld.sdk.utils.CodeU2A;
+
+import org.json.JSONObject;
+
+public class CmdUniqueID implements ICommand{
+    @Override
+    public int getCode() {
+        return CodeU2A.UniqueID;
+    }
+
+    @Override
+    public void process(JSONObject json) {
+
+    }
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/command/ICommand.java b/SdkProject/library/src/main/java/com/secondworld/sdk/command/ICommand.java
new file mode 100644
index 0000000..b8cdacb
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/command/ICommand.java
@@ -0,0 +1,14 @@
+package com.secondworld.sdk.command;
+
+import org.json.JSONObject;
+
+/**
+ * unity 浼犻�掕繃鏉ョ殑鍛戒护
+ */
+public interface ICommand {
+
+    int getCode();
+
+    void process(JSONObject json) throws Exception;
+
+}
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
new file mode 100644
index 0000000..fb23cc1
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/BatteryUtil.java
@@ -0,0 +1,108 @@
+package com.secondworld.sdk.utils;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.BatteryManager;
+
+import com.secondworld.sdk.GameApp;
+import com.secondworld.sdk.UnityMsgHandler;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Created by Administrator on 2018/7/15 0015.
+ */
+
+public class BatteryUtil {
+    private static BatteryUtil s_Instance = null;
+
+    public static BatteryUtil getInstance() {
+        if (s_Instance == null) {
+            s_Instance = new BatteryUtil();
+        }
+        return s_Instance;
+    }
+
+    private BatteryBroadCastReceiver m_BatteryBroadCastReceiver;
+
+    private BatteryUtil() {
+    }
+
+    public void start() {
+        m_BatteryBroadCastReceiver = new BatteryBroadCastReceiver();
+        IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
+        GameApp.I.registerReceiver(m_BatteryBroadCastReceiver, filter);
+    }
+
+    public void stop() {
+        if (m_BatteryBroadCastReceiver != null) {
+            try {
+                GameApp.I.unregisterReceiver(m_BatteryBroadCastReceiver);
+                m_BatteryBroadCastReceiver = null;
+            } catch (IllegalArgumentException e) {
+                if (!Objects.requireNonNull(e.getMessage()).contains("Receiver not registered")) {
+                    throw e;
+                }
+            }
+        }
+    }
+
+    private static class BatteryBroadCastReceiver extends BroadcastReceiver {
+        private int m_BatteryLevel;
+        private int m_Status;
+
+        public BatteryBroadCastReceiver() {
+            m_BatteryLevel = 0;
+        }
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) {
+                int _batteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
+
+                Map<String, Object> _msg = new HashMap<>();
+
+                if (_batteryLevel != m_BatteryLevel) {
+                    try {
+                        _msg.put("code", CodeA2U.BatteryLevel);
+                        _msg.put("level", _batteryLevel);
+
+                        UnityMsgHandler.sendMessageToUnity(_msg);
+
+                        m_BatteryLevel = _batteryLevel;
+
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+
+                int _status = intent.getIntExtra("status", 0);
+
+                if (_status != m_Status) {
+                    _msg.clear();
+
+                    int _transCode = 0;
+                    if (_status == BatteryManager.BATTERY_STATUS_CHARGING) {
+                        _transCode = 2;
+                    } else if (_status == BatteryManager.BATTERY_STATUS_NOT_CHARGING ||
+                            _status == BatteryManager.BATTERY_STATUS_DISCHARGING) {
+                        _transCode = 1;
+                    } else if (_status == BatteryManager.BATTERY_STATUS_FULL) {
+                        _transCode = 3;
+                    }
+
+                    _msg.put("code", CodeA2U.BatteryCharging);
+                    _msg.put("status", _transCode);
+
+                    UnityMsgHandler.sendMessageToUnity(_msg);
+
+                    m_Status = _status;
+                }
+            }
+        }
+    }
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/utils/CodeA2U.java b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/CodeA2U.java
similarity index 93%
rename from SdkProject/library/src/main/java/com/secondworld/universalsdk/utils/CodeA2U.java
rename to SdkProject/library/src/main/java/com/secondworld/sdk/utils/CodeA2U.java
index 1cb0dc7..d7ca893 100644
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/utils/CodeA2U.java
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/CodeA2U.java
@@ -1,4 +1,4 @@
-package com.secondworld.universalsdk.utils;
+package com.secondworld.sdk.utils;
 
 /**
  * Created by Administrator on 2018/7/18 0018.
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/utils/CodeU2A.java b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/CodeU2A.java
similarity index 82%
rename from SdkProject/library/src/main/java/com/secondworld/universalsdk/utils/CodeU2A.java
rename to SdkProject/library/src/main/java/com/secondworld/sdk/utils/CodeU2A.java
index b71e561..fccab9b 100644
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/utils/CodeU2A.java
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/CodeU2A.java
@@ -1,4 +1,4 @@
-package com.secondworld.universalsdk.utils;
+package com.secondworld.sdk.utils;
 
 /**
  * Created by Administrator on 2018/7/18 0018.
@@ -8,7 +8,7 @@
     /**
      * 鎵ц璧勬簮鎷疯礉
      */
-    int AssetCopy = 0;
+    int CopyAsset = 0;
     /**
      * 鎵ц寮�濮嬬數閲忔敼鍙�,鍏呯數鐘舵�佹敼鍙樼洃鍚�
      */
@@ -60,13 +60,13 @@
 
 
     /**
-     * 姣忎釜娓犻亾鍚勮嚜鐨勫鐞�
+     * 姣忎釜娓犻亾鑷繁鐨勫鐞�
      */
-    int FreePlatformInit = 100;
-    int FreePlatformLogin = 101;
-    int FreePlatformLogout = 102;
-    int FreePlatformSwitchAccount = 103;
-    int FreePlatformPay = 104;
+    int PlatformInit = 100;
+    int PlatformLogin = 101;
+    int PlatformLogout = 102;
+    int PlatformSwitchAccount = 103;
+    int PlatformPay = 104;
     int PayFinished = 105;
     int CreateRole = 106;
     int RoleLogin = 107;
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
new file mode 100644
index 0000000..b7263f5
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/DeviceUtil.java
@@ -0,0 +1,157 @@
+package com.secondworld.sdk.utils;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Build;
+import android.provider.Settings;
+
+import com.secondworld.sdk.GameApp;
+
+import java.net.NetworkInterface;
+import java.util.Enumeration;
+import java.util.Locale;
+import java.util.UUID;
+
+public class DeviceUtil {
+
+    public static final String FAKE_MAC = "02:00:00:00:00:00";
+
+
+    public static long getVersionCode() {
+        long appVersionCode = 0;
+        try {
+            PackageInfo packageInfo = GameApp.I.getApplicationContext()
+                    .getPackageManager()
+                    .getPackageInfo(GameApp.I.getPackageName(), 0);
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+                appVersionCode = packageInfo.getLongVersionCode();
+            } else {
+                appVersionCode = packageInfo.versionCode;
+            }
+        } catch (PackageManager.NameNotFoundException e) {
+            LogUtil.e("getAppVersionCode", e);
+        }
+        return appVersionCode;
+    }
+
+
+    public static String getVersionName() {
+        String appVersionName = "";
+        try {
+            PackageInfo packageInfo = GameApp.I.getApplicationContext()
+                    .getPackageManager()
+                    .getPackageInfo(GameApp.I.getPackageName(), 0);
+            appVersionName = packageInfo.versionName;
+        } catch (PackageManager.NameNotFoundException e) {
+            LogUtil.e("getAppVersionName", e);
+        }
+        return appVersionName;
+    }
+
+    /**
+     * 鑾峰彇褰撳墠璁惧鎬昏繍琛屽唴瀛�
+     * 鍗曚綅涓� byte
+     *
+     * @return
+     */
+    public static long getTotalRAMSize() {
+        ActivityManager manager = (ActivityManager) GameApp.I.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);
+        if (ANDROID_ID == null || ANDROID_ID.equals("9774d56d682e549c"))
+            return "";
+        return ANDROID_ID;
+    }
+
+    /**
+     * 鍞竴鏍囪瘑
+     *
+     * @return
+     */
+    public static String getUniqueID() {
+        String uniqueID = SPUtils.get().getString(SPUtils.UNIQUE_ID, "");
+        if (!uniqueID.trim().isEmpty())
+            return uniqueID;
+        uniqueID = getAndroidId() + getLocalMac();
+        //鑷繁鐢熸垚鐨剈id
+        if (uniqueID.trim().isEmpty())
+            uniqueID = UUID.randomUUID().toString();
+
+        uniqueID = Util.md5(uniqueID).toUpperCase();
+
+        SPUtils.get()
+                .edit()
+                .putString(SPUtils.UNIQUE_ID, uniqueID.trim())
+                .apply();
+
+        return uniqueID;
+    }
+
+    /**
+     * mac 鍦板潃
+     *
+     * @return
+     */
+    public static String getLocalMac() {
+        String mac = SPUtils.get().getString(SPUtils.MAC, "");
+        if (!mac.trim().isEmpty())
+            return mac;
+        try {
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+                String interfaceName = "wlan0";
+                Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
+                NetworkInterface intf = null;
+                while (interfaces.hasMoreElements()) {
+                    intf = interfaces.nextElement();
+                    if (!intf.getName().equalsIgnoreCase(interfaceName))
+                        continue;
+                    byte[] addresses = intf.getHardwareAddress();
+                    if (mac != null) {
+                        StringBuilder buf = new StringBuilder();
+                        for (byte aMac : addresses) {
+                            buf.append(String.format("%02X:", aMac));
+                        }
+                        if (buf.length() > 0) {
+                            buf.deleteCharAt(buf.length() - 1);
+                        }
+                        mac = buf.toString();
+                    }
+                    break;
+                }
+            } else {
+                WifiManager wifi = (WifiManager) GameApp.I.getSystemService(Context.WIFI_SERVICE);
+                if (wifi != null) {
+                    WifiInfo wifiInfo = wifi.getConnectionInfo();
+                    if (wifiInfo != null) {
+                        mac = wifiInfo.getMacAddress();
+                    }
+                }
+            }
+        } catch (Throwable e) {
+            e.printStackTrace();
+        }
+
+        mac = mac.toUpperCase(Locale.ENGLISH);
+
+        if (mac.equals(FAKE_MAC))
+            mac = "";
+
+        SPUtils.get()
+                .edit()
+                .putString(SPUtils.MAC, mac.trim())
+                .apply();
+
+        return mac;
+    }
+
+
+}
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
new file mode 100644
index 0000000..173dbf4
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/FileUtil.java
@@ -0,0 +1,136 @@
+package com.secondworld.sdk.utils;
+
+import android.content.res.AssetManager;
+
+import com.secondworld.sdk.GameApp;
+import com.secondworld.sdk.UnityMsgHandler;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by Administrator on 2018/6/14 0014.
+ */
+
+public class FileUtil {
+
+    /**
+     * Unity闅忓寘璧勬簮鎵归噺鎷疯礉
+     */
+    public static void copyAssets() {
+
+        // 鑾峰彇褰撳墠鍖呯殑鐗堟湰鍙�
+        final long currentVer = DeviceUtil.getVersionCode();
+
+        // 宸茬粡鎷疯礉杩�, 鍒欏啀娆″垽鏂竴娆$増鏈彿
+        // 濡傛灉鐗堟湰鍙蜂笉鐩稿悓, 鍒欓噸鏂拌繘琛屾嫹璐�
+
+        // 鑾峰彇鏈湴瀛樺偍鐨勭増鏈彿
+        long installVer = SPUtils.get().getLong(SPUtils.LAST_COPY_VERSION, 0);
+
+        if (installVer == currentVer) {
+            LogUtil.i("copyAssets", "宸叉嫹璐濊繃锛宨nstallVer:" + installVer + "锛�" + "currentVer:" + currentVer);
+            Map<String, Object> _msg = new HashMap<>();
+            _msg.put("code", CodeA2U.AssetCopyFinished);
+            UnityMsgHandler.sendMessageToUnity(_msg);
+            return;
+        }
+
+        String _dest = GameApp.I.getExternalFilesDir("").getAbsolutePath();
+        AssetManager _assetMgr = GameApp.I.getAssets();
+        try {
+            String[] _fileNames = _assetMgr.list("android");
+            if (_fileNames != null) {
+                for (String _fileName : _fileNames) {
+                    copy("android" + File.separator + _fileName,
+                            _dest + File.separator + _fileName);
+                }
+            }
+            LogUtil.i("copyAssets", "鍏ㄩ儴鎷疯礉瀹屾垚," + "currentVer:" + currentVer);
+            // 瀛樺偍姝ゆ鐨勬嫹璐濈増鏈�
+            SPUtils.get().edit().putLong(SPUtils.LAST_COPY_VERSION, currentVer).apply();
+            Map<String, Object> _msg = new HashMap<>();
+            _msg.put("code", CodeA2U.AssetCopyFinished);
+            UnityMsgHandler.sendMessageToUnity(_msg);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * unity鍗曚釜璧勬簮鎷疯礉
+     *
+     * @param fileName
+     */
+    public static void copyOneAsset(String fileName) {
+        String originalPath = "android" + File.separator + fileName;
+        String destPath = GameApp.I.getExternalFilesDir(
+                "").getAbsolutePath() + File.separator + fileName;
+        String _destDir = destPath.substring(0, destPath.lastIndexOf('/') + 1);
+        File _file = new File(_destDir);
+        if (!_file.exists()) {
+            boolean mkdir = _file.mkdir();
+        }
+        try {
+            InputStream _is = GameApp.I.getAssets().open(originalPath);
+            FileOutputStream _fos = new FileOutputStream(new File(destPath));
+            byte[] _buffer = new byte[1024];
+            int _byteCount;
+            while ((_byteCount = _is.read(_buffer)) != -1) {
+                _fos.write(_buffer, 0, _byteCount);
+            }
+            _fos.flush();
+            _is.close();
+            _fos.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void copy(String original, String dest) {
+        try {
+            String[] fileNames = GameApp.I.getAssets().list(original);
+            if (fileNames.length > 0) {
+                File dir = new File(dest);
+                String mkdir = dir.mkdir() ? "鎴愬姛" : "澶辫触";
+                LogUtil.i("copyAssets", "[" + original + "] 鏄竴涓枃浠跺す, 鍒涘缓鏂囦欢澶�: [" + dest + "] " + mkdir);
+                for (String _fileName : fileNames) {
+                    copy(original + File.separator + _fileName,
+                            dest + File.separator + _fileName);
+                }
+            } else {
+                InputStream _is = GameApp.I.getAssets().open(original);
+                FileOutputStream _fos = new FileOutputStream(new File(dest));
+                byte[] _buffer = new byte[1024];
+                int _byteCount;
+                while ((_byteCount = _is.read(_buffer)) != -1) {
+                    _fos.write(_buffer, 0, _byteCount);
+                }
+                _fos.flush();
+                _is.close();
+                _fos.close();
+                LogUtil.i("copyAssets", "鏂囦欢: " + original + " 宸叉嫹璐濊嚦: " + dest);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static String getFileNameWithoutExtension(String fileName) {
+        return fileName.substring(0, fileName.lastIndexOf("."));
+    }
+
+    /**
+     * 鑾峰彇鏂囦欢鍚庣紑鍚�
+     */
+    public static String getSuffixName(File file) {
+        String fileName = file.getName();
+        int index = fileName.lastIndexOf(".");
+        if (index == -1)
+            return "";
+        return fileName.substring(index + 1);
+    }
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/utils/LogUtil.java b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/LogUtil.java
similarity index 96%
rename from SdkProject/library/src/main/java/com/secondworld/universalsdk/utils/LogUtil.java
rename to SdkProject/library/src/main/java/com/secondworld/sdk/utils/LogUtil.java
index c184a80..295b61d 100644
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/utils/LogUtil.java
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/LogUtil.java
@@ -1,9 +1,9 @@
-package com.secondworld.universalsdk.utils;
+package com.secondworld.sdk.utils;
 
 import android.content.Context;
 import android.util.Log;
 
-import com.secondworld.universalsdk.BuildConfig;
+import com.secondworld.sdk.BuildConfig;
 
 import java.io.File;
 import java.text.SimpleDateFormat;
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
new file mode 100644
index 0000000..d0b02a6
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/SPUtils.java
@@ -0,0 +1,23 @@
+package com.secondworld.sdk.utils;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+import com.secondworld.sdk.GameApp;
+
+public class SPUtils {
+
+    private static SharedPreferences data;
+
+    public static SharedPreferences get() {
+        if (data == null)
+            data = GameApp.I.getSharedPreferences("data", Context.MODE_PRIVATE);
+        return data;
+    }
+
+    public static final String UNIQUE_ID = "uniqueID";
+    public static final String MAC = "mac";
+    public static final String LAST_COPY_VERSION = "last_copy_version";
+    public static final String ASSET_IS_COPIED = "asset_is_copied";
+
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/utils/StaticDefine.java b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/StaticDefine.java
new file mode 100644
index 0000000..e8ff3c0
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/StaticDefine.java
@@ -0,0 +1,12 @@
+package com.secondworld.sdk.utils;
+
+/**
+ * Created by Administrator on 2018/6/14 0014.
+ */
+
+public interface StaticDefine {
+
+    String UnityGameObjectName = "SDKUtility";
+    String UnityHandleFuncName = "HandleSdkMessage";
+
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/sdk/utils/Util.java b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/Util.java
new file mode 100644
index 0000000..55f2a07
--- /dev/null
+++ b/SdkProject/library/src/main/java/com/secondworld/sdk/utils/Util.java
@@ -0,0 +1,33 @@
+package com.secondworld.sdk.utils;
+
+import android.text.TextUtils;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class Util {
+
+    public static String md5(String string) {
+        if (TextUtils.isEmpty(string)) {
+            return "";
+        }
+        MessageDigest md5 = null;
+        try {
+            md5 = MessageDigest.getInstance("MD5");
+            byte[] bytes = md5.digest(string.getBytes());
+            StringBuilder result = new StringBuilder();
+            for (byte b : bytes) {
+                String temp = Integer.toHexString(b & 0xff);
+                if (temp.length() == 1) {
+                    temp = "0" + temp;
+                }
+                result.append(temp);
+            }
+            return result.toString();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/GameActivity.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/GameActivity.java
deleted file mode 100644
index 7ef33ff..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/GameActivity.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.secondworld.universalsdk;
-
-import com.unity3d.player.UnityPlayerActivity;
-
-public class GameActivity extends UnityPlayerActivity {
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/GameApp.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/GameApp.java
deleted file mode 100644
index c7085a9..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/GameApp.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.secondworld.universalsdk;
-
-import android.app.Application;
-import android.os.Handler;
-
-import com.secondworld.universalsdk.utils.DeviceUtil;
-import com.secondworld.universalsdk.utils.LogUtil;
-import com.unity3d.player.UnityPlayer;
-
-public class GameApp extends Application {
-
-    public static GameApp APP;
-
-    @Override
-    public void onCreate() {
-        super.onCreate();
-        APP = this;
-        InitSdk();
-    }
-
-    public void InitSdk() {
-        LogUtil.Init(this);
-        H2EngineSDK.initCommandMap();
-    }
-
-    public static void AppExit() {
-        if (UnityPlayer.currentActivity != null)
-            UnityPlayer.currentActivity.finish();
-        new Handler().postDelayed(new Runnable() {
-            @Override
-            public void run() {
-                android.os.Process.killProcess(android.os.Process.myPid());// 鏉�杩涚▼
-            }
-        }, 1000);
-    }
-
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/H2EngineSDK.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/H2EngineSDK.java
deleted file mode 100644
index c53960b..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/H2EngineSDK.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.secondworld.universalsdk;
-
-import com.secondworld.universalsdk.command.ICommand;
-
-import org.json.JSONObject;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-
-import dalvik.system.DexFile;
-
-
-public class H2EngineSDK {
-
-    private static HashMap<Integer, ICommand> allCommand = new HashMap<Integer, ICommand>();
-
-    /**
-     * 鍒濆鍖栨墍鏈夊懡浠�
-     */
-    public static void initCommandMap() {
-        allCommand.clear();
-        List<String> classesName = getClassName("com.secondworld.universalsdk.command");
-        try {
-            for (String name : classesName) {
-                Class<?> aClass = Class.forName(name);
-                if (!aClass.isInterface())
-                    addCommand((ICommand) aClass.newInstance());
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public static void addCommand(ICommand command) {
-        allCommand.put(command.getCode(), command);
-    }
-
-    /**
-     * unity 鍙戞潵鐨勬秷鎭�
-     *
-     * @param json
-     */
-    public static void HandleUnityMessage(String json) {
-        try {
-            LogUtil.debug("HandleUnityMessage", json);
-            JSONObject _json = new JSONObject(json);
-            int code = _json.getInt("code");
-            ICommand command = allCommand.get(code);
-            if (command == null) {
-
-                return;
-            }
-            command.process(json);
-        } catch (Exception ignored) {
-        }
-    }
-
-    /**
-     * 閫氳繃鍙嶅皠璇诲彇鎸囧畾鍖呭悕涓嬬殑鎵�鏈夌被鍚�
-     *
-     * @param packageName
-     * @return
-     */
-    public static List<String> getClassName(String packageName) {
-        List<String> classNameList = new ArrayList<String>();
-        try {
-            DexFile df = new DexFile(BaseApplication.APP.getPackageCodePath());//閫氳繃DexFile鏌ユ壘褰撳墠鐨凙PK涓彲鎵ц鏂囦欢
-            Enumeration<String> enumeration = df.entries();//鑾峰彇df涓殑鍏冪礌  杩欓噷鍖呭惈浜嗘墍鏈夊彲鎵ц鐨勭被鍚� 璇ョ被鍚嶅寘鍚簡鍖呭悕+绫诲悕鐨勬柟寮�
-            while (enumeration.hasMoreElements()) {//閬嶅巻
-                String className = (String) enumeration.nextElement();
-                if (className.contains(packageName)) {//鍦ㄥ綋鍓嶆墍鏈夊彲鎵ц鐨勭被閲岄潰鏌ユ壘鍖呭惈鏈夎鍖呭悕鐨勬墍鏈夌被
-                    classNameList.add(className);
-                }
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return classNameList;
-    }
-
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/ThreadExecutor.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/ThreadExecutor.java
deleted file mode 100644
index 4cf1c63..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/ThreadExecutor.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.secondworld.universalsdk;
-
-public class ThreadExecutor {
-
-    public static ThreadExecutor I = new ThreadExecutor();
-
-
-
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/UnityOperator.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/UnityOperator.java
deleted file mode 100644
index 6ac0734..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/UnityOperator.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.secondworld.universalsdk;
-
-import com.unity3d.player.UnityPlayer;
-
-import org.json.JSONObject;
-
-import java.util.Map;
-
-public class UnityOperator {
-
-
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdAssetCopy.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdAssetCopy.java
deleted file mode 100644
index 4af539c..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdAssetCopy.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.secondworld.universalsdk.command;
-
-import com.secondworld.universalsdk.CodeU2A;
-
-public class CmdAssetCopy implements ICommand {
-    @Override
-    public int getCode() {
-        return CodeU2A.AssetCopy;
-    }
-
-    @Override
-    public void process(String json) {
-    }
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdBatteryListenStart.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdBatteryListenStart.java
deleted file mode 100644
index 38cbf16..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdBatteryListenStart.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.secondworld.universalsdk.command;
-
-import com.secondworld.universalsdk.CodeU2A;
-
-public class CmdBatteryListenStart implements  ICommand {
-    @Override
-    public int getCode() {
-        return CodeU2A.BatteryListenStart;
-    }
-
-    @Override
-    public void process(String json) {
-
-    }
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdBatteryListenStop.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdBatteryListenStop.java
deleted file mode 100644
index 563fc86..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdBatteryListenStop.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.secondworld.universalsdk.command;
-
-import com.secondworld.universalsdk.CodeU2A;
-
-public class CmdBatteryListenStop implements  ICommand {
-    @Override
-    public int getCode() {
-        return CodeU2A.BatteryListenStop;
-    }
-
-    @Override
-    public void process(String json) {
-
-    }
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdCopyContent.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdCopyContent.java
deleted file mode 100644
index b03089c..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdCopyContent.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.secondworld.universalsdk.command;
-
-import com.secondworld.universalsdk.CodeU2A;
-
-public class CmdCopyContent implements ICommand {
-
-    @Override
-    public int getCode() {
-        return CodeU2A.CopyContent;
-    }
-
-    @Override
-    public void process(String json) {
-
-    }
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdCopyOneAsset.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdCopyOneAsset.java
deleted file mode 100644
index 7c8e448..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdCopyOneAsset.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.secondworld.universalsdk.command;
-
-import com.secondworld.universalsdk.CodeU2A;
-
-public class CmdCopyOneAsset implements ICommand {
-    @Override
-    public int getCode() {
-        return CodeU2A.CopyOneAsset;
-    }
-
-    @Override
-    public void process(String json) {
-    }
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdExteneralStorage.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdExteneralStorage.java
deleted file mode 100644
index 43dd003..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdExteneralStorage.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.secondworld.universalsdk.command;
-
-import com.secondworld.universalsdk.CodeU2A;
-
-public class CmdExteneralStorage implements ICommand {
-    @Override
-    public int getCode() {
-        return CodeU2A.ExteneralStorage;
-    }
-
-    @Override
-    public void process(String json) {
-
-    }
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdInit.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdInit.java
deleted file mode 100644
index 26c286d..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdInit.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.secondworld.universalsdk.command;
-
-import com.secondworld.universalsdk.CodeU2A;
-
-/**
- * 娓告垙鍒濆鍖�
- */
-public class CmdInit implements ICommand {
-    @Override
-    public int getCode() {
-        return CodeU2A.Init;
-    }
-
-    @Override
-    public void process(String json) {
-    }
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdInstallAPK.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdInstallAPK.java
deleted file mode 100644
index 3873fd7..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdInstallAPK.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.secondworld.universalsdk.command;
-
-import com.secondworld.universalsdk.CodeU2A;
-
-public class CmdInstallAPK implements ICommand {
-    @Override
-    public int getCode() {
-        return CodeU2A.InstallAPK;
-    }
-
-    @Override
-    public void process(String json) {
-
-    }
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdOpenWebView.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdOpenWebView.java
deleted file mode 100644
index 05ef406..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdOpenWebView.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.secondworld.universalsdk.command;
-
-import com.secondworld.universalsdk.CodeU2A;
-
-public class CmdOpenWebView implements  ICommand {
-    @Override
-    public int getCode() {
-        return CodeU2A.OpenWebView;
-    }
-
-    @Override
-    public void process(String json) {
-
-    }
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdRequestManifestPermissions.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdRequestManifestPermissions.java
deleted file mode 100644
index b307c84..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdRequestManifestPermissions.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.secondworld.universalsdk.command;
-
-import com.secondworld.universalsdk.CodeU2A;
-
-public class CmdRequestManifestPermissions implements ICommand {
-    @Override
-    public int getCode() {
-        return CodeU2A.RequestManifestPermissions;
-    }
-
-    @Override
-    public void process(String json) {
-
-    }
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdRequestPermission.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdRequestPermission.java
deleted file mode 100644
index 3a8f38b..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdRequestPermission.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.secondworld.universalsdk.command;
-
-import com.secondworld.universalsdk.CodeU2A;
-
-public class CmdRequestPermission implements  ICommand {
-
-    @Override
-    public int getCode() {
-        return CodeU2A.RequestPermission;
-    }
-
-    @Override
-    public void process(String json) {
-
-    }
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdRestartApp.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdRestartApp.java
deleted file mode 100644
index 86521c7..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdRestartApp.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.secondworld.universalsdk.command;
-
-import com.secondworld.universalsdk.CodeU2A;
-
-public class CmdRestartApp implements ICommand {
-    @Override
-    public int getCode() {
-        return CodeU2A.RestartApp;
-    }
-
-    @Override
-    public void process(String json) {
-
-    }
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdUniqueID.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdUniqueID.java
deleted file mode 100644
index b73a7e4..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/CmdUniqueID.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.secondworld.universalsdk.command;
-
-import com.secondworld.universalsdk.CodeU2A;
-
-public class CmdUniqueID implements ICommand{
-    @Override
-    public int getCode() {
-        return CodeU2A.UniqueID;
-    }
-
-    @Override
-    public void process(String json) {
-
-    }
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/ICommand.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/ICommand.java
deleted file mode 100644
index d481225..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/command/ICommand.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.secondworld.universalsdk.command;
-
-/**
- * unity 浼犻�掕繃鏉ョ殑鍛戒护
- */
-public interface ICommand {
-
-    int getCode();
-
-    void process(String json);
-
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/utils/DeviceUtil.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/utils/DeviceUtil.java
deleted file mode 100644
index 1d8b3a8..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/utils/DeviceUtil.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.secondworld.universalsdk.utils;
-
-import android.app.ActivityManager;
-import android.content.Context;
-
-import com.secondworld.universalsdk.GameApp;
-
-public class DeviceUtil {
-
-
-    /**
-     * 鑾峰彇褰撳墠璁惧鎬昏繍琛屽唴瀛�
-     * 鍗曚綅涓� byte
-     * @return
-     */
-    public static long GetTotalRAMSize() {
-        ActivityManager manager = (ActivityManager) GameApp.APP.getSystemService(Context.ACTIVITY_SERVICE);
-        ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
-        manager.getMemoryInfo(info);
-        return info.totalMem;
-    }
-
-}
diff --git a/SdkProject/library/src/main/java/com/secondworld/universalsdk/utils/StaticDefine.java b/SdkProject/library/src/main/java/com/secondworld/universalsdk/utils/StaticDefine.java
deleted file mode 100644
index 7e17026..0000000
--- a/SdkProject/library/src/main/java/com/secondworld/universalsdk/utils/StaticDefine.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.secondworld.universalsdk.utils;
-
-/**
- * Created by Administrator on 2018/6/14 0014.
- */
-
-public interface StaticDefine {
-
-    String UnityGameObjectName = "SDKUtility";
-    String UnityHandleFuncName = "HandleSdkMessage";
-
-    String LS_KEY_VERSION = "H2Engine_App_Version";
-    String LS_KEY_COPIED = "H2Engine_Copy_Finished";
-    String LS_KEY_IMEI = "H2Engine_DEVICE_IMEI";
-    String LS_KEY_MAC = "H2Engine_DEVICE_MAC";
-    String LS_KEY_ANDROID_ID = "H2Engine_DEVICE_ANDROID_ID";
-    String LS_KEY_TENCENT_LOGINPARAM = "H2Engine_TENCENT_LOGIN_PARAM";
-
-}
diff --git a/SdkProject/library/src/main/res/layout/activity_main.xml b/SdkProject/library/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..7b97e2b
--- /dev/null
+++ b/SdkProject/library/src/main/res/layout/activity_main.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/main_container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <FrameLayout
+        android:id="@+id/unity_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/SdkProject/library/src/main/res/values/strings.xml b/SdkProject/library/src/main/res/values/strings.xml
new file mode 100644
index 0000000..73862c4
--- /dev/null
+++ b/SdkProject/library/src/main/res/values/strings.xml
@@ -0,0 +1 @@
+<resources></resources>
\ No newline at end of file
diff --git a/SdkProject/library/src/test/java/com/secondworld/universalsdk/ExampleUnitTest.java b/SdkProject/library/src/test/java/com/secondworld/sdk/ExampleUnitTest.java
similarity index 90%
rename from SdkProject/library/src/test/java/com/secondworld/universalsdk/ExampleUnitTest.java
rename to SdkProject/library/src/test/java/com/secondworld/sdk/ExampleUnitTest.java
index 604ec98..8f67092 100644
--- a/SdkProject/library/src/test/java/com/secondworld/universalsdk/ExampleUnitTest.java
+++ b/SdkProject/library/src/test/java/com/secondworld/sdk/ExampleUnitTest.java
@@ -1,4 +1,4 @@
-package com.secondworld.universalsdk;
+package com.secondworld.sdk;
 
 import org.junit.Test;
 

--
Gitblit v1.8.0