Full Code of Bzaigege/GameSDKFrameDemo for AI

master 31e812349bfd cached
424 files
50.5 MB
301.6k tokens
2208 symbols
1 requests
Download .txt
Showing preview only (1,392K chars total). Download the full file or copy to clipboard to get everything.
Repository: Bzaigege/GameSDKFrameDemo
Branch: master
Commit: 31e812349bfd
Files: 424
Total size: 50.5 MB

Directory structure:
gitextract_qbthkmxs/

├── .gitignore
├── GameSDKBuildJarTool/
│   ├── .gitignore
│   ├── build.gradle
│   ├── libs/
│   │   ├── common-24.3.0.jar
│   │   ├── guava-18.0.jar
│   │   ├── manifest-merger-24.3.0.jar
│   │   ├── proguard.jar
│   │   ├── retrace.jar
│   │   └── sdk-common-25.1.2.jar
│   ├── src/
│   │   └── main/
│   │       ├── cmd/
│   │       │   └── test/
│   │       │       ├── jar/
│   │       │       │   ├── test.jar
│   │       │       │   └── test_proguard.jar
│   │       │       ├── java/
│   │       │       │   ├── HelloWorld.java
│   │       │       │   └── TestA.java
│   │       │       └── proguard/
│   │       │           ├── proguard_config.pro
│   │       │           └── tools/
│   │       │               ├── proguard.jar
│   │       │               └── rt.jar
│   │       ├── java/
│   │       │   └── com/
│   │       │       └── bzai/
│   │       │           └── gamesdk/
│   │       │               └── build/
│   │       │                   ├── BuildJarTask.java
│   │       │                   ├── Config.java
│   │       │                   ├── Main.java
│   │       │                   ├── bean/
│   │       │                   │   ├── ErrorMsg.java
│   │       │                   │   └── Project.java
│   │       │                   ├── tools/
│   │       │                   │   ├── JavaTool.java
│   │       │                   │   ├── ProGuardTool.java
│   │       │                   │   ├── ServerTool.java
│   │       │                   │   └── exec/
│   │       │                   │       └── Shell.java
│   │       │                   └── utils/
│   │       │                       ├── FileUtils.java
│   │       │                       └── Utils.java
│   │       └── resources/
│   │           ├── config
│   │           ├── proguard_config.pro
│   │           └── project_list
│   └── 必读说明
├── GameSDKDemo_Release/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── bzai/
│       │               └── gamesdkframe/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── bzai/
│       │   │           └── gamesdkframe/
│       │   │               └── demo/
│       │   │                   ├── GameApplication.java
│       │   │                   └── GameSDKMain.java
│       │   └── res/
│       │       ├── layout/
│       │       │   └── activity_main.xml
│       │       └── values/
│       │           ├── colors.xml
│       │           └── strings.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── bzai/
│                       └── gamesdkframe/
│                           └── ExampleUnitTest.java
├── GameSDKLibrary_Release/
│   ├── .gitignore
│   ├── build.gradle
│   ├── libs/
│   │   ├── alipaySdk-20180601.jar
│   │   ├── android-support-v4.jar
│   │   ├── org.apache.http.legacy.jar
│   │   ├── sdk_test_v1.0.0.jar
│   │   └── wechat-sdk-android-without-mta-5.1.4.jar
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── suyutech/
│       │               └── baselibrary/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── assets/
│       │   │   ├── Channel_config.txt
│       │   │   ├── Plugin_config.txt
│       │   │   ├── Project_config.txt
│       │   │   └── SDKInfo.json
│       │   └── res/
│       │       └── values/
│       │           └── strings.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── suyutech/
│                       └── baselibrary/
│                           └── ExampleUnitTest.java
├── GameSDK_API/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── bzai/
│       │               └── gamesdk/
│       │                   └── api/
│       │                       └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── bzai/
│       │               └── gamesdk/
│       │                   ├── GameInfoSetting.java
│       │                   ├── SDKApplication.java
│       │                   ├── api/
│       │                   │   └── SDKAPI.java
│       │                   ├── bean/
│       │                   │   ├── info/
│       │                   │   │   ├── AccountEventResultInfo.java
│       │                   │   │   └── PlayerInfo.java
│       │                   │   └── params/
│       │                   │       ├── GameRoleParams.java
│       │                   │       └── PayParams.java
│       │                   └── listener/
│       │                       ├── AccountCallBackLister.java
│       │                       ├── ExitCallBackLister.java
│       │                       ├── InitCallBackLister.java
│       │                       └── PurchaseCallBackListener.java
│       └── test/
│           └── java/
│               └── com/
│                   └── bzai/
│                       └── gamesdk/
│                           └── api/
│                               └── ExampleUnitTest.java
├── GameSDK_BeginProject/
│   ├── GameSDK_Project_Custom/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── androidTest/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── bzai/
│   │       │               └── gamesdk/
│   │       │                   └── project/
│   │       │                       └── channel/
│   │       │                           └── ExampleInstrumentedTest.java
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   ├── assets/
│   │       │   │   ├── Plugin_config.txt
│   │       │   │   ├── Project_config.txt
│   │       │   │   └── SDKInfo.json
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── bzai/
│   │       │               └── gamesdk/
│   │       │                   └── project/
│   │       │                       ├── CustomProject.java
│   │       │                       └── ProjectApplication.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── bzai/
│   │                       └── gamesdk/
│   │                           └── project/
│   │                               └── channel/
│   │                                   └── ExampleUnitTest.java
│   └── GameSDK_Project_JuHe/
│       ├── .gitignore
│       ├── build.gradle
│       ├── proguard-rules.pro
│       └── src/
│           ├── androidTest/
│           │   └── java/
│           │       └── com/
│           │           └── bzai/
│           │               └── gamesdk/
│           │                   └── project/
│           │                       └── juhe/
│           │                           └── ExampleInstrumentedTest.java
│           ├── main/
│           │   ├── AndroidManifest.xml
│           │   ├── assets/
│           │   │   ├── Plugin_config.txt
│           │   │   ├── Project_config.txt
│           │   │   └── SDKInfo.json
│           │   └── java/
│           │       └── com/
│           │           └── bzai/
│           │               └── gamesdk/
│           │                   └── project/
│           │                       ├── JuHeProject.java
│           │                       └── ProjectApplication.java
│           └── test/
│               └── java/
│                   └── com/
│                       └── bzai/
│                           └── gamesdk/
│                               └── project/
│                                   └── juhe/
│                                       └── ExampleUnitTest.java
├── GameSDK_Channel/
│   ├── GameSDK_Channel_Lexiang/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── libs/
│   │   │   ├── HeepayPlugin_v3.0.jar
│   │   │   ├── eventbus-3.0.0.jar
│   │   │   └── youxunsdk.jar
│   │   ├── proguard-rules.pro
│   │   ├── src/
│   │   │   ├── androidTest/
│   │   │   │   └── java/
│   │   │   │       └── com/
│   │   │   │           └── bzai/
│   │   │   │               └── gamesdk/
│   │   │   │                   └── channel/
│   │   │   │                       └── test/
│   │   │   │                           └── ExampleInstrumentedTest.java
│   │   │   ├── main/
│   │   │   │   ├── AndroidManifest.xml
│   │   │   │   ├── assets/
│   │   │   │   │   └── Channel_config.txt
│   │   │   │   ├── java/
│   │   │   │   │   └── com/
│   │   │   │   │       └── bzai/
│   │   │   │   │           └── gamesdk/
│   │   │   │   │               └── channel/
│   │   │   │   │                   ├── application/
│   │   │   │   │                   │   └── ChannelApplication.java
│   │   │   │   │                   └── lexiang/
│   │   │   │   │                       └── LexiangSDK.java
│   │   │   │   └── res/
│   │   │   │       ├── drawable/
│   │   │   │       │   ├── youxun_border_stroke.xml
│   │   │   │       │   ├── youxun_cir_hint_bg.xml
│   │   │   │       │   ├── youxun_cir_rect.xml
│   │   │   │       │   ├── youxun_drawable_1.xml
│   │   │   │       │   ├── youxun_drawable_2.xml
│   │   │   │       │   ├── youxun_drawable_3.xml
│   │   │   │       │   ├── youxun_drawable_33.xml
│   │   │   │       │   ├── youxun_drawable_4.xml
│   │   │   │       │   ├── youxun_drawable_44.xml
│   │   │   │       │   ├── youxun_drawable_5.xml
│   │   │   │       │   ├── youxun_drawable_6.xml
│   │   │   │       │   └── youxun_service_rect.xml
│   │   │   │       └── layout/
│   │   │   │           ├── youxun_account.xml
│   │   │   │           ├── youxun_account_hint.xml
│   │   │   │           ├── youxun_account_login.xml
│   │   │   │           ├── youxun_account_reg.xml
│   │   │   │           ├── youxun_bound.xml
│   │   │   │           ├── youxun_dialog.xml
│   │   │   │           ├── youxun_dialog2.xml
│   │   │   │           ├── youxun_dialog3.xml
│   │   │   │           ├── youxun_floating.xml
│   │   │   │           ├── youxun_gb_dialog.xml
│   │   │   │           ├── youxun_gb_item.xml
│   │   │   │           ├── youxun_gb_menu.xml
│   │   │   │           ├── youxun_gift_bag.xml
│   │   │   │           ├── youxun_login.xml
│   │   │   │           ├── youxun_login_footprint.xml
│   │   │   │           ├── youxun_login_menu.xml
│   │   │   │           ├── youxun_login_option_item.xml
│   │   │   │           ├── youxun_login_popup.xml
│   │   │   │           ├── youxun_menu_2.xml
│   │   │   │           ├── youxun_menu_3.xml
│   │   │   │           ├── youxun_menu_4.xml
│   │   │   │           ├── youxun_mobile.xml
│   │   │   │           ├── youxun_mobile_login.xml
│   │   │   │           ├── youxun_mobile_reg.xml
│   │   │   │           ├── youxun_mobile_verify.xml
│   │   │   │           ├── youxun_notice.xml
│   │   │   │           ├── youxun_pay.xml
│   │   │   │           ├── youxun_toast.xml
│   │   │   │           └── youxun_webview.xml
│   │   │   └── test/
│   │   │       └── java/
│   │   │           └── com/
│   │   │               └── bzai/
│   │   │                   └── gamesdk/
│   │   │                       └── channel/
│   │   │                           └── test/
│   │   │                               └── ExampleUnitTest.java
│   │   └── 开发者说明
│   └── GameSDK_Channel_Test/
│       ├── .gitignore
│       ├── build.gradle
│       ├── proguard-rules.pro
│       ├── src/
│       │   ├── androidTest/
│       │   │   └── java/
│       │   │       └── com/
│       │   │           └── bzai/
│       │   │               └── gamesdk/
│       │   │                   └── channel/
│       │   │                       └── test/
│       │   │                           └── ExampleInstrumentedTest.java
│       │   ├── main/
│       │   │   ├── AndroidManifest.xml
│       │   │   ├── assets/
│       │   │   │   └── Channel_config.txt
│       │   │   ├── java/
│       │   │   │   └── com/
│       │   │   │       └── bzai/
│       │   │   │           └── gamesdk/
│       │   │   │               └── channel/
│       │   │   │                   ├── application/
│       │   │   │                   │   └── ChannelApplication.java
│       │   │   │                   └── test/
│       │   │   │                       └── TestChannelSDK.java
│       │   │   └── res/
│       │   │       └── values/
│       │   │           └── strings.xml
│       │   └── test/
│       │       └── java/
│       │           └── com/
│       │               └── bzai/
│       │                   └── gamesdk/
│       │                       └── channel/
│       │                           └── test/
│       │                               └── ExampleUnitTest.java
│       └── 开发者说明
├── GameSDK_Manager/
│   ├── GameSDK_Module_Account/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── androidTest/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── bzai/
│   │       │               └── gamesdk/
│   │       │                   └── module/
│   │       │                       └── account/
│   │       │                           └── ExampleInstrumentedTest.java
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── bzai/
│   │       │               └── gamesdk/
│   │       │                   └── module/
│   │       │                       └── account/
│   │       │                           ├── AccountManager.java
│   │       │                           └── bean/
│   │       │                               ├── AccountBean.java
│   │       │                               └── AccountCallBackBean.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── bzai/
│   │                       └── gamesdk/
│   │                           └── module/
│   │                               └── account/
│   │                                   └── ExampleUnitTest.java
│   ├── GameSDK_Module_Init/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── androidTest/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── bzai/
│   │       │               └── gamesdk/
│   │       │                   └── module/
│   │       │                       └── init/
│   │       │                           └── ExampleInstrumentedTest.java
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── bzai/
│   │       │               └── gamesdk/
│   │       │                   └── module/
│   │       │                       └── init/
│   │       │                           └── InitManager.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── bzai/
│   │                       └── gamesdk/
│   │                           └── module/
│   │                               └── init/
│   │                                   └── ExampleUnitTest.java
│   └── GameSDK_Module_Purchase/
│       ├── .gitignore
│       ├── build.gradle
│       ├── proguard-rules.pro
│       └── src/
│           ├── androidTest/
│           │   └── java/
│           │       └── com/
│           │           └── bzai/
│           │               └── gamesdk/
│           │                   └── module/
│           │                       └── purchase/
│           │                           └── ExampleInstrumentedTest.java
│           ├── main/
│           │   ├── AndroidManifest.xml
│           │   ├── java/
│           │   │   └── com/
│           │   │       └── bzai/
│           │   │           └── gamesdk/
│           │   │               └── module/
│           │   │                   └── purchase/
│           │   │                       ├── PurchaseManager.java
│           │   │                       └── PurchaseResult.java
│           │   └── res/
│           │       └── values/
│           │           └── strings.xml
│           └── test/
│               └── java/
│                   └── com/
│                       └── bzai/
│                           └── gamesdk/
│                               └── module/
│                                   └── purchase/
│                                       └── ExampleUnitTest.java
├── GameSDK_Manager_Impl/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── bzai/
│       │               └── gamesdk/
│       │                   └── manager/
│       │                       └── impl/
│       │                           └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── bzai/
│       │   │           └── gamesdk/
│       │   │               └── invoke/
│       │   │                   └── plugin/
│       │   │                       ├── AlipayPluginApi.java
│       │   │                       └── WechatPluginApi.java
│       │   └── res/
│       │       └── values/
│       │           └── strings.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── bzai/
│                       └── gamesdk/
│                           └── manager/
│                               └── impl/
│                                   └── ExampleUnitTest.java
├── GameSDK_Plugin/
│   ├── GameSDK_Plugin_Alipay/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── libs/
│   │   │   └── alipaySdk-20180601.jar
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── androidTest/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── bzai/
│   │       │               └── gamesdk/
│   │       │                   └── plugin/
│   │       │                       └── alipay/
│   │       │                           └── ExampleInstrumentedTest.java
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── bzai/
│   │       │   │           └── gamesdk/
│   │       │   │               └── plugin/
│   │       │   │                   └── alipay/
│   │       │   │                       ├── AlipayPlugin.java
│   │       │   │                       └── pay/
│   │       │   │                           ├── AlipayPay.java
│   │       │   │                           └── PayResult.java
│   │       │   └── res/
│   │       │       └── values/
│   │       │           └── strings.xml
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── bzai/
│   │                       └── gamesdk/
│   │                           └── plugin/
│   │                               └── alipay/
│   │                                   └── ExampleUnitTest.java
│   └── GameSDK_Plugin_Wechat/
│       ├── .gitignore
│       ├── build.gradle
│       ├── libs/
│       │   └── wechat-sdk-android-without-mta-5.1.4.jar
│       ├── proguard-rules.pro
│       └── src/
│           ├── androidTest/
│           │   └── java/
│           │       └── com/
│           │           └── bzai/
│           │               └── gamesdk/
│           │                   └── plugin/
│           │                       └── wechat/
│           │                           └── ExampleInstrumentedTest.java
│           ├── main/
│           │   ├── AndroidManifest.xml
│           │   └── java/
│           │       └── com/
│           │           └── bzai/
│           │               └── gamesdk/
│           │                   └── plugin/
│           │                       └── wechat/
│           │                           ├── WechatPlugin.java
│           │                           ├── login/
│           │                           │   └── WechatLogin.java
│           │                           └── pay/
│           │                               └── WechatPay.java
│           └── test/
│               └── java/
│                   └── com/
│                       └── bzai/
│                           └── gamesdk/
│                               └── plugin/
│                                   └── wechat/
│                                       └── ExampleUnitTest.java
├── GameSDK_Utils/
│   ├── .gitignore
│   ├── build.gradle
│   ├── libs/
│   │   ├── android-support-v4.jar
│   │   └── org.apache.http.legacy.jar
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── bzai/
│       │               └── gamesdk/
│       │                   └── utils/
│       │                       └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── bzai/
│       │               └── gamesdk/
│       │                   └── common/
│       │                       ├── utils_base/
│       │                       │   ├── cache/
│       │                       │   │   └── ApplicationCache.java
│       │                       │   ├── config/
│       │                       │   │   ├── ErrCode.java
│       │                       │   │   └── TypeConfig.java
│       │                       │   ├── frame/
│       │                       │   │   ├── google/
│       │                       │   │   │   ├── gson/
│       │                       │   │   │   │   ├── DefaultDateTypeAdapter.java
│       │                       │   │   │   │   ├── ExclusionStrategy.java
│       │                       │   │   │   │   ├── FieldAttributes.java
│       │                       │   │   │   │   ├── FieldNamingPolicy.java
│       │                       │   │   │   │   ├── FieldNamingStrategy.java
│       │                       │   │   │   │   ├── Gson.java
│       │                       │   │   │   │   ├── GsonBuilder.java
│       │                       │   │   │   │   ├── InstanceCreator.java
│       │                       │   │   │   │   ├── JsonArray.java
│       │                       │   │   │   │   ├── JsonDeserializationContext.java
│       │                       │   │   │   │   ├── JsonDeserializer.java
│       │                       │   │   │   │   ├── JsonElement.java
│       │                       │   │   │   │   ├── JsonIOException.java
│       │                       │   │   │   │   ├── JsonNull.java
│       │                       │   │   │   │   ├── JsonObject.java
│       │                       │   │   │   │   ├── JsonParseException.java
│       │                       │   │   │   │   ├── JsonParser.java
│       │                       │   │   │   │   ├── JsonPrimitive.java
│       │                       │   │   │   │   ├── JsonSerializationContext.java
│       │                       │   │   │   │   ├── JsonSerializer.java
│       │                       │   │   │   │   ├── JsonStreamParser.java
│       │                       │   │   │   │   ├── JsonSyntaxException.java
│       │                       │   │   │   │   ├── LongSerializationPolicy.java
│       │                       │   │   │   │   ├── TreeTypeAdapter.java
│       │                       │   │   │   │   ├── TypeAdapter.java
│       │                       │   │   │   │   ├── TypeAdapterFactory.java
│       │                       │   │   │   │   ├── annotations/
│       │                       │   │   │   │   │   ├── Expose.java
│       │                       │   │   │   │   │   ├── SerializedName.java
│       │                       │   │   │   │   │   ├── Since.java
│       │                       │   │   │   │   │   ├── Until.java
│       │                       │   │   │   │   │   └── package-info.java
│       │                       │   │   │   │   ├── internal/
│       │                       │   │   │   │   │   ├── $Gson$Preconditions.java
│       │                       │   │   │   │   │   ├── $Gson$Types.java
│       │                       │   │   │   │   │   ├── ConstructorConstructor.java
│       │                       │   │   │   │   │   ├── Excluder.java
│       │                       │   │   │   │   │   ├── JsonReaderInternalAccess.java
│       │                       │   │   │   │   │   ├── LazilyParsedNumber.java
│       │                       │   │   │   │   │   ├── ObjectConstructor.java
│       │                       │   │   │   │   │   ├── Primitives.java
│       │                       │   │   │   │   │   ├── Streams.java
│       │                       │   │   │   │   │   ├── StringMap.java
│       │                       │   │   │   │   │   ├── UnsafeAllocator.java
│       │                       │   │   │   │   │   ├── bind/
│       │                       │   │   │   │   │   │   ├── ArrayTypeAdapter.java
│       │                       │   │   │   │   │   │   ├── CollectionTypeAdapterFactory.java
│       │                       │   │   │   │   │   │   ├── DateTypeAdapter.java
│       │                       │   │   │   │   │   │   ├── JsonTreeReader.java
│       │                       │   │   │   │   │   │   ├── JsonTreeWriter.java
│       │                       │   │   │   │   │   │   ├── MapTypeAdapterFactory.java
│       │                       │   │   │   │   │   │   ├── ObjectTypeAdapter.java
│       │                       │   │   │   │   │   │   ├── ReflectiveTypeAdapterFactory.java
│       │                       │   │   │   │   │   │   ├── SqlDateTypeAdapter.java
│       │                       │   │   │   │   │   │   ├── TimeTypeAdapter.java
│       │                       │   │   │   │   │   │   ├── TypeAdapterRuntimeTypeWrapper.java
│       │                       │   │   │   │   │   │   └── TypeAdapters.java
│       │                       │   │   │   │   │   └── package-info.java
│       │                       │   │   │   │   ├── package-info.java
│       │                       │   │   │   │   ├── reflect/
│       │                       │   │   │   │   │   ├── TypeToken.java
│       │                       │   │   │   │   │   └── package-info.java
│       │                       │   │   │   │   └── stream/
│       │                       │   │   │   │       ├── JsonReader.java
│       │                       │   │   │   │       ├── JsonScope.java
│       │                       │   │   │   │       ├── JsonToken.java
│       │                       │   │   │   │       ├── JsonWriter.java
│       │                       │   │   │   │       ├── MalformedJsonException.java
│       │                       │   │   │   │       └── StringPool.java
│       │                       │   │   │   └── volley/
│       │                       │   │   │       ├── AuthFailureError.java
│       │                       │   │   │       ├── Cache.java
│       │                       │   │   │       ├── CacheDispatcher.java
│       │                       │   │   │       ├── DefaultRetryPolicy.java
│       │                       │   │   │       ├── ExecutorDelivery.java
│       │                       │   │   │       ├── InternalUtils.java
│       │                       │   │   │       ├── Network.java
│       │                       │   │   │       ├── NetworkDispatcher.java
│       │                       │   │   │       ├── NetworkError.java
│       │                       │   │   │       ├── NetworkResponse.java
│       │                       │   │   │       ├── NoConnectionError.java
│       │                       │   │   │       ├── ParseError.java
│       │                       │   │   │       ├── RedirectError.java
│       │                       │   │   │       ├── Request.java
│       │                       │   │   │       ├── RequestQueue.java
│       │                       │   │   │       ├── Response.java
│       │                       │   │   │       ├── ResponseDelivery.java
│       │                       │   │   │       ├── RetryPolicy.java
│       │                       │   │   │       ├── ServerError.java
│       │                       │   │   │       ├── TimeoutError.java
│       │                       │   │   │       ├── VolleyError.java
│       │                       │   │   │       ├── VolleyLog.java
│       │                       │   │   │       └── toolbox/
│       │                       │   │   │           ├── AndroidAuthenticator.java
│       │                       │   │   │           ├── Authenticator.java
│       │                       │   │   │           ├── BasicNetwork.java
│       │                       │   │   │           ├── ByteArrayPool.java
│       │                       │   │   │           ├── ClearCacheRequest.java
│       │                       │   │   │           ├── DiskBasedCache.java
│       │                       │   │   │           ├── HttpClientStack.java
│       │                       │   │   │           ├── HttpHeaderParser.java
│       │                       │   │   │           ├── HttpStack.java
│       │                       │   │   │           ├── HurlStack.java
│       │                       │   │   │           ├── ImageLoader.java
│       │                       │   │   │           ├── ImageRequest.java
│       │                       │   │   │           ├── JsonArrayRequest.java
│       │                       │   │   │           ├── JsonObjectRequest.java
│       │                       │   │   │           ├── JsonRequest.java
│       │                       │   │   │           ├── NetworkImageView.java
│       │                       │   │   │           ├── NoCache.java
│       │                       │   │   │           ├── PoolingByteArrayOutputStream.java
│       │                       │   │   │           ├── RequestFuture.java
│       │                       │   │   │           ├── StringRequest.java
│       │                       │   │   │           └── Volley.java
│       │                       │   │   ├── logger/
│       │                       │   │   │   ├── AndroidLogAdapter.java
│       │                       │   │   │   ├── CsvFormatStrategy.java
│       │                       │   │   │   ├── DiskLogAdapter.java
│       │                       │   │   │   ├── DiskLogStrategy.java
│       │                       │   │   │   ├── FormatStrategy.java
│       │                       │   │   │   ├── LogAdapter.java
│       │                       │   │   │   ├── LogStrategy.java
│       │                       │   │   │   ├── LogcatLogStrategy.java
│       │                       │   │   │   ├── Logger.java
│       │                       │   │   │   ├── LoggerPrinter.java
│       │                       │   │   │   ├── PrettyFormatStrategy.java
│       │                       │   │   │   ├── Printer.java
│       │                       │   │   │   └── Utils.java
│       │                       │   │   └── walle/
│       │                       │   │       ├── WalleChannelReader.java
│       │                       │   │       └── payload_reader/
│       │                       │   │           ├── ApkUtil.java
│       │                       │   │           ├── ChannelInfo.java
│       │                       │   │           ├── ChannelReader.java
│       │                       │   │           ├── Pair.java
│       │                       │   │           ├── PayloadReader.java
│       │                       │   │           └── SignatureNotFoundException.java
│       │                       │   ├── interfaces/
│       │                       │   │   ├── CallBackListener.java
│       │                       │   │   └── LifeCycleInterface.java
│       │                       │   ├── net/
│       │                       │   │   ├── RequestExecutor.java
│       │                       │   │   ├── base/
│       │                       │   │   │   ├── VolleyRequestWrapper.java
│       │                       │   │   │   ├── VolleyResponseListener.java
│       │                       │   │   │   └── VolleySingleton.java
│       │                       │   │   ├── impl/
│       │                       │   │   │   ├── BaseRequest.java
│       │                       │   │   │   ├── BaseRequestCallback.java
│       │                       │   │   │   ├── BaseRequestUtils.java
│       │                       │   │   │   └── bean/
│       │                       │   │   │       └── ResponseResult.java
│       │                       │   │   └── request/
│       │                       │   │       ├── IRequestManager.java
│       │                       │   │       ├── RequestCallback.java
│       │                       │   │       └── VolleyRequestManager.java
│       │                       │   ├── parse/
│       │                       │   │   ├── channel/
│       │                       │   │   │   ├── Channel.java
│       │                       │   │   │   ├── ChannelBeanList.java
│       │                       │   │   │   ├── ChannelListenerImpl.java
│       │                       │   │   │   └── ChannelManager.java
│       │                       │   │   ├── plugin/
│       │                       │   │   │   ├── Plugin.java
│       │                       │   │   │   ├── PluginBeanList.java
│       │                       │   │   │   ├── PluginManager.java
│       │                       │   │   │   └── PluginReflectApi.java
│       │                       │   │   └── project/
│       │                       │   │       ├── Project.java
│       │                       │   │       ├── ProjectBeanList.java
│       │                       │   │       └── ProjectManager.java
│       │                       │   ├── proguard/
│       │                       │   │   ├── ProguardInterface.java
│       │                       │   │   └── ProguardObject.java
│       │                       │   └── utils/
│       │                       │       ├── ArrayUtils.java
│       │                       │       ├── CodeUtils.java
│       │                       │       ├── ContextUtils.java
│       │                       │       ├── CryptUtils.java
│       │                       │       ├── DateUtils.java
│       │                       │       ├── FileUtils.java
│       │                       │       ├── IOUtils.java
│       │                       │       ├── JsonUtils.java
│       │                       │       ├── ListUtils.java
│       │                       │       ├── LogUtils.java
│       │                       │       ├── Md5Utils.java
│       │                       │       ├── ObjectUtils.java
│       │                       │       └── StringUtils.java
│       │                       ├── utils_business/
│       │                       │   ├── cache/
│       │                       │   │   ├── BaseCache.java
│       │                       │   │   ├── SDKInfoCache.java
│       │                       │   │   └── SharePreferencesCache.java
│       │                       │   └── config/
│       │                       │       ├── KeyConfig.java
│       │                       │       └── UrlConfig.java
│       │                       └── utils_ui/
│       │                           ├── BitmapUtils.java
│       │                           ├── LoadingUtils.java
│       │                           ├── ResourseIdUtils.java
│       │                           ├── ToastUtils.java
│       │                           └── activity/
│       │                               └── SplashActivity.java
│       └── test/
│           └── java/
│               └── com/
│                   └── bzai/
│                       └── gamesdk/
│                           └── utils/
│                               └── ExampleUnitTest.java
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── bzai/
│       │               └── gamesdkframe/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── bzai/
│       │   │           └── gamesdkframe/
│       │   │               ├── GameApplication.java
│       │   │               └── GameSDKMain.java
│       │   └── res/
│       │       ├── layout/
│       │       │   └── activity_main.xml
│       │       └── values/
│       │           ├── colors.xml
│       │           └── strings.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── bzai/
│                       └── gamesdkframe/
│                           └── ExampleUnitTest.java
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── 框架必读说明

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild


================================================
FILE: GameSDKBuildJarTool/.gitignore
================================================
/build


================================================
FILE: GameSDKBuildJarTool/build.gradle
================================================
apply plugin: 'java-library'
apply plugin: 'idea'

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile files('libs/proguard.jar')
}

//解决控件台中文乱码问题
tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn tasks.findByName('idea')
}

sourceSets {
    main {
        resources {
            srcDirs "src/main/resources"
        }
    }
}

sourceCompatibility = "1.7"
targetCompatibility = "1.7"



================================================
FILE: GameSDKBuildJarTool/src/main/cmd/test/java/HelloWorld.java
================================================
package com.bzai.demo;

public class HelloWorld {

    public static void main(String[] args){
        System.out.println("hello world");
        test();
    }

    public static void test(){
        TestA testA = new TestA();
        testA.Test();
    }
}


================================================
FILE: GameSDKBuildJarTool/src/main/cmd/test/java/TestA.java
================================================
package com.bzai.demo;

public class TestA {

    public String name = "asdfa";

    public void Test(){
        System.out.println("name:"+name);
    }

}


================================================
FILE: GameSDKBuildJarTool/src/main/cmd/test/proguard/proguard_config.pro
================================================

-dontskipnonpubliclibraryclassmembers
-dontshrink
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*,!code/allocation/variable
-dontusemixedcaseclassnames
-keepattributes SourceFile,LineNumberTable,*Annotation*,Signature,Deprecated,InnerClasses
-keepparameternames
-renamesourcefileattribute SourceFile
-verbose

-dontwarn android.support.v4.**

# Keep names - Native method names. Keep all native class/method names.
-keepclasseswithmembers,allowshrinking class * {
    native <methods>;
}







================================================
FILE: GameSDKBuildJarTool/src/main/cmd/test/proguard/tools/rt.jar
================================================
[File too large to display: 49.4 MB]

================================================
FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/BuildJarTask.java
================================================
package com.bzai.gamesdk.build;

import com.android.manifmerger.ManifestMerger2;
import com.android.manifmerger.MergingReport;
import com.android.manifmerger.XmlDocument;
import com.android.utils.StdLogger;
import com.bzai.gamesdk.build.bean.ErrorMsg;
import com.bzai.gamesdk.build.bean.Project;
import com.bzai.gamesdk.build.tools.JavaTool;
import com.bzai.gamesdk.build.tools.ProGuardTool;
import com.bzai.gamesdk.build.tools.ServerTool;
import com.bzai.gamesdk.build.utils.FileUtils;
import com.bzai.gamesdk.build.utils.Utils;

import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.StandardOpenOption;
import java.util.List;

/**
 * 混淆jarTask
 */
public class BuildJarTask implements Runnable{

    @Override
    public void run() {

        //创建输出路径
        String outputPath;
        try {

            Config.getInstance().loadConfig();
            outputPath = Config.getInstance().getOutPutPath();
            FileUtils.createDirectories(outputPath,true);

        }catch (Exception e){
            e.printStackTrace();
            return;
        }

        //同步资源
        List<Project> projectList;
        try {
            projectList = Config.getInstance().getProject();
            if (null == projectList || projectList.isEmpty()){
                System.out.println("project list is empty");
                return;
            }

            String workspacePath = outputPath + File.separator + "workspace";
            FileUtils.createDirectory(workspacePath);

            ServerTool.DownServerResource(projectList,workspacePath);

        }catch (Exception e){
            e.printStackTrace();
            return;
        }

        //buildJar
        String jarName = Config.getInstance().getJarName();
        String jarVersion = Config.getInstance().getJarVersion();
        String buildJar = jarName + "_" + jarVersion;

        String jarOutputPath = outputPath + File.separator + "jar_out";
        String jarFileOutputPath = jarOutputPath + File.separator + buildJar + ".jar";
        ErrorMsg errorMsg = buildJar(projectList, jarFileOutputPath);
        if (errorMsg.code != Utils.OK){
            System.out.println("Tips:" + errorMsg.getMessage() + "\n");
            errorMsg.e.printStackTrace();
            return;
        }


        //build resource file.
        String resourceOutputPath = outputPath + File.separator + "resource";
        try{
            FileUtils.createDirectory(resourceOutputPath);
            buildResourceFile(resourceOutputPath, projectList);
        }catch (Exception e){
            e.printStackTrace();
            return;
        }

        System.out.println("\n");
        System.out.println("SDK输出路径:" + jarFileOutputPath);
        System.out.println("资源文件输出路径:" + resourceOutputPath);

    }


    /**
     * 编译生成混淆jar包过程
     * @param projectList 工程配置
     * @param jarOutputPath jar包输出路径
     * @return
     */
    private ErrorMsg buildJar(List<Project> projectList, String jarOutputPath){

        File jarFile = new File(jarOutputPath);
        String outputPath = jarFile.getParent();

        //创建一个Temp工程
        Project tmpBuildProject = new Project();
        String projectName = "tmpBuildProject";
        String tmpBuildProjectPath = outputPath + File.separator + projectName;
        tmpBuildProject.setName(projectName);
        tmpBuildProject.setPath(tmpBuildProjectPath);

        //创建temp工程目录,Java 和 libs
        String projectSrcPath = tmpBuildProjectPath + File.separator + Project.JAVA_RELATIVE_PATH;
        try{
            FileUtils.createDirectoriesIfNonExists(outputPath);
            FileUtils.createDirectoriesIfNonExists(tmpBuildProjectPath);
            FileUtils.createDirectoriesIfNonExists(projectSrcPath);
        }catch (Exception e){
            return new ErrorMsg(Utils.ERROR, e.getMessage(), e);
        }

        //将各个项目的java文件下的源文件拷贝到 tmpBuildProject 的src文件下。
        try{
            for (Project project : projectList){
                String tmpProjectSrcPath = project.getPath() + File.separator + Project.JAVA_RELATIVE_PATH;
                if (FileUtils.exists(tmpProjectSrcPath)){
                    FileUtils.copy(tmpProjectSrcPath, projectSrcPath, false);
                }
            }
        }catch (Exception e){
            return new ErrorMsg(Utils.ERROR, e.getMessage(), e);
        }

        // .java and .jar compile to .class
        String classPath = getClasspath(tmpBuildProject,projectList);
        String classFilesOutputPath = tmpBuildProjectPath + File.separator + "classes";
        try {
            FileUtils.createDirectory(classFilesOutputPath);
            JavaTool.compile(projectSrcPath, classPath, classFilesOutputPath, null);

        }catch (Exception e){
            return new ErrorMsg(Utils.ERROR, "构建SDK-编译.java to .class出错", e);
        }

        // .class compile to .jar
        String noProguardJar = outputPath + File.separator + "no_proguard.jar";
        try{
            JavaTool.classFilesToJar(classFilesOutputPath, noProguardJar, null);
        }catch (Exception e){
            return new ErrorMsg(Utils.ERROR, "构建SDK-编译.class打包jar出错", e);
        }

        //proguard jar
        try{

            String mapping = outputPath + File.separator + "proguard_mapping.txt";
            String logging = outputPath + File.separator + "proguard_log.txt";
            String root_path = System.getProperty("user.dir");
            String proJarPath = root_path + File.separator + "GameSDKBuildJarTool" + File.separator + "libs"
                                + File.separator + "proguard.jar";
            String proguardConfigFilePath = Config.getInstance().get_config_file_path("proguard_config.pro");
            ProGuardTool.run(proJarPath, noProguardJar, classPath, proguardConfigFilePath, mapping, logging, jarOutputPath);

        }catch (Exception e){
            return new ErrorMsg(Utils.ERROR, "构建SDK-混淆jar出错", e);
        }

        return new ErrorMsg(Utils.OK, "ok");
    }

    /**
     * 合并工程资源文件过程
     * @param resourceOutputPath
     * @param projectList
     * @throws IOException
     * @throws InterruptedException
     * @throws ManifestMerger2.MergeFailureException
     */
    public void buildResourceFile(String resourceOutputPath, List<Project> projectList)
            throws IOException, InterruptedException, ManifestMerger2.MergeFailureException {

        /*copy libs,assets,res to library project*/
        String libsPath = resourceOutputPath + File.separator + Project.LIBS_FILE;
        String assetsPath = resourceOutputPath + File.separator + Project.ASSETS_FILE;
        final String resPath = resourceOutputPath + File.separator + Project.RES_FILE;
        String jniLibsFilePath = resourceOutputPath + File.separator + Project.JNI_LIBS_FILE;
        for (Project project : projectList){
            /*copy assets*/
            String projectAssetsPath = project.getPath() + File.separator + Project.ASSETS_RELATIVE_PATH;
            if (FileUtils.exists(projectAssetsPath)){
                FileUtils.createDirectoryIfNonExists(assetsPath);
                FileUtils.copy(projectAssetsPath, assetsPath, false);
            }

            /*copy jni libs*/
            String projectJniLibsPath = project.getPath() + File.separator + Project.JNI_LIBS_RELATIVE_PATH;
            if (FileUtils.exists(projectJniLibsPath)){
                FileUtils.createDirectoryIfNonExists(jniLibsFilePath);
                FileUtils.copy(projectJniLibsPath, jniLibsFilePath, false);
            }

            /*copy libs*/
            String projectLibsPath = project.getPath() + File.separator + Project.LIBS_RELATIVE_PATH;
            if (FileUtils.exists(projectLibsPath)){
                FileUtils.createDirectoryIfNonExists(libsPath);
                FileUtils.copy(projectLibsPath, libsPath, false);
            }

            /*copy res*/
            final String projectResPath = project.getPath() + File.separator + Project.RES_RELATIVE_PATH;
            if (FileUtils.exists(projectResPath)){
                FileUtils.createDirectoryIfNonExists(resPath);
                FileUtils.copy(projectResPath, resPath, false);
            }

            //manifest merge
            String projectManifestPath = project.getPath() + File.separator + Project.ANDROID_MANIFEST_RELATIVE_PATH;
            String mainManifestPath = resourceOutputPath + File.separator + Project.ANDROID_MANIFEST_FILE;
            if (!FileUtils.exists(mainManifestPath)){
                FileUtils.copy(projectManifestPath, mainManifestPath, true);
            }else{
                StdLogger stdLogger = new StdLogger(StdLogger.Level.ERROR);
                ManifestMerger2.Invoker manifestMerger = ManifestMerger2.newMerger(new File(mainManifestPath),
                        stdLogger, ManifestMerger2.MergeType.APPLICATION);
                manifestMerger.addLibraryManifest(new File(projectManifestPath));
                manifestMerger.withFeatures(ManifestMerger2.Invoker.Feature.REMOVE_TOOLS_DECLARATIONS);
                MergingReport mergingReport = manifestMerger.merge();
                XmlDocument xmlDocument = mergingReport.getMergedDocument().get();

                Files.write(FileSystems.getDefault().getPath(mainManifestPath),
                        xmlDocument.prettyPrint().getBytes("UTF-8"), StandardOpenOption.WRITE);
                switch (mergingReport.getResult()) {
                    case WARNING:
                        // fall through since these are just warnings.
                        mergingReport.log(stdLogger);
                        break;
                    case SUCCESS:
                        break;
                    case ERROR:
                        mergingReport.log(stdLogger);
                        throw new RuntimeException(mergingReport.getReportString());
                    default:
                        throw new RuntimeException("Unhandled result type : "
                                + mergingReport.getResult());
                }
            }
        }

//        /*如果jar文件中存在assets资源文件,需要jar中的将assets文件提取出来*/
//        List<String> jarFileList = FileUtils.getFileList(libsPath, ".jar");
//        for (String jarFilePath : jarFileList){
//            File jarFile = new File(jarFilePath);
//            String unzipToFilePath = libsPath +File.separator
//                    + jarFile.getName().substring(0, jarFile.getName().lastIndexOf("."));
//            Utils.jarFileUnzip(jarFilePath, unzipToFilePath);
//            String assetsFilePath = unzipToFilePath + File.separator + Project.ASSETS_FILE;
//            if (FileUtils.exists(assetsFilePath)){
//                String outputPathAssetsPath = resourceOutputPath + File.separator + Project.ASSETS_FILE;
//                FileUtils.createDirectoryIfNonExists(outputPathAssetsPath);
//                FileUtils.move(assetsFilePath, outputPathAssetsPath, false);
//
//                /*删除原来的jar,重新压缩一个删除assets的jar文件*/
//                FileUtils.delete(jarFilePath);
//                JavaTool.classFilesToJar(unzipToFilePath, jarFilePath, null);
//
//                FileUtils.delete(unzipToFilePath);
//            }else{
//                FileUtils.delete(unzipToFilePath);
//            }
//        }
    }

    private String getClasspath(Project project, List<Project> projectList){

        String classpath = "";

        //获取工程jar路径
        for (Project dependProject : projectList){
            String projectPath = dependProject.getPath();
            String projectLibsPath = projectPath + File.separator + Project.LIBS_RELATIVE_PATH;
            if (FileUtils.exists(projectLibsPath)){
                String jarPathSet = Utils.getJarPathSet(projectLibsPath,Utils.OS_SEMICOLON);
                if (!Utils.isEmpty(jarPathSet)){
                    if (!Utils.isEmpty(classpath)){
                        classpath = classpath + Utils.OS_SEMICOLON;
                    }
                    classpath = classpath + jarPathSet;
                }
            }
        }

        //获取工程源码路径
        String projectJavaPath = project.getPath() + File.separator + Project.JAVA_RELATIVE_PATH;
        if (FileUtils.exists(projectJavaPath)){
            if (!Utils.isEmpty(classpath)){
                classpath = classpath + Utils.OS_SEMICOLON;
            }
            classpath = classpath + projectJavaPath;
        }

        //获取SDK版本 android.jar 路径
        if (!Utils.isEmpty(classpath)){
            classpath = classpath + Utils.OS_SEMICOLON;
        }
        classpath = classpath + getMinSdkVersionPath();
        return classpath;
    }

    /**
     * 获取Android sdk jar的存放路径
     *
     * @return
     */
    private String getMinSdkVersionPath(){
        String androidSDKPath = Config.getInstance().getAndroidSdkPath();
        String androidJarPath = androidSDKPath + File.separator +"platforms"
                + File.separator+ Config.getInstance().getTargetSdkVersion()+File.separator+"android.jar";
        return androidJarPath;
    }
}


================================================
FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/Config.java
================================================
package com.bzai.gamesdk.build;

import com.bzai.gamesdk.build.bean.Project;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Set;

/**
 * 配置文件
 */
public class Config {

    /**
     * android SDK 路径
     */
    public String androidSdkPath;

    /**
     * android target 版本
     */
    public String targetSdkVersion;

    /**
     * 输出jar包的名称
     */
    public String jarName;

    /**
     * 输出jar包的版本号
     */
    public String jarVersion;

    /**
     * 输出jar的路径
     */
    public String outPutPath;

    private static Config mConfig;
    private static byte[] syncObj = new byte[0];

    private Config(){
    }

    public static Config getInstance(){
        if (null == mConfig){
            synchronized (syncObj){
                if (null == mConfig){
                    mConfig = new Config();
                }
            }
        }
        return mConfig;
    }

    /**
     * 加载配置文件
     */
    public void loadConfig() throws IOException{

          //这段代码在IDEA中可以正常读取到
//        Properties properties = new Properties();
//        URL url = ClassLoader.getSystemClassLoader().getResource("config");
//        properties.load(new FileInputStream(url.getFile()));

        String config_path = get_config_file_path("config");
        Properties properties = new Properties();
        properties.load(new FileInputStream(config_path));

        androidSdkPath = properties.getProperty("androidSdkPath");
        targetSdkVersion = properties.getProperty("targetSdkVersion");
        jarName = properties.getProperty("jarName");
        jarVersion = properties.getProperty("jarVersion");
        outPutPath = properties.getProperty("outPutPath");
    }

    /**
     * 解析配置文件的工程配置
     * @return
     * @throws IOException
     */
    public List<Project> getProject() throws IOException{

//        Properties properties = new Properties();
//        URL url = ClassLoader.getSystemClassLoader().getResource("project_list");
//        properties.load(new FileInputStream(url.getFile()));

        String config_path = get_config_file_path("project_list");
        Properties properties = new Properties();
        properties.load(new FileInputStream(config_path));

        List<Project> projectList = new ArrayList<>();
        Set<Object> keySet = properties.keySet();
        for (Object key : keySet){
            String keyStr = (String) key;
            String value = properties.getProperty(keyStr);
            value = value.replaceAll(" ","");
            String[] valueList = value.split(",");
            int revision = 0;
            if (valueList[0].matches("[0-9]*")){
                revision = Integer.parseInt(valueList[0]);
            }
            Project project = new Project();
            project.setVersion(revision);
            project.setName(keyStr);
            project.setUrl(valueList[1]);
            projectList.add(project);
        }
        return projectList;
    }

    public String get_config_file_path(String file_name){

        //在AndroidStudio中用绝对路径读取
        //但是要在Run/Debug configurations 配置Working directory工作目录路径
        String root_path = System.getProperty("user.dir");
        String file_path = root_path + File.separator + "GameSDKBuildJarTool" +
                File.separator + "src"  + File.separator + "main" +
                File.separator + "resources"  + File.separator + file_name;
//        System.out.println(file_path);
        return file_path;
    }

    public String getAndroidSdkPath() {
        return androidSdkPath;
    }

    public void setAndroidSdkPath(String androidSdkPath) {
        this.androidSdkPath = androidSdkPath;
    }

    public String getTargetSdkVersion() {
        return targetSdkVersion;
    }

    public void setTargetSdkVersion(String targetSdkVersion) {
        this.targetSdkVersion = targetSdkVersion;
    }

    public String getJarName() {
        return jarName;
    }

    public void setJarName(String jarName) {
        this.jarName = jarName;
    }

    public String getJarVersion() {
        return jarVersion;
    }

    public void setJarVersion(String jarVersion) {
        this.jarVersion = jarVersion;
    }

    public String getOutPutPath() {
        return outPutPath;
    }

    public void setOutPutPath(String outPutPath) {
        this.outPutPath = outPutPath;
    }
}


================================================
FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/Main.java
================================================
package com.bzai.gamesdk.build;

public class Main {

    public static void main(String[] args){
        new Thread(new BuildJarTask()).start();
    }
}


================================================
FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/bean/ErrorMsg.java
================================================
package com.bzai.gamesdk.build.bean;

/**
 * 描述打包结果
 */
public class ErrorMsg {

    public int code;
    public String message;
    public Exception e;

    public ErrorMsg(int code, String message){
        this.code = code;
        this.message = message;
    }

    public ErrorMsg(int code, String message, Exception e){
        this.code = code;
        this.message = message;
        this.e = e;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}


================================================
FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/bean/Project.java
================================================
package com.bzai.gamesdk.build.bean;

import java.io.File;

/**
 * Project 配置类
 */
public class Project {

    /**
     * 源码相对于项目所在路径。
     */
    public static final String JAVA_RELATIVE_PATH = "src" + File.separator
            + "main" + File.separator + "java";

    /**
     * res资源文件相对于项目所在路径。
     */
    public static final String RES_RELATIVE_PATH = "src" + File.separator
            + "main" + File.separator + "res";

    /**
     * assets文件相对于项目所在路径。
     */
    public static final String ASSETS_RELATIVE_PATH = "src" + File.separator
            + "main" + File.separator + "assets";

    /**
     * libs相对于项目所在路径。
     */
    public static final String LIBS_RELATIVE_PATH = "libs";

    /**
     * Android manifest相对于项目所在路径。
     */
    public static final String ANDROID_MANIFEST_RELATIVE_PATH = "src" + File.separator
            + "main" + File.separator + "AndroidManifest.xml";

    /**
     * jni libs相对于项目所在路径。
     */
    public static final String JNI_LIBS_RELATIVE_PATH = "src" + File.separator
            + "main" + File.separator + "jniLibs";

    /**
     * jni libs相对于项目所在路径。
     */
    public static final String MAIN_FILE_RELATIVE_PATH = "src" + File.separator + "main";

    /**
     * unknown文件相对于项目所在路径。
     */
    public static final String UNKNOWN_FILE_RELATIVE_PATH = "src" + File.separator
            + "main" + File.separator + "unknown";

    /**
     * project src file name.
     */
    public static final String SRC_FILE = "src";

    /**
     * project assets file name.
     */
    public static final String ASSETS_FILE = "assets";

    /**
     * project res file name.
     */
    public static final String RES_FILE = "res";

    /**
     * project libs file name.
     */
    public static final String LIBS_FILE = "libs";

    /**
     * project libs file name.
     */
    public static final String JNI_LIBS_FILE = "jniLibs";

    /**
     * project unknown file name.
     */
    public static final String UNKNOWN_FILE = "unknown";

    /**
     * app file name.
     */
    public static final String APP_FILE = "app";

    /**
     * project android manifest file name.
     */
    public static final String ANDROID_MANIFEST_FILE = "AndroidManifest.xml";

    /**
     * 项目名称
     */
    public String name;

    /**
     * 打包路径
     */
    public String path;

    /**
     * 服务器版本
     */
    public int version;

    /**
     * 服务器地址
     */
    public String url;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public int getVersion() {
        return version;
    }

    public void setVersion(int version) {
        this.version = version;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}


================================================
FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/tools/JavaTool.java
================================================
package com.bzai.gamesdk.build.tools;

import com.bzai.gamesdk.build.tools.exec.Shell;
import com.bzai.gamesdk.build.utils.Utils;

import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class JavaTool {


    public static void compile(String sourceCodePath, String classPath, String classFileOutputPath,
                               String logOutputPath) throws Exception{

        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

        Path source = FileSystems.getDefault().getPath(sourceCodePath);
        final List<String> javaFilePathList = new ArrayList<>();
        Files.walkFileTree(source, new SimpleFileVisitor<Path>(){

            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                if (file.toString().endsWith(".java")){
                    javaFilePathList.add(file.toAbsolutePath().toString());

                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
                return FileVisitResult.CONTINUE;
            }
        });

        //编译日志输出到文件
        FileWriter fileWriter = null;
        StandardJavaFileManager standardJavaFileManager = null;
        boolean compileSucceed = true;
        try {

            if (!Utils.isEmpty(logOutputPath)){
                fileWriter = new FileWriter(logOutputPath,true);
            }

            /**
             * encoding    编译编码
             * jars        需要加载的jar,-classpath选项就是定义class文件的查找目录
             * sourceDir   java源文件存放目录
             * Iterable<String> options = Arrays.asList("-encoding", encoding, "-classpath", jars, "-d", targetDir, "-sourcepath", sourceDir);
             */

            List<String> optionList = new ArrayList<>();
            optionList.addAll(Arrays.asList("-classpath",classPath));
            optionList.addAll(Arrays.asList("-d",classFileOutputPath));
            standardJavaFileManager = compiler.getStandardFileManager(null,null,null);
            Iterable fileObjects = standardJavaFileManager.getJavaFileObjectsFromStrings(javaFilePathList);

            JavaCompiler.CompilationTask compilationTask = compiler.getTask(fileWriter,null,null,optionList,null,fileObjects);
            compileSucceed = compilationTask.call();

        }catch (Exception e){
            e.printStackTrace();

        }finally {
            if (null != fileWriter){
                fileWriter.close();
            }
            if (null != standardJavaFileManager){
                standardJavaFileManager.close();
            }
        }

        if (!compileSucceed){//编译失败
            throw new Exception("Compile .java to .class failed");
        }
    }

    /**
     *
     * 类文件打为jar包。
     *
     * @param classFilesPath
     * @param jarOutputPath
     */
    public static void classFilesToJar(String classFilesPath, String jarOutputPath, String logOutputPath) throws Exception{

        List<String> arguments = new ArrayList<String>();
        arguments.add("jar");
        arguments.add("cvf");
        arguments.add(jarOutputPath);
        arguments.add("-C");
        arguments.add(classFilesPath);
        arguments.add(".");
        Shell.execute(arguments, logOutputPath);
    }
}


================================================
FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/tools/ProGuardTool.java
================================================
package com.bzai.gamesdk.build.tools;

import com.bzai.gamesdk.build.tools.exec.Shell;
import proguard.Configuration;
import proguard.ConfigurationParser;
import proguard.ProGuard;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by bzai on 2018/04/20.
 */
public class ProGuardTool {

    /**
     * 混淆jar文件
     *
     * @param inputJar 需要混淆的jar。
     * @param classPath 需要混淆的jar所引用的class path.
     * @param proguardConfigFilePath 混淆配置文件路径。
     * @param mappingFileOutputPath mapping 文件输出路径。
     * @param outputJar 混淆之后的jar的输出路径。
     */
    public static void run(String inputJar, String classPath, String proguardConfigFilePath,
                           String mappingFileOutputPath, String outputJar)  {
        String[] commandLineArgs = new String[9];
        commandLineArgs[0] = "@"+proguardConfigFilePath;
        commandLineArgs[1] = "-injars";
        commandLineArgs[2] = inputJar;
        commandLineArgs[3] = "-outjars";
        commandLineArgs[4] = outputJar;
        commandLineArgs[5] = "-printmapping";
        commandLineArgs[6] = mappingFileOutputPath;
        commandLineArgs[7] = "-libraryjars";
        commandLineArgs[8] = classPath;
        Configuration var1 = new Configuration();
        for (int i=0;i<commandLineArgs.length;i++){
            System.out.printf(commandLineArgs[i]);
        }

        try {
            ConfigurationParser var2 = new ConfigurationParser(commandLineArgs, System.getProperties());
            try {
                var2.parse(var1);
            } finally {
                var2.close();
            }
            (new ProGuard(var1)).execute();
        } catch (Exception var7) {
            if(var1.verbose) {
                var7.printStackTrace();
            } else {
                System.err.println("Error: " + var7.getMessage());
            }
        }
    }

    /**
     * 混淆jar文件
     *
     * @param proguardToolPath 混淆工具的路径。
     * @param inputJar 需要混淆的jar。
     * @param classPath 需要混淆的jar所引用的class path.
     * @param proguardConfigFilePath 混淆配置文件路径。
     * @param mappingFileOutputPath mapping 文件输出路径。
     * @param proguardLogOutputPath 混淆日志输出文件。
     * @param outputJar 混淆之后的jar的输出路径。
     *
     * @throws Exception
     */
    public static void run(String proguardToolPath, String inputJar, String classPath, String proguardConfigFilePath,
                           String mappingFileOutputPath, String proguardLogOutputPath, String outputJar) throws Exception {
        List<String> commandLineArgs = new ArrayList<String>();
        commandLineArgs.add("java");
        commandLineArgs.add("-jar");
        commandLineArgs.add(proguardToolPath);
        commandLineArgs.add("-injars");
        commandLineArgs.add(inputJar);
        commandLineArgs.add("-outjars");
        commandLineArgs.add(outputJar);
        commandLineArgs.add("-printmapping");
        commandLineArgs.add(mappingFileOutputPath);
        commandLineArgs.add("@"+proguardConfigFilePath);
        commandLineArgs.add("-libraryjars");
        commandLineArgs.add(classPath);
        Shell.execute(commandLineArgs, proguardLogOutputPath);
    }

}


================================================
FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/tools/ServerTool.java
================================================
package com.bzai.gamesdk.build.tools;

import com.bzai.gamesdk.build.bean.Project;
import com.bzai.gamesdk.build.utils.FileUtils;

import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.util.Iterator;
import java.util.List;

/**
 * 模拟服务器同步过程
 * 一般项目代码都是放到svn或者git上托管的,模拟服务器存储地址
 */
public class ServerTool {

    public static void DownServerResource(List<Project> projectList, String checkoutDir) throws IOException{

        String root_path = System.getProperty("user.dir");
        Iterator<Project> iterator = projectList.iterator();
        while (iterator.hasNext()){
            Project project = iterator.next();

            // 获取源码目录
            String projectName = project.getName();
            String projectUrl = project.getUrl();
            String projectResource = root_path + File.separator + projectUrl;
//            System.out.println(projectResource);

            // 工作目录
            String destPath = checkoutDir + File.separator + projectName ;
            Path destDirPath = FileSystems.getDefault().getPath(destPath);
//            System.out.println(destDirPath);

            boolean destDirPathExists = Files.exists(destDirPath, new LinkOption[]{LinkOption.NOFOLLOW_LINKS});
            if (destDirPathExists){
                FileUtils.delete(destPath);
            }

            FileUtils.copy(projectResource,destPath,false);

            //设置本地存放路径
            project.setPath(destPath);
        }

    }
}


================================================
FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/tools/exec/Shell.java
================================================
package com.bzai.gamesdk.build.tools.exec;

import com.bzai.gamesdk.build.utils.Utils;

import java.io.*;
import java.util.List;

public class Shell {

    public static void execute(List<String> commandSet, String logOutput) throws Exception{

        Process ps = null;
        int exitValue = -99;
        ProcessBuilder builder = new ProcessBuilder(commandSet);
        ps = builder.start();

        OutputStreamWriter outputStreamWriter = null;
        if (!Utils.isEmpty(logOutput)) {
            outputStreamWriter = new OutputStreamWriter(new FileOutputStream(logOutput, true));
            StreamForwarder errorStream = new StreamForwarder(ps.getErrorStream(), outputStreamWriter, 1, "ERROR");
            StreamForwarder outputStream = new StreamForwarder(ps.getInputStream(), outputStreamWriter, 1, "OUTPUT");
            errorStream.start();
            outputStream.start();
        }else{
            outputStreamWriter = new OutputStreamWriter(System.out);
            StreamForwarder errorStream = new StreamForwarder(ps.getErrorStream(), outputStreamWriter, 2, "ERROR");
            StreamForwarder outputStream = new StreamForwarder(ps.getInputStream(), outputStreamWriter, 2, "OUTPUT");
            errorStream.start();
            outputStream.start();
        }

        exitValue = ps.waitFor();
        ps.destroy();
        if (exitValue != 0){
            String inputCommandLine = "";
            for (String option:commandSet){
                if (!Utils.isEmpty(inputCommandLine)){
                    inputCommandLine = inputCommandLine + " ";
                }
                inputCommandLine = inputCommandLine + option;
            }
            throw new Exception("Could not exec command line ["+inputCommandLine+"]");
        }
    }


    static class StreamForwarder extends Thread{

        private final InputStream mIn;
        private final String mType;
        private int mStreamType;
        private final OutputStreamWriter mOs;

        StreamForwarder(InputStream is, OutputStreamWriter os, int streamType, String type) {
            mIn = is;
            mType = type;
            mOs = os;
            mStreamType = streamType;
        }

        @Override
        public void run() {
            BufferedWriter bw = null;
            BufferedReader br = null;

            try {
                bw = new BufferedWriter(mOs);
                br = new BufferedReader(new InputStreamReader(mIn));
                String line;
                while ((line = br.readLine()) != null) {
                    if (mType.equals("OUTPUT")) {
                        bw.write(line+"\n");
                    } else {
                        bw.write(line+"\n");
                    }
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }finally {
                try{
                    //使用的是文件流,需要将流关闭。
                    if (1 == mStreamType){
                        if (br != null) {
                            br.close();
                        }
                        if (null != bw){
                            bw.close();
                        }
                    }
                }catch (IOException e){
                }
            }
        }
    }
}


================================================
FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/utils/FileUtils.java
================================================
package com.bzai.gamesdk.build.utils;

import java.io.File;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.List;

/**
 * 操作文件类
 */
public class FileUtils {


    private static final String TAG = "FileUtils";

    public static void fileCopy(String srcPath, String destPath, boolean isReplaceExisting) throws IOException {
        Path source = FileSystems.getDefault().getPath(srcPath);
        Path destination = FileSystems.getDefault().getPath(destPath);
        if (exists(destPath)){
            if (isReplaceExisting){
                Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING);
            }
        }else{
            Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING);
        }
    }

    /**
     * smali file copy.
     *
     * @param sourcePath
     * @param destPath
     * @param filePathList
     *      如果需要拷贝的文件和 filePathList 文件列表路径下的某个文件的有重复的话,
     *      拷贝时直接拷贝覆盖 filePathList 文件列表路径下已经存在的文件。
     * @throws IOException
     */
    public static void smaliFileCopy(final String appFirstSmaliPath, final String sourcePath, final String destPath,
                                     final List<String> filePathList, final List<String> putToMainDexClassList) throws IOException {
        final Path source = FileSystems.getDefault().getPath(sourcePath);
        final Path destination = FileSystems.getDefault().getPath(destPath);
        Files.walkFileTree(source, new SimpleFileVisitor<Path>(){

            @Override
            public FileVisitResult preVisitDirectory(Path preVisitDirectoryPath,
                                                     BasicFileAttributes attrs) throws IOException {
                Path relativePath = source.relativize(preVisitDirectoryPath);
                String destPathStr = destination +File.separator +relativePath;
                Path destPath = FileSystems.getDefault().getPath(destPathStr);
                boolean pathExists =
                        Files.exists(destPath,
                                new LinkOption[]{ LinkOption.NOFOLLOW_LINKS});
                if (!pathExists){
                    Files.createDirectory(destPath);
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file,
                                             BasicFileAttributes attrs) throws IOException {
                Path relativePath = source.relativize(file);
                String destPathStr = destination +File.separator +relativePath;
                Path destPath = FileSystems.getDefault().getPath(destPathStr);

                if (null != putToMainDexClassList && !putToMainDexClassList.isEmpty()){
                    for (String classPath : putToMainDexClassList){
                        String putMainDexSmaliPath = sourcePath + File.separator + classPath + ".smali";
                        String appPutMainDexSmaliPath = appFirstSmaliPath + File.separator + classPath + ".smali";
                        if(relativePath.toString().equals(classPath + ".smali")){
                            FileUtils.createFile(appPutMainDexSmaliPath, false);
                            FileUtils.copy(putMainDexSmaliPath, appPutMainDexSmaliPath, true);
                            return FileVisitResult.CONTINUE;
                        }
                    }
                }

                boolean isExists = false;
                if (null != filePathList){
                    for (String filePath : filePathList){
                        String destFilePath = filePath.toString() +
                                File.separator + relativePath.toString();
                        if (FileUtils.exists(destFilePath)){
                            isExists = true;
                            Files.copy(file, FileSystems.getDefault().getPath(destFilePath),
                                    StandardCopyOption.REPLACE_EXISTING);
                            break;
                        }
                    }
                }
                if (!isExists){
                    Files.copy(file, destPath, StandardCopyOption.REPLACE_EXISTING);
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc)
                    throws IOException {
                if (null != exc){
                    exc.printStackTrace();
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir,
                                                      IOException exc) throws IOException {
                return FileVisitResult.CONTINUE;
            }

        });
    }

    /**
     * file copy
     *
     * @param srcPath
     * @param destPath
     * @param isReplaceExisting 如果文件存在是否替换
     * @throws IOException
     */
    public static void copy(final String srcPath,final String destPath, final boolean isReplaceExisting) throws IOException {
        final Path source = FileSystems.getDefault().getPath(srcPath);
        final Path destination = FileSystems.getDefault().getPath(destPath);
        Files.walkFileTree(source, new SimpleFileVisitor<Path>(){

            @Override
            public FileVisitResult preVisitDirectory(Path srcdir,
                                                     BasicFileAttributes attrs) throws IOException {
                Path relativizePath = source.relativize(srcdir);
                String destPathStr = destination +File.separator +relativizePath;
                Path destPath = FileSystems.getDefault().getPath(destPathStr);
                boolean pathExists =
                        Files.exists(destPath,
                                new LinkOption[]{ LinkOption.NOFOLLOW_LINKS});
                if (!pathExists){
                    Files.createDirectory(destPath);
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file,
                                             BasicFileAttributes attrs) throws IOException {
                Path relativizePath = source.relativize(file);
                String destPathStr = destination +File.separator +relativizePath;
                Path destPath = FileSystems.getDefault().getPath(destPathStr);
                boolean destPathExists = Files.exists(destPath, LinkOption.NOFOLLOW_LINKS);
                if (destPathExists && !isReplaceExisting){
                    return FileVisitResult.CONTINUE;
                }
                Files.copy(file, destPath, StandardCopyOption.REPLACE_EXISTING);
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc)
                    throws IOException {
                if (null != exc){
                    exc.printStackTrace();
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir,
                                                      IOException exc) throws IOException {
                return FileVisitResult.CONTINUE;
            }

        });
    }

    /**
     * get special type file list
     *
     * @param srcPath path
     * @param fileType file type
     * @return file path list
     * @throws IOException
     */
    public static List<String> getFileList(String srcPath, final String fileType) throws IOException {
        final Path source = FileSystems.getDefault().getPath(srcPath);
        final List<String> fileList = new ArrayList<String>();
        Files.walkFileTree(source, new SimpleFileVisitor<Path>(){

            @Override
            public FileVisitResult preVisitDirectory(Path srcdir,
                                                     BasicFileAttributes attrs) throws IOException {
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file,
                                             BasicFileAttributes attrs) throws IOException {
                if (file.toFile().getName().endsWith(fileType)){
                    fileList.add(file.toAbsolutePath().toString());
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc)
                    throws IOException {
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir,
                                                      IOException exc) throws IOException {
                return FileVisitResult.CONTINUE;
            }

        });
        return fileList;
    }

    /**
     * file copy
     *
     * @param srcPath source path
     * @param destPath destination path
     * @param copyFileType need to copy file type. example .txt or .png
     * @param isReplaceExisting Whether replace if exist.
     * @throws IOException
     */
    public static void copy(final String srcPath, final String destPath,
                            final String copyFileType, final  boolean isReplaceExisting) throws IOException {
        final Path source = FileSystems.getDefault().getPath(srcPath);
        final Path destination = FileSystems.getDefault().getPath(destPath);
        Files.walkFileTree(source, new SimpleFileVisitor<Path>(){

            @Override
            public FileVisitResult preVisitDirectory(Path srcdir,
                                                     BasicFileAttributes attrs) throws IOException {
                Path relativizePath = source.relativize(srcdir);
                String destPathStr = destination +File.separator +relativizePath;
                Path destPath = FileSystems.getDefault().getPath(destPathStr);
                boolean pathExists =
                        Files.exists(destPath,
                                new LinkOption[]{ LinkOption.NOFOLLOW_LINKS});
                if (!pathExists){
                    Files.copy(srcdir, destPath, StandardCopyOption.COPY_ATTRIBUTES);
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file,
                                             BasicFileAttributes attrs) throws IOException {
                Path relativizePath = source.relativize(file);
                String destPathStr = destination +File.separator +relativizePath;
                Path destPath = FileSystems.getDefault().getPath(destPathStr);
                boolean destPathExists = Files.exists(destPath, LinkOption.NOFOLLOW_LINKS);
                if (destPathExists && !isReplaceExisting){
                    return FileVisitResult.CONTINUE;
                }
                if (file.toFile().getName().endsWith(copyFileType)){
                    Files.copy(file, destPath, StandardCopyOption.REPLACE_EXISTING);
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc)
                    throws IOException {
                if (null != exc){
                    exc.printStackTrace();
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir,
                                                      IOException exc) throws IOException {
                return FileVisitResult.CONTINUE;
            }

        });
    }

    /**
     * file move
     *
     * @param srcPath
     * @param destPath
     * @throws IOException
     */
    public static void move(String srcPath, String destPath, final boolean isReplaceExisting) throws IOException {
        final Path source = FileSystems.getDefault().getPath(srcPath);
        final Path destination = FileSystems.getDefault().getPath(destPath);
        Files.walkFileTree(source, new SimpleFileVisitor<Path>(){

            @Override
            public FileVisitResult preVisitDirectory(Path srcdir,
                                                     BasicFileAttributes attrs) throws IOException {
                Path relativizePath = source.relativize(srcdir);
                String destPathStr = destination +File.separator +relativizePath;
                Path destPath = FileSystems.getDefault().getPath(destPathStr);
                boolean pathExists =
                        Files.exists(destPath,
                                new LinkOption[]{ LinkOption.NOFOLLOW_LINKS});
                if (!pathExists){
                    Files.copy(srcdir, destPath, StandardCopyOption.COPY_ATTRIBUTES);
                }else if(isReplaceExisting){
                    Files.copy(srcdir, destPath, StandardCopyOption.REPLACE_EXISTING);
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file,
                                             BasicFileAttributes attrs) throws IOException {
                Path relativizePath = source.relativize(file);
                String destPathStr = destination +File.separator +relativizePath;
                Path destPath = FileSystems.getDefault().getPath(destPathStr);
                Files.move(file, destPath, StandardCopyOption.REPLACE_EXISTING);
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc)
                    throws IOException {
                if (null != exc){
                    exc.printStackTrace();
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir,
                                                      IOException exc) throws IOException {
                Files.deleteIfExists(dir);
                return FileVisitResult.CONTINUE;
            }

        });
    }

    /**
     * Copy
     *
     * @param srcPath
     * @param destPath
     * @param isRenameExisting
     * @throws IOException
     */
    public static void copy(final String srcPath,final String destPath,
                            final boolean isRenameExisting, final String prefix) throws IOException {
        final Path source = FileSystems.getDefault().getPath(srcPath);
        final Path destination = FileSystems.getDefault().getPath(destPath);
        Files.walkFileTree(source, new SimpleFileVisitor<Path>(){

            @Override
            public FileVisitResult preVisitDirectory(Path srcdir,
                                                     BasicFileAttributes attrs) throws IOException {
                Path relativizePath = source.relativize(srcdir);
                String destPathStr = destination +File.separator +relativizePath;
                Path destPath = FileSystems.getDefault().getPath(destPathStr);
                boolean pathExists =
                        Files.exists(destPath,
                                new LinkOption[]{ LinkOption.NOFOLLOW_LINKS});
                if (!pathExists){
                    Files.createDirectory(destPath);
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file,
                                             BasicFileAttributes attrs) throws IOException {
                Path relativizePath = source.relativize(file);
                String destPathStr = destination +File.separator +relativizePath;
                Path destPath = FileSystems.getDefault().getPath(destPathStr);
                boolean destPathExists = Files.exists(destPath, LinkOption.NOFOLLOW_LINKS);
                if (destPathExists && isRenameExisting){
                    String fileName = destPath.toFile().getName();
                    String destPathParentPathStr = destPath.toFile().getParentFile().getAbsolutePath();
                    String newFileName = prefix + fileName;
                    String newFilePathStr = destPathParentPathStr + File.separator + newFileName;
                    while (FileUtils.exists(newFilePathStr)){
                        newFileName = prefix + newFileName;
                        newFilePathStr = destPathParentPathStr + File.separator + newFileName;
                    }
                    Files.copy(file, FileSystems.getDefault().getPath(newFilePathStr),
                            StandardCopyOption.COPY_ATTRIBUTES);
                }else{
                    Files.copy(file, destPath, StandardCopyOption.REPLACE_EXISTING);
                }

                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc)
                    throws IOException {
                if (null != exc){
                    exc.printStackTrace();
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir,
                                                      IOException exc) throws IOException {
                return FileVisitResult.CONTINUE;
            }

        });
    }

    /**
     * delete file.
     * path can be directory or file
     *
     * @param path
     * @throws IOException
     */
    public static void delete(String path) throws IOException {
        Path source = FileSystems.getDefault().getPath(path);
        Files.walkFileTree(source, new SimpleFileVisitor<Path>(){

            @Override
            public FileVisitResult preVisitDirectory(Path dir,
                                                     BasicFileAttributes attrs)
                    throws IOException {
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file,
                                             BasicFileAttributes attrs) throws IOException {
                Files.delete(file);
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc)
                    throws IOException {
                if (null != exc){
                    exc.printStackTrace();
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir,
                                                      IOException exc) throws IOException {
                Files.delete(dir);
                return FileVisitResult.CONTINUE;
            }

        });
        Files.deleteIfExists(source);
    }

    /**
     * delete child file.
     *
     * @param path
     * @throws IOException
     */
    public static void deleteChildFile(String path) throws IOException {
        File file = new File(path);
        File[] files = file.listFiles();
        for (File childFile : files){
            if (childFile.isDirectory()){
                delete(path);
            }else{
                Files.delete(FileSystems.getDefault().getPath(childFile.getAbsolutePath()));
            }
        }
    }

    /**
     * delete file.
     * path can be directory or file
     *
     * @param path
     * @throws IOException
     */
    public static void deleteIfExists(String path) throws IOException {
        Path source = FileSystems.getDefault().getPath(path);
        boolean pathExists = Files.exists(source,
                new LinkOption[]{ LinkOption.NOFOLLOW_LINKS});
        if (!pathExists){
            return;
        }
        Files.walkFileTree(source, new SimpleFileVisitor<Path>(){

            @Override
            public FileVisitResult preVisitDirectory(Path dir,
                                                     BasicFileAttributes attrs)
                    throws IOException {
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file,
                                             BasicFileAttributes attrs) throws IOException {
                Files.delete(file);
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc)
                    throws IOException {
                if (null != exc){
                    exc.printStackTrace();
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir,
                                                      IOException exc) throws IOException {
                Files.delete(dir);
                return FileVisitResult.CONTINUE;
            }
        });

        Files.deleteIfExists(source);
    }

    /**
     * whether file exists
     *
     * @param path
     * @return
     */
    public static boolean exists(String path){
        Path destPath = FileSystems.getDefault().getPath(path);
        return Files.exists(destPath,
                new LinkOption[]{ LinkOption.NOFOLLOW_LINKS});
    }

    /**
     * Create Directories
     *
     * @param path
     * @param isDeleteExists whether delete exits.
     * @throws IOException
     */
    public static void createDirectories(String path, boolean isDeleteExists) throws IOException {
        Path destPath = FileSystems.getDefault().getPath(path);
        boolean pathExists =
                Files.exists(destPath,
                        new LinkOption[]{ LinkOption.NOFOLLOW_LINKS});
        if (pathExists){
            if (isDeleteExists){
                delete(path);
            }else{
                return;
            }
        }
        Files.createDirectories(destPath);
    }

    public static List<String> getAllFilesRelativePath(String filePath){
        final List<String> relativizePathList = new ArrayList<String>();
        try {
            final Path sourceFilePath = FileSystems.getDefault().getPath(filePath);
            Files.walkFileTree(sourceFilePath, new SimpleFileVisitor<Path>(){

                @Override
                public FileVisitResult visitFile(Path file,
                                                 BasicFileAttributes attrs) throws IOException {
                    Path relativizePath = sourceFilePath.relativize(file);
                    relativizePathList.add(relativizePath.toString());
                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFileFailed(Path file, IOException exc)
                        throws IOException {
                    return FileVisitResult.CONTINUE;
                }

            });
        } catch (IOException e) {
            e.printStackTrace();
        }

        return relativizePathList;
    }

    /**
     * Create directory
     *
     * @param path path
     * @param isDeleteExists whether to delete if file exists.
     * @throws IOException
     */
    public static void createDirectory(String path, boolean isDeleteExists) throws IOException {
        Path destPath = FileSystems.getDefault().getPath(path);
        if (isDeleteExists){
            boolean pathExists =
                    Files.exists(destPath,
                            new LinkOption[]{ LinkOption.NOFOLLOW_LINKS});
            if (pathExists){
                delete(path);
            }
        }

        Files.createDirectory(destPath);
    }

    /**
     * Create directory
     *
     * @param path path
     * @throws IOException
     */
    public static void createDirectory(String path) throws IOException {
        Path destPath = FileSystems.getDefault().getPath(path);
        Files.createDirectory(destPath);
    }

    /**
     * Create directories
     *
     * @param path path
     * @throws IOException
     */
    public static void createDirectories(String path) throws IOException {
        Path destPath = FileSystems.getDefault().getPath(path);
        Files.createDirectories(destPath);
    }

    /**
     * create directory if non exists
     *
     * @param path
     * @throws IOException
     */
    public static void createDirectoriesIfNonExists(String path) throws IOException {
        Path destPath = FileSystems.getDefault().getPath(path);
        boolean pathExists =
                Files.exists(destPath,
                        new LinkOption[]{ LinkOption.NOFOLLOW_LINKS});
        if (pathExists){
            return;
        }
        Files.createDirectories(destPath);
    }

    /**
     * create directory if non exists
     *
     * @param path
     * @throws IOException
     */
    public static void createDirectoryIfNonExists(String path) throws IOException {
        Path destPath = FileSystems.getDefault().getPath(path);
        boolean pathExists =
                Files.exists(destPath,
                        new LinkOption[]{ LinkOption.NOFOLLOW_LINKS});
        if (pathExists){
            return;
        }
        Files.createDirectory(destPath);
    }

    /**
     * create file
     *
     * @param path file path
     * @param isDeleteIfExists Whether to delete file if exists
     * @throws IOException
     */
    public static void createFile(String path, boolean isDeleteIfExists) throws IOException {
        Path filePath =
                FileSystems.getDefault().getPath(path);
        boolean filePathExists = Files.exists(filePath,
                new LinkOption[]{LinkOption.NOFOLLOW_LINKS});
        if (filePathExists){
            if (isDeleteIfExists){
                delete(path);
            }else{
                return;
            }
        }
        File f = new File(path);
        FileUtils.createDirectoriesIfNonExists(f.getParentFile().getAbsolutePath());
        Files.createFile(filePath);
    }


}


================================================
FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/utils/Utils.java
================================================
package com.bzai.gamesdk.build.utils;

import java.io.File;

public class Utils {


    public static final int OK = 0;

    public static final int ERROR = 10001;

    private static String OS = System.getProperty("os.name").toLowerCase();


    /**
     * Linux 和 Windows分号分别使用的是":"和";"。
     */
    public static String OS_SEMICOLON = isWindows()?";":":";


    public static boolean isWindows() {
        return (OS.indexOf("win") >= 0);
    }

    public static boolean isEmpty(String str){
        if (null != str && !"".equals(str)){
            return false;
        }
        return true;
    }


    /**
     * Get jar file path list string, use the delimiter to splice.
     *
     * @param libsPath
     * @return
     */
    public static String getJarPathSet(String libsPath, String delimiter){

        File file = new File(libsPath);
        String jarPathSet = "";
        File[] files = file.listFiles();
        for (int i = 0; i < files.length ; i++) {
            File libFile = files[i];
            if (libFile.getName().endsWith(".jar")){
                if (!isEmpty(jarPathSet)){
                    jarPathSet = jarPathSet + delimiter;
                }
                jarPathSet = jarPathSet + libFile.getAbsolutePath();
            }
        }

        return jarPathSet;
    }
}


================================================
FILE: GameSDKBuildJarTool/src/main/resources/config
================================================


/**
* Android sdk 路径。
* 是否必须:必须。
*/
androidSdkPath=xxx


/**
* Android目标SDK版本。
* 是否必须:必须。
*/
targetSdkVersion=android-23


/**
*
* 输出Jar的名称
* 是否必须:必须
*/
jarName=sdk_lexiang


/**
* 输出Jar的版本号
* 是否必须:必须。
*/
jarVersion=v1.0.0


/**
* 输出路径。
* 是否必须:必须。
*/
outPutPath=D:\\BuildJar






================================================
FILE: GameSDKBuildJarTool/src/main/resources/proguard_config.pro
================================================

-dontskipnonpubliclibraryclassmembers
-dontshrink
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*,!code/allocation/variable
-dontusemixedcaseclassnames
-keepattributes SourceFile,LineNumberTable,*Annotation*,Signature,Deprecated,InnerClasses
-keepparameternames
-renamesourcefileattribute SourceFile
-verbose

-dontwarn android.support.v4.**

# Keep names - Native method names. Keep all native class/method names.
-keepclasseswithmembers,allowshrinking class * {
    native <methods>;
}

# Also keep - Serialization code. Keep all fields and methods that are used for
# serialization.
-keepclassmembers class * extends java.io.Serializable {
    static final long serialVersionUID;
    static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

#保持 Parcelable 不被混淆
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}


# 四大组件
-keep class * extends android.app.Activity {
    public protected <fields>;
    <methods>;
}
-keep class * extends android.app.Application {
    public protected <fields>;
    <methods>;
}
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver

# 对外接口不参与混淆
-keep class com.bzai.gamesdk.GameInfoSetting{ *; }
-keep class com.bzai.gamesdk.api.** { *; }
-keep class com.bzai.gamesdk.bean.** { *; }
-keep class com.bzai.gamesdk.listener.** { *; }
# SDK基础不混淆类
-keep class com.bzai.gamesdk.common.utils_base.proguard.** { *; }
-keep class * extends com.bzai.gamesdk.common.utils_base.proguard.** { *; }



================================================
FILE: GameSDKBuildJarTool/src/main/resources/project_list
================================================

###API接口层
GameSDK_API=head,GameSDK_API

###Project项目层
#GameSDK_Project_Custom=head,GameSDK_BeginProject\\GameSDK_Project_Custom
GameSDK_Project_JuHe=head,GameSDK_BeginProject\\GameSDK_Project_JuHe

###Channel渠道层
#GameSDK_Channel_Test=head,GameSDK_Channel\\GameSDK_Channel_Test
GameSDK_Channel_Lexiang=head,GameSDK_Channel\\GameSDK_Channel_Lexiang

###Manager逻辑控制层
GameSDK_Module_Init=head,GameSDK_Manager\\GameSDK_Module_Init
GameSDK_Module_Account=head,GameSDK_Manager\\GameSDK_Module_Account
GameSDK_Module_Purchase=head,GameSDK_Manager\\GameSDK_Module_Purchase

###Plugin功能插件层
GameSDK_Manager_Impl=head,GameSDK_Manager_Impl
GameSDK_Plugin_Alipay=head,GameSDK_Plugin\\GameSDK_Plugin_Alipay
GameSDK_Plugin_Wechat=head,GameSDK_Plugin\\GameSDK_Plugin_Wechat

###基础库
GameSDK_Utils=head,GameSDK_Utils







================================================
FILE: GameSDKBuildJarTool/必读说明
================================================

### 该GameSDKBuildJarTool 用于自动化混淆SDK源码工具,只需要配置config、proguard_config_pro、project_list相关配置就可以了。

cmd目录 为手动脚本运行Demo,配合博客来讲解自动化混淆的过程





================================================
FILE: GameSDKDemo_Release/.gitignore
================================================
/build


================================================
FILE: GameSDKDemo_Release/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "27.0.3"
    defaultConfig {
        applicationId "com.bzai.gamesdkframe.demo"
        minSdkVersion 14
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile project(':GameSDKLibrary_Release')
}


================================================
FILE: GameSDKDemo_Release/proguard-rules.pro
================================================
# 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


================================================
FILE: GameSDKDemo_Release/src/androidTest/java/com/bzai/gamesdkframe/ExampleInstrumentedTest.java
================================================
package com.bzai.gamesdkframe;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.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() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.bzai.gamesdkframe", appContext.getPackageName());
    }
}


================================================
FILE: GameSDKDemo_Release/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bzai.gamesdkframe.demo">

    <application
        android:name=".GameApplication"
        android:icon="@drawable/ic_launcher"
        android:theme="@android:style/Theme.Light"
        android:label="@string/app_name">
        <activity android:name=".GameSDKMain"
            android:configChanges="fontScale|orientation|keyboardHidden|locale|navigation|screenSize|uiMode"
            android:screenOrientation="sensorLandscape">
            <intent-filter>
                <action android:name="Bzai.MAIN" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>


        <activity android:name="com.bzai.gamesdk.common.utils_ui.activity.SplashActivity"
            android:screenOrientation="sensorLandscape"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            android:configChanges="orientation|screenSize|keyboardHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

        </activity>
    </application>

</manifest>

================================================
FILE: GameSDKDemo_Release/src/main/java/com/bzai/gamesdkframe/demo/GameApplication.java
================================================
package com.bzai.gamesdkframe.demo;

import android.content.Context;

import com.bzai.gamesdk.SDKApplication;


/**
 * Created by bzai on 2018/4/10.
 * <p>
 * Desc: 游戏的Application 直接继承SDK的application
 */

public class GameApplication extends SDKApplication {

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }
}


================================================
FILE: GameSDKDemo_Release/src/main/java/com/bzai/gamesdkframe/demo/GameSDKMain.java
================================================
package com.bzai.gamesdkframe.demo;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.bzai.gamesdk.GameInfoSetting;
import com.bzai.gamesdk.api.SDKAPI;
import com.bzai.gamesdk.bean.params.PayParams;
import com.bzai.gamesdk.listener.AccountCallBackLister;
import com.bzai.gamesdk.listener.ExitCallBackLister;
import com.bzai.gamesdk.listener.InitCallBackLister;
import com.bzai.gamesdk.listener.PurchaseCallBackListener;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.regex.Pattern;

public class GameSDKMain extends Activity implements View.OnClickListener{

    private String TAG = getClass().getName();
    private EditText etPay,etReport;
    private TextView tvLog;
    private int pri = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        init();
    }


    private void initView(){

        findViewById(R.id.btn_login).setOnClickListener(this);
        findViewById(R.id.btn_switchAccount).setOnClickListener(this);
        findViewById(R.id.btn_logout).setOnClickListener(this);
        findViewById(R.id.btn_pay).setOnClickListener(this);
        findViewById(R.id.btn_exit).setOnClickListener(this);

        etPay = (EditText) findViewById(R.id.et_inputPrice);
        tvLog = (TextView) findViewById(R.id.tvLog);
    }


    @Override
    public void onClick(View view) {
        int id = view.getId();
        switch (id) {
            case R.id.btn_login:
                login();
                break;
            case R.id.btn_switchAccount:
                switchAccount();
                break;
            case R.id.btn_logout:
                logout();
                break;
            case R.id.btn_pay:
                purchase();
                break;

            case R.id.btn_exit:
                exitGame();
                break;
            default:
                break;
        }
    }


    private AccountCallBackLister accountCallBackLister = new AccountCallBackLister() {

        @Override
        public void onAccountEventCallBack(String jsonStr) {
            tvLog.setText(jsonStr);
            showToast(jsonStr);

            //CP解析数据格式
            try {
                JSONObject jsonObject = new JSONObject(jsonStr);
                int code = jsonObject.getInt("eventType");

                if (code == AccountCallBackLister.LOGIN_SUCCESS ||
                        code == AccountCallBackLister.SWITCH_ACCOUNT_SUCCESS){

                }

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    };


    private void init() {

        //用于配置游戏的 gameid  和 gamekey
        String gameid = "1";
        String gamekey = "222";

        GameInfoSetting gameInfoSetting = new GameInfoSetting(gameid,gamekey);
        SDKAPI.getInstance().init(this, gameInfoSetting,accountCallBackLister, new InitCallBackLister() {

            @Override
            public void onSuccess() {
                tvLog.setText("初始化状态:初始化成功");
                showToast("初始化状态:初始化成功");
            }

            @Override
            public void onFailure(int code, String msg) {
                String message = "初始化状态"
                        +"\n错误码:\n" + code
                        +"\n错误信息:\n" + msg;
                tvLog.setText(message);
                showToast(message);
            }
        });
    }


    /**
     * 账号登陆
     */
    private void login() {
        SDKAPI.getInstance().login(this);
    }

    /**
     * 切换账号
     */
    private void switchAccount(){
        SDKAPI.getInstance().switchAccount(this);
    }

    /**
     * 账号登出
     */
    private void logout() {
        SDKAPI.getInstance().logout(this);
    }

    /**
     * 购买
     */
    private void purchase() {

        String pri_str = etPay.getText().toString();
        if (!isDecimal(pri_str) && !isInteger(pri_str)) {
            showToast("Please enter Correct values.");
            return;
        }

        try {
            pri = Integer.valueOf(pri_str);
        } catch (Exception e) {
            e.printStackTrace();
        }

        /**
         *  productId			商品ID
         *  productName			商品名称
         *  productDesc			商品描述
         *
         *  money				商品单价 (以分为单位)
         *
         *  roleID              当前游戏内角色ID
         *  roleName            当前游戏内角色名称
         *  roleLevel           玩家等级
         *  serverID            当前玩家所在的服务器ID
         *  serverName          当前玩家所在的服务器名称
         *
         *  notifyUrl           支付回调地址
         *  extraInfo			透传给 cp服务器的字段
         *  gorder              CP订单号
         */

        //商品信息
        PayParams payParams = new PayParams();
        payParams.setProductName("金币");
        payParams.setProductDesc("一金币等于十银币");
        payParams.setProductId("9000"); //SDK的商品ID

        //金额信息
        payParams.setMoney(pri);

        //玩家信息
        payParams.setRoleID("123456");
        payParams.setRoleName("小明");
        payParams.setRoleLevel("15");
        payParams.setServerID("11");
        payParams.setServerName("服务十一区");

        //支付配置信息
        payParams.setNotifyUrl("www.baidu.com");
        payParams.setExtension("extra");
        payParams.setGorder("DD123456");

        SDKAPI.getInstance().pay(this, payParams,new PurchaseCallBackListener() {

            //创建SDK订单成功就返回,方便CP查询该笔订单状态
            @Override
            public void onOrderId(String orderId) {
                showToast(orderId);
            }

            @Override
            public void onSuccess() {
                String message = "支付成功";
                tvLog.setText(message);
                showToast(message);
            }

            @Override
            public void onFailure(int code, String msg) {

                String message = "支付失败\n:\n错误:\n" + code;
                tvLog.setText(message);
                showToast(message);

            }

            @Override
            public void onCancel() {
                String message = "支付取消\n:\n错误:\n" ;
                tvLog.setText(message);
                showToast(message);
            }

            //支付完成,没有正确支付回调时,会返回该结果
            @Override
            public void onComplete() {
                String message = "支付完成\n" ;
                tvLog.setText(message);
                showToast(message);
            }

        });
    }



    //--------------------------------------------------退出接口---------------------------------------------

    private void exitGame(){

        SDKAPI.getInstance().exit(GameSDKMain.this,new ExitCallBackLister(){

            //存在退出框,并且点击退出成功
            @Override
            public void onExitDialogSuccess() {
                Log.d(TAG,"退出成功");
                SDKAPI.getInstance().onDestroy(GameSDKMain.this);
                System.exit(0);
            }

            //存在退出框,并且点击取消退出
            @Override
            public void onExitDialogCancel() {
                Log.d(TAG,"退出取消");
            }

            //不存在退出框,需要游戏自己实现退出框,然后调用SDK释放资源接口
            @Override
            public void onNotExitDialog() {

                AlertDialog.Builder builder = new AlertDialog.Builder(GameSDKMain.this);
                builder.setTitle("退出游戏");
                builder.setPositiveButton("退出", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        SDKAPI.getInstance().onDestroy(GameSDKMain.this);
                        System.exit(0);
                    }
                });
                builder.show();

            }
        });
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                exitGame();
                break;
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        exitGame();
    }

    private void showToast(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }

    // 浮点型判断 (Floating-point judgment)
    public static boolean isDecimal(String str) {
        if (str == null || "".equals(str))
            return false;
        java.util.regex.Pattern pattern = Pattern.compile("[0-9]*(\\.?)[0-9]*");
        return pattern.matcher(str).matches();
    }

    // 整型判断 (Integer to determine)
    public static boolean isInteger(String str) {
        if (str == null)
            return false;
        Pattern pattern = Pattern.compile("[0-9]+");
        return pattern.matcher(str).matches();
    }

    //--------------------------------------------------生命周期接口---------------------------------------------

    @Override
    protected void onStart() {
        super.onStart();
        SDKAPI.getInstance().onStart(GameSDKMain.this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        SDKAPI.getInstance().onResume(GameSDKMain.this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        SDKAPI.getInstance().onPause(GameSDKMain.this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        SDKAPI.getInstance().onStop(GameSDKMain.this);
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        SDKAPI.getInstance().onRestart(GameSDKMain.this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        SDKAPI.getInstance().onDestroy(GameSDKMain.this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        SDKAPI.getInstance().onNewIntent(GameSDKMain.this,intent);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        SDKAPI.getInstance().onActivityResult(GameSDKMain.this,requestCode,resultCode,data);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        SDKAPI.getInstance().onRequestPermissionsResult(GameSDKMain.this,requestCode, permissions, grantResults);
    }
}


================================================
FILE: GameSDKDemo_Release/src/main/res/layout/activity_main.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:paddingTop="10dp"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:paddingBottom="10dp"
    android:orientation="vertical">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <Button
                android:id="@+id/btn_login"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:text="登录" />

            <Button
                android:id="@+id/btn_switchAccount"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:layout_marginTop="3dp"
                android:text="切换账号" />

            <Button
                android:id="@+id/btn_logout"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:layout_marginTop="3dp"
                android:text="注销" />

            <EditText
                android:id="@+id/et_inputPrice"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:layout_marginTop="3dp"
                android:background="@android:drawable/edit_text"
                android:text="1"
                android:textColor="@color/colorPrimaryDark" />

            <Button
                android:id="@+id/btn_pay"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:text="支付" />

            <Button
                android:id="@+id/btn_exit"
                android:layout_width="200dp"
                android:layout_marginTop="3dp"
                android:layout_height="wrap_content"
                android:text="退出" />

        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <View
                android:layout_width="10dp"
                android:layout_height="match_parent"/>
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <TextView
                android:layout_marginTop="10dp"
                android:id="@+id/tvLog"
                android:hint="显示回调信息:"
                android:layout_width="match_parent"
                android:textColor="@color/black"
                android:layout_height="wrap_content" />
        </LinearLayout>

    </LinearLayout>

</ScrollView>


================================================
FILE: GameSDKDemo_Release/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FF4081</color>
    <color name="white">#FFFFFF</color>
    <color name="black">#000000</color>
</resources>


================================================
FILE: GameSDKDemo_Release/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">GameSDKFrameDemo</string>
</resources>


================================================
FILE: GameSDKDemo_Release/src/test/java/com/bzai/gamesdkframe/ExampleUnitTest.java
================================================
package com.bzai.gamesdkframe;

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() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

================================================
FILE: GameSDKLibrary_Release/.gitignore
================================================
/build


================================================
FILE: GameSDKLibrary_Release/build.gradle
================================================
apply plugin: 'com.android.library'

android {
    compileSdkVersion 27
    buildToolsVersion '27.0.3'
    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 27

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}


================================================
FILE: GameSDKLibrary_Release/proguard-rules.pro
================================================
# 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


================================================
FILE: GameSDKLibrary_Release/src/androidTest/java/com/suyutech/baselibrary/ExampleInstrumentedTest.java
================================================
package com.suyutech.baselibrary;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.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() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.suyutech.baselibrary.test", appContext.getPackageName());
    }
}


================================================
FILE: GameSDKLibrary_Release/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bzai.gamesdk.library" >

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

</manifest>



================================================
FILE: GameSDKLibrary_Release/src/main/assets/Channel_config.txt
================================================
{
    "channel": [
        {
            "channel_name": "channel",
            "class_name": "com.bzai.gamesdk.channel.test.TestChannelSDK",
            "description": "测试渠道SDK",
            "version": "1.0.0"
        }
    ]
}

================================================
FILE: GameSDKLibrary_Release/src/main/assets/Plugin_config.txt
================================================
{
    "plugin": [
        {
            "plugin_name": "plugin_wechat",
            "class_name": "com.bzai.gamesdk.plugin.wechat.WechatPlugin",
            "description": "微信功能插件",
            "version": "5.1.4"
        },
        {
            "plugin_name": "plugin_alipay",
            "class_name": "com.bzai.gamesdk.plugin.alipay.AlipayPlugin",
            "description": "支付宝功能插件",
            "version": "15.5.5"
        }
    ]
}

================================================
FILE: GameSDKLibrary_Release/src/main/assets/Project_config.txt
================================================
{
    "project": [
        {
            "project_name": "project",
            "class_name": "com.bzai.gamesdk.project.JuHeProject",
            "description": "聚合SDK项目",
            "version": "1.0.0"
        }
    ]
}

================================================
FILE: GameSDKLibrary_Release/src/main/assets/SDKInfo.json
================================================
{
  "sdk_type": "1",
  "sdk_name": "SDK_JuHe",
  "sdk_version": "1.0.0",
  "sdk_url": "http://www.baidu.com/"
}

================================================
FILE: GameSDKLibrary_Release/src/main/res/values/strings.xml
================================================
<resources>
    <string name="app_name">GameSDK_Plugin_Alipay</string>
</resources>


================================================
FILE: GameSDKLibrary_Release/src/test/java/com/suyutech/baselibrary/ExampleUnitTest.java
================================================
package com.suyutech.baselibrary;

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() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

================================================
FILE: GameSDK_API/.gitignore
================================================
/build


================================================
FILE: GameSDK_API/build.gradle
================================================
apply plugin: 'com.android.library'

android {
    compileSdkVersion 26
    buildToolsVersion "27.0.3"
    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 26
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile project(':GameSDK_Project_JuHe')
//    compile project(':GameSDK_Project_Custom')
}


================================================
FILE: GameSDK_API/proguard-rules.pro
================================================
# 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


================================================
FILE: GameSDK_API/src/androidTest/java/com/bzai/gamesdk/api/ExampleInstrumentedTest.java
================================================
package com.bzai.gamesdk.api;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.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() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.bzai.gamesdk.api.test", appContext.getPackageName());
    }
}


================================================
FILE: GameSDK_API/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bzai.gamesdk.api" />


================================================
FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/GameInfoSetting.java
================================================
package com.bzai.gamesdk;

/**
 * Created by bzai on 2018/4/10.
 * <p>
 * Desc:
 *
 *    用于对外给CP获取对应的游戏 gameid 和 gamekey
 */

public class GameInfoSetting {

    public String gameid;
    public String gamekey;

    public GameInfoSetting(String gameid, String gamekey){

        this.gameid = gameid;
        this.gamekey = gamekey;
    }

}


================================================
FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/SDKApplication.java
================================================
package com.bzai.gamesdk;
import android.content.Context;

import com.bzai.gamesdk.project.ProjectApplication;

/**
 * Created by bzai on 2018/4/10.
 * <p>
 * Desc: 项目SDK的application
 */

public class SDKApplication extends ProjectApplication {

    @Override
    protected void attachBaseContext(Context context) {
        super.attachBaseContext(context);
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

}


================================================
FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/api/SDKAPI.java
================================================
package com.bzai.gamesdk.api;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.Toast;

import com.bzai.gamesdk.GameInfoSetting;
import com.bzai.gamesdk.bean.info.AccountEventResultInfo;
import com.bzai.gamesdk.bean.info.PlayerInfo;
import com.bzai.gamesdk.bean.params.GameRoleParams;
import com.bzai.gamesdk.bean.params.PayParams;
import com.bzai.gamesdk.common.utils_base.config.ErrCode;
import com.bzai.gamesdk.common.utils_base.config.TypeConfig;
import com.bzai.gamesdk.common.utils_base.frame.google.gson.Gson;
import com.bzai.gamesdk.common.utils_base.frame.google.gson.JsonObject;
import com.bzai.gamesdk.common.utils_base.interfaces.CallBackListener;
import com.bzai.gamesdk.common.utils_base.parse.project.Project;
import com.bzai.gamesdk.common.utils_base.parse.project.ProjectManager;
import com.bzai.gamesdk.common.utils_base.utils.LogUtils;
import com.bzai.gamesdk.common.utils_base.utils.ObjectUtils;
import com.bzai.gamesdk.listener.AccountCallBackLister;
import com.bzai.gamesdk.listener.ExitCallBackLister;
import com.bzai.gamesdk.listener.InitCallBackLister;
import com.bzai.gamesdk.listener.PurchaseCallBackListener;
import com.bzai.gamesdk.module.account.bean.AccountBean;
import com.bzai.gamesdk.module.account.bean.AccountCallBackBean;
import com.bzai.gamesdk.module.purchase.PurchaseResult;

import java.util.HashMap;

/**
 * Created by bzai on 2018/7/19.
 * <p>
 * Desc:
 */
public class SDKAPI {

    private final String TAG = getClass().getSimpleName();

    private volatile static SDKAPI INSTANCE;

    private SDKAPI() {
    }

    public static SDKAPI getInstance() {
        if (INSTANCE == null) {
            synchronized (SDKAPI.class) {
                if (INSTANCE == null) {
                    INSTANCE = new SDKAPI();
                }
            }
        }
        return INSTANCE;
    }

//    private Project project = ProjectManager.getInstance().getProject("custom_project"); //获取实际的项目对象
//    private Project project = ProjectManager.getInstance().getProject("juhe_project"); //获取实际的项目对象
    private Project project = ProjectManager.getInstance().getProject("project"); //获取实际的项目对象

    /**-----------------------------------生命周期接口--------------------------------------**/

    public void onCreate(Activity activity, Bundle savedInstanceState) {
        project.onCreate(activity,savedInstanceState);
    }

    public void onStart(Activity activity) {
        project.onStart(activity);
    }

    public void onResume(Activity activity) {
        project.onResume(activity);
    }

    public void onPause(Activity activity) {
        project.onPause(activity);
    }

    public void onStop(Activity activity) {
        project.onStop(activity);
    }

    public void onRestart(Activity activity) {
        project.onRestart(activity);
    }

    public void onDestroy(Activity activity) {
        project.onDestroy(activity);
    }

    public void onNewIntent(Activity activity,Intent intent){
        project.onNewIntent(activity,intent);
    }

    public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
        project.onActivityResult(activity,requestCode,resultCode,data);
    }

    public void onRequestPermissionsResult(Activity activity,int requestCode, String[] permissions,int[] grantResults) {
        project.onRequestPermissionsResult(activity,requestCode,permissions,grantResults);
    }


    /**-----------------------------------SDK接口--------------------------------------**/


    /**
     * 初始化接口
     * @param activity 游戏activity
     * @param gameInfoSetting 游戏参数对象
     * @param accountCallBackLister 账号回调监听
     * @param initCallBackListener 初始化回调监听
     */
    public void init(final Activity activity, GameInfoSetting gameInfoSetting, AccountCallBackLister accountCallBackLister,
                     final InitCallBackLister initCallBackListener){

        //检测是否已设置配置游戏必须参数
        if (TextUtils.isEmpty(gameInfoSetting.gameid) || TextUtils.isEmpty(gameInfoSetting.gamekey)){
            Toast.makeText(activity,"param one of GameInfoSetting is null, please checks first",Toast.LENGTH_SHORT).show();
            return;
        }

        //检测是否已设置登录监听
        if (accountCallBackLister == null){
            Toast.makeText(activity,"AccountCallBackLister is null, please setAccountCallBackLister first",Toast.LENGTH_SHORT).show();
            return;
        }

        //设置账号监听回调
        mAccountCallCallBackLister = accountCallBackLister;
        project.setAccountCallBackLister(SDKAccountCallBackLister);

        project.init(activity, gameInfoSetting.gameid, gameInfoSetting.gamekey, new CallBackListener() {

            @Override
            public void onSuccess(Object o) {
                initCallBackListener.onSuccess();
            }

            @Override
            public void onFailure(int code, String msg) {
                initCallBackListener.onFailure(code,msg);
            }
        });
    }



    /***********************************************************************************************
     *
     *
     *  设置Account回调接口,避免渠道有些渠道登录是从浮窗或个人中心等入口接口回调回来,没法正确回调给CP
     *
     *
     **********************************************************************************************/
    private AccountCallBackLister mAccountCallCallBackLister;

    private void accountCallBack(int type, int statusCode, String msg, AccountBean loginInfo){

        AccountEventResultInfo accountResult = new AccountEventResultInfo();
        accountResult.setEventType(type);
        accountResult.setStatusCode(statusCode);
        accountResult.setMsg(msg);
        if (loginInfo != null){

            PlayerInfo playerInfo = new PlayerInfo();
            playerInfo.setPlayerId(loginInfo.getUserID());
            playerInfo.setToken(loginInfo.getUserToken());
            accountResult.setPlayerInfo(playerInfo);

        }else {
            accountResult.setPlayerInfo(new PlayerInfo());
        }

        Gson gson = new Gson();
        String jsonStr = gson.toJson(accountResult);
        if (mAccountCallCallBackLister != null){
            mAccountCallCallBackLister.onAccountEventCallBack(jsonStr);
        }
    }

    private void loginEventCallBack(int code, AccountBean loginInfo, String msg){

        if (code == ErrCode.SUCCESS){
            accountCallBack(AccountCallBackLister.LOGIN_SUCCESS, ErrCode.SUCCESS ,msg, loginInfo);

        }else if (code == ErrCode.CANCEL){
            accountCallBack(AccountCallBackLister.LOGIN_CANCEL, code, msg, null);

        }else if (code == ErrCode.CHANNEL_LOGIN_CLOSE){
            accountCallBack(AccountCallBackLister.LOGIN_FAILURE, code, msg, null);

        } else {
            accountCallBack(AccountCallBackLister.LOGIN_FAILURE, code, msg, null);
        }
    }

    private void switchEventCallBack(int code, AccountBean loginInfo, String msg){

        if (code == ErrCode.SUCCESS){
            accountCallBack(AccountCallBackLister.SWITCH_ACCOUNT_SUCCESS, ErrCode.SUCCESS, msg,loginInfo);

        }else if (code == ErrCode.CANCEL){
            accountCallBack(AccountCallBackLister.SWITCH_ACCOUNT_CANCEL, code, msg, null);

        } else {
            accountCallBack(AccountCallBackLister.SWITCH_ACCOUNT_FAILURE,code, msg, null);
        }
    }

    private void logoutEventCallBack(int code, String msg){

        if (code == ErrCode.SUCCESS){
            accountCallBack(AccountCallBackLister.LOGOUT_SUCCESS, ErrCode.SUCCESS, msg, null);

        }else if (code == ErrCode.CANCEL){
            accountCallBack(AccountCallBackLister.LOGOUT_CANCEL, code, msg, null);

        } else {
            accountCallBack(AccountCallBackLister.LOGOUT_FAILURE, code, msg , null);
        }
    }

    /**
     * 将Project层的结果回调到这里
     */
    private CallBackListener SDKAccountCallBackLister = new CallBackListener<AccountCallBackBean>() {

        /**
         * 事件结果都回调到这里来,包括失败,取消的
         */
        @Override
        public void onSuccess(AccountCallBackBean callBackBean) {

            int event = callBackBean.getEvent();
            int code = callBackBean.getErrorCode();
            AccountBean loginInfo = callBackBean.getAccountBean();
            String msg = callBackBean.getMsg();
            switch (event){
                case TypeConfig.LOGIN:
                    loginEventCallBack(code,loginInfo,msg);
                    break;

                case TypeConfig.SWITCHACCOUNT:
                    switchEventCallBack(code,loginInfo,msg);
                    break;

                case TypeConfig.LOGOUT:
                    logoutEventCallBack(code,msg);
                    break;
                default:
                    break;
            }
        }

        @Override
        public void onFailure(int code, String msg) {
            //不会走到这里来
        }
    };


    /**
     * 账号登录
     * @param activity 游戏activity
     */
    public void login(Activity activity){
        project.login(activity, null);
    }


    /**
     * 切换账号
     * @param activity 游戏activity
     */
    public void switchAccount(Activity activity){
        project.switchAccount(activity);
    }

    /**
     * 账号注销
     * @param activity 游戏activity
     */
    public void logout(Activity activity){
        project.logout(activity);
    }

    /**
     * 购买
     * @param activity 游戏activity
     * @param params 购买参数
     * @param purchaseCallBackListener 购买回调
     */
    public void pay(Activity activity, PayParams params, final PurchaseCallBackListener purchaseCallBackListener){

        //将实体对象装换为Map集合,方便后续自动扩展
        HashMap<String,Object> payParams = ObjectUtils.objectToMap(params);
        project.pay(activity, payParams, new CallBackListener<PurchaseResult>() {

            @Override
            public void onSuccess(PurchaseResult purchaseResult) {

                int type = purchaseResult.status;
                if (type == PurchaseResult.OrderState){ //创建订单成功回调

                    JsonObject object = (JsonObject) purchaseResult.message;
                    String orderID = object.get("orderId").getAsString();
                    purchaseCallBackListener.onOrderId(orderID);
                }

                if(type == PurchaseResult.PurchaseState){//支付成功回调
                    purchaseCallBackListener.onSuccess();
                }

            }

            @Override
            public void onFailure(int code, String msg) {

                if (purchaseCallBackListener != null){
                    if (code == ErrCode.CANCEL){
                        purchaseCallBackListener.onCancel();

                    }else if (code == ErrCode.NO_PAY_RESULT){

                        purchaseCallBackListener.onComplete();

                    }else {

                        purchaseCallBackListener.onFailure(code,msg);
                    }
                }
            }
        });

    }

    /**
     * 退出接口
     * @param activity 游戏activity
     * @param exitCallBackLister 退出回调
     */
    public void exit(Activity activity, final ExitCallBackLister exitCallBackLister){

        project.exit(activity, new CallBackListener() {

            @Override
            public void onSuccess(Object object) {

                //存在渠道退出框,并且点击退出成功
                exitCallBackLister.onExitDialogSuccess();
            }

            @Override
            public void onFailure(int code, String msg) {

                if (code == ErrCode.CANCEL){
                    exitCallBackLister.onExitDialogCancel();

                }else if (code == ErrCode.NO_EXIT_DIALOG){
                    exitCallBackLister.onNotExitDialog();//不存在渠道退出框

                } else{ //其他错误的时候,默认是没有回调框的

                    exitCallBackLister.onNotExitDialog();//不存在渠道退出框
                }

            }
        });

    }

    /**
     * 显示浮窗
     * @param activity
     */
    public void showFloatWindow(Activity activity){
        project.showFloatView(activity);
    }

    /**
     * 隐藏浮窗
     */
    public void dismissFloatView(Activity activity){
        project.dismissFloatView(activity);
    }


    /**
     * 上报数据信息
     * @param activity 游戏activity
     * @param gameRoleParams 游戏参数实体
     */
    public void submitRoleInfo(Activity activity, GameRoleParams gameRoleParams){

        //将实体对象装换为Map集合,方便后续自动扩展
        HashMap<String,Object> reportData = ObjectUtils.objectToMap(gameRoleParams);
        LogUtils.d(TAG,reportData.toString());
        project.reportData(activity,reportData);
    }

    public String getChannelId(){
        return project.getChannelID();
    }
}


================================================
FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/bean/info/AccountEventResultInfo.java
================================================
package com.bzai.gamesdk.bean.info;

/**
 * Created by bzai on 2018/4/17.
 * <p>
 * Desc:
 *
 *  用于装换成Json对象的实体类,不对外提供get方法
 *
 */

public class AccountEventResultInfo {


    private int eventType; //事件类型

    private int statusCode; //事件ID的状态码

    private String message; //描述信息

    private PlayerInfo playerInfo; //用户信息

    public void setEventType(int eventType) {
        this.eventType = eventType;
    }

    public void setStatusCode(int statusCode) {
        this.statusCode = statusCode;
    }

    public void setMsg(String message) {
        this.message = message;
    }

    public void setPlayerInfo(PlayerInfo playerInfo) {
        this.playerInfo = playerInfo;
    }

}


================================================
FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/bean/info/PlayerInfo.java
================================================
package com.bzai.gamesdk.bean.info;

/**
 * Created by bzai on 2018/4/11.
 * <p>
 * Desc:  返回外界的用户信息实体类
 */

public class PlayerInfo {

    private String playerId;
    private String token;

    public String getPlayerId() {
        return playerId;
    }

    public void setPlayerId(String playerId) {
        this.playerId = playerId;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

}


================================================
FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/bean/params/GameRoleParams.java
================================================
package com.bzai.gamesdk.bean.params;

/**
 * Created by bzai on 2018/4/18.
 * <p>
 * Desc:
 *
 *  数据上报透传实体类,只提供set方法,不对外提供get方法
 *
 *  ReportId            数据上传类型:
 *
 *      1:进入游戏
 *      2:登录游戏
 *      3:选择区服
 *      4:角色创建
 *      5:角色升级
 *      6:角色支付
 *      7:退出游戏
 *
 *  roleId			    角色ID
 *  roleName			角色名称
 *  roleLevel			角色等级
 *  roleCreateTime      角色创建时间 (选填)
 *  roleVipLevel        角色vip等级 (选填)
 *  roleUpLevelTime     角色升级时间 (选填)
 *  roleUnionName       角色所在家族/工会名称 (选填)
 *  roleBalance         角色充值余额(选填)
 *
 *  serverId		    登录所属的游戏服务器唯一标识
 *  serverName			登录所属的游戏服务器名称
 *
 *  extraInfo           拓展字段信息
 *
 */

public class GameRoleParams {

    //时间类型,可扩展
    private int ReportId;

    //角色信息
    private String roleId;
    private String roleName;
    private String roleLevel;
    private long roleCreateTime;
    private String roleVipLevel;
    private long roleUpLevelTime;
    private String roleUnionName;
    private float roleBalance ;

    //区服信息
    private String serverId;
    private String serverName;

    private String extraInfo;

    public void setReportId(int reportId) {
        ReportId = reportId;
    }

    public void setRoleId(String roleId) {
        this.roleId = roleId;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public void setRoleLevel(String roleLevel) {
        this.roleLevel = roleLevel;
    }

    public void setRoleCreateTime(long roleCreateTime) {
        this.roleCreateTime = roleCreateTime;
    }

    public void setRoleVipLevel(String roleVipLevel) {
        this.roleVipLevel = roleVipLevel;
    }

    public void setRoleUpLevelTime(long roleUpLevelTime) {
        this.roleUpLevelTime = roleUpLevelTime;
    }

    public void setRoleUnionName(String roleUnionName) {
        this.roleUnionName = roleUnionName;
    }

    public void setRoleBalance(float roleBalance) {
        this.roleBalance = roleBalance;
    }

    public void setServerId(String serverId) {
        this.serverId = serverId;
    }

    public void setServerName(String serverName) {
        this.serverName = serverName;
    }

    public void setExtraInfo(String extraInfo) {
        this.extraInfo = extraInfo;
    }
}


================================================
FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/bean/params/PayParams.java
================================================
package com.bzai.gamesdk.bean.params;

/**
 * Created by bzai on 2018/4/13.
 * <p>
 * Desc:
 *
 *  支付接口的透传实体类,只提供set方法,不对外提供get方法
 *
 *  注意:字段需与服务端一致,防止后续自动转化时出问题
 *
 *  productID			商品ID
 *  productName			商品名称
 *  productDesc			商品描述
 *  productNumber       商品数量 (暂时没有)
 *
 *  money				商品单价 (以分为单位)
 *  coinName			货币名称(人民币/台币/美元..) (暂时没有)
 *	coinRate			货币对人民币的比例 (暂时没有)
 *
 *  roleID              当前游戏内角色ID
 *  roleName            当前游戏内角色名称
 *  roleLevel           玩家等级
 *  serverID            当前玩家所在的服务器ID
 *  serverName          当前玩家所在的服务器名称
 *
 *  orderNo				游戏的订单号 (暂时没有)
 *  rate                游戏币与人民币比例  (暂时没有)
 *  callback            支付回调地址
 *	extension			透传给 cp服务器的字段
 *
 *  gorder              CP订单号
 */

public class PayParams {

    //商品信息
    private String productID;
    private String productName;
    private String productDesc;

    //金额信息
    private int money;

    //玩家信息
    private String roleID;
    private String roleName;
    private String roleLevel;
    private String serverID;
    private String serverName;

    //支付配置信息
    private String callback;
    private String extension;

    //游戏订单号
    private String gorder;

    public void setProductId(String productId) {
        this.productID = productId;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public void setProductDesc(String productDesc) {
        this.productDesc = productDesc;
    }

    public void setMoney(int money) {
        this.money = money;
    }

    public void setRoleID(String roleID) {
        this.roleID = roleID;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public void setRoleLevel(String roleLevel) {
        this.roleLevel = roleLevel;
    }

    public void setServerID(String serverID) {
        this.serverID = serverID;
    }

    public void setServerName(String serverName) {
        this.serverName = serverName;
    }

    public void setNotifyUrl(String callback) {
        this.callback = callback;
    }

    public void setExtension(String extension) {
        this.extension = extension;
    }

    public void setGorder(String gorder) {
        this.gorder = gorder;
    }
}


================================================
FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/listener/AccountCallBackLister.java
================================================
package com.bzai.gamesdk.listener;

/**
 * Created by bzai on 2018/4/12.
 * <p>
 * Desc:
 *
 *  对外的SDK Api 账号监听接口
 *
 */

public interface AccountCallBackLister {

    int LOGIN_SUCCESS = 1000; //登录成功
    int LOGIN_FAILURE = 1001; //登录失败
    int LOGIN_CANCEL = 1002;  //登录取消

    int SWITCH_ACCOUNT_SUCCESS = 1003; //切换账号成功
    int SWITCH_ACCOUNT_FAILURE = 1004; //切换账号失败
    int SWITCH_ACCOUNT_CANCEL = 1005; //切换账号取消

    int LOGOUT_SUCCESS = 1006; //注销账号成功
    int LOGOUT_FAILURE = 1007; //注销账号失败
    int LOGOUT_CANCEL = 1008; //注销账号取消

    void onAccountEventCallBack(String jsonStr);

}


================================================
FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/listener/ExitCallBackLister.java
================================================
package com.bzai.gamesdk.listener;

/**
 * Created by bzai on 2018/4/11.
 * <p>
 * Desc:
 * 对外的SDK Api 退出监听接口
 */

public interface ExitCallBackLister {

    /**
     * 退出框退出成功回调
     */
    void onExitDialogSuccess();

    /**
     * 退出框退出取消回调
     */
    void onExitDialogCancel();

    /**
     * 不存在退出框,需要游戏自己实现退出框
     */
    void onNotExitDialog();
}


================================================
FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/listener/InitCallBackLister.java
================================================
package com.bzai.gamesdk.listener;

/**
 * Created by bzai on 2018/4/10.
 * <p>
 * Desc:
 *
 *  对外的SDK Api 初始化监听接口
 */

public interface InitCallBackLister {

    /**
     * 初始化成功
     */
    void onSuccess();

    /**
     * 初始化失败
     * @param errCode
     * @param msg
     */
    void onFailure(int errCode, String msg);


}


================================================
FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/listener/PurchaseCallBackListener.java
================================================
package com.bzai.gamesdk.listener;

/**
 * Created by bzai on 2018/4/13.
 * <p>
 * Desc:
 *
 * 支付回调
 *
 */

public interface PurchaseCallBackListener {

    /**
     * 返回订单成功信息,比支付结果早
     * @param orderId
     */
    void onOrderId(String orderId);

    /**
     * 支付成功
     */
    void onSuccess();

    /**
     * 支付失败回调
     * @param errCode
     * @param msg 失败信息
     *
     */
    void onFailure(int errCode, String msg);

    /**
     * 支付取消
     */
    void onCancel();


    /**
     * 支付完成,当渠道没有正确支付回调时,会返回该结果
     */
    void onComplete();
}


================================================
FILE: GameSDK_API/src/test/java/com/bzai/gamesdk/api/ExampleUnitTest.java
================================================
package com.bzai.gamesdk.api;

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() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

================================================
FILE: GameSDK_BeginProject/GameSDK_Project_Custom/.gitignore
================================================
/build


================================================
FILE: GameSDK_BeginProject/GameSDK_Project_Custom/build.gradle
================================================
apply plugin: 'com.android.library'

android {
    compileSdkVersion 26
    buildToolsVersion "27.0.3"
    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 26

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile project(':GameSDK_Module_Account')
    compile project(':GameSDK_Module_Init')
    compile project(':GameSDK_Module_Purchase')
}


================================================
FILE: GameSDK_BeginProject/GameSDK_Project_Custom/proguard-rules.pro
================================================
# 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


================================================
FILE: GameSDK_BeginProject/GameSDK_Project_Custom/src/androidTest/java/com/bzai/gamesdk/project/channel/ExampleInstrumentedTest.java
================================================
package com.bzai.gamesdk.project.channel;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.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() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.bzai.gamesdk.project.channel.test", appContext.getPackageName());
    }
}


================================================
FILE: GameSDK_BeginProject/GameSDK_Project_Custom/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bzai.gamesdk.project.channel" />


================================================
FILE: GameSDK_BeginProject/GameSDK_Project_Custom/src/main/assets/Plugin_config.txt
================================================
{
    "plugin": [
        {
            "plugin_name": "plugin_wechat",
            "class_name": "com.bzai.gamesdk.plugin.wechat.WechatPlugin",
            "description": "微信功能插件",
            "version": "5.1.4"
        },
        {
            "plugin_name": "plugin_alipay",
            "class_name": "com.bzai.gamesdk.plugin.alipay.AlipayPlugin",
            "description": "支付宝功能插件",
            "version": "15.5.5"
        }
    ]
}

================================================
FILE: GameSDK_BeginProject/GameSDK_Project_Custom/src/main/assets/Project_config.txt
================================================
{
    "project": [
        {
            "project_name": "project",
            "class_name": "com.bzai.gamesdk.project.CustomProject",
            "description": "自定义SDK项目",
            "version": "1.0.0"
        }
    ]
}

================================================
FILE: GameSDK_BeginProject/GameSDK_Project_Custom/src/main/assets/SDKInfo.json
================================================
{
  "sdk_type": "1",
  "sdk_name": "SDK_Custom",
  "sdk_version": "1.0.0",
  "sdk_url": "http://www.baidu.com/"
}

================================================
FILE: GameSDK_BeginProject/GameSDK_Project_Custom/src/main/java/com/bzai/gamesdk/project/CustomProject.java
================================================
package com.bzai.gamesdk.project;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;

import com.bzai.gamesdk.common.utils_base.config.ErrCode;
import com.bzai.gamesdk.common.utils_base.config.TypeConfig;
import com.bzai.gamesdk.common.utils_base.interfaces.CallBackListener;
import com.bzai.gamesdk.common.utils_base.parse.project.Project;
import com.bzai.gamesdk.common.utils_base.utils.LogUtils;
import com.bzai.gamesdk.module.account.AccountManager;
import com.bzai.gamesdk.module.account.bean.AccountCallBackBean;
import com.bzai.gamesdk.module.init.InitManager;
import com.bzai.gamesdk.module.purchase.PurchaseManager;

import java.util.HashMap;

/**
 * Created by bzai on 2018/7/10.
 * <p>
 * Desc:
 *
 *    模拟自定义SDK项目
 *
 *    (注意生命周期方法必接,且必须初始化后才调用渠道、功能插件的生命周期方法)
 */

public class CustomProject extends Project{

    private final String TAG = getClass().getSimpleName();


    /**
     * 项目实例化入口
     */
    @Override
    protected synchronized void initProject() {
        LogUtils.d(TAG, getClass().getSimpleName() + " has init");
        super.initProject();
    }


    /******************************************      初始化      ****************************************/

    @Override
    public void init(Activity activity, String gameid, String gamekey, final CallBackListener callBackListener) {
        LogUtils.d(TAG,"init");

        if (activity == null || callBackListener == null) {
            callBackListener.onFailure(ErrCode.PARAMS_ERROR,"activity or callBackListener is null");
            return;
        }

        //设置账号监听
        AccountManager.getInstance().setLoginCallBackLister(projectAccountCallBackListener);

        InitManager.getInstance().init(activity, gameid, gamekey, new CallBackListener() {
            @Override
            public void onSuccess(Object object) {
                callBackListener.onSuccess(null);
            }

            @Override
            public void onFailure(int code, String msg) {
                callBackListener.onFailure(code,msg);
            }
        });
    }


    /******************************************      账号      ****************************************/

    /*** SDKApi层设置回调监听 */
    private CallBackListener ApiAccountCallback;

    @Override
    public void setAccountCallBackLister(CallBackListener callBackLister) {
        ApiAccountCallback = callBackLister;
    }

    /**
     * 监听AccountManager登录、切换账号、绑定、注销的回调信息
     */
    private CallBackListener projectAccountCallBackListener = new CallBackListener<AccountCallBackBean>() {

        @Override
        public void onSuccess(AccountCallBackBean callBackBean) {
            ApiAccountCallback.onSuccess(callBackBean);
        }

        @Override
        public void onFailure(int code, String msg) {
            //不会走到这里来
        }
    };

    private void AccountOnFailCallBack(int event, int code, String msg){

        AccountCallBackBean callBackBean = new AccountCallBackBean();
        callBackBean.setEvent(event);
        callBackBean.setErrorCode(code);
        callBackBean.setMsg(msg);
        ApiAccountCallback.onSuccess(callBackBean);
    }


    @Override
    public void login(Activity activity, HashMap<String, Object> loginParams) {
        LogUtils.d(TAG,"login");

        if (!InitManager.getInstance().getInitState()){
            Toast.makeText(activity,"请先初始化",Toast.LENGTH_SHORT).show();
            return;
        }

        if (activity == null ) {
            AccountOnFailCallBack(TypeConfig.LOGIN,ErrCode.PARAMS_ERROR,"activity is null");
            return;
        }

        AccountManager.getInstance().showLoginView(activity,loginParams);
    }


    @Override
    public void switchAccount(Activity activity) {
        LogUtils.d(TAG,"switchAccount");

        if (!InitManager.getInstance().getInitState()){
            Toast.makeText(activity,"请先初始化",Toast.LENGTH_SHORT).show();
            return;
        }

        if (!AccountManager.getInstance().getLoginState()){
            AccountOnFailCallBack(TypeConfig.SWITCHACCOUNT,ErrCode.NO_LOGIN,"account has not login");
            return;
        }

        if (activity == null ) {
            AccountOnFailCallBack(TypeConfig.LOGIN,ErrCode.PARAMS_ERROR,"activity is null");
            return;
        }

        AccountManager.getInstance().switchAccount(activity);
    }

    @Override
    public void logout(Activity activity) {
        LogUtils.d(TAG,"logout");

        if (!InitManager.getInstance().getInitState()){
            Toast.makeText(activity,"请先初始化",Toast.LENGTH_SHORT).show();
            return;
        }

        if (!AccountManager.getInstance().getLoginState()){
            AccountOnFailCallBack(TypeConfig.LOGOUT,ErrCode.NO_LOGIN,"account has not login");
            return;
        }

        if (activity == null ) {
            AccountOnFailCallBack(TypeConfig.LOGIN,ErrCode.PARAMS_ERROR,"activity is null");
            return;
        }

        AccountManager.getInstance().logout(activity);
    }


    /******************************************      购买      ****************************************/


    @Override
    public void pay(Activity activity, HashMap<String, Object> payParams, CallBackListener callBackListener) {
        LogUtils.d(TAG,"pay");

        if (!InitManager.getInstance().getInitState()){
            Toast.makeText(activity,"请先初始化",Toast.LENGTH_SHORT).show();
            return;
        }

        if (!AccountManager.getInstance().getLoginState()){
            callBackListener.onFailure(ErrCode.NO_LOGIN,"account has not login");
            return;
        }

        if (activity == null || payParams == null || callBackListener == null) {
            callBackListener.onFailure(ErrCode.PARAMS_ERROR,"activity or PayParams or callBackListener is null");
            return;
        }

        PurchaseManager.getInstance().showPayView(activity,payParams,callBackListener);
    }


    /******************************************      退出      ****************************************/


    /**
     * 退出SDK
     */
    @Override
    public void exit(Activity activity, CallBackListener callBackListener) {
        LogUtils.d(TAG,"exit");

        if (activity == null || callBackListener == null) {
            callBackListener.onFailure(ErrCode.PARAMS_ERROR,"activity or callBackListener is null");
            return;
        }

        callBackListener.onFailure(ErrCode.NO_EXIT_DIALOG,"channel not exitDialog");
    }


    /*************************************  生命周期接口(必接) ****************************************/

    @Override
    public void onCreate(Activity activity, Bundle savedInstanceState) {
        LogUtils.d(TAG,"onCreate");

        if (InitManager.getInstance().getInitState()){
            super.onCreate(activity, savedInstanceState);
        }
    }

    @Override
    public void onStart(Activity activity) {
        LogUtils.d(TAG,"onStart");

        if (InitManager.getInstance().getInitState()){
            super.onStart(activity);
        }
    }

    @Override
    public void onResume(Activity activity) {
        LogUtils.d(TAG,"onResume");

        if (InitManager.getInstance().getInitState()){
            super.onResume(activity);
        }
    }

    @Override
    public void onPause(Activity activity) {
        LogUtils.d(TAG,"onPause");

        if (InitManager.getInstance().getInitState()){
            super.onPause(activity);
        }
    }

    @Override
    public void onStop(Activity activity) {
        LogUtils.d(TAG,"onStop");

        if (InitManager.getInstance().getInitState()){
            super.onStop(activity);
        }
    }

    @Override
    public void onDestroy(Activity activity) {
        LogUtils.d(TAG,"onDestroy");

        if (InitManager.getInstance().getInitState()){
            super.onDestroy(activity);
        }
    }

    @Override
    public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
        LogUtils.d(TAG,"onActivityResult");

        if (InitManager.getInstance().getInitState()){
            super.onActivityResult(activity, requestCode, resultCode, data);
        }
    }

    @Override
    public void onRequestPermissionsResult(Activity activity, int requestCode, String[] permissions,int[] grantResults) {
        LogUtils.d(TAG,"onRequestPermissionsResult");

        if (InitManager.getInstance().getInitState()){
            super.onRequestPermissionsResult(activity, requestCode, permissions, grantResults);
        }
    }
}


================================================
FILE: GameSDK_BeginProject/GameSDK_Project_Custom/src/main/java/com/bzai/gamesdk/project/ProjectApplication.java
================================================
package com.bzai.gamesdk.project;

import android.app.Application;
import android.content.Context;

import com.bzai.gamesdk.module.init.InitManager;

/**
 * Created by bzai on 2018/4/10.
 * <p>
 * Desc: 项目SDK的application
 */
public class ProjectApplication extends Application {

    @Override
    protected void attachBaseContext(Context context) {
        //必须先加载项目配置文件,找到项目的入口。
        InitManager.getInstance().initApplication(this,context,true);
        super.attachBaseContext(context);
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }


}


================================================
FILE: GameSDK_BeginProject/GameSDK_Project_Custom/src/test/java/com/bzai/gamesdk/project/channel/ExampleUnitTest.java
================================================
package com.bzai.gamesdk.project.channel;

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() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

================================================
FILE: GameSDK_BeginProject/GameSDK_Project_JuHe/.gitignore
================================================
/build


================================================
FILE: GameSDK_BeginProject/GameSDK_Project_JuHe/build.gradle
================================================
apply plugin: 'com.android.library'

android {
    compileSdkVersion 26
    buildToolsVersion "27.0.3"
    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 26
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile project(':GameSDK_Channel_Lexiang')
    compile project(':GameSDK_Module_Init')
    compile project(':GameSDK_Module_Account')
    compile project(':GameSDK_Module_Purchase')
}


================================================
FILE: GameSDK_BeginProject/GameSDK_Project_JuHe/proguard-rules.pro
================================================
# 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


================================================
FILE: GameSDK_BeginProject/GameSDK_Project_JuHe/src/androidTest/java/com/bzai/gamesdk/project/juhe/ExampleInstrumentedTest.java
================================================
package com.bzai.gamesdk.project.juhe;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.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() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.bzai.gamesdk.project.juhe.test", appContext.getPackageName());
    }
}


================================================
FILE: GameSDK_BeginProject/GameSDK_Project_JuHe/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bzai.gamesdk.project.juhe" />


================================================
FILE: GameSDK_BeginProject/GameSDK_Project_JuHe/src/main/assets/Plugin_config.txt
================================================
{
    "plugin": [
        {
            "plugin_name": "plugin_wechat",
            "class_name": "com.bzai.gamesdk.plugin.wechat.WechatPlugin",
            "description": "微信功能插件",
            "version": "5.1.4"
        },
        {
            "plugin_name": "plugin_alipay",
            "class_name": "com.bzai.gamesdk.plugin.alipay.AlipayPlugin",
            "description": "支付宝功能插件",
            "version": "15.5.5"
        }
    ]
}

================================================
FILE: GameSDK_BeginProject/GameSDK_Project_JuHe/src/main/assets/Project_config.txt
================================================
{
    "project": [
        {
            "project_name": "project",
            "class_name": "com.bzai.gamesdk.project.JuHeProject",
            "description": "聚合SDK项目",
            "version": "1.0.0"
        }
    ]
}

================================================
FILE: GameSDK_BeginProject/GameSDK_Project_JuHe/src/main/assets/SDKInfo.json
================================================
{
  "sdk_type": "1",
  "sdk_name": "SDK_JuHe",
  "sdk_version": "1.0.0",
  "sdk_url": "http://www.baidu.com/"
}

================================================
FILE: GameSDK_BeginProject/GameSDK_Project_JuHe/src/main/java/com/bzai/gamesdk/project/JuHeProject.java
================================================
package com.bzai.gamesdk.project;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.Toast;

import com.bzai.gamesdk.common.utils_base.config.ErrCode;
import com.bzai.gamesdk.common.utils_base.config.TypeConfig;
import com.bzai.gamesdk.common.utils_base.frame.google.gson.JsonObject;
import com.bzai.gamesdk.common.utils_base.interfaces.CallBackListener;
import com.bzai.gamesdk.common.utils_base.parse.channel.Channel;
import com.bzai.gamesdk.common.utils_base.parse.channel.ChannelManager;
import com.bzai.gamesdk.common.utils_base.parse.project.Project;
import com.bzai.gamesdk.common.utils_base.utils.LogUtils;
import com.bzai.gamesdk.common.utils_business.cache.BaseCache;
import com.bzai.gamesdk.module.account.AccountManager;
import com.bzai.gamesdk.module.account.bean.AccountCallBackBean;
import com.bzai.gamesdk.module.init.InitManager;
import com.bzai.gamesdk.module.purchase.PurchaseManager;
import com.bzai.gamesdk.module.purchase.PurchaseResult;

import java.util.HashMap;

/**
 * Created by bzai on 2018/4/10.
 * <p>
 * Desc:
 *
 *  (业务逻辑判断)
 *  JuHeProject 聚合SDK的项目入口类。
 *
 *  (注意生命周期方法必接,且必须初始化后才调用渠道、功能插件的生命周期方法)
 *
 */

public class JuHeProject extends Project {

    private final String TAG = getClass().getSimpleName();

    //渠道对象
    private Channel channel;

    private Activity mActivity;

    /**
     * 表明项目入口已实例化,可以正常加载走SDK后续功能逻辑
     */
    @Override
    protected void initProject() {
        LogUtils.d(TAG, getClass().getSimpleName() + " has init");
        super.initProject();
    }


    /******************************************  初始化   ****************************************/


    @Override
    public void init(final Activity activity, String gameid, String gamekey, final CallBackListener callBackListener) {
        LogUtils.d(TAG,"init");

        if (activity == null || callBackListener == null) {
            callBackListener.onFailure(ErrCode.PARAMS_ERROR,"activity or callBackListener 为空");
            return;
        }

        //设置账号监听
        AccountManager.getInstance().setLoginCallBackLister(projectAccountCallBackListener);

        InitManager.getInstance().init(activity, gameid, gamekey, new CallBackListener() {

            @Override
            public void onSuccess(Object o) {

                channel = ChannelManager.getInstance().getChannel(); //注意渠道配置文件有没有加载

                channel.init(activity, null, new CallBackListener() {

                    @Override
                    public void onSuccess(Object o) {

                        //项目SDK初始化成功后,调用渠道SDK初始化。
                        InitManager.getInstance().setInitState(true);
                        callBackListener.onSuccess(o);
                    }

                    @Override
                    public void onFailure(int code, String msg) {
                        InitManager.getInstance().setInitState(false);
                        callBackListener.onFailure(code,msg);
                    }
                });
            }

            @Override
            public void onFailure(int code, String msg) {
                callBackListener.onFailure(code,msg);
            }
        });
    }


    /******************************************      账号      ****************************************/


    /*** SDKApi层设置回调监听*/
    private CallBackListener ApiAccountCallback;

    @Override
    public void setAccountCallBackLister(CallBackListener callBackLister) {
        ApiAccountCallback = callBackLister;
    }

    /**
     * 监听AccountManager登录、切换账号、绑定、注销的回调信息
     */
    private CallBackListener projectAccountCallBackListener = new CallBackListener<AccountCallBackBean>() {

        @Override
        public void onSuccess(AccountCallBackBean callBackBean) {
            ApiAccountCallback.onSuccess(callBackBean);
        }

        @Override
        public void onFailure(int code, String msg) {
            //不会走到这里来
        }
    };

    private void AccountOnFailCallBack(int event, int code, String msg){

        AccountCallBackBean callBackBean = new AccountCallBackBean();
        callBackBean.setEvent(event);
        callBackBean.setErrorCode(code);
        callBackBean.setMsg(msg);
        ApiAccountCallback.onSuccess(callBackBean);
    }


    /**
     * 监听渠道Channel的登录、切换账号、绑定、注销的回调信息
     */
    private CallBackListener authCallBackListener = new CallBackListener<HashMap<String,Object>>() {


        @Override
        public void onSuccess(HashMap<String,Object> loginAuthData) {
            LogUtils.debug_d(TAG,channel.getClass().getSimpleName() + " = " + loginAuthData.toString());

            int type = (int) loginAuthData.get(Channel.PARAMS_OAUTH_TYPE);
            //类型为登录、切换账号就走服务器登录逻辑
            if (type == TypeConfig.LOGIN || type == TypeConfig.SWITCHACCOUNT){
                AccountManager.getInstance().authLogin(mActivity,loginAuthData);

            } else if (type == TypeConfig.LOGOUT){ //类型为登出
                AccountManager.getInstance().logout(mActivity);
            }
        }

        @Override
        public void onFailure(int code, String msg) {
            LogUtils.debug_d(TAG,channel.getClass().getSimpleName() + msg);
            //做失败处理
            switch (code){
                case ErrCode.CHANNEL_LOGIN_FAIL: //登录失败
                    AccountOnFailCallBack(TypeConfig.LOGIN, ErrCode.FAILURE,msg);
                    break;

                case ErrCode.CHANNEL_LOGIN_CANCEL: //登录取消
                    AccountOnFailCallBack(TypeConfig.LOGIN, ErrCode.CANCEL,msg);
                    break;

                case ErrCode.CHANNEL_SWITCH_ACCOUNT_FAIL: //切换账号失败
                    AccountOnFailCallBack(TypeConfig.SWITCHACCOUNT, ErrCode.FAILURE,msg);
                    break;

                case ErrCode.CHANNEL_SWITCH_ACCOUNT_CANCEL: //切换账号取消
                    AccountOnFailCallBack(TypeConfig.SWITCHACCOUNT, ErrCode.CANCEL,msg);
                    break;

                case ErrCode.CHANNEL_LOGOUT_FAIL:// 注销失败
                    AccountOnFailCallBack(TypeConfig.LOGOUT, ErrCode.FAILURE,msg);
                    break;

                case ErrCode.CHANNEL_LOGOUT_CANCEL: //注销取消
                    AccountOnFailCallBack(TypeConfig.LOGOUT, ErrCode.CANCEL,msg);
                    break;
            }
        }
    };

    @Override
    public void login(Activity activity, HashMap<String, Object> loginParams) {
        LogUtils.d(TAG,"login");

        if (!InitManager.getInstance().getInitState()){
            Toast.makeText(activity,"请先初始化",Toast.LENGTH_SHORT).show();
            return;
        }

        if (activity == null ) {
            AccountOnFailCallBack(TypeConfig.LOGIN,ErrCode.PARAMS_ERROR,"activity 为空");
            return;
        }

        mActivity = activity;
        channel.login(activity, loginParams, authCallBackListener);
    }



    @Override
    public void switchAccount(Activity activity) {
        LogUtils.d(TAG,"switchAccount");

        if (!InitManager.getInstance().getInitState()){
            Toast.makeText(activity,"请先初始化",Toast.LENGTH_SHORT).show();
            return;
        }

        if (!AccountManager.getInstance().getLoginState()){
            AccountOnFailCallBack(TypeConfig.SWITCHACCOUNT,ErrCode.NO_LOGIN,"account has not login");
            return;
        }

        if (activity == null ) {
            AccountOnFailCallBack(TypeConfig.SWITCHACCOUNT,ErrCode.PARAMS_ERROR,"activity 为空");
            return;
        }

        mActivity = activity;

        if (isSupport(TypeConfig.FUNC_SWITCHACCOUNT)){
            channel.switchAccount(activity,authCallBackListener);

        }else {
            Toast.makeText(activity,"没有实现该方法",Toast.LENGTH_SHORT).show();
        }
    }



    @Override
    public void logout(Activity activity) {
        LogUtils.d(TAG,"logout");

        if (!InitManager.getInstance().getInitState()){
            Toast.makeText(activity,"请先初始化",Toast.LENGTH_SHORT).show();
            return;
        }

        if (!AccountManager.getInstance().getLoginState()){
            AccountOnFailCallBack(TypeConfig.LOGOUT,ErrCode.NO_LOGIN,"account has not login");
            return;
        }

        if (activity == null ) {
            AccountOnFailCallBack(TypeConfig.LOGIN,ErrCode.PARAMS_ERROR,"activity 为空");
            return;
        }

        if (isSupport(TypeConfig.FUNC_LOGOUT)){
            channel.logout(activity, authCallBackListener);

        }else {
            Toast.makeText(activity,"没有实现该方法",Toast.LENGTH_SHORT).show();
        }
    }


    /******************************************      购买      ****************************************/

    @Override
    public void pay(final Activity activity, final HashMap<String, Object> payParams, final CallBackListener callBackListener) {
        LogUtils.d(TAG,"pay");

        if (!InitManager.getInstance().getInitState()){
            Toast.makeText(activity,"请先初始化",Toast.LENGTH_SHORT).show();
            return;
        }

        if (!AccountManager.getInstance().getLoginState()){
            callBackListener.onFailure(ErrCode.NO_LOGIN,"account has not login");
            return;
        }

        if (activity == null || callBackListener == null) {
            callBackListener.onFailure(ErrCode.PARAMS_ERROR,"activity or callBackListener is null");
            return;
        }

        //先创建订单
        PurchaseManager.getInstance().createOrderId(activity, payParams, new CallBackListener() {

            @Override
            public void onSuccess(Object object) {

                //返回订单号
                String orderID = (String) object;

                //创建订单成功,回调订单信息和CP的透传信息
                JsonObject jsonObject = new JsonObject();
                jsonObject.addProperty("orderId",orderID);
                PurchaseResult purchaseResult = new PurchaseResult(PurchaseResult.OrderState,jsonObject);
                callBackListener.onSuccess(purchaseResult);

                payParams.put("orderId",orderID);

                channel.pay(activity, payParams, new CallBackListener() {

                    @Override
                    public void onSuccess(Object object) {

                        //支付结果回调到这里来
                        PurchaseResult purchaseResult = new PurchaseResult(PurchaseResult.PurchaseState,null);
                        callBackListener.onSuccess(purchaseResult);

                    }

                    @Override
                    public void onFailure(int code, String msg) {
                        callBackListener.onFailure(code,msg);
                    }
                });

            }

            @Override
            public void onFailure(int code, String msg) {
                callBackListener.onFailure(code,"create orderId fail");
            }
        });

    }


    @Override
    public void showFloatView(Activity activity) {
        LogUtils.d(TAG,"showFloatView");

        if (!InitManager.getInstance().getInitState()){
            Toast.makeText(activity,"请先初始化",Toast.LENGTH_SHORT).show();
            return;
        }

        mActivity = activity;

        if (isSupport(TypeConfig.FUNC_SHOW_FLOATWINDOW)){
            channel.showFloatView(activity);

        }else {
            Toast.makeText(activity,"没有实现该方法",Toast.LENGTH_SHORT).show();
        }

    }

    @Override
    public void dismissFloatView(Activity activity) {
        LogUtils.d(TAG,"dismissFloatView");

        if (!InitManager.getInstance().getInitState()){
            Toast.makeText(activity,"请先初始化",Toast.LENGTH_SHORT).show();
            return;
        }

        mActivity = activity;

        if (isSupport(TypeConfig.FUNC_DISMISS_FLOATWINDOW)){
            channel.dismissFloatView(activity);

        }else {
            Toast.makeText(activity,"没有实现该方法",Toast.LENGTH_SHORT).show();
        }
    }


    @Override
    public void exit(Activity activity, CallBackListener callBackListener) {
        LogUtils.d(TAG,"exit");

        if (activity == null || callBackListener == null) {
            callBackListener.onFailure(ErrCode.PARAMS_ERROR,"activity or callBackListener is null");
            return;
        }

        mActivity = activity;

        channel.exit(activity,callBackListener);
    }

    @Override
    public void reportData(Context context, HashMap<String, Object> dataMap) {
        LogUtils.d(TAG,"reportData");

        if (!InitManager.getInstance().getInitState()){
            Toast.makeText(context,"请先初始化",Toast.LENGTH_SHORT).show();
            return;
        }

        channel.reportData(context,dataMap);
    }


    @Override
    public void extendFunction(Activity activity, int functionType, Object object, CallBackListener callBackListener) {
        super.extendFunction(activity, functionType, object, callBackListener);
    }


    /**
     * 是否支持该接口,由于个别渠道只简单实现登录、支付接口
     * @param FuncType
     * @return
     */
    public boolean isSupport(int FuncType) {
        return channel.isSupport(FuncType);
    }


    @Override
    public String getChannelID() {
        return BaseCache.getInstance().getChannelId();
    }

    /*************************************  生命周期接口 ****************************************/

    @Override
    public void onCreate(Activity activity, Bundle savedInstanceState) {
        LogUtils.d(TAG,"onCreate");

        if (InitManager.getInstance().getInitState()){
            super.onCreate(activity, savedInstanceState);
            channel.onCreate(activity,savedInstanceState);
        }
    }

    @Override
    public void onStart(Activity activity) {
        LogUtils.d(TAG,"onStart");
        if (InitManager.getInstance().getInitState()){
            super.onStart(activity);
            channel.onStart(activity);
        }
    }

    @Override
    public void onResume(Activity activity) {
        LogUtils.d(TAG,"onResume");

        if (InitManager.getInstance().getInitState()){
            super.onResume(activity);
            channel.onResume(activity);
        }
    }

    @Override
    public void onPause(Activity activity) {
        LogUtils.d(TAG,"onPause");
        if (InitManager.getInstance().getInitState()){
            super.onPause(activity);
            channel.onPause(activity);
        }
    }

    @Override
    public void onStop(Activity activity) {
        LogUtils.d(TAG,"onStop");
        if (InitManager.getInstance().getInitState()){
            super.onStop(activity);
            channel.onStop(activity);
        }
    }

    @Override
    public void onDestroy(Activity activity) {
        LogUtils.d(TAG,"onDestroy");
        if (InitManager.getInstance().getInitState()){
            super.onDestroy(activity);
            channel.onDestroy(activity);
        }
    }

    @Override
    public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
        LogUtils.d(TAG,"onActivityResult");
        if (InitManager.getInstance().getInitState()){
            super.onActivityResult(activity, requestCode, resultCode, data);
            channel.onActivityResult(activity,requestCode,resultCode,data);
        }
    }

    @Override
    public void onRequestPermissionsResult(Activity activity, int requestCode, String[] permissions,int[] grantResults) {
        LogUtils.d(TAG,"onRequestPermissionsResult");
        if (InitManager.getInstance().getInitState()){
            super.onRequestPermissionsResult(activity, requestCode, permissions, grantResults);
            channel.onRequestPermissionsResult(activity,requestCode,permissions,grantResults);
        }
    }

    /*************************************  生命周期接口 ****************************************/
}


================================================
FILE: GameSDK_BeginProject/GameSDK_Project_JuHe/src/main/java/com/bzai/gamesdk/project/ProjectApplication.java
================================================
package com.bzai.gamesdk.project;

import android.content.Context;
import com.bzai.gamesdk.channel.application.ChannelApplication;
import com.bzai.gamesdk.module.init.InitManager;


/**
 * Created by bzai on 2018/4/10.
 * <p>
 * Desc: 项目SDK的application
 *
 *     ProjectApplication extends ChannelApplication
 */
public class ProjectApplication extends ChannelApplication {

    @Override
    protected void attachBaseContext(Context context) {
        //必须先加载项目配置文件,找到项目的入口。
        InitManager.getInstance().initApplication(this,context,true);
        super.attachBaseContext(context);
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }


}


================================================
FILE: GameSDK_BeginProject/GameSDK_Project_JuHe/src/test/java/com/bzai/gamesdk/project/juhe/ExampleUnitTest.java
================================================
package com.bzai.gamesdk.project.juhe;

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() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/.gitignore
================================================
/build


================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/build.gradle
================================================
apply plugin: 'com.android.library'

android {
    compileSdkVersion 26
    buildToolsVersion "27.0.3"
    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 26

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile project(':GameSDK_Utils')

}


================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/proguard-rules.pro
================================================
# 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


================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/androidTest/java/com/bzai/gamesdk/channel/test/ExampleInstrumentedTest.java
================================================
package com.bzai.gamesdk.channel.test;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.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() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.bzai.gamesdk.channel.test.test", appContext.getPackageName());
    }
}


================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bzai.gamesdk.channel.lexiang" >


    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


    <application
        android:allowBackup="true">

        <activity
            android:name="com.youxun.sdk.app.YouxunWebViewActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:screenOrientation="landscape"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
        <activity
            android:name="com.youxun.sdk.app.NewLoginActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:screenOrientation="landscape"
            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
        <activity
            android:name="com.youxun.sdk.app.BoundActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:screenOrientation="landscape"
            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
        <activity
            android:name="com.youxun.sdk.app.MobileAccountActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:screenOrientation="landscape"
            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
        <activity
            android:name="com.youxun.sdk.app.YouxunAccountActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:screenOrientation="landscape"
            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
        <activity
            android:name="com.youxun.sdk.app.GiftBagActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:screenOrientation="landscape"
            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
        <activity
            android:name="com.youxun.sdk.app.PayActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:screenOrientation="landscape"
            android:theme="@android:style/Theme.Black.NoTitleBar" />

        <activity
            android:name="com.alipay.sdk.app.H5PayActivity"
            android:configChanges="orientation|keyboardHidden|navigation|screenSize"
            android:exported="false"
            android:screenOrientation="behind"
            android:windowSoftInputMode="adjustResize|stateHidden" />
        <activity
            android:name="com.alipay.sdk.auth.AuthActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind" />
        <!-- heepay -->
        <activity
            android:name="com.heepay.plugin.activity.WeChatNotityActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:screenOrientation="behind"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />


    </application>

</manifest>

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/assets/Channel_config.txt
================================================
{
    "channel": [
        {
            "channel_name": "channel",
            "class_name": "com.bzai.gamesdk.channel.lexiang.LexiangSDK",
            "description": "乐享渠道SDK",
            "version": "1.0.0"
        }
    ]
}

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/java/com/bzai/gamesdk/channel/application/ChannelApplication.java
================================================
package com.bzai.gamesdk.channel.application;

import android.app.Application;
import android.content.Context;

/**
 * Created by bzai on 2018/4/11.
 * <p>
 * Desc:
 *
 *  预留用于继承渠道的Application
 */

public class ChannelApplication extends Application {

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }


}


================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/java/com/bzai/gamesdk/channel/lexiang/LexiangSDK.java
================================================
package com.bzai.gamesdk.channel.lexiang;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;

import com.bzai.gamesdk.common.utils_base.config.TypeConfig;
import com.bzai.gamesdk.common.utils_base.interfaces.CallBackListener;
import com.bzai.gamesdk.common.utils_base.parse.channel.Channel;
import com.bzai.gamesdk.common.utils_base.utils.LogUtils;
import com.youxun.sdk.app.YouxunProxy;
import com.youxun.sdk.app.YouxunXF;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;

/**
 * @author bzai
 * @data 2018/9/11
 * <p>
 * Desc:乐享渠道SDK
 */
public class LexiangSDK extends Channel{

    private final String TAG = getClass().getSimpleName();

    private String game = "tmj";
    private String key = "4444b360a2c5b8d123f527a09c1f9f29";

    private CallBackListener channelAccountCallBackListener;
    private CallBackListener purchaseCallBackListener;

    @Override
    protected void initChannel() {
        LogUtils.d(TAG, getClass().getSimpleName() + " has init");
    }

    @Override
    public String getChannelID() {
        return null;
    }

    @Override
    public boolean isSupport(int FuncType) {

        switch (FuncType){

            case TypeConfig.FUNC_SWITCHACCOUNT:
                return false;

            case TypeConfig.FUNC_LOGOUT:
                return true;

            case TypeConfig.FUNC_SHOW_FLOATWINDOW:
                return false;

            case TypeConfig.FUNC_DISMISS_FLOATWINDOW:
                return false;

            default:
                return false;
        }
    }

    @Override
    public void init(Context context, HashMap<String, Object> initMap, CallBackListener initCallBackListener) {
        LogUtils.d(TAG,getClass().getSimpleName() + " init");

        //乐享SDK初始化
        YouxunProxy.init(game,key);
        initOnSuccess(initCallBackListener);
    }

    @Override
    public void login(Context context, HashMap<String, Object> loginMap, CallBackListener loginCallBackListener) {
        LogUtils.d(TAG,getClass().getSimpleName() + " login");

        channelAccountCallBackListener = loginCallBackListener;
        YouxunProxy.startLogin((Activity) context);
    }

    @Override
    public void switchAccount(Context context, CallBackListener changeAccountCallBackLister) {
        LogUtils.d(TAG,getClass().getSimpleName() + " switchAccount");
    }

    @Override
    public void logout(Context context, CallBackListener logoutCallBackLister) {
        LogUtils.d(TAG,getClass().getSimpleName() + " logout");

        YouxunProxy.exitLogin((Activity) context);

        YouxunXF.onDestroy();//销毁悬浮图标
        logoutOnSuccess(channelAccountCallBackListener);
    }

    @Override
    public void pay(Context context, HashMap<String, Object> payMap, CallBackListener payCallBackListener) {
        LogUtils.d(TAG,getClass().getSimpleName() + " pay");

        String productName = (String) payMap.get("productName");
        String orderId = (String) payMap.get("orderId");
        float price = convertToFloat(payMap.get("money"),0) / 100;
        String money = convertToString(price,"");
        String serverID = (String) payMap.get("serverID");

        purchaseCallBackListener = payCallBackListener;
        YouxunProxy.startPay((Activity) context, productName, money, orderId, serverID);
    }

    @Override
    public void exit(Context context, CallBackListener exitCallBackLister) {
        LogUtils.d(TAG,getClass().getSimpleName() + " exit");
        channelNotExitDialog(exitCallBackLister);
    }

    @Override
    public void onActivityResult(Context context, int requestCode, int resultCode, Intent data) {

        if (requestCode == YouxunProxy.REQUEST_CODE_LOGIN && resultCode == YouxunProxy.RESULT_CODE_LOGIN){

            //登录
            loginCall(context, data);

        }else 	if (requestCode == YouxunProxy.REQUEST_CODE_PAY && resultCode == YouxunProxy.RESULT_CODE_PAY) {

            LogUtils.d(TAG,data.getStringExtra("data"));

            payOnComplete(purchaseCallBackListener);

        }else if (requestCode == YouxunXF.REQUEST_CODE_SWITCH_ACCOUNT && resultCode == YouxunXF.RESULT_CODE_SWITCH_ACCOUNT){

            //切换账号
            YouxunXF.onDestroy();//销毁悬浮图标
            login(context,null,channelAccountCallBackListener); //启动登录
        }

    }

    @Override
    public void onDestroy(Context context) {
        YouxunXF.onDestroy();//销毁悬浮图标
    }

    private void loginCall(Context context, Intent data){

        if (data.getStringExtra("data").equals("success")){

            //登入成功
            String userId = data.getStringExtra("userid");
            String msg = data.getStringExtra("msg");
            String time = data.getStringExtra("time");
            String sign = data.getStringExtra("sign");
            LogUtils.debug_d(TAG,"userid=" + userId + "\n" +
                    "msg=" + msg + "\n" + "time=" + time + "\n" + "sign=" + sign + "\n");

            //检测版本
            YouxunProxy.updateDialog(context, data);

            //提示用户账号信息
            YouxunXF.hintUserInfo((Activity)context);

            //创建悬浮图标
            YouxunXF.onCreate((Activity)context,0.4f);

            //将数据格式返回到上一层
            JSONObject json = new JSONObject();
            try {
                json.put("sid", userId);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            loginOnSuccess(json.toString(),channelAccountCallBackListener);

        }else {

            //登录失败
            loginOnFail("channel login fail",channelAccountCallBackListener);
        }
    }


    /**
     * 转化为float
     * @param value 传入对象
     * @param defaultValue 发生异常时,返回默认值
     * @return
     */
    public float convertToFloat(Object value, float defaultValue){

        if (value == null || "".equals(value.toString().trim())){
            return defaultValue;
        }

        try {
            return Float.valueOf(value.toString());
        }catch (Exception e){

            try {
                return Float.valueOf(String.valueOf(value));
            }catch (Exception e1) {

                try {
                    return Long.valueOf(value.toString()).floatValue();
                }catch (Exception e2){
                    return defaultValue;
                }
            }
        }
    }

    /**
     * 转化为float
     * @param value 传入对象
     * @param defaultValue 发生异常时,返回默认值
     * @return
     */
    public String convertToString(Object value, String defaultValue){

        if (value == null || "".equals(value.toString().trim())){
            return defaultValue;
        }

        //普通数据类型先转化
        try {
            return String.valueOf(value);
        }catch (Exception e){

            try {
                return value.toString();
            }catch (Exception e1) {
                return defaultValue;
            }
        }
    }
}


================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_border_stroke.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item>
        <shape>
            <stroke
                android:dashGap="2dp"
                android:dashWidth="2dp"
                android:width="1dp"
                android:color="#40b5ef" />

            <solid android:color="#FFFFFF" />

            <corners android:radius="0dp" />
        </shape>
    </item>

</layer-list>

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_cir_hint_bg.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">


    <item android:state_pressed="false"><shape>
            <solid android:color="#99ffffff" />

            <corners android:bottomLeftRadius="2dip" android:bottomRightRadius="2dip" android:topLeftRadius="2dip" android:topRightRadius="2dip" />
        </shape></item>

</selector>

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_cir_rect.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true"><shape>
            <solid android:color="#fd8111" />

            <corners android:bottomLeftRadius="2dip" android:bottomRightRadius="2dip" android:topLeftRadius="2dip" android:topRightRadius="2dip" />
        </shape></item>
    <item android:state_pressed="false"><shape>
            <solid android:color="#fd9538" />

            <corners android:bottomLeftRadius="2dip" android:bottomRightRadius="2dip" android:topLeftRadius="2dip" android:topRightRadius="2dip" />
        </shape></item>

</selector>

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_drawable_1.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="false" android:state_enabled="true">
        <shape>
            <solid android:color="#ff606d" />

            <corners android:bottomLeftRadius="3dip" android:bottomRightRadius="3dip" android:topLeftRadius="3dip" android:topRightRadius="3dip" />
        </shape>
    </item>
        
    <item android:state_pressed="true" android:state_enabled="true">
        <shape>
            <solid android:color="#ff4a58" />
            
            <corners android:bottomLeftRadius="3dip" android:bottomRightRadius="3dip" android:topLeftRadius="3dip" android:topRightRadius="3dip" />
        </shape>
    </item>
    
    <item android:state_enabled="false">
        <shape>
            <solid android:color="#ff858f" />
            
            <corners android:bottomLeftRadius="3dip" android:bottomRightRadius="3dip" android:topLeftRadius="3dip" android:topRightRadius="3dip" />
        </shape>
    </item>

</selector>

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_drawable_2.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="false"><shape>
            <solid android:color="#00000000" />

            <stroke android:width="1dp" android:color="#c6c6c6"></stroke>

            <corners android:radius="3dp" />
        </shape></item>

</selector>

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_drawable_3.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="false"><shape>
            <solid android:color="#00000000" />

            <stroke android:width="1dp" android:color="#c6c6c6" />

            <corners android:bottomLeftRadius="3dip" android:topLeftRadius="3dip" />
        </shape></item>

</selector>

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_drawable_33.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="false"><shape>
            <solid android:color="#ff606d" />

            <corners android:bottomLeftRadius="3dip" android:topLeftRadius="3dip" />
        </shape></item>

</selector>

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_drawable_4.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="false"><shape>
            <solid android:color="#00000000" />

            <stroke android:width="1dp" android:color="#c6c6c6" />

            <corners android:bottomRightRadius="3dip" android:topRightRadius="3dip" />
        </shape></item>

</selector>

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_drawable_44.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="false"><shape>
            <solid android:color="#ff606d" />

            <corners android:bottomRightRadius="3dip" android:topRightRadius="3dip" />
        </shape></item>

</selector>

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_drawable_5.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/youxun_login_11" android:state_checked="true" android:state_enabled="true"/>
    <item android:drawable="@drawable/youxun_login_12" android:state_checked="false" android:state_enabled="true"/>

</selector>

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_drawable_6.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="false">
        <shape>
            <solid android:color="#ffffff" />

            <stroke android:width="1dp" android:color="#c6c6c6"></stroke>
        </shape>
	</item>

</selector>

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_service_rect.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="false"><shape>
            <solid android:color="#fff2e4" />

            <stroke android:width="1px" android:color="#fc9439"></stroke>

            <corners android:radius="0dp" />
        </shape></item>

</selector>

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_account.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@null" >

    <include layout="@layout/youxun_account_login" />

    <include layout="@layout/youxun_account_reg" />

</FrameLayout>

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_account_hint.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:background="@drawable/youxun_cir_hint_bg"
        android:gravity="center"
        android:orientation="horizontal"
        android:paddingLeft="20dp"
        android:paddingRight="20dp" >

        <ImageView
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:contentDescription="@null"
            android:src="@drawable/youxun_acchint_logo" />

        <TextView
            android:id="@+id/youxun_account_hint_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:singleLine="true"
            android:textColor="#000000"
            android:textSize="12sp" />
    </LinearLayout>

</RelativeLayout>

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_account_login.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/youxun_account_login_rl"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@null"
    android:visibility="gone" >

    <RelativeLayout
        android:layout_width="402dp"
        android:layout_height="216dp"
        android:layout_centerInParent="true"
        android:background="@drawable/youxun_login_1" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <ImageView
                android:layout_width="116dp"
                android:layout_height="140dp"
                android:layout_marginTop="12.5dp"
                android:padding="16dp"
                android:src="@drawable/youxun_login_8" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginRight="10dp"
                android:orientation="vertical" >

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="45dp"
                    android:layout_marginTop="10dp"
                    android:background="@drawable/youxun_drawable_2" >

                    <ImageView
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:layout_centerVertical="true"
                        android:layout_marginLeft="10dp"
                        android:src="@drawable/youxun_login_6" />

                    <EditText
                        android:id="@+id/youxun_account_login_acc"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_marginLeft="40dip"
                        android:layout_marginRight="35dip"
                        android:background="@null"
                        android:hint="请输入用户名"
                        android:imeOptions="flagNoExtractUi"
                        android:singleLine="true"
                        android:textColor="#474747"
                        android:textColorHint="#c6c6c6"
                        android:textSize="14sp" />

                    <ImageView
                        android:id="@+id/youxun_account_login_acc_close"
                        android:layout_width="35dp"
                        android:layout_height="35dp"
                        android:layout_alignParentRight="true"
                        android:layout_centerVertical="true"
                        android:padding="10dp"
                        android:src="@drawable/youxun_login_9"
                        android:visibility="gone" />
                </RelativeLayout>

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="45dp"
                    android:layout_marginTop="5dp"
                    android:background="@drawable/youxun_drawable_2" >

                    <ImageView
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:layout_centerVertical="true"
                        android:layout_marginLeft="10dp"
                        android:src="@drawable/youxun_login_7" />

                    <EditText
                        android:id="@+id/youxun_account_login_pass"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_marginLeft="40dip"
                        android:layout_marginRight="35dp"
                        android:background="@null"
                        android:hint="请输入密码"
                        android:imeOptions="flagNoExtractUi"
                        android:inputType="textPassword"
                        android:singleLine="true"
                        android:textColor="#474747"
                        android:textColorHint="#c6c6c6"
                        android:textSize="14sp" />

                    <ImageView
                        android:id="@+id/youxun_account_login_pass_close"
                        android:layout_width="35dp"
                        android:layout_height="35dp"
                        android:layout_alignParentRight="true"
                        android:layout_centerVertical="true"
                        android:padding="10dp"
                        android:src="@drawable/youxun_login_9"
                        android:visibility="gone" />
                </RelativeLayout>

                <Button
                    android:id="@+id/youxun_account_login_btn"
                    android:layout_width="match_parent"
                    android:layout_height="45dp"
                    android:layout_marginTop="5dp"
                    android:background="@drawable/youxun_drawable_1"
                    android:enabled="false"
                    android:text="登录"
                    android:textColor="#ffffff"
                    android:textSize="14sp" />
            </LinearLayout>
        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="50dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:background="#c6c6c6" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_alignParentBottom="true"
            android:orientation="horizontal" >

            <LinearLayout
                android:id="@+id/youxun_account_login_forget"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_weight="1.0"
                android:gravity="center"
                android:orientation="horizontal" >

                <ImageView
                    android:layout_width="20dp"
                    android:layout_height="20dp"
                    android:src="@drawable/youxun_login_7" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="5dp"
                    android:text="忘记密码>"
                    android:textColor="#919191"
                    android:textSize="14sp" />
            </LinearLayout>

            <LinearLayout
                android:id="@+id/youxun_account_login_reg"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_weight="1.0"
                android:gravity="center"
                android:orientation="horizontal" >

                <ImageView
                    android:layout_width="20dp"
                    android:layout_height="20dp"
                    android:src="@drawable/youxun_login_6" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="5dp"
                    android:text="账号注册>"
                    android:textColor="#919191"
                    android:textSize="14sp" />
            </LinearLayout>
        </LinearLayout>

        <ImageButton
            android:id="@+id/youxun_account_login_back"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="10dp"
            android:background="@null"
            android:src="@drawable/youxun_login_5" />
    </RelativeLayout>

</RelativeLayout>

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_account_reg.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/youxun_account_reg_rl"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@null"
    android:visibility="gone" >

    <RelativeLayout
        android:layout_width="402dp"
        android:layout_height="216dp"
        android:layout_centerInParent="true"
        android:background="@drawable/youxun_login_1" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <ImageView
                android:layout_width="116dp"
                android:layout_height="140dp"
                android:layout_marginTop="12.5dp"
                android:padding="16dp"
                android:src="@drawable/youxun_login_8" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginRight="10dp"
                android:orientation="vertical" >

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="45dp"
                    android:layout_marginTop="10dp"
                    android:background="@drawable/youxun_drawable_2" >

                    <ImageView
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:layout_centerVertical="true"
                        android:layout_marginLeft="10dp"
                        android:src="@drawable/youxun_login_6" />

                    <EditText
                        android:id="@+id/youxun_account_reg_acc"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_marginLeft="40dip"
                        android:layout_marginRight="35dip"
                        android:background="@null"
                        android:hint="请输入用户名"
                        android:imeOptions="flagNoExtractUi"
                        android:singleLine="true"
                        android:textColor="#474747"
                        android:textColorHint="#c6c6c6"
                        android:textSize="14sp" />

                    <ImageView
                        android:id="@+id/youxun_account_reg_acc_close"
                        android:layout_width="35dp"
                        android:layout_height="35dp"
                        android:layout_alignParentRight="true"
                        android:layout_centerVertical="true"
                        android:padding="10dp"
                        android:src="@drawable/youxun_login_9"
                        android:visibility="gone" />
                </RelativeLayout>

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="45dp"
                    android:layout_marginTop="5dp"
                    android:background="@drawable/youxun_drawable_2" >

                    <ImageView
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:layout_centerVertical="true"
                        android:layout_marginLeft="10dp"
                        android:src="@drawable/youxun_login_7" />

                    <EditText
                        android:id="@+id/youxun_account_reg_pass1"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_marginLeft="40dip"
                        android:layout_marginRight="35dp"
                        android:background="@null"
                        android:hint="请输入密码"
                        android:imeOptions="flagNoExtractUi"
                        android:inputType="textPassword"
                        android:singleLine="true"
                        android:textColor="#474747"
                        android:textColorHint="#c6c6c6"
                        android:textSize="14sp" />

                    <ImageView
                        android:id="@+id/youxun_account_reg_pass_close1"
                        android:layout_width="35dp"
                        android:layout_height="35dp"
                        android:layout_alignParentRight="true"
                        android:layout_centerVertical="true"
                        android:padding="10dp"
                        android:src="@drawable/youxun_login_9"
                        android:visibility="gone" />
                </RelativeLayout>

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="45dp"
                    android:layout_marginTop="5dp"
                    android:background="@drawable/youxun_drawable_2" >

                    <ImageView
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:layout_centerVertical="true"
                        android:layout_marginLeft="10dp"
                        android:src="@drawable/youxun_login_7" />

                    <EditText
                        android:id="@+id/youxun_account_reg_pass2"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_marginLeft="40dip"
                        android:layout_marginRight="35dp"
                        android:background="@null"
                        android:hint="确认密码"
                        android:imeOptions="flagNoExtractUi"
                        android:inputType="textPassword"
                        android:singleLine="true"
                        android:textColor="#474747"
                        android:textColorHint="#c6c6c6"
                        android:textSize="14sp" />

                    <ImageView
                        android:id="@+id/youxun_account_reg_pass_close2"
                        android:layout_width="35dp"
                        android:layout_height="35dp"
                        android:layout_alignParentRight="true"
                        android:layout_centerVertical="true"
                        android:padding="10dp"
                        android:src="@drawable/youxun_login_9"
                        android:visibility="gone" />
                </RelativeLayout>

                <Button
                    android:id="@+id/youxun_account_reg_btn"
                    android:layout_width="match_parent"
                    android:layout_height="45dp"
                    android:layout_marginTop="5dp"
                    android:background="@drawable/youxun_drawable_1"
                    android:enabled="false"
                    android:text="注册并登录"
                    android:textColor="#ffffff"
                    android:textSize="14sp" />
            </LinearLayout>
        </LinearLayout>

        <ImageButton
            android:id="@+id/youxun_account_reg_back"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="10dp"
            android:background="@null"
            android:src="@drawable/youxun_login_5" />
    </RelativeLayout>

</RelativeLayout>

================================================
FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_bound.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/youxun_bound_rl"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@null" >

    <RelativeLayout
        android:id="@+id/youxun_bound_phone_rl"
        android:layout_width="402dp"
        android:layout_height="165dp"
        android:layout_centerInParent="true"
        android:background="@drawable/youxun_login_1"
        android:visibility="gone" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <ImageView
                android:layout_width="116dp"
                android:layout_height="140dp"
                android:layout_marginTop="12.5dp"
                android:padding="16dp"
                android:src="@drawable/youxun_login_8" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginRight="10dp"
                android:orientation="vertical" >

                <RelativeLayout
        
Download .txt
gitextract_qbthkmxs/

├── .gitignore
├── GameSDKBuildJarTool/
│   ├── .gitignore
│   ├── build.gradle
│   ├── libs/
│   │   ├── common-24.3.0.jar
│   │   ├── guava-18.0.jar
│   │   ├── manifest-merger-24.3.0.jar
│   │   ├── proguard.jar
│   │   ├── retrace.jar
│   │   └── sdk-common-25.1.2.jar
│   ├── src/
│   │   └── main/
│   │       ├── cmd/
│   │       │   └── test/
│   │       │       ├── jar/
│   │       │       │   ├── test.jar
│   │       │       │   └── test_proguard.jar
│   │       │       ├── java/
│   │       │       │   ├── HelloWorld.java
│   │       │       │   └── TestA.java
│   │       │       └── proguard/
│   │       │           ├── proguard_config.pro
│   │       │           └── tools/
│   │       │               ├── proguard.jar
│   │       │               └── rt.jar
│   │       ├── java/
│   │       │   └── com/
│   │       │       └── bzai/
│   │       │           └── gamesdk/
│   │       │               └── build/
│   │       │                   ├── BuildJarTask.java
│   │       │                   ├── Config.java
│   │       │                   ├── Main.java
│   │       │                   ├── bean/
│   │       │                   │   ├── ErrorMsg.java
│   │       │                   │   └── Project.java
│   │       │                   ├── tools/
│   │       │                   │   ├── JavaTool.java
│   │       │                   │   ├── ProGuardTool.java
│   │       │                   │   ├── ServerTool.java
│   │       │                   │   └── exec/
│   │       │                   │       └── Shell.java
│   │       │                   └── utils/
│   │       │                       ├── FileUtils.java
│   │       │                       └── Utils.java
│   │       └── resources/
│   │           ├── config
│   │           ├── proguard_config.pro
│   │           └── project_list
│   └── 必读说明
├── GameSDKDemo_Release/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── bzai/
│       │               └── gamesdkframe/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── bzai/
│       │   │           └── gamesdkframe/
│       │   │               └── demo/
│       │   │                   ├── GameApplication.java
│       │   │                   └── GameSDKMain.java
│       │   └── res/
│       │       ├── layout/
│       │       │   └── activity_main.xml
│       │       └── values/
│       │           ├── colors.xml
│       │           └── strings.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── bzai/
│                       └── gamesdkframe/
│                           └── ExampleUnitTest.java
├── GameSDKLibrary_Release/
│   ├── .gitignore
│   ├── build.gradle
│   ├── libs/
│   │   ├── alipaySdk-20180601.jar
│   │   ├── android-support-v4.jar
│   │   ├── org.apache.http.legacy.jar
│   │   ├── sdk_test_v1.0.0.jar
│   │   └── wechat-sdk-android-without-mta-5.1.4.jar
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── suyutech/
│       │               └── baselibrary/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── assets/
│       │   │   ├── Channel_config.txt
│       │   │   ├── Plugin_config.txt
│       │   │   ├── Project_config.txt
│       │   │   └── SDKInfo.json
│       │   └── res/
│       │       └── values/
│       │           └── strings.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── suyutech/
│                       └── baselibrary/
│                           └── ExampleUnitTest.java
├── GameSDK_API/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── bzai/
│       │               └── gamesdk/
│       │                   └── api/
│       │                       └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── bzai/
│       │               └── gamesdk/
│       │                   ├── GameInfoSetting.java
│       │                   ├── SDKApplication.java
│       │                   ├── api/
│       │                   │   └── SDKAPI.java
│       │                   ├── bean/
│       │                   │   ├── info/
│       │                   │   │   ├── AccountEventResultInfo.java
│       │                   │   │   └── PlayerInfo.java
│       │                   │   └── params/
│       │                   │       ├── GameRoleParams.java
│       │                   │       └── PayParams.java
│       │                   └── listener/
│       │                       ├── AccountCallBackLister.java
│       │                       ├── ExitCallBackLister.java
│       │                       ├── InitCallBackLister.java
│       │                       └── PurchaseCallBackListener.java
│       └── test/
│           └── java/
│               └── com/
│                   └── bzai/
│                       └── gamesdk/
│                           └── api/
│                               └── ExampleUnitTest.java
├── GameSDK_BeginProject/
│   ├── GameSDK_Project_Custom/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── androidTest/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── bzai/
│   │       │               └── gamesdk/
│   │       │                   └── project/
│   │       │                       └── channel/
│   │       │                           └── ExampleInstrumentedTest.java
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   ├── assets/
│   │       │   │   ├── Plugin_config.txt
│   │       │   │   ├── Project_config.txt
│   │       │   │   └── SDKInfo.json
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── bzai/
│   │       │               └── gamesdk/
│   │       │                   └── project/
│   │       │                       ├── CustomProject.java
│   │       │                       └── ProjectApplication.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── bzai/
│   │                       └── gamesdk/
│   │                           └── project/
│   │                               └── channel/
│   │                                   └── ExampleUnitTest.java
│   └── GameSDK_Project_JuHe/
│       ├── .gitignore
│       ├── build.gradle
│       ├── proguard-rules.pro
│       └── src/
│           ├── androidTest/
│           │   └── java/
│           │       └── com/
│           │           └── bzai/
│           │               └── gamesdk/
│           │                   └── project/
│           │                       └── juhe/
│           │                           └── ExampleInstrumentedTest.java
│           ├── main/
│           │   ├── AndroidManifest.xml
│           │   ├── assets/
│           │   │   ├── Plugin_config.txt
│           │   │   ├── Project_config.txt
│           │   │   └── SDKInfo.json
│           │   └── java/
│           │       └── com/
│           │           └── bzai/
│           │               └── gamesdk/
│           │                   └── project/
│           │                       ├── JuHeProject.java
│           │                       └── ProjectApplication.java
│           └── test/
│               └── java/
│                   └── com/
│                       └── bzai/
│                           └── gamesdk/
│                               └── project/
│                                   └── juhe/
│                                       └── ExampleUnitTest.java
├── GameSDK_Channel/
│   ├── GameSDK_Channel_Lexiang/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── libs/
│   │   │   ├── HeepayPlugin_v3.0.jar
│   │   │   ├── eventbus-3.0.0.jar
│   │   │   └── youxunsdk.jar
│   │   ├── proguard-rules.pro
│   │   ├── src/
│   │   │   ├── androidTest/
│   │   │   │   └── java/
│   │   │   │       └── com/
│   │   │   │           └── bzai/
│   │   │   │               └── gamesdk/
│   │   │   │                   └── channel/
│   │   │   │                       └── test/
│   │   │   │                           └── ExampleInstrumentedTest.java
│   │   │   ├── main/
│   │   │   │   ├── AndroidManifest.xml
│   │   │   │   ├── assets/
│   │   │   │   │   └── Channel_config.txt
│   │   │   │   ├── java/
│   │   │   │   │   └── com/
│   │   │   │   │       └── bzai/
│   │   │   │   │           └── gamesdk/
│   │   │   │   │               └── channel/
│   │   │   │   │                   ├── application/
│   │   │   │   │                   │   └── ChannelApplication.java
│   │   │   │   │                   └── lexiang/
│   │   │   │   │                       └── LexiangSDK.java
│   │   │   │   └── res/
│   │   │   │       ├── drawable/
│   │   │   │       │   ├── youxun_border_stroke.xml
│   │   │   │       │   ├── youxun_cir_hint_bg.xml
│   │   │   │       │   ├── youxun_cir_rect.xml
│   │   │   │       │   ├── youxun_drawable_1.xml
│   │   │   │       │   ├── youxun_drawable_2.xml
│   │   │   │       │   ├── youxun_drawable_3.xml
│   │   │   │       │   ├── youxun_drawable_33.xml
│   │   │   │       │   ├── youxun_drawable_4.xml
│   │   │   │       │   ├── youxun_drawable_44.xml
│   │   │   │       │   ├── youxun_drawable_5.xml
│   │   │   │       │   ├── youxun_drawable_6.xml
│   │   │   │       │   └── youxun_service_rect.xml
│   │   │   │       └── layout/
│   │   │   │           ├── youxun_account.xml
│   │   │   │           ├── youxun_account_hint.xml
│   │   │   │           ├── youxun_account_login.xml
│   │   │   │           ├── youxun_account_reg.xml
│   │   │   │           ├── youxun_bound.xml
│   │   │   │           ├── youxun_dialog.xml
│   │   │   │           ├── youxun_dialog2.xml
│   │   │   │           ├── youxun_dialog3.xml
│   │   │   │           ├── youxun_floating.xml
│   │   │   │           ├── youxun_gb_dialog.xml
│   │   │   │           ├── youxun_gb_item.xml
│   │   │   │           ├── youxun_gb_menu.xml
│   │   │   │           ├── youxun_gift_bag.xml
│   │   │   │           ├── youxun_login.xml
│   │   │   │           ├── youxun_login_footprint.xml
│   │   │   │           ├── youxun_login_menu.xml
│   │   │   │           ├── youxun_login_option_item.xml
│   │   │   │           ├── youxun_login_popup.xml
│   │   │   │           ├── youxun_menu_2.xml
│   │   │   │           ├── youxun_menu_3.xml
│   │   │   │           ├── youxun_menu_4.xml
│   │   │   │           ├── youxun_mobile.xml
│   │   │   │           ├── youxun_mobile_login.xml
│   │   │   │           ├── youxun_mobile_reg.xml
│   │   │   │           ├── youxun_mobile_verify.xml
│   │   │   │           ├── youxun_notice.xml
│   │   │   │           ├── youxun_pay.xml
│   │   │   │           ├── youxun_toast.xml
│   │   │   │           └── youxun_webview.xml
│   │   │   └── test/
│   │   │       └── java/
│   │   │           └── com/
│   │   │               └── bzai/
│   │   │                   └── gamesdk/
│   │   │                       └── channel/
│   │   │                           └── test/
│   │   │                               └── ExampleUnitTest.java
│   │   └── 开发者说明
│   └── GameSDK_Channel_Test/
│       ├── .gitignore
│       ├── build.gradle
│       ├── proguard-rules.pro
│       ├── src/
│       │   ├── androidTest/
│       │   │   └── java/
│       │   │       └── com/
│       │   │           └── bzai/
│       │   │               └── gamesdk/
│       │   │                   └── channel/
│       │   │                       └── test/
│       │   │                           └── ExampleInstrumentedTest.java
│       │   ├── main/
│       │   │   ├── AndroidManifest.xml
│       │   │   ├── assets/
│       │   │   │   └── Channel_config.txt
│       │   │   ├── java/
│       │   │   │   └── com/
│       │   │   │       └── bzai/
│       │   │   │           └── gamesdk/
│       │   │   │               └── channel/
│       │   │   │                   ├── application/
│       │   │   │                   │   └── ChannelApplication.java
│       │   │   │                   └── test/
│       │   │   │                       └── TestChannelSDK.java
│       │   │   └── res/
│       │   │       └── values/
│       │   │           └── strings.xml
│       │   └── test/
│       │       └── java/
│       │           └── com/
│       │               └── bzai/
│       │                   └── gamesdk/
│       │                       └── channel/
│       │                           └── test/
│       │                               └── ExampleUnitTest.java
│       └── 开发者说明
├── GameSDK_Manager/
│   ├── GameSDK_Module_Account/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── androidTest/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── bzai/
│   │       │               └── gamesdk/
│   │       │                   └── module/
│   │       │                       └── account/
│   │       │                           └── ExampleInstrumentedTest.java
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── bzai/
│   │       │               └── gamesdk/
│   │       │                   └── module/
│   │       │                       └── account/
│   │       │                           ├── AccountManager.java
│   │       │                           └── bean/
│   │       │                               ├── AccountBean.java
│   │       │                               └── AccountCallBackBean.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── bzai/
│   │                       └── gamesdk/
│   │                           └── module/
│   │                               └── account/
│   │                                   └── ExampleUnitTest.java
│   ├── GameSDK_Module_Init/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── androidTest/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── bzai/
│   │       │               └── gamesdk/
│   │       │                   └── module/
│   │       │                       └── init/
│   │       │                           └── ExampleInstrumentedTest.java
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── bzai/
│   │       │               └── gamesdk/
│   │       │                   └── module/
│   │       │                       └── init/
│   │       │                           └── InitManager.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── bzai/
│   │                       └── gamesdk/
│   │                           └── module/
│   │                               └── init/
│   │                                   └── ExampleUnitTest.java
│   └── GameSDK_Module_Purchase/
│       ├── .gitignore
│       ├── build.gradle
│       ├── proguard-rules.pro
│       └── src/
│           ├── androidTest/
│           │   └── java/
│           │       └── com/
│           │           └── bzai/
│           │               └── gamesdk/
│           │                   └── module/
│           │                       └── purchase/
│           │                           └── ExampleInstrumentedTest.java
│           ├── main/
│           │   ├── AndroidManifest.xml
│           │   ├── java/
│           │   │   └── com/
│           │   │       └── bzai/
│           │   │           └── gamesdk/
│           │   │               └── module/
│           │   │                   └── purchase/
│           │   │                       ├── PurchaseManager.java
│           │   │                       └── PurchaseResult.java
│           │   └── res/
│           │       └── values/
│           │           └── strings.xml
│           └── test/
│               └── java/
│                   └── com/
│                       └── bzai/
│                           └── gamesdk/
│                               └── module/
│                                   └── purchase/
│                                       └── ExampleUnitTest.java
├── GameSDK_Manager_Impl/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── bzai/
│       │               └── gamesdk/
│       │                   └── manager/
│       │                       └── impl/
│       │                           └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── bzai/
│       │   │           └── gamesdk/
│       │   │               └── invoke/
│       │   │                   └── plugin/
│       │   │                       ├── AlipayPluginApi.java
│       │   │                       └── WechatPluginApi.java
│       │   └── res/
│       │       └── values/
│       │           └── strings.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── bzai/
│                       └── gamesdk/
│                           └── manager/
│                               └── impl/
│                                   └── ExampleUnitTest.java
├── GameSDK_Plugin/
│   ├── GameSDK_Plugin_Alipay/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── libs/
│   │   │   └── alipaySdk-20180601.jar
│   │   ├── proguard-rules.pro
│   │   └── src/
│   │       ├── androidTest/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── bzai/
│   │       │               └── gamesdk/
│   │       │                   └── plugin/
│   │       │                       └── alipay/
│   │       │                           └── ExampleInstrumentedTest.java
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── bzai/
│   │       │   │           └── gamesdk/
│   │       │   │               └── plugin/
│   │       │   │                   └── alipay/
│   │       │   │                       ├── AlipayPlugin.java
│   │       │   │                       └── pay/
│   │       │   │                           ├── AlipayPay.java
│   │       │   │                           └── PayResult.java
│   │       │   └── res/
│   │       │       └── values/
│   │       │           └── strings.xml
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── bzai/
│   │                       └── gamesdk/
│   │                           └── plugin/
│   │                               └── alipay/
│   │                                   └── ExampleUnitTest.java
│   └── GameSDK_Plugin_Wechat/
│       ├── .gitignore
│       ├── build.gradle
│       ├── libs/
│       │   └── wechat-sdk-android-without-mta-5.1.4.jar
│       ├── proguard-rules.pro
│       └── src/
│           ├── androidTest/
│           │   └── java/
│           │       └── com/
│           │           └── bzai/
│           │               └── gamesdk/
│           │                   └── plugin/
│           │                       └── wechat/
│           │                           └── ExampleInstrumentedTest.java
│           ├── main/
│           │   ├── AndroidManifest.xml
│           │   └── java/
│           │       └── com/
│           │           └── bzai/
│           │               └── gamesdk/
│           │                   └── plugin/
│           │                       └── wechat/
│           │                           ├── WechatPlugin.java
│           │                           ├── login/
│           │                           │   └── WechatLogin.java
│           │                           └── pay/
│           │                               └── WechatPay.java
│           └── test/
│               └── java/
│                   └── com/
│                       └── bzai/
│                           └── gamesdk/
│                               └── plugin/
│                                   └── wechat/
│                                       └── ExampleUnitTest.java
├── GameSDK_Utils/
│   ├── .gitignore
│   ├── build.gradle
│   ├── libs/
│   │   ├── android-support-v4.jar
│   │   └── org.apache.http.legacy.jar
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── bzai/
│       │               └── gamesdk/
│       │                   └── utils/
│       │                       └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── com/
│       │           └── bzai/
│       │               └── gamesdk/
│       │                   └── common/
│       │                       ├── utils_base/
│       │                       │   ├── cache/
│       │                       │   │   └── ApplicationCache.java
│       │                       │   ├── config/
│       │                       │   │   ├── ErrCode.java
│       │                       │   │   └── TypeConfig.java
│       │                       │   ├── frame/
│       │                       │   │   ├── google/
│       │                       │   │   │   ├── gson/
│       │                       │   │   │   │   ├── DefaultDateTypeAdapter.java
│       │                       │   │   │   │   ├── ExclusionStrategy.java
│       │                       │   │   │   │   ├── FieldAttributes.java
│       │                       │   │   │   │   ├── FieldNamingPolicy.java
│       │                       │   │   │   │   ├── FieldNamingStrategy.java
│       │                       │   │   │   │   ├── Gson.java
│       │                       │   │   │   │   ├── GsonBuilder.java
│       │                       │   │   │   │   ├── InstanceCreator.java
│       │                       │   │   │   │   ├── JsonArray.java
│       │                       │   │   │   │   ├── JsonDeserializationContext.java
│       │                       │   │   │   │   ├── JsonDeserializer.java
│       │                       │   │   │   │   ├── JsonElement.java
│       │                       │   │   │   │   ├── JsonIOException.java
│       │                       │   │   │   │   ├── JsonNull.java
│       │                       │   │   │   │   ├── JsonObject.java
│       │                       │   │   │   │   ├── JsonParseException.java
│       │                       │   │   │   │   ├── JsonParser.java
│       │                       │   │   │   │   ├── JsonPrimitive.java
│       │                       │   │   │   │   ├── JsonSerializationContext.java
│       │                       │   │   │   │   ├── JsonSerializer.java
│       │                       │   │   │   │   ├── JsonStreamParser.java
│       │                       │   │   │   │   ├── JsonSyntaxException.java
│       │                       │   │   │   │   ├── LongSerializationPolicy.java
│       │                       │   │   │   │   ├── TreeTypeAdapter.java
│       │                       │   │   │   │   ├── TypeAdapter.java
│       │                       │   │   │   │   ├── TypeAdapterFactory.java
│       │                       │   │   │   │   ├── annotations/
│       │                       │   │   │   │   │   ├── Expose.java
│       │                       │   │   │   │   │   ├── SerializedName.java
│       │                       │   │   │   │   │   ├── Since.java
│       │                       │   │   │   │   │   ├── Until.java
│       │                       │   │   │   │   │   └── package-info.java
│       │                       │   │   │   │   ├── internal/
│       │                       │   │   │   │   │   ├── $Gson$Preconditions.java
│       │                       │   │   │   │   │   ├── $Gson$Types.java
│       │                       │   │   │   │   │   ├── ConstructorConstructor.java
│       │                       │   │   │   │   │   ├── Excluder.java
│       │                       │   │   │   │   │   ├── JsonReaderInternalAccess.java
│       │                       │   │   │   │   │   ├── LazilyParsedNumber.java
│       │                       │   │   │   │   │   ├── ObjectConstructor.java
│       │                       │   │   │   │   │   ├── Primitives.java
│       │                       │   │   │   │   │   ├── Streams.java
│       │                       │   │   │   │   │   ├── StringMap.java
│       │                       │   │   │   │   │   ├── UnsafeAllocator.java
│       │                       │   │   │   │   │   ├── bind/
│       │                       │   │   │   │   │   │   ├── ArrayTypeAdapter.java
│       │                       │   │   │   │   │   │   ├── CollectionTypeAdapterFactory.java
│       │                       │   │   │   │   │   │   ├── DateTypeAdapter.java
│       │                       │   │   │   │   │   │   ├── JsonTreeReader.java
│       │                       │   │   │   │   │   │   ├── JsonTreeWriter.java
│       │                       │   │   │   │   │   │   ├── MapTypeAdapterFactory.java
│       │                       │   │   │   │   │   │   ├── ObjectTypeAdapter.java
│       │                       │   │   │   │   │   │   ├── ReflectiveTypeAdapterFactory.java
│       │                       │   │   │   │   │   │   ├── SqlDateTypeAdapter.java
│       │                       │   │   │   │   │   │   ├── TimeTypeAdapter.java
│       │                       │   │   │   │   │   │   ├── TypeAdapterRuntimeTypeWrapper.java
│       │                       │   │   │   │   │   │   └── TypeAdapters.java
│       │                       │   │   │   │   │   └── package-info.java
│       │                       │   │   │   │   ├── package-info.java
│       │                       │   │   │   │   ├── reflect/
│       │                       │   │   │   │   │   ├── TypeToken.java
│       │                       │   │   │   │   │   └── package-info.java
│       │                       │   │   │   │   └── stream/
│       │                       │   │   │   │       ├── JsonReader.java
│       │                       │   │   │   │       ├── JsonScope.java
│       │                       │   │   │   │       ├── JsonToken.java
│       │                       │   │   │   │       ├── JsonWriter.java
│       │                       │   │   │   │       ├── MalformedJsonException.java
│       │                       │   │   │   │       └── StringPool.java
│       │                       │   │   │   └── volley/
│       │                       │   │   │       ├── AuthFailureError.java
│       │                       │   │   │       ├── Cache.java
│       │                       │   │   │       ├── CacheDispatcher.java
│       │                       │   │   │       ├── DefaultRetryPolicy.java
│       │                       │   │   │       ├── ExecutorDelivery.java
│       │                       │   │   │       ├── InternalUtils.java
│       │                       │   │   │       ├── Network.java
│       │                       │   │   │       ├── NetworkDispatcher.java
│       │                       │   │   │       ├── NetworkError.java
│       │                       │   │   │       ├── NetworkResponse.java
│       │                       │   │   │       ├── NoConnectionError.java
│       │                       │   │   │       ├── ParseError.java
│       │                       │   │   │       ├── RedirectError.java
│       │                       │   │   │       ├── Request.java
│       │                       │   │   │       ├── RequestQueue.java
│       │                       │   │   │       ├── Response.java
│       │                       │   │   │       ├── ResponseDelivery.java
│       │                       │   │   │       ├── RetryPolicy.java
│       │                       │   │   │       ├── ServerError.java
│       │                       │   │   │       ├── TimeoutError.java
│       │                       │   │   │       ├── VolleyError.java
│       │                       │   │   │       ├── VolleyLog.java
│       │                       │   │   │       └── toolbox/
│       │                       │   │   │           ├── AndroidAuthenticator.java
│       │                       │   │   │           ├── Authenticator.java
│       │                       │   │   │           ├── BasicNetwork.java
│       │                       │   │   │           ├── ByteArrayPool.java
│       │                       │   │   │           ├── ClearCacheRequest.java
│       │                       │   │   │           ├── DiskBasedCache.java
│       │                       │   │   │           ├── HttpClientStack.java
│       │                       │   │   │           ├── HttpHeaderParser.java
│       │                       │   │   │           ├── HttpStack.java
│       │                       │   │   │           ├── HurlStack.java
│       │                       │   │   │           ├── ImageLoader.java
│       │                       │   │   │           ├── ImageRequest.java
│       │                       │   │   │           ├── JsonArrayRequest.java
│       │                       │   │   │           ├── JsonObjectRequest.java
│       │                       │   │   │           ├── JsonRequest.java
│       │                       │   │   │           ├── NetworkImageView.java
│       │                       │   │   │           ├── NoCache.java
│       │                       │   │   │           ├── PoolingByteArrayOutputStream.java
│       │                       │   │   │           ├── RequestFuture.java
│       │                       │   │   │           ├── StringRequest.java
│       │                       │   │   │           └── Volley.java
│       │                       │   │   ├── logger/
│       │                       │   │   │   ├── AndroidLogAdapter.java
│       │                       │   │   │   ├── CsvFormatStrategy.java
│       │                       │   │   │   ├── DiskLogAdapter.java
│       │                       │   │   │   ├── DiskLogStrategy.java
│       │                       │   │   │   ├── FormatStrategy.java
│       │                       │   │   │   ├── LogAdapter.java
│       │                       │   │   │   ├── LogStrategy.java
│       │                       │   │   │   ├── LogcatLogStrategy.java
│       │                       │   │   │   ├── Logger.java
│       │                       │   │   │   ├── LoggerPrinter.java
│       │                       │   │   │   ├── PrettyFormatStrategy.java
│       │                       │   │   │   ├── Printer.java
│       │                       │   │   │   └── Utils.java
│       │                       │   │   └── walle/
│       │                       │   │       ├── WalleChannelReader.java
│       │                       │   │       └── payload_reader/
│       │                       │   │           ├── ApkUtil.java
│       │                       │   │           ├── ChannelInfo.java
│       │                       │   │           ├── ChannelReader.java
│       │                       │   │           ├── Pair.java
│       │                       │   │           ├── PayloadReader.java
│       │                       │   │           └── SignatureNotFoundException.java
│       │                       │   ├── interfaces/
│       │                       │   │   ├── CallBackListener.java
│       │                       │   │   └── LifeCycleInterface.java
│       │                       │   ├── net/
│       │                       │   │   ├── RequestExecutor.java
│       │                       │   │   ├── base/
│       │                       │   │   │   ├── VolleyRequestWrapper.java
│       │                       │   │   │   ├── VolleyResponseListener.java
│       │                       │   │   │   └── VolleySingleton.java
│       │                       │   │   ├── impl/
│       │                       │   │   │   ├── BaseRequest.java
│       │                       │   │   │   ├── BaseRequestCallback.java
│       │                       │   │   │   ├── BaseRequestUtils.java
│       │                       │   │   │   └── bean/
│       │                       │   │   │       └── ResponseResult.java
│       │                       │   │   └── request/
│       │                       │   │       ├── IRequestManager.java
│       │                       │   │       ├── RequestCallback.java
│       │                       │   │       └── VolleyRequestManager.java
│       │                       │   ├── parse/
│       │                       │   │   ├── channel/
│       │                       │   │   │   ├── Channel.java
│       │                       │   │   │   ├── ChannelBeanList.java
│       │                       │   │   │   ├── ChannelListenerImpl.java
│       │                       │   │   │   └── ChannelManager.java
│       │                       │   │   ├── plugin/
│       │                       │   │   │   ├── Plugin.java
│       │                       │   │   │   ├── PluginBeanList.java
│       │                       │   │   │   ├── PluginManager.java
│       │                       │   │   │   └── PluginReflectApi.java
│       │                       │   │   └── project/
│       │                       │   │       ├── Project.java
│       │                       │   │       ├── ProjectBeanList.java
│       │                       │   │       └── ProjectManager.java
│       │                       │   ├── proguard/
│       │                       │   │   ├── ProguardInterface.java
│       │                       │   │   └── ProguardObject.java
│       │                       │   └── utils/
│       │                       │       ├── ArrayUtils.java
│       │                       │       ├── CodeUtils.java
│       │                       │       ├── ContextUtils.java
│       │                       │       ├── CryptUtils.java
│       │                       │       ├── DateUtils.java
│       │                       │       ├── FileUtils.java
│       │                       │       ├── IOUtils.java
│       │                       │       ├── JsonUtils.java
│       │                       │       ├── ListUtils.java
│       │                       │       ├── LogUtils.java
│       │                       │       ├── Md5Utils.java
│       │                       │       ├── ObjectUtils.java
│       │                       │       └── StringUtils.java
│       │                       ├── utils_business/
│       │                       │   ├── cache/
│       │                       │   │   ├── BaseCache.java
│       │                       │   │   ├── SDKInfoCache.java
│       │                       │   │   └── SharePreferencesCache.java
│       │                       │   └── config/
│       │                       │       ├── KeyConfig.java
│       │                       │       └── UrlConfig.java
│       │                       └── utils_ui/
│       │                           ├── BitmapUtils.java
│       │                           ├── LoadingUtils.java
│       │                           ├── ResourseIdUtils.java
│       │                           ├── ToastUtils.java
│       │                           └── activity/
│       │                               └── SplashActivity.java
│       └── test/
│           └── java/
│               └── com/
│                   └── bzai/
│                       └── gamesdk/
│                           └── utils/
│                               └── ExampleUnitTest.java
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── bzai/
│       │               └── gamesdkframe/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── bzai/
│       │   │           └── gamesdkframe/
│       │   │               ├── GameApplication.java
│       │   │               └── GameSDKMain.java
│       │   └── res/
│       │       ├── layout/
│       │       │   └── activity_main.xml
│       │       └── values/
│       │           ├── colors.xml
│       │           └── strings.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── bzai/
│                       └── gamesdkframe/
│                           └── ExampleUnitTest.java
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── 框架必读说明
Download .txt
SYMBOL INDEX (2208 symbols across 251 files)

FILE: GameSDKBuildJarTool/src/main/cmd/test/java/HelloWorld.java
  class HelloWorld (line 3) | public class HelloWorld {
    method main (line 5) | public static void main(String[] args){
    method test (line 10) | public static void test(){

FILE: GameSDKBuildJarTool/src/main/cmd/test/java/TestA.java
  class TestA (line 3) | public class TestA {
    method Test (line 7) | public void Test(){

FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/BuildJarTask.java
  class BuildJarTask (line 25) | public class BuildJarTask implements Runnable{
    method run (line 27) | @Override
    method buildJar (line 100) | private ErrorMsg buildJar(List<Project> projectList, String jarOutputP...
    method buildResourceFile (line 179) | public void buildResourceFile(String resourceOutputPath, List<Project>...
    method getClasspath (line 273) | private String getClasspath(Project project, List<Project> projectList){
    method getMinSdkVersionPath (line 314) | private String getMinSdkVersionPath(){

FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/Config.java
  class Config (line 17) | public class Config {
    method Config (line 47) | private Config(){
    method getInstance (line 50) | public static Config getInstance(){
    method loadConfig (line 64) | public void loadConfig() throws IOException{
    method getProject (line 87) | public List<Project> getProject() throws IOException{
    method get_config_file_path (line 117) | public String get_config_file_path(String file_name){
    method getAndroidSdkPath (line 129) | public String getAndroidSdkPath() {
    method setAndroidSdkPath (line 133) | public void setAndroidSdkPath(String androidSdkPath) {
    method getTargetSdkVersion (line 137) | public String getTargetSdkVersion() {
    method setTargetSdkVersion (line 141) | public void setTargetSdkVersion(String targetSdkVersion) {
    method getJarName (line 145) | public String getJarName() {
    method setJarName (line 149) | public void setJarName(String jarName) {
    method getJarVersion (line 153) | public String getJarVersion() {
    method setJarVersion (line 157) | public void setJarVersion(String jarVersion) {
    method getOutPutPath (line 161) | public String getOutPutPath() {
    method setOutPutPath (line 165) | public void setOutPutPath(String outPutPath) {

FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/Main.java
  class Main (line 3) | public class Main {
    method main (line 5) | public static void main(String[] args){

FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/bean/ErrorMsg.java
  class ErrorMsg (line 6) | public class ErrorMsg {
    method ErrorMsg (line 12) | public ErrorMsg(int code, String message){
    method ErrorMsg (line 17) | public ErrorMsg(int code, String message, Exception e){
    method getCode (line 23) | public int getCode() {
    method setCode (line 27) | public void setCode(int code) {
    method getMessage (line 31) | public String getMessage() {
    method setMessage (line 35) | public void setMessage(String message) {

FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/bean/Project.java
  class Project (line 8) | public class Project {
    method getName (line 116) | public String getName() {
    method setName (line 120) | public void setName(String name) {
    method getPath (line 124) | public String getPath() {
    method setPath (line 128) | public void setPath(String path) {
    method getVersion (line 132) | public int getVersion() {
    method setVersion (line 136) | public void setVersion(int version) {
    method getUrl (line 140) | public String getUrl() {
    method setUrl (line 144) | public void setUrl(String url) {

FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/tools/JavaTool.java
  class JavaTool (line 17) | public class JavaTool {
    method compile (line 20) | public static void compile(String sourceCodePath, String classPath, St...
    method classFilesToJar (line 104) | public static void classFilesToJar(String classFilesPath, String jarOu...

FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/tools/ProGuardTool.java
  class ProGuardTool (line 14) | public class ProGuardTool {
    method run (line 25) | public static void run(String inputJar, String classPath, String progu...
    method run (line 72) | public static void run(String proguardToolPath, String inputJar, Strin...

FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/tools/ServerTool.java
  class ServerTool (line 19) | public class ServerTool {
    method DownServerResource (line 21) | public static void DownServerResource(List<Project> projectList, Strin...

FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/tools/exec/Shell.java
  class Shell (line 8) | public class Shell {
    method execute (line 10) | public static void execute(List<String> commandSet, String logOutput) ...
    class StreamForwarder (line 47) | static class StreamForwarder extends Thread{
      method StreamForwarder (line 54) | StreamForwarder(InputStream is, OutputStreamWriter os, int streamTyp...
      method run (line 61) | @Override

FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/utils/FileUtils.java
  class FileUtils (line 13) | public class FileUtils {
    method fileCopy (line 18) | public static void fileCopy(String srcPath, String destPath, boolean i...
    method smaliFileCopy (line 40) | public static void smaliFileCopy(final String appFirstSmaliPath, final...
    method copy (line 125) | public static void copy(final String srcPath,final String destPath, fi...
    method getFileList (line 185) | public static List<String> getFileList(String srcPath, final String fi...
    method copy (line 230) | public static void copy(final String srcPath, final String destPath,
    method move (line 292) | public static void move(String srcPath, String destPath, final boolean...
    method copy (line 351) | public static void copy(final String srcPath,final String destPath,
    method delete (line 422) | public static void delete(String path) throws IOException {
    method deleteChildFile (line 466) | public static void deleteChildFile(String path) throws IOException {
    method deleteIfExists (line 485) | public static void deleteIfExists(String path) throws IOException {
    method exists (line 534) | public static boolean exists(String path){
    method createDirectories (line 547) | public static void createDirectories(String path, boolean isDeleteExis...
    method getAllFilesRelativePath (line 562) | public static List<String> getAllFilesRelativePath(String filePath){
    method createDirectory (line 597) | public static void createDirectory(String path, boolean isDeleteExists...
    method createDirectory (line 617) | public static void createDirectory(String path) throws IOException {
    method createDirectories (line 628) | public static void createDirectories(String path) throws IOException {
    method createDirectoriesIfNonExists (line 639) | public static void createDirectoriesIfNonExists(String path) throws IO...
    method createDirectoryIfNonExists (line 656) | public static void createDirectoryIfNonExists(String path) throws IOEx...
    method createFile (line 674) | public static void createFile(String path, boolean isDeleteIfExists) t...

FILE: GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/utils/Utils.java
  class Utils (line 5) | public class Utils {
    method isWindows (line 21) | public static boolean isWindows() {
    method isEmpty (line 25) | public static boolean isEmpty(String str){
    method getJarPathSet (line 39) | public static String getJarPathSet(String libsPath, String delimiter){

FILE: GameSDKDemo_Release/src/androidTest/java/com/bzai/gamesdkframe/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: GameSDKDemo_Release/src/main/java/com/bzai/gamesdkframe/demo/GameApplication.java
  class GameApplication (line 14) | public class GameApplication extends SDKApplication {
    method attachBaseContext (line 16) | @Override
    method onCreate (line 21) | @Override

FILE: GameSDKDemo_Release/src/main/java/com/bzai/gamesdkframe/demo/GameSDKMain.java
  class GameSDKMain (line 28) | public class GameSDKMain extends Activity implements View.OnClickListener{
    method onCreate (line 35) | @Override
    method initView (line 45) | private void initView(){
    method onClick (line 58) | @Override
    method onAccountEventCallBack (line 86) | @Override
    method init (line 108) | private void init() {
    method login (line 138) | private void login() {
    method switchAccount (line 145) | private void switchAccount(){
    method logout (line 152) | private void logout() {
    method purchase (line 159) | private void purchase() {
    method exitGame (line 258) | private void exitGame(){
    method onKeyDown (line 297) | @Override
    method onBackPressed (line 307) | @Override
    method showToast (line 313) | private void showToast(String msg) {
    method isDecimal (line 318) | public static boolean isDecimal(String str) {
    method isInteger (line 326) | public static boolean isInteger(String str) {
    method onStart (line 335) | @Override
    method onResume (line 341) | @Override
    method onPause (line 347) | @Override
    method onStop (line 353) | @Override
    method onRestart (line 359) | @Override
    method onDestroy (line 365) | @Override
    method onNewIntent (line 371) | @Override
    method onActivityResult (line 377) | @Override
    method onRequestPermissionsResult (line 383) | @Override

FILE: GameSDKDemo_Release/src/test/java/com/bzai/gamesdkframe/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: GameSDKLibrary_Release/src/androidTest/java/com/suyutech/baselibrary/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: GameSDKLibrary_Release/src/test/java/com/suyutech/baselibrary/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: GameSDK_API/src/androidTest/java/com/bzai/gamesdk/api/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/GameInfoSetting.java
  class GameInfoSetting (line 11) | public class GameInfoSetting {
    method GameInfoSetting (line 16) | public GameInfoSetting(String gameid, String gamekey){

FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/SDKApplication.java
  class SDKApplication (line 12) | public class SDKApplication extends ProjectApplication {
    method attachBaseContext (line 14) | @Override
    method onCreate (line 19) | @Override

FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/api/SDKAPI.java
  class SDKAPI (line 38) | public class SDKAPI {
    method SDKAPI (line 44) | private SDKAPI() {
    method getInstance (line 47) | public static SDKAPI getInstance() {
    method onCreate (line 64) | public void onCreate(Activity activity, Bundle savedInstanceState) {
    method onStart (line 68) | public void onStart(Activity activity) {
    method onResume (line 72) | public void onResume(Activity activity) {
    method onPause (line 76) | public void onPause(Activity activity) {
    method onStop (line 80) | public void onStop(Activity activity) {
    method onRestart (line 84) | public void onRestart(Activity activity) {
    method onDestroy (line 88) | public void onDestroy(Activity activity) {
    method onNewIntent (line 92) | public void onNewIntent(Activity activity,Intent intent){
    method onActivityResult (line 96) | public void onActivityResult(Activity activity, int requestCode, int r...
    method onRequestPermissionsResult (line 100) | public void onRequestPermissionsResult(Activity activity,int requestCo...
    method init (line 115) | public void init(final Activity activity, GameInfoSetting gameInfoSett...
    method accountCallBack (line 159) | private void accountCallBack(int type, int statusCode, String msg, Acc...
    method loginEventCallBack (line 183) | private void loginEventCallBack(int code, AccountBean loginInfo, Strin...
    method switchEventCallBack (line 199) | private void switchEventCallBack(int code, AccountBean loginInfo, Stri...
    method logoutEventCallBack (line 212) | private void logoutEventCallBack(int code, String msg){
    method onSuccess (line 233) | @Override
    method onFailure (line 257) | @Override
    method login (line 268) | public void login(Activity activity){
    method switchAccount (line 277) | public void switchAccount(Activity activity){
    method logout (line 285) | public void logout(Activity activity){
    method pay (line 295) | public void pay(Activity activity, PayParams params, final PurchaseCal...
    method exit (line 344) | public void exit(Activity activity, final ExitCallBackLister exitCallB...
    method showFloatWindow (line 378) | public void showFloatWindow(Activity activity){
    method dismissFloatView (line 385) | public void dismissFloatView(Activity activity){
    method submitRoleInfo (line 395) | public void submitRoleInfo(Activity activity, GameRoleParams gameRoleP...
    method getChannelId (line 403) | public String getChannelId(){

FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/bean/info/AccountEventResultInfo.java
  class AccountEventResultInfo (line 12) | public class AccountEventResultInfo {
    method setEventType (line 23) | public void setEventType(int eventType) {
    method setStatusCode (line 27) | public void setStatusCode(int statusCode) {
    method setMsg (line 31) | public void setMsg(String message) {
    method setPlayerInfo (line 35) | public void setPlayerInfo(PlayerInfo playerInfo) {

FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/bean/info/PlayerInfo.java
  class PlayerInfo (line 9) | public class PlayerInfo {
    method getPlayerId (line 14) | public String getPlayerId() {
    method setPlayerId (line 18) | public void setPlayerId(String playerId) {
    method getToken (line 22) | public String getToken() {
    method setToken (line 26) | public void setToken(String token) {

FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/bean/params/GameRoleParams.java
  class GameRoleParams (line 36) | public class GameRoleParams {
    method setReportId (line 57) | public void setReportId(int reportId) {
    method setRoleId (line 61) | public void setRoleId(String roleId) {
    method setRoleName (line 65) | public void setRoleName(String roleName) {
    method setRoleLevel (line 69) | public void setRoleLevel(String roleLevel) {
    method setRoleCreateTime (line 73) | public void setRoleCreateTime(long roleCreateTime) {
    method setRoleVipLevel (line 77) | public void setRoleVipLevel(String roleVipLevel) {
    method setRoleUpLevelTime (line 81) | public void setRoleUpLevelTime(long roleUpLevelTime) {
    method setRoleUnionName (line 85) | public void setRoleUnionName(String roleUnionName) {
    method setRoleBalance (line 89) | public void setRoleBalance(float roleBalance) {
    method setServerId (line 93) | public void setServerId(String serverId) {
    method setServerName (line 97) | public void setServerName(String serverName) {
    method setExtraInfo (line 101) | public void setExtraInfo(String extraInfo) {

FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/bean/params/PayParams.java
  class PayParams (line 35) | public class PayParams {
    method setProductId (line 59) | public void setProductId(String productId) {
    method setProductName (line 63) | public void setProductName(String productName) {
    method setProductDesc (line 67) | public void setProductDesc(String productDesc) {
    method setMoney (line 71) | public void setMoney(int money) {
    method setRoleID (line 75) | public void setRoleID(String roleID) {
    method setRoleName (line 79) | public void setRoleName(String roleName) {
    method setRoleLevel (line 83) | public void setRoleLevel(String roleLevel) {
    method setServerID (line 87) | public void setServerID(String serverID) {
    method setServerName (line 91) | public void setServerName(String serverName) {
    method setNotifyUrl (line 95) | public void setNotifyUrl(String callback) {
    method setExtension (line 99) | public void setExtension(String extension) {
    method setGorder (line 103) | public void setGorder(String gorder) {

FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/listener/AccountCallBackLister.java
  type AccountCallBackLister (line 12) | public interface AccountCallBackLister {
    method onAccountEventCallBack (line 26) | void onAccountEventCallBack(String jsonStr);

FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/listener/ExitCallBackLister.java
  type ExitCallBackLister (line 10) | public interface ExitCallBackLister {
    method onExitDialogSuccess (line 15) | void onExitDialogSuccess();
    method onExitDialogCancel (line 20) | void onExitDialogCancel();
    method onNotExitDialog (line 25) | void onNotExitDialog();

FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/listener/InitCallBackLister.java
  type InitCallBackLister (line 11) | public interface InitCallBackLister {
    method onSuccess (line 16) | void onSuccess();
    method onFailure (line 23) | void onFailure(int errCode, String msg);

FILE: GameSDK_API/src/main/java/com/bzai/gamesdk/listener/PurchaseCallBackListener.java
  type PurchaseCallBackListener (line 12) | public interface PurchaseCallBackListener {
    method onOrderId (line 18) | void onOrderId(String orderId);
    method onSuccess (line 23) | void onSuccess();
    method onFailure (line 31) | void onFailure(int errCode, String msg);
    method onCancel (line 36) | void onCancel();
    method onComplete (line 42) | void onComplete();

FILE: GameSDK_API/src/test/java/com/bzai/gamesdk/api/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: GameSDK_BeginProject/GameSDK_Project_Custom/src/androidTest/java/com/bzai/gamesdk/project/channel/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: GameSDK_BeginProject/GameSDK_Project_Custom/src/main/java/com/bzai/gamesdk/project/CustomProject.java
  class CustomProject (line 31) | public class CustomProject extends Project{
    method initProject (line 39) | @Override
    method init (line 48) | @Override
    method setAccountCallBackLister (line 79) | @Override
    method onSuccess (line 89) | @Override
    method onFailure (line 94) | @Override
    method AccountOnFailCallBack (line 100) | private void AccountOnFailCallBack(int event, int code, String msg){
    method login (line 110) | @Override
    method switchAccount (line 128) | @Override
    method logout (line 150) | @Override
    method pay (line 176) | @Override
    method exit (line 205) | @Override
    method onCreate (line 220) | @Override
    method onStart (line 229) | @Override
    method onResume (line 238) | @Override
    method onPause (line 247) | @Override
    method onStop (line 256) | @Override
    method onDestroy (line 265) | @Override
    method onActivityResult (line 274) | @Override
    method onRequestPermissionsResult (line 283) | @Override

FILE: GameSDK_BeginProject/GameSDK_Project_Custom/src/main/java/com/bzai/gamesdk/project/ProjectApplication.java
  class ProjectApplication (line 13) | public class ProjectApplication extends Application {
    method attachBaseContext (line 15) | @Override
    method onCreate (line 22) | @Override

FILE: GameSDK_BeginProject/GameSDK_Project_Custom/src/test/java/com/bzai/gamesdk/project/channel/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: GameSDK_BeginProject/GameSDK_Project_JuHe/src/androidTest/java/com/bzai/gamesdk/project/juhe/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: GameSDK_BeginProject/GameSDK_Project_JuHe/src/main/java/com/bzai/gamesdk/project/JuHeProject.java
  class JuHeProject (line 39) | public class JuHeProject extends Project {
    method initProject (line 51) | @Override
    method init (line 61) | @Override
    method setAccountCallBackLister (line 112) | @Override
    method onSuccess (line 122) | @Override
    method onFailure (line 127) | @Override
    method AccountOnFailCallBack (line 133) | private void AccountOnFailCallBack(int event, int code, String msg){
    method onSuccess (line 149) | @Override
    method onFailure (line 163) | @Override
    method login (line 195) | @Override
    method switchAccount (line 215) | @Override
    method logout (line 246) | @Override
    method pay (line 276) | @Override
    method showFloatView (line 340) | @Override
    method dismissFloatView (line 360) | @Override
    method exit (line 380) | @Override
    method reportData (line 394) | @Override
    method extendFunction (line 407) | @Override
    method isSupport (line 418) | public boolean isSupport(int FuncType) {
    method getChannelID (line 423) | @Override
    method onCreate (line 430) | @Override
    method onStart (line 440) | @Override
    method onResume (line 449) | @Override
    method onPause (line 459) | @Override
    method onStop (line 468) | @Override
    method onDestroy (line 477) | @Override
    method onActivityResult (line 486) | @Override
    method onRequestPermissionsResult (line 495) | @Override

FILE: GameSDK_BeginProject/GameSDK_Project_JuHe/src/main/java/com/bzai/gamesdk/project/ProjectApplication.java
  class ProjectApplication (line 15) | public class ProjectApplication extends ChannelApplication {
    method attachBaseContext (line 17) | @Override
    method onCreate (line 24) | @Override

FILE: GameSDK_BeginProject/GameSDK_Project_JuHe/src/test/java/com/bzai/gamesdk/project/juhe/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/androidTest/java/com/bzai/gamesdk/channel/test/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/java/com/bzai/gamesdk/channel/application/ChannelApplication.java
  class ChannelApplication (line 14) | public class ChannelApplication extends Application {
    method attachBaseContext (line 16) | @Override
    method onCreate (line 21) | @Override

FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/java/com/bzai/gamesdk/channel/lexiang/LexiangSDK.java
  class LexiangSDK (line 25) | public class LexiangSDK extends Channel{
    method initChannel (line 35) | @Override
    method getChannelID (line 40) | @Override
    method isSupport (line 45) | @Override
    method init (line 67) | @Override
    method login (line 76) | @Override
    method switchAccount (line 84) | @Override
    method logout (line 89) | @Override
    method pay (line 99) | @Override
    method exit (line 113) | @Override
    method onActivityResult (line 119) | @Override
    method onDestroy (line 142) | @Override
    method loginCall (line 147) | private void loginCall(Context context, Intent data){
    method convertToFloat (line 191) | public float convertToFloat(Object value, float defaultValue){
    method convertToString (line 220) | public String convertToString(Object value, String defaultValue){

FILE: GameSDK_Channel/GameSDK_Channel_Lexiang/src/test/java/com/bzai/gamesdk/channel/test/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: GameSDK_Channel/GameSDK_Channel_Test/src/androidTest/java/com/bzai/gamesdk/channel/test/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: GameSDK_Channel/GameSDK_Channel_Test/src/main/java/com/bzai/gamesdk/channel/application/ChannelApplication.java
  class ChannelApplication (line 14) | public class ChannelApplication extends Application {
    method attachBaseContext (line 16) | @Override
    method onCreate (line 21) | @Override

FILE: GameSDK_Channel/GameSDK_Channel_Test/src/main/java/com/bzai/gamesdk/channel/test/TestChannelSDK.java
  class TestChannelSDK (line 35) | public class TestChannelSDK extends Channel {
    method initChannel (line 39) | @Override
    method getChannelID (line 44) | @Override
    method isSupport (line 49) | @Override
    method init (line 70) | @Override
    method login (line 76) | @Override
    method switchAccount (line 82) | @Override
    method logout (line 106) | @Override
    method pay (line 131) | @Override
    method showLoginView (line 174) | private void showLoginView(final Context context, final CallBackListen...
    method exit (line 205) | @Override

FILE: GameSDK_Channel/GameSDK_Channel_Test/src/test/java/com/bzai/gamesdk/channel/test/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: GameSDK_Manager/GameSDK_Module_Account/src/androidTest/java/com/bzai/gamesdk/module/account/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: GameSDK_Manager/GameSDK_Module_Account/src/main/java/com/bzai/gamesdk/module/account/AccountManager.java
  class AccountManager (line 35) | public class AccountManager {
    method AccountManager (line 41) | private AccountManager() {
    method getInstance (line 44) | public static AccountManager getInstance() {
    method setLoginCallBackLister (line 63) | public void setLoginCallBackLister(CallBackListener callBackLister){
    method CallBackToProject (line 67) | private void CallBackToProject(int event, int code, AccountBean accoun...
    method onSuccess (line 87) | @Override
    method onFailure (line 104) | @Override
    method showLoginView (line 129) | public void showLoginView(final Activity activity, HashMap<String,Obje...
    method authLogin (line 165) | public void authLogin(Activity activity, HashMap<String,Object> loginM...
    method getLoginState (line 182) | public boolean getLoginState() {
    method switchAccount (line 195) | public void switchAccount(Activity activity){
    method logout (line 211) | public void logout(Activity activity){
    method setLoginSuccess (line 226) | private void setLoginSuccess(AccountBean loginInfo){
    method clearLoginInfo (line 242) | private void clearLoginInfo(Activity activity){

FILE: GameSDK_Manager/GameSDK_Module_Account/src/main/java/com/bzai/gamesdk/module/account/bean/AccountBean.java
  class AccountBean (line 14) | public class AccountBean{
    method getLoginState (line 21) | public boolean getLoginState() {
    method setLoginState (line 25) | public void setLoginState(boolean loginState) {
    method getUserID (line 29) | public String getUserID() {
    method setUserID (line 33) | public void setUserID(String userID) {
    method getUserName (line 37) | public String getUserName() {
    method setUserName (line 41) | public void setUserName(String userName) {
    method getUserToken (line 45) | public String getUserToken() {
    method setUserToken (line 49) | public void setUserToken(String userToken) {
    method toString (line 53) | @Override

FILE: GameSDK_Manager/GameSDK_Module_Account/src/main/java/com/bzai/gamesdk/module/account/bean/AccountCallBackBean.java
  class AccountCallBackBean (line 11) | public class AccountCallBackBean {
    method getEvent (line 18) | public int getEvent() {
    method setEvent (line 22) | public void setEvent(int event) {
    method getAccountBean (line 26) | public AccountBean getAccountBean() {
    method setAccountBean (line 30) | public void setAccountBean(AccountBean accountBean) {
    method getErrorCode (line 34) | public int getErrorCode() {
    method setErrorCode (line 38) | public void setErrorCode(int errorCode) {
    method getMsg (line 42) | public String getMsg() {
    method setMsg (line 46) | public void setMsg(String msg) {

FILE: GameSDK_Manager/GameSDK_Module_Account/src/test/java/com/bzai/gamesdk/module/account/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: GameSDK_Manager/GameSDK_Module_Init/src/androidTest/java/com/bzai/gamesdk/module/init/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: GameSDK_Manager/GameSDK_Module_Init/src/main/java/com/bzai/gamesdk/module/init/InitManager.java
  class InitManager (line 30) | public class InitManager {
    method InitManager (line 36) | private InitManager() {
    method getInstance (line 39) | public static InitManager getInstance() {
    method initApplication (line 55) | public void initApplication(Application cxt, Context context, boolean ...
    method init (line 73) | public void init(final Activity activity, final String gameid, final S...
    method startInitLogic (line 116) | private void startInitLogic(final Activity activity, final CallBackLis...
    method initFunctionPlugin (line 131) | private void initFunctionPlugin(Activity activity){
    method setInitState (line 138) | public void setInitState(boolean state) {
    method getInitState (line 144) | public boolean getInitState() {

FILE: GameSDK_Manager/GameSDK_Module_Init/src/test/java/com/bzai/gamesdk/module/init/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: GameSDK_Manager/GameSDK_Module_Purchase/src/androidTest/java/com/bzai/gamesdk/module/purchase/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: GameSDK_Manager/GameSDK_Module_Purchase/src/main/java/com/bzai/gamesdk/module/purchase/PurchaseManager.java
  class PurchaseManager (line 26) | public class PurchaseManager {
    method PurchaseManager (line 32) | private PurchaseManager() {
    method getInstance (line 35) | public static PurchaseManager getInstance() {
    method createOrderId (line 49) | public void createOrderId(Activity activity, HashMap<String, Object> p...
    method showPayView (line 60) | public void showPayView(Activity activity, HashMap<String, Object> pay...

FILE: GameSDK_Manager/GameSDK_Module_Purchase/src/main/java/com/bzai/gamesdk/module/purchase/PurchaseResult.java
  class PurchaseResult (line 12) | public class PurchaseResult {
    method PurchaseResult (line 20) | public PurchaseResult(int status, Object message) {

FILE: GameSDK_Manager/GameSDK_Module_Purchase/src/test/java/com/bzai/gamesdk/module/purchase/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: GameSDK_Manager_Impl/src/androidTest/java/com/bzai/gamesdk/manager/impl/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: GameSDK_Manager_Impl/src/main/java/com/bzai/gamesdk/invoke/plugin/AlipayPluginApi.java
  class AlipayPluginApi (line 21) | public class AlipayPluginApi extends PluginReflectApi {
    method AlipayPluginApi (line 29) | private AlipayPluginApi() {
    method getInstance (line 33) | public static AlipayPluginApi getInstance() {
    method pay (line 47) | public void pay(Context context, Map<String,Object> map, CallBackListe...

FILE: GameSDK_Manager_Impl/src/main/java/com/bzai/gamesdk/invoke/plugin/WechatPluginApi.java
  class WechatPluginApi (line 20) | public class WechatPluginApi extends PluginReflectApi {
    method WechatPluginApi (line 28) | private WechatPluginApi() {
    method getInstance (line 32) | public static WechatPluginApi getInstance() {
    method pay (line 46) | public void pay(Context context, Map<String,Object> map, CallBackListe...

FILE: GameSDK_Manager_Impl/src/test/java/com/bzai/gamesdk/manager/impl/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: GameSDK_Plugin/GameSDK_Plugin_Alipay/src/androidTest/java/com/bzai/gamesdk/plugin/alipay/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: GameSDK_Plugin/GameSDK_Plugin_Alipay/src/main/java/com/bzai/gamesdk/plugin/alipay/AlipayPlugin.java
  class AlipayPlugin (line 20) | public class AlipayPlugin extends Plugin {
    method initPlugin (line 24) | @Override
    method alipay (line 33) | public void alipay(Context context, Map<String,Object> payMap, CallBac...

FILE: GameSDK_Plugin/GameSDK_Plugin_Alipay/src/main/java/com/bzai/gamesdk/plugin/alipay/pay/AlipayPay.java
  class AlipayPay (line 27) | public class AlipayPay {
    method AlipayPay (line 33) | private AlipayPay() {
    method getInstance (line 36) | public static AlipayPay getInstance() {
    method pay (line 54) | public void pay(final Context context, Map<String,Object> payMap, Call...
    method handleMessage (line 89) | @Override

FILE: GameSDK_Plugin/GameSDK_Plugin_Alipay/src/main/java/com/bzai/gamesdk/plugin/alipay/pay/PayResult.java
  class PayResult (line 1) | public class PayResult {
	private String resultStatus;
	private String r...
    method PayResult (line 1) | public PayResult(Map<String, String> rawResult) {
		if (rawResult == n...
    method toString (line 1) | @Override
	public String toString() {
		return "resultStatus={" + resu...
    method getResultStatus (line 1) | public String getResultStatus() {
		return resultStatus;
	}
    method getMemo (line 1) | public String getMemo() {
		return memo;
	}
    method getResult (line 1) | public String getResult() {
		return result;
	}

FILE: GameSDK_Plugin/GameSDK_Plugin_Alipay/src/test/java/com/bzai/gamesdk/plugin/alipay/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: GameSDK_Plugin/GameSDK_Plugin_Wechat/src/androidTest/java/com/bzai/gamesdk/plugin/wechat/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: GameSDK_Plugin/GameSDK_Plugin_Wechat/src/main/java/com/bzai/gamesdk/plugin/wechat/WechatPlugin.java
  class WechatPlugin (line 20) | public class WechatPlugin extends Plugin {
    method initPlugin (line 24) | @Override
    method wechatPay (line 33) | public void wechatPay(Context context, Map<String,Object> payMap, Call...
    method wechatLogin (line 41) | public void wechatLogin(Context context, Map<String,Object> LoginMap, ...
    method wechatShare (line 49) | public void wechatShare(Context context, Map<String,Object> ShareMap, ...
    method onResume (line 57) | @Override

FILE: GameSDK_Plugin/GameSDK_Plugin_Wechat/src/main/java/com/bzai/gamesdk/plugin/wechat/login/WechatLogin.java
  class WechatLogin (line 12) | public class WechatLogin {
    method WechatLogin (line 18) | private WechatLogin() {
    method getInstance (line 21) | public static WechatLogin getInstance() {

FILE: GameSDK_Plugin/GameSDK_Plugin_Wechat/src/main/java/com/bzai/gamesdk/plugin/wechat/pay/WechatPay.java
  class WechatPay (line 23) | public class WechatPay {
    method WechatPay (line 29) | private WechatPay() {
    method getInstance (line 32) | public static WechatPay getInstance() {
    method pay (line 47) | public void pay(Context context, Map<String,Object> payMap, CallBackLi...
    method onResume (line 56) | public void onResume(Context context) {

FILE: GameSDK_Plugin/GameSDK_Plugin_Wechat/src/test/java/com/bzai/gamesdk/plugin/wechat/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: GameSDK_Utils/src/androidTest/java/com/bzai/gamesdk/utils/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/cache/ApplicationCache.java
  class ApplicationCache (line 11) | public class ApplicationCache {
    method getApplication (line 14) | public Context getApplication() {
    method getApplicationContext (line 22) | public Context getApplicationContext(){
    method ApplicationCache (line 29) | private ApplicationCache(Application appContext) {
    method getInstance (line 33) | public static ApplicationCache getInstance() {
    method init (line 40) | public static ApplicationCache init(Application cxt) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/config/ErrCode.java
  class ErrCode (line 10) | public class ErrCode {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/config/TypeConfig.java
  class TypeConfig (line 10) | public class TypeConfig {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/DefaultDateTypeAdapter.java
  class DefaultDateTypeAdapter (line 35) | final class DefaultDateTypeAdapter implements JsonSerializer<Date>, Json...
    method DefaultDateTypeAdapter (line 43) | DefaultDateTypeAdapter() {
    method DefaultDateTypeAdapter (line 48) | DefaultDateTypeAdapter(String datePattern) {
    method DefaultDateTypeAdapter (line 52) | DefaultDateTypeAdapter(int style) {
    method DefaultDateTypeAdapter (line 56) | public DefaultDateTypeAdapter(int dateStyle, int timeStyle) {
    method DefaultDateTypeAdapter (line 61) | DefaultDateTypeAdapter(DateFormat enUsFormat, DateFormat localFormat) {
    method serialize (line 70) | public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializati...
    method deserialize (line 77) | public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializ...
    method deserializeToDate (line 94) | private Date deserializeToDate(JsonElement json) {
    method toString (line 112) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/ExclusionStrategy.java
  type ExclusionStrategy (line 96) | public interface ExclusionStrategy {
    method shouldSkipField (line 102) | public boolean shouldSkipField(FieldAttributes f);
    method shouldSkipClass (line 108) | public boolean shouldSkipClass(Class<?> clazz);

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/FieldAttributes.java
  class FieldAttributes (line 37) | public final class FieldAttributes {
    method FieldAttributes (line 45) | public FieldAttributes(Field f) {
    method getDeclaringClass (line 53) | public Class<?> getDeclaringClass() {
    method getName (line 60) | public String getName() {
    method getDeclaredType (line 80) | public Type getDeclaredType() {
    method getDeclaredClass (line 100) | public Class<?> getDeclaredClass() {
    method getAnnotation (line 111) | public <T extends Annotation> T getAnnotation(Class<T> annotation) {
    method getAnnotations (line 121) | public Collection<Annotation> getAnnotations() {
    method hasModifier (line 135) | public boolean hasModifier(int modifier) {
    method get (line 146) | Object get(Object instance) throws IllegalAccessException {
    method isSynthetic (line 155) | boolean isSynthetic() {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/FieldNamingPolicy.java
  type FieldNamingPolicy (line 30) | public enum FieldNamingPolicy implements FieldNamingStrategy {
    method translateName (line 37) | public String translateName(Field f) {
    method translateName (line 53) | public String translateName(Field f) {
    method translateName (line 72) | public String translateName(Field f) {
    method translateName (line 90) | public String translateName(Field f) {
    method translateName (line 113) | public String translateName(Field f) {
    method separateCamelCase (line 122) | private static String separateCamelCase(String name, String separator) {
    method upperCaseFirstLetter (line 137) | private static String upperCaseFirstLetter(String name) {
    method modifyString (line 163) | private static String modifyString(char firstCharacter, String srcStri...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/FieldNamingStrategy.java
  type FieldNamingStrategy (line 30) | public interface FieldNamingStrategy {
    method translateName (line 39) | public String translateName(Field f);

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/Gson.java
  class Gson (line 100) | public final class Gson {
    method initialValue (line 114) | @Override
    method deserialize (line 132) | @SuppressWarnings("unchecked")
    method serialize (line 139) | public JsonElement serialize(Object src) {
    method serialize (line 142) | public JsonElement serialize(Object src, Type typeOfSrc) {
    method Gson (line 181) | public Gson() {
    method Gson (line 188) | Gson(final Excluder excluder, final FieldNamingStrategy fieldNamingPol...
    method doubleAdapter (line 254) | private TypeAdapter<Number> doubleAdapter(boolean serializeSpecialFloa...
    method floatAdapter (line 280) | private TypeAdapter<Number> floatAdapter(boolean serializeSpecialFloat...
    method checkValidFloatingPoint (line 306) | private void checkValidFloatingPoint(double value) {
    method longAdapter (line 314) | private TypeAdapter<Number> longAdapter(LongSerializationPolicy longSe...
    method getAdapter (line 344) | @SuppressWarnings("unchecked")
    method getDelegateAdapter (line 421) | public <T> TypeAdapter<T> getDelegateAdapter(TypeAdapterFactory skipPa...
    method getAdapter (line 446) | public <T> TypeAdapter<T> getAdapter(Class<T> type) {
    method toJsonTree (line 463) | public JsonElement toJsonTree(Object src) {
    method toJsonTree (line 486) | public JsonElement toJsonTree(Object src, Type typeOfSrc) {
    method toJson (line 505) | public String toJson(Object src) {
    method toJson (line 527) | public String toJson(Object src, Type typeOfSrc) {
    method toJson (line 547) | public void toJson(Object src, Appendable writer) throws JsonIOExcepti...
    method toJson (line 571) | public void toJson(Object src, Type typeOfSrc, Appendable writer) thro...
    method toJson (line 585) | @SuppressWarnings("unchecked")
    method toJson (line 612) | public String toJson(JsonElement jsonElement) {
    method toJson (line 626) | public void toJson(JsonElement jsonElement, Appendable writer) throws ...
    method newJsonWriter (line 639) | private JsonWriter newJsonWriter(Writer writer) throws IOException {
    method toJson (line 655) | public void toJson(JsonElement jsonElement, JsonWriter writer) throws ...
    method fromJson (line 690) | public <T> T fromJson(String json, Class<T> classOfT) throws JsonSynta...
    method fromJson (line 713) | @SuppressWarnings("unchecked")
    method fromJson (line 741) | public <T> T fromJson(Reader json, Class<T> classOfT) throws JsonSynta...
    method fromJson (line 767) | @SuppressWarnings("unchecked")
    method assertFullConsumption (line 775) | private static void assertFullConsumption(Object obj, JsonReader reade...
    method fromJson (line 795) | @SuppressWarnings("unchecked")
    method fromJson (line 840) | public <T> T fromJson(JsonElement json, Class<T> classOfT) throws Json...
    method fromJson (line 863) | @SuppressWarnings("unchecked")
    class FutureTypeAdapter (line 871) | static class FutureTypeAdapter<T> extends TypeAdapter<T> {
      method setDelegate (line 874) | public void setDelegate(TypeAdapter<T> typeAdapter) {
      method read (line 881) | @Override
      method write (line 889) | @Override
    method toString (line 898) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/GsonBuilder.java
  class GsonBuilder (line 69) | public final class GsonBuilder {
    method GsonBuilder (line 94) | public GsonBuilder() {
    method setVersion (line 104) | public GsonBuilder setVersion(double ignoreVersionsAfter) {
    method excludeFieldsWithModifiers (line 120) | public GsonBuilder excludeFieldsWithModifiers(int... modifiers) {
    method generateNonExecutableJson (line 134) | public GsonBuilder generateNonExecutableJson() {
    method excludeFieldsWithoutExposeAnnotation (line 145) | public GsonBuilder excludeFieldsWithoutExposeAnnotation() {
    method serializeNulls (line 157) | public GsonBuilder serializeNulls() {
    method enableComplexMapKeySerialization (line 238) | public GsonBuilder enableComplexMapKeySerialization() {
    method disableInnerClassSerialization (line 249) | public GsonBuilder disableInnerClassSerialization() {
    method setLongSerializationPolicy (line 262) | public GsonBuilder setLongSerializationPolicy(LongSerializationPolicy ...
    method setFieldNamingPolicy (line 275) | public GsonBuilder setFieldNamingPolicy(FieldNamingPolicy namingConven...
    method setFieldNamingStrategy (line 288) | public GsonBuilder setFieldNamingStrategy(FieldNamingStrategy fieldNam...
    method setExclusionStrategies (line 303) | public GsonBuilder setExclusionStrategies(ExclusionStrategy... strateg...
    method addSerializationExclusionStrategy (line 322) | public GsonBuilder addSerializationExclusionStrategy(ExclusionStrategy...
    method addDeserializationExclusionStrategy (line 339) | public GsonBuilder addDeserializationExclusionStrategy(ExclusionStrate...
    method setPrettyPrinting (line 350) | public GsonBuilder setPrettyPrinting() {
    method disableHtmlEscaping (line 362) | public GsonBuilder disableHtmlEscaping() {
    method setDateFormat (line 383) | public GsonBuilder setDateFormat(String pattern) {
    method setDateFormat (line 403) | public GsonBuilder setDateFormat(int style) {
    method setDateFormat (line 424) | public GsonBuilder setDateFormat(int dateStyle, int timeStyle) {
    method registerTypeAdapter (line 447) | @SuppressWarnings({"unchecked", "rawtypes"})
    method registerTypeAdapterFactory (line 474) | public GsonBuilder registerTypeAdapterFactory(TypeAdapterFactory facto...
    method registerTypeHierarchyAdapter (line 493) | @SuppressWarnings({"unchecked", "rawtypes"})
    method serializeSpecialFloatingPointValues (line 528) | public GsonBuilder serializeSpecialFloatingPointValues() {
    method create (line 539) | public Gson create() {
    method addTypeAdaptersForDate (line 552) | private void addTypeAdaptersForDate(String datePattern, int dateStyle,...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/InstanceCreator.java
  type InstanceCreator (line 79) | public interface InstanceCreator<T> {
    method createInstance (line 91) | public T createInstance(Type type);

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/JsonArray.java
  class JsonArray (line 33) | public final class JsonArray extends JsonElement implements Iterable<Jso...
    method JsonArray (line 39) | public JsonArray() {
    method add (line 48) | public void add(JsonElement element) {
    method addAll (line 60) | public void addAll(JsonArray array) {
    method size (line 69) | public int size() {
    method iterator (line 79) | public Iterator<JsonElement> iterator() {
    method get (line 91) | public JsonElement get(int i) {
    method getAsNumber (line 103) | @Override
    method getAsString (line 119) | @Override
    method getAsDouble (line 135) | @Override
    method getAsBigDecimal (line 152) | @Override
    method getAsBigInteger (line 169) | @Override
    method getAsFloat (line 185) | @Override
    method getAsLong (line 201) | @Override
    method getAsInt (line 217) | @Override
    method getAsByte (line 225) | @Override
    method getAsCharacter (line 233) | @Override
    method getAsShort (line 249) | @Override
    method getAsBoolean (line 265) | @Override
    method equals (line 273) | @Override
    method hashCode (line 278) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/JsonDeserializationContext.java
  type JsonDeserializationContext (line 29) | public interface JsonDeserializationContext {
    method deserialize (line 43) | public <T> T deserialize(JsonElement json, Type typeOfT) throws JsonPa...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/JsonDeserializer.java
  type JsonDeserializer (line 73) | public interface JsonDeserializer<T> {
    method deserialize (line 89) | public T deserialize(JsonElement json, Type typeOfT, JsonDeserializati...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/JsonElement.java
  class JsonElement (line 34) | public abstract class JsonElement {
    method isJsonArray (line 40) | public boolean isJsonArray() {
    method isJsonObject (line 49) | public boolean isJsonObject() {
    method isJsonPrimitive (line 58) | public boolean isJsonPrimitive() {
    method isJsonNull (line 68) | public boolean isJsonNull() {
    method getAsJsonObject (line 81) | public JsonObject getAsJsonObject() {
    method getAsJsonArray (line 97) | public JsonArray getAsJsonArray() {
    method getAsJsonPrimitive (line 113) | public JsonPrimitive getAsJsonPrimitive() {
    method getAsJsonNull (line 130) | public JsonNull getAsJsonNull() {
    method getAsBoolean (line 146) | public boolean getAsBoolean() {
    method getAsBooleanWrapper (line 159) | Boolean getAsBooleanWrapper() {
    method getAsNumber (line 172) | public Number getAsNumber() {
    method getAsString (line 185) | public String getAsString() {
    method getAsDouble (line 198) | public double getAsDouble() {
    method getAsFloat (line 211) | public float getAsFloat() {
    method getAsLong (line 224) | public long getAsLong() {
    method getAsInt (line 237) | public int getAsInt() {
    method getAsByte (line 251) | public byte getAsByte() {
    method getAsCharacter (line 265) | public char getAsCharacter() {
    method getAsBigDecimal (line 279) | public BigDecimal getAsBigDecimal() {
    method getAsBigInteger (line 293) | public BigInteger getAsBigInteger() {
    method getAsShort (line 306) | public short getAsShort() {
    method toString (line 313) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/JsonIOException.java
  class JsonIOException (line 25) | public final class JsonIOException extends JsonParseException {
    method JsonIOException (line 28) | public JsonIOException(String msg) {
    method JsonIOException (line 32) | public JsonIOException(String msg, Throwable cause) {
    method JsonIOException (line 42) | public JsonIOException(Throwable cause) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/JsonNull.java
  class JsonNull (line 26) | public final class JsonNull extends JsonElement {
    method JsonNull (line 38) | @Deprecated
    method hashCode (line 46) | @Override
    method equals (line 54) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/JsonObject.java
  class JsonObject (line 33) | public final class JsonObject extends JsonElement {
    method JsonObject (line 43) | public JsonObject() {
    method add (line 54) | public void add(String property, JsonElement value) {
    method remove (line 68) | public JsonElement remove(String property) {
    method addProperty (line 79) | public void addProperty(String property, String value) {
    method addProperty (line 90) | public void addProperty(String property, Number value) {
    method addProperty (line 101) | public void addProperty(String property, Boolean value) {
    method addProperty (line 112) | public void addProperty(String property, Character value) {
    method createJsonElement (line 122) | private JsonElement createJsonElement(Object value) {
    method entrySet (line 132) | public Set<Map.Entry<String, JsonElement>> entrySet() {
    method has (line 142) | public boolean has(String memberName) {
    method get (line 152) | public JsonElement get(String memberName) {
    method getAsJsonPrimitive (line 166) | public JsonPrimitive getAsJsonPrimitive(String memberName) {
    method getAsJsonArray (line 176) | public JsonArray getAsJsonArray(String memberName) {
    method getAsJsonObject (line 186) | public JsonObject getAsJsonObject(String memberName) {
    method equals (line 190) | @Override
    method hashCode (line 196) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/JsonParseException.java
  class JsonParseException (line 32) | public class JsonParseException extends RuntimeException {
    method JsonParseException (line 41) | public JsonParseException(String msg) {
    method JsonParseException (line 51) | public JsonParseException(String msg, Throwable cause) {
    method JsonParseException (line 61) | public JsonParseException(Throwable cause) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/JsonParser.java
  class JsonParser (line 34) | public final class JsonParser {
    method parse (line 44) | public JsonElement parse(String json) throws JsonSyntaxException {
    method parse (line 56) | public JsonElement parse(Reader json) throws JsonIOException, JsonSynt...
    method parse (line 80) | public JsonElement parse(JsonReader json) throws JsonIOException, Json...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/JsonPrimitive.java
  class JsonPrimitive (line 33) | public final class JsonPrimitive extends JsonElement {
    method JsonPrimitive (line 46) | public JsonPrimitive(Boolean bool) {
    method JsonPrimitive (line 55) | public JsonPrimitive(Number number) {
    method JsonPrimitive (line 64) | public JsonPrimitive(String string) {
    method JsonPrimitive (line 74) | public JsonPrimitive(Character c) {
    method JsonPrimitive (line 84) | JsonPrimitive(Object primitive) {
    method setValue (line 88) | void setValue(Object primitive) {
    method isBoolean (line 106) | public boolean isBoolean() {
    method getAsBooleanWrapper (line 115) | @Override
    method getAsBoolean (line 125) | @Override
    method isNumber (line 140) | public boolean isNumber() {
    method getAsNumber (line 150) | @Override
    method isString (line 160) | public boolean isString() {
    method getAsString (line 169) | @Override
    method getAsDouble (line 186) | @Override
    method getAsBigDecimal (line 197) | @Override
    method getAsBigInteger (line 208) | @Override
    method getAsFloat (line 220) | @Override
    method getAsLong (line 231) | @Override
    method getAsShort (line 242) | @Override
    method getAsInt (line 253) | @Override
    method getAsByte (line 258) | @Override
    method getAsCharacter (line 263) | @Override
    method isPrimitiveOrString (line 268) | private static boolean isPrimitiveOrString(Object target) {
    method hashCode (line 282) | @Override
    method equals (line 299) | @Override
    method isIntegral (line 328) | private static boolean isIntegral(JsonPrimitive primitive) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/JsonSerializationContext.java
  type JsonSerializationContext (line 28) | public interface JsonSerializationContext {
    method serialize (line 36) | public JsonElement serialize(Object src);
    method serialize (line 48) | public JsonElement serialize(Object src, Type typeOfSrc);

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/JsonSerializer.java
  type JsonSerializer (line 72) | public interface JsonSerializer<T> {
    method serialize (line 88) | public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationC...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/JsonStreamParser.java
  class JsonStreamParser (line 52) | public final class JsonStreamParser implements Iterator<JsonElement> {
    method JsonStreamParser (line 60) | public JsonStreamParser(String json) {
    method JsonStreamParser (line 68) | public JsonStreamParser(Reader reader) {
    method next (line 81) | public JsonElement next() throws JsonParseException {
    method hasNext (line 102) | public boolean hasNext() {
    method remove (line 119) | public void remove() {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/JsonSyntaxException.java
  class JsonSyntaxException (line 25) | public final class JsonSyntaxException extends JsonParseException {
    method JsonSyntaxException (line 29) | public JsonSyntaxException(String msg) {
    method JsonSyntaxException (line 33) | public JsonSyntaxException(String msg, Throwable cause) {
    method JsonSyntaxException (line 44) | public JsonSyntaxException(Throwable cause) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/LongSerializationPolicy.java
  type LongSerializationPolicy (line 27) | public enum LongSerializationPolicy {
    method serialize (line 35) | public JsonElement serialize(Long value) {
    method serialize (line 46) | public JsonElement serialize(Long value) {
    method serialize (line 57) | public abstract JsonElement serialize(Long value);

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/TreeTypeAdapter.java
  class TreeTypeAdapter (line 32) | final class TreeTypeAdapter<T> extends TypeAdapter<T> {
    method TreeTypeAdapter (line 42) | private TreeTypeAdapter(JsonSerializer<T> serializer, JsonDeserializer...
    method read (line 51) | @Override
    method write (line 63) | @Override
    method delegate (line 77) | private TypeAdapter<T> delegate() {
    method newFactory (line 87) | public static TypeAdapterFactory newFactory(TypeToken<?> exactType, Ob...
    method newFactoryWithMatchRawType (line 95) | public static TypeAdapterFactory newFactoryWithMatchRawType(
    method newTypeHierarchyFactory (line 106) | public static TypeAdapterFactory newTypeHierarchyFactory(
    class SingleTypeFactory (line 111) | private static class SingleTypeFactory implements TypeAdapterFactory {
      method SingleTypeFactory (line 118) | private SingleTypeFactory(Object typeAdapter, TypeToken<?> exactType...
      method create (line 132) | @SuppressWarnings("unchecked") // guarded by typeToken.equals() call

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/TypeAdapter.java
  class TypeAdapter (line 120) | public abstract class TypeAdapter<T> {
    method write (line 128) | public abstract void write(JsonWriter out, T value) throws IOException;
    method toJson (line 141) | public final void toJson(Writer out, T value) throws IOException {
    method nullSafe (line 186) | public final TypeAdapter<T> nullSafe() {
    method toJson (line 217) | public final String toJson(T value) throws IOException {
    method toJsonTree (line 230) | public final JsonElement toJsonTree(T value) {
    method read (line 246) | public abstract T read(JsonReader in) throws IOException;
    method fromJson (line 257) | public final T fromJson(Reader in) throws IOException {
    method fromJson (line 271) | public final T fromJson(String json) throws IOException {
    method fromJsonTree (line 281) | public final T fromJsonTree(JsonElement jsonTree) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/TypeAdapterFactory.java
  type TypeAdapterFactory (line 164) | public interface TypeAdapterFactory {
    method create (line 170) | <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type);

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/$Gson$Preconditions.java
  class $Gson$Preconditions (line 32) | public final class $Gson$Preconditions {
    method checkNotNull (line 33) | public static <T> T checkNotNull(T obj) {
    method checkArgument (line 40) | public static void checkArgument(boolean condition) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/$Gson$Types.java
  class $Gson$Types (line 39) | public final class $Gson$Types {
    method $Gson$Types (line 42) | private $Gson$Types() {}
    method newParameterizedTypeWithOwner (line 50) | public static ParameterizedType newParameterizedTypeWithOwner(
    method arrayOf (line 61) | public static GenericArrayType arrayOf(Type componentType) {
    method subtypeOf (line 71) | public static WildcardType subtypeOf(Type bound) {
    method supertypeOf (line 80) | public static WildcardType supertypeOf(Type bound) {
    method canonicalize (line 89) | public static Type canonicalize(Type type) {
    method getRawType (line 113) | public static Class<?> getRawType(Type type) {
    method equal (line 147) | static boolean equal(Object a, Object b) {
    method equals (line 154) | public static boolean equals(Type a, Type b) {
    method hashCodeOrZero (line 209) | private static int hashCodeOrZero(Object o) {
    method typeToString (line 213) | public static String typeToString(Type type) {
    method getGenericSupertype (line 222) | static Type getGenericSupertype(Type context, Class<?> rawType, Class<...
    method getSupertype (line 263) | static Type getSupertype(Type context, Class<?> contextRawType, Class<...
    method getArrayComponentType (line 273) | public static Type getArrayComponentType(Type array) {
    method getCollectionElementType (line 283) | public static Type getCollectionElementType(Type context, Class<?> con...
    method getMapKeyAndValueTypes (line 299) | public static Type[] getMapKeyAndValueTypes(Type context, Class<?> con...
    method resolve (line 318) | public static Type resolve(Type context, Class<?> contextRawType, Type...
    method resolveTypeVariable (line 390) | static Type resolveTypeVariable(Type context, Class<?> contextRawType,...
    method indexOf (line 407) | private static int indexOf(Object[] array, Object toFind) {
    method declaringClassOf (line 420) | private static Class<?> declaringClassOf(TypeVariable<?> typeVariable) {
    method checkNotPrimitive (line 427) | private static void checkNotPrimitive(Type type) {
    class ParameterizedTypeImpl (line 431) | private static final class ParameterizedTypeImpl implements Parameteri...
      method ParameterizedTypeImpl (line 436) | public ParameterizedTypeImpl(Type ownerType, Type rawType, Type... t...
      method getActualTypeArguments (line 454) | public Type[] getActualTypeArguments() {
      method getRawType (line 458) | public Type getRawType() {
      method getOwnerType (line 462) | public Type getOwnerType() {
      method equals (line 466) | @Override
      method hashCode (line 472) | @Override
      method toString (line 479) | @Override
    class GenericArrayTypeImpl (line 498) | private static final class GenericArrayTypeImpl implements GenericArra...
      method GenericArrayTypeImpl (line 501) | public GenericArrayTypeImpl(Type componentType) {
      method getGenericComponentType (line 505) | public Type getGenericComponentType() {
      method equals (line 509) | @Override
      method hashCode (line 515) | @Override
      method toString (line 520) | @Override
    class WildcardTypeImpl (line 533) | private static final class WildcardTypeImpl implements WildcardType, S...
      method WildcardTypeImpl (line 537) | public WildcardTypeImpl(Type[] upperBounds, Type[] lowerBounds) {
      method getUpperBounds (line 556) | public Type[] getUpperBounds() {
      method getLowerBounds (line 560) | public Type[] getLowerBounds() {
      method equals (line 564) | @Override
      method hashCode (line 570) | @Override
      method toString (line 577) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/ConstructorConstructor.java
  class ConstructorConstructor (line 40) | public final class ConstructorConstructor {
    method ConstructorConstructor (line 43) | public ConstructorConstructor(Map<Type, InstanceCreator<?>> instanceCr...
    method ConstructorConstructor (line 47) | public ConstructorConstructor() {
    method get (line 51) | public <T> ObjectConstructor<T> get(TypeToken<T> typeToken) {
    method newDefaultConstructor (line 81) | private <T> ObjectConstructor<T> newDefaultConstructor(Class<? super T...
    method newDefaultImplementationConstructor (line 115) | @SuppressWarnings("unchecked") // use runtime checks to guarantee that...
    method newUnsafeAllocator (line 158) | private <T> ObjectConstructor<T> newUnsafeAllocator(
    method toString (line 175) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/Excluder.java
  class Excluder (line 51) | public final class Excluder implements TypeAdapterFactory, Cloneable {
    method clone (line 62) | @Override
    method withVersion (line 71) | public Excluder withVersion(double ignoreVersionsAfter) {
    method withModifiers (line 77) | public Excluder withModifiers(int... modifiers) {
    method disableInnerClassSerialization (line 86) | public Excluder disableInnerClassSerialization() {
    method excludeFieldsWithoutExposeAnnotation (line 92) | public Excluder excludeFieldsWithoutExposeAnnotation() {
    method withExclusionStrategy (line 98) | public Excluder withExclusionStrategy(ExclusionStrategy exclusionStrat...
    method create (line 113) | public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> t...
    method excludeField (line 153) | public boolean excludeField(Field field, boolean serialize) {
    method excludeClass (line 195) | public boolean excludeClass(Class<?> clazz, boolean serialize) {
    method isAnonymousOrLocal (line 219) | private boolean isAnonymousOrLocal(Class<?> clazz) {
    method isInnerClass (line 224) | private boolean isInnerClass(Class<?> clazz) {
    method isStatic (line 228) | private boolean isStatic(Class<?> clazz) {
    method isValidVersion (line 232) | private boolean isValidVersion(Since since, Until until) {
    method isValidSince (line 236) | private boolean isValidSince(Since annotation) {
    method isValidUntil (line 246) | private boolean isValidUntil(Until annotation) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/JsonReaderInternalAccess.java
  class JsonReaderInternalAccess (line 26) | public abstract class JsonReaderInternalAccess {
    method promoteNameToValue (line 32) | public abstract void promoteNameToValue(JsonReader reader) throws IOEx...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/LazilyParsedNumber.java
  class LazilyParsedNumber (line 25) | @SuppressWarnings("serial")
    method LazilyParsedNumber (line 29) | public LazilyParsedNumber(String value) {
    method intValue (line 33) | @Override
    method longValue (line 46) | @Override
    method floatValue (line 55) | @Override
    method doubleValue (line 60) | @Override
    method toString (line 65) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/ObjectConstructor.java
  type ObjectConstructor (line 27) | public interface ObjectConstructor<T> {
    method construct (line 32) | public T construct();

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/Primitives.java
  class Primitives (line 31) | public final class Primitives {
    method Primitives (line 32) | private Primitives() {}
    method add (line 60) | private static void add(Map<Class<?>, Class<?>> forward,
    method isPrimitive (line 69) | public static boolean isPrimitive(Type type) {
    method isWrapperType (line 79) | public static boolean isWrapperType(Type type) {
    method wrap (line 93) | public static <T> Class<T> wrap(Class<T> type) {
    method unwrap (line 110) | public static <T> Class<T> unwrap(Class<T> type) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/Streams.java
  class Streams (line 36) | public final class Streams {
    method parse (line 40) | public static JsonElement parse(JsonReader reader) throws JsonParseExc...
    method write (line 68) | public static void write(JsonElement element, JsonWriter writer) throw...
    method writerForAppendable (line 72) | public static Writer writerForAppendable(Appendable appendable) {
    class AppendableWriter (line 80) | private static class AppendableWriter extends Writer {
      method AppendableWriter (line 84) | private AppendableWriter(Appendable appendable) {
      method write (line 88) | @Override
      method write (line 94) | @Override
      method flush (line 99) | @Override
      method close (line 101) | @Override
      class CurrentWrite (line 107) | static class CurrentWrite implements CharSequence {
        method length (line 109) | public int length() {
        method charAt (line 112) | public char charAt(int i) {
        method subSequence (line 115) | public CharSequence subSequence(int start, int end) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/StringMap.java
  class StringMap (line 38) | public final class StringMap<V> extends AbstractMap<String, V> {
    method StringMap (line 90) | @SuppressWarnings("unchecked")
    method size (line 97) | @Override
    method containsKey (line 102) | @Override
    method get (line 107) | @Override
    method getEntry (line 117) | private LinkedEntry<V> getEntry(String key) {
    method put (line 133) | @Override
    method addNewEntry (line 159) | private void addNewEntry(String key, V value, int hash, int index) {
    method makeTable (line 173) | private LinkedEntry<V>[] makeTable(int newCapacity) {
    method doubleCapacity (line 187) | private LinkedEntry<V>[] doubleCapacity() {
    method remove (line 230) | @Override
    method unlink (line 254) | private void unlink(LinkedEntry<V> e) {
    method clear (line 260) | @Override
    method keySet (line 278) | @Override
    method values (line 284) | @Override
    method entrySet (line 290) | public Set<Entry<String, V>> entrySet() {
    class LinkedEntry (line 295) | static class LinkedEntry<V> implements Entry<String, V> {
      method LinkedEntry (line 304) | LinkedEntry() {
      method LinkedEntry (line 309) | LinkedEntry(String key, V value, int hash, LinkedEntry<V> next,
      method getKey (line 319) | public final String getKey() {
      method getValue (line 323) | public final V getValue() {
      method setValue (line 327) | public final V setValue(V value) {
      method equals (line 333) | @Override
      method hashCode (line 344) | @Override
      method toString (line 349) | @Override
    method removeMapping (line 359) | private boolean removeMapping(Object key, Object value) {
    class LinkedHashIterator (line 385) | private abstract class LinkedHashIterator<T> implements Iterator<T> {
      method hasNext (line 389) | public final boolean hasNext() {
      method nextEntry (line 393) | final LinkedEntry<V> nextEntry() {
      method remove (line 402) | public final void remove() {
    class KeySet (line 411) | private final class KeySet extends AbstractSet<String> {
      method iterator (line 412) | public Iterator<String> iterator() {
      method size (line 420) | public int size() {
      method contains (line 424) | public boolean contains(Object o) {
      method remove (line 428) | public boolean remove(Object o) {
      method clear (line 434) | public void clear() {
    class Values (line 439) | private final class Values extends AbstractCollection<V> {
      method iterator (line 440) | public Iterator<V> iterator() {
      method size (line 448) | public int size() {
      method contains (line 452) | public boolean contains(Object o) {
      method clear (line 456) | public void clear() {
    class EntrySet (line 461) | private final class EntrySet extends AbstractSet<Entry<String, V>> {
      method iterator (line 462) | public Iterator<Entry<String, V>> iterator() {
      method contains (line 470) | public boolean contains(Object o) {
      method remove (line 479) | public boolean remove(Object o) {
      method size (line 487) | public int size() {
      method clear (line 491) | public void clear() {
    method hash (line 497) | private static int hash(String key) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/UnsafeAllocator.java
  class UnsafeAllocator (line 30) | public abstract class UnsafeAllocator {
    method newInstance (line 31) | public abstract <T> T newInstance(Class<T> c) throws Exception;
    method create (line 33) | public static UnsafeAllocator create() {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/bind/ArrayTypeAdapter.java
  class ArrayTypeAdapter (line 38) | public final class ArrayTypeAdapter<E> extends TypeAdapter<Object> {
    method create (line 40) | @SuppressWarnings({"unchecked", "rawtypes"})
    method ArrayTypeAdapter (line 57) | public ArrayTypeAdapter(Gson context, TypeAdapter<E> componentTypeAdap...
    method read (line 63) | public Object read(JsonReader in) throws IOException {
    method write (line 83) | @SuppressWarnings("unchecked")

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/bind/CollectionTypeAdapterFactory.java
  class CollectionTypeAdapterFactory (line 37) | public final class CollectionTypeAdapterFactory implements TypeAdapterFa...
    method CollectionTypeAdapterFactory (line 40) | public CollectionTypeAdapterFactory(ConstructorConstructor constructor...
    method create (line 44) | public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
    class Adapter (line 61) | private final class Adapter<E> extends TypeAdapter<Collection<E>> {
      method Adapter (line 65) | public Adapter(Gson context, Type elementType,
      method read (line 73) | public Collection<E> read(JsonReader in) throws IOException {
      method write (line 89) | public void write(JsonWriter out, Collection<E> collection) throws I...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/bind/DateTypeAdapter.java
  class DateTypeAdapter (line 42) | public final class DateTypeAdapter extends TypeAdapter<Date> {
    method create (line 44) | @SuppressWarnings("unchecked") // we use a runtime check to make sure ...
    method buildIso8601Format (line 56) | private static DateFormat buildIso8601Format() {
    method read (line 62) | @Override
    method deserializeToDate (line 71) | private synchronized Date deserializeToDate(String json) {
    method write (line 87) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/bind/JsonTreeReader.java
  class JsonTreeReader (line 40) | public final class JsonTreeReader extends JsonReader {
    method read (line 42) | @Override
    method close (line 46) | @Override
    method JsonTreeReader (line 55) | public JsonTreeReader(JsonElement element) {
    method beginArray (line 60) | @Override
    method endArray (line 67) | @Override
    method beginObject (line 74) | @Override
    method endObject (line 81) | @Override
    method hasNext (line 88) | @Override
    method peek (line 94) | @Override
    method peekStack (line 138) | private Object peekStack() {
    method popStack (line 142) | private Object popStack() {
    method expect (line 146) | private void expect(JsonToken expected) throws IOException {
    method nextName (line 152) | @Override
    method nextString (line 161) | @Override
    method nextBoolean (line 170) | @Override
    method nextNull (line 176) | @Override
    method nextDouble (line 182) | @Override
    method nextLong (line 196) | @Override
    method nextInt (line 207) | @Override
    method close (line 218) | @Override
    method skipValue (line 224) | @Override
    method toString (line 233) | @Override
    method promoteNameToValue (line 238) | public void promoteNameToValue() throws IOException {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/bind/JsonTreeWriter.java
  class JsonTreeWriter (line 34) | public final class JsonTreeWriter extends JsonWriter {
    method write (line 36) | @Override
    method flush (line 40) | @Override
    method close (line 44) | @Override
    method JsonTreeWriter (line 61) | public JsonTreeWriter() {
    method get (line 68) | public JsonElement get() {
    method peek (line 75) | private JsonElement peek() {
    method put (line 79) | private void put(JsonElement value) {
    method beginArray (line 98) | @Override
    method endArray (line 106) | @Override
    method beginObject (line 119) | @Override
    method endObject (line 127) | @Override
    method name (line 140) | @Override
    method value (line 153) | @Override
    method nullValue (line 162) | @Override
    method value (line 168) | @Override
    method value (line 174) | @Override
    method value (line 183) | @Override
    method value (line 189) | @Override
    method flush (line 206) | @Override
    method close (line 210) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/bind/MapTypeAdapterFactory.java
  class MapTypeAdapterFactory (line 106) | public final class MapTypeAdapterFactory implements TypeAdapterFactory {
    method MapTypeAdapterFactory (line 110) | public MapTypeAdapterFactory(ConstructorConstructor constructorConstru...
    method create (line 116) | public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
    method getKeyAdapter (line 140) | private TypeAdapter<?> getKeyAdapter(Gson context, Type keyType) {
    class Adapter (line 146) | private final class Adapter<K, V> extends TypeAdapter<Map<K, V>> {
      method Adapter (line 151) | public Adapter(Gson context, Type keyType, TypeAdapter<K> keyTypeAda...
      method read (line 161) | public Map<K, V> read(JsonReader in) throws IOException {
      method write (line 199) | public void write(JsonWriter out, Map<K, V> map) throws IOException {
      method keyToString (line 246) | private String keyToString(JsonElement keyElement) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/bind/ObjectTypeAdapter.java
  class ObjectTypeAdapter (line 37) | public final class ObjectTypeAdapter extends TypeAdapter<Object> {
    method create (line 39) | @SuppressWarnings("unchecked")
    method ObjectTypeAdapter (line 50) | private ObjectTypeAdapter(Gson gson) {
    method read (line 54) | @Override
    method write (line 93) | @SuppressWarnings("unchecked")

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/bind/ReflectiveTypeAdapterFactory.java
  class ReflectiveTypeAdapterFactory (line 44) | public final class ReflectiveTypeAdapterFactory implements TypeAdapterFa...
    method ReflectiveTypeAdapterFactory (line 49) | public ReflectiveTypeAdapterFactory(ConstructorConstructor constructor...
    method excludeField (line 56) | public boolean excludeField(Field f, boolean serialize) {
    method getFieldName (line 60) | private String getFieldName(Field f) {
    method create (line 65) | public <T> TypeAdapter<T> create(Gson gson, final TypeToken<T> type) {
    method createBoundField (line 76) | private BoundField createBoundField(
    method getBoundFields (line 104) | private Map<String, BoundField> getBoundFields(Gson context, TypeToken...
    class BoundField (line 135) | static abstract class BoundField {
      method BoundField (line 140) | protected BoundField(String name, boolean serialized, boolean deseri...
      method write (line 146) | abstract void write(JsonWriter writer, Object value) throws IOExcept...
      method read (line 147) | abstract void read(JsonReader reader, Object value) throws IOExcepti...
    class Adapter (line 150) | public final class Adapter<T> extends TypeAdapter<T> {
      method Adapter (line 154) | private Adapter(ObjectConstructor<T> constructor, Map<String, BoundF...
      method read (line 159) | @Override
      method write (line 188) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/bind/SqlDateTypeAdapter.java
  class SqlDateTypeAdapter (line 40) | public final class SqlDateTypeAdapter extends TypeAdapter<Date> {
    method create (line 42) | @SuppressWarnings("unchecked") // we use a runtime check to make sure ...
    method read (line 51) | @Override
    method write (line 65) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/bind/TimeTypeAdapter.java
  class TimeTypeAdapter (line 41) | public final class TimeTypeAdapter extends TypeAdapter<Time> {
    method create (line 43) | @SuppressWarnings("unchecked") // we use a runtime check to make sure ...
    method read (line 51) | @Override
    method write (line 65) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/bind/TypeAdapterRuntimeTypeWrapper.java
  class TypeAdapterRuntimeTypeWrapper (line 28) | final class TypeAdapterRuntimeTypeWrapper<T> extends TypeAdapter<T> {
    method TypeAdapterRuntimeTypeWrapper (line 33) | TypeAdapterRuntimeTypeWrapper(Gson context, TypeAdapter<T> delegate, T...
    method read (line 39) | @Override
    method write (line 44) | @SuppressWarnings({"rawtypes", "unchecked"})
    method getRuntimeTypeIfMoreSpecific (line 75) | private Type getRuntimeTypeIfMoreSpecific(Type type, Object value) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/internal/bind/TypeAdapters.java
  class TypeAdapters (line 56) | public final class TypeAdapters {
    method TypeAdapters (line 57) | private TypeAdapters() {}
    method write (line 61) | @Override
    method read (line 66) | @Override
    method read (line 75) | public BitSet read(JsonReader in) throws IOException {
    method write (line 116) | public void write(JsonWriter out, BitSet src) throws IOException {
    method read (line 134) | @Override
    method write (line 145) | @Override
    method read (line 160) | @Override
    method write (line 169) | @Override
    method read (line 179) | @Override
    method write (line 192) | @Override
    method read (line 202) | @Override
    method write (line 214) | @Override
    method read (line 224) | @Override
    method write (line 236) | @Override
    method read (line 246) | @Override
    method write (line 258) | @Override
    method read (line 265) | @Override
    method write (line 273) | @Override
    method read (line 280) | @Override
    method write (line 288) | @Override
    method read (line 295) | @Override
    method write (line 308) | @Override
    method read (line 317) | @Override
    method write (line 329) | @Override
    method read (line 339) | @Override
    method write (line 352) | @Override
    method read (line 359) | @Override
    method write (line 372) | @Override
    method read (line 379) | @Override
    method write (line 392) | @Override
    method read (line 401) | @Override
    method write (line 409) | @Override
    method read (line 419) | @Override
    method write (line 427) | @Override
    method read (line 437) | @Override
    method write (line 446) | @Override
    method read (line 455) | @Override
    method write (line 468) | @Override
    method read (line 477) | @Override
    method write (line 486) | @Override
    method read (line 496) | @Override
    method write (line 504) | @Override
    method create (line 513) | @SuppressWarnings("unchecked") // we use a runtime check to make sure ...
    method read (line 543) | @Override
    method write (line 577) | @Override
    method read (line 604) | @Override
    method write (line 632) | @Override
    method read (line 641) | @Override
    method write (line 679) | @Override
    class EnumTypeAdapter (line 717) | private static final class EnumTypeAdapter<T extends Enum<T>> extends ...
      method EnumTypeAdapter (line 721) | public EnumTypeAdapter(Class<T> classOfT) {
      method read (line 736) | public T read(JsonReader in) throws IOException {
      method write (line 744) | public void write(JsonWriter out, T value) throws IOException {
    method newEnumTypeHierarchyFactory (line 751) | public static TypeAdapterFactory newEnumTypeHierarchyFactory() {
    method newFactory (line 767) | public static <TT> TypeAdapterFactory newFactory(
    method newFactory (line 777) | public static <TT> TypeAdapterFactory newFactory(
    method newFactory (line 791) | public static <TT> TypeAdapterFactory newFactory(
    method newFactoryForMultipleTypes (line 807) | public static <TT> TypeAdapterFactory newFactoryForMultipleTypes(final...
    method newTypeHierarchyFactory (line 823) | public static <TT> TypeAdapterFactory newTypeHierarchyFactory(

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/reflect/TypeToken.java
  class TypeToken (line 48) | public class TypeToken<T> {
    method TypeToken (line 61) | @SuppressWarnings("unchecked")
    method TypeToken (line 71) | @SuppressWarnings("unchecked")
    method getSuperclassTypeParameter (line 82) | static Type getSuperclassTypeParameter(Class<?> subclass) {
    method getRawType (line 94) | public final Class<? super T> getRawType() {
    method getType (line 101) | public final Type getType() {
    method isAssignableFrom (line 111) | @Deprecated
    method isAssignableFrom (line 122) | @Deprecated
    method isAssignableFrom (line 152) | @Deprecated
    method isAssignableFrom (line 161) | private static boolean isAssignableFrom(Type from, GenericArrayType to) {
    method isAssignableFrom (line 186) | private static boolean isAssignableFrom(Type from, ParameterizedType to,
    method typeEquals (line 239) | private static boolean typeEquals(ParameterizedType from,
    method buildUnexpectedTypeError (line 254) | private static AssertionError buildUnexpectedTypeError(
    method matches (line 273) | private static boolean matches(Type from, Type to, Map<String, Type> t...
    method hashCode (line 280) | @Override
    method equals (line 285) | @Override
    method toString (line 291) | @Override
    method get (line 299) | public static TypeToken<?> get(Type type) {
    method get (line 306) | public static <T> TypeToken<T> get(Class<T> type) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/stream/JsonReader.java
  class JsonReader (line 191) | public class JsonReader implements Closeable {
    method JsonReader (line 255) | public JsonReader(Reader in) {
    method setLenient (line 291) | public final void setLenient(boolean lenient) {
    method isLenient (line 298) | public final boolean isLenient() {
    method beginArray (line 306) | public void beginArray() throws IOException {
    method endArray (line 314) | public void endArray() throws IOException {
    method beginObject (line 322) | public void beginObject() throws IOException {
    method endObject (line 330) | public void endObject() throws IOException {
    method expect (line 337) | private void expect(JsonToken expected) throws IOException {
    method hasNext (line 349) | public boolean hasNext() throws IOException {
    method peek (line 357) | public JsonToken peek() throws IOException {
    method consumeNonExecutePrefix (line 404) | private void consumeNonExecutePrefix() throws IOException {
    method advance (line 426) | private JsonToken advance() throws IOException {
    method nextName (line 443) | public String nextName() throws IOException {
    method nextString (line 462) | public String nextString() throws IOException {
    method nextBoolean (line 481) | public boolean nextBoolean() throws IOException {
    method nextNull (line 500) | public void nextNull() throws IOException {
    method nextDouble (line 519) | public double nextDouble() throws IOException {
    method nextLong (line 551) | public long nextLong() throws IOException {
    method nextInt (line 589) | public int nextInt() throws IOException {
    method close (line 620) | public void close() throws IOException {
    method skipValue (line 633) | public void skipValue() throws IOException {
    method push (line 650) | private void push(JsonScope newTop) {
    method nextInArray (line 659) | @SuppressWarnings("fallthrough")
    method nextInObject (line 698) | @SuppressWarnings("fallthrough")
    method objectValue (line 748) | private JsonToken objectValue() throws IOException {
    method nextValue (line 770) | @SuppressWarnings("fallthrough")
    method fillBuffer (line 799) | private boolean fillBuffer(int minimum) throws IOException {
    method getLineNumber (line 842) | private int getLineNumber() {
    method getColumnNumber (line 852) | private int getColumnNumber() {
    method nextNonWhitespace (line 870) | private int nextNonWhitespace(boolean throwOnEof) throws IOException {
    method checkLenient (line 962) | private void checkLenient() throws IOException {
    method skipToEndOfLine (line 973) | private void skipToEndOfLine() throws IOException {
    method skipTo (line 982) | private boolean skipTo(String toFind) throws IOException {
    method nextString (line 1005) | private String nextString(char quote) throws IOException {
    method nextLiteral (line 1060) | @SuppressWarnings("fallthrough")
    method toString (line 1136) | @Override
    method readEscapeCharacter (line 1151) | private char readEscapeCharacter() throws IOException {
    method readLiteral (line 1206) | private JsonToken readLiteral() throws IOException {
    method decodeLiteral (line 1221) | private JsonToken decodeLiteral() throws IOException {
    method decodeNumber (line 1259) | private JsonToken decodeNumber(char[] chars, int offset, int length) {
    method syntaxError (line 1311) | private IOException syntaxError(String message) throws IOException {
    method promoteNameToValue (line 1318) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/stream/JsonScope.java
  type JsonScope (line 25) | enum JsonScope {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/stream/JsonToken.java
  type JsonToken (line 25) | public enum JsonToken {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/stream/JsonWriter.java
  class JsonWriter (line 124) | public class JsonWriter implements Closeable, Flushable {
    method JsonWriter (line 190) | public JsonWriter(Writer out) {
    method setIndent (line 205) | public final void setIndent(String indent) {
    method setLenient (line 227) | public final void setLenient(boolean lenient) {
    method isLenient (line 234) | public boolean isLenient() {
    method setHtmlSafe (line 245) | public final void setHtmlSafe(boolean htmlSafe) {
    method isHtmlSafe (line 253) | public final boolean isHtmlSafe() {
    method setSerializeNulls (line 261) | public final void setSerializeNulls(boolean serializeNulls) {
    method getSerializeNulls (line 269) | public final boolean getSerializeNulls() {
    method beginArray (line 279) | public JsonWriter beginArray() throws IOException {
    method endArray (line 289) | public JsonWriter endArray() throws IOException {
    method beginObject (line 299) | public JsonWriter beginObject() throws IOException {
    method endObject (line 309) | public JsonWriter endObject() throws IOException {
    method open (line 317) | private JsonWriter open(JsonScope empty, String openBracket) throws IO...
    method close (line 328) | private JsonWriter close(JsonScope empty, JsonScope nonempty, String c...
    method peek (line 349) | private JsonScope peek() {
    method replaceTop (line 360) | private void replaceTop(JsonScope topOfStack) {
    method name (line 370) | public JsonWriter name(String name) throws IOException {
    method writeDeferredName (line 384) | private void writeDeferredName() throws IOException {
    method value (line 398) | public JsonWriter value(String value) throws IOException {
    method nullValue (line 413) | public JsonWriter nullValue() throws IOException {
    method value (line 432) | public JsonWriter value(boolean value) throws IOException {
    method value (line 446) | public JsonWriter value(double value) throws IOException {
    method value (line 461) | public JsonWriter value(long value) throws IOException {
    method value (line 475) | public JsonWriter value(Number value) throws IOException {
    method flush (line 495) | public void flush() throws IOException {
    method close (line 507) | public void close() throws IOException {
    method string (line 517) | private void string(String value) throws IOException {
    method newline (line 549) | private void newline() throws IOException {
    method beforeName (line 564) | private void beforeName() throws IOException {
    method beforeValue (line 583) | @SuppressWarnings("fallthrough")

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/stream/MalformedJsonException.java
  class MalformedJsonException (line 25) | public final class MalformedJsonException extends IOException {
    method MalformedJsonException (line 28) | public MalformedJsonException(String msg) {
    method MalformedJsonException (line 32) | public MalformedJsonException(String msg, Throwable throwable) {
    method MalformedJsonException (line 39) | public MalformedJsonException(Throwable throwable) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/gson/stream/StringPool.java
  class StringPool (line 24) | final class StringPool {
    method get (line 31) | public String get(char[] array, int start, int length) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/AuthFailureError.java
  class AuthFailureError (line 24) | @SuppressWarnings("serial")
    method AuthFailureError (line 29) | public AuthFailureError() { }
    method AuthFailureError (line 31) | public AuthFailureError(Intent intent) {
    method AuthFailureError (line 35) | public AuthFailureError(NetworkResponse response) {
    method AuthFailureError (line 39) | public AuthFailureError(String message) {
    method AuthFailureError (line 43) | public AuthFailureError(String message, Exception reason) {
    method getResolutionIntent (line 47) | public Intent getResolutionIntent() {
    method getMessage (line 51) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/Cache.java
  type Cache (line 25) | public interface Cache {
    method get (line 31) | public Entry get(String key);
    method put (line 38) | public void put(String key, Entry entry);
    method initialize (line 44) | public void initialize();
    method invalidate (line 51) | public void invalidate(String key, boolean fullExpire);
    method remove (line 57) | public void remove(String key);
    method clear (line 62) | public void clear();
    class Entry (line 67) | public static class Entry {
      method isExpired (line 90) | public boolean isExpired() {
      method refreshNeeded (line 95) | public boolean refreshNeeded() {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/CacheDispatcher.java
  class CacheDispatcher (line 32) | public class CacheDispatcher extends Thread {
    method CacheDispatcher (line 60) | public CacheDispatcher(
    method quit (line 73) | public void quit() {
    method run (line 78) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/DefaultRetryPolicy.java
  class DefaultRetryPolicy (line 22) | public class DefaultRetryPolicy implements RetryPolicy {
    method DefaultRetryPolicy (line 48) | public DefaultRetryPolicy() {
    method DefaultRetryPolicy (line 58) | public DefaultRetryPolicy(int initialTimeoutMs, int maxNumRetries, flo...
    method getCurrentTimeout (line 67) | @Override
    method getCurrentRetryCount (line 75) | @Override
    method getBackoffMultiplier (line 83) | public float getBackoffMultiplier() {
    method retry (line 91) | @Override
    method hasAttemptRemaining (line 103) | protected boolean hasAttemptRemaining() {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/ExecutorDelivery.java
  class ExecutorDelivery (line 26) | public class ExecutorDelivery implements ResponseDelivery {
    method ExecutorDelivery (line 34) | public ExecutorDelivery(final Handler handler) {
    method ExecutorDelivery (line 49) | public ExecutorDelivery(Executor executor) {
    method postResponse (line 53) | @Override
    method postResponse (line 58) | @Override
    method postError (line 65) | @Override
    class ResponseDeliveryRunnable (line 76) | @SuppressWarnings("rawtypes")
      method ResponseDeliveryRunnable (line 82) | public ResponseDeliveryRunnable(Request request, Response response, ...
      method run (line 88) | @SuppressWarnings("unchecked")

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/InternalUtils.java
  class InternalUtils (line 12) | class InternalUtils {
    method convertToHex (line 17) | private static String convertToHex(byte[] bytes) {
    method sha1Hash (line 27) | public static String sha1Hash(String text) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/Network.java
  type Network (line 22) | public interface Network {
    method performRequest (line 29) | public NetworkResponse performRequest(Request<?> request) throws Volle...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/NetworkDispatcher.java
  class NetworkDispatcher (line 35) | public class NetworkDispatcher extends Thread {
    method NetworkDispatcher (line 56) | public NetworkDispatcher(BlockingQueue<Request<?>> queue,
    method quit (line 69) | public void quit() {
    method addTrafficStatsTag (line 74) | @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    method run (line 82) | @Override
    method parseAndDeliverNetworkError (line 150) | private void parseAndDeliverNetworkError(Request<?> request, VolleyErr...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/NetworkError.java
  class NetworkError (line 22) | @SuppressWarnings("serial")
    method NetworkError (line 24) | public NetworkError() {
    method NetworkError (line 28) | public NetworkError(Throwable cause) {
    method NetworkError (line 32) | public NetworkError(NetworkResponse networkResponse) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/NetworkResponse.java
  class NetworkResponse (line 28) | public class NetworkResponse implements Serializable {
    method NetworkResponse (line 39) | public NetworkResponse(int statusCode, byte[] data, Map<String, String...
    method NetworkResponse (line 48) | public NetworkResponse(int statusCode, byte[] data, Map<String, String...
    method NetworkResponse (line 53) | public NetworkResponse(byte[] data) {
    method NetworkResponse (line 57) | public NetworkResponse(byte[] data, Map<String, String> headers) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/NoConnectionError.java
  class NoConnectionError (line 22) | @SuppressWarnings("serial")
    method NoConnectionError (line 24) | public NoConnectionError() {
    method NoConnectionError (line 28) | public NoConnectionError(Throwable reason) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/ParseError.java
  class ParseError (line 22) | @SuppressWarnings("serial")
    method ParseError (line 24) | public ParseError() { }
    method ParseError (line 26) | public ParseError(NetworkResponse networkResponse) {
    method ParseError (line 30) | public ParseError(Throwable cause) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/RedirectError.java
  class RedirectError (line 6) | public class RedirectError extends VolleyError {
    method RedirectError (line 8) | public RedirectError() {
    method RedirectError (line 11) | public RedirectError(final Throwable cause) {
    method RedirectError (line 15) | public RedirectError(final NetworkResponse response) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/Request.java
  class Request (line 37) | public abstract class Request<T> implements Comparable<Request<T>> {
    type Method (line 47) | public interface Method {
    method Request (line 119) | @Deprecated
    method Request (line 130) | public Request(int method, String url, Response.ErrorListener listener) {
    method getMethod (line 143) | public int getMethod() {
    method setTag (line 153) | public Request<?> setTag(Object tag) {
    method getTag (line 162) | public Object getTag() {
    method getErrorListener (line 169) | public Response.ErrorListener getErrorListener() {
    method getTrafficStatsTag (line 176) | public int getTrafficStatsTag() {
    method findDefaultTrafficStatsTag (line 183) | private static int findDefaultTrafficStatsTag(String url) {
    method setRetryPolicy (line 201) | public Request<?> setRetryPolicy(RetryPolicy retryPolicy) {
    method addMarker (line 209) | public void addMarker(String tag) {
    method finish (line 220) | void finish(final String tag) {
    method onFinish (line 249) | protected void onFinish() {
    method setRequestQueue (line 259) | public Request<?> setRequestQueue(RequestQueue requestQueue) {
    method setSequence (line 269) | public final Request<?> setSequence(int sequence) {
    method getSequence (line 277) | public final int getSequence() {
    method getUrl (line 287) | public String getUrl() {
    method getOriginUrl (line 294) | public String getOriginUrl() {
    method getIdentifier (line 301) | public String getIdentifier() {
    method setRedirectUrl (line 308) | public void setRedirectUrl(String redirectUrl) {
    method getCacheKey (line 315) | public String getCacheKey() {
    method setCacheEntry (line 325) | public Request<?> setCacheEntry(Cache.Entry entry) {
    method getCacheEntry (line 333) | public Cache.Entry getCacheEntry() {
    method cancel (line 340) | public void cancel() {
    method isCanceled (line 347) | public boolean isCanceled() {
    method getHeaders (line 357) | public Map<String, String> getHeaders() throws AuthFailureError {
    method getPostParams (line 372) | @Deprecated
    method getPostParamsEncoding (line 391) | @Deprecated
    method getPostBodyContentType (line 399) | @Deprecated
    method getPostBody (line 411) | @Deprecated
    method getParams (line 432) | protected Map<String, String> getParams() throws AuthFailureError {
    method getParamsEncoding (line 448) | protected String getParamsEncoding() {
    method getBodyContentType (line 455) | public String getBodyContentType() {
    method getBody (line 468) | public byte[] getBody() throws AuthFailureError {
    method encodeParameters (line 479) | private byte[] encodeParameters(Map<String, String> params, String par...
    method setShouldCache (line 499) | public final Request<?> setShouldCache(boolean shouldCache) {
    method shouldCache (line 507) | public final boolean shouldCache() {
    type Priority (line 515) | public enum Priority {
    method getPriority (line 525) | public Priority getPriority() {
    method getTimeoutMs (line 534) | public final int getTimeoutMs() {
    method getRetryPolicy (line 541) | public RetryPolicy getRetryPolicy() {
    method markDelivered (line 549) | public void markDelivered() {
    method hasHadResponseDelivered (line 556) | public boolean hasHadResponseDelivered() {
    method parseNetworkResponse (line 568) | abstract protected Response<T> parseNetworkResponse(NetworkResponse re...
    method parseNetworkError (line 578) | protected VolleyError parseNetworkError(VolleyError volleyError) {
    method deliverResponse (line 589) | abstract protected void deliverResponse(T response);
    method deliverError (line 597) | public void deliverError(VolleyError error) {
    method compareTo (line 607) | @Override
    method toString (line 619) | @Override
    method createIdentifier (line 633) | private static String createIdentifier(final int method, final String ...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/RequestQueue.java
  class RequestQueue (line 40) | public class RequestQueue {
    type RequestFinishedListener (line 43) | public static interface RequestFinishedListener<T> {
      method onRequestFinished (line 45) | public void onRequestFinished(Request<T> request);
    method RequestQueue (line 108) | public RequestQueue(Cache cache, Network network, int threadPoolSize,
    method RequestQueue (line 123) | public RequestQueue(Cache cache, Network network, int threadPoolSize) {
    method RequestQueue (line 134) | public RequestQueue(Cache cache, Network network) {
    method start (line 141) | public void start() {
    method stop (line 159) | public void stop() {
    method getSequenceNumber (line 173) | public int getSequenceNumber() {
    method getCache (line 180) | public Cache getCache() {
    type RequestFilter (line 188) | public interface RequestFilter {
      method apply (line 189) | public boolean apply(Request<?> request);
    method cancelAll (line 196) | public void cancelAll(RequestFilter filter) {
    method cancelAll (line 210) | public void cancelAll(final Object tag) {
    method add (line 227) | public <T> Request<T> add(Request<T> request) {
    method finish (line 275) | <T> void finish(Request<T> request) {
    method addRequestFinishedListener (line 303) | public  <T> void addRequestFinishedListener(RequestFinishedListener<T>...
    method removeRequestFinishedListener (line 312) | public  <T> void removeRequestFinishedListener(RequestFinishedListener...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/Response.java
  class Response (line 24) | public class Response<T> {
    type Listener (line 27) | public interface Listener<T> {
      method onResponse (line 29) | public void onResponse(T response);
    type ErrorListener (line 33) | public interface ErrorListener {
      method onErrorResponse (line 38) | public void onErrorResponse(VolleyError error);
    method success (line 42) | public static <T> Response<T> success(T result, Cache.Entry cacheEntry) {
    method error (line 50) | public static <T> Response<T> error(VolleyError error) {
    method isSuccess (line 69) | public boolean isSuccess() {
    method Response (line 74) | private Response(T result, Cache.Entry cacheEntry) {
    method Response (line 80) | private Response(VolleyError error) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/ResponseDelivery.java
  type ResponseDelivery (line 19) | public interface ResponseDelivery {
    method postResponse (line 23) | public void postResponse(Request<?> request, Response<?> response);
    method postResponse (line 29) | public void postResponse(Request<?> request, Response<?> response, Run...
    method postError (line 34) | public void postError(Request<?> request, VolleyError error);

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/RetryPolicy.java
  type RetryPolicy (line 22) | public interface RetryPolicy {
    method getCurrentTimeout (line 27) | public int getCurrentTimeout();
    method getCurrentRetryCount (line 32) | public int getCurrentRetryCount();
    method retry (line 40) | public void retry(VolleyError error) throws VolleyError;

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/ServerError.java
  class ServerError (line 22) | @SuppressWarnings("serial")
    method ServerError (line 24) | public ServerError(NetworkResponse networkResponse) {
    method ServerError (line 28) | public ServerError() {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/TimeoutError.java
  class TimeoutError (line 22) | @SuppressWarnings("serial")

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/VolleyError.java
  class VolleyError (line 25) | @SuppressWarnings("serial")
    method VolleyError (line 30) | public VolleyError() {
    method VolleyError (line 34) | public VolleyError(NetworkResponse response) {
    method VolleyError (line 38) | public VolleyError(String exceptionMessage) {
    method VolleyError (line 43) | public VolleyError(String exceptionMessage, Throwable reason) {
    method VolleyError (line 48) | public VolleyError(Throwable cause) {
    method setNetworkTimeMs (line 53) | void setNetworkTimeMs(long networkTimeMs) {
    method getNetworkTimeMs (line 57) | public long getNetworkTimeMs() {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/VolleyLog.java
  class VolleyLog (line 32) | public class VolleyLog {
    method setTag (line 45) | public static void setTag(String tag) {
    method v (line 53) | public static void v(String format, Object... args) {
    method d (line 59) | public static void d(String format, Object... args) {
    method e (line 63) | public static void e(String format, Object... args) {
    method e (line 67) | public static void e(Throwable tr, String format, Object... args) {
    method wtf (line 71) | public static void wtf(String format, Object... args) {
    method wtf (line 75) | public static void wtf(Throwable tr, String format, Object... args) {
    method buildMessage (line 83) | private static String buildMessage(String format, Object... args) {
    class MarkerLog (line 108) | static class MarkerLog {
      class Marker (line 114) | private static class Marker {
        method Marker (line 119) | public Marker(String name, long thread, long time) {
      method add (line 130) | public synchronized void add(String name, long threadId) {
      method finish (line 143) | public synchronized void finish(String header) {
      method finalize (line 160) | @Override
      method getTotalDuration (line 171) | private long getTotalDuration() {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/AndroidAuthenticator.java
  class AndroidAuthenticator (line 32) | public class AndroidAuthenticator implements Authenticator {
    method AndroidAuthenticator (line 44) | public AndroidAuthenticator(Context context, Account account, String a...
    method AndroidAuthenticator (line 55) | public AndroidAuthenticator(Context context, Account account, String a...
    method AndroidAuthenticator (line 61) | AndroidAuthenticator(AccountManager accountManager, Account account,
    method getAccount (line 72) | public Account getAccount() {
    method getAuthToken (line 77) | @SuppressWarnings("deprecation")
    method invalidateAuthToken (line 103) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/Authenticator.java
  type Authenticator (line 24) | public interface Authenticator {
    method getAuthToken (line 30) | public String getAuthToken() throws AuthFailureError;
    method invalidateAuthToken (line 35) | public void invalidateAuthToken(String authToken);

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/BasicNetwork.java
  class BasicNetwork (line 56) | public class BasicNetwork implements Network {
    method BasicNetwork (line 70) | public BasicNetwork(HttpStack httpStack) {
    method BasicNetwork (line 80) | public BasicNetwork(HttpStack httpStack, ByteArrayPool pool) {
    method performRequest (line 85) | @Override
    method logSlowRequests (line 190) | private void logSlowRequests(long requestLifetime, Request<?> request,
    method attemptRetryOnException (line 205) | private static void attemptRetryOnException(String logPrefix, Request<...
    method addCacheHeaders (line 220) | private void addCacheHeaders(Map<String, String> headers, Cache.Entry ...
    method logError (line 236) | protected void logError(String what, String url, long start) {
    method entityToBytes (line 242) | private byte[] entityToBytes(HttpEntity entity) throws IOException, Se...
    method convertHeaders (line 274) | protected static Map<String, String> convertHeaders(Header[] headers) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/ByteArrayPool.java
  class ByteArrayPool (line 54) | public class ByteArrayPool {
    method compare (line 70) | @Override
    method ByteArrayPool (line 79) | public ByteArrayPool(int sizeLimit) {
    method getBuf (line 91) | public synchronized byte[] getBuf(int len) {
    method returnBuf (line 110) | public synchronized void returnBuf(byte[] buf) {
    method trim (line 127) | private synchronized void trim() {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/ClearCacheRequest.java
  class ClearCacheRequest (line 30) | public class ClearCacheRequest extends Request<Object> {
    method ClearCacheRequest (line 40) | public ClearCacheRequest(Cache cache, Runnable callback) {
    method isCanceled (line 46) | @Override
    method getPriority (line 57) | @Override
    method parseNetworkResponse (line 62) | @Override
    method deliverResponse (line 67) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/DiskBasedCache.java
  class DiskBasedCache (line 44) | public class DiskBasedCache implements Cache {
    method DiskBasedCache (line 73) | public DiskBasedCache(File rootDirectory, int maxCacheSizeInBytes) {
    method DiskBasedCache (line 83) | public DiskBasedCache(File rootDirectory) {
    method clear (line 90) | @Override
    method get (line 106) | @Override
    method initialize (line 144) | @Override
    method invalidate (line 183) | @Override
    method put (line 199) | @Override
    method remove (line 227) | @Override
    method getFilenameForKey (line 242) | private String getFilenameForKey(String key) {
    method getFileForKey (line 252) | public File getFileForKey(String key) {
    method pruneIfNeeded (line 260) | private void pruneIfNeeded(int neededSpace) {
    method putEntry (line 302) | private void putEntry(String key, CacheHeader entry) {
    method removeEntry (line 315) | private void removeEntry(String key) {
    method streamToBytes (line 326) | private static byte[] streamToBytes(InputStream in, int length) throws...
    class CacheHeader (line 343) | static class CacheHeader {
      method CacheHeader (line 369) | private CacheHeader() { }
      method CacheHeader (line 376) | public CacheHeader(String key, Entry entry) {
      method readHeader (line 392) | public static CacheHeader readHeader(InputStream is) throws IOExcept...
      method toCacheEntry (line 416) | public Entry toCacheEntry(byte[] data) {
      method writeHeader (line 432) | public boolean writeHeader(OutputStream os) {
    class CountingInputStream (line 452) | private static class CountingInputStream extends FilterInputStream {
      method CountingInputStream (line 455) | private CountingInputStream(InputStream in) {
      method read (line 459) | @Override
      method read (line 468) | @Override
    method read (line 489) | private static int read(InputStream is) throws IOException {
    method writeInt (line 497) | static void writeInt(OutputStream os, int n) throws IOException {
    method readInt (line 504) | static int readInt(InputStream is) throws IOException {
    method writeLong (line 513) | static void writeLong(OutputStream os, long n) throws IOException {
    method readLong (line 524) | static long readLong(InputStream is) throws IOException {
    method writeString (line 537) | static void writeString(OutputStream os, String s) throws IOException {
    method readString (line 543) | static String readString(InputStream is) throws IOException {
    method writeStringStringMap (line 549) | static void writeStringStringMap(Map<String, String> map, OutputStream...
    method readStringStringMap (line 561) | static Map<String, String> readStringStringMap(InputStream is) throws ...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/HttpClientStack.java
  class HttpClientStack (line 49) | public class HttpClientStack implements HttpStack {
    method HttpClientStack (line 54) | public HttpClientStack(HttpClient client) {
    method addHeaders (line 58) | private static void addHeaders(HttpUriRequest httpRequest, Map<String,...
    method getPostParameterPairs (line 64) | @SuppressWarnings("unused")
    method performRequest (line 73) | @Override
    method createHttpRequest (line 92) | @SuppressWarnings("deprecation")
    method setEntityIfNonEmptyBody (line 145) | private static void setEntityIfNonEmptyBody(HttpEntityEnclosingRequest...
    method onPrepareRequest (line 159) | protected void onPrepareRequest(HttpUriRequest request) throws IOExcep...
    class HttpPatch (line 166) | public static final class HttpPatch extends HttpEntityEnclosingRequest...
      method HttpPatch (line 170) | public HttpPatch() {
      method HttpPatch (line 174) | public HttpPatch(final URI uri) {
      method HttpPatch (line 182) | public HttpPatch(final String uri) {
      method getMethod (line 187) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/HttpHeaderParser.java
  class HttpHeaderParser (line 31) | public class HttpHeaderParser {
    method parseCacheHeaders (line 39) | public static Cache.Entry parseCacheHeaders(NetworkResponse response) {
    method parseDateAsEpoch (line 126) | public static long parseDateAsEpoch(String dateStr) {
    method parseCharset (line 144) | public static String parseCharset(Map<String, String> headers, String ...
    method parseCharset (line 165) | public static String parseCharset(Map<String, String> headers) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/HttpStack.java
  type HttpStack (line 30) | public interface HttpStack {
    method performRequest (line 42) | public HttpResponse performRequest(Request<?> request, Map<String, Str...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/HurlStack.java
  class HurlStack (line 49) | public class HurlStack implements HttpStack {
    type UrlRewriter (line 56) | public interface UrlRewriter {
      method rewriteUrl (line 61) | public String rewriteUrl(String originalUrl);
    method HurlStack (line 67) | public HurlStack() {
    method HurlStack (line 74) | public HurlStack(UrlRewriter urlRewriter) {
    method HurlStack (line 82) | public HurlStack(UrlRewriter urlRewriter, SSLSocketFactory sslSocketFa...
    method performRequest (line 87) | @Override
    method hasResponseBody (line 137) | private static boolean hasResponseBody(int requestMethod, int response...
    method entityFromConnection (line 149) | private static HttpEntity entityFromConnection(HttpURLConnection conne...
    method createConnection (line 167) | protected HttpURLConnection createConnection(URL url) throws IOExcepti...
    method openConnection (line 177) | private HttpURLConnection openConnection(URL url, Request<?> request) ...
    method setConnectionParametersForRequest (line 194) | @SuppressWarnings("deprecation")
    method addBodyIfExists (line 250) | private static void addBodyIfExists(HttpURLConnection connection, Requ...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/ImageLoader.java
  class ImageLoader (line 43) | public class ImageLoader {
    type ImageCache (line 75) | public interface ImageCache {
      method getBitmap (line 76) | public Bitmap getBitmap(String url);
      method putBitmap (line 77) | public void putBitmap(String url, Bitmap bitmap);
    method ImageLoader (line 85) | public ImageLoader(RequestQueue queue, ImageCache imageCache) {
    method getImageListener (line 98) | public static ImageListener getImageListener(final ImageView view,
    type ImageListener (line 132) | public interface ImageListener extends ErrorListener {
      method onResponse (line 143) | public void onResponse(ImageContainer response, boolean isImmediate);
    method isCached (line 153) | public boolean isCached(String requestUrl, int maxWidth, int maxHeight) {
    method isCached (line 166) | public boolean isCached(String requestUrl, int maxWidth, int maxHeight...
    method get (line 182) | public ImageContainer get(String requestUrl, final ImageListener liste...
    method get (line 190) | public ImageContainer get(String requestUrl, ImageListener imageListener,
    method get (line 208) | public ImageContainer get(String requestUrl, ImageListener imageListener,
    method makeImageRequest (line 251) | protected Request<Bitmap> makeImageRequest(String requestUrl, int maxW...
    method setBatchedResponseDelay (line 271) | public void setBatchedResponseDelay(int newBatchedResponseDelayMs) {
    method onGetImageSuccess (line 280) | protected void onGetImageSuccess(String cacheKey, Bitmap response) {
    method onGetImageError (line 300) | protected void onGetImageError(String cacheKey, VolleyError error) {
    class ImageContainer (line 317) | public class ImageContainer {
      method ImageContainer (line 338) | public ImageContainer(Bitmap bitmap, String requestUrl,
      method cancelRequest (line 349) | public void cancelRequest() {
      method getBitmap (line 375) | public Bitmap getBitmap() {
      method getRequestUrl (line 382) | public String getRequestUrl() {
    class BatchedImageRequest (line 391) | private class BatchedImageRequest {
      method BatchedImageRequest (line 409) | public BatchedImageRequest(Request<?> request, ImageContainer contai...
      method setError (line 417) | public void setError(VolleyError error) {
      method getError (line 424) | public VolleyError getError() {
      method addContainer (line 432) | public void addContainer(ImageContainer container) {
      method removeContainerAndCancelIfNecessary (line 442) | public boolean removeContainerAndCancelIfNecessary(ImageContainer co...
    method batchResponse (line 457) | private void batchResponse(String cacheKey, BatchedImageRequest reques...
    method throwIfNotOnMainThread (line 491) | private void throwIfNotOnMainThread() {
    method getCacheKey (line 503) | private static String getCacheKey(String url, int maxWidth, int maxHei...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/ImageRequest.java
  class ImageRequest (line 35) | public class ImageRequest extends Request<Bitmap> {
    method ImageRequest (line 72) | public ImageRequest(String url, Response.Listener<Bitmap> listener, in...
    method ImageRequest (line 88) | @Deprecated
    method getPriority (line 94) | @Override
    method getResizedDimension (line 111) | private static int getResizedDimension(int maxPrimary, int maxSecondar...
    method parseNetworkResponse (line 154) | @Override
    method doParse (line 170) | private Response<Bitmap> doParse(NetworkResponse response) {
    method deliverResponse (line 217) | @Override
    method findBestSampleSize (line 232) | static int findBestSampleSize(

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/JsonArrayRequest.java
  class JsonArrayRequest (line 34) | public class JsonArrayRequest extends JsonRequest<JSONArray> {
    method JsonArrayRequest (line 45) | public JsonArrayRequest(int method, String url, String requestBody,
    method JsonArrayRequest (line 57) | public JsonArrayRequest(String url, Listener<JSONArray> listener, Erro...
    method JsonArrayRequest (line 68) | public JsonArrayRequest(int method, String url, Listener<JSONArray> li...
    method JsonArrayRequest (line 81) | public JsonArrayRequest(int method, String url, JSONArray jsonRequest,
    method JsonArrayRequest (line 96) | public JsonArrayRequest(int method, String url, JSONObject jsonRequest,
    method JsonArrayRequest (line 108) | public JsonArrayRequest(String url, JSONArray jsonRequest, Listener<JS...
    method JsonArrayRequest (line 120) | public JsonArrayRequest(String url, JSONObject jsonRequest, Listener<J...
    method parseNetworkResponse (line 126) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/JsonObjectRequest.java
  class JsonObjectRequest (line 32) | public class JsonObjectRequest extends JsonRequest<JSONObject> {
    method JsonObjectRequest (line 43) | public JsonObjectRequest(int method, String url, String requestBody,
    method JsonObjectRequest (line 55) | public JsonObjectRequest(String url, Response.Listener<JSONObject> lis...
    method JsonObjectRequest (line 66) | public JsonObjectRequest(int method, String url, Response.Listener<JSO...
    method JsonObjectRequest (line 79) | public JsonObjectRequest(int method, String url, JSONObject jsonRequest,
    method JsonObjectRequest (line 91) | public JsonObjectRequest(String url, JSONObject jsonRequest, Response....
    method parseNetworkResponse (line 97) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/JsonRequest.java
  class JsonRequest (line 34) | public abstract class JsonRequest<T> extends Request<T> {
    method JsonRequest (line 51) | public JsonRequest(String url, String requestBody, Listener<T> listener,
    method JsonRequest (line 56) | public JsonRequest(int method, String url, String requestBody, Listene...
    method onFinish (line 63) | @Override
    method deliverResponse (line 69) | @Override
    method parseNetworkResponse (line 76) | @Override
    method getPostBodyContentType (line 82) | @Override
    method getPostBody (line 90) | @Override
    method getBodyContentType (line 95) | @Override
    method getBody (line 100) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/NetworkImageView.java
  class NetworkImageView (line 30) | public class NetworkImageView extends ImageView {
    method NetworkImageView (line 50) | public NetworkImageView(Context context) {
    method NetworkImageView (line 54) | public NetworkImageView(Context context, AttributeSet attrs) {
    method NetworkImageView (line 58) | public NetworkImageView(Context context, AttributeSet attrs, int defSt...
    method setImageUrl (line 74) | public void setImageUrl(String url, ImageLoader imageLoader) {
    method getImageURL (line 86) | public String getImageURL()
    method setDefaultImageResId (line 95) | public void setDefaultImageResId(int defaultImage) {
    method setErrorImageResId (line 103) | public void setErrorImageResId(int errorImage) {
    method loadImageIfNecessary (line 111) | void loadImageIfNecessary(final boolean isInLayoutPass) {
    method setDefaultImageOrNull (line 195) | private void setDefaultImageOrNull() {
    method onLayout (line 204) | @Override
    method onDetachedFromWindow (line 210) | @Override
    method drawableStateChanged (line 223) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/NoCache.java
  class NoCache (line 24) | public class NoCache implements Cache {
    method clear (line 25) | @Override
    method get (line 29) | @Override
    method put (line 34) | @Override
    method invalidate (line 38) | @Override
    method remove (line 42) | @Override
    method initialize (line 46) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/PoolingByteArrayOutputStream.java
  class PoolingByteArrayOutputStream (line 26) | public class PoolingByteArrayOutputStream extends ByteArrayOutputStream {
    method PoolingByteArrayOutputStream (line 39) | public PoolingByteArrayOutputStream(ByteArrayPool pool) {
    method PoolingByteArrayOutputStream (line 51) | public PoolingByteArrayOutputStream(ByteArrayPool pool, int size) {
    method close (line 56) | @Override
    method finalize (line 63) | @Override
    method expand (line 71) | private void expand(int i) {
    method write (line 82) | @Override
    method write (line 88) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/RequestFuture.java
  class RequestFuture (line 54) | public class RequestFuture<T> implements Future<T>, Response.Listener<T>,
    method newFuture (line 61) | public static <E> RequestFuture<E> newFuture() {
    method RequestFuture (line 65) | private RequestFuture() {}
    method setRequest (line 67) | public void setRequest(Request<?> request) {
    method cancel (line 71) | @Override
    method get (line 85) | @Override
    method get (line 94) | @Override
    method doGet (line 100) | private synchronized T doGet(Long timeoutMs)
    method isCancelled (line 127) | @Override
    method isDone (line 135) | @Override
    method onResponse (line 140) | @Override
    method onErrorResponse (line 147) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/StringRequest.java
  class StringRequest (line 28) | public class StringRequest extends Request<String> {
    method StringRequest (line 39) | public StringRequest(int method, String url, Response.Listener<String>...
    method StringRequest (line 54) | public StringRequest(int get, String url, boolean b, Response.Listener...
    method onFinish (line 58) | @Override
    method deliverResponse (line 64) | @Override
    method parseNetworkResponse (line 71) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/google/volley/toolbox/Volley.java
  class Volley (line 30) | public class Volley {
    method newRequestQueue (line 44) | public static RequestQueue newRequestQueue(Context context, HttpStack ...
    method newRequestQueue (line 92) | public static RequestQueue newRequestQueue(Context context, int maxDis...
    method newRequestQueue (line 103) | public static RequestQueue newRequestQueue(Context context, HttpStack ...
    method newRequestQueue (line 114) | public static RequestQueue newRequestQueue(Context context) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/logger/AndroidLogAdapter.java
  class AndroidLogAdapter (line 3) | public class AndroidLogAdapter implements LogAdapter {
    method AndroidLogAdapter (line 7) | public AndroidLogAdapter() {
    method AndroidLogAdapter (line 11) | public AndroidLogAdapter(FormatStrategy formatStrategy) {
    method isLoggable (line 15) | @Override
    method log (line 20) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/logger/CsvFormatStrategy.java
  class CsvFormatStrategy (line 17) | public class CsvFormatStrategy implements FormatStrategy {
    method CsvFormatStrategy (line 28) | private CsvFormatStrategy(Builder builder) {
    method newBuilder (line 35) | public static Builder newBuilder() {
    method log (line 39) | @Override
    method formatTag (line 76) | private String formatTag(String tag) {
    class Builder (line 83) | public static final class Builder {
      method Builder (line 91) | private Builder() {
      method date (line 94) | public Builder date(Date val) {
      method dateFormat (line 99) | public Builder dateFormat(SimpleDateFormat val) {
      method logStrategy (line 104) | public Builder logStrategy(LogStrategy val) {
      method tag (line 109) | public Builder tag(String tag) {
      method build (line 114) | public CsvFormatStrategy build() {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/logger/DiskLogAdapter.java
  class DiskLogAdapter (line 3) | public class DiskLogAdapter implements LogAdapter {
    method DiskLogAdapter (line 7) | public DiskLogAdapter() {
    method DiskLogAdapter (line 11) | public DiskLogAdapter(FormatStrategy formatStrategy) {
    method isLoggable (line 15) | @Override
    method log (line 20) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/logger/DiskLogStrategy.java
  class DiskLogStrategy (line 15) | public class DiskLogStrategy implements LogStrategy {
    method DiskLogStrategy (line 19) | public DiskLogStrategy(Handler handler) {
    method log (line 23) | @Override
    class WriteHandler (line 29) | static class WriteHandler extends Handler {
      method WriteHandler (line 34) | WriteHandler(Looper looper, String folder, int maxFileSize) {
      method handleMessage (line 40) | @SuppressWarnings("checkstyle:emptyblock")
      method writeLog (line 72) | private void writeLog(FileWriter fileWriter, String content) throws ...
      method getLogFile (line 76) | private File getLogFile(String folderName, String fileName) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/logger/FormatStrategy.java
  type FormatStrategy (line 3) | public interface FormatStrategy {
    method log (line 5) | void log(int priority, String tag, String message);

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/logger/LogAdapter.java
  type LogAdapter (line 3) | public interface LogAdapter {
    method isLoggable (line 5) | boolean isLoggable(int priority, String tag);
    method log (line 7) | void log(int priority, String tag, String message);

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/logger/LogStrategy.java
  type LogStrategy (line 3) | public interface LogStrategy {
    method log (line 5) | void log(int priority, String tag, String message);

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/logger/LogcatLogStrategy.java
  class LogcatLogStrategy (line 5) | public class LogcatLogStrategy implements LogStrategy {
    method log (line 7) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/logger/Logger.java
  class Logger (line 6) | public final class Logger {
    method Logger (line 17) | private Logger() {
    method printer (line 21) | public static void printer(Printer printer) {
    method addLogAdapter (line 25) | public static void addLogAdapter(LogAdapter adapter) {
    method clearLogAdapters (line 29) | public static void clearLogAdapters() {
    method t (line 38) | public static Printer t(String tag) {
    method log (line 45) | public static void log(int priority, String tag, String message, Throw...
    method d (line 49) | public static void d(String message, Object... args) {
    method d (line 53) | public static void d(Object object) {
    method e (line 57) | public static void e(String message, Object... args) {
    method e (line 61) | public static void e(Throwable throwable, String message, Object... ar...
    method i (line 65) | public static void i(String message, Object... args) {
    method v (line 69) | public static void v(String message, Object... args) {
    method w (line 73) | public static void w(String message, Object... args) {
    method wtf (line 81) | public static void wtf(String message, Object... args) {
    method json (line 88) | public static void json(String json) {
    method xml (line 95) | public static void xml(String xml) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/logger/LoggerPrinter.java
  class LoggerPrinter (line 20) | class LoggerPrinter implements Printer {
    method t (line 34) | @Override
    method d (line 42) | @Override
    method d (line 47) | @Override
    method e (line 52) | @Override
    method e (line 57) | @Override
    method w (line 62) | @Override
    method i (line 67) | @Override
    method v (line 72) | @Override
    method wtf (line 77) | @Override
    method json (line 82) | @Override
    method xml (line 108) | @Override
    method log (line 127) | @Override
    method clearLogAdapters (line 146) | @Override
    method addAdapter (line 151) | @Override
    method log (line 159) | private synchronized void log(int priority, Throwable throwable, Strin...
    method getTag (line 168) | private String getTag() {
    method createMessage (line 177) | private String createMessage(String message, Object... args) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/logger/PrettyFormatStrategy.java
  class PrettyFormatStrategy (line 3) | public class PrettyFormatStrategy implements FormatStrategy {
    method PrettyFormatStrategy (line 36) | private PrettyFormatStrategy(Builder builder) {
    method newBuilder (line 44) | public static Builder newBuilder() {
    method log (line 48) | @Override
    method logTopBorder (line 77) | private void logTopBorder(int logType, String tag) {
    method logHeaderContent (line 81) | @SuppressWarnings("StringBufferReplaceableByString")
    method logBottomBorder (line 120) | private void logBottomBorder(int logType, String tag) {
    method logDivider (line 124) | private void logDivider(int logType, String tag) {
    method logContent (line 128) | private void logContent(int logType, String tag, String chunk) {
    method logChunk (line 135) | private void logChunk(int priority, String tag, String chunk) {
    method getSimpleClassName (line 139) | private String getSimpleClassName(String name) {
    method getStackOffset (line 150) | private int getStackOffset(StackTraceElement[] trace) {
    method formatTag (line 161) | private String formatTag(String tag) {
    class Builder (line 168) | public static class Builder {
      method Builder (line 175) | private Builder() {
      method methodCount (line 178) | public Builder methodCount(int val) {
      method methodOffset (line 183) | public Builder methodOffset(int val) {
      method showThreadInfo (line 188) | public Builder showThreadInfo(boolean val) {
      method logStrategy (line 193) | public Builder logStrategy(LogStrategy val) {
      method tag (line 198) | public Builder tag(String tag) {
      method build (line 203) | public PrettyFormatStrategy build() {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/logger/Printer.java
  type Printer (line 3) | public interface Printer {
    method addAdapter (line 5) | void addAdapter(LogAdapter adapter);
    method t (line 7) | Printer t(String tag);
    method d (line 9) | void d(String message, Object... args);
    method d (line 11) | void d(Object object);
    method e (line 13) | void e(String message, Object... args);
    method e (line 15) | void e(Throwable throwable, String message, Object... args);
    method w (line 17) | void w(String message, Object... args);
    method i (line 19) | void i(String message, Object... args);
    method v (line 21) | void v(String message, Object... args);
    method wtf (line 23) | void wtf(String message, Object... args);
    method json (line 28) | void json(String json);
    method xml (line 33) | void xml(String xml);
    method log (line 35) | void log(int priority, String tag, String message, Throwable throwable);
    method clearLogAdapters (line 37) | void clearLogAdapters();

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/logger/Utils.java
  class Utils (line 11) | final class Utils {
    method Utils (line 13) | private Utils() {
    method isEmpty (line 23) | static boolean isEmpty(CharSequence str) {
    method equals (line 39) | static boolean equals(CharSequence a, CharSequence b) {
    method getStackTraceString (line 63) | static String getStackTraceString(Throwable tr) {
    method logLevel (line 85) | static String logLevel(int value) {
    method toString (line 104) | public static String toString(Object object) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/walle/WalleChannelReader.java
  class WalleChannelReader (line 20) | public final class WalleChannelReader {
    method WalleChannelReader (line 21) | private WalleChannelReader() {
    method getChannel (line 31) | public static String getChannel(final Context context) {
    method getChannel (line 42) | public static String getChannel(final Context context, final String de...
    method getChannelInfo (line 56) | public static ChannelInfo getChannelInfo(final Context context) {
    method get (line 71) | public static String get(final Context context, final String key) {
    method getChannelInfoMap (line 85) | public static Map<String, String> getChannelInfoMap(final Context cont...
    method getApkPath (line 93) | private static String getApkPath(final Context context) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/walle/payload_reader/ApkUtil.java
  class ApkUtil (line 11) | final class ApkUtil {
    method ApkUtil (line 12) | private ApkUtil() {
    method getCommentLength (line 40) | public static long getCommentLength(final FileChannel fileChannel) thr...
    method findCentralDirStartOffset (line 96) | public static long findCentralDirStartOffset(final FileChannel fileCha...
    method findCentralDirStartOffset (line 100) | public static long findCentralDirStartOffset(final FileChannel fileCha...
    method findApkSigningBlock (line 124) | public static Pair<ByteBuffer, Long> findApkSigningBlock(
    method findApkSigningBlock (line 130) | public static Pair<ByteBuffer, Long> findApkSigningBlock(
    method findIdValues (line 185) | public static Map<Integer, ByteBuffer> findIdValues(final ByteBuffer a...
    method sliceFromTo (line 232) | private static ByteBuffer sliceFromTo(final ByteBuffer source, final i...
    method getByteBuffer (line 268) | private static ByteBuffer getByteBuffer(final ByteBuffer source, final...
    method checkByteOrderLittleEndian (line 290) | private static void checkByteOrderLittleEndian(final ByteBuffer buffer) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/walle/payload_reader/ChannelInfo.java
  class ChannelInfo (line 8) | public class ChannelInfo {
    method ChannelInfo (line 12) | public ChannelInfo(final String channel, final Map<String, String> ext...
    method getChannel (line 17) | public String getChannel() {
    method getExtraInfo (line 21) | public Map<String, String> getExtraInfo() {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/walle/payload_reader/ChannelReader.java
  class ChannelReader (line 11) | public final class ChannelReader {
    method ChannelReader (line 14) | private ChannelReader() {
    method get (line 24) | public static ChannelInfo get(final File apkFile) {
    method getMap (line 40) | public static Map<String, String> getMap(final File apkFile) {
    method getRaw (line 66) | public static String getRaw(final File apkFile) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/walle/payload_reader/Pair.java
  class Pair (line 22) | final class Pair<A, B> {
    method Pair (line 26) | private Pair(final A first, final B second) {
    method of (line 31) | public static <A, B> Pair<A, B> of(final A first, final B second) {
    method getFirst (line 35) | public A getFirst() {
    method getSecond (line 39) | public B getSecond() {
    method hashCode (line 43) | @Override
    method equals (line 52) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/walle/payload_reader/PayloadReader.java
  class PayloadReader (line 12) | public final class PayloadReader {
    method PayloadReader (line 13) | private PayloadReader() {
    method getString (line 23) | public static String getString(final File apkFile, final int id) {
    method get (line 43) | public static byte[] get(final File apkFile, final int id) {
    method getBytes (line 61) | private static byte[] getBytes(final ByteBuffer byteBuffer) {
    method getAll (line 75) | private static Map<Integer, ByteBuffer> getAll(final File apkFile) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/frame/walle/payload_reader/SignatureNotFoundException.java
  class SignatureNotFoundException (line 4) | public class SignatureNotFoundException extends Exception {
    method SignatureNotFoundException (line 7) | public SignatureNotFoundException(final String message) {
    method SignatureNotFoundException (line 11) | public SignatureNotFoundException(final String message, final Throwabl...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/interfaces/CallBackListener.java
  type CallBackListener (line 8) | public interface CallBackListener<T>  {
    method onSuccess (line 14) | void onSuccess(T t);
    method onFailure (line 22) | void onFailure(int code, String msg);

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/interfaces/LifeCycleInterface.java
  type LifeCycleInterface (line 13) | public interface LifeCycleInterface {
    method onCreate (line 15) | void onCreate(Context context, Bundle savedInstanceState);
    method onStart (line 17) | void onStart(Context context);
    method onResume (line 19) | void onResume(Context context);
    method onPause (line 21) | void onPause(Context context);
    method onStop (line 23) | void onStop(Context context);
    method onRestart (line 25) | void onRestart(Context context);
    method onDestroy (line 27) | void onDestroy(Context context);
    method onNewIntent (line 29) | void onNewIntent(Context context, Intent intent);
    method onActivityResult (line 31) | void onActivityResult(Context context, int requestCode, int resultCode...
    method onRequestPermissionsResult (line 33) | void onRequestPermissionsResult(Context context, int requestCode, Stri...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/net/RequestExecutor.java
  class RequestExecutor (line 19) | public class RequestExecutor {
    method RequestExecutor (line 33) | private RequestExecutor(RequestExecutor.Builder builder){
    method startRequest (line 43) | public void startRequest(){
    method cancel (line 63) | public void cancel(){
    class Builder (line 67) | public static class Builder{
      method build (line 76) | public RequestExecutor build(){
      method setMethod (line 80) | public RequestExecutor.Builder setMethod(String method){
      method setUrl (line 85) | public RequestExecutor.Builder setUrl(String url){
      method setHeader (line 90) | public RequestExecutor.Builder setHeader(String header){
      method setUserAgent (line 95) | public RequestExecutor.Builder setUserAgent(String userAgent){
      method setParams (line 100) | public RequestExecutor.Builder setParams(HashMap<String,Object> para...
      method setRequestCallback (line 105) | public RequestExecutor.Builder setRequestCallback(RequestCallback re...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/net/base/VolleyRequestWrapper.java
  class VolleyRequestWrapper (line 18) | public abstract class VolleyRequestWrapper extends StringRequest {
    method VolleyRequestWrapper (line 22) | private VolleyRequestWrapper(int method, String url, Response.Listener...
    method VolleyRequestWrapper (line 26) | public VolleyRequestWrapper(Context context, int method, String url, f...
    method sendRequest (line 53) | protected void sendRequest() {
    method addRequestToQueue (line 57) | private <T> void addRequestToQueue(Request<T> request) {
    method cancel (line 66) | @Override
    method cancelByTag (line 75) | protected void cancelByTag(String tag){

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/net/base/VolleyResponseListener.java
  type VolleyResponseListener (line 11) | public interface VolleyResponseListener{
    method onResponseSuccess (line 17) | void onResponseSuccess(String response);
    method onResponseFailure (line 24) | void onResponseFailure(VolleyError error);

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/net/base/VolleySingleton.java
  class VolleySingleton (line 15) | public class VolleySingleton {
    method VolleySingleton (line 21) | private VolleySingleton(Context context) {
    method getInstance (line 26) | public static VolleySingleton getInstance(Context context) {
    method getRequestQueue (line 39) | public RequestQueue getRequestQueue() {
    method addToRequestQueue (line 49) | public <T> void addToRequestQueue(Request<T> request) {
    method removeRequest (line 62) | public void removeRequest(String key) {
    method destroy (line 69) | public void destroy(){

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/net/impl/BaseRequest.java
  class BaseRequest (line 31) | public class BaseRequest extends VolleyRequestWrapper {
    method BaseRequest (line 43) | private BaseRequest(int method, String url, VolleyResponseListener lis...
    method BaseRequest (line 49) | public BaseRequest(int method, String url, Map<String, Object> bodyMap...
    method buildParamsUrl (line 63) | private static String buildParamsUrl(String url, Map<String,Object> ar...
    method getHeaders (line 76) | @Override
    method setAuthorization (line 93) | public void setAuthorization(String authorization) {
    method getAuthorization (line 97) | public String getAuthorization(String method, String url, Map<String, ...
    method setUserAgent (line 109) | public void setUserAgent(String userAgent) {
    method getUserAgent (line 113) | private String getUserAgent() {
    method getBody (line 125) | @Override
    method parseNetworkResponse (line 141) | @Override
    method decompressZipToByte (line 172) | public static byte[] decompressZipToByte(byte[] body) {
    method parseResponse (line 207) | protected Response<String> parseResponse(NetworkResponse response, byt...
    method parseNetworkError (line 226) | @Override
    method printNetInfo (line 242) | private void printNetInfo(boolean success, NetworkResponse response, S...
    method sendRequest (line 271) | @Override
    method cancel (line 284) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/net/impl/BaseRequestCallback.java
  class BaseRequestCallback (line 23) | public abstract class BaseRequestCallback<T> implements VolleyResponseLi...
    method onResponseSuccess (line 25) | @Override
    method onResponseFailure (line 37) | @Override
    method onSuccess (line 71) | public abstract void onSuccess(T t);
    method onFailure (line 79) | public abstract void onFailure(int errCode, String msg);

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/net/impl/BaseRequestUtils.java
  class BaseRequestUtils (line 28) | public class BaseRequestUtils {
    method getUserAgent (line 33) | public static String getUserAgent(){
    method getOAuthHeader (line 57) | public static String getOAuthHeader(String method, String url, Map<Str...
    method generateTimestamp (line 88) | public static String generateTimestamp() {
    method generateNonce (line 92) | public static String generateNonce() {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/net/impl/bean/ResponseResult.java
  class ResponseResult (line 11) | public class ResponseResult<T> extends ProguardObject {
    method getCode (line 17) | public String getCode() {
    method setCode (line 21) | public void setCode(String ret) {
    method getMsg (line 25) | public String getMsg() {
    method setMsg (line 29) | public void setMsg(String msg) {
    method getResult (line 33) | public T getResult() {
    method setResult (line 37) | public void setResult(T data) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/net/request/IRequestManager.java
  type IRequestManager (line 11) | public interface IRequestManager {
    method get (line 13) | void get(String url, Map<String, Object> params, RequestCallback reque...
    method post (line 15) | void post(String url, Map<String, Object> params, RequestCallback requ...
    method cancel (line 17) | void cancel();
    method setHeader (line 19) | void setHeader(String header);
    method setUserAgent (line 21) | void setUserAgent(String UserAgent);

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/net/request/RequestCallback.java
  type RequestCallback (line 8) | public interface RequestCallback {
    method onSuccess (line 14) | void onSuccess(Object object);
    method onFailure (line 22) | void onFailure(int errCode, String message);

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/net/request/VolleyRequestManager.java
  class VolleyRequestManager (line 15) | public class VolleyRequestManager implements IRequestManager {
    method setHeader (line 25) | @Override
    method setUserAgent (line 34) | @Override
    method get (line 46) | @Override
    method post (line 81) | @Override
    method cancel (line 113) | @Override
    class GetRequest (line 121) | private static class GetRequest extends BaseRequest {
      method GetRequest (line 123) | public GetRequest(int method, String url, Map<String, Object> bodyMa...
      method create (line 127) | public static GetRequest create(String url, Map<String, Object> body...
    class PostRequest (line 133) | private static class PostRequest extends BaseRequest {
      method PostRequest (line 135) | public PostRequest(int method, String url, Map<String, Object> bodyM...
      method create (line 139) | public static PostRequest create(String url, Map<String, Object> bod...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/parse/channel/Channel.java
  class Channel (line 24) | public abstract class Channel extends ChannelListenerImpl implements Lif...
    method initChannel (line 33) | protected abstract void initChannel();
    method toString (line 37) | @Override
    method getChannelID (line 53) | public abstract String getChannelID();
    method isSupport (line 62) | public abstract boolean isSupport(int FuncType);
    method init (line 67) | public abstract void init(Context context, HashMap<String,Object> init...
    method login (line 72) | public abstract void login(Context context, HashMap<String,Object> log...
    method switchAccount (line 77) | public abstract void switchAccount(Context context, CallBackListener c...
    method logout (line 82) | public abstract void logout(Context context, CallBackListener logoutCa...
    method pay (line 87) | public abstract void pay(Context context, HashMap<String,Object> payMa...
    method exit (line 92) | public abstract void exit(Context context, CallBackListener exitCallBa...
    method getChannelVersion (line 101) | public String getChannelVersion(){
    method enterPlatform (line 108) | public void enterPlatform(Context context, CallBackListener enterPlatf...
    method showFloatView (line 113) | public void showFloatView(Context context){}
    method dismissFloatView (line 118) | public void dismissFloatView(Context context){}
    method reportData (line 123) | public void reportData(Context context, HashMap<String,Object> dataMap){}
    method getOrientation (line 129) | public boolean getOrientation(Context context){
    method onCreate (line 139) | @Override
    method onStart (line 142) | @Override
    method onResume (line 145) | @Override
    method onPause (line 148) | @Override
    method onStop (line 151) | @Override
    method onRestart (line 154) | @Override
    method onDestroy (line 157) | @Override
    method onNewIntent (line 160) | @Override
    method onActivityResult (line 163) | @Override
    method onRequestPermissionsResult (line 166) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/parse/channel/ChannelBeanList.java
  class ChannelBeanList (line 22) | public class ChannelBeanList extends ProguardObject{
    method getChannel (line 26) | public List<ChannelBean> getChannel(){
    class ChannelBean (line 30) | public static class ChannelBean extends ProguardObject {
      method invokeGetInstance (line 39) | public Channel invokeGetInstance() {
      method getChannel_name (line 89) | public String getChannel_name() {
      method getClass_name (line 93) | public String getClass_name() {
      method getDescription (line 97) | public String getDescription() {
      method getVersion (line 101) | public String getVersion() {
      method toString (line 105) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/parse/channel/ChannelListenerImpl.java
  class ChannelListenerImpl (line 18) | public class ChannelListenerImpl {
    method initOnSuccess (line 25) | public void initOnSuccess(CallBackListener callBackListener){
    method loginOnSuccess (line 35) | public void loginOnSuccess(String oathUrl, CallBackListener callBackLi...
    method loginOnFail (line 53) | public void loginOnFail(String errorMessage, CallBackListener callBack...
    method loginOnCancel (line 64) | public void loginOnCancel(String errorMessage, CallBackListener callBa...
    method switchAccountOnSuccess (line 76) | public void switchAccountOnSuccess(String oathUrl, CallBackListener ca...
    method switchAccountOnFail (line 93) | public void switchAccountOnFail(String errorMessage, CallBackListener ...
    method switchAccountOnCancel (line 105) | public void switchAccountOnCancel(String errorMessage, CallBackListene...
    method logoutOnSuccess (line 116) | public void logoutOnSuccess(CallBackListener callBackListener){
    method logoutOnFail (line 133) | public void logoutOnFail(String errorMessage, CallBackListener callBac...
    method logoutOnCancel (line 143) | public void logoutOnCancel(String errorMessage, CallBackListener callB...
    method payOnSuccess (line 155) | public void payOnSuccess(CallBackListener callBackListener){
    method payOnComplete (line 166) | public void payOnComplete(CallBackListener callBackListener){
    method channelNotExitDialog (line 176) | public void channelNotExitDialog(CallBackListener callBackListener){
    method OnFailure (line 188) | public void OnFailure(String errorMessage, CallBackListener callBackLi...
    method OnCancel (line 199) | public void  OnCancel(CallBackListener callBackListener){

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/parse/channel/ChannelManager.java
  class ChannelManager (line 23) | public class ChannelManager {
    method init (line 33) | public static ChannelManager init(Context context) {
    method getInstance (line 44) | public static ChannelManager getInstance() {
    method ChannelManager (line 49) | private ChannelManager(Context context) {
    method parse (line 53) | private void parse(Context context, String pluginFilePath) {
    method loadAllChannels (line 97) | public synchronized void loadAllChannels() {
    method loadChannel (line 118) | private Channel loadChannel(String channelName) throws RuntimeException {
    method getChannel (line 147) | public Channel getChannel(String channelName) {
    method loadChannel (line 163) | public void loadChannel(){
    method getChannel (line 183) | public Channel getChannel(){

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/parse/plugin/Plugin.java
  class Plugin (line 16) | public class Plugin implements LifeCycleInterface, ProguardInterface {
    method initPlugin (line 24) | protected synchronized void initPlugin() {
    method toString (line 31) | @Override
    method onCreate (line 39) | public void onCreate(Context context, Bundle savedInstanceState) {
    method onStart (line 42) | public void onStart(Context context) {
    method onResume (line 45) | public void onResume(Context context) {
    method onPause (line 48) | public void onPause(Context context) {
    method onStop (line 51) | public void onStop(Context context) {
    method onRestart (line 54) | public void onRestart(Context context) {
    method onDestroy (line 57) | public void onDestroy(Context context) {
    method onNewIntent (line 60) | public void onNewIntent(Context context, Intent intent){
    method onActivityResult (line 64) | public void onActivityResult(Context context, int requestCode, int res...
    method onRequestPermissionsResult (line 67) | public void onRequestPermissionsResult(Context context, int requestCod...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/parse/plugin/PluginBeanList.java
  class PluginBeanList (line 18) | public class PluginBeanList extends ProguardObject{
    method getPlugin (line 22) | public List<PluginBean> getPlugin() {
    class PluginBean (line 26) | public static class PluginBean extends ProguardObject {
      method invokeGetInstance (line 36) | public Plugin invokeGetInstance() {
      method getPlugin_name (line 84) | public String getPlugin_name() {
      method getClass_name (line 88) | public String getClass_name() {
      method getDescription (line 92) | public String getDescription() {
      method getVersion (line 96) | public String getVersion() {
      method toString (line 100) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/parse/plugin/PluginManager.java
  class PluginManager (line 20) | public class PluginManager extends PluginReflectApi{
    method init (line 30) | public static PluginManager init(Context context) {
    method getInstance (line 41) | public static PluginManager getInstance(){
    method PluginManager (line 47) | private PluginManager(Context context) {
    method parse (line 56) | private void parse(Context context, String pluginFilePath) {
    method loadAllPlugins (line 96) | public synchronized void loadAllPlugins() {
    method loadPlugin (line 116) | private Plugin loadPlugin(String pluginName) throws RuntimeException {
    method getPlugin (line 144) | public Plugin getPlugin(String pluginName) {
    method onCreate (line 157) | public void onCreate(Context context, Bundle savedInstanceState) {
    method onStart (line 165) | public void onStart(Context context) {
    method onResume (line 173) | public void onResume(Context context) {
    method onPause (line 181) | public void onPause(Context context) {
    method onStop (line 189) | public void onStop(Context context) {
    method onRestart (line 197) | public void onRestart(Context context) {
    method onDestroy (line 205) | public void onDestroy(Context context) {
    method onNewIntent (line 213) | public void onNewIntent(Context context, Intent intent) {
    method onActivityResult (line 221) | public void onActivityResult(Context context, int requestCode, int res...
    method onRequestPermissionsResult (line 229) | public void onRequestPermissionsResult(Context context, int requestCod...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/parse/plugin/PluginReflectApi.java
  class PluginReflectApi (line 12) | public abstract class PluginReflectApi {
    method invoke (line 14) | protected Object invoke(String methodName){
    method invoke (line 32) | protected Object invoke(String methodName, Class<?>[] argTypes, Object...
    method invoke (line 50) | protected Object invoke(Object mainObject, String methodName) {
    method invoke (line 69) | protected Object invoke(Object mainObject, String methodName, Class[] ...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/parse/project/Project.java
  class Project (line 23) | public abstract class Project implements ProguardInterface {
    method initProject (line 30) | protected synchronized void initProject() {
    method toString (line 37) | @Override
    method init (line 49) | public void init(Activity activity, String gameid, String gamekey, Cal...
    method login (line 56) | public void login(Activity activity, HashMap<String,Object> loginParam...
    method pay (line 64) | public void pay(Activity activity, HashMap<String,Object> payParams, C...
    method switchAccount (line 71) | public void switchAccount(Activity activity){
    method logout (line 78) | public void logout(Activity activity) {
    method exit (line 86) | public void exit(Activity activity, CallBackListener callBackListener) {
    method reportData (line 93) | public void reportData(Context context, HashMap<String,Object> dataMap){
    method setAccountCallBackLister (line 100) | public void setAccountCallBackLister(CallBackListener callBackLister){
    method showFloatView (line 107) | public void showFloatView(Activity activity){}
    method dismissFloatView (line 112) | public void dismissFloatView(Activity activity){}
    method extendFunction (line 118) | public void extendFunction(Activity activity, int functionType, Object...
    method getChannelID (line 126) | public String getChannelID(){
    method onCreate (line 133) | public void onCreate(Activity activity, Bundle savedInstanceState) {
    method onStart (line 137) | public void onStart(Activity activity) {
    method onResume (line 141) | public void onResume(Activity activity) {
    method onPause (line 145) | public void onPause(Activity activity) {
    method onStop (line 149) | public void onStop(Activity activity) {
    method onRestart (line 153) | public void onRestart(Activity activity) {
    method onDestroy (line 157) | public void onDestroy(Activity activity) {
    method onNewIntent (line 161) | public void onNewIntent(Activity activity, Intent intent) {
    method onActivityResult (line 165) | public void onActivityResult(Activity activity, int requestCode, int r...
    method onRequestPermissionsResult (line 169) | public void onRequestPermissionsResult(Activity activity, int requestC...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/parse/project/ProjectBeanList.java
  class ProjectBeanList (line 19) | public class ProjectBeanList extends ProguardObject{
    method getProject (line 23) | public List<ProjectBean> getProject() {
    method setProject (line 27) | public void setProject(List<ProjectBean> project) {
    class ProjectBean (line 31) | public static class ProjectBean extends ProguardObject {
      method invokeGetInstance (line 40) | public Project invokeGetInstance() {
      method getProject_name (line 89) | public String getProject_name() {
      method setProject_name (line 93) | public void setProject_name(String plugin_name) {
      method getClass_name (line 97) | public String getClass_name() {
      method setClass_name (line 101) | public void setClass_name(String class_name) {
      method getDescription (line 105) | public String getDescription() {
      method setDescription (line 109) | public void setDescription(String description) {
      method getVersion (line 113) | public String getVersion() {
      method setVersion (line 117) | public void setVersion(String version) {
      method toString (line 121) | @Override

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/parse/project/ProjectManager.java
  class ProjectManager (line 18) | public class ProjectManager {
    method init (line 28) | public static ProjectManager init(Context context) {
    method getInstance (line 39) | public static ProjectManager getInstance() {
    method ProjectManager (line 44) | private ProjectManager(Context context) {
    method parse (line 48) | private void parse(Context context, String pluginFilePath) {
    method loadAllProjects (line 90) | public synchronized void loadAllProjects() {
    method loadProject (line 111) | private Project loadProject(String projectName) throws RuntimeException {
    method getProject (line 140) | public Project getProject(String projectName) {
    method loadProject (line 156) | public void loadProject(){
    method getProject (line 176) | public Project getProject(){

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/proguard/ProguardInterface.java
  type ProguardInterface (line 8) | public interface ProguardInterface {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/proguard/ProguardObject.java
  class ProguardObject (line 7) | public class ProguardObject {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/utils/ArrayUtils.java
  class ArrayUtils (line 21) | public class ArrayUtils {
    method ArrayUtils (line 23) | private ArrayUtils() {
    method isEmpty (line 34) | public static <V> boolean isEmpty(V[] sourceArray) {
    method getLast (line 55) | public static <V> V getLast(V[] sourceArray, V value, V defaultValue, ...
    method getNext (line 94) | public static <V> V getNext(V[] sourceArray, V value, V defaultValue, ...
    method getLast (line 119) | public static <V> V getLast(V[] sourceArray, V value, boolean isCircle) {
    method getNext (line 126) | public static <V> V getNext(V[] sourceArray, V value, boolean isCircle) {
    method getLast (line 133) | public static long getLast(long[] sourceArray, long value, long defaul...
    method getNext (line 146) | public static long getNext(long[] sourceArray, long value, long defaul...
    method getLast (line 158) | public static int getLast(int[] sourceArray, int value, int defaultVal...
    method getNext (line 171) | public static int getNext(int[] sourceArray, int value, int defaultVal...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/utils/CodeUtils.java
  class CodeUtils (line 20) | public class CodeUtils {
    method Unicode2GBK (line 23) | public static String Unicode2GBK(String dataStr) {
    method appendParams (line 53) | public static String appendParams(StringBuilder builder, Map<String, ?...
    method sortAndAppendParams (line 85) | public static String sortAndAppendParams(StringBuilder builder, HashMa...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/utils/ContextUtils.java
  class ContextUtils (line 42) | public class ContextUtils {
    method invokeTelephonyManagerMethod (line 44) | public static Object invokeTelephonyManagerMethod(String methodName,
    method invokeTelephoneManagerMethod (line 59) | public static Object invokeTelephoneManagerMethod(String methodName,
    method getDeviceName (line 77) | public static String getDeviceName(){
    method getVersionName (line 82) | public static String getVersionName(Context appContext) {
    method getNetworkType (line 102) | public static String getNetworkType(Context context) {
    method dip2px (line 136) | public static int dip2px(Context context, float dipValue) {
    method px2dip (line 141) | public static int px2dip(Context context, float dipValue) {
    method fitToImage (line 146) | public static int fitToImage(Context context, float uiValue) {
    method getResolutionAsString (line 157) | public static String getResolutionAsString(Context context) {
    method checkPermission (line 174) | public static boolean checkPermission(Context context, String permissi...
    method getDeviceId (line 180) | public static String getDeviceId(Context context) {
    method getIMEI (line 193) | public static String getIMEI(Context context) {
    method getLocalMacAddress (line 211) | public static String getLocalMacAddress(Context context) {
    method getCpuFre (line 229) | public static long getCpuFre() {
    method readLong (line 237) | private static long readLong(String file) {
    method getFile (line 255) | private static RandomAccessFile getFile(String filename) throws IOExce...
    method isZero (line 260) | private static boolean isZero(String id) {
    method getLabel (line 272) | public static String getLabel(Context context) {
    method getSimCardType (line 297) | public static int getSimCardType(Context context) {
    method getIMSI (line 322) | public static String getIMSI(Context context) {
    method getLocalIpAddress (line 341) | public static String getLocalIpAddress() {
    method getOrientation (line 376) | public static int getOrientation(Context context) {
    method installPackage (line 385) | public static void installPackage(Context context, File file) {
    method isLandScape (line 404) | public static boolean isLandScape(Context activity) {
    method isMobileNO (line 420) | public static boolean isMobileNO(String phoneNum) {
    method isPhoneDevice (line 437) | public static boolean isPhoneDevice(Context context) {
    method isNetworkConnected (line 456) | public static boolean isNetworkConnected(Context context) {
    method isSdcardReadable (line 472) | public static boolean isSdcardReadable(Context context) {
    method md5Sign (line 492) | public static String md5Sign(Context context, String packageName) {
    method md5Sign (line 517) | public static String md5Sign(Context context) {
    method getDensityInt (line 535) | public static int getDensityInt(Context context) {
    method getDensity (line 543) | public static float getDensity(Context context) {
    method getPhysicalScreenSize (line 550) | public static double getPhysicalScreenSize(Context context) {
    method getResolution (line 558) | public static int[] getResolution(Context context) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/utils/CryptUtils.java
  class CryptUtils (line 13) | public class CryptUtils {
    method toHexString (line 30) | public static String toHexString(byte[] array) {
    method toByteArray (line 57) | public static byte[] toByteArray(String s) {
    method CryptUtils (line 80) | public CryptUtils() {
    method CryptUtils (line 89) | public CryptUtils(String keyStr) {
    method encrypt (line 113) | public byte[] encrypt(byte[] arrB) {
    method encrypt (line 127) | public String encrypt(String strIn) {
    method decrypt (line 142) | public byte[] decrypt(byte[] arrB) {
    method decrypt (line 157) | public String decrypt(String strIn) {
    method getKey (line 170) | private Key getKey(byte[] data) throws Exception {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/utils/DateUtils.java
  class DateUtils (line 15) | public class DateUtils {
    method getCurTimeLong (line 33) | public long getCurTimeLong(){
    method getCurDate (line 42) | public static String getCurDate(String pattern){
    method getDateToString (line 53) | public static String getDateToString(long milSecond, String pattern) {
    method getStringToDate (line 65) | public static long getStringToDate(String dateString, String pattern) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/utils/FileUtils.java
  class FileUtils (line 52) | public class FileUtils {
    method FileUtils (line 56) | private FileUtils() {
    method readAssetsFile (line 66) | public static StringBuilder readAssetsFile(Context context, String cha...
    method readSimplelyFile (line 95) | public static String readSimplelyFile(File file) {
    method readSimplelyFile (line 139) | public static String readSimplelyFile(InputStream is) {
    method readFile (line 182) | public static StringBuilder readFile(String filePath, String charsetNa...
    method writeFile (line 217) | public static boolean writeFile(String filePath, String content, boole...
    method writeFile (line 244) | public static boolean writeFile(String filePath, List<String> contentL...
    method writeFile (line 275) | public static boolean writeFile(String filePath, String content) {
    method writeFile (line 286) | public static boolean writeFile(String filePath, List<String> contentL...
    method writeFile (line 298) | public static boolean writeFile(String filePath, InputStream stream) {
    method writeFile (line 311) | public static boolean writeFile(String filePath, InputStream stream, b...
    method writeFile (line 323) | public static boolean writeFile(File file, InputStream stream) {
    method writeFile (line 336) | public static boolean writeFile(File file, InputStream stream, boolean...
    method moveFile (line 364) | public static void moveFile(String sourceFilePath, String destFilePath) {
    method moveFile (line 377) | public static void moveFile(File srcFile, File destFile) {
    method copyFile (line 393) | public static boolean copyFile(String sourceFilePath, String destFileP...
    method readFileToList (line 411) | public static List<String> readFileToList(String filePath, String char...
    method getFileNameWithoutExtension (line 456) | public static String getFileNameWithoutExtension(String filePath) {
    method getFileName (line 493) | public static String getFileName(String filePath) {
    method getFolderName (line 524) | public static String getFolderName(String filePath) {
    method getFileExtension (line 556) | public static String getFileExtension(String filePath) {
    method makeDirs (line 588) | public static boolean makeDirs(String filePath) {
    method makeFolders (line 603) | public static boolean makeFolders(String filePath) {
    method isFileExist (line 613) | public static boolean isFileExist(String filePath) {
    method isFolderExist (line 628) | public static boolean isFolderExist(String directoryPath) {
    method deleteFile (line 648) | public static boolean deleteFile(String path) {
    method getFileSize (line 683) | public static long getFileSize(String path) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/utils/IOUtils.java
  class IOUtils (line 12) | public class IOUtils {
    method IOUtils (line 14) | private IOUtils() {
    method close (line 23) | public static void close(Closeable closeable) {
    method closeQuietly (line 37) | public static void closeQuietly(Closeable closeable) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/utils/JsonUtils.java
  class JsonUtils (line 13) | public class JsonUtils {
    method format (line 21) | public static String format(String jsonStr) {
    method getLevelStr (line 55) | private  static String getLevelStr(int level){
    method isJson (line 65) | public static boolean isJson(String data){
    method jsonStrToMap (line 74) | public static HashMap<String,Object> jsonStrToMap(String jsonStr){

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/utils/ListUtils.java
  class ListUtils (line 13) | public class ListUtils {
    method ListUtils (line 18) | private ListUtils() {
    method getSize (line 35) | public static <V> int getSize(List<V> sourceList) {
    method isEmpty (line 52) | public static <V> boolean isEmpty(List<V> sourceList) {
    method isEquals (line 71) | public static <V> boolean isEquals(ArrayList<V> actual, ArrayList<V> e...
    method join (line 102) | public static String join(List<String> list) {
    method join (line 120) | public static String join(List<String> list, char separator) {
    method join (line 140) | public static String join(List<String> list, String separator) {
    method addDistinctEntry (line 152) | public static <V> boolean addDistinctEntry(List<V> sourceList, V entry) {
    method addDistinctList (line 164) | public static <V> int addDistinctList(List<V> sourceList, List<V> entr...
    method distinctList (line 185) | public static <V> int distinctList(List<V> sourceList) {
    method addListNotNullValue (line 215) | public static <V> boolean addListNotNullValue(List<V> sourceList, V va...
    method getLast (line 222) | @SuppressWarnings("unchecked")
    method getNext (line 230) | @SuppressWarnings("unchecked")
    method invertList (line 242) | public static <V> List<V> invertList(List<V> sourceList) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/utils/LogUtils.java
  class LogUtils (line 13) | public class LogUtils {
    method setDebugLogModel (line 23) | public static void setDebugLogModel(boolean isDebugLog){
    method LogUtils (line 47) | private LogUtils() {
    method i (line 55) | public static void i(Object o) {
    method i (line 59) | public static void i(String tag, Object o) {
    method d (line 66) | public static void d(Object o) {
    method d (line 70) | public static void d(String tag, Object o) {
    method w (line 78) | public static void w(Object o) {
    method w (line 82) | public static void w(String tag, Object o) {
    method e (line 89) | public static void e(Object o) {
    method e (line 93) | public static void e(String tag, Object o) {
    method json (line 100) | public static void json(String json) {
    method json (line 104) | public static void json(String tag, String json) {
    method debug_i (line 114) | public static void debug_i(Object o) {
    method debug_i (line 120) | public static void debug_i(String tag, Object o) {
    method debug_d (line 129) | public static void debug_d(Object o) {
    method debug_d (line 135) | public static void debug_d(String tag, Object o) {
    method debug_w (line 145) | public static void debug_w(Object o) {
    method debug_w (line 151) | public static void debug_w(String tag, Object o) {
    method debug_e (line 160) | public static void debug_e(Object o) {
    method debug_e (line 166) | public static void debug_e(String tag, Object o) {
    method debug_json (line 175) | public static void debug_json(String json) {
    method debug_json (line 181) | public static void debug_json(String tag, String json) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/utils/Md5Utils.java
  class Md5Utils (line 7) | public class Md5Utils {
    method getMd5 (line 9) | public static String getMd5(String str) {
    method md5 (line 39) | public static String md5(String target) {
    method MD5 (line 59) | public final static String MD5(String s) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/utils/ObjectUtils.java
  class ObjectUtils (line 13) | public class ObjectUtils {
    method ObjectUtils (line 15) | private ObjectUtils() {
    method isEquals (line 29) | public static boolean isEquals(Object actual, Object expected) {
    method nullStrToEmpty (line 45) | public static String nullStrToEmpty(Object str) {
    method transformLongArray (line 55) | public static Long[] transformLongArray(long[] source) {
    method transformLongArray (line 69) | public static long[] transformLongArray(Long[] source) {
    method transformIntArray (line 83) | public static Integer[] transformIntArray(int[] source) {
    method transformIntArray (line 97) | public static int[] transformIntArray(Integer[] source) {
    method compare (line 125) | @SuppressWarnings({"unchecked", "rawtypes"})
    method objectToMap (line 141) | public static HashMap<String, Object> objectToMap(Object obj) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_base/utils/StringUtils.java
  class StringUtils (line 13) | public class StringUtils {
    method StringUtils (line 15) | private StringUtils() {
    method isBlank (line 35) | public static boolean isBlank(String str) {
    method isEmpty (line 51) | public static boolean isEmpty(CharSequence str) {
    method isEquals (line 63) | public static boolean isEquals(String actual, String expected) {
    method length (line 79) | public static int length(CharSequence str) {
    method nullStrToEmpty (line 95) | public static String nullStrToEmpty(Object str) {
    method capitalizeFirstLetter (line 114) | public static String capitalizeFirstLetter(String str) {
    method utf8Encode (line 138) | public static String utf8Encode(String str) {
    method utf8Encode (line 156) | public static String utf8Encode(String str, String defultReturn) {
    method getHrefInnerHtml (line 192) | public static String getHrefInnerHtml(String href) {
    method htmlEscapeCharsToString (line 223) | public static String htmlEscapeCharsToString(String source) {
    method fullWidthToHalfWidth (line 241) | public static String fullWidthToHalfWidth(String s) {
    method halfWidthToFullWidth (line 274) | public static String halfWidthToFullWidth(String s) {
    method isEmail (line 296) | public static boolean isEmail(String email) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_business/cache/BaseCache.java
  class BaseCache (line 22) | public class BaseCache {
    method getApplication (line 27) | public Context getApplication() {
    method BaseCache (line 34) | private BaseCache(Application appContext) {
    method getInstance (line 38) | public static BaseCache getInstance() {
    method init (line 45) | public static BaseCache init(Application cxt) {
    method put (line 64) | public void put(String key, Object value){
    method get (line 70) | public Object get(String key){
    method getGameId (line 85) | public String getGameId() {
    method getGameName (line 93) | public String getGameName() {
    method getGameKey (line 101) | public String getGameKey() {
    method getSdkType (line 110) | public String getSdkType(){
    method getSdkName (line 118) | public String getSdkName(){
    method getSdkVersion (line 126) | public String getSdkVersion(){
    method getSdkTagId (line 139) | public String getSdkTagId(){
    method getSdkUrl (line 151) | public String getSdkUrl(){
    method getChannelId (line 159) | public String getChannelId() {
    method getChannelName (line 167) | public String getChannelName(){

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_business/cache/SDKInfoCache.java
  class SDKInfoCache (line 25) | public class SDKInfoCache {
    method getDefault (line 35) | public static SDKInfoCache getDefault(Context cxt) {
    method SDKInfoCache (line 46) | private SDKInfoCache(Context appContext) {
    method get (line 55) | public String get(String key) {
    method setConfig (line 59) | public void setConfig(String filePath, HashMap<String, String> configs) {
    method parseConfig (line 73) | private HashMap<String, String> parseConfig(String filePath) {
    method readFile (line 97) | private synchronized String readFile(String fileName) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_business/cache/SharePreferencesCache.java
  class SharePreferencesCache (line 24) | public class SharePreferencesCache {
    method SharePreferencesCache (line 39) | public SharePreferencesCache(Context context) {
    method setMode (line 50) | private SharePreferencesCache setMode(int mode) {
    method init (line 58) | public void init() {
    method putString (line 81) | public static void putString(String key, String value) {
    method getString (line 98) | public static String getString(String key, String defValue) {
    method getString (line 111) | public static String getString(String key) {
    method putStringSet (line 121) | public static void putStringSet(String key, Set<String> values) {
    method getStringSet (line 138) | public static Set<String> getStringSet(String key, Set<String> defValu...
    method getStringSet (line 151) | public static Set<String> getStringSet(String key) {
    method putInt (line 161) | public static void putInt(String key, int value) {
    method getInt (line 179) | public static int getInt(String key, int defValue) {
    method getInt (line 192) | public static int getInt(String key) {
    method putFloat (line 202) | public static void putFloat(String key, float value) {
    method getFloat (line 219) | public static float getFloat(String key, float defValue) {
    method getFloat (line 232) | public static float getFloat(String key) {
    method putLong (line 242) | public static void putLong(String key, long value) {
    method getLong (line 259) | public static long getLong(String key, long defValue) {
    method getLong (line 272) | public static long getLong(String key) {
    method putBoolean (line 282) | public static void putBoolean(String key, boolean value) {
    method getBoolean (line 299) | public static boolean getBoolean(String key, boolean defValue) {
    method getBoolean (line 312) | public static boolean getBoolean(String key) {
    method putObject (line 322) | public static void putObject(String key, Object value) {
    method getObject (line 337) | public static <T> T getObject(String key, Class<T> type) {
    method remove (line 349) | public static void remove(String key) {
    method clear (line 359) | public static void clear() {
    method registerOnChangeListener (line 371) | private static void registerOnChangeListener(SharedPreferences.OnShare...
    method unregisterOnChangeListener (line 383) | private static void unregisterOnChangeListener(SharedPreferences.OnSha...

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_business/config/KeyConfig.java
  class KeyConfig (line 12) | public class KeyConfig {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_business/config/UrlConfig.java
  class UrlConfig (line 18) | public class UrlConfig {
    method getSdkUrl (line 28) | public static String getSdkUrl(){
    method initUrl (line 32) | public static void initUrl(){
    method getReSetUrl (line 49) | public static String getReSetUrl(String sdk_type, String channelId){

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_ui/BitmapUtils.java
  class BitmapUtils (line 29) | public class BitmapUtils {
    method getImageBitmap (line 34) | public static Bitmap getImageBitmap(String imageUrl) {
    method savePicture (line 63) | public static String savePicture(Bitmap bm, String fileName){
    method getPicture (line 90) | public static Bitmap getPicture(String fileName){
    method getZoomImage (line 126) | public static Bitmap getZoomImage(Bitmap bitmap, double maxSize) {
    method getZoomImage (line 157) | public static Bitmap getZoomImage(Bitmap orgBitmap, double newWidth, d...
    method bitmapToByteArray (line 189) | public static byte[] bitmapToByteArray(Bitmap bitmap, boolean needRecy...
    method bitmapToString (line 217) | public static String bitmapToString(Bitmap bitmap){
    method stringToBitmap (line 244) | public static Bitmap stringToBitmap(String st)
    method getReadableFileSize (line 267) | public String getReadableFileSize(long size) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_ui/LoadingUtils.java
  class LoadingUtils (line 11) | public class LoadingUtils {
    method LoadingUtils (line 16) | public LoadingUtils(Context context){
    method setMessage (line 21) | public void setMessage(String message){
    method show (line 25) | public void show(){
    method dismiss (line 40) | public void dismiss(){

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_ui/ResourseIdUtils.java
  class ResourseIdUtils (line 14) | public class ResourseIdUtils {
    method getId (line 16) | public static int getId(String name) {
    method getStyleByName (line 20) | public static int getStyleByName(String name) {
    method getStringId (line 24) | public static int getStringId(String name) {
    method getColorId (line 28) | public static int getColorId(String name) {
    method getStringArrayId (line 32) | public static int getStringArrayId(String name) {
    method getDimenId (line 36) | public static int getDimenId(String dimenName) {
    method getDrawableId (line 40) | public static int getDrawableId(String name) {
    method getLayoutId (line 44) | public static int getLayoutId(String name) {
    method getAnimId (line 48) | public static int getAnimId(String name) {
    method getResourceIdByName (line 52) | public static int getResourceIdByName(String className, String name) {

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_ui/ToastUtils.java
  class ToastUtils (line 14) | public class ToastUtils {
    method showToast (line 18) | public static void showToast(Context context,

FILE: GameSDK_Utils/src/main/java/com/bzai/gamesdk/common/utils_ui/activity/SplashActivity.java
  class SplashActivity (line 29) | public class SplashActivity extends Activity {
    method hideVirtualButtons (line 36) | private void hideVirtualButtons() {
    method onCreate (line 44) | @Override

FILE: GameSDK_Utils/src/test/java/com/bzai/gamesdk/utils/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: app/src/androidTest/java/com/bzai/gamesdkframe/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 19) | @Test

FILE: app/src/main/java/com/bzai/gamesdkframe/GameApplication.java
  class GameApplication (line 14) | public class GameApplication extends SDKApplication {
    method attachBaseContext (line 16) | @Override
    method onCreate (line 21) | @Override

FILE: app/src/main/java/com/bzai/gamesdkframe/GameSDKMain.java
  class GameSDKMain (line 28) | public class GameSDKMain extends Activity implements View.OnClickListener{
    method onCreate (line 35) | @Override
    method initView (line 45) | private void initView(){
    method onClick (line 58) | @Override
    method onAccountEventCallBack (line 86) | @Override
    method init (line 108) | private void init() {
    method login (line 138) | private void login() {
    method switchAccount (line 145) | private void switchAccount(){
    method logout (line 152) | private void logout() {
    method purchase (line 159) | private void purchase() {
    method exitGame (line 258) | private void exitGame(){
    method onKeyDown (line 297) | @Override
    method onBackPressed (line 307) | @Override
    method showToast (line 313) | private void showToast(String msg) {
    method isDecimal (line 318) | public static boolean isDecimal(String str) {
    method isInteger (line 326) | public static boolean isInteger(String str) {
    method onStart (line 335) | @Override
    method onResume (line 341) | @Override
    method onPause (line 347) | @Override
    method onStop (line 353) | @Override
    method onRestart (line 359) | @Override
    method onDestroy (line 365) | @Override
    method onNewIntent (line 371) | @Override
    method onActivityResult (line 377) | @Override
    method onRequestPermissionsResult (line 383) | @Override

FILE: app/src/test/java/com/bzai/gamesdkframe/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test
Condensed preview — 424 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,361K chars).
[
  {
    "path": ".gitignore",
    "chars": 118,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": "GameSDKBuildJarTool/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "GameSDKBuildJarTool/build.gradle",
    "chars": 500,
    "preview": "apply plugin: 'java-library'\napply plugin: 'idea'\n\ndependencies {\n    compile fileTree(include: ['*.jar'], dir: 'libs')\n"
  },
  {
    "path": "GameSDKBuildJarTool/src/main/cmd/test/java/HelloWorld.java",
    "chars": 257,
    "preview": "package com.bzai.demo;\n\npublic class HelloWorld {\n\n    public static void main(String[] args){\n        System.out.printl"
  },
  {
    "path": "GameSDKBuildJarTool/src/main/cmd/test/java/TestA.java",
    "chars": 156,
    "preview": "package com.bzai.demo;\n\npublic class TestA {\n\n    public String name = \"asdfa\";\n\n    public void Test(){\n        System."
  },
  {
    "path": "GameSDKBuildJarTool/src/main/cmd/test/proguard/proguard_config.pro",
    "chars": 519,
    "preview": "\n-dontskipnonpubliclibraryclassmembers\n-dontshrink\n-optimizations !code/simplification/arithmetic,!field/*,!class/mergin"
  },
  {
    "path": "GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/BuildJarTask.java",
    "chars": 13059,
    "preview": "package com.bzai.gamesdk.build;\n\nimport com.android.manifmerger.ManifestMerger2;\nimport com.android.manifmerger.MergingR"
  },
  {
    "path": "GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/Config.java",
    "chars": 4467,
    "preview": "package com.bzai.gamesdk.build;\n\nimport com.bzai.gamesdk.build.bean.Project;\n\nimport java.io.File;\nimport java.io.FileIn"
  },
  {
    "path": "GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/Main.java",
    "chars": 154,
    "preview": "package com.bzai.gamesdk.build;\n\npublic class Main {\n\n    public static void main(String[] args){\n        new Thread(new"
  },
  {
    "path": "GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/bean/ErrorMsg.java",
    "chars": 684,
    "preview": "package com.bzai.gamesdk.build.bean;\n\n/**\n * 描述打包结果\n */\npublic class ErrorMsg {\n\n    public int code;\n    public String "
  },
  {
    "path": "GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/bean/Project.java",
    "chars": 2960,
    "preview": "package com.bzai.gamesdk.build.bean;\n\nimport java.io.File;\n\n/**\n * Project 配置类\n */\npublic class Project {\n\n    /**\n     "
  },
  {
    "path": "GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/tools/JavaTool.java",
    "chars": 3991,
    "preview": "package com.bzai.gamesdk.build.tools;\n\nimport com.bzai.gamesdk.build.tools.exec.Shell;\nimport com.bzai.gamesdk.build.uti"
  },
  {
    "path": "GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/tools/ProGuardTool.java",
    "chars": 3129,
    "preview": "package com.bzai.gamesdk.build.tools;\n\nimport com.bzai.gamesdk.build.tools.exec.Shell;\nimport proguard.Configuration;\nim"
  },
  {
    "path": "GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/tools/ServerTool.java",
    "chars": 1572,
    "preview": "package com.bzai.gamesdk.build.tools;\n\nimport com.bzai.gamesdk.build.bean.Project;\nimport com.bzai.gamesdk.build.utils.F"
  },
  {
    "path": "GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/tools/exec/Shell.java",
    "chars": 3271,
    "preview": "package com.bzai.gamesdk.build.tools.exec;\n\nimport com.bzai.gamesdk.build.utils.Utils;\n\nimport java.io.*;\nimport java.ut"
  },
  {
    "path": "GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/utils/FileUtils.java",
    "chars": 26433,
    "preview": "package com.bzai.gamesdk.build.utils;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.nio.file.*;\nimport j"
  },
  {
    "path": "GameSDKBuildJarTool/src/main/java/com/bzai/gamesdk/build/utils/Utils.java",
    "chars": 1310,
    "preview": "package com.bzai.gamesdk.build.utils;\n\nimport java.io.File;\n\npublic class Utils {\n\n\n    public static final int OK = 0;\n"
  },
  {
    "path": "GameSDKBuildJarTool/src/main/resources/config",
    "chars": 281,
    "preview": "\n\n/**\n* Android sdk 路径。\n* 是否必须:必须。\n*/\nandroidSdkPath=xxx\n\n\n/**\n* Android目标SDK版本。\n* 是否必须:必须。\n*/\ntargetSdkVersion=android-"
  },
  {
    "path": "GameSDKBuildJarTool/src/main/resources/proguard_config.pro",
    "chars": 1758,
    "preview": "\n-dontskipnonpubliclibraryclassmembers\n-dontshrink\n-optimizations !code/simplification/arithmetic,!field/*,!class/mergin"
  },
  {
    "path": "GameSDKBuildJarTool/src/main/resources/project_list",
    "chars": 804,
    "preview": "\n###API接口层\nGameSDK_API=head,GameSDK_API\n\n###Project项目层\n#GameSDK_Project_Custom=head,GameSDK_BeginProject\\\\GameSDK_Projec"
  },
  {
    "path": "GameSDKBuildJarTool/必读说明",
    "chars": 133,
    "preview": "\n### 该GameSDKBuildJarTool 用于自动化混淆SDK源码工具,只需要配置config、proguard_config_pro、project_list相关配置就可以了。\n\ncmd目录 为手动脚本运行Demo,配合博客来讲"
  },
  {
    "path": "GameSDKDemo_Release/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "GameSDKDemo_Release/build.gradle",
    "chars": 667,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 26\n    buildToolsVersion \"27.0.3\"\n    defaultCo"
  },
  {
    "path": "GameSDKDemo_Release/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "GameSDKDemo_Release/src/androidTest/java/com/bzai/gamesdkframe/ExampleInstrumentedTest.java",
    "chars": 743,
    "preview": "package com.bzai.gamesdkframe;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimp"
  },
  {
    "path": "GameSDKDemo_Release/src/main/AndroidManifest.xml",
    "chars": 1313,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "GameSDKDemo_Release/src/main/java/com/bzai/gamesdkframe/demo/GameApplication.java",
    "chars": 450,
    "preview": "package com.bzai.gamesdkframe.demo;\n\nimport android.content.Context;\n\nimport com.bzai.gamesdk.SDKApplication;\n\n\n/**\n * C"
  },
  {
    "path": "GameSDKDemo_Release/src/main/java/com/bzai/gamesdkframe/demo/GameSDKMain.java",
    "chars": 10683,
    "preview": "package com.bzai.gamesdkframe.demo;\n\nimport android.app.Activity;\nimport android.app.AlertDialog;\nimport android.content"
  },
  {
    "path": "GameSDKDemo_Release/src/main/res/layout/activity_main.xml",
    "chars": 3005,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    androi"
  },
  {
    "path": "GameSDKDemo_Release/src/main/res/values/colors.xml",
    "chars": 288,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"color"
  },
  {
    "path": "GameSDKDemo_Release/src/main/res/values/strings.xml",
    "chars": 79,
    "preview": "<resources>\n    <string name=\"app_name\">GameSDKFrameDemo</string>\n</resources>\n"
  },
  {
    "path": "GameSDKDemo_Release/src/test/java/com/bzai/gamesdkframe/ExampleUnitTest.java",
    "chars": 399,
    "preview": "package com.bzai.gamesdkframe;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit tes"
  },
  {
    "path": "GameSDKLibrary_Release/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "GameSDKLibrary_Release/build.gradle",
    "chars": 521,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 27\n    buildToolsVersion '27.0.3'\n    defaultConfig"
  },
  {
    "path": "GameSDKLibrary_Release/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "GameSDKLibrary_Release/src/androidTest/java/com/suyutech/baselibrary/ExampleInstrumentedTest.java",
    "chars": 754,
    "preview": "package com.suyutech.baselibrary;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\n"
  },
  {
    "path": "GameSDKLibrary_Release/src/main/AndroidManifest.xml",
    "chars": 422,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.bzai.gamesdk.library\" >\n\n    <uses"
  },
  {
    "path": "GameSDKLibrary_Release/src/main/assets/Channel_config.txt",
    "chars": 228,
    "preview": "{\n    \"channel\": [\n        {\n            \"channel_name\": \"channel\",\n            \"class_name\": \"com.bzai.gamesdk.channel."
  },
  {
    "path": "GameSDKLibrary_Release/src/main/assets/Plugin_config.txt",
    "chars": 438,
    "preview": "{\n    \"plugin\": [\n        {\n            \"plugin_name\": \"plugin_wechat\",\n            \"class_name\": \"com.bzai.gamesdk.plug"
  },
  {
    "path": "GameSDKLibrary_Release/src/main/assets/Project_config.txt",
    "chars": 220,
    "preview": "{\n    \"project\": [\n        {\n            \"project_name\": \"project\",\n            \"class_name\": \"com.bzai.gamesdk.project."
  },
  {
    "path": "GameSDKLibrary_Release/src/main/assets/SDKInfo.json",
    "chars": 111,
    "preview": "{\n  \"sdk_type\": \"1\",\n  \"sdk_name\": \"SDK_JuHe\",\n  \"sdk_version\": \"1.0.0\",\n  \"sdk_url\": \"http://www.baidu.com/\"\n}"
  },
  {
    "path": "GameSDKLibrary_Release/src/main/res/values/strings.xml",
    "chars": 84,
    "preview": "<resources>\n    <string name=\"app_name\">GameSDK_Plugin_Alipay</string>\n</resources>\n"
  },
  {
    "path": "GameSDKLibrary_Release/src/test/java/com/suyutech/baselibrary/ExampleUnitTest.java",
    "chars": 402,
    "preview": "package com.suyutech.baselibrary;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit "
  },
  {
    "path": "GameSDK_API/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "GameSDK_API/build.gradle",
    "chars": 614,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 26\n    buildToolsVersion \"27.0.3\"\n    defaultConfig"
  },
  {
    "path": "GameSDK_API/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "GameSDK_API/src/androidTest/java/com/bzai/gamesdk/api/ExampleInstrumentedTest.java",
    "chars": 746,
    "preview": "package com.bzai.gamesdk.api;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimpo"
  },
  {
    "path": "GameSDK_API/src/main/AndroidManifest.xml",
    "chars": 107,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.bzai.gamesdk.api\" />\n"
  },
  {
    "path": "GameSDK_API/src/main/java/com/bzai/gamesdk/GameInfoSetting.java",
    "chars": 343,
    "preview": "package com.bzai.gamesdk;\n\n/**\n * Created by bzai on 2018/4/10.\n * <p>\n * Desc:\n *\n *    用于对外给CP获取对应的游戏 gameid 和 gamekey"
  },
  {
    "path": "GameSDK_API/src/main/java/com/bzai/gamesdk/SDKApplication.java",
    "chars": 443,
    "preview": "package com.bzai.gamesdk;\nimport android.content.Context;\n\nimport com.bzai.gamesdk.project.ProjectApplication;\n\n/**\n * C"
  },
  {
    "path": "GameSDK_API/src/main/java/com/bzai/gamesdk/api/SDKAPI.java",
    "chars": 12614,
    "preview": "package com.bzai.gamesdk.api;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.os.Bundle;\nimp"
  },
  {
    "path": "GameSDK_API/src/main/java/com/bzai/gamesdk/bean/info/AccountEventResultInfo.java",
    "chars": 690,
    "preview": "package com.bzai.gamesdk.bean.info;\n\n/**\n * Created by bzai on 2018/4/17.\n * <p>\n * Desc:\n *\n *  用于装换成Json对象的实体类,不对外提供ge"
  },
  {
    "path": "GameSDK_API/src/main/java/com/bzai/gamesdk/bean/info/PlayerInfo.java",
    "chars": 484,
    "preview": "package com.bzai.gamesdk.bean.info;\n\n/**\n * Created by bzai on 2018/4/11.\n * <p>\n * Desc:  返回外界的用户信息实体类\n */\n\npublic clas"
  },
  {
    "path": "GameSDK_API/src/main/java/com/bzai/gamesdk/bean/params/GameRoleParams.java",
    "chars": 2223,
    "preview": "package com.bzai.gamesdk.bean.params;\n\n/**\n * Created by bzai on 2018/4/18.\n * <p>\n * Desc:\n *\n *  数据上报透传实体类,只提供set方法,不对"
  },
  {
    "path": "GameSDK_API/src/main/java/com/bzai/gamesdk/bean/params/PayParams.java",
    "chars": 2223,
    "preview": "package com.bzai.gamesdk.bean.params;\n\n/**\n * Created by bzai on 2018/4/13.\n * <p>\n * Desc:\n *\n *  支付接口的透传实体类,只提供set方法,不"
  },
  {
    "path": "GameSDK_API/src/main/java/com/bzai/gamesdk/listener/AccountCallBackLister.java",
    "chars": 592,
    "preview": "package com.bzai.gamesdk.listener;\n\n/**\n * Created by bzai on 2018/4/12.\n * <p>\n * Desc:\n *\n *  对外的SDK Api 账号监听接口\n *\n */"
  },
  {
    "path": "GameSDK_API/src/main/java/com/bzai/gamesdk/listener/ExitCallBackLister.java",
    "chars": 357,
    "preview": "package com.bzai.gamesdk.listener;\n\n/**\n * Created by bzai on 2018/4/11.\n * <p>\n * Desc:\n * 对外的SDK Api 退出监听接口\n */\n\npubli"
  },
  {
    "path": "GameSDK_API/src/main/java/com/bzai/gamesdk/listener/InitCallBackLister.java",
    "chars": 329,
    "preview": "package com.bzai.gamesdk.listener;\n\n/**\n * Created by bzai on 2018/4/10.\n * <p>\n * Desc:\n *\n *  对外的SDK Api 初始化监听接口\n */\n\n"
  },
  {
    "path": "GameSDK_API/src/main/java/com/bzai/gamesdk/listener/PurchaseCallBackListener.java",
    "chars": 554,
    "preview": "package com.bzai.gamesdk.listener;\n\n/**\n * Created by bzai on 2018/4/13.\n * <p>\n * Desc:\n *\n * 支付回调\n *\n */\n\npublic inter"
  },
  {
    "path": "GameSDK_API/src/test/java/com/bzai/gamesdk/api/ExampleUnitTest.java",
    "chars": 398,
    "preview": "package com.bzai.gamesdk.api;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_Custom/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_Custom/build.gradle",
    "chars": 659,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 26\n    buildToolsVersion \"27.0.3\"\n    defaultConfig"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_Custom/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_Custom/src/androidTest/java/com/bzai/gamesdk/project/channel/ExampleInstrumentedTest.java",
    "chars": 770,
    "preview": "package com.bzai.gamesdk.project.channel;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRe"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_Custom/src/main/AndroidManifest.xml",
    "chars": 119,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.bzai.gamesdk.project.channel\" />\n"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_Custom/src/main/assets/Plugin_config.txt",
    "chars": 438,
    "preview": "{\n    \"plugin\": [\n        {\n            \"plugin_name\": \"plugin_wechat\",\n            \"class_name\": \"com.bzai.gamesdk.plug"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_Custom/src/main/assets/Project_config.txt",
    "chars": 223,
    "preview": "{\n    \"project\": [\n        {\n            \"project_name\": \"project\",\n            \"class_name\": \"com.bzai.gamesdk.project."
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_Custom/src/main/assets/SDKInfo.json",
    "chars": 113,
    "preview": "{\n  \"sdk_type\": \"1\",\n  \"sdk_name\": \"SDK_Custom\",\n  \"sdk_version\": \"1.0.0\",\n  \"sdk_url\": \"http://www.baidu.com/\"\n}"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_Custom/src/main/java/com/bzai/gamesdk/project/CustomProject.java",
    "chars": 8587,
    "preview": "package com.bzai.gamesdk.project;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.I"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_Custom/src/main/java/com/bzai/gamesdk/project/ProjectApplication.java",
    "chars": 579,
    "preview": "package com.bzai.gamesdk.project;\n\nimport android.app.Application;\nimport android.content.Context;\n\nimport com.bzai.game"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_Custom/src/test/java/com/bzai/gamesdk/project/channel/ExampleUnitTest.java",
    "chars": 410,
    "preview": "package com.bzai.gamesdk.project.channel;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example loc"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_JuHe/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_JuHe/build.gradle",
    "chars": 706,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 26\n    buildToolsVersion \"27.0.3\"\n    defaultConfig"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_JuHe/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_JuHe/src/androidTest/java/com/bzai/gamesdk/project/juhe/ExampleInstrumentedTest.java",
    "chars": 764,
    "preview": "package com.bzai.gamesdk.project.juhe;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegis"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_JuHe/src/main/AndroidManifest.xml",
    "chars": 116,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.bzai.gamesdk.project.juhe\" />\n"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_JuHe/src/main/assets/Plugin_config.txt",
    "chars": 438,
    "preview": "{\n    \"plugin\": [\n        {\n            \"plugin_name\": \"plugin_wechat\",\n            \"class_name\": \"com.bzai.gamesdk.plug"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_JuHe/src/main/assets/Project_config.txt",
    "chars": 220,
    "preview": "{\n    \"project\": [\n        {\n            \"project_name\": \"project\",\n            \"class_name\": \"com.bzai.gamesdk.project."
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_JuHe/src/main/assets/SDKInfo.json",
    "chars": 111,
    "preview": "{\n  \"sdk_type\": \"1\",\n  \"sdk_name\": \"SDK_JuHe\",\n  \"sdk_version\": \"1.0.0\",\n  \"sdk_url\": \"http://www.baidu.com/\"\n}"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_JuHe/src/main/java/com/bzai/gamesdk/project/JuHeProject.java",
    "chars": 15701,
    "preview": "package com.bzai.gamesdk.project;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.I"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_JuHe/src/main/java/com/bzai/gamesdk/project/ProjectApplication.java",
    "chars": 674,
    "preview": "package com.bzai.gamesdk.project;\n\nimport android.content.Context;\nimport com.bzai.gamesdk.channel.application.ChannelAp"
  },
  {
    "path": "GameSDK_BeginProject/GameSDK_Project_JuHe/src/test/java/com/bzai/gamesdk/project/juhe/ExampleUnitTest.java",
    "chars": 407,
    "preview": "package com.bzai.gamesdk.project.juhe;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local "
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/build.gradle",
    "chars": 560,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 26\n    buildToolsVersion \"27.0.3\"\n    defaultConfig"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/androidTest/java/com/bzai/gamesdk/channel/test/ExampleInstrumentedTest.java",
    "chars": 764,
    "preview": "package com.bzai.gamesdk.channel.test;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegis"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/AndroidManifest.xml",
    "chars": 3471,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.bzai.gamesdk.channel.lexiang\" >\n\n\n"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/assets/Channel_config.txt",
    "chars": 227,
    "preview": "{\n    \"channel\": [\n        {\n            \"channel_name\": \"channel\",\n            \"class_name\": \"com.bzai.gamesdk.channel."
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/java/com/bzai/gamesdk/channel/application/ChannelApplication.java",
    "chars": 445,
    "preview": "package com.bzai.gamesdk.channel.application;\n\nimport android.app.Application;\nimport android.content.Context;\n\n/**\n * C"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/java/com/bzai/gamesdk/channel/lexiang/LexiangSDK.java",
    "chars": 6909,
    "preview": "package com.bzai.gamesdk.channel.lexiang;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.c"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_border_stroke.xml",
    "chars": 453,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <it"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_cir_hint_bg.xml",
    "chars": 392,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n\n    <item"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_cir_rect.xml",
    "chars": 655,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item "
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_drawable_1.xml",
    "chars": 1060,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item "
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_drawable_2.xml",
    "chars": 363,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item "
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_drawable_3.xml",
    "chars": 396,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item "
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_drawable_33.xml",
    "chars": 326,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item "
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_drawable_4.xml",
    "chars": 398,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item "
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_drawable_44.xml",
    "chars": 328,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item "
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_drawable_5.xml",
    "chars": 353,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item "
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_drawable_6.xml",
    "chars": 326,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item "
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/drawable/youxun_service_rect.xml",
    "chars": 361,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item "
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_account.xml",
    "chars": 348,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andro"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_account_hint.xml",
    "chars": 1200,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_account_login.xml",
    "chars": 8087,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_account_reg.xml",
    "chars": 7632,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_bound.xml",
    "chars": 11744,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_dialog.xml",
    "chars": 2762,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_dialog2.xml",
    "chars": 2754,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_dialog3.xml",
    "chars": 1855,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_floating.xml",
    "chars": 479,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_gb_dialog.xml",
    "chars": 3422,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_gb_item.xml",
    "chars": 2337,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_gb_menu.xml",
    "chars": 5389,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_gift_bag.xml",
    "chars": 1604,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_login.xml",
    "chars": 432,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    and"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_login_footprint.xml",
    "chars": 4280,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_login_menu.xml",
    "chars": 4468,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_login_option_item.xml",
    "chars": 1384,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_login_popup.xml",
    "chars": 1088,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_menu_2.xml",
    "chars": 2134,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_menu_3.xml",
    "chars": 1738,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_menu_4.xml",
    "chars": 2728,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_mobile.xml",
    "chars": 405,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andro"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_mobile_login.xml",
    "chars": 10368,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_mobile_reg.xml",
    "chars": 6925,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_mobile_verify.xml",
    "chars": 4796,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_notice.xml",
    "chars": 1517,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_pay.xml",
    "chars": 11405,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_toast.xml",
    "chars": 722,
    "preview": "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    and"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/main/res/layout/youxun_webview.xml",
    "chars": 2168,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/src/test/java/com/bzai/gamesdk/channel/test/ExampleUnitTest.java",
    "chars": 407,
    "preview": "package com.bzai.gamesdk.channel.test;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local "
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Lexiang/开发者说明",
    "chars": 349,
    "preview": "\n\n未避免后续SDK开发的同学开发和维护时,逻辑上能有个清晰的认知,这份说明文件必读!!!\n\nSYSDK_Channel_LeXiang: 乐享渠道SDK\n\n-----------------------------------------"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Test/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Test/build.gradle",
    "chars": 559,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 26\n    buildToolsVersion \"27.0.3\"\n    defaultConfig"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Test/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Test/src/androidTest/java/com/bzai/gamesdk/channel/test/ExampleInstrumentedTest.java",
    "chars": 764,
    "preview": "package com.bzai.gamesdk.channel.test;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegis"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Test/src/main/AndroidManifest.xml",
    "chars": 116,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.bzai.gamesdk.channel.test\" />\n"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Test/src/main/assets/Channel_config.txt",
    "chars": 228,
    "preview": "{\n    \"channel\": [\n        {\n            \"channel_name\": \"channel\",\n            \"class_name\": \"com.bzai.gamesdk.channel."
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Test/src/main/java/com/bzai/gamesdk/channel/application/ChannelApplication.java",
    "chars": 445,
    "preview": "package com.bzai.gamesdk.channel.application;\n\nimport android.app.Application;\nimport android.content.Context;\n\n/**\n * C"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Test/src/main/java/com/bzai/gamesdk/channel/test/TestChannelSDK.java",
    "chars": 7319,
    "preview": "package com.bzai.gamesdk.channel.test;\n\nimport android.app.AlertDialog;\nimport android.content.Context;\nimport android.c"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Test/src/main/res/values/strings.xml",
    "chars": 83,
    "preview": "<resources>\n    <string name=\"app_name\">GameSDK_Channel_Test</string>\n</resources>\n"
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Test/src/test/java/com/bzai/gamesdk/channel/test/ExampleUnitTest.java",
    "chars": 407,
    "preview": "package com.bzai.gamesdk.channel.test;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local "
  },
  {
    "path": "GameSDK_Channel/GameSDK_Channel_Test/开发者说明",
    "chars": 351,
    "preview": "\n\n未避免后续SDK开发的同学开发和维护时,逻辑上能有个清晰的认知,这份说明文件必读!!!\n\nSYSDK_Channel_Test: 模拟测试渠道SDK\n\n------------------------------------------"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Account/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Account/build.gradle",
    "chars": 604,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 26\n    buildToolsVersion \"27.0.3\"\n    defaultConfig"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Account/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Account/src/androidTest/java/com/bzai/gamesdk/module/account/ExampleInstrumentedTest.java",
    "chars": 768,
    "preview": "package com.bzai.gamesdk.module.account;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationReg"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Account/src/main/AndroidManifest.xml",
    "chars": 118,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.bzai.gamesdk.module.account\" />\n"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Account/src/main/java/com/bzai/gamesdk/module/account/AccountManager.java",
    "chars": 7490,
    "preview": "package com.bzai.gamesdk.module.account;\n\n\nimport android.app.Activity;\nimport android.app.AlertDialog;\nimport android.c"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Account/src/main/java/com/bzai/gamesdk/module/account/bean/AccountBean.java",
    "chars": 1145,
    "preview": "package com.bzai.gamesdk.module.account.bean;\n\n\n/**\n * Created by bzai on 2018/4/11.\n * <p>\n * Desc:\n *\n *  登录信息,封装服务端返回"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Account/src/main/java/com/bzai/gamesdk/module/account/bean/AccountCallBackBean.java",
    "chars": 882,
    "preview": "package com.bzai.gamesdk.module.account.bean;\n\n/**\n * Created by bzai on 2018/6/7.\n * <p>\n * Desc:\n *\n *    账号事件回调实体\n */"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Account/src/test/java/com/bzai/gamesdk/module/account/ExampleUnitTest.java",
    "chars": 409,
    "preview": "package com.bzai.gamesdk.module.account;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example loca"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Init/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Init/build.gradle",
    "chars": 604,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 26\n    buildToolsVersion \"27.0.3\"\n    defaultConfig"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Init/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Init/src/androidTest/java/com/bzai/gamesdk/module/init/ExampleInstrumentedTest.java",
    "chars": 762,
    "preview": "package com.bzai.gamesdk.module.init;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegist"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Init/src/main/AndroidManifest.xml",
    "chars": 115,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.bzai.gamesdk.module.init\" />\n"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Init/src/main/java/com/bzai/gamesdk/module/init/InitManager.java",
    "chars": 4191,
    "preview": "package com.bzai.gamesdk.module.init;\n\nimport android.app.Activity;\nimport android.app.Application;\nimport android.conte"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Init/src/test/java/com/bzai/gamesdk/module/init/ExampleUnitTest.java",
    "chars": 406,
    "preview": "package com.bzai.gamesdk.module.init;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local u"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Purchase/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Purchase/build.gradle",
    "chars": 604,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 26\n    buildToolsVersion \"27.0.3\"\n    defaultConfig"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Purchase/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Purchase/src/androidTest/java/com/bzai/gamesdk/module/purchase/ExampleInstrumentedTest.java",
    "chars": 770,
    "preview": "package com.bzai.gamesdk.module.purchase;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRe"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Purchase/src/main/AndroidManifest.xml",
    "chars": 119,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.bzai.gamesdk.module.purchase\" />\n"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Purchase/src/main/java/com/bzai/gamesdk/module/purchase/PurchaseManager.java",
    "chars": 2709,
    "preview": "package com.bzai.gamesdk.module.purchase;\n\nimport android.app.Activity;\nimport android.app.AlertDialog;\nimport android.c"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Purchase/src/main/java/com/bzai/gamesdk/module/purchase/PurchaseResult.java",
    "chars": 444,
    "preview": "package com.bzai.gamesdk.module.purchase;\n\n/**\n * Created by bzai on 2018/4/13.\n * <p>\n * Desc:\n *\n *  用于描述支付回调的信息\n *\n *"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Purchase/src/main/res/values/strings.xml",
    "chars": 86,
    "preview": "<resources>\n    <string name=\"app_name\">GameSDK_Module_Purchase</string>\n</resources>\n"
  },
  {
    "path": "GameSDK_Manager/GameSDK_Module_Purchase/src/test/java/com/bzai/gamesdk/module/purchase/ExampleUnitTest.java",
    "chars": 410,
    "preview": "package com.bzai.gamesdk.module.purchase;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example loc"
  },
  {
    "path": "GameSDK_Manager_Impl/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "GameSDK_Manager_Impl/build.gradle",
    "chars": 613,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 26\n    buildToolsVersion \"27.0.3\"\n    defaultConfig"
  },
  {
    "path": "GameSDK_Manager_Impl/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "GameSDK_Manager_Impl/src/androidTest/java/com/bzai/gamesdk/manager/impl/ExampleInstrumentedTest.java",
    "chars": 764,
    "preview": "package com.bzai.gamesdk.manager.impl;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegis"
  },
  {
    "path": "GameSDK_Manager_Impl/src/main/AndroidManifest.xml",
    "chars": 116,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.bzai.gamesdk.manager.impl\" />\n"
  },
  {
    "path": "GameSDK_Manager_Impl/src/main/java/com/bzai/gamesdk/invoke/plugin/AlipayPluginApi.java",
    "chars": 1431,
    "preview": "package com.bzai.gamesdk.invoke.plugin;\n\nimport android.content.Context;\n\n\nimport com.bzai.gamesdk.common.utils_base.int"
  },
  {
    "path": "GameSDK_Manager_Impl/src/main/java/com/bzai/gamesdk/invoke/plugin/WechatPluginApi.java",
    "chars": 1431,
    "preview": "package com.bzai.gamesdk.invoke.plugin;\n\nimport android.content.Context;\n\nimport com.bzai.gamesdk.common.utils_base.inte"
  },
  {
    "path": "GameSDK_Manager_Impl/src/main/res/values/strings.xml",
    "chars": 83,
    "preview": "<resources>\n    <string name=\"app_name\">GameSDK_Manager_Impl</string>\n</resources>\n"
  },
  {
    "path": "GameSDK_Manager_Impl/src/test/java/com/bzai/gamesdk/manager/impl/ExampleUnitTest.java",
    "chars": 407,
    "preview": "package com.bzai.gamesdk.manager.impl;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local "
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Alipay/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Alipay/build.gradle",
    "chars": 560,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 26\n    buildToolsVersion \"27.0.3\"\n    defaultConfig"
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Alipay/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Alipay/src/androidTest/java/com/bzai/gamesdk/plugin/alipay/ExampleInstrumentedTest.java",
    "chars": 766,
    "preview": "package com.bzai.gamesdk.plugin.alipay;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegi"
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Alipay/src/main/AndroidManifest.xml",
    "chars": 117,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.bzai.gamesdk.plugin.alipay\" />\n"
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Alipay/src/main/java/com/bzai/gamesdk/plugin/alipay/AlipayPlugin.java",
    "chars": 856,
    "preview": "package com.bzai.gamesdk.plugin.alipay;\n\nimport android.content.Context;\n\n\nimport com.bzai.gamesdk.common.utils_base.int"
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Alipay/src/main/java/com/bzai/gamesdk/plugin/alipay/pay/AlipayPay.java",
    "chars": 3394,
    "preview": "package com.bzai.gamesdk.plugin.alipay.pay;\n\nimport android.annotation.SuppressLint;\nimport android.app.Activity;\nimport"
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Alipay/src/main/java/com/bzai/gamesdk/plugin/alipay/pay/PayResult.java",
    "chars": 999,
    "preview": "package com.bzai.gamesdk.plugin.alipay.pay;\r\rimport android.text.TextUtils;\r\rimport java.util.Map;\r\rpublic class PayResu"
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Alipay/src/main/res/values/strings.xml",
    "chars": 84,
    "preview": "<resources>\n    <string name=\"app_name\">GameSDK_Plugin_Alipay</string>\n</resources>\n"
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Alipay/src/test/java/com/bzai/gamesdk/plugin/alipay/ExampleUnitTest.java",
    "chars": 408,
    "preview": "package com.bzai.gamesdk.plugin.alipay;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local"
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Wechat/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Wechat/build.gradle",
    "chars": 560,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 26\n    buildToolsVersion \"27.0.3\"\n    defaultConfig"
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Wechat/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Wechat/src/androidTest/java/com/bzai/gamesdk/plugin/wechat/ExampleInstrumentedTest.java",
    "chars": 766,
    "preview": "package com.bzai.gamesdk.plugin.wechat;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegi"
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Wechat/src/main/AndroidManifest.xml",
    "chars": 117,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.bzai.gamesdk.plugin.wechat\" />\n"
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Wechat/src/main/java/com/bzai/gamesdk/plugin/wechat/WechatPlugin.java",
    "chars": 1376,
    "preview": "package com.bzai.gamesdk.plugin.wechat;\n\nimport android.content.Context;\n\nimport com.bzai.gamesdk.common.utils_base.inte"
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Wechat/src/main/java/com/bzai/gamesdk/plugin/wechat/login/WechatLogin.java",
    "chars": 569,
    "preview": "package com.bzai.gamesdk.plugin.wechat.login;\n\n\n/**\n * Created by bzai on 2018/6/21.\n * <p>\n * Desc:\n *\n *  封装微信登录\n */\n\n"
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Wechat/src/main/java/com/bzai/gamesdk/plugin/wechat/pay/WechatPay.java",
    "chars": 1211,
    "preview": "package com.bzai.gamesdk.plugin.wechat.pay;\n\nimport android.content.Context;\nimport android.text.TextUtils;\n\nimport com."
  },
  {
    "path": "GameSDK_Plugin/GameSDK_Plugin_Wechat/src/test/java/com/bzai/gamesdk/plugin/wechat/ExampleUnitTest.java",
    "chars": 408,
    "preview": "package com.bzai.gamesdk.plugin.wechat;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local"
  },
  {
    "path": "GameSDK_Utils/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "GameSDK_Utils/build.gradle",
    "chars": 521,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 26\n    buildToolsVersion \"27.0.3\"\n    defaultConfig"
  },
  {
    "path": "GameSDK_Utils/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  }
]

// ... and 224 more files (download for full content)

About this extraction

This page contains the full source code of the Bzaigege/GameSDKFrameDemo GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 424 files (50.5 MB), approximately 301.6k tokens, and a symbol index with 2208 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!