Merge branch 'master' of http://192.168.1.20:10010/r/U3DRepository
New file |
| | |
| | | *.iml |
| | | .gradle |
| | | /local.properties |
| | | /.idea/caches |
| | | /.idea/libraries |
| | | /.idea/modules.xml |
| | | /.idea/workspace.xml |
| | | /.idea/navEditor.xml |
| | | /.idea/assetWizardSettings.xml |
| | | .DS_Store |
| | | /build |
| | | /captures |
| | | .externalNativeBuild |
| | | .cxx |
| | | local.properties |
New file |
| | |
| | | plugins { |
| | | id 'com.android.application' |
| | | } |
| | | |
| | | android { |
| | | compileSdkVersion 29 |
| | | buildToolsVersion "30.0.2" |
| | | |
| | | defaultConfig { |
| | | applicationId "com.secondworld.sdk" |
| | | minSdkVersion 21 |
| | | targetSdkVersion 29 |
| | | versionCode 1 |
| | | versionName "1.0" |
| | | |
| | | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" |
| | | } |
| | | |
| | | 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 'androidx.appcompat:appcompat:1.2.0' |
| | | implementation 'com.google.android.material:material:1.2.1' |
| | | implementation 'androidx.constraintlayout:constraintlayout:2.0.3' |
| | | implementation project(path: ':library') |
| | | testImplementation 'junit:junit:4.+' |
| | | androidTestImplementation 'androidx.test.ext:junit:1.1.2' |
| | | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' |
| | | } |
New file |
| | |
| | | # Add project specific ProGuard rules here. |
| | | # You can control the set of applied configuration files using the |
| | | # proguardFiles setting in build.gradle. |
| | | # |
| | | # For more details, see |
| | | # http://developer.android.com/guide/developing/tools/proguard.html |
| | | |
| | | # If your project uses WebView with JS, uncomment the following |
| | | # and specify the fully qualified class name to the JavaScript interface |
| | | # class: |
| | | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { |
| | | # public *; |
| | | #} |
| | | |
| | | # Uncomment this to preserve the line number information for |
| | | # debugging stack traces. |
| | | #-keepattributes SourceFile,LineNumberTable |
| | | |
| | | # If you keep the line number information, uncomment this to |
| | | # hide the original source file name. |
| | | #-renamesourcefileattribute SourceFile |
New file |
| | |
| | | package com.secondworld.universalsdk; |
| | | |
| | | import android.content.Context; |
| | | |
| | | import androidx.test.platform.app.InstrumentationRegistry; |
| | | import androidx.test.ext.junit.runners.AndroidJUnit4; |
| | | |
| | | import org.junit.Test; |
| | | import org.junit.runner.RunWith; |
| | | |
| | | import static org.junit.Assert.*; |
| | | |
| | | /** |
| | | * Instrumented test, which will execute on an Android device. |
| | | * |
| | | * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> |
| | | */ |
| | | @RunWith(AndroidJUnit4.class) |
| | | public class ExampleInstrumentedTest { |
| | | @Test |
| | | public void useAppContext() { |
| | | // Context of the app under test. |
| | | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); |
| | | assertEquals("com.secondworld.sdk", appContext.getPackageName()); |
| | | } |
| | | } |
New file |
| | |
| | | <?xml version="1.0" encoding="utf-8"?> |
| | | <manifest xmlns:android="http://schemas.android.com/apk/res/android" |
| | | package="com.secondworld.universalsdk"> |
| | | |
| | | <application |
| | | android:allowBackup="true" |
| | | android:icon="@mipmap/ic_launcher" |
| | | 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> |
New file |
| | |
| | | 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()); |
| | | } |
| | | } |
New file |
| | |
| | | <vector xmlns:android="http://schemas.android.com/apk/res/android" |
| | | xmlns:aapt="http://schemas.android.com/aapt" |
| | | android:width="108dp" |
| | | android:height="108dp" |
| | | android:viewportWidth="108" |
| | | android:viewportHeight="108"> |
| | | <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z"> |
| | | <aapt:attr name="android:fillColor"> |
| | | <gradient |
| | | android:endX="85.84757" |
| | | android:endY="92.4963" |
| | | android:startX="42.9492" |
| | | android:startY="49.59793" |
| | | android:type="linear"> |
| | | <item |
| | | android:color="#44000000" |
| | | android:offset="0.0" /> |
| | | <item |
| | | android:color="#00000000" |
| | | android:offset="1.0" /> |
| | | </gradient> |
| | | </aapt:attr> |
| | | </path> |
| | | <path |
| | | android:fillColor="#FFFFFF" |
| | | android:fillType="nonZero" |
| | | android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z" |
| | | android:strokeWidth="1" |
| | | android:strokeColor="#00000000" /> |
| | | </vector> |
New file |
| | |
| | | <?xml version="1.0" encoding="utf-8"?> |
| | | <vector xmlns:android="http://schemas.android.com/apk/res/android" |
| | | android:width="108dp" |
| | | android:height="108dp" |
| | | android:viewportWidth="108" |
| | | android:viewportHeight="108"> |
| | | <path |
| | | android:fillColor="#3DDC84" |
| | | android:pathData="M0,0h108v108h-108z" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M9,0L9,108" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M19,0L19,108" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M29,0L29,108" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M39,0L39,108" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M49,0L49,108" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M59,0L59,108" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M69,0L69,108" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M79,0L79,108" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M89,0L89,108" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M99,0L99,108" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M0,9L108,9" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M0,19L108,19" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M0,29L108,29" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M0,39L108,39" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M0,49L108,49" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M0,59L108,59" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M0,69L108,69" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M0,79L108,79" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M0,89L108,89" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M0,99L108,99" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M19,29L89,29" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M19,39L89,39" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M19,49L89,49" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M19,59L89,59" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M19,69L89,69" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M19,79L89,79" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M29,19L29,89" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M39,19L39,89" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M49,19L49,89" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M59,19L59,89" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M69,19L69,89" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | <path |
| | | android:fillColor="#00000000" |
| | | android:pathData="M79,19L79,89" |
| | | android:strokeWidth="0.8" |
| | | android:strokeColor="#33FFFFFF" /> |
| | | </vector> |
New file |
| | |
| | | <?xml version="1.0" encoding="utf-8"?> |
| | | <androidx.constraintlayout.widget.ConstraintLayout 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"> |
| | | |
| | | </androidx.constraintlayout.widget.ConstraintLayout> |
New file |
| | |
| | | <?xml version="1.0" encoding="utf-8"?> |
| | | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> |
| | | <background android:drawable="@drawable/ic_launcher_background" /> |
| | | <foreground android:drawable="@drawable/ic_launcher_foreground" /> |
| | | </adaptive-icon> |
New file |
| | |
| | | <?xml version="1.0" encoding="utf-8"?> |
| | | <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> |
| | | <background android:drawable="@drawable/ic_launcher_background" /> |
| | | <foreground android:drawable="@drawable/ic_launcher_foreground" /> |
| | | </adaptive-icon> |
New file |
| | |
| | | <resources xmlns:tools="http://schemas.android.com/tools"> |
| | | <!-- Base application theme. --> |
| | | <style name="Theme.SdkProject" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> |
| | | <!-- Primary brand color. --> |
| | | <item name="colorPrimary">@color/purple_200</item> |
| | | <item name="colorPrimaryVariant">@color/purple_700</item> |
| | | <item name="colorOnPrimary">@color/black</item> |
| | | <!-- Secondary brand color. --> |
| | | <item name="colorSecondary">@color/teal_200</item> |
| | | <item name="colorSecondaryVariant">@color/teal_200</item> |
| | | <item name="colorOnSecondary">@color/black</item> |
| | | <!-- Status bar color. --> |
| | | <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item> |
| | | <!-- Customize your theme here. --> |
| | | </style> |
| | | </resources> |
New file |
| | |
| | | <?xml version="1.0" encoding="utf-8"?> |
| | | <resources> |
| | | <color name="purple_200">#FFBB86FC</color> |
| | | <color name="purple_500">#FF6200EE</color> |
| | | <color name="purple_700">#FF3700B3</color> |
| | | <color name="teal_200">#FF03DAC5</color> |
| | | <color name="teal_700">#FF018786</color> |
| | | <color name="black">#FF000000</color> |
| | | <color name="white">#FFFFFFFF</color> |
| | | </resources> |
New file |
| | |
| | | <resources> |
| | | <string name="app_name">SdkProject</string> |
| | | </resources> |
New file |
| | |
| | | <resources xmlns:tools="http://schemas.android.com/tools"> |
| | | <!-- Base application theme. --> |
| | | <style name="Theme.SdkProject" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> |
| | | <!-- Primary brand color. --> |
| | | <item name="colorPrimary">@color/purple_500</item> |
| | | <item name="colorPrimaryVariant">@color/purple_700</item> |
| | | <item name="colorOnPrimary">@color/white</item> |
| | | <!-- Secondary brand color. --> |
| | | <item name="colorSecondary">@color/teal_200</item> |
| | | <item name="colorSecondaryVariant">@color/teal_700</item> |
| | | <item name="colorOnSecondary">@color/black</item> |
| | | <!-- Status bar color. --> |
| | | <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item> |
| | | <!-- Customize your theme here. --> |
| | | </style> |
| | | </resources> |
New file |
| | |
| | | package com.secondworld.universalsdk; |
| | | |
| | | import org.junit.Test; |
| | | |
| | | import static org.junit.Assert.*; |
| | | |
| | | /** |
| | | * Example local unit test, which will execute on the development machine (host). |
| | | * |
| | | * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> |
| | | */ |
| | | public class ExampleUnitTest { |
| | | @Test |
| | | public void addition_isCorrect() { |
| | | assertEquals(4, 2 + 2); |
| | | } |
| | | } |
New file |
| | |
| | | // Top-level build file where you can add configuration options common to all sub-projects/modules. |
| | | buildscript { |
| | | repositories { |
| | | google() |
| | | jcenter() |
| | | maven { url 'https://jitpack.io' } |
| | | } |
| | | dependencies { |
| | | classpath "com.android.tools.build:gradle:4.1.0" |
| | | // NOTE: Do not place your application dependencies here; they belong |
| | | // in the individual module build.gradle files |
| | | } |
| | | } |
| | | |
| | | allprojects { |
| | | repositories { |
| | | google() |
| | | jcenter() |
| | | maven { url 'https://jitpack.io' } |
| | | } |
| | | } |
| | | |
| | | task clean(type: Delete) { |
| | | delete rootProject.buildDir |
| | | } |
New file |
| | |
| | | package com.secondworld.universalsdk; |
| | | |
| | | public class MyApplication extends BaseApplication { |
| | | } |
New file |
| | |
| | | # Project-wide Gradle settings. |
| | | # IDE (e.g. Android Studio) users: |
| | | # Gradle settings configured through the IDE *will override* |
| | | # any settings specified in this file. |
| | | # For more details on how to configure your build environment visit |
| | | # http://www.gradle.org/docs/current/userguide/build_environment.html |
| | | # Specifies the JVM arguments used for the daemon process. |
| | | # The setting is particularly useful for tweaking memory settings. |
| | | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 |
| | | # When configured, Gradle will run in incubating parallel mode. |
| | | # This option should only be used with decoupled projects. More details, visit |
| | | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects |
| | | # org.gradle.parallel=true |
| | | # AndroidX package structure to make it clearer which packages are bundled with the |
| | | # Android operating system, and which are packaged with your app"s APK |
| | | # https://developer.android.com/topic/libraries/support-library/androidx-rn |
| | | android.useAndroidX=true |
| | | # Automatically convert third-party libraries to use AndroidX |
| | | android.enableJetifier=true |
| | | |
| | | #当前打包的渠道名称 |
| | | CHANNEL_NAME=test |
New file |
| | |
| | | #Fri Oct 30 14:46:25 CST 2020 |
| | | distributionBase=GRADLE_USER_HOME |
| | | distributionPath=wrapper/dists |
| | | zipStoreBase=GRADLE_USER_HOME |
| | | zipStorePath=wrapper/dists |
| | | distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip |
New file |
| | |
| | | #!/usr/bin/env sh |
| | | |
| | | ############################################################################## |
| | | ## |
| | | ## Gradle start up script for UN*X |
| | | ## |
| | | ############################################################################## |
| | | |
| | | # Attempt to set APP_HOME |
| | | # Resolve links: $0 may be a link |
| | | PRG="$0" |
| | | # Need this for relative symlinks. |
| | | while [ -h "$PRG" ] ; do |
| | | ls=`ls -ld "$PRG"` |
| | | link=`expr "$ls" : '.*-> \(.*\)$'` |
| | | if expr "$link" : '/.*' > /dev/null; then |
| | | PRG="$link" |
| | | else |
| | | PRG=`dirname "$PRG"`"/$link" |
| | | fi |
| | | done |
| | | SAVED="`pwd`" |
| | | cd "`dirname \"$PRG\"`/" >/dev/null |
| | | APP_HOME="`pwd -P`" |
| | | cd "$SAVED" >/dev/null |
| | | |
| | | APP_NAME="Gradle" |
| | | APP_BASE_NAME=`basename "$0"` |
| | | |
| | | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. |
| | | DEFAULT_JVM_OPTS="" |
| | | |
| | | # Use the maximum available, or set MAX_FD != -1 to use that value. |
| | | MAX_FD="maximum" |
| | | |
| | | warn () { |
| | | echo "$*" |
| | | } |
| | | |
| | | die () { |
| | | echo |
| | | echo "$*" |
| | | echo |
| | | exit 1 |
| | | } |
| | | |
| | | # OS specific support (must be 'true' or 'false'). |
| | | cygwin=false |
| | | msys=false |
| | | darwin=false |
| | | nonstop=false |
| | | case "`uname`" in |
| | | CYGWIN* ) |
| | | cygwin=true |
| | | ;; |
| | | Darwin* ) |
| | | darwin=true |
| | | ;; |
| | | MINGW* ) |
| | | msys=true |
| | | ;; |
| | | NONSTOP* ) |
| | | nonstop=true |
| | | ;; |
| | | esac |
| | | |
| | | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar |
| | | |
| | | # Determine the Java command to use to start the JVM. |
| | | if [ -n "$JAVA_HOME" ] ; then |
| | | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then |
| | | # IBM's JDK on AIX uses strange locations for the executables |
| | | JAVACMD="$JAVA_HOME/jre/sh/java" |
| | | else |
| | | JAVACMD="$JAVA_HOME/bin/java" |
| | | fi |
| | | if [ ! -x "$JAVACMD" ] ; then |
| | | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME |
| | | |
| | | Please set the JAVA_HOME variable in your environment to match the |
| | | location of your Java installation." |
| | | fi |
| | | else |
| | | JAVACMD="java" |
| | | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. |
| | | |
| | | Please set the JAVA_HOME variable in your environment to match the |
| | | location of your Java installation." |
| | | fi |
| | | |
| | | # Increase the maximum file descriptors if we can. |
| | | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then |
| | | MAX_FD_LIMIT=`ulimit -H -n` |
| | | if [ $? -eq 0 ] ; then |
| | | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then |
| | | MAX_FD="$MAX_FD_LIMIT" |
| | | fi |
| | | ulimit -n $MAX_FD |
| | | if [ $? -ne 0 ] ; then |
| | | warn "Could not set maximum file descriptor limit: $MAX_FD" |
| | | fi |
| | | else |
| | | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" |
| | | fi |
| | | fi |
| | | |
| | | # For Darwin, add options to specify how the application appears in the dock |
| | | if $darwin; then |
| | | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" |
| | | fi |
| | | |
| | | # For Cygwin, switch paths to Windows format before running java |
| | | if $cygwin ; then |
| | | APP_HOME=`cygpath --path --mixed "$APP_HOME"` |
| | | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` |
| | | JAVACMD=`cygpath --unix "$JAVACMD"` |
| | | |
| | | # We build the pattern for arguments to be converted via cygpath |
| | | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` |
| | | SEP="" |
| | | for dir in $ROOTDIRSRAW ; do |
| | | ROOTDIRS="$ROOTDIRS$SEP$dir" |
| | | SEP="|" |
| | | done |
| | | OURCYGPATTERN="(^($ROOTDIRS))" |
| | | # Add a user-defined pattern to the cygpath arguments |
| | | if [ "$GRADLE_CYGPATTERN" != "" ] ; then |
| | | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" |
| | | fi |
| | | # Now convert the arguments - kludge to limit ourselves to /bin/sh |
| | | i=0 |
| | | for arg in "$@" ; do |
| | | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` |
| | | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option |
| | | |
| | | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition |
| | | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` |
| | | else |
| | | eval `echo args$i`="\"$arg\"" |
| | | fi |
| | | i=$((i+1)) |
| | | done |
| | | case $i in |
| | | (0) set -- ;; |
| | | (1) set -- "$args0" ;; |
| | | (2) set -- "$args0" "$args1" ;; |
| | | (3) set -- "$args0" "$args1" "$args2" ;; |
| | | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; |
| | | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; |
| | | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; |
| | | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; |
| | | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; |
| | | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; |
| | | esac |
| | | fi |
| | | |
| | | # Escape application args |
| | | save () { |
| | | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done |
| | | echo " " |
| | | } |
| | | APP_ARGS=$(save "$@") |
| | | |
| | | # Collect all arguments for the java command, following the shell quoting and substitution rules |
| | | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" |
| | | |
| | | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong |
| | | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then |
| | | cd "$(dirname "$0")" |
| | | fi |
| | | |
| | | exec "$JAVACMD" "$@" |
New file |
| | |
| | | @if "%DEBUG%" == "" @echo off |
| | | @rem ########################################################################## |
| | | @rem |
| | | @rem Gradle startup script for Windows |
| | | @rem |
| | | @rem ########################################################################## |
| | | |
| | | @rem Set local scope for the variables with windows NT shell |
| | | if "%OS%"=="Windows_NT" setlocal |
| | | |
| | | set DIRNAME=%~dp0 |
| | | if "%DIRNAME%" == "" set DIRNAME=. |
| | | set APP_BASE_NAME=%~n0 |
| | | set APP_HOME=%DIRNAME% |
| | | |
| | | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. |
| | | set DEFAULT_JVM_OPTS= |
| | | |
| | | @rem Find java.exe |
| | | if defined JAVA_HOME goto findJavaFromJavaHome |
| | | |
| | | set JAVA_EXE=java.exe |
| | | %JAVA_EXE% -version >NUL 2>&1 |
| | | if "%ERRORLEVEL%" == "0" goto init |
| | | |
| | | echo. |
| | | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. |
| | | echo. |
| | | echo Please set the JAVA_HOME variable in your environment to match the |
| | | echo location of your Java installation. |
| | | |
| | | goto fail |
| | | |
| | | :findJavaFromJavaHome |
| | | set JAVA_HOME=%JAVA_HOME:"=% |
| | | set JAVA_EXE=%JAVA_HOME%/bin/java.exe |
| | | |
| | | if exist "%JAVA_EXE%" goto init |
| | | |
| | | echo. |
| | | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% |
| | | echo. |
| | | echo Please set the JAVA_HOME variable in your environment to match the |
| | | echo location of your Java installation. |
| | | |
| | | goto fail |
| | | |
| | | :init |
| | | @rem Get command-line arguments, handling Windows variants |
| | | |
| | | if not "%OS%" == "Windows_NT" goto win9xME_args |
| | | |
| | | :win9xME_args |
| | | @rem Slurp the command line arguments. |
| | | set CMD_LINE_ARGS= |
| | | set _SKIP=2 |
| | | |
| | | :win9xME_args_slurp |
| | | if "x%~1" == "x" goto execute |
| | | |
| | | set CMD_LINE_ARGS=%* |
| | | |
| | | :execute |
| | | @rem Setup the command line |
| | | |
| | | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar |
| | | |
| | | @rem Execute Gradle |
| | | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% |
| | | |
| | | :end |
| | | @rem End local scope for the variables with windows NT shell |
| | | if "%ERRORLEVEL%"=="0" goto mainEnd |
| | | |
| | | :fail |
| | | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of |
| | | rem the _cmd.exe /c_ return code! |
| | | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 |
| | | exit /b 1 |
| | | |
| | | :mainEnd |
| | | if "%OS%"=="Windows_NT" endlocal |
| | | |
| | | :omega |
New file |
| | |
| | | plugins { |
| | | id 'com.android.library' |
| | | } |
| | | def rootPath = rootProject.getRootDir().getAbsolutePath() |
| | | def channelPath = "${rootPath}/channel/${CHANNEL_NAME}" |
| | | |
| | | def applyGradle(String path) { |
| | | path = "${path}.gradle" |
| | | File file = file(path) |
| | | if (file.exists()) |
| | | apply from: path |
| | | } |
| | | |
| | | applyGradle("${rootPath}/utils")//工具脚本 |
| | | applyGradle("${channelPath}/build")//渠道脚本 |
| | | |
| | | Properties localProp = loadProperties('local')//本地配置 |
| | | Properties channelProp = loadProperties("${channelPath}/config")//渠道所属的配置 |
| | | |
| | | def outPutPath = localProp.getProperty("OUTPUT_PATH")//工程sdk输出路径 |
| | | |
| | | //当前渠道所应用的插件名 |
| | | def plugins = channelProp.getProperty("PLUGINS").split(';') |
| | | //插件脚本 |
| | | plugins.each { |
| | | applyGradle("${rootPath}/plugins/${it}/build") |
| | | } |
| | | |
| | | //渠道需要覆盖主目录的java文件 |
| | | def channelJavaFiles = getAllFiles(new ArrayList<File>(), "${channelPath}/java") |
| | | |
| | | android { |
| | | compileSdkVersion 29 |
| | | buildToolsVersion "30.0.2" |
| | | |
| | | defaultConfig { |
| | | minSdkVersion 21 |
| | | targetSdkVersion 29 |
| | | versionCode 1 |
| | | versionName "1.0" |
| | | |
| | | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" |
| | | consumerProguardFiles "consumer-rules.pro" |
| | | } |
| | | |
| | | flavorDimensions "version" |
| | | productFlavors { |
| | | merger { |
| | | dimension "version" |
| | | } |
| | | } |
| | | |
| | | buildTypes { |
| | | release { |
| | | minifyEnabled false |
| | | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' |
| | | } |
| | | } |
| | | compileOptions { |
| | | sourceCompatibility JavaVersion.VERSION_1_8 |
| | | targetCompatibility JavaVersion.VERSION_1_8 |
| | | } |
| | | lintOptions { |
| | | checkReleaseBuilds false |
| | | abortOnError false |
| | | } |
| | | |
| | | //合并资源 |
| | | sourceSets { |
| | | main { |
| | | java { |
| | | //剔除主目录下,渠道重复的类 |
| | | channelJavaFiles.each { |
| | | def tag = "java\\" |
| | | def str = it.getAbsolutePath() |
| | | def str1 = str.substring(0, str.indexOf(tag)) |
| | | def str2 = str.substring(str1.length() + tag.length(), str.length()) |
| | | exclude str2 |
| | | } |
| | | } |
| | | } |
| | | merger { |
| | | java { |
| | | srcDirs "${channelPath}/java" |
| | | } |
| | | jniLibs.srcDirs "${channelPath}/libs" |
| | | res.srcDirs "${channelPath}/res" |
| | | manifest { |
| | | File file = file("${channelPath}/AndroidManifest.xml") |
| | | if (file.exists()) |
| | | srcFile "${channelPath}/AndroidManifest.xml" |
| | | } |
| | | //合并插件 |
| | | plugins.each { |
| | | def pluginPath = "${rootPath}/plugins/${it}" |
| | | java.srcDirs "${pluginPath}/java" |
| | | jniLibs.srcDirs "${pluginPath}libs" |
| | | res.srcDirs "${pluginPath}/res" |
| | | manifest { |
| | | File file = file("${pluginPath}/AndroidManifest.xml") |
| | | if (file.exists()) |
| | | srcFile "${pluginPath}/AndroidManifest.xml" |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | android.libraryVariants.all { variant -> |
| | | variant.outputs.all { |
| | | outputFileName = "library-${buildType.name}-${CHANNEL_NAME}.aar" |
| | | } |
| | | } |
| | | |
| | | //拷贝清单文件作为unity直接使用 |
| | | task copyManifest(type: Copy) { |
| | | dependsOn 'assembleRelease' |
| | | from zipTree("build/outputs/aar/library-release-${CHANNEL_NAME}.aar") |
| | | include "AndroidManifest.xml" |
| | | into "${outPutPath}\\${CHANNEL_NAME}\\" |
| | | } |
| | | |
| | | //执行打包任务以及拷贝到外部 |
| | | task assembleAndCopySdk(type: Copy) { |
| | | dependsOn copyManifest |
| | | from "build/outputs/aar/" |
| | | include "library-release-${CHANNEL_NAME}.aar" |
| | | into "${outPutPath}\\${CHANNEL_NAME}\\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 'com.github.pqpo:Log4a:1.4.2@aar' |
| | | implementation files('libs/unity-classes.jar') |
| | | } |
New file |
| | |
| | | # Add project specific ProGuard rules here. |
| | | # You can control the set of applied configuration files using the |
| | | # proguardFiles setting in build.gradle. |
| | | # |
| | | # For more details, see |
| | | # http://developer.android.com/guide/developing/tools/proguard.html |
| | | |
| | | # If your project uses WebView with JS, uncomment the following |
| | | # and specify the fully qualified class name to the JavaScript interface |
| | | # class: |
| | | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { |
| | | # public *; |
| | | #} |
| | | |
| | | # Uncomment this to preserve the line number information for |
| | | # debugging stack traces. |
| | | #-keepattributes SourceFile,LineNumberTable |
| | | |
| | | # If you keep the line number information, uncomment this to |
| | | # hide the original source file name. |
| | | #-renamesourcefileattribute SourceFile |
New file |
| | |
| | | package com.secondworld.universalsdk; |
| | | |
| | | import android.content.Context; |
| | | |
| | | import androidx.test.platform.app.InstrumentationRegistry; |
| | | import androidx.test.ext.junit.runners.AndroidJUnit4; |
| | | |
| | | import org.junit.Test; |
| | | import org.junit.runner.RunWith; |
| | | |
| | | import static org.junit.Assert.*; |
| | | |
| | | /** |
| | | * Instrumented test, which will execute on an Android device. |
| | | * |
| | | * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> |
| | | */ |
| | | @RunWith(AndroidJUnit4.class) |
| | | public class ExampleInstrumentedTest { |
| | | @Test |
| | | public void useAppContext() { |
| | | // Context of the app under test. |
| | | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); |
| | | assertEquals("com.secondworld.sdk.test", appContext.getPackageName()); |
| | | } |
| | | } |
New file |
| | |
| | | <?xml version="1.0" encoding="utf-8"?> |
| | | <manifest xmlns:android="http://schemas.android.com/apk/res/android" |
| | | package="com.secondworld.universalsdk"> |
| | | |
| | | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> |
| | | |
| | | </manifest> |
New file |
| | |
| | | package com.secondworld.universalsdk; |
| | | |
| | | import android.app.Application; |
| | | |
| | | import me.pqpo.librarylog4a.Log4a; |
| | | |
| | | public class BaseApplication extends Application { |
| | | |
| | | public static Application APP; |
| | | |
| | | @Override |
| | | public void onCreate() { |
| | | super.onCreate(); |
| | | APP = this; |
| | | InitSdk(); |
| | | } |
| | | |
| | | public void InitSdk(){ |
| | | LogUtil.Init(this); |
| | | H2EngineSDK.initCommandMap(); |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.secondworld.universalsdk; |
| | | |
| | | /** |
| | | * Created by Administrator on 2018/7/18 0018. |
| | | */ |
| | | |
| | | public interface CodeA2U { |
| | | /** |
| | | * 资源拷贝完成 |
| | | */ |
| | | int AssetCopyFinished = 0; |
| | | /** |
| | | * 电量改变 |
| | | */ |
| | | int BatteryLevel = 1; |
| | | /** |
| | | * 充电状态改变 |
| | | */ |
| | | int BatteryCharging = 2; |
| | | /** |
| | | * 回调sdk逻辑完毕 |
| | | */ |
| | | int SdkInitComplete = 90; |
| | | /** |
| | | * 回调android设备信息 |
| | | */ |
| | | int DeviceInfo = 3; |
| | | /** |
| | | * 回调推送的独立id |
| | | */ |
| | | int PushClientID = 4; |
| | | /** |
| | | * 回调外部存储根目录地址 |
| | | */ |
| | | int ExternalStorage = 5; |
| | | /** |
| | | * 触发了退出游戏逻辑, 打开二次确认界面 |
| | | */ |
| | | int ExitGame = 6; |
| | | } |
New file |
| | |
| | | package com.secondworld.universalsdk; |
| | | |
| | | /** |
| | | * Created by Administrator on 2018/7/18 0018. |
| | | */ |
| | | |
| | | public interface CodeU2A { |
| | | /** |
| | | * 执行资源拷贝 |
| | | */ |
| | | int AssetCopy = 0; |
| | | /** |
| | | * 执行开始电量改变,充电状态改变监听 |
| | | */ |
| | | int BatteryListenStart = 1; |
| | | /** |
| | | * 执行停止电量改变,充电状态改变监听 |
| | | */ |
| | | int BatteryListenStop = 2; |
| | | /** |
| | | * 获取唯一识别码 |
| | | */ |
| | | int UniqueID = 3; |
| | | /** |
| | | * 申请在AndroidManifest文件中 |
| | | */ |
| | | int RequestManifestPermissions = 4; |
| | | /** |
| | | * 单独动态申请某一个权限 |
| | | */ |
| | | int RequestPermission = 5; |
| | | /** |
| | | * 重启应用 |
| | | */ |
| | | int RestartApp = 6; |
| | | /** |
| | | * 拷贝文本信息 |
| | | */ |
| | | int CopyContent = 7; |
| | | /** |
| | | * 打开网址 |
| | | */ |
| | | int OpenWebView = 8; |
| | | /** |
| | | * SDK初始化, 完全自动初始化的流程, 完成必要逻辑后再回调回去 |
| | | */ |
| | | int Init = 9; |
| | | /** |
| | | * 安装应用 |
| | | */ |
| | | int InstallAPK = 10; |
| | | /** |
| | | * 外部存储根目录地址 |
| | | */ |
| | | int ExteneralStorage = 11; |
| | | /** |
| | | * 拷贝游戏资源 |
| | | */ |
| | | int CopyOneAsset = 12; |
| | | } |
New file |
| | |
| | | package com.secondworld.universalsdk; |
| | | |
| | | public class EngineHandler { |
| | | |
| | | public EngineHandler(){ |
| | | |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | 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查找当前的APK中可执行文件 |
| | | 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; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.secondworld.universalsdk; |
| | | |
| | | import android.content.Context; |
| | | import android.util.Log; |
| | | |
| | | import java.io.File; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.Date; |
| | | import java.util.Locale; |
| | | |
| | | import me.pqpo.librarylog4a.Level; |
| | | import me.pqpo.librarylog4a.Log4a; |
| | | import me.pqpo.librarylog4a.LogData; |
| | | import me.pqpo.librarylog4a.appender.AndroidAppender; |
| | | import me.pqpo.librarylog4a.appender.FileAppender; |
| | | import me.pqpo.librarylog4a.formatter.DateFileFormatter; |
| | | import me.pqpo.librarylog4a.interceptor.Interceptor; |
| | | import me.pqpo.librarylog4a.logger.AppenderLogger; |
| | | |
| | | public class LogUtil { |
| | | |
| | | private static final int BUFFER_SIZE = 1024 * 1024; //日志缓存大小 |
| | | |
| | | private static final boolean DEBUG = BuildConfig.DEBUG; |
| | | |
| | | private static final String GLOBAL_TAG = "H2EngineSDK"; |
| | | |
| | | public static void Init(Context context) { |
| | | int level = Level.VERBOSE; |
| | | Interceptor wrapInterceptor = new Interceptor() { |
| | | @Override |
| | | public boolean intercept(LogData logData) { |
| | | logData.tag = "-" + logData.tag + ":"; |
| | | return true; |
| | | } |
| | | }; |
| | | AndroidAppender androidAppender = new AndroidAppender.Builder() |
| | | .setLevel(level) |
| | | .addInterceptor(wrapInterceptor) |
| | | .create(); |
| | | |
| | | File logDir = new File(context.getExternalCacheDir() + "/logs/"); |
| | | String buffer_path = logDir.getAbsolutePath() + File.separator + ".logCache"; |
| | | String time = new SimpleDateFormat("yyyy_MM_dd", Locale.getDefault()).format(new Date()); |
| | | String log_path = logDir.getAbsolutePath() + File.separator + time + ".txt"; |
| | | FileAppender fileAppender = new FileAppender.Builder(context) |
| | | .setLogFilePath(log_path) |
| | | .setLevel(level) |
| | | .addInterceptor(wrapInterceptor) |
| | | .setBufferFilePath(buffer_path) |
| | | .setFormatter(new DateFileFormatter()) |
| | | .setCompress(false) |
| | | .setBufferSize(BUFFER_SIZE) |
| | | .create(); |
| | | |
| | | AppenderLogger logger = new AppenderLogger.Builder() |
| | | .addAppender(fileAppender) |
| | | .create(); |
| | | |
| | | Log4a.setLogger(logger); |
| | | } |
| | | |
| | | private static void print(int level, String tag, String msg, boolean debug) { |
| | | if (DEBUG || debug)//控制台输出 |
| | | Log.println(level, String.format("%s-%s", GLOBAL_TAG, tag), msg); |
| | | else//写入本地文件 |
| | | Log4a.println(level, tag, msg); |
| | | } |
| | | |
| | | public static void debug(String tag, String msg) { |
| | | print(Level.ERROR, tag, msg, true); |
| | | } |
| | | |
| | | public static void v(String tag, String msg) { |
| | | print(Level.VERBOSE, tag, msg, false); |
| | | } |
| | | |
| | | public static void d(String tag, String msg) { |
| | | print(Level.DEBUG, tag, msg, false); |
| | | } |
| | | |
| | | public static void i(String tag, String msg) { |
| | | print(Level.INFO, tag, msg, false); |
| | | } |
| | | |
| | | public static void w(String tag, String msg) { |
| | | print(Level.WARN, tag, msg, false); |
| | | } |
| | | |
| | | public static void e(String tag, String msg) { |
| | | print(Level.ERROR, tag, msg, false); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | 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) { |
| | | } |
| | | } |
New file |
| | |
| | | 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) { |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | 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) { |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | 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) { |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | 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) { |
| | | } |
| | | } |
New file |
| | |
| | | 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) { |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | 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) { |
| | | } |
| | | } |
New file |
| | |
| | | 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) { |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | 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) { |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | 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) { |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | 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) { |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | 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) { |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | 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) { |
| | | |
| | | } |
| | | } |
New file |
| | |
| | | package com.secondworld.universalsdk.command; |
| | | |
| | | /** |
| | | * unity 传递过来的命令 |
| | | */ |
| | | public interface ICommand { |
| | | |
| | | int getCode(); |
| | | |
| | | void process(String json); |
| | | |
| | | } |
New file |
| | |
| | | package com.secondworld.universalsdk; |
| | | |
| | | import org.junit.Test; |
| | | |
| | | import static org.junit.Assert.*; |
| | | |
| | | /** |
| | | * Example local unit test, which will execute on the development machine (host). |
| | | * |
| | | * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> |
| | | */ |
| | | public class ExampleUnitTest { |
| | | @Test |
| | | public void addition_isCorrect() { |
| | | assertEquals(4, 2 + 2); |
| | | } |
| | | } |
New file |
| | |
| | | include ':library' |
| | | include ':app' |
| | | rootProject.name = "SdkProject" |
New file |
| | |
| | | //加载本集配置properties文件 |
| | | def loadProperties(String name) { |
| | | Properties properties = new Properties() |
| | | InputStream inputStream = project.rootProject.file("${name}.properties").newDataInputStream() |
| | | properties.load(inputStream) |
| | | return properties |
| | | } |
| | | //递归读取该目录下的文件 |
| | | def getAllFiles(ArrayList<File> list, String path) { |
| | | list.clear() |
| | | File file = file(path) |
| | | if (file.isFile()) { |
| | | list.add(file) |
| | | return list |
| | | } |
| | | def files = file.listFiles() |
| | | files.each { |
| | | if (it.isDirectory()) |
| | | getAllFiles(list,it.getAbsolutePath()) |
| | | else |
| | | list.add(it) |
| | | print "\n" |
| | | } |
| | | return list |
| | | } |
| | | |
| | | ext { |
| | | getAllFiles = this.&getAllFiles |
| | | loadProperties = this.&loadProperties |
| | | } |