Full Code of Tencent/Shadow for AI

master adafe8e31825 cached
948 files
2.0 MB
611.5k tokens
3115 symbols
1 requests
Download .txt
Showing preview only (2,443K chars total). Download the full file or copy to clipboard to get everything.
Repository: Tencent/Shadow
Branch: master
Commit: adafe8e31825
Files: 948
Total size: 2.0 MB

Directory structure:
gitextract_9gwt80rw/

├── .commitlintrc.yml
├── .github/
│   ├── actions/
│   │   ├── post-build/
│   │   │   └── action.yml
│   │   └── pre-build/
│   │       └── action.yml
│   └── workflows/
│       ├── check-build-test.yml
│       └── release.yml
├── .gitignore
├── .idea/
│   └── codeStyles/
│       ├── Project.xml
│       └── codeStyleConfig.xml
├── CONTRIBUTING.md
├── LICENSE.txt
├── PRIVACY.md
├── README.md
├── build.gradle
├── buildScripts/
│   └── gradle/
│       ├── common.gradle
│       ├── fix_issue_1263.gradle
│       ├── maven.gradle
│       └── versions.properties
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── projects/
│   ├── sample/
│   │   ├── README.md
│   │   ├── dynamic-apk/
│   │   │   ├── sample-hello-api/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── build.gradle
│   │   │   │   ├── proguard-rules.pro
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           ├── AndroidManifest.xml
│   │   │   │           └── java/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── sample/
│   │   │   │                               └── api/
│   │   │   │                                   └── hello/
│   │   │   │                                       ├── HelloFactory.java
│   │   │   │                                       ├── IHelloWorld.java
│   │   │   │                                       └── IHelloWorldImpl.java
│   │   │   ├── sample-hello-api-holder/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── build.gradle
│   │   │   │   ├── proguard-rules.pro
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           ├── AndroidManifest.xml
│   │   │   │           └── java/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── sample/
│   │   │   │                               └── apk/
│   │   │   │                                   └── hello/
│   │   │   │                                       ├── DynamicHello.java
│   │   │   │                                       ├── HelloImplLoader.java
│   │   │   │                                       └── HelloWorldUpdater.java
│   │   │   ├── sample-hello-apk/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   ├── proguard-rules.pro
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           ├── AndroidManifest.xml
│   │   │   │           ├── java/
│   │   │   │           │   └── com/
│   │   │   │           │       └── tencent/
│   │   │   │           │           └── shadow/
│   │   │   │           │               ├── dynamic/
│   │   │   │           │               │   └── impl/
│   │   │   │           │               │       ├── HelloFactoryImpl.java
│   │   │   │           │               │       └── WhiteList.java
│   │   │   │           │               └── sample/
│   │   │   │           │                   └── api/
│   │   │   │           │                       └── hello/
│   │   │   │           │                           └── SampleHelloWorld.java
│   │   │   │           └── res/
│   │   │   │               └── layout/
│   │   │   │                   └── activity_load_plugin.xml
│   │   │   └── sample-hello-host/
│   │   │       ├── .gitignore
│   │   │       ├── build.gradle
│   │   │       ├── proguard-rules.pro
│   │   │       └── src/
│   │   │           └── main/
│   │   │               ├── AndroidManifest.xml
│   │   │               └── java/
│   │   │                   └── com/
│   │   │                       └── tencent/
│   │   │                           └── shadow/
│   │   │                               └── sample/
│   │   │                                   └── host/
│   │   │                                       ├── AndroidLogLoggerFactory.java
│   │   │                                       ├── HostApplication.java
│   │   │                                       ├── MainActivity.java
│   │   │                                       ├── PluginHelper.java
│   │   │                                       └── api/
│   │   │                                           ├── FixedPathPmUpdater.java
│   │   │                                           └── HelloWorldApiHolder.java
│   │   ├── maven/
│   │   │   ├── host-project/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   ├── gradle/
│   │   │   │   │   └── wrapper/
│   │   │   │   │       ├── gradle-wrapper.jar
│   │   │   │   │       └── gradle-wrapper.properties
│   │   │   │   ├── gradle.properties
│   │   │   │   ├── gradlew
│   │   │   │   ├── gradlew.bat
│   │   │   │   ├── introduce-shadow-lib/
│   │   │   │   │   ├── .gitignore
│   │   │   │   │   ├── build.gradle
│   │   │   │   │   ├── proguard-rules.pro
│   │   │   │   │   └── src/
│   │   │   │   │       └── main/
│   │   │   │   │           ├── AndroidManifest.xml
│   │   │   │   │           ├── java/
│   │   │   │   │           │   └── com/
│   │   │   │   │           │       └── tencent/
│   │   │   │   │           │           └── shadow/
│   │   │   │   │           │               └── sample/
│   │   │   │   │           │                   └── introduce_shadow_lib/
│   │   │   │   │           │                       ├── AndroidLoggerFactory.java
│   │   │   │   │           │                       ├── FixedPathPmUpdater.java
│   │   │   │   │           │                       ├── InitApplication.java
│   │   │   │   │           │                       └── MainPluginProcessService.java
│   │   │   │   │           └── res/
│   │   │   │   │               └── values/
│   │   │   │   │                   └── themes.xml
│   │   │   │   ├── sample-host/
│   │   │   │   │   ├── .gitignore
│   │   │   │   │   ├── build.gradle
│   │   │   │   │   ├── proguard-rules.pro
│   │   │   │   │   └── src/
│   │   │   │   │       └── main/
│   │   │   │   │           ├── AndroidManifest.xml
│   │   │   │   │           └── java/
│   │   │   │   │               └── com/
│   │   │   │   │                   └── tencent/
│   │   │   │   │                       └── shadow/
│   │   │   │   │                           └── sample/
│   │   │   │   │                               └── host/
│   │   │   │   │                                   ├── MainActivity.java
│   │   │   │   │                                   └── MyApplication.java
│   │   │   │   └── settings.gradle
│   │   │   ├── manager-project/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   ├── gradle/
│   │   │   │   │   └── wrapper/
│   │   │   │   │       ├── gradle-wrapper.jar
│   │   │   │   │       └── gradle-wrapper.properties
│   │   │   │   ├── gradle.properties
│   │   │   │   ├── gradlew
│   │   │   │   ├── gradlew.bat
│   │   │   │   ├── sample-manager/
│   │   │   │   │   ├── .gitignore
│   │   │   │   │   ├── build.gradle
│   │   │   │   │   ├── proguard-rules.pro
│   │   │   │   │   └── src/
│   │   │   │   │       └── main/
│   │   │   │   │           ├── AndroidManifest.xml
│   │   │   │   │           ├── aidl/
│   │   │   │   │           │   └── com/
│   │   │   │   │           │       └── tencent/
│   │   │   │   │           │           └── shadow/
│   │   │   │   │           │               └── sample/
│   │   │   │   │           │                   └── plugin/
│   │   │   │   │           │                       └── IMyAidlInterface.aidl
│   │   │   │   │           ├── java/
│   │   │   │   │           │   └── com/
│   │   │   │   │           │       └── tencent/
│   │   │   │   │           │           └── shadow/
│   │   │   │   │           │               ├── dynamic/
│   │   │   │   │           │               │   └── impl/
│   │   │   │   │           │               │       ├── ManagerFactoryImpl.java
│   │   │   │   │           │               │       └── WhiteList.java
│   │   │   │   │           │               └── sample/
│   │   │   │   │           │                   └── manager/
│   │   │   │   │           │                       ├── Constant.java
│   │   │   │   │           │                       ├── FastPluginManager.java
│   │   │   │   │           │                       └── SamplePluginManager.java
│   │   │   │   │           └── res/
│   │   │   │   │               └── layout/
│   │   │   │   │                   └── activity_load_plugin.xml
│   │   │   │   └── settings.gradle
│   │   │   └── plugin-project/
│   │   │       ├── .gitignore
│   │   │       ├── build.gradle
│   │   │       ├── gradle/
│   │   │       │   └── wrapper/
│   │   │       │       ├── gradle-wrapper.jar
│   │   │       │       └── gradle-wrapper.properties
│   │   │       ├── gradle.properties
│   │   │       ├── gradlew
│   │   │       ├── gradlew.bat
│   │   │       ├── plugin-app/
│   │   │       │   ├── .gitignore
│   │   │       │   ├── build.gradle
│   │   │       │   ├── proguard-rules.pro
│   │   │       │   └── src/
│   │   │       │       └── main/
│   │   │       │           ├── AndroidManifest.xml
│   │   │       │           ├── aidl/
│   │   │       │           │   └── com/
│   │   │       │           │       └── tencent/
│   │   │       │           │           └── shadow/
│   │   │       │           │               └── sample/
│   │   │       │           │                   └── plugin/
│   │   │       │           │                       └── IMyAidlInterface.aidl
│   │   │       │           ├── java/
│   │   │       │           │   └── com/
│   │   │       │           │       └── tencent/
│   │   │       │           │           └── shadow/
│   │   │       │           │               └── sample/
│   │   │       │           │                   └── plugin/
│   │   │       │           │                       ├── MainActivity.java
│   │   │       │           │                       └── MyService.java
│   │   │       │           └── res/
│   │   │       │               ├── layout/
│   │   │       │               │   └── activity_main.xml
│   │   │       │               └── values/
│   │   │       │                   ├── colors.xml
│   │   │       │                   ├── strings.xml
│   │   │       │                   └── styles.xml
│   │   │       ├── sample-loader/
│   │   │       │   ├── .gitignore
│   │   │       │   ├── build.gradle
│   │   │       │   ├── proguard-rules.pro
│   │   │       │   └── src/
│   │   │       │       └── main/
│   │   │       │           ├── AndroidManifest.xml
│   │   │       │           └── java/
│   │   │       │               └── com/
│   │   │       │                   └── tencent/
│   │   │       │                       └── shadow/
│   │   │       │                           ├── dynamic/
│   │   │       │                           │   └── loader/
│   │   │       │                           │       └── impl/
│   │   │       │                           │           └── CoreLoaderFactoryImpl.java
│   │   │       │                           └── sample/
│   │   │       │                               └── loader/
│   │   │       │                                   ├── SampleComponentManager.java
│   │   │       │                                   └── SamplePluginLoader.java
│   │   │       ├── sample-runtime/
│   │   │       │   ├── .gitignore
│   │   │       │   ├── build.gradle
│   │   │       │   ├── proguard-rules.pro
│   │   │       │   └── src/
│   │   │       │       └── main/
│   │   │       │           ├── AndroidManifest.xml
│   │   │       │           └── java/
│   │   │       │               └── com/
│   │   │       │                   └── tencent/
│   │   │       │                       └── shadow/
│   │   │       │                           └── sample/
│   │   │       │                               └── runtime/
│   │   │       │                                   ├── PluginDefaultProxyActivity.java
│   │   │       │                                   ├── PluginSingleInstance1ProxyActivity.java
│   │   │       │                                   └── PluginSingleTask1ProxyActivity.java
│   │   │       └── settings.gradle
│   │   └── source/
│   │       ├── sample-constant/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   ├── proguard-rules.pro
│   │       │   └── src/
│   │       │       └── main/
│   │       │           ├── AndroidManifest.xml
│   │       │           └── java/
│   │       │               └── com/
│   │       │                   └── tencent/
│   │       │                       └── shadow/
│   │       │                           └── sample/
│   │       │                               └── constant/
│   │       │                                   └── Constant.java
│   │       ├── sample-host/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   ├── proguard-rules.pro
│   │       │   └── src/
│   │       │       └── main/
│   │       │           ├── AndroidManifest.xml
│   │       │           ├── java/
│   │       │           │   └── com/
│   │       │           │       └── tencent/
│   │       │           │           └── shadow/
│   │       │           │               └── sample/
│   │       │           │                   └── host/
│   │       │           │                       ├── AndroidLogLoggerFactory.java
│   │       │           │                       ├── HostApplication.java
│   │       │           │                       ├── MainActivity.java
│   │       │           │                       ├── Plugin2ProcessPPS.java
│   │       │           │                       ├── PluginHelper.java
│   │       │           │                       ├── PluginLoadActivity.java
│   │       │           │                       ├── PluginProcessPPS.java
│   │       │           │                       ├── manager/
│   │       │           │                       │   ├── FixedPathPmUpdater.java
│   │       │           │                       │   └── Shadow.java
│   │       │           │                       └── plugin_view/
│   │       │           │                           ├── HostAddPluginViewActivity.java
│   │       │           │                           └── MainProcessManagerReceiver.java
│   │       │           └── res/
│   │       │               ├── layout/
│   │       │               │   ├── activity_jump_to_plugin.xml
│   │       │               │   ├── activity_load.xml
│   │       │               │   └── part_key_adapter.xml
│   │       │               └── values/
│   │       │                   ├── strings.xml
│   │       │                   └── themes.xml
│   │       ├── sample-host-lib/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   ├── proguard-rules.pro
│   │       │   ├── sample-host-lib.pro
│   │       │   └── src/
│   │       │       └── main/
│   │       │           ├── AndroidManifest.xml
│   │       │           ├── java/
│   │       │           │   └── com/
│   │       │           │       └── tencent/
│   │       │           │           └── shadow/
│   │       │           │               └── sample/
│   │       │           │                   └── host/
│   │       │           │                       └── lib/
│   │       │           │                           ├── HostAddPluginViewContainer.java
│   │       │           │                           ├── HostAddPluginViewContainerHolder.java
│   │       │           │                           ├── HostUiLayerProvider.java
│   │       │           │                           └── LoadPluginCallback.java
│   │       │           └── res/
│   │       │               └── layout/
│   │       │                   └── host_ui_layer_layout.xml
│   │       ├── sample-manager/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   ├── proguard-rules.pro
│   │       │   └── src/
│   │       │       └── main/
│   │       │           ├── AndroidManifest.xml
│   │       │           ├── java/
│   │       │           │   └── com/
│   │       │           │       └── tencent/
│   │       │           │           └── shadow/
│   │       │           │               ├── dynamic/
│   │       │           │               │   └── impl/
│   │       │           │               │       ├── ManagerFactoryImpl.java
│   │       │           │               │       └── WhiteList.java
│   │       │           │               └── sample/
│   │       │           │                   └── manager/
│   │       │           │                       ├── FastPluginManager.java
│   │       │           │                       └── SamplePluginManager.java
│   │       │           └── res/
│   │       │               └── layout/
│   │       │                   └── activity_load_plugin.xml
│   │       └── sample-plugin/
│   │           ├── sample-app/
│   │           │   ├── .gitignore
│   │           │   ├── build.gradle
│   │           │   ├── proguard-rules.pro
│   │           │   └── src/
│   │           │       └── main/
│   │           │           ├── AndroidManifest.xml
│   │           │           ├── assets/
│   │           │           │   └── web/
│   │           │           │       └── test.html
│   │           │           ├── java/
│   │           │           │   └── com/
│   │           │           │       └── tencent/
│   │           │           │           └── shadow/
│   │           │           │               └── sample/
│   │           │           │                   └── plugin/
│   │           │           │                       └── app/
│   │           │           │                           └── lib/
│   │           │           │                               ├── UseCaseApplication.java
│   │           │           │                               └── usecases/
│   │           │           │                                   ├── activity/
│   │           │           │                                   │   ├── TestActivityOnCreate.java
│   │           │           │                                   │   ├── TestActivityOptionMenu.java
│   │           │           │                                   │   ├── TestActivityOrientation.java
│   │           │           │                                   │   ├── TestActivityReCreate.java
│   │           │           │                                   │   ├── TestActivityReCreateBySystem.java
│   │           │           │                                   │   ├── TestActivitySetTheme.java
│   │           │           │                                   │   └── TestActivityWindowSoftMode.java
│   │           │           │                                   ├── application/
│   │           │           │                                   │   └── TestApplicationActivity.java
│   │           │           │                                   ├── context/
│   │           │           │                                   │   ├── ActivityContextSubDirTestActivity.java
│   │           │           │                                   │   ├── ApplicationContextSubDirTestActivity.java
│   │           │           │                                   │   └── SubDirContextThemeWrapperTestActivity.java
│   │           │           │                                   ├── dialog/
│   │           │           │                                   │   ├── TestDialog.java
│   │           │           │                                   │   └── TestDialogActivity.java
│   │           │           │                                   ├── fragment/
│   │           │           │                                   │   ├── TestDialogFragment.java
│   │           │           │                                   │   ├── TestDialogFragmentActivity.java
│   │           │           │                                   │   ├── TestDynamicFragmentActivity.java
│   │           │           │                                   │   ├── TestFragment.java
│   │           │           │                                   │   └── TestXmlFragmentActivity.java
│   │           │           │                                   ├── host_communication/
│   │           │           │                                   │   └── PluginUseHostClassActivity.java
│   │           │           │                                   ├── packagemanager/
│   │           │           │                                   │   └── TestPackageManagerActivity.java
│   │           │           │                                   ├── provider/
│   │           │           │                                   │   ├── TestDBContentProviderActivity.java
│   │           │           │                                   │   ├── TestDBHelper.java
│   │           │           │                                   │   ├── TestFileProviderActivity.java
│   │           │           │                                   │   ├── TestProvider.java
│   │           │           │                                   │   └── TestProviderInfo.java
│   │           │           │                                   ├── receiver/
│   │           │           │                                   │   ├── MyReceiver.java
│   │           │           │                                   │   ├── TestDynamicReceiverActivity.java
│   │           │           │                                   │   └── TestReceiverActivity.java
│   │           │           │                                   ├── service/
│   │           │           │                                   │   └── HostAddPluginViewService.java
│   │           │           │                                   └── webview/
│   │           │           │                                       └── WebViewActivity.java
│   │           │           └── res/
│   │           │               ├── anim/
│   │           │               │   └── dialog_exit_fade_out.xml
│   │           │               ├── drawable/
│   │           │               │   ├── selector_group.xml
│   │           │               │   └── selector_item.xml
│   │           │               ├── layout/
│   │           │               │   ├── activity_test_file_provider.xml
│   │           │               │   ├── activity_test_re_create_by_system.xml
│   │           │               │   ├── layout_activity_lifecycle.xml
│   │           │               │   ├── layout_activity_settheme.xml
│   │           │               │   ├── layout_common.xml
│   │           │               │   ├── layout_dialog.xml
│   │           │               │   ├── layout_dialog_activity.xml
│   │           │               │   ├── layout_fragment_activity.xml
│   │           │               │   ├── layout_fragment_test.xml
│   │           │               │   ├── layout_fragment_xml_activity.xml
│   │           │               │   ├── layout_host_add_plugin_view.xml
│   │           │               │   ├── layout_orientation.xml
│   │           │               │   ├── layout_packagemanager.xml
│   │           │               │   ├── layout_provider_db.xml
│   │           │               │   ├── layout_receiver.xml
│   │           │               │   ├── layout_recreate.xml
│   │           │               │   ├── layout_result.xml
│   │           │               │   ├── layout_service.xml
│   │           │               │   ├── layout_softmode.xml
│   │           │               │   └── layout_test_view_cons_cache.xml
│   │           │               ├── menu/
│   │           │               │   └── case_test_activity_option_menu.xml
│   │           │               ├── values/
│   │           │               │   ├── strings.xml
│   │           │               │   ├── styles.xml
│   │           │               │   └── themes.xml
│   │           │               └── values-v21/
│   │           │                   └── themes.xml
│   │           ├── sample-base/
│   │           │   ├── .gitignore
│   │           │   ├── build.gradle
│   │           │   ├── proguard-rules.pro
│   │           │   └── src/
│   │           │       └── main/
│   │           │           └── AndroidManifest.xml
│   │           ├── sample-base-lib/
│   │           │   ├── .gitignore
│   │           │   ├── build.gradle
│   │           │   ├── proguard-rules.pro
│   │           │   └── src/
│   │           │       └── main/
│   │           │           ├── AndroidManifest.xml
│   │           │           ├── java/
│   │           │           │   └── com/
│   │           │           │       └── tencent/
│   │           │           │           └── shadow/
│   │           │           │               └── sample/
│   │           │           │                   └── plugin/
│   │           │           │                       └── app/
│   │           │           │                           └── lib/
│   │           │           │                               └── gallery/
│   │           │           │                                   ├── BaseActivity.java
│   │           │           │                                   ├── MainActivity.java
│   │           │           │                                   ├── TestApplication.java
│   │           │           │                                   ├── cases/
│   │           │           │                                   │   ├── UseCaseManager.java
│   │           │           │                                   │   ├── UseCaseSummaryFragment.java
│   │           │           │                                   │   └── entity/
│   │           │           │                                   │       ├── UseCase.java
│   │           │           │                                   │       └── UseCaseCategory.java
│   │           │           │                                   ├── splash/
│   │           │           │                                   │   ├── ISplashAnimation.java
│   │           │           │                                   │   ├── SplashActivity.java
│   │           │           │                                   │   └── SplashAnimation.java
│   │           │           │                                   └── util/
│   │           │           │                                       ├── PluginChecker.java
│   │           │           │                                       ├── ToastUtil.java
│   │           │           │                                       └── UiUtil.java
│   │           │           └── res/
│   │           │               ├── drawable/
│   │           │               │   └── child_bg.xml
│   │           │               ├── layout/
│   │           │               │   ├── layout_case_category_item.xml
│   │           │               │   ├── layout_case_item.xml
│   │           │               │   ├── layout_fragment_case_summary.xml
│   │           │               │   ├── layout_main.xml
│   │           │               │   ├── layout_main_above.xml
│   │           │               │   ├── layout_main_behind.xml
│   │           │               │   └── layout_splash.xml
│   │           │               ├── values/
│   │           │               │   ├── dimens.xml
│   │           │               │   ├── strings.xml
│   │           │               │   └── themes.xml
│   │           │               └── xml/
│   │           │                   └── filepaths.xml
│   │           ├── sample-loader/
│   │           │   ├── .gitignore
│   │           │   ├── build.gradle
│   │           │   ├── proguard-rules.pro
│   │           │   └── src/
│   │           │       └── main/
│   │           │           ├── AndroidManifest.xml
│   │           │           └── java/
│   │           │               └── com/
│   │           │                   └── tencent/
│   │           │                       └── shadow/
│   │           │                           ├── dynamic/
│   │           │                           │   ├── impl/
│   │           │                           │   │   └── WhiteList.java
│   │           │                           │   └── loader/
│   │           │                           │       └── impl/
│   │           │                           │           └── CoreLoaderFactoryImpl.java
│   │           │                           └── sample/
│   │           │                               └── plugin/
│   │           │                                   └── loader/
│   │           │                                       ├── SampleComponentManager.java
│   │           │                                       └── SamplePluginLoader.java
│   │           ├── sample-runtime/
│   │           │   ├── .gitignore
│   │           │   ├── build.gradle
│   │           │   ├── proguard-rules.pro
│   │           │   └── src/
│   │           │       └── main/
│   │           │           ├── AndroidManifest.xml
│   │           │           └── java/
│   │           │               └── com/
│   │           │                   └── tencent/
│   │           │                       └── shadow/
│   │           │                           └── sample/
│   │           │                               └── plugin/
│   │           │                                   └── runtime/
│   │           │                                       ├── PluginDefaultProxyActivity.java
│   │           │                                       ├── PluginSingleInstance1ProxyActivity.java
│   │           │                                       └── PluginSingleTask1ProxyActivity.java
│   │           └── third-party/
│   │               ├── pinnedheaderexpandablelistview/
│   │               │   ├── .gitignore
│   │               │   ├── LICENSE
│   │               │   ├── README.md
│   │               │   ├── build.gradle
│   │               │   ├── proguard-rules.pro
│   │               │   └── src/
│   │               │       └── main/
│   │               │           ├── AndroidManifest.xml
│   │               │           └── java/
│   │               │               └── com/
│   │               │                   └── ryg/
│   │               │                       └── expandable/
│   │               │                           └── ui/
│   │               │                               ├── PinnedHeaderExpandableListView.java
│   │               │                               └── StickyLayout.java
│   │               └── slidingmenu/
│   │                   ├── .gitignore
│   │                   ├── LICENSE.txt
│   │                   ├── README.md
│   │                   ├── build.gradle
│   │                   ├── proguard-rules.pro
│   │                   └── src/
│   │                       └── main/
│   │                           ├── AndroidManifest.xml
│   │                           ├── java/
│   │                           │   └── com/
│   │                           │       └── jeremyfeinstein/
│   │                           │           └── slidingmenu/
│   │                           │               └── lib/
│   │                           │                   ├── CanvasTransformerBuilder.java
│   │                           │                   ├── CustomViewAbove.java
│   │                           │                   ├── CustomViewBehind.java
│   │                           │                   └── SlidingMenu.java
│   │                           └── res/
│   │                               └── values/
│   │                                   ├── attrs.xml
│   │                                   └── ids.xml
│   ├── sdk/
│   │   ├── coding/
│   │   │   ├── .gitignore
│   │   │   ├── aar-to-jar-plugin/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           └── kotlin/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── coding/
│   │   │   │                               └── aar_to_jar_plugin/
│   │   │   │                                   └── AarToJarPlugin.kt
│   │   │   ├── android-jar/
│   │   │   │   ├── .gitignore
│   │   │   │   └── build.gradle
│   │   │   ├── build.gradle
│   │   │   ├── code-generator/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       ├── main/
│   │   │   │       │   └── kotlin/
│   │   │   │       │       └── com/
│   │   │   │       │           └── tencent/
│   │   │   │       │               └── shadow/
│   │   │   │       │                   ├── coding/
│   │   │   │       │                   │   └── code_generator/
│   │   │   │       │                   │       └── ActivityCodeGenerator.kt
│   │   │   │       │                   └── core/
│   │   │   │       │                       └── runtime/
│   │   │   │       │                           └── NeighborClass.kt
│   │   │   │       └── test/
│   │   │   │           └── kotlin/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── coding/
│   │   │   │                               └── code_generator/
│   │   │   │                                   └── ActivityCodeGeneratorTest.kt
│   │   │   ├── common-jar-settings/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           └── kotlin/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── coding/
│   │   │   │                               └── common_jar_settings/
│   │   │   │                                   └── CommonJarSettingsPlugin.kt
│   │   │   ├── get-android-jar/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           └── AndroidManifest.xml
│   │   │   ├── gradle/
│   │   │   │   └── wrapper/
│   │   │   │       ├── gradle-wrapper.jar
│   │   │   │       └── gradle-wrapper.properties
│   │   │   ├── gradlew
│   │   │   ├── gradlew.bat
│   │   │   ├── java-build-config/
│   │   │   │   ├── .gitignore
│   │   │   │   └── build.gradle
│   │   │   └── settings.gradle
│   │   ├── core/
│   │   │   ├── .gitignore
│   │   │   ├── activity-container/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           └── java/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── core/
│   │   │   │                               └── runtime/
│   │   │   │                                   └── container/
│   │   │   │                                       ├── DelegateProvider.java
│   │   │   │                                       ├── DelegateProviderHolder.java
│   │   │   │                                       ├── HostActivity.java
│   │   │   │                                       ├── HostActivityDelegate.java
│   │   │   │                                       ├── HostActivityDelegator.java
│   │   │   │                                       ├── HostNativeActivityDelegate.java
│   │   │   │                                       ├── HostNativeActivityDelegator.java
│   │   │   │                                       ├── NativePluginContainerActivity.java
│   │   │   │                                       └── PluginContainerActivity.java
│   │   │   ├── build.gradle
│   │   │   ├── common/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           └── java/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── core/
│   │   │   │                               ├── common/
│   │   │   │                               │   ├── ILoggerFactory.java
│   │   │   │                               │   ├── InstalledApk.java
│   │   │   │                               │   ├── Logger.java
│   │   │   │                               │   └── LoggerFactory.java
│   │   │   │                               └── runtime/
│   │   │   │                                   └── container/
│   │   │   │                                       ├── ContentProviderDelegateProvider.java
│   │   │   │                                       ├── ContentProviderDelegateProviderHolder.java
│   │   │   │                                       ├── HostContentProviderDelegate.java
│   │   │   │                                       └── PluginContainerContentProvider.java
│   │   │   ├── gradle/
│   │   │   │   └── wrapper/
│   │   │   │       ├── gradle-wrapper.jar
│   │   │   │       └── gradle-wrapper.properties
│   │   │   ├── gradle-plugin/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       ├── main/
│   │   │   │       │   └── kotlin/
│   │   │   │       │       └── com/
│   │   │   │       │           └── tencent/
│   │   │   │       │               └── shadow/
│   │   │   │       │                   └── core/
│   │   │   │       │                       └── gradle/
│   │   │   │       │                           ├── AGPCompat.kt
│   │   │   │       │                           ├── AGPCompatImpl.kt
│   │   │   │       │                           ├── CreatePackagePluginTask.kt
│   │   │   │       │                           ├── ShadowPlugin.kt
│   │   │   │       │                           ├── ShadowPluginHelper.kt
│   │   │   │       │                           └── extensions/
│   │   │   │       │                               ├── PackagePluginExtension.kt
│   │   │   │       │                               ├── PluginApkConfig.kt
│   │   │   │       │                               └── PluginBuildType.kt
│   │   │   │       └── test/
│   │   │   │           ├── kotlin/
│   │   │   │           │   └── com/
│   │   │   │           │       └── tencent/
│   │   │   │           │           └── shadow/
│   │   │   │           │               └── core/
│   │   │   │           │                   └── gradle/
│   │   │   │           │                       ├── PackageMultiPluginTest.kt
│   │   │   │           │                       ├── PackageOnlyPluginTest.kt
│   │   │   │           │                       └── PackagePluginTaskTest.kt
│   │   │   │           └── testProjects/
│   │   │   │               └── case1/
│   │   │   │                   ├── .gitignore
│   │   │   │                   ├── build.gradle
│   │   │   │                   ├── loader/
│   │   │   │                   │   ├── build.gradle
│   │   │   │                   │   └── src/
│   │   │   │                   │       └── main/
│   │   │   │                   │           └── AndroidManifest.xml
│   │   │   │                   ├── plugin1/
│   │   │   │                   │   ├── .gitignore
│   │   │   │                   │   ├── build.gradle
│   │   │   │                   │   └── src/
│   │   │   │                   │       └── main/
│   │   │   │                   │           └── AndroidManifest.xml
│   │   │   │                   ├── plugin2/
│   │   │   │                   │   ├── .gitignore
│   │   │   │                   │   ├── build.gradle
│   │   │   │                   │   └── src/
│   │   │   │                   │       └── main/
│   │   │   │                   │           └── AndroidManifest.xml
│   │   │   │                   ├── runtime/
│   │   │   │                   │   ├── build.gradle
│   │   │   │                   │   └── src/
│   │   │   │                   │       └── main/
│   │   │   │                   │           └── AndroidManifest.xml
│   │   │   │                   ├── settings.gradle
│   │   │   │                   └── src/
│   │   │   │                       └── main/
│   │   │   │                           └── AndroidManifest.xml
│   │   │   ├── gradle.properties
│   │   │   ├── gradlew
│   │   │   ├── gradlew.bat
│   │   │   ├── load-parameters/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           └── java/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── core/
│   │   │   │                               └── load_parameters/
│   │   │   │                                   └── LoadParameters.java
│   │   │   ├── loader/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       ├── main/
│   │   │   │       │   └── kotlin/
│   │   │   │       │       └── com/
│   │   │   │       │           └── tencent/
│   │   │   │       │               └── shadow/
│   │   │   │       │                   └── core/
│   │   │   │       │                       └── loader/
│   │   │   │       │                           ├── ShadowPluginLoader.kt
│   │   │   │       │                           ├── blocs/
│   │   │   │       │                           │   ├── CheckPackageNameBloc.kt
│   │   │   │       │                           │   ├── CreateApplicationBloc.kt
│   │   │   │       │                           │   ├── CreatePluginApplicationInfoBloc.kt
│   │   │   │       │                           │   ├── CreateResourceBloc.kt
│   │   │   │       │                           │   ├── LoadApkBloc.kt
│   │   │   │       │                           │   └── LoadPluginBloc.kt
│   │   │   │       │                           ├── classloaders/
│   │   │   │       │                           │   ├── CombineClassLoader.kt
│   │   │   │       │                           │   └── PluginClassLoader.kt
│   │   │   │       │                           ├── delegates/
│   │   │   │       │                           │   ├── DI.kt
│   │   │   │       │                           │   ├── PackageManagerWrapper.java
│   │   │   │       │                           │   ├── ShadowActivityDelegate.kt
│   │   │   │       │                           │   ├── ShadowContentProviderDelegate.kt
│   │   │   │       │                           │   ├── ShadowDelegate.kt
│   │   │   │       │                           │   └── ShadowNativeActivityDelegate.kt
│   │   │   │       │                           ├── exceptions/
│   │   │   │       │                           │   ├── CreateApplicationException.kt
│   │   │   │       │                           │   ├── LoadApkException.kt
│   │   │   │       │                           │   ├── LoadPluginException.kt
│   │   │   │       │                           │   └── ParsePluginApkException.kt
│   │   │   │       │                           ├── infos/
│   │   │   │       │                           │   ├── ContainerProviderInfo.kt
│   │   │   │       │                           │   └── PluginParts.kt
│   │   │   │       │                           └── managers/
│   │   │   │       │                               ├── ComponentManager.kt
│   │   │   │       │                               ├── PluginContentProviderManager.kt
│   │   │   │       │                               ├── PluginPackageManagerImpl.kt
│   │   │   │       │                               └── PluginServiceManager.kt
│   │   │   │       └── test/
│   │   │   │           └── kotlin/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── core/
│   │   │   │                               └── loader/
│   │   │   │                                   └── classloaders/
│   │   │   │                                       └── PluginClassLoaderTest.kt
│   │   │   ├── manager/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       ├── main/
│   │   │   │       │   └── java/
│   │   │   │       │       └── com/
│   │   │   │       │           └── tencent/
│   │   │   │       │               └── shadow/
│   │   │   │       │                   └── core/
│   │   │   │       │                       └── manager/
│   │   │   │       │                           ├── BasePluginManager.java
│   │   │   │       │                           └── installplugin/
│   │   │   │       │                               ├── AppCacheFolderManager.java
│   │   │   │       │                               ├── CopySoBloc.java
│   │   │   │       │                               ├── InstallPluginException.java
│   │   │   │       │                               ├── InstalledDao.java
│   │   │   │       │                               ├── InstalledPlugin.java
│   │   │   │       │                               ├── InstalledPluginDBHelper.java
│   │   │   │       │                               ├── InstalledRow.java
│   │   │   │       │                               ├── InstalledType.java
│   │   │   │       │                               ├── MinFileUtils.java
│   │   │   │       │                               ├── ODexBloc.java
│   │   │   │       │                               ├── PluginConfig.java
│   │   │   │       │                               ├── SafeZipFile.java
│   │   │   │       │                               └── UnpackManager.java
│   │   │   │       └── test/
│   │   │   │           └── java/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── core/
│   │   │   │                               └── manager/
│   │   │   │                                   └── installplugin/
│   │   │   │                                       └── SafeZipFileTest.java
│   │   │   ├── manager-db-test/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       ├── androidTest/
│   │   │   │       │   ├── java/
│   │   │   │       │   │   ├── com/
│   │   │   │       │   │   │   └── tencent/
│   │   │   │       │   │   │       └── shadow/
│   │   │   │       │   │   │           └── core/
│   │   │   │       │   │   │               ├── manager/
│   │   │   │       │   │   │               │   └── installplugin/
│   │   │   │       │   │   │               │       └── DbCompatibilityTest.java
│   │   │   │       │   │   │               └── pluginmanager/
│   │   │   │       │   │   │                   └── CustomAndroidJUnitRunner.java
│   │   │   │       │   │   └── common/
│   │   │   │       │   │       └── AndroidLogLoggerFactory.java
│   │   │   │       │   └── res/
│   │   │   │       │       └── raw/
│   │   │   │       │           ├── expect_sql_version1.sql
│   │   │   │       │           ├── expect_sql_version2.sql
│   │   │   │       │           ├── expect_sql_version3.sql
│   │   │   │       │           ├── expect_sql_version4.sql
│   │   │   │       │           ├── init_sql_version1.sql
│   │   │   │       │           ├── init_sql_version2.sql
│   │   │   │       │           ├── init_sql_version3.sql
│   │   │   │       │           ├── init_sql_version4.sql
│   │   │   │       │           └── plugin1.json
│   │   │   │       └── main/
│   │   │   │           └── AndroidManifest.xml
│   │   │   ├── manifest-parser/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       ├── main/
│   │   │   │       │   └── kotlin/
│   │   │   │       │       └── com/
│   │   │   │       │           └── tencent/
│   │   │   │       │               └── shadow/
│   │   │   │       │                   └── core/
│   │   │   │       │                       └── manifest_parser/
│   │   │   │       │                           ├── AndroidManifestKeys.kt
│   │   │   │       │                           ├── AndroidManifestReader.kt
│   │   │   │       │                           ├── ManifestParser.kt
│   │   │   │       │                           └── PluginManifestGenerator.kt
│   │   │   │       └── test/
│   │   │   │           ├── kotlin/
│   │   │   │           │   └── com/
│   │   │   │           │       └── tencent/
│   │   │   │           │           └── shadow/
│   │   │   │           │               └── core/
│   │   │   │           │                   └── manifest_parser/
│   │   │   │           │                       ├── AndroidManifestReaderTest.kt
│   │   │   │           │                       └── PluginManifestGeneratorTest.kt
│   │   │   │           └── resources/
│   │   │   │               ├── case_as_little_as_possible.xml
│   │   │   │               ├── noAppComponentFactory.xml
│   │   │   │               └── sample-app.xml
│   │   │   ├── runtime/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           └── java/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── core/
│   │   │   │                               └── runtime/
│   │   │   │                                   ├── ActivityOptionsSupport.java
│   │   │   │                                   ├── FixedContextLayoutInflater.java
│   │   │   │                                   ├── PackageManagerInvokeRedirect.java
│   │   │   │                                   ├── PluginActivity.java
│   │   │   │                                   ├── PluginManifest.java
│   │   │   │                                   ├── PluginPackageManager.java
│   │   │   │                                   ├── PluginPartInfo.java
│   │   │   │                                   ├── PluginPartInfoManager.java
│   │   │   │                                   ├── ResolverHook.java
│   │   │   │                                   ├── ShadowActivity.java
│   │   │   │                                   ├── ShadowActivityLifecycleCallbacks.java
│   │   │   │                                   ├── ShadowAppComponentFactory.java
│   │   │   │                                   ├── ShadowApplication.java
│   │   │   │                                   ├── ShadowContext.java
│   │   │   │                                   ├── ShadowDialogSupport.java
│   │   │   │                                   ├── ShadowFactory2.java
│   │   │   │                                   ├── ShadowFragmentSupport.java
│   │   │   │                                   ├── ShadowInstrumentation.java
│   │   │   │                                   ├── ShadowIntentService.java
│   │   │   │                                   ├── ShadowLayoutInflater.java
│   │   │   │                                   ├── ShadowNativeActivity.java
│   │   │   │                                   ├── ShadowPackageItemInfo.java
│   │   │   │                                   ├── ShadowPendingIntent.java
│   │   │   │                                   ├── ShadowService.java
│   │   │   │                                   ├── ShadowWebView.java
│   │   │   │                                   ├── ShadowWebViewLayoutInflater.java
│   │   │   │                                   ├── SubDirContextThemeWrapper.java
│   │   │   │                                   ├── UriConverter.java
│   │   │   │                                   ├── XmlPullParserUtil.java
│   │   │   │                                   └── package-info.java
│   │   │   ├── settings.gradle
│   │   │   ├── transform/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       ├── main/
│   │   │   │       │   └── kotlin/
│   │   │   │       │       └── com/
│   │   │   │       │           └── tencent/
│   │   │   │       │               └── shadow/
│   │   │   │       │                   └── core/
│   │   │   │       │                       └── transform/
│   │   │   │       │                           ├── DeprecatedTransformWrapper.kt
│   │   │   │       │                           ├── GradleTransformWrapper.kt
│   │   │   │       │                           ├── ShadowTransform.kt
│   │   │   │       │                           ├── TransformManager.kt
│   │   │   │       │                           └── specific/
│   │   │   │       │                               ├── ActivityOptionsSupportTransform.kt
│   │   │   │       │                               ├── ActivityTransform.kt
│   │   │   │       │                               ├── AppComponentFactoryTransform.kt
│   │   │   │       │                               ├── ApplicationTransform.kt
│   │   │   │       │                               ├── ContentProviderTransform.kt
│   │   │   │       │                               ├── DialogSupportTransform.kt
│   │   │   │       │                               ├── FragmentSupportTransform.kt
│   │   │   │       │                               ├── InstrumentationTransform.kt
│   │   │   │       │                               ├── IntentServiceTransform.kt
│   │   │   │       │                               ├── KeepHostContextTransform.kt
│   │   │   │       │                               ├── LayoutInflaterTransform.kt
│   │   │   │       │                               ├── PackageItemInfoTransform.kt
│   │   │   │       │                               ├── PackageManagerTransform.kt
│   │   │   │       │                               ├── PendingIntentTransform.kt
│   │   │   │       │                               ├── ReceiverSupportTransform.kt
│   │   │   │       │                               ├── ServiceTransform.kt
│   │   │   │       │                               ├── SimpleRenameTransform.kt
│   │   │   │       │                               └── WebViewTransform.kt
│   │   │   │       └── test/
│   │   │   │           ├── java/
│   │   │   │           │   ├── android/
│   │   │   │           │   │   ├── app/
│   │   │   │           │   │   │   ├── Activity.java
│   │   │   │           │   │   │   ├── Application.java
│   │   │   │           │   │   │   ├── Fragment.java
│   │   │   │           │   │   │   ├── Instrumentation.java
│   │   │   │           │   │   │   └── Service.java
│   │   │   │           │   │   ├── content/
│   │   │   │           │   │   │   ├── BroadcastReceiver.java
│   │   │   │           │   │   │   ├── ComponentName.java
│   │   │   │           │   │   │   ├── Context.java
│   │   │   │           │   │   │   ├── Intent.java
│   │   │   │           │   │   │   ├── pm/
│   │   │   │           │   │   │   │   ├── ActivityInfo.java
│   │   │   │           │   │   │   │   ├── ApplicationInfo.java
│   │   │   │           │   │   │   │   ├── PackageInfo.java
│   │   │   │           │   │   │   │   ├── PackageItemInfo.java
│   │   │   │           │   │   │   │   ├── PackageManager.java
│   │   │   │           │   │   │   │   ├── ProviderInfo.java
│   │   │   │           │   │   │   │   └── ServiceInfo.java
│   │   │   │           │   │   │   └── res/
│   │   │   │           │   │   │       └── XmlResourceParser.java
│   │   │   │           │   │   ├── os/
│   │   │   │           │   │   │   ├── Bundle.java
│   │   │   │           │   │   │   └── IBinder.java
│   │   │   │           │   │   ├── util/
│   │   │   │           │   │   │   └── AttributeSet.java
│   │   │   │           │   │   └── webkit/
│   │   │   │           │   │       └── WebView.java
│   │   │   │           │   ├── com/
│   │   │   │           │   │   └── tencent/
│   │   │   │           │   │       └── shadow/
│   │   │   │           │   │           └── core/
│   │   │   │           │   │               └── runtime/
│   │   │   │           │   │                   ├── PackageManagerInvokeRedirect.java
│   │   │   │           │   │                   ├── PluginPartInfo.java
│   │   │   │           │   │                   ├── PluginPartInfoManager.java
│   │   │   │           │   │                   ├── ShadowActivity.java
│   │   │   │           │   │                   ├── ShadowApplication.java
│   │   │   │           │   │                   ├── ShadowContext.java
│   │   │   │           │   │                   ├── ShadowFragmentSupport.java
│   │   │   │           │   │                   ├── ShadowInstrumentation.java
│   │   │   │           │   │                   └── ShadowWebView.java
│   │   │   │           │   └── test/
│   │   │   │           │       ├── EggReceiver.java
│   │   │   │           │       ├── TestActivity.java
│   │   │   │           │       ├── TestActivityLifecycleCallbacks.java
│   │   │   │           │       ├── TestApplication.java
│   │   │   │           │       ├── TestInstrumentation.java
│   │   │   │           │       ├── TestPackageManager.java
│   │   │   │           │       ├── TestReceiver.java
│   │   │   │           │       ├── TestService.java
│   │   │   │           │       ├── TestWebView.java
│   │   │   │           │       └── fragment/
│   │   │   │           │           ├── TestFragment.java
│   │   │   │           │           ├── UseGetActivityFragment.java
│   │   │   │           │           ├── UseStartActivityForResultFragment.java
│   │   │   │           │           └── UseStartActivityFragment.java
│   │   │   │           └── kotlin/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── core/
│   │   │   │                               └── transform/
│   │   │   │                                   └── specific/
│   │   │   │                                       ├── ActivityLifecycleCallbacksTransformTest.kt
│   │   │   │                                       ├── ActivityTransformTest.kt
│   │   │   │                                       ├── ApplicationTransformTest.kt
│   │   │   │                                       ├── FragmentSupportTransformTest.kt
│   │   │   │                                       ├── InstrumentationTransformTest.kt
│   │   │   │                                       ├── PackageManagerTransformTest.kt
│   │   │   │                                       ├── ReceiverSupportTransformTest.kt
│   │   │   │                                       ├── ServiceTransformTest.kt
│   │   │   │                                       ├── SimpleRenameTransformTest.kt
│   │   │   │                                       └── WebViewTransformTest.kt
│   │   │   ├── transform-kit/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       ├── main/
│   │   │   │       │   ├── java/
│   │   │   │       │   │   └── javassist/
│   │   │   │       │   │       ├── EnhancedCodeConverter.java
│   │   │   │       │   │       └── convert/
│   │   │   │       │   │           ├── TransformCallExceptSuperCallToStatic.java
│   │   │   │       │   │           └── TransformNewClassFix.java
│   │   │   │       │   └── kotlin/
│   │   │   │       │       └── com/
│   │   │   │       │           └── tencent/
│   │   │   │       │               └── shadow/
│   │   │   │       │                   └── core/
│   │   │   │       │                       └── transform_kit/
│   │   │   │       │                           ├── AbstractTransform.kt
│   │   │   │       │                           ├── AbstractTransformManager.kt
│   │   │   │       │                           ├── AndroidClassPoolBuilder.kt
│   │   │   │       │                           ├── AutoMakeMissingClassPool.kt
│   │   │   │       │                           ├── ClassTransform.kt
│   │   │   │       │                           ├── JavassistTransform.kt
│   │   │   │       │                           ├── OverrideCheck.kt
│   │   │   │       │                           ├── ReplaceClassName.kt
│   │   │   │       │                           ├── SpecificTransform.kt
│   │   │   │       │                           └── TransformStep.kt
│   │   │   │       └── test/
│   │   │   │           ├── java/
│   │   │   │           │   └── test/
│   │   │   │           │       ├── MethodRedirectToStatic.java
│   │   │   │           │       └── override/
│   │   │   │           │           └── Foo.java
│   │   │   │           └── kotlin/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── core/
│   │   │   │                               └── transform_kit/
│   │   │   │                                   ├── AbstractTransformTest.kt
│   │   │   │                                   ├── FilterRefClassesTest.kt
│   │   │   │                                   ├── OverrideCheckTest.kt
│   │   │   │                                   └── RedirectMethodCallToStaticTest.kt
│   │   │   └── utils/
│   │   │       ├── .gitignore
│   │   │       ├── build.gradle
│   │   │       └── src/
│   │   │           ├── main/
│   │   │           │   └── java/
│   │   │           │       └── com/
│   │   │           │           └── tencent/
│   │   │           │               └── shadow/
│   │   │           │                   └── core/
│   │   │           │                       └── utils/
│   │   │           │                           └── Md5.java
│   │   │           └── test/
│   │   │               └── java/
│   │   │                   └── com/
│   │   │                       └── tencent/
│   │   │                           └── shadow/
│   │   │                               └── core/
│   │   │                                   └── utils/
│   │   │                                       └── Md5Test.java
│   │   └── dynamic/
│   │       ├── .gitignore
│   │       ├── build.gradle
│   │       ├── dynamic-apk/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   ├── proguard-rules.pro
│   │       │   └── src/
│   │       │       └── main/
│   │       │           └── java/
│   │       │               └── com/
│   │       │                   └── tencent/
│   │       │                       └── shadow/
│   │       │                           └── dynamic/
│   │       │                               └── apk/
│   │       │                                   ├── ApkClassLoader.java
│   │       │                                   ├── ChangeApkContextWrapper.java
│   │       │                                   └── ImplLoader.java
│   │       ├── dynamic-host/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   ├── proguard-rules.pro
│   │       │   └── src/
│   │       │       └── main/
│   │       │           └── java/
│   │       │               └── com/
│   │       │                   └── tencent/
│   │       │                       └── shadow/
│   │       │                           └── dynamic/
│   │       │                               └── host/
│   │       │                                   ├── BasePluginProcessService.java
│   │       │                                   ├── BinderUuidManager.java
│   │       │                                   ├── DynamicPluginManager.java
│   │       │                                   ├── DynamicRuntime.java
│   │       │                                   ├── EnterCallback.java
│   │       │                                   ├── FailedException.java
│   │       │                                   ├── LoaderFactory.java
│   │       │                                   ├── LoaderImplLoader.java
│   │       │                                   ├── ManagerFactory.java
│   │       │                                   ├── ManagerImplLoader.java
│   │       │                                   ├── NotFoundException.java
│   │       │                                   ├── PluginLoaderImpl.java
│   │       │                                   ├── PluginManager.java
│   │       │                                   ├── PluginManagerImpl.java
│   │       │                                   ├── PluginManagerUpdater.java
│   │       │                                   ├── PluginProcessService.java
│   │       │                                   ├── PpsBinder.java
│   │       │                                   ├── PpsController.java
│   │       │                                   ├── PpsStatus.java
│   │       │                                   └── UuidManager.java
│   │       ├── dynamic-host-multi-loader-ext/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   ├── proguard-rules.pro
│   │       │   └── src/
│   │       │       └── main/
│   │       │           └── java/
│   │       │               └── com/
│   │       │                   └── tencent/
│   │       │                       └── shadow/
│   │       │                           └── dynamic/
│   │       │                               └── host/
│   │       │                                   ├── MultiDynamicContainer.java
│   │       │                                   ├── MultiLoaderPluginProcessService.java
│   │       │                                   ├── MultiLoaderPpsBinder.java
│   │       │                                   └── MultiLoaderPpsController.java
│   │       ├── dynamic-loader/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   └── src/
│   │       │       └── main/
│   │       │           └── java/
│   │       │               └── com/
│   │       │                   └── tencent/
│   │       │                       └── shadow/
│   │       │                           └── dynamic/
│   │       │                               └── loader/
│   │       │                                   ├── PluginLoader.java
│   │       │                                   └── PluginServiceConnection.java
│   │       ├── dynamic-loader-impl/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   └── src/
│   │       │       └── main/
│   │       │           └── kotlin/
│   │       │               └── com/
│   │       │                   └── tencent/
│   │       │                       └── shadow/
│   │       │                           └── dynamic/
│   │       │                               ├── impl/
│   │       │                               │   └── LoaderFactoryImpl.kt
│   │       │                               └── loader/
│   │       │                                   └── impl/
│   │       │                                       ├── BinderPluginServiceConnection.kt
│   │       │                                       ├── CoreLoaderFactory.kt
│   │       │                                       ├── DynamicPluginLoader.kt
│   │       │                                       ├── LoaderFactoryImpl.kt
│   │       │                                       └── PluginLoaderBinder.kt
│   │       ├── dynamic-manager/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   ├── proguard-rules.pro
│   │       │   └── src/
│   │       │       └── main/
│   │       │           └── java/
│   │       │               └── com/
│   │       │                   └── tencent/
│   │       │                       └── shadow/
│   │       │                           └── dynamic/
│   │       │                               └── manager/
│   │       │                                   ├── BaseDynamicPluginManager.java
│   │       │                                   ├── BinderPluginLoader.java
│   │       │                                   ├── PluginManagerThatUseDynamicLoader.java
│   │       │                                   ├── PluginServiceConnectionBinder.java
│   │       │                                   ├── UuidManagerBinder.java
│   │       │                                   └── UuidManagerImpl.java
│   │       ├── dynamic-manager-multi-loader-ext/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   ├── proguard-rules.pro
│   │       │   └── src/
│   │       │       └── main/
│   │       │           └── java/
│   │       │               └── com/
│   │       │                   └── tencent/
│   │       │                       └── shadow/
│   │       │                           └── dynamic/
│   │       │                               └── manager/
│   │       │                                   └── PluginManagerThatSupportMultiLoader.java
│   │       ├── gradle/
│   │       │   └── wrapper/
│   │       │       ├── gradle-wrapper.jar
│   │       │       └── gradle-wrapper.properties
│   │       ├── gradle.properties
│   │       ├── gradlew
│   │       ├── gradlew.bat
│   │       └── settings.gradle
│   └── test/
│       ├── common-jar-settings-test/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   └── src/
│       │       └── main/
│       │           └── java/
│       │               └── Test.java
│       ├── dynamic/
│       │   ├── host/
│       │   │   └── test-dynamic-host/
│       │   │       ├── .gitignore
│       │   │       ├── build.gradle
│       │   │       ├── proguard-rules.pro
│       │   │       └── src/
│       │   │           ├── androidTest/
│       │   │           │   ├── AndroidManifest.xml
│       │   │           │   └── java/
│       │   │           │       └── com/
│       │   │           │           ├── google/
│       │   │           │           │   └── devtools/
│       │   │           │           │       └── build/
│       │   │           │           │           └── android/
│       │   │           │           │               └── desugar/
│       │   │           │           │                   └── runtime/
│       │   │           │           │                       └── ThrowableExtension.java
│       │   │           │           └── tencent/
│       │   │           │               └── shadow/
│       │   │           │                   └── test/
│       │   │           │                       ├── CreateResourceTest.java
│       │   │           │                       ├── CustomAndroidJUnitRunner.java
│       │   │           │                       ├── PluginTest.java
│       │   │           │                       ├── cases/
│       │   │           │                       │   ├── plugin_androidx/
│       │   │           │                       │   │   ├── AppCompatActivityTest.java
│       │   │           │                       │   │   ├── ComponentFactoryTest.java
│       │   │           │                       │   │   ├── LiveDataWithActivityTest.java
│       │   │           │                       │   │   └── PluginAndroidxAppTest.java
│       │   │           │                       │   ├── plugin_main/
│       │   │           │                       │   │   ├── ActivityContextSubDirTest.java
│       │   │           │                       │   │   ├── ActivityLifecycleCallbacksTest.java
│       │   │           │                       │   │   ├── ActivityReCreateTest.java
│       │   │           │                       │   │   ├── ActivityWindowSoftModeTest.java
│       │   │           │                       │   │   ├── ApplicationContextInActivityTest.java
│       │   │           │                       │   │   ├── ApplicationContextSubDirTest.java
│       │   │           │                       │   │   ├── ApplicationTest.java
│       │   │           │                       │   │   ├── BasicTest.java
│       │   │           │                       │   │   ├── BootClassloaderTest.java
│       │   │           │                       │   │   ├── ContextGetPackageCodePathTest.java
│       │   │           │                       │   │   ├── GetCallingActivityTest.java
│       │   │           │                       │   │   ├── HostInterfaceTest.java
│       │   │           │                       │   │   ├── InstrumentationTest.java
│       │   │           │                       │   │   ├── LayoutInflaterTest.java
│       │   │           │                       │   │   ├── NullRefInXmlTest.java
│       │   │           │                       │   │   ├── PackageManagerTest.java
│       │   │           │                       │   │   ├── PluginBroadcastReceiverTest.java
│       │   │           │                       │   │   ├── PluginMainAppTest.java
│       │   │           │                       │   │   ├── PluginServiceTest.java
│       │   │           │                       │   │   ├── RegisterNullReceiverTest.java
│       │   │           │                       │   │   ├── ReinstallPluginTest.java
│       │   │           │                       │   │   ├── ServiceContextSubDirTest.java
│       │   │           │                       │   │   ├── SubDirContextThemeWrapperTest.java
│       │   │           │                       │   │   ├── TargetFragmentTest.java
│       │   │           │                       │   │   ├── ThemeTest.java
│       │   │           │                       │   │   ├── ViewIdTest.java
│       │   │           │                       │   │   ├── application_info/
│       │   │           │                       │   │   │   ├── ApplicationInfoTest.java
│       │   │           │                       │   │   │   ├── CommonApplicationInfoTest.java
│       │   │           │                       │   │   │   ├── ContextGetApplicationInfoTest.java
│       │   │           │                       │   │   │   ├── PackageManagerGetOtherInstalledApplicationInfoTest.java
│       │   │           │                       │   │   │   └── PackageManagerGetSelfApplicationInfoTest.java
│       │   │           │                       │   │   ├── dialog_support/
│       │   │           │                       │   │   │   ├── AlertDialogOwnerActivityTest.java
│       │   │           │                       │   │   │   └── DialogOwnerActivityTest.java
│       │   │           │                       │   │   └── fragment_support/
│       │   │           │                       │   │       ├── CommonFragmentSupportTest.java
│       │   │           │                       │   │       ├── FragmentSupportTest.java
│       │   │           │                       │   │       ├── ProgrammaticallyAddBaseFragmentTest.java
│       │   │           │                       │   │       ├── ProgrammaticallyAddDialogFragmentTest.java
│       │   │           │                       │   │       ├── ProgrammaticallyAddFragmentTest.java
│       │   │           │                       │   │       ├── ProgrammaticallyAddNormalFragmentTest.java
│       │   │           │                       │   │       ├── ProgrammaticallyAddOnlyOverrideOnAttachActivityFragmentTest.java
│       │   │           │                       │   │       ├── ProgrammaticallyAddOnlyOverrideOnAttachContextFragmentTest.java
│       │   │           │                       │   │       ├── ProgrammaticallyAddSubFragmentTest.java
│       │   │           │                       │   │       ├── XmlAddBaseFragmentTest.java
│       │   │           │                       │   │       ├── XmlAddFragmentTest.java
│       │   │           │                       │   │       ├── XmlAddNormalFragmentTest.java
│       │   │           │                       │   │       └── XmlAddSubFragmentTest.java
│       │   │           │                       │   └── plugin_service/
│       │   │           │                       │       ├── PluginIntentServiceConnectionTest.java
│       │   │           │                       │       ├── PluginServiceAppTest.java
│       │   │           │                       │       └── PluginServiceConnectionTest.java
│       │   │           │                       └── repeat/
│       │   │           │                           ├── Repeat.java
│       │   │           │                           └── RepeatRule.java
│       │   │           └── main/
│       │   │               ├── AndroidManifest.xml
│       │   │               ├── java/
│       │   │               │   └── com/
│       │   │               │       └── tencent/
│       │   │               │           └── shadow/
│       │   │               │               └── test/
│       │   │               │                   └── dynamic/
│       │   │               │                       └── host/
│       │   │               │                           ├── AndroidLogLoggerFactory.java
│       │   │               │                           ├── BindPluginServiceActivity.java
│       │   │               │                           ├── HostApplication.java
│       │   │               │                           ├── JumpToPluginActivity.java
│       │   │               │                           ├── MainActivity.java
│       │   │               │                           ├── PluginHelper.java
│       │   │               │                           ├── PluginLoadActivity.java
│       │   │               │                           ├── PluginProcessPPS.java
│       │   │               │                           ├── PluginServiceProcessPPS.java
│       │   │               │                           ├── SimpleIdlingResourceImpl.java
│       │   │               │                           └── manager/
│       │   │               │                               ├── FixedPathPmUpdater.java
│       │   │               │                               └── Shadow.java
│       │   │               └── res/
│       │   │                   ├── layout/
│       │   │                   │   ├── activity_jump_to_plugin.xml
│       │   │                   │   ├── activity_load.xml
│       │   │                   │   └── part_key_adapter.xml
│       │   │                   └── values/
│       │   │                       ├── strings.xml
│       │   │                       └── themes.xml
│       │   ├── manager/
│       │   │   └── test-dynamic-manager/
│       │   │       ├── .gitignore
│       │   │       ├── build.gradle
│       │   │       ├── proguard-rules.pro
│       │   │       └── src/
│       │   │           └── main/
│       │   │               ├── AndroidManifest.xml
│       │   │               ├── java/
│       │   │               │   └── com/
│       │   │               │       └── tencent/
│       │   │               │           └── shadow/
│       │   │               │               ├── dynamic/
│       │   │               │               │   └── impl/
│       │   │               │               │       ├── ManagerFactoryImpl.java
│       │   │               │               │       └── WhiteList.java
│       │   │               │               └── test/
│       │   │               │                   ├── UiUtil.java
│       │   │               │                   ├── cases/
│       │   │               │                   │   ├── PluginIntentServiceConnectionTestCase.java
│       │   │               │                   │   └── PluginServiceConnectionTestCase.java
│       │   │               │                   └── dynamic/
│       │   │               │                       └── manager/
│       │   │               │                           ├── ActivityTestDynamicPluginManager.java
│       │   │               │                           ├── FastPluginManager.java
│       │   │               │                           ├── ReinstallPluginTestDynamicPluginManager.java
│       │   │               │                           ├── ServiceTestDynamicPluginManager.java
│       │   │               │                           └── TestDynamicPluginManager.java
│       │   │               └── res/
│       │   │                   └── layout/
│       │   │                       └── activity_load_plugin.xml
│       │   └── plugin/
│       │       ├── test-dynamic-loader/
│       │       │   ├── .gitignore
│       │       │   ├── build.gradle
│       │       │   ├── proguard-rules.pro
│       │       │   └── src/
│       │       │       └── main/
│       │       │           ├── AndroidManifest.xml
│       │       │           └── java/
│       │       │               └── com/
│       │       │                   └── tencent/
│       │       │                       └── shadow/
│       │       │                           ├── dynamic/
│       │       │                           │   └── loader/
│       │       │                           │       └── impl/
│       │       │                           │           └── CoreLoaderFactoryImpl.java
│       │       │                           └── test/
│       │       │                               └── dynamic/
│       │       │                                   └── loader/
│       │       │                                       ├── TestComponentManager.java
│       │       │                                       └── TestPluginLoader.java
│       │       └── test-dynamic-runtime/
│       │           ├── .gitignore
│       │           ├── build.gradle
│       │           ├── proguard-rules.pro
│       │           └── src/
│       │               └── main/
│       │                   ├── AndroidManifest.xml
│       │                   └── java/
│       │                       └── com/
│       │                           └── tencent/
│       │                               └── shadow/
│       │                                   └── test/
│       │                                       └── dynamic/
│       │                                           └── runtime/
│       │                                               └── container/
│       │                                                   ├── PluginDefaultProxyActivity.java
│       │                                                   ├── PluginSingleInstance1ProxyActivity.java
│       │                                                   └── PluginSingleTask1ProxyActivity.java
│       ├── gradle-plugin-agp-compat-test/
│       │   ├── .gitignore
│       │   ├── README.md
│       │   ├── build.gradle
│       │   ├── gradle/
│       │   │   └── wrapper/
│       │   │       ├── gradle-wrapper.jar
│       │   │       └── gradle-wrapper.properties
│       │   ├── gradle.properties
│       │   ├── gradlew
│       │   ├── gradlew.bat
│       │   ├── settings.gradle
│       │   ├── stub-project/
│       │   │   ├── .gitignore
│       │   │   ├── build.gradle
│       │   │   ├── proguard-rules.pro
│       │   │   ├── settings.gradle
│       │   │   └── src/
│       │   │       └── main/
│       │   │           ├── AndroidManifest.xml
│       │   │           ├── java/
│       │   │           │   └── PluginManifestIncludeTest.java
│       │   │           └── res/
│       │   │               └── values/
│       │   │                   └── themes.xml
│       │   ├── test_JDK11.sh
│       │   ├── test_JDK17.sh
│       │   ├── test_clean.sh
│       │   └── test_prepare.sh
│       ├── lib/
│       │   ├── constant/
│       │   │   ├── .gitignore
│       │   │   ├── build.gradle
│       │   │   ├── proguard-rules.pro
│       │   │   └── src/
│       │   │       └── main/
│       │   │           ├── AndroidManifest.xml
│       │   │           └── java/
│       │   │               └── com/
│       │   │                   └── tencent/
│       │   │                       └── shadow/
│       │   │                           └── test/
│       │   │                               └── lib/
│       │   │                                   └── constant/
│       │   │                                       └── Constant.java
│       │   ├── custom-view/
│       │   │   ├── .gitignore
│       │   │   ├── build.gradle
│       │   │   ├── proguard-rules.pro
│       │   │   └── src/
│       │   │       └── main/
│       │   │           ├── AndroidManifest.xml
│       │   │           └── java/
│       │   │               └── com/
│       │   │                   └── tencent/
│       │   │                       └── shadow/
│       │   │                           └── test/
│       │   │                               └── lib/
│       │   │                                   └── custom_view/
│       │   │                                       └── TestViewConstructorCacheView.java
│       │   ├── plugin-use-host-code-lib/
│       │   │   ├── .gitignore
│       │   │   ├── build.gradle
│       │   │   └── src/
│       │   │       └── main/
│       │   │           └── java/
│       │   │               └── com/
│       │   │                   └── tencent/
│       │   │                       └── shadow/
│       │   │                           └── test/
│       │   │                               └── lib/
│       │   │                                   └── plugin_use_host_code_lib/
│       │   │                                       ├── interfaces/
│       │   │                                       │   ├── HostTestInterface.java
│       │   │                                       │   └── subpackage/
│       │   │                                       │       └── Foo.java
│       │   │                                       └── other/
│       │   │                                           └── HostOtherInterface.java
│       │   └── test-manager/
│       │       ├── .gitignore
│       │       ├── build.gradle
│       │       └── src/
│       │           └── main/
│       │               └── java/
│       │                   └── com/
│       │                       └── tencent/
│       │                           └── shadow/
│       │                               └── test/
│       │                                   └── lib/
│       │                                       └── test_manager/
│       │                                           ├── SimpleIdlingResource.java
│       │                                           └── TestManager.java
│       ├── none-dynamic/
│       │   └── host/
│       │       └── test-none-dynamic-host/
│       │           ├── .gitignore
│       │           ├── build.gradle
│       │           ├── proguard-rules.pro
│       │           └── src/
│       │               └── main/
│       │                   ├── AndroidManifest.xml
│       │                   ├── java/
│       │                   │   └── com/
│       │                   │       └── tencent/
│       │                   │           └── shadow/
│       │                   │               └── test/
│       │                   │                   └── none_dynamic/
│       │                   │                       └── host/
│       │                   │                           ├── DefaultContainerActivity.java
│       │                   │                           ├── HostApplication.java
│       │                   │                           ├── MainActivity.java
│       │                   │                           ├── PreparePluginApkBloc.java
│       │                   │                           ├── SLoggerFactory.java
│       │                   │                           ├── SingleTaskContainerActivity.java
│       │                   │                           ├── TestComponentManager.java
│       │                   │                           ├── TestLoadingActivity.java
│       │                   │                           └── TestPluginLoader.java
│       │                   └── res/
│       │                       ├── layout/
│       │                       │   ├── activity_main.xml
│       │                       │   └── qq_nearby_now_loading.xml
│       │                       └── values/
│       │                           ├── strings.xml
│       │                           └── themes.xml
│       └── plugin/
│           ├── androidx-cases/
│           │   └── test-plugin-androidx-cases/
│           │       ├── .gitignore
│           │       ├── build.gradle
│           │       ├── proguard-rules.pro
│           │       └── src/
│           │           └── main/
│           │               ├── AndroidManifest.xml
│           │               └── java/
│           │                   └── com/
│           │                       └── tencent/
│           │                           └── shadow/
│           │                               └── test/
│           │                                   └── plugin/
│           │                                       └── androidx_cases/
│           │                                           └── lib/
│           │                                               ├── AppCompatTestActivity.java
│           │                                               ├── AppComponentFactoryTestActivity.java
│           │                                               ├── LiveDataWithActivityTestActivity.java
│           │                                               ├── TestComponentFactory.java
│           │                                               └── UiUtil.java
│           ├── general-cases/
│           │   └── test-plugin-general-cases/
│           │       ├── .gitignore
│           │       ├── build.gradle
│           │       ├── proguard-rules.pro
│           │       └── src/
│           │           ├── androidTest/
│           │           │   └── java/
│           │           │       └── com/
│           │           │           └── tencent/
│           │           │               └── shadow/
│           │           │                   └── test/
│           │           │                       └── plugin/
│           │           │                           └── general_cases/
│           │           │                               └── app/
│           │           │                                   ├── ActivityLifecycleCallbacksTest.java
│           │           │                                   ├── CustomAndroidJUnitRunner.java
│           │           │                                   ├── NormalAppTest.java
│           │           │                                   └── PackageManagerTest.java
│           │           └── main/
│           │               ├── AndroidManifest.xml
│           │               ├── java/
│           │               │   ├── com/
│           │               │   │   └── tencent/
│           │               │   │       └── shadow/
│           │               │   │           └── test/
│           │               │   │               └── plugin/
│           │               │   │                   └── general_cases/
│           │               │   │                       └── lib/
│           │               │   │                           ├── gallery/
│           │               │   │                           │   ├── TestApplication.java
│           │               │   │                           │   └── util/
│           │               │   │                           │       ├── ToastUtil.java
│           │               │   │                           │       └── UiUtil.java
│           │               │   │                           └── usecases/
│           │               │   │                               ├── SimpleIdlingResource.java
│           │               │   │                               ├── WithIdlingResourceActivity.java
│           │               │   │                               ├── activity/
│           │               │   │                               │   ├── ApplicationContextActivity.java
│           │               │   │                               │   ├── PrintActivityResultActivity.java
│           │               │   │                               │   ├── TestActivityOnCreate.java
│           │               │   │                               │   ├── TestActivityOrientation.java
│           │               │   │                               │   ├── TestActivityReCreate.java
│           │               │   │                               │   ├── TestActivityReCreateBySystem.java
│           │               │   │                               │   ├── TestActivityWindowSoftMode.java
│           │               │   │                               │   ├── TestCallingActivity.java
│           │               │   │                               │   ├── TestListActivity.java
│           │               │   │                               │   └── WindowSoftModeJumpActivity.java
│           │               │   │                               ├── application/
│           │               │   │                               │   ├── ActivityLifecycleCallbacksTestActivity.java
│           │               │   │                               │   ├── TestApplicationActivity.java
│           │               │   │                               │   └── TestGetApplicationInfoActivity.java
│           │               │   │                               ├── classloader/
│           │               │   │                               │   └── TestBootClassloaderActivity.java
│           │               │   │                               ├── context/
│           │               │   │                               │   ├── ActivityContextSubDirTestActivity.java
│           │               │   │                               │   ├── ApplicationContextSubDirTestActivity.java
│           │               │   │                               │   ├── ContextGetPackageCodePathTestActivity.java
│           │               │   │                               │   ├── RegisterNullReceiverActivity.java
│           │               │   │                               │   ├── ServiceContextSubDirTestActivity.java
│           │               │   │                               │   ├── SubDirContextThemeWrapperTestActivity.java
│           │               │   │                               │   ├── TestLayoutInflaterActivity.java
│           │               │   │                               │   └── TestThemeActivity.java
│           │               │   │                               ├── dialog/
│           │               │   │                               │   ├── TestAlertDialogActivity.java
│           │               │   │                               │   ├── TestDialog.java
│           │               │   │                               │   └── TestDialogActivity.java
│           │               │   │                               ├── fragment/
│           │               │   │                               │   ├── BaseFragment.java
│           │               │   │                               │   ├── FragmentStartedActivity.java
│           │               │   │                               │   ├── OnlyOverrideActivityMethodBaseFragment.java
│           │               │   │                               │   ├── OnlyOverrideContextMethodBaseFragment.java
│           │               │   │                               │   ├── ProgrammaticallyAddFragmentActivity.java
│           │               │   │                               │   ├── SubTestBaseFragment.java
│           │               │   │                               │   ├── TargetFragmentTestActivity.java
│           │               │   │                               │   ├── TestBaseFragment.java
│           │               │   │                               │   ├── TestDialogFragment.java
│           │               │   │                               │   ├── TestFragment.java
│           │               │   │                               │   ├── TestFragmentCommonLogic.java
│           │               │   │                               │   ├── TestNormalFragment.java
│           │               │   │                               │   ├── TestSubFragment.java
│           │               │   │                               │   ├── TestSubOnlyOverrideOnAttachActivityFragment.java
│           │               │   │                               │   ├── TestSubOnlyOverrideOnAttachContextFragment.java
│           │               │   │                               │   └── XmlAddFragmentActivity.java
│           │               │   │                               ├── instrumentation/
│           │               │   │                               │   ├── MyInstrumentation.java
│           │               │   │                               │   └── TestInstrumentationActivity.java
│           │               │   │                               ├── interfaces/
│           │               │   │                               │   └── TestHostInterfaceActivity.java
│           │               │   │                               ├── packagemanager/
│           │               │   │                               │   └── TestPackageManagerActivity.java
│           │               │   │                               ├── provider/
│           │               │   │                               │   ├── TestDBContentProviderActivity.java
│           │               │   │                               │   ├── TestDBHelper.java
│           │               │   │                               │   ├── TestFileProviderActivity.java
│           │               │   │                               │   ├── TestProvider.java
│           │               │   │                               │   └── TestProviderInfo.java
│           │               │   │                               ├── receiver/
│           │               │   │                               │   ├── BroadCastHelper.java
│           │               │   │                               │   ├── MyReceiver.java
│           │               │   │                               │   ├── ReceiverWithoutAction.java
│           │               │   │                               │   └── TestReceiverActivity.java
│           │               │   │                               ├── service/
│           │               │   │                               │   ├── TestService.java
│           │               │   │                               │   └── TestStartServiceActivity.java
│           │               │   │                               └── view/
│           │               │   │                                   ├── TestNullRefInXmlActivity.java
│           │               │   │                                   ├── TestViewConstructorCache.java
│           │               │   │                                   └── TestViewIdActivity.java
│           │               │   └── org/
│           │               │       └── xmlpull/
│           │               │           └── v1/
│           │               │               └── XmlPullParser.java
│           │               └── res/
│           │                   ├── layout/
│           │                   │   ├── activity_list.xml
│           │                   │   ├── activity_test_file_provider.xml
│           │                   │   ├── activity_test_re_create_by_system.xml
│           │                   │   ├── layout_activity_lifecycle.xml
│           │                   │   ├── layout_common.xml
│           │                   │   ├── layout_fragment_activity.xml
│           │                   │   ├── layout_fragment_test.xml
│           │                   │   ├── layout_list_item.xml
│           │                   │   ├── layout_orientation.xml
│           │                   │   ├── layout_packagemanager.xml
│           │                   │   ├── layout_provider_db.xml
│           │                   │   ├── layout_receiver.xml
│           │                   │   ├── layout_recreate.xml
│           │                   │   ├── layout_result.xml
│           │                   │   ├── layout_service.xml
│           │                   │   ├── layout_softmode.xml
│           │                   │   ├── layout_test_null_ref.xml
│           │                   │   ├── layout_test_view_cons_cache.xml
│           │                   │   ├── layout_test_view_id.xml
│           │                   │   ├── layout_xml_add_base_fragment_activity.xml
│           │                   │   ├── layout_xml_add_normal_fragment_activity.xml
│           │                   │   └── layout_xml_add_sub_fragment_activity.xml
│           │                   ├── values/
│           │                   │   ├── strings.xml
│           │                   │   └── themes.xml
│           │                   └── xml/
│           │                       └── filepaths.xml
│           └── particular-cases/
│               └── plugin-service-for-host/
│                   ├── .gitignore
│                   ├── build.gradle
│                   └── src/
│                       └── main/
│                           ├── AndroidManifest.xml
│                           └── java/
│                               └── com/
│                                   └── tencent/
│                                       └── shadow/
│                                           └── test/
│                                               └── plugin/
│                                                   └── particular_cases/
│                                                       └── plugin_service_for_host/
│                                                           ├── SystemExitIntentService.java
│                                                           └── SystemExitService.java
└── settings.gradle

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

================================================
FILE: .commitlintrc.yml
================================================
extends:
  - '@commitlint/config-conventional'
defaultIgnores: false
rules:
  #允许中文
  subject-case: [ 0 ]
  footer-max-line-length: [ 0 ]
  body-max-line-length: [ 0 ]
helpUrl: https://www.conventionalcommits.org/zh-hans/v1.0.0/


================================================
FILE: .github/actions/post-build/action.yml
================================================
name: post-build
description: '清理构建环境'
runs:
  using: "composite"
  steps:
    - name: stop gradle deamon for actions/cache
      shell: bash
      run: ./gradlew --stop


================================================
FILE: .github/actions/pre-build/action.yml
================================================
name: pre-build
description: '准备构建环境'
runs:
  using: "composite"
  steps:
    - name: revert gradle distributionUrl in every gradle-wrapper.properties
      shell: bash
      run: git grep -l 'mirrors.tencent.com/gradle' -- gradle-wrapper.properties '**/gradle-wrapper.properties' | xargs sed -i 's/mirrors.tencent.com\/gradle/services.gradle.org\/distributions/g'
    - name: Inject slug/short variables
      uses: rlespinasse/github-slug-action@v3.x
    - name: revert gradle wrapper mirror setting
      shell: bash
      run: echo "DISABLE_TENCENT_MAVEN_MIRROR=true" >> $GITHUB_ENV
    - name: Add cmdline-tools to PATH
      shell: bash
      run: echo "$ANDROID_HOME/cmdline-tools/latest/bin" >> "$GITHUB_PATH"
    - name: Install specific Android SDK platforms
      shell: bash
      run: sdkmanager "platforms;android-33"
    - uses: actions/setup-java@v4
      with:
        distribution: 'temurin'
        java-version: '17'
        cache: 'gradle'


================================================
FILE: .github/workflows/check-build-test.yml
================================================
name: Check & Build & Test
on:
  workflow_call:
  push:
    branches:
      - master
  pull_request:
    branches: [ master ]

jobs:
  check-commit-message:
    name: 提交日志格式化检查
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: wagoid/commitlint-github-action@v6
        with:
          configFile: ./.commitlintrc.yml
  check-code-format:
    name: 代码格式化检查
    runs-on: ubuntu-22.04
    env:
      AndroidStudioVersion: 2021.1.1.20
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: Cache android-studio
        id: cache-android-studio
        uses: actions/cache@v4
        with:
          path: android-studio
          key: ${{ runner.os }}-android-studio--${{ env.AndroidStudioVersion }}
      - name: download android-studio
        if: steps.cache-android-studio.outputs.cache-hit != 'true'
        run: |
          wget "https://redirector.gvt1.com/edgedl/android/studio/ide-zips/$AndroidStudioVersion/android-studio-$AndroidStudioVersion-linux.tar.gz"
          tar -xvzf "android-studio-$AndroidStudioVersion-linux.tar.gz"
          rm -rf "android-studio-$AndroidStudioVersion-linux.tar.gz"
      - name: use android-studio format all files
        run: ./android-studio/bin/format.sh -s .idea/codeStyles/Project.xml -r -m \*.java,\*.kt,\*.xml .
      - name: show diff for files not formated
        run: |
          if ! git diff --quiet; then
            git diff --exit-code
          fi
  build-sdk:
    needs: [ check-commit-message, check-code-format ]
    name: 构建SDK
    runs-on: ubuntu-22.04
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: pre-build
        uses: ./.github/actions/pre-build
      - name: buildSdk
        run: ./gradlew buildSdk -S
      - name: post-build
        uses: ./.github/actions/post-build
  build-sample-maven:
    needs: [ check-commit-message, check-code-format ]
    name: 构建maven依赖SDK的sample
    runs-on: ubuntu-22.04
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: pre-build
        uses: ./.github/actions/pre-build
      - uses: actions/setup-java@v4
        with:
          distribution: 'temurin'
          java-version: '11'
          cache: 'gradle'
      - name: build sample/maven/host-project
        working-directory: projects/sample/maven/host-project
        run: ./gradlew assemble
      - name: build sample/maven/manager-project
        working-directory: projects/sample/maven/manager-project
        run: ./gradlew assemble
      - name: build sample/maven/plugin-project
        working-directory: projects/sample/maven/plugin-project
        run: ./gradlew assemble
      - name: post-build
        uses: ./.github/actions/post-build
  build-all:
    needs: build-sdk
    name: 构建所有源码
    runs-on: ubuntu-22.04
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: pre-build
        uses: ./.github/actions/pre-build
      - name: buildSdk
        run: ./gradlew build
      - name: post-build
        uses: ./.github/actions/post-build
  test-agp-compatibility:
    needs: build-sdk
    name: AGP兼容性自动化测试
    runs-on: ubuntu-22.04
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: pre-build
        uses: ./.github/actions/pre-build
      - uses: actions/setup-java@v4
        with:
          distribution: 'temurin'
          java-version: '17'
          cache: 'gradle'
      - name: JDK17环境下AGP测试
        working-directory: projects/test/gradle-plugin-agp-compat-test
        run: ./test_JDK17.sh
      - uses: actions/setup-java@v4
        with:
          distribution: 'temurin'
          java-version: '11'
          cache: 'gradle'
      - name: JDK11环境下AGP测试
        working-directory: projects/test/gradle-plugin-agp-compat-test
        run: ./test_JDK11.sh
      - name: post-build
        uses: ./.github/actions/post-build
  test-sdk-jvm:
    needs: build-sdk
    name: 自动化测试-JVM部分
    runs-on: ubuntu-22.04
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: pre-build
        uses: ./.github/actions/pre-build
      - name: jvmTestSdk
        run: ./gradlew jvmTestSdk -S
      - name: post-build
        uses: ./.github/actions/post-build
  test-sdk-avd:
    needs: build-sdk
    name: 自动化测试-AVD部分
    runs-on: ubuntu-22.04
    strategy:
      matrix:
        include:
          - api-level: 16 #16是最低支持的API
            arch: x86
            target: default
          - api-level: 28 #28是项目长期使用的测试API
            arch: x86
            target: default
          - api-level: 34
            arch: x86_64
            target: google_apis
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: pre-build
        uses: ./.github/actions/pre-build
      - name: Enable KVM
        run: |
          echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
          sudo udevadm control --reload-rules
          sudo udevadm trigger --name-match=kvm
      - name: run AVD tests
        uses: reactivecircus/android-emulator-runner@v2
        with:
          api-level: ${{ matrix.api-level }}
          target: ${{ matrix.target }}
          arch: ${{ matrix.arch }}
          profile: pixel_xl
          force-avd-creation: false
          emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
          disable-animations: true
          script: ./gradlew androidTestSdk
      - name: post-build
        uses: ./.github/actions/post-build
  test-sdk-avd-target34:
    needs: build-sdk
    name: 自动化测试-target 34的冒烟测试
    runs-on: ubuntu-22.04
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: pre-build
        uses: ./.github/actions/pre-build
      - name: Enable KVM
        run: |
          echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
          sudo udevadm control --reload-rules
          sudo udevadm trigger --name-match=kvm
      - name: run AVD tests
        uses: reactivecircus/android-emulator-runner@v2
        with:
          api-level: 34
          target: google_apis
          arch: x86_64
          profile: pixel_xl
          force-avd-creation: false
          emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
          disable-animations: true
          script: ./gradlew :test-dynamic-host:connectedTarget34DebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.tencent.shadow.test.cases.plugin_main.ApplicationContextSubDirTest#testGetDatabasePath
      - name: post-build
        uses: ./.github/actions/post-build


================================================
FILE: .github/workflows/release.yml
================================================
name: Publish release

on:
  release:
    types:
      - published #https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#release

jobs:
  publish:
    needs: check-build-test
    runs-on: ubuntu-22.04
    env:
      DISABLE_TENCENT_MAVEN_MIRROR: true
      PUBLISH_RELEASE: true
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: pre-build
        uses: ./.github/actions/pre-build
      - name: publish
        run: ./gradlew publish
      - name: post-build
        uses: ./.github/actions/post-build


================================================
FILE: .gitignore
================================================
*.iml
.gradle
/local.properties
!.idea
.idea/*
!.idea/codeStyles
.DS_Store
/build
/captures
.externalNativeBuild
.gradletasknamecache


================================================
FILE: .idea/codeStyles/Project.xml
================================================
<component name="ProjectCodeStyleConfiguration">
    <code_scheme name="Project" version="173">
        <JetCodeStyleSettings>
            <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
        </JetCodeStyleSettings>
        <codeStyleSettings language="XML">
            <option name="FORCE_REARRANGE_MODE" value="1" />
            <indentOptions>
                <option name="CONTINUATION_INDENT_SIZE" value="4" />
            </indentOptions>
            <arrangement>
                <rules>
                    <section>
                        <rule>
                            <match>
                                <AND>
                                    <NAME>xmlns:android</NAME>
                                    <XML_ATTRIBUTE />
                                    <XML_NAMESPACE>^$</XML_NAMESPACE>
                                </AND>
                            </match>
                        </rule>
                    </section>
                    <section>
                        <rule>
                            <match>
                                <AND>
                                    <NAME>xmlns:.*</NAME>
                                    <XML_ATTRIBUTE />
                                    <XML_NAMESPACE>^$</XML_NAMESPACE>
                                </AND>
                            </match>
                            <order>BY_NAME</order>
                        </rule>
                    </section>
                    <section>
                        <rule>
                            <match>
                                <AND>
                                    <NAME>.*:id</NAME>
                                    <XML_ATTRIBUTE />
                                    <XML_NAMESPACE>http://schemas.android.com/apk/res/android
                                    </XML_NAMESPACE>
                                </AND>
                            </match>
                        </rule>
                    </section>
                    <section>
                        <rule>
                            <match>
                                <AND>
                                    <NAME>.*:name</NAME>
                                    <XML_ATTRIBUTE />
                                    <XML_NAMESPACE>http://schemas.android.com/apk/res/android
                                    </XML_NAMESPACE>
                                </AND>
                            </match>
                        </rule>
                    </section>
                    <section>
                        <rule>
                            <match>
                                <AND>
                                    <NAME>name</NAME>
                                    <XML_ATTRIBUTE />
                                    <XML_NAMESPACE>^$</XML_NAMESPACE>
                                </AND>
                            </match>
                        </rule>
                    </section>
                    <section>
                        <rule>
                            <match>
                                <AND>
                                    <NAME>style</NAME>
                                    <XML_ATTRIBUTE />
                                    <XML_NAMESPACE>^$</XML_NAMESPACE>
                                </AND>
                            </match>
                        </rule>
                    </section>
                    <section>
                        <rule>
                            <match>
                                <AND>
                                    <NAME>.*</NAME>
                                    <XML_ATTRIBUTE />
                                    <XML_NAMESPACE>^$</XML_NAMESPACE>
                                </AND>
                            </match>
                            <order>BY_NAME</order>
                        </rule>
                    </section>
                    <section>
                        <rule>
                            <match>
                                <AND>
                                    <NAME>.*</NAME>
                                    <XML_ATTRIBUTE />
                                    <XML_NAMESPACE>http://schemas.android.com/apk/res/android
                                    </XML_NAMESPACE>
                                </AND>
                            </match>
                            <order>ANDROID_ATTRIBUTE_ORDER</order>
                        </rule>
                    </section>
                    <section>
                        <rule>
                            <match>
                                <AND>
                                    <NAME>.*</NAME>
                                    <XML_ATTRIBUTE />
                                    <XML_NAMESPACE>.*</XML_NAMESPACE>
                                </AND>
                            </match>
                            <order>BY_NAME</order>
                        </rule>
                    </section>
                </rules>
            </arrangement>
        </codeStyleSettings>
        <codeStyleSettings language="kotlin">
            <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
        </codeStyleSettings>
    </code_scheme>
</component>

================================================
FILE: .idea/codeStyles/codeStyleConfig.xml
================================================
<component name="ProjectCodeStyleConfiguration">
    <state>
        <option name="USE_PER_PROJECT_SETTINGS" value="true" />
    </state>
</component>

================================================
FILE: CONTRIBUTING.md
================================================
# Contributing
我们非常欢迎您向Tencent Shadow提交Issue或Pull Request。

# Issue
在Tencent Shadow开源的初期,我们会密切关注所有Issue反馈。晚些时候再根据反馈的情况制定Issue模板。

反馈问题时,请Fork Shadow的代码库到自己的名下。新建分支,添加可以复现问题的最小改动,提交后push到Github上。然后在Issue单中附上你的代码库地址和分支名即可。

```sh
git clone https://github.com/Tencent/Shadow.git //大概之前你已经这样clone过Shadow的代码库了
cd shadow //切换到你clone的shadow目录
git remote add your_name https://github.com/<your_name>/Shadow.git //把你fork的版本库添加成一个远端
git fetch --all //更新所有远端的代码
git checkout -b new_branch_name origin/dev // 基于Shadow代码库的dev分支新建一个分支
//加上你复现问题的修改
git commit
git push -u your_name  //推送new_branch_name分支到你fork的版本库
```
然后你的分支地址应该类似:`https://github.com/<your_name>/Shadow/tree/new_branch_name`

其他人可以用这样的命令获取到你的分支,看到你的提交做了哪些改动,运行并Debug。
```sh
cd shadow //切换到shadow目录
git fetch https://github.com/<your_name>/Shadow.git new_branch_name
git checkout -b new_branch_name FETCH_HEAD
```

# Pull Request
由于PR会修改代码,因此即便是在开源初期,我们也会对PR谨慎处理。

请注意以下问题:

1. 不要提交无意义改动。
1. 除非是提交复现问题的测试用例,请确保`gradlew testSdk`构建成功(需要连接Android设备)
1. 测试机需要至少有API 28,API 19两种机器,以保证ART和Dalvik虚拟机都能正常工作。
1. 尽量原子化的提交,配有较为清晰的提交信息。

我们会根据大家的PR再调整PR的要求的。

# 开发指引

## Debug编译期代码(Gradle插件、Transform等)

Shadow的`coding`和`core.gradle-plugin`、`core.manifest-parser`、`core.transform`,`core.transform-kit`
等模块都是在插件工程的编译期执行的。如果需要Debug它们,需要额外的配置。

1. 添加`Remote JVM Debug` Configuration。在Android Studio的`Run`菜单中找到`Edit Configuration`。 点"+"(Add New
   Configuration),选择`Remote JVM Debug`,配置参数一般采用默认值不用修改。
   `Name`可以任意修改成方便识别的名字,稍后在工具栏执行时选择。 复制`Command line arguments for remote JVM`。
   一般的默认值是:`-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005`。
   将这行复制到`gradle.properties`中的`org.gradle.jvmargs=-Xmx4096m`后面作为更多的参数,注意加上空格。 然后将其中的`suspend=n`
   改为`suspend=y`,表示让JVM启动Gradle时等待Debugger连接,再继续执行。

2. 终止正在运行的Gradle Daemon。在命令行执行`./gradlew --stop`,终止掉没有采用新参数的JVM进程。

3. Debug编译期代码。通过`./gradlew`或者Android Studio的Gradle sync,或运行`sample-host`等任务, 都会在一启动时因为前面的`suspend=y`
   卡住。这时再选择刚刚添加的`Remote JVM Debug` Configuration, 点击`Debug`执行按钮,即可连接上Gradle JVM。如果在`ShadowPlugin`
   或者某个Transform代码中设置了断点, 就会正常在断点处暂停。 注意选择`Remote JVM Debug` Configuration的位置同选择`sample-host`
   等模块在同一个菜单中。 并且Android Studio可以同时执行多个Configuration,先运行`sample-host`, 再Debug `Remote JVM Debug`
   Configuration是没有问题的。

4. 在其他不是Shadow源码工程中,也可以同样设置`gradle.properties`参数,在其中执行Gradle任务。
   然后切换到Shadow源码工程中执行Debug `Remote JVM Debug` Configuration, 也可以Debug Shadow在其他工程中的编译期代码执行情况。

5. 还原。回退对`gradle.properties`的修改,然后执行`./gradlew --stop`。以上所有改动的作用即可恢复。

## 虚拟机

启动虚拟机

```shell
~/Library/Android/sdk/emulator/emulator @Pixel_XL_API_28 -noaudio -no-boot-anim -wipe-data -no-snapstorage
```

其中`Pixel_XL_API_28`来自:

```shell
~/Library/Android/sdk/emulator/emulator -list-avds
```

`-noaudio`可以避免耳机切换到通话模式。
`-wipe-data -no-snapstorage`使得虚拟机完全恢复到新建状态。
`-no-boot-anim`稍微加快点启动。

## 启动指定自动化测试用例

随着Android Studio更新,在#1263 解决之前,只能通过命令行执行自动化测试。
如下命令,传入类名#方法可以指定单个方法。只传入类名可以测试整个类。
如果测试方法是抽象类中的,需要传入一个具体的实现类。

```shell
./gradlew :test-dynamic-host:connectedTarget28DebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.tencent.shadow.test.cases.plugin_main.ApplicationContextSubDirTest#testGetDatabasePath
```

## 清理工作区

由于复合构建的存在,Gradle clean任务不能总是很好的完成清理工作区的目的。

```shell
git clean -fdx -e .idea -e local.properties 
```


================================================
FILE: LICENSE.txt
================================================
Copyright (C) 2019 THL A29 Limited, a Tencent company.  All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

3. Neither the name of THL A29 Limited nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


================================================
FILE: PRIVACY.md
================================================
# Tencent Shadow SDK个人信息保护规则
_生效日期:2022年4月6日_

## 引言

Tencent Shadow SDK (以下简称“SDK产品”)由深圳市腾讯计算机系统有限公司(以下简称“我们”)开发, 公司注册地为深圳市南山区粤海街道麻岭社区科技中一路腾讯大厦35层。

**我们在此特别声明:**

**1. 本SDK产品功能的实现将不需要收集、获取、传输、分享或者使用终端用户的任何个人信息。**

**2. 我们不会因为开发者适配、集成和装载本SDK产品而向其提供、传输或共享任何的个人信息。**

**3. 如果开发者因提供其产品或服务而需要处理终端用户的个人信息, 由开发者独自承担相应的法律责任。**

**4. 请终端用户注意, 在开发者将本SDK产品适配、集成或装载到开发者产品或服务前, 我们已经要求相关开发者仔细阅读我们在官网公示的相关服务协议、本规则及开发者合规指南(或具有同样性质的相关法律文件), 并已经要求开发者依据开发者的产品收集使用个人信息的情况进行合规自查。**

**5. 如果我们更新、改进或修改了本SDK产品, 并因此导致我们需要处理终端用户的个人信息的, 我们将会依据适用法律的要求对本规则进行修订, 并将修订后的内容及时告知开发者和终端用户, 我们将要求开发者适时更新其隐私政策,并以弹框形式通知终端用户并且获得其同意。**

**6. 对于本规则的任何内容存在疑问的, 可以通过如下的方式与我们取得联系:**

(1) 通过 https://kf.qq.com/ 与我们联系进行在线咨询;
(2) 发送邮件至 Dataprivacy@tencent.com ;  
(3) 邮寄信件至:中国广东省深圳市南山区海天二路33号腾讯滨海大厦 数据隐私保护部(收)邮编:518054。


================================================
FILE: README.md
================================================
# Shadow

![Android CI](https://github.com/Tencent/Shadow/workflows/Android%20CI/badge.svg?event=push)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)

## 介绍
Shadow是一个腾讯自主研发的Android插件框架,经过线上亿级用户量检验。
Shadow不仅开源分享了插件技术的关键代码,还完整的分享了上线部署所需要的所有设计。

与市面上其他插件框架相比,Shadow主要具有以下特点:

* **复用独立安装App的源码**:插件App的源码原本就是可以正常安装运行的。
* **零反射无Hack实现插件技术**:从理论上就已经确定无需对任何系统做兼容开发,更无任何隐藏API调用,和Google限制非公开SDK接口访问的策略完全不冲突。
* **全动态插件框架**:一次性实现完美的插件框架很难,但Shadow将这些实现全部动态化起来,使插件框架的代码成为了插件的一部分。插件的迭代不再受宿主打包了旧版本插件框架所限制。
* **宿主增量极小**:得益于全动态实现,真正合入宿主程序的代码量极小(15KB,160方法数左右)。
* **Kotlin实现**:core.loader,core.transform核心代码完全用Kotlin实现,代码简洁易维护。

### 支持特性
* 四大组件
* Fragment(代码添加和Xml添加)
* DataBinding(无需特别支持,但已验证可正常工作)
* 跨进程使用插件Service
* 自定义Theme
* 插件访问宿主类
* So加载
* 分段加载插件(多Apk分别加载或多Apk以此依赖加载)
* 一个Activity中加载多个Apk中的View
* 等等……

## 编译与开发环境

### 环境准备
建议直接用最新的稳定版本Android Studio打开工程。目前项目已适配`Android Studio Arctic Fox | 2020.3.1`,
低版本的Android Studio可能因为Gradle版本过高而无法正常打开项目。

然后在IDE中选择`sample-app`或`sample-host`模块直接运行,分别体验同一份代码在正常安装情况下和插件情况下的运行情况。

![选择sample-host直接运行](pics/run-sample-host-in-ide.png)

Shadow的所有代码都位于`projects`目录下的3个目录,分别是:

* `sdk`包含SDK的所有代码
* `test`包含SDK的自动化测试代码
* `sample`包含演示代码

其中`sample`应该是大家体验Shadow的最佳环境。
详见`sample`目录中的[README](projects/sample/README.md)介绍。

### 兼容性

Shadow项目有较为完善的自动化测试,因此最新代码对外部环境的版本兼容性可以参考自动化测试的配置。

* [pr-check.yml](.github/workflows/pr-check.yml) 虚拟机自动化测试,包含Android测试机版本和编译环境JDK等版本。
* [pr-check-gradle-plugin.yml](.github/workflows/pr-check-gradle-plugin.yml) AGP兼容性测试。
  其中指向的[test_JDK17.sh](projects/test/gradle-plugin-agp-compat-test/test_JDK17.sh)和
  [test_JDK11.sh](projects/test/gradle-plugin-agp-compat-test/test_JDK11.sh)中定义了被测试的AGP版本。

## 自己写的测试代码出错?

以我们多年的插件环境下业务开发经验,插件框架是不可能一步到位实现完美的。
因此,我们相信大部分业务在接入时都是需要一定的二次开发工作。
Shadow现有的代码满足的是我们自己的业务现在的需求。得益于全动态的设计,
插件框架和插件本身都是动态发布的,插件包里既有插件代码也有插件框架代码,
所以可以根据新版本插件的需要同时开发插件框架。

例如,ShadowActivity没有实现全所有Activity方法,你写的测试代码可能用到了,
就会出现Method Not Found错误,只需要在ShadowActivity中实现对应方法就可以了。
大部分方法的实现都只是需要简单的转调就能工作正常。

如果遇到不会实现的功能,可以提Issue。最好附上测试代码。

## 后续开发
* 原理与设计说明文档
* 多插件支持的演示工程
* 自动化测试用例补充
* 开源包含下载能力的manager实现

## 贡献代码

详见[CONTRIBUTING.md](CONTRIBUTING.md)

## 许可协议

Tencent Shadow采用`BSD 3-Clause License`,详见[LICENSE](LICENSE.txt)。

## 个人信息保护规则声明

详见[PRIVACY.md](PRIVACY.md)


================================================
FILE: build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.

//buildscript不能从其他gradle文件中apply,所以这段buildscript脚本存在于多个子构建中。
//请更新buildscript时同步更新。
buildscript {
    loadVersions:
    {// 读取versions.properties到ext中,供项目中直接用变量引用版本号
        def versions_properties_path = 'buildScripts/gradle/versions.properties'
        def versions = new Properties()
        versions.load(file(versions_properties_path).newReader())
        versions.forEach { key, stringValue ->
            def value = stringValue?.isInteger() ? stringValue as Integer : stringValue
            ext.set(key, value)
        }
    }
    repositories {
        if (!System.getenv().containsKey("DISABLE_TENCENT_MAVEN_MIRROR")) {
            maven { url 'https://mirrors.tencent.com/nexus/repository/maven-public/' }
        } else {
            google()
            mavenCentral()
        }
    }
    dependencies {
        classpath "com.android.tools.build:gradle:$build_gradle_version"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.tencent.shadow.coding:aar-to-jar-plugin'
        classpath 'com.tencent.shadow.coding:common-jar-settings'
    }
}
apply from: 'buildScripts/gradle/common.gradle'

apply from: "buildScripts/gradle/maven.gradle"

apply from: "buildScripts/gradle/fix_issue_1263.gradle"


================================================
FILE: buildScripts/gradle/common.gradle
================================================
def gitShortRev() {
    def gitCommit = ""
    def proc = "git rev-parse --short HEAD".execute()
    proc.in.eachLine { line -> gitCommit = line }
    proc.err.eachLine { line -> println line }
    proc.waitFor()
    return gitCommit
}

allprojects {
    def versionName, versionSuffix
    if ("${System.env.CI}".equalsIgnoreCase("true")) {
        versionName = System.getenv("GITHUB_REF_SLUG")
    } else {
        versionName = project.VERSION_NAME
    }

    if ("${System.env.PUBLISH_RELEASE}".equalsIgnoreCase("true")) {
        versionSuffix = ""
    } else if ("${System.env.CI}".equalsIgnoreCase("true")) {
        versionSuffix = "-${System.env.GITHUB_SHA_SHORT}-SNAPSHOT"
    } else {
        versionSuffix = "-${gitShortRev()}-SNAPSHOT"
    }
    ext.ARTIFACT_VERSION = versionName + versionSuffix
    ext.TEST_HOST_APP_APPLICATION_ID = 'com.tencent.shadow.test.hostapp'
    ext.SAMPLE_HOST_APP_APPLICATION_ID = 'com.tencent.shadow.sample.host'
    repositories {
        if (!System.getenv().containsKey("DISABLE_TENCENT_MAVEN_MIRROR")) {
            maven { url 'https://mirrors.tencent.com/nexus/repository/maven-public/' }
        } else {
            google()
            mavenCentral()
        }
    }
}


================================================
FILE: buildScripts/gradle/fix_issue_1263.gradle
================================================
/**
 * 这个脚本通过hook create*ApkListingFileRedirect任务,
 * 在它执行完成后,即生成了apk_ide_redirect_file,也应该生成了apk之后,
 * 补充一个复制build/intermediates/apk到build/outputs/apk的操作。
 *
 * 采用这个修复方式是因为Shadow的打包代码设计不是很合理,难以通过少量改动,
 * 保证引用项目不引入任何兼容性问题。
 *
 * 详见issue #1263
 */
buildscript {
    dependencies {
        classpath files(rootProject.buildscript.configurations.classpath)
    }
}
def taskList = [
        ":sample-loader:createDebugApkListingFileRedirect",
        ":sample-loader:createReleaseApkListingFileRedirect",
        ":sample-runtime:createDebugApkListingFileRedirect",
        ":sample-runtime:createReleaseApkListingFileRedirect",
        ":sample-manager:createDebugApkListingFileRedirect",
        ":sample-manager:createReleaseApkListingFileRedirect",
        ":sample-app:createPluginDebugApkListingFileRedirect",
        ":sample-app:createPluginReleaseApkListingFileRedirect",
        ":sample-base:createPluginDebugApkListingFileRedirect",
        ":sample-base:createPluginReleaseApkListingFileRedirect",

        ":test-dynamic-loader:createDebugApkListingFileRedirect",
        ":test-dynamic-loader:createReleaseApkListingFileRedirect",
        ":test-dynamic-runtime:createDebugApkListingFileRedirect",
        ":test-dynamic-runtime:createReleaseApkListingFileRedirect",
        ":test-dynamic-manager:createDebugApkListingFileRedirect",
        ":test-dynamic-manager:createReleaseApkListingFileRedirect",
        ":plugin-service-for-host:createPluginDebugApkListingFileRedirect",
        ":plugin-service-for-host:createPluginReleaseApkListingFileRedirect",
        ":test-plugin-androidx-cases:createPluginDebugApkListingFileRedirect",
        ":test-plugin-androidx-cases:createPluginReleaseApkListingFileRedirect",
        ":test-plugin-general-cases:createPluginDebugApkListingFileRedirect",
        ":test-plugin-general-cases:createPluginReleaseApkListingFileRedirect",

        ":sample-hello-apk:createDebugApkListingFileRedirect",
        ":sample-hello-apk:createReleaseApkListingFileRedirect",
]

afterEvaluate {
    taskList.forEach {
        def t = tasks.findByPath(it)
        copyApkAfterTask(t)
    }
}

def copyApkAfterTask(t) {
    t.doLast {
        def redirectFile = t.getOutputs().getFiles().singleFile
        def listingFile = redirectFile.readLines().get(1).replaceFirst("listingFile=", "")
        def metadataFile = new File(redirectFile.parentFile, listingFile)
        def metadata = new org.json.JSONObject(metadataFile.text)
        def outputFile = metadata.getJSONArray("elements").getJSONObject(0).getString("outputFile")
        def apkFile = new File(metadataFile.parentFile, outputFile)
        def testRelativePath = redirectFile.relativePath(apkFile)
        def needCopy = !testRelativePath.matches("^(\\.\\.${File.separatorChar})+outputs${File.separatorChar}.+")
        if (needCopy) {
            def matchPath = new File("/build/intermediates").toPath().toString()
            def intermediatesDir = new File(apkFile.toPath().normalize().toString().find("^.+?$matchPath"))
            def outputsDir = new File(intermediatesDir.parentFile, "outputs")
            def r = copy {
                from intermediatesDir
                into outputsDir
                include 'apk/**'
            }
            if (r.didWork) {
                getLogger().info("copy apk from ${intermediatesDir.path} to ${outputsDir.path}")
            }
        }
    }
}


================================================
FILE: buildScripts/gradle/maven.gradle
================================================
task buildSdk() {
    dependsOn gradle.includedBuild('core').task(':gradle-plugin:assemble')
    dependsOn gradle.includedBuild('core').task(':manifest-parser:assemble')
    dependsOn gradle.includedBuild('core').task(':common:assemble')
    dependsOn gradle.includedBuild('core').task(':loader:assemble')
    dependsOn gradle.includedBuild('core').task(':manager:assemble')
    dependsOn gradle.includedBuild('core').task(':runtime:assemble')
    dependsOn gradle.includedBuild('core').task(':activity-container:assemble')
    dependsOn gradle.includedBuild('core').task(':transform-kit:assemble')
    dependsOn gradle.includedBuild('core').task(':transform-kit:testJar')
    dependsOn gradle.includedBuild('core').task(':transform:assemble')
    dependsOn gradle.includedBuild('core').task(':load-parameters:assemble')
    dependsOn gradle.includedBuild('core').task(':utils:assemble')

    dependsOn gradle.includedBuild('dynamic').task(':dynamic-apk:assemble')
    dependsOn gradle.includedBuild('dynamic').task(':dynamic-host:assemble')
    dependsOn gradle.includedBuild('dynamic').task(':dynamic-loader:assemble')
    dependsOn gradle.includedBuild('dynamic').task(':dynamic-loader-impl:assemble')
    dependsOn gradle.includedBuild('dynamic').task(':dynamic-manager:assemble')
    dependsOn gradle.includedBuild('dynamic').task(':dynamic-host-multi-loader-ext:assemble')
    dependsOn gradle.includedBuild('dynamic').task(':dynamic-manager-multi-loader-ext:assemble')
}

task jvmTestSdk() {
    dependsOn gradle.includedBuild('coding').task(':test')
    dependsOn gradle.includedBuild('core').task(':test')
    dependsOn gradle.includedBuild('dynamic').task(':test')
    dependsOn ':common-jar-settings-test:testJavacBootclasspath'
}

task androidTestSdk() {
    dependsOn gradle.includedBuild('core').task(':manager-db-test:connectedDebugAndroidTest')
    dependsOn ':test-dynamic-host:connectedTarget28DebugAndroidTest'
}

task testSdk() {
    dependsOn jvmTestSdk
    dependsOn androidTestSdk
}

apply plugin: 'maven-publish'

static def getDependencyNode(scope, groupId, artifactId, version) {
    Node node = new Node(null, 'dependency')
    node.appendNode('groupId', groupId)
    node.appendNode('artifactId', artifactId)
    node.appendNode('version', version)
    node.appendNode('scope', scope)
    return node
}

def gitShortRev() {
    def gitCommit = ""
    def proc = "git rev-parse --short HEAD".execute()
    proc.in.eachLine { line -> gitCommit = line }
    proc.err.eachLine { line -> println line }
    proc.waitFor()
    return gitCommit
}

def setScm(scm) {
    scm.appendNode('connection', "https://github.com/${System.getenv("GITHUB_ACTOR")}/Shadow.git")

    def commit
    if ("${System.env.CI}".equalsIgnoreCase("true")) {
        commit = System.getenv("GITHUB_SHA")
    } else {
        commit = gitShortRev()
    }
    scm.appendNode('url', "https://github.com/${System.getenv("GITHUB_ACTOR")}/Shadow/commit/$commit")
}

def setGeneratePomFileAndDepends(publicationName) {
    model {
        tasks."generatePomFileFor${publicationName.capitalize()}Publication" {
            destination = file("$buildDir/pom/$publicationName-pom.xml")
            dependsOn(buildSdk)
        }
    }
}

def sourceJar(String name, String path) {
    return tasks.create("source${name.capitalize()}Jar", Jar) {
        group = "publishing"
        description = "package ${name} source to jar"
        from "$path/src/main/java"
        from "$path/src/main/kotlin"
        destinationDir = file("$path/build/libs/")
        classifier = 'sources'
    }
}

def publicationVersion = project.ARTIFACT_VERSION
def coreGroupId = 'com.tencent.shadow.core'
def corePath = 'projects/sdk/core'
def dynamicGroupId = 'com.tencent.shadow.dynamic'
def dynamicPath = 'projects/sdk/dynamic'

task getPublicationVersion() {
    doLast {
        println "publicationVersion:$publicationVersion"
    }
}

publishing {
    publications {
        gradlePlugin(MavenPublication) {
            groupId coreGroupId
            artifactId 'gradle-plugin'
            version publicationVersion
            artifact("$corePath/gradle-plugin/build/libs/gradle-plugin.jar")
            artifact sourceJar("gradlePlugin", "$corePath/gradle-plugin")

            pom.withXml {
                def root = asNode()
                def dependencies = root.appendNode('dependencies')
                dependencies.append(getDependencyNode('compile', 'org.jetbrains.kotlin', 'kotlin-stdlib-jdk7', kotlin_version))
                dependencies.append(getDependencyNode('compile', 'com.googlecode.json-simple', 'json-simple', json_simple_version))
                dependencies.append(getDependencyNode('compile', coreGroupId, 'transform-kit', publicationVersion))
                dependencies.append(getDependencyNode('compile', coreGroupId, 'transform', publicationVersion))
                dependencies.append(getDependencyNode('compile', coreGroupId, 'runtime', publicationVersion))
                dependencies.append(getDependencyNode('compile', coreGroupId, 'activity-container', publicationVersion))
                dependencies.append(getDependencyNode('compile', coreGroupId, 'manifest-parser', publicationVersion))

                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }
        // Plugin Marker Artifacts
        // https://docs.gradle.org/current/userguide/plugins.html#sec:plugin_markers
        pluginMarker(MavenPublication) {
            def pluginId = 'com.tencent.shadow.plugin'
            groupId pluginId
            artifactId pluginId + '.gradle.plugin'
            version publicationVersion

            pom.withXml {
                def root = asNode()
                def dependencies = root.appendNode('dependencies')
                dependencies.append(getDependencyNode('compile', coreGroupId, 'gradle-plugin', publicationVersion))
                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }
        manifestParser(MavenPublication) {
            groupId coreGroupId
            artifactId 'manifest-parser'
            version publicationVersion
            artifact("$corePath/manifest-parser/build/libs/manifest-parser.jar")
            artifact sourceJar("manifestParser", "$corePath/manifest-parser")

            pom.withXml {
                def root = asNode()
                def dependencies = root.appendNode('dependencies')
                dependencies.append(getDependencyNode('compile', 'org.jetbrains.kotlin', 'kotlin-stdlib-jdk7', kotlin_version))
                dependencies.append(getDependencyNode('compile', 'com.squareup', 'javapoet', javapoet_version))
                dependencies.append(getDependencyNode('compile', coreGroupId, 'runtime', publicationVersion))

                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }
        common(MavenPublication) {
            groupId coreGroupId
            artifactId 'common'
            version publicationVersion
            artifact("$corePath/common/build/libs/common.jar")
            artifact sourceJar("common", "$corePath/common")

            pom.withXml {
                def root = asNode()
                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }

        loadParameters(MavenPublication) {
            groupId coreGroupId
            artifactId 'load-parameters'
            version publicationVersion
            artifact("$corePath/load-parameters/build/libs/load-parameters.jar")
            artifact sourceJar("loadParameters", "$corePath/load-parameters")

            pom.withXml {
                def root = asNode()
                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }

        coreLoader(MavenPublication) {
            groupId coreGroupId
            artifactId 'loader'
            version publicationVersion
            artifact("$corePath/loader/build/libs/loader.jar")
            artifact sourceJar("loader", "$corePath/loader")

            pom.withXml {
                def root = asNode()
                def dependencies = root.appendNode('dependencies')
                dependencies.append(getDependencyNode('compile', 'org.jetbrains.kotlin', 'kotlin-stdlib-jdk7', kotlin_version))
                dependencies.append(getDependencyNode('compile', coreGroupId, 'runtime', publicationVersion))
                dependencies.append(getDependencyNode('provided', coreGroupId, 'activity-container', publicationVersion))
                dependencies.append(getDependencyNode('provided', coreGroupId, 'common', publicationVersion))
                dependencies.append(getDependencyNode('compile', coreGroupId, 'load-parameters', publicationVersion))

                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }
        coreManager(MavenPublication) {
            groupId coreGroupId
            artifactId 'manager'
            version publicationVersion
            artifact("$corePath/manager/build/libs/manager.jar")
            artifact sourceJar("manager", "$corePath/manager")

            pom.withXml {
                def root = asNode()
                def dependencies = root.appendNode('dependencies')
                dependencies.append(getDependencyNode('provided', coreGroupId, 'common', publicationVersion))
                dependencies.append(getDependencyNode('compile', coreGroupId, 'load-parameters', publicationVersion))
                dependencies.append(getDependencyNode('compile', coreGroupId, 'utils', publicationVersion))

                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }
        runtime(MavenPublication) {
            groupId coreGroupId
            artifactId 'runtime'
            version publicationVersion
            artifact("$corePath/runtime/build/libs/runtime.jar")
            artifact sourceJar("runtime", "$corePath/runtime")

            pom.withXml {
                def root = asNode()

                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }
        activityContainer(MavenPublication) {
            groupId coreGroupId
            artifactId 'activity-container'
            version publicationVersion
            artifact("$corePath/activity-container/build/libs/activity-container.jar")
            artifact sourceJar("activity-container", "$corePath/activity-container")

            pom.withXml {
                def root = asNode()

                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }

        transformKit(MavenPublication) {
            groupId coreGroupId
            artifactId 'transform-kit'
            version publicationVersion
            artifact("$corePath/transform-kit/build/libs/transform-kit.jar")
            artifact sourceJar("transformKit", "$corePath/transform-kit")

            pom.withXml {
                def root = asNode()
                def dependencies = root.appendNode('dependencies')
                dependencies.append(getDependencyNode('compile', 'org.jetbrains.kotlin', 'kotlin-stdlib-jdk7', kotlin_version))
                dependencies.append(getDependencyNode('compile', 'org.javassist', 'javassist', javassist_version))

                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }

        transformKitTest(MavenPublication) {
            groupId coreGroupId
            artifactId 'transform-kit-test'
            version publicationVersion
            artifact("$corePath/transform-kit/build/libs/test-transform-kit.jar")

            pom.withXml {
                def root = asNode()
                def dependencies = root.appendNode('dependencies')
                dependencies.append(getDependencyNode('compile', 'junit', 'junit', junit_version))

                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }

        transform(MavenPublication) {
            groupId coreGroupId
            artifactId 'transform'
            version publicationVersion
            artifact("$corePath/transform/build/libs/transform.jar")
            artifact sourceJar("transform", "$corePath/transform")

            pom.withXml {
                def root = asNode()
                def dependencies = root.appendNode('dependencies')
                dependencies.append(getDependencyNode('compile', coreGroupId, 'transform-kit', publicationVersion))

                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }
        dynamicApk(MavenPublication) {
            groupId dynamicGroupId
            artifactId 'apk'
            version publicationVersion
            artifact("$dynamicPath/dynamic-apk/build/libs/dynamic-apk.jar")
            artifact sourceJar("dynamicApk", "$dynamicPath/dynamic-apk")

            pom.withXml {
                def root = asNode()
                def dependencies = root.appendNode('dependencies')
                dependencies.append(getDependencyNode('compile', coreGroupId, 'common', publicationVersion))

                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }
        dynamicHost(MavenPublication) {
            groupId dynamicGroupId
            artifactId 'host'
            version publicationVersion
            artifact("$dynamicPath/dynamic-host/build/libs/dynamic-host.jar")
            artifact sourceJar("dynamicHost", "$dynamicPath/dynamic-host")

            pom.withXml {
                def root = asNode()
                def dependencies = root.appendNode('dependencies')
                dependencies.append(getDependencyNode('compile', dynamicGroupId, 'apk', publicationVersion))
                dependencies.append(getDependencyNode('compile', coreGroupId, 'common', publicationVersion))
                dependencies.append(getDependencyNode('compile', coreGroupId, 'utils', publicationVersion))

                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }
        dynamicHostMultiLoaderExt(MavenPublication) {
            groupId dynamicGroupId
            artifactId 'host-multi-loader-ext'
            version publicationVersion
            artifact("$dynamicPath/dynamic-host-multi-loader-ext/build/libs/dynamic-host-multi-loader-ext.jar")
            artifact sourceJar("dynamicHostMultiLoaderExt", "$dynamicPath/dynamic-host-multi-loader-ext")

            pom.withXml {
                def root = asNode()
                def dependencies = root.appendNode('dependencies')
                dependencies.append(getDependencyNode('compile', coreGroupId, 'common', publicationVersion))
                dependencies.append(getDependencyNode('compile', dynamicGroupId, 'host', publicationVersion))

                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }

        dynamicLoader(MavenPublication) {
            groupId dynamicGroupId
            artifactId 'loader'
            version publicationVersion
            artifact("$dynamicPath/dynamic-loader/build/libs/dynamic-loader.jar")
            artifact sourceJar("dynamicLoader", "$dynamicPath/dynamic-loader")

            pom.withXml {
                def root = asNode()
                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }
        dynamicLoaderImpl(MavenPublication) {
            groupId dynamicGroupId
            artifactId 'loader-impl'
            version publicationVersion
            artifact("$dynamicPath/dynamic-loader-impl/build/libs/dynamic-loader-impl.jar")
            artifact sourceJar("dynamicLoaderImpl", "$dynamicPath/dynamic-loader-impl")

            pom.withXml {
                def root = asNode()
                def dependencies = root.appendNode('dependencies')
                dependencies.append(getDependencyNode('compile', 'org.jetbrains.kotlin', 'kotlin-stdlib-jdk7', kotlin_version))
                dependencies.append(getDependencyNode('compile', coreGroupId, 'loader', publicationVersion))
                dependencies.append(getDependencyNode('provided', coreGroupId, 'activity-container', publicationVersion))
                dependencies.append(getDependencyNode('provided', coreGroupId, 'common', publicationVersion))
                dependencies.append(getDependencyNode('provided', dynamicGroupId, 'host', publicationVersion))
                dependencies.append(getDependencyNode('compile', dynamicGroupId, 'loader', publicationVersion))

                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }
        dynamicManager(MavenPublication) {
            groupId dynamicGroupId
            artifactId 'manager'
            version publicationVersion
            artifact("$dynamicPath/dynamic-manager/build/libs/dynamic-manager.jar")
            artifact sourceJar("dynamicManager", "$dynamicPath/dynamic-manager")

            pom.withXml {
                def root = asNode()
                def dependencies = root.appendNode('dependencies')
                dependencies.append(getDependencyNode('compile', coreGroupId, 'manager', publicationVersion))
                dependencies.append(getDependencyNode('compile', dynamicGroupId, 'loader', publicationVersion))
                dependencies.append(getDependencyNode('provided', coreGroupId, 'common', publicationVersion))
                dependencies.append(getDependencyNode('provided', dynamicGroupId, 'host', publicationVersion))

                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }

        dynamicManagerMultiLoaderExt(MavenPublication) {
            groupId dynamicGroupId
            artifactId 'manager-multi-loader-ext'
            version publicationVersion
            artifact("$dynamicPath/dynamic-manager-multi-loader-ext/build/libs/dynamic-manager-multi-loader-ext.jar")
            artifact sourceJar("dynamicManagerMultiLoaderExt", "$dynamicPath/dynamic-manager-multi-loader-ext")

            pom.withXml {
                def root = asNode()
                def dependencies = root.appendNode('dependencies')
                dependencies.append(getDependencyNode('compile', coreGroupId, 'manager', publicationVersion))
                dependencies.append(getDependencyNode('compile', dynamicGroupId, 'loader', publicationVersion))
                dependencies.append(getDependencyNode('compile', dynamicGroupId, 'manager', publicationVersion))
                dependencies.append(getDependencyNode('provided', coreGroupId, 'common', publicationVersion))
                dependencies.append(getDependencyNode('provided', dynamicGroupId, 'host-multi-loader-ext', publicationVersion))

                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }

        coreUtils(MavenPublication) {
            groupId coreGroupId
            artifactId 'utils'
            version publicationVersion
            artifact("$corePath/utils/build/libs/utils.jar")
            artifact sourceJar("utils", "$corePath/utils")

            pom.withXml {
                def root = asNode()

                def scm = root.appendNode('scm')
                setScm(scm)
            }
        }
    }
    repositories {
        def useLocalCredential = false
        Properties properties = new Properties()
        def propertiesFile = project.rootProject.file('local.properties')
        if (propertiesFile.exists()) {
            properties.load(propertiesFile.newDataInputStream())

            if ("${properties.getProperty('gpr.local')}".equalsIgnoreCase('true')) {
                def user = properties.getProperty('gpr.user')
                def key = properties.getProperty('gpr.key')
                maven {
                    name = "GitHubPackages"
                    credentials {
                        username = user
                        password = key
                    }
                    url "https://maven.pkg.github.com/${user}/shadow"
                }

                useLocalCredential = true
            }
        }

        if (!useLocalCredential && "${System.env.CI}".equalsIgnoreCase("true")) {
            maven {
                name = "GitHubPackages"
                credentials {
                    username = System.getenv("GITHUB_ACTOR")
                    password = System.getenv("GITHUB_TOKEN")
                }
                url "https://maven.pkg.github.com/" + "${System.env.GITHUB_REPOSITORY}".toLowerCase()
            }
        } else {
            mavenLocal()
        }
    }
}

setGeneratePomFileAndDepends('gradlePlugin')
setGeneratePomFileAndDepends('manifestParser')
setGeneratePomFileAndDepends('common')
setGeneratePomFileAndDepends('loadParameters')
setGeneratePomFileAndDepends('coreLoader')
setGeneratePomFileAndDepends('coreManager')
setGeneratePomFileAndDepends('coreUtils')
setGeneratePomFileAndDepends('runtime')
setGeneratePomFileAndDepends('activityContainer')
setGeneratePomFileAndDepends('transformKit')
setGeneratePomFileAndDepends('transformKitTest')
setGeneratePomFileAndDepends('transform')
setGeneratePomFileAndDepends('dynamicApk')
setGeneratePomFileAndDepends('dynamicHost')
setGeneratePomFileAndDepends('dynamicHostMultiLoaderExt')
setGeneratePomFileAndDepends('dynamicLoader')
setGeneratePomFileAndDepends('dynamicLoaderImpl')
setGeneratePomFileAndDepends('dynamicManager')
setGeneratePomFileAndDepends('dynamicManagerMultiLoaderExt')


================================================
FILE: buildScripts/gradle/versions.properties
================================================
COMPILE_SDK_VERSION=33
MIN_SDK_VERSION=14
TARGET_SDK_VERSION=28
VERSION_CODE=1
VERSION_NAME=local
android_build_tools_version=30.0.3
android_support_annotations_version=28.0.0
android_support_version=27.1.1
androidx_activity_version=1.4.0
androidx_appcompat_version=1.4.1
androidx_test_junit_version=1.1.2
androidx_test_version=1.3.0
build_gradle_version=7.4.2
commons_io_android_version=2.5
commons_io_jvm_version=2.9.0
espresso_version=3.3.0
javapoet_version=1.11.1
javassist_version=3.28.0-GA
json_simple_version=1.1
junit_version=4.12
kotlin_version=1.5.31
slf4j_version=1.7.25


================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
#distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
distributionUrl=https\://mirrors.tencent.com/gradle/gradle-7.5-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists


================================================
FILE: gradle.properties
================================================
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx4096m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
android.useAndroidX=true
org.gradle.caching=true

android.nonTransitiveRClass=true


================================================
FILE: gradlew
================================================
#!/usr/bin/env sh

#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn () {
    echo "$*"
}

die () {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
  NONSTOP* )
    nonstop=true
    ;;
esac

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar


# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`

    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=`expr $i + 1`
    done
    case $i in
        0) set -- ;;
        1) set -- "$args0" ;;
        2) set -- "$args0" "$args1" ;;
        3) set -- "$args0" "$args1" "$args2" ;;
        4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Escape application args
save () {
    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
    echo " "
}
APP_ARGS=`save "$@"`

# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"

exec "$JAVACMD" "$@"


================================================
FILE: gradlew.bat
================================================
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem      https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem

@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto execute

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar


@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: projects/sample/README.md
================================================
# Sample

在Shadow框架下,应用由几部分构成。
宿主应用打包了很简单的一些接口,并在Manifest中注册了壳子代理组件,
还打包了插件管理器(manager)的动态升级逻辑。
manager负责下载、安装插件,还带有一个动态的View表达Loading态。
而"插件"则不光包含业务App,还包含Shadow的核心实现,即loader和runtime。
"插件"中的业务App和loader、runtime是同一个版本的代码编译出的,
因此loader可以包含一些业务逻辑,针对业务进行特殊处理。
由于loader是多实例的,因此同一个宿主中可以有多种不同的loader实现。
manager在加载"插件"时,首先需要先加载"插件"中的runtime和loader,
再通过loader的Binder(插件应该处于独立进程中避免native库冲突)操作loader进而加载业务App。

在这个Sample目录下,提供了两种示例工程:

## 源码依赖SDK的Sample(`projects/sample/source`)

***
要测试这个Sample请用Android Studio直接打开clone版本库的根目录。
***

* `sample-host`是宿主应用
* `sample-manager`是插件管理器的动态实现
* `sample-plugin/sample-loader`是loader的动态实现,业务主要在这里定义插件组件和壳子代理组件的配对关系等。
* `sample-constant`是在前3者中共用的相同字符串常量。
* `sample-plugin/sample-runtime`是runtime的动态实现,业务主要在这里定义壳子代理组件的实际类。
* `sample-plugin/sample-base-lib`是业务App的一部分基础代码,是一个aar库。
* `sample-plugin/sample-base`是一个apk模块壳子,将`sample-base-lib`打包在其中。既用于正常安装运行开发`sample-base-lib`
  ,又用于编译`sample-base`插件。
* `sample-plugin/sample-app`是依赖`sample-base-lib`开发的更多业务代码。它编译出的插件apk没有打包`sample-base-lib`
  ,会在插件运行时依赖`sample-base`插件。

`sample-app`和`sample-base`构成了一个多插件示例,请注意`sample-app/build.gradle`中的`dependsOn = ['sample-base']`设置。

这些工程中对Shadow SDK的依赖完全是源码级的依赖,因此修改Shadow SDK的源码后可以直接运行生效。

使用时可以直接在Android Studio中选择运行`sample-host`模块。
`sample-host`在构建中会自动打包manager和"插件"到assets中,在运行时自动释放模拟下载过程。

## 二进制Maven依赖SDK的Sample(`projects/sample/maven`)

***
要测试这个Sample请用Android Studio *分别* 打开`projects/sample/maven/host-project`
,`projects/sample/maven/manager-project`,`projects/sample/maven/plugin-project`三个目录。
***

源码依赖SDK的Sample中对Shadow SDK的依赖配置不适用于正式业务接入。
Shadow实现了完整的Maven发布脚本,支持方便的Maven依赖。

`maven`目录下的3个目录分别演示了3个工程。
这3个工程在实际业务中大概率上是3个不同的代码库。
因此,在这个演示中没有试图做着3个工程间的任何依赖关系,
甚至**3个工程中依赖的Shadow版本都是独立配置的**,
使用时请注意这一点。

### 自行发布SDK到Maven仓库方法

在`buildScripts/gradle/maven.gradle`文件中配置了Shadow的Maven发布脚本。
正式使用时,请修改其中的两个GroupID变量:`coreGroupId`、`dynamicGroupId`,
以及`setScm`方法中的两个URL到自己的版本库地址上。

然后将`mavenLocal()`改为自己发布的目标Maven仓库。

执行`./gradlew publish`即可将Shadow SDK发布到Maven仓库。

构件的版本号可以在`build/pom`目录中查看生成的pom文件中查看。

在这个Sample的3个工程的`build.gradle`文件中都有`shadow_version`定义,
将这个定义值改为刚刚发布的版本号(生成的pom中写的版本号)。

### 运行方法

这个演示工程没有实现下载功能,而是假设下载的文件直接位于指定路径。
因此运行前需要手工用adb命令将指定内容push到指定位置。

编译插件,在`plugin-project`目录中运行:
```
./gradlew packageDebugPlugin

adb push build/plugin-debug.zip /data/local/tmp
```

编译PluginManager,在`manager-project`目录中运行:
```
./gradlew assembleDebug
adb push sample-manager/build/outputs/apk/debug/sample-manager-debug.apk /data/local/tmp
```

最后可以用Android Studio打开`host-project`直接运行`sample-host`模块。

`plugin-project`中的`plugin-normal-apk`模块也可以直接安装运行,演示不使用Shadow时插件的运行情况。


================================================
FILE: projects/sample/dynamic-apk/sample-hello-api/.gitignore
================================================
/build


================================================
FILE: projects/sample/dynamic-apk/sample-hello-api/README.md
================================================
演示如何将自定义接口动态化,使得宿主能够使用apk中的实现

sample-hello-api:定义宿主api接口
sample-hello-api-holder:将 api 动态化,宿主通过这个包提供的方法来获取apk中的实现



================================================
FILE: projects/sample/dynamic-apk/sample-hello-api/build.gradle
================================================
apply plugin: 'com.android.library'

android {
    compileSdkVersion project.COMPILE_SDK_VERSION

    defaultConfig {
        minSdkVersion project.MIN_SDK_VERSION
        targetSdkVersion project.TARGET_SDK_VERSION
        versionCode project.VERSION_CODE
        versionName project.VERSION_NAME

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

    }

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


================================================
FILE: projects/sample/dynamic-apk/sample-hello-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: projects/sample/dynamic-apk/sample-hello-api/src/main/AndroidManifest.xml
================================================
<manifest package="com.tencent.shadow.sample.api.hello" />


================================================
FILE: projects/sample/dynamic-apk/sample-hello-api/src/main/java/com/tencent/shadow/sample/api/hello/HelloFactory.java
================================================
/*
 * Tencent is pleased to support the open source community by making Tencent Shadow available.
 * Copyright (C) 2019 THL A29 Limited, a Tencent company.  All rights reserved.
 *
 * Licensed under the BSD 3-Clause License (the "License"); you may not use
 * this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 *     https://opensource.org/licenses/BSD-3-Clause
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.tencent.shadow.sample.api.hello;

import android.content.Context;

/**
 * @author 林学渊
 * @email linxy59@mail2.sysu.edu.cn
 * @date 2021/9/6
 * @description 宿主只能通过工厂模式获取 apk 中的类
 * @usage null
 */
public interface HelloFactory {
    IHelloWorldImpl build(Context context);
}


================================================
FILE: projects/sample/dynamic-apk/sample-hello-api/src/main/java/com/tencent/shadow/sample/api/hello/IHelloWorld.java
================================================
package com.tencent.shadow.sample.api.hello;

import android.content.Context;
import android.widget.TextView;

/**
 * @author 林学渊
 * @email linxy59@mail2.sysu.edu.cn
 * @date 2021/9/6
 * @description 定义在宿主里的接口,使用插件apk中的实现
 * @usage 插件打印 hello world
 */
public interface IHelloWorld {
    void sayHelloWorld(Context context, TextView textView);
}


================================================
FILE: projects/sample/dynamic-apk/sample-hello-api/src/main/java/com/tencent/shadow/sample/api/hello/IHelloWorldImpl.java
================================================
/*
 * Tencent is pleased to support the open source community by making Tencent Shadow available.
 * Copyright (C) 2019 THL A29 Limited, a Tencent company.  All rights reserved.
 *
 * Licensed under the BSD 3-Clause License (the "License"); you may not use
 * this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 *     https://opensource.org/licenses/BSD-3-Clause
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.tencent.shadow.sample.api.hello;

import android.os.Bundle;

/**
 * @author 林学渊
 * @email linxy59@mail2.sysu.edu.cn
 * @date 2021/9/6
 * @description 给接口 IHelloWorld 包装一层生命周期
 * 可参考 com.tencent.shadow.sample.apk.hello.DynamicHello 中管理该生命周期
 * @usage hello.apk 里可以感知加载的过程
 */
public interface IHelloWorldImpl extends IHelloWorld {

    void onCreate(Bundle bundle);

    void onSaveInstanceState(Bundle outState);

    void onDestroy();
}


================================================
FILE: projects/sample/dynamic-apk/sample-hello-api-holder/.gitignore
================================================
/build


================================================
FILE: projects/sample/dynamic-apk/sample-hello-api-holder/README.md
================================================
演示如何将自定义接口动态化,使得宿主能够使用apk中的实现

sample-hello-api:定义宿主api接口
sample-hello-api-holder:将 api 动态化,宿主通过这个包提供的方法来获取apk中的实现

宿主引入 apk 包,implementation project(':sample-hello-api-holder')


================================================
FILE: projects/sample/dynamic-apk/sample-hello-api-holder/build.gradle
================================================
apply plugin: 'com.android.library'

android {
    compileSdkVersion project.COMPILE_SDK_VERSION

    defaultConfig {
        minSdkVersion project.MIN_SDK_VERSION
        targetSdkVersion project.TARGET_SDK_VERSION
        versionCode project.VERSION_CODE
        versionName project.VERSION_NAME

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

    }

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

dependencies {
    // 使用 api 而不是 compileOnly:发布 aar 时会传递依赖,而不是打包进 aar
    api 'com.tencent.shadow.core:utils'
    api 'com.tencent.shadow.core:common'
    api 'com.tencent.shadow.dynamic:dynamic-apk'

    api project(':sample-hello-api')
}

================================================
FILE: projects/sample/dynamic-apk/sample-hello-api-holder/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: projects/sample/dynamic-apk/sample-hello-api-holder/src/main/AndroidManifest.xml
================================================
<manifest package="com.tencent.shadow.sample.apk.hello" />


================================================
FILE: projects/sample/dynamic-apk/sample-hello-api-holder/src/main/java/com/tencent/shadow/sample/apk/hello/DynamicHello.java
================================================
/*
 * Tencent is pleased to support the open source community by making Tencent Shadow available.
 * Copyright (C) 2019 THL A29 Limited, a Tencent company.  All rights reserved.
 *
 * Licensed under the BSD 3-Clause License (the "License"); you may not use
 * this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 *     https://opensource.org/licenses/BSD-3-Clause
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.tencent.shadow.sample.apk.hello;

import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.TextView;

import com.tencent.shadow.core.common.Logger;
import com.tencent.shadow.core.common.LoggerFactory;
import com.tencent.shadow.sample.api.hello.IHelloWorld;
import com.tencent.shadow.sample.api.hello.IHelloWorldImpl;

import java.io.File;

import static com.tencent.shadow.core.utils.Md5.md5File;


public final class DynamicHello implements IHelloWorld {

    final private HelloWorldUpdater mUpdater;
    private IHelloWorldImpl mHelloWorldImpl;
    private String mCurrentImplMd5;
    private static final Logger mLogger = LoggerFactory.getLogger(DynamicHello.class);

    public DynamicHello(HelloWorldUpdater updater) {
        if (updater.getLatest() == null) {
            throw new IllegalArgumentException("构造DynamicPluginManager时传入的PluginManagerUpdater" +
                    "必须已经已有本地文件,即getLatest()!=null");
        }
        mUpdater = updater;
    }

    @Override
    public void sayHelloWorld(Context context, TextView textView) {
        if (mLogger.isInfoEnabled()) {
            mLogger.info("sayHelloWorld context:" + context);
        }
        updateImpl(context);
        mHelloWorldImpl.sayHelloWorld(context, textView);
        mUpdater.update();
    }

    public void release() {
        if (mLogger.isInfoEnabled()) {
            mLogger.info("release");
        }
        if (mHelloWorldImpl != null) {
            mHelloWorldImpl.onDestroy();
            mHelloWorldImpl = null;
        }
    }

    private void updateImpl(Context context) {
        File latestImplApk = mUpdater.getLatest();
        String md5 = md5File(latestImplApk);
        if (mLogger.isInfoEnabled()) {
            mLogger.info("TextUtils.equals(mCurrentImplMd5, md5) : " + (TextUtils.equals(mCurrentImplMd5, md5)));
        }
        if (!TextUtils.equals(mCurrentImplMd5, md5)) {
            HelloImplLoader implLoader = new HelloImplLoader(context, latestImplApk);
            IHelloWorldImpl newImpl = implLoader.load();
            Bundle state;
            if (mHelloWorldImpl != null) {
                state = new Bundle();
                mHelloWorldImpl.onSaveInstanceState(state);
                mHelloWorldImpl.onDestroy();
            } else {
                state = null;
            }
            newImpl.onCreate(state);
            mHelloWorldImpl = newImpl;
            mCurrentImplMd5 = md5;
        }
    }

    public IHelloWorld getHelloWorkdImpl() {
        return mHelloWorldImpl;
    }

}


================================================
FILE: projects/sample/dynamic-apk/sample-hello-api-holder/src/main/java/com/tencent/shadow/sample/apk/hello/HelloImplLoader.java
================================================
/*
 * Tencent is pleased to support the open source community by making Tencent Shadow available.
 * Copyright (C) 2019 THL A29 Limited, a Tencent company.  All rights reserved.
 *
 * Licensed under the BSD 3-Clause License (the "License"); you may not use
 * this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 *     https://opensource.org/licenses/BSD-3-Clause
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.tencent.shadow.sample.apk.hello;

import android.content.Context;

import com.tencent.shadow.core.common.InstalledApk;
import com.tencent.shadow.dynamic.apk.ApkClassLoader;
import com.tencent.shadow.dynamic.apk.ChangeApkContextWrapper;
import com.tencent.shadow.dynamic.apk.ImplLoader;
import com.tencent.shadow.sample.api.hello.HelloFactory;
import com.tencent.shadow.sample.api.hello.IHelloWorldImpl;

import java.io.File;

final class HelloImplLoader extends ImplLoader {
    //指定实现类在apk中的路径
    private static final String FACTORY_CLASS_NAME = "com.tencent.shadow.dynamic.impl.HelloFactoryImpl";
    private static final String[] REMOTE_PLUGIN_MANAGER_INTERFACES = new String[]
            {
                    "com.tencent.shadow.core.common",
                    //注意将宿主自定义接口加入白名单
                    "com.tencent.shadow.sample.api.hello"
            };
    final private Context applicationContext;
    final private InstalledApk installedApk;

    HelloImplLoader(Context context, File apk) {
        applicationContext = context.getApplicationContext();
        File root = new File(applicationContext.getFilesDir(), "HelloImplLoader");
        File odexDir = new File(root, Long.toString(apk.lastModified(), Character.MAX_RADIX));
        odexDir.mkdirs();
        installedApk = new InstalledApk(apk.getAbsolutePath(), odexDir.getAbsolutePath(), null);
    }

    IHelloWorldImpl load() {
        ApkClassLoader apkClassLoader = new ApkClassLoader(
                installedApk,
                getClass().getClassLoader(),
                loadWhiteList(installedApk),
                1
        );

        Context contextForApi = new ChangeApkContextWrapper(
                applicationContext,
                installedApk.apkFilePath,
                apkClassLoader
        );

        try {
            HelloFactory factory = apkClassLoader.getInterface(
                    HelloFactory.class,
                    FACTORY_CLASS_NAME
            );
            return factory.build(contextForApi);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    protected String[] getCustomWhiteList() {
        return REMOTE_PLUGIN_MANAGER_INTERFACES;
    }
}


================================================
FILE: projects/sample/dynamic-apk/sample-hello-api-holder/src/main/java/com/tencent/shadow/sample/apk/hello/HelloWorldUpdater.java
================================================
/*
 * Tencent is pleased to support the open source community by making Tencent Shadow available.
 * Copyright (C) 2019 THL A29 Limited, a Tencent company.  All rights reserved.
 *
 * Licensed under the BSD 3-Clause License (the "License"); you may not use
 * this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 *     https://opensource.org/licenses/BSD-3-Clause
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.tencent.shadow.sample.apk.hello;

import java.io.File;
import java.util.concurrent.Future;

/**
 * apk文件升级器
 * <p>
 * 注意这个类不负责什么时候该升级 实现IHelloWorld的apk文件,
 * 它只提供需要升级时的功能,如下载和向远端查询文件是否还可用。
 */
public interface HelloWorldUpdater {
    /**
     * 更新
     */
    Future<File> update();

    /**
     * 获取本地最新可用的
     *
     * @return <code>null</code>表示本地没有可用的
     */
    File getLatest();
}


================================================
FILE: projects/sample/dynamic-apk/sample-hello-apk/.gitignore
================================================
/build


================================================
FILE: projects/sample/dynamic-apk/sample-hello-apk/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    compileSdkVersion project.COMPILE_SDK_VERSION
    defaultConfig {
        //region hello.apk 演示
        applicationId 'com.tencent.shadow.sample.hello.host' // 必须保证和 host 的 applicationId 一致
        //endregion
        minSdkVersion project.MIN_SDK_VERSION
        targetSdkVersion project.TARGET_SDK_VERSION
        versionCode project.VERSION_CODE
        versionName project.VERSION_NAME
    }
    buildTypes {
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

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

            signingConfig signingConfigs.create("release")
            signingConfig.initWith(buildTypes.debug.signingConfig)
        }
    }
    lintOptions {
        abortOnError false
    }
}

dependencies {
    // 自定义接口在宿主内
    // hello.apk 不必要自己打包一份,只需要通过白名单访问宿主的接口定义,所以是 compileOnly
    compileOnly project(":sample-hello-api")
}


================================================
FILE: projects/sample/dynamic-apk/sample-hello-apk/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

-keep class org.slf4j.**{*;}
-keep class com.tencent.shadow.dynamic.impl.**{*;}

-keep class com.tencent.shadow.dynamic.loader.**{*;}


================================================
FILE: projects/sample/dynamic-apk/sample-hello-apk/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.tencent.shadow.sample.manager" />



================================================
FILE: projects/sample/dynamic-apk/sample-hello-apk/src/main/java/com/tencent/shadow/dynamic/impl/HelloFactoryImpl.java
================================================
package com.tencent.shadow.dynamic.impl;

import android.content.Context;

import com.tencent.shadow.sample.api.hello.HelloFactory;
import com.tencent.shadow.sample.api.hello.IHelloWorldImpl;
import com.tencent.shadow.sample.api.hello.SampleHelloWorld;

/**
 * @author 林学渊
 * @email linxy59@mail2.sysu.edu.cn
 * @date 2021/9/6
 * @description 此类包名及类名固定
 * @usage null
 */
public final class HelloFactoryImpl implements HelloFactory {
    @Override
    public IHelloWorldImpl build(Context context) {
        return new SampleHelloWorld();
    }
}


================================================
FILE: projects/sample/dynamic-apk/sample-hello-apk/src/main/java/com/tencent/shadow/dynamic/impl/WhiteList.java
================================================
/*
 * Tencent is pleased to support the open source community by making Tencent Shadow available.
 * Copyright (C) 2019 THL A29 Limited, a Tencent company.  All rights reserved.
 *
 * Licensed under the BSD 3-Clause License (the "License"); you may not use
 * this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 *     https://opensource.org/licenses/BSD-3-Clause
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.tencent.shadow.dynamic.impl;

/**
 * 此类包名及类名固定
 * classLoader的白名单
 * hello.apk 可以加载宿主中位于白名单内的类
 */
public interface WhiteList {
    String[] sWhiteList = new String[]
            {
                    "com.tencent.host.shadow",
                    "com.tencent.shadow.test.lib.constant",
            };
}


================================================
FILE: projects/sample/dynamic-apk/sample-hello-apk/src/main/java/com/tencent/shadow/sample/api/hello/SampleHelloWorld.java
================================================
package com.tencent.shadow.sample.api.hello;

import android.content.Context;
import android.os.Bundle;
import android.widget.TextView;

/**
 * @author 林学渊
 * @email linxy59@mail2.sysu.edu.cn
 * @date 2021/9/6
 * @description 实现宿主自定义接口
 * @usage null
 */
public class SampleHelloWorld implements IHelloWorldImpl {
    @Override
    public void sayHelloWorld(Context context, TextView textView) {
        String text = "这是apk中的实现:" + SampleHelloWorld.class.toString();
        if (textView == null) {
            return;
        }
        textView.setText(text);
    }

    @Override
    public void onCreate(Bundle bundle) {

    }

    @Override
    public void onSaveInstanceState(Bundle outState) {

    }

    @Override
    public void onDestroy() {

    }
}


================================================
FILE: projects/sample/dynamic-apk/sample-hello-apk/src/main/res/layout/activity_load_plugin.xml
================================================
<?xml version="1.0" encoding="utf-8"?><!--
  ~ Tencent is pleased to support the open source community by making Tencent Shadow available.
  ~ Copyright (C) 2019 THL A29 Limited, a Tencent company.  All rights reserved.
  ~
  ~ Licensed under the BSD 3-Clause License (the "License"); you may not use
  ~ this file except in compliance with the License. You may obtain a copy of
  ~ the License at
  ~
  ~     https://opensource.org/licenses/BSD-3-Clause
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  ~
  -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#fcfcfc"
    android:padding="16dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/black"
        android:layout_marginTop="20dp"
        android:textSize="30sp"
        android:text="这是一个位于dynamic-pluginmanager-apk中的view" />

    <ProgressBar
        android:layout_marginTop="30dp"
        android:layout_gravity="center"
        android:layout_width="60dp"
        android:layout_height="60dp" />
</LinearLayout>

================================================
FILE: projects/sample/dynamic-apk/sample-hello-host/.gitignore
================================================
/build


================================================
FILE: projects/sample/dynamic-apk/sample-hello-host/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    compileSdkVersion project.COMPILE_SDK_VERSION
    defaultConfig {
        //region hello.apk 演示
        applicationId 'com.tencent.shadow.sample.hello.host'
        //endregion
        minSdkVersion project.MIN_SDK_VERSION
        targetSdkVersion project.TARGET_SDK_VERSION
        versionCode project.VERSION_CODE
        versionName project.VERSION_NAME
        testInstrumentationRunner "com.tencent.shadow.test.CustomAndroidJUnitRunner"
    }
    buildTypes {
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

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

            signingConfig signingConfigs.create("release")
            signingConfig.initWith(buildTypes.debug.signingConfig)
        }
    }
    //region hello.apk 演示
    sourceSets {
        debug {
            assets.srcDir('build/generated/assets/sample-hello-apk/debug/')
        }
        release {
            assets.srcDir('build/generated/assets/sample-hello-apk/release/')
        }
    }
    //endregion
    lintOptions {
        checkReleaseBuilds false
        abortOnError false
    }
}

dependencies {
    implementation "commons-io:commons-io:$commons_io_android_version"//sample-hello-host从assets中复制插件用的
    implementation "org.slf4j:slf4j-api:$slf4j_version"

    //region hello.apk 演示
    implementation project(':sample-hello-api-holder')
    //endregion
}

def createCopyTask(projectName, buildType, name, apkName, inputFile, taskName) {
    def outputFile = file("${getBuildDir()}/generated/assets/${name}/${buildType}/${apkName}")
    outputFile.getParentFile().mkdirs()
    return tasks.create("copy${buildType.capitalize()}${name.capitalize()}Task", Copy) {
        group = 'build'
        description = "复制${name}到assets中."
        from(inputFile.getParent()) {
            include(inputFile.name)
            rename { outputFile.name }
        }
        into(outputFile.getParent())

    }.dependsOn("${projectName}:${taskName}")
}

//region hello.apk 演示
def generateHelloAssets(generateAssetsTask, buildType) {
    def moduleName = 'sample-hello-apk'
    def pluginManagerApkFile = file(
            "${project(":sample-hello-apk").getBuildDir()}" +
                    "/outputs/apk/${buildType}/" +
                    "${moduleName}-${buildType}.apk"
    )
    generateAssetsTask.dependsOn createCopyTask(
            ':sample-hello-apk',
            buildType,
            moduleName,
            'hello.apk',
            pluginManagerApkFile,
            "assemble${buildType.capitalize()}"
    )
}
//endregion

tasks.whenTaskAdded { task ->
    if (task.name == "generateDebugAssets") {
        //region hello.apk 演示
        generateHelloAssets(task, 'debug')
        //endregion
    }
    if (task.name == "generateReleaseAssets") {
        //region hello.apk 演示
        generateHelloAssets(task, 'release')
        //endregion
    }
}

================================================
FILE: projects/sample/dynamic-apk/sample-hello-host/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

-keep class org.slf4j.**{*;}
-dontwarn org.slf4j.impl.**

-keep class com.tencent.shadow.dynamic.host.**{*;}
-keep class com.tencent.shadow.core.common.**{*;}
-keep class com.tencent.shadow.core.runtime.container.**{*;}


================================================
FILE: projects/sample/dynamic-apk/sample-hello-host/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.tencent.shadow.sample.hello.host">

    <application
        android:allowBackup="true"
        android:label="Shadow 自定义接口动态化 App"
        android:name="com.tencent.shadow.sample.host.HostApplication"
        android:theme="@android:style/Theme.DeviceDefault"
        android:usesCleartextTraffic="true"
        tools:ignore="GoogleAppIndexingWarning">
        <activity android:name="com.tencent.shadow.sample.host.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

================================================
FILE: projects/sample/dynamic-apk/sample-hello-host/src/main/java/com/tencent/shadow/sample/host/AndroidLogLoggerFactory.java
================================================
/*
 * Tencent is pleased to support the open source community by making Tencent Shadow available.
 * Copyright (C) 2019 THL A29 Limited, a Tencent company.  All rights reserved.
 *
 * Licensed under the BSD 3-Clause License (the "License"); you may not use
 * this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 *     https://opensource.org/licenses/BSD-3-Clause
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.tencent.shadow.sample.host;

import android.util.Log;

import com.tencent.shadow.core.common.ILoggerFactory;
import com.tencent.shadow.core.common.Logger;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

public class AndroidLogLoggerFactory implements ILoggerFactory {

    private static final int LOG_LEVEL_TRACE = 5;
    private static final int LOG_LEVEL_DEBUG = 4;
    private static final int LOG_LEVEL_INFO = 3;
    private static final int LOG_LEVEL_WARN = 2;
    private static final int LOG_LEVEL_ERROR = 1;

    private static AndroidLogLoggerFactory sInstance = new AndroidLogLoggerFactory();

    public static ILoggerFactory getInstance() {
        return sInstance;
    }

    final private ConcurrentMap<String, Logger> loggerMap = new ConcurrentHashMap<String, Logger>();

    public Logger getLogger(String name) {
        Logger simpleLogger = loggerMap.get(name);
        if (simpleLogger != null) {
            return simpleLogger;
        } else {
            Logger newInstance = new IVLogger(name);
            Logger oldInstance = loggerMap.putIfAbsent(name, newInstance);
            return oldInstance == null ? newInstance : oldInstance;
        }
    }

    class IVLogger implements Logger {
        private String name;

        IVLogger(String name) {
            this.name = name;
        }

        @Override
        public String getName() {
            return name;
        }

        private void log(int level, String message, Throwable t) {
            final String tag = String.valueOf(name);

            switch (level) {
                case LOG_LEVEL_TRACE:
                case LOG_LEVEL_DEBUG:
                    if (t == null)
                        Log.d(tag, message);
                    else
                        Log.d(tag, message, t);
                    break;
                case LOG_LEVEL_INFO:
                    if (t == null)
                        Log.i(tag, message);
                    else
                        Log.i(tag, message, t);
                    break;
                case LOG_LEVEL_WARN:
                    if (t == null)
                        Log.w(tag, message);
                    else
                        Log.w(tag, message, t);
                    break;
                case LOG_LEVEL_ERROR:
                    if (t == null)
                        Log.e(tag, message);
                    else
                        Log.e(tag, message, t);
                    break;
                default:
                    break;
            }
        }

        @Override
        public boolean isTraceEnabled() {
            return true;
        }

        @Override
        public void trace(String msg) {
            log(LOG_LEVEL_TRACE, msg, null);
        }

        @Override
        public void trace(String format, Object o) {
            FormattingTuple tuple = MessageFormatter.format(format, o);
            log(LOG_LEVEL_TRACE, tuple.getMessage(), null);
        }

        @Override
        public void trace(String format, Object o, Object o1) {
            FormattingTuple tuple = MessageFormatter.format(format, o, o1);
            log(LOG_LEVEL_TRACE, tuple.getMessage(), null);
        }

        @Override
        public void trace(String format, Object... objects) {
            FormattingTuple tuple = MessageFormatter.arrayFormat(format, objects);
            log(LOG_LEVEL_TRACE, tuple.getMessage(), null);
        }

        @Override
        public void trace(String msg, Throwable throwable) {
            log(LOG_LEVEL_TRACE, msg, throwable);
        }

        @Override
        public boolean isDebugEnabled() {
            return true;
        }

        @Override
        public void debug(String msg) {
            log(LOG_LEVEL_DEBUG, msg, null);
        }

        @Override
        public void debug(String format, Object o) {
            FormattingTuple tuple = MessageFormatter.format(format, o);
            log(LOG_LEVEL_DEBUG, tuple.getMessage(), null);
        }

        @Override
        public void debug(String format, Object o, Object o1) {
            FormattingTuple tuple = MessageFormatter.format(format, o, o1);
            log(LOG_LEVEL_DEBUG, tuple.getMessage(), null);
        }

        @Override
        public void debug(String format, Object... objects) {
            FormattingTuple tuple = MessageFormatter.arrayFormat(format, objects);
            log(LOG_LEVEL_DEBUG, tuple.getMessage(), null);
        }

        @Override
        public void debug(String msg, Throwable throwable) {
            log(LOG_LEVEL_DEBUG, msg, throwable);
        }

        @Override
        public boolean isInfoEnabled() {
            return true;
        }

        @Override
        public void info(String msg) {
            log(LOG_LEVEL_INFO, msg, null);
        }

        @Override
        public void info(String format, Object o) {
            FormattingTuple tuple = MessageFormatter.format(format, o);
            log(LOG_LEVEL_INFO, tuple.getMessage(), null);
        }

        @Override
        public void info(String format, Object o, Object o1) {
            FormattingTuple tuple = MessageFormatter.format(format, o, o1);
            log(LOG_LEVEL_INFO, tuple.getMessage(), null);
        }

        @Override
        public void info(String format, Object... objects) {
            FormattingTuple tuple = MessageFormatter.arrayFormat(format, objects);
            log(LOG_LEVEL_INFO, tuple.getMessage(), null);
        }

        @Override
        public void info(String msg, Throwable throwable) {
            log(LOG_LEVEL_INFO, msg, throwable);
        }

        @Override
        public boolean isWarnEnabled() {
            return true;
        }

        @Override
        public void warn(String msg) {
            log(LOG_LEVEL_WARN, msg, null);
        }

        @Override
        public void warn(String format, Object o) {
            FormattingTuple tuple = MessageFormatter.format(format, o);
            log(LOG_LEVEL_WARN, tuple.getMessage(), null);
        }

        @Override
        public void warn(String format, Object o, Object o1) {
            FormattingTuple tuple = MessageFormatter.format(format, o, o1);
            log(LOG_LEVEL_WARN, tuple.getMessage(), null);
        }

        @Override
        public void warn(String format, Object... objects) {
            FormattingTuple tuple = MessageFormatter.arrayFormat(format, objects);
            log(LOG_LEVEL_WARN, tuple.getMessage(), null);
        }

        @Override
        public void warn(String msg, Throwable throwable) {
            log(LOG_LEVEL_WARN, msg, throwable);
        }

        @Override
        public boolean isErrorEnabled() {
            return true;
        }

        @Override
        public void error(String msg) {
            log(LOG_LEVEL_ERROR, msg, null);
        }

        @Override
        public void error(String format, Object o) {
            FormattingTuple tuple = MessageFormatter.format(format, o);
            log(LOG_LEVEL_ERROR, tuple.getMessage(), null);
        }

        @Override
        public void error(String format, Object o, Object o1) {
            FormattingTuple tuple = MessageFormatter.format(format, o, o1);
            log(LOG_LEVEL_ERROR, tuple.getMessage(), null);
        }

        @Override
        public void error(String format, Object... objects) {
            FormattingTuple tuple = MessageFormatter.arrayFormat(format, objects);
            log(LOG_LEVEL_ERROR, tuple.getMessage(), null);
        }

        @Override
        public void error(String msg, Throwable throwable) {
            log(LOG_LEVEL_ERROR, msg, throwable);
        }
    }
}

class FormattingTuple {

    static public FormattingTuple NULL = new FormattingTuple(null);

    private String message;
    private Throwable throwable;
    private Object[] argArray;

    public FormattingTuple(String message) {
        this(message, null, null);
    }

    public FormattingTuple(String message, Object[] argArray, Throwable throwable) {
        this.message = message;
        this.throwable = throwable;
        this.argArray = argArray;
    }

    public String getMessage() {
        return message;
    }

    public Object[] getArgArray() {
        return argArray;
    }

    public Throwable getThrowable() {
        return throwable;
    }

}

final class MessageFormatter {
    static final char DELIM_START = '{';
    static final char DELIM_STOP = '}';
    static final String DELIM_STR = "{}";
    private static final char ESCAPE_CHAR = '\\';

    /**
     * Performs single argument substitution for the 'messagePattern' passed as
     * parameter.
     * <p>
     * For example,
     *
     * <pre>
     * MessageFormatter.format(&quot;Hi {}.&quot;, &quot;there&quot;);
     * </pre>
     * <p>
     * will return the string "Hi there.".
     * <p>
     *
     * @param messagePattern The message pattern which will be parsed and formatted
     * @param arg            The argument to be substituted in place of the formatting anchor
     * @return The formatted message
     */
    final public static FormattingTuple format(String messagePattern, Object arg) {
        return arrayFormat(messagePattern, new Object[]{arg});
    }

    /**
     * Performs a two argument substitution for the 'messagePattern' passed as
     * parameter.
     * <p>
     * For example,
     *
     * <pre>
     * MessageFormatter.format(&quot;Hi {}. My name is {}.&quot;, &quot;Alice&quot;, &quot;Bob&quot;);
     * </pre>
     * <p>
     * will return the string "Hi Alice. My name is Bob.".
     *
     * @param messagePattern The message pattern which will be parsed and formatted
     * @param arg1           The argument to be substituted in place of the first formatting
     *                       anchor
     * @param arg2           The argument to be substituted in place of the second formatting
     *                       anchor
     * @return The formatted message
     */
    final public static FormattingTuple format(final String messagePattern, Object arg1, Object arg2) {
        return arrayFormat(messagePattern, new Object[]{arg1, arg2});
    }


    static final Throwable getThrowableCandidate(Object[] argArray) {
        if (argArray == null || argArray.length == 0) {
            return null;
        }

        final Object lastEntry = argArray[argArray.length - 1];
        if (lastEntry instanceof Throwable) {
            return (Throwable) lastEntry;
        }
        return null;
    }

    final public static FormattingTuple arrayFormat(final String messagePattern, final Object[] argArray) {
        Throwable throwableCandidate = getThrowableCandidate(argArray);
        Object[] args = argArray;
        if (throwableCandidate != null) {
            args = trimmedCopy(argArray);
        }
        return arrayFormat(messagePattern, args, throwableCandidate);
    }

    private static Object[] trimmedCopy(Object[] argArray) {
        if (argArray == null || argArray.length == 0) {
            throw new IllegalStateException("non-sensical empty or null argument array");
        }
        final int trimemdLen = argArray.length - 1;
        Object[] trimmed = new Object[trimemdLen];
        System.arraycopy(argArray, 0, trimmed, 0, trimemdLen);
        return trimmed;
    }

    final public static FormattingTuple arrayFormat(final String messagePattern, final Object[] argArray, Throwable throwable) {

        if (messagePattern == null) {
            return new FormattingTuple(null, argArray, throwable);
        }

        if (argArray == null) {
            return new FormattingTuple(messagePattern);
        }

        int i = 0;
        int j;
        // use string builder for better multicore performance
        StringBuilder sbuf = new StringBuilder(messagePattern.length() + 50);

        int L;
        for (L = 0; L < argArray.length; L++) {

            j = messagePattern.indexOf(DELIM_STR, i);

            if (j == -1) {
                // no more variables
                if (i == 0) { // this is a simple string
                    return new FormattingTuple(messagePattern, argArray, throwable);
                } else { // add the tail string which contains no variables and return
                    // the result.
                    sbuf.append(messagePattern, i, messagePattern.length());
                    return new FormattingTuple(sbuf.toString(), argArray, throwable);
                }
            } else {
                if (isEscapedDelimeter(messagePattern, j)) {
                    if (!isDoubleEscaped(messagePattern, j)) {
                        L--; // DELIM_START was escaped, thus should not be incremented
                        sbuf.append(messagePattern, i, j - 1);
                        sbuf.append(DELIM_START);
                        i = j + 1;
                    } else {
                        // The escape character preceding the delimiter start is
                        // itself escaped: "abc x:\\{}"
                        // we have to consume one backward slash
                        sbuf.append(messagePattern, i, j - 1);
                        deeplyAppendParameter(sbuf, argArray[L], new HashMap<Object[], Object>());
                        i = j + 2;
                    }
                } else {
                    // normal case
                    sbuf.append(messagePattern, i, j);
                    deeplyAppendParameter(sbuf, argArray[L], new HashMap<Object[], Object>());
                    i = j + 2;
                }
            }
        }
        // append the characters following the last {} pair.
        sbuf.append(messagePattern, i, messagePattern.length());
        return new FormattingTuple(sbuf.toString(), argArray, throwable);
    }

    final static boolean isEscapedDelimeter(String messagePattern, int delimeterStartIndex) {

        if (delimeterStartIndex == 0) {
            return false;
        }
        char potentialEscape = messagePattern.charAt(delimeterStartIndex - 1);
        if (potentialEscape == ESCAPE_CHAR) {
            return true;
        } else {
            return false;
        }
    }

    final static boolean isDoubleEscaped(String messagePattern, int delimeterStartIndex) {
        if (delimeterStartIndex >= 2 && messagePattern.charAt(delimeterStartIndex - 2) == ESCAPE_CHAR) {
            return true;
        } else {
            return false;
        }
    }

    // special treatment of array values was suggested by 'lizongbo'
    private static void deeplyAppendParameter(StringBuilder sbuf, Object o, Map<Object[], Object> seenMap) {
        if (o == null) {
            sbuf.append("null");
            return;
        }
        if (!o.getClass().isArray()) {
            safeObjectAppend(sbuf, o);
        } else {
            // check for primitive array types because they
            // unfortunately cannot be cast to Object[]
            if (o instanceof boolean[]) {
                booleanArrayAppend(sbuf, (boolean[]) o);
            } else if (o instanceof byte[]) {
                byteArrayAppend(sbuf, (byte[]) o);
            } else if (o instanceof char[]) {
                charArrayAppend(sbuf, (char[]) o);
            } else if (o instanceof short[]) {
                shortArrayAppend(sbuf, (short[]) o);
            } else if (o instanceof int[]) {
                intArrayAppend(sbuf, (int[]) o);
            } else if (o instanceof long[]) {
                longArrayAppend(sbuf, (long[]) o);
            } else if (o instanceof float[]) {
                floatArrayAppend(sbuf, (float[]) o);
            } else if (o instanceof double[]) {
                doubleArrayAppend(sbuf, (double[]) o);
            } else {
                objectArrayAppend(sbuf, (Object[]) o, seenMap);
            }
        }
    }

    private static void safeObjectAppend(StringBuilder sbuf, Object o) {
        try {
            String oAsString = o.toString();
            sbuf.append(oAsString);
        } catch (Throwable t) {
            sbuf.append("[FAILED toString()]");
        }

    }

    private static void objectArrayAppend(StringBuilder sbuf, Object[] a, Map<Object[], Object> seenMap) {
        sbuf.append('[');
        if (!seenMap.containsKey(a)) {
            seenMap.put(a, null);
            final int len = a.length;
            for (int i = 0; i < len; i++) {
                deeplyAppendParameter(sbuf, a[i], seenMap);
                if (i != len - 1)
                    sbuf.append(", ");
            }
            // allow repeats in siblings
            seenMap.remove(a);
        } else {
            sbuf.append("...");
        }
        sbuf.append(']');
    }

    private static void booleanArrayAppend(StringBuilder sbuf, boolean[] a) {
        sbuf.append('[');
        final int len = a.length;
        for (int i = 0; i < len; i++) {
            sbuf.append(a[i]);
            if (i != len - 1)
                sbuf.append(", ");
        }
        sbuf.append(']');
    }

    private static void byteArrayAppend(StringBuilder sbuf, byte[] a) {
        sbuf.append('[');
        final int len = a.length;
        for (int i = 0; i < len; i++) {
            sbuf.append(a[i]);
            if (i != len - 1)
                sbuf.append(", ");
        }
        sbuf.append(']');
    }

    private static void charArrayAppend(StringBuilder sbuf, char[] a) {
        sbuf.append('[');
        final int len = a.length;
        for (int i = 0; i < len; i++) {
            sbuf.append(a[i]);
            if (i != len - 1)
                sbuf.append(", ");
        }
        sbuf.append(']');
    }

    private static void shortArrayAppend(StringBuilder sbuf, short[] a) {
        sbuf.append('[');
        final int len = a.length;
        for (int i = 0; i < len; i++) {
            sbuf.append(a[i]);
            if (i != len - 1)
                sbuf.append(", ");
        }
        sbuf.append(']');
    }

    private static void intArrayAppend(StringBuilder sbuf, int[] a) {
        sbuf.append('[');
        final int len = a.length;
        for (int i = 0; i < len; i++) {
            sbuf.append(a[i]);
            if (i != len - 1)
                sbuf.append(", ");
        }
        sbuf.append(']');
    }

    private static void longArrayAppend(StringBuilder sbuf, long[] a) {
        sbuf.append('[');
        final int len = a.length;
        for (int i = 0; i < len; i++) {
            sbuf.append(a[i]);
            if (i != len - 1)
                sbuf.append(", ");
        }
        sbuf.append(']');
    }

    private static void floatArrayAppend(StringBuilder sbuf, float[] a) {
        sbuf.append('[');
        final int len = a.length;
        for (int i = 0; i < len; i++) {
            sbuf.append(a[i]);
            if (i != len - 1)
                sbuf.append(", ");
        }
        sbuf.append(']');
    }

    private static void doubleArrayAppend(StringBuilder sbuf, double[] a) {
        sbuf.append('[');
        final int len = a.length;
        for (int i = 0; i < len; i++) {
            sbuf.append(a[i]);
            if (i != len - 1)
                sbuf.append(", ");
        }
        sbuf.append(']');
    }

}



================================================
FILE: projects/sample/dynamic-apk/sample-hello-host/src/main/java/com/tencent/shadow/sample/host/HostApplication.java
================================================
/*
 * Tencent is pleased to support the open source community by making Tencent Shadow available.
 * Copyright (C) 2019 THL A29 Limited, a Tencent company.  All rights reserved.
 *
 * Licensed under the BSD 3-Clause License (the "License"); you may not use
 * this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 *     https://opensource.org/licenses/BSD-3-Clause
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.tencent.shadow.sample.host;

import android.app.Application;
import android.os.Build;
import android.os.StrictMode;
import android.webkit.WebView;

import com.tencent.shadow.core.common.LoggerFactory;

public class HostApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        detectNonSdkApiUsageOnAndroidP();
        setWebViewDataDirectorySuffix();

        LoggerFactory.setILoggerFactory(new AndroidLogLoggerFactory());
        PluginHelper.getInstance().init(this);
    }

    private static void setWebViewDataDirectorySuffix() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
            return;
        }
        WebView.setDataDirectorySuffix(Application.getProcessName());
    }

    private static void detectNonSdkApiUsageOnAndroidP() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
            return;
        }
        StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
        builder.detectNonSdkApiUsage();
        StrictMode.setVmPolicy(builder.build());
    }
}


================================================
FILE: projects/sample/dynamic-apk/sample-hello-host/src/main/java/com/tencent/shadow/sample/host/MainActivity.java
================================================
/*
 * Tencent is pleased to support the open source community by making Tencent Shadow available.
 * Copyright (C) 2019 THL A29 Limited, a Tencent company.  All rights reserved.
 *
 * Licensed under the BSD 3-Clause License (the "License"); you may not use
 * this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 *     https://opensource.org/licenses/BSD-3-Clause
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.tencent.shadow.sample.host;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.tencent.shadow.sample.api.hello.IHelloWorld;
import com.tencent.shadow.sample.host.api.HelloWorldApiHolder;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(android.R.style.Theme_NoTitleBar);

        LinearLayout rootView = new LinearLayout(this);
        rootView.setOrientation(LinearLayout.VERTICAL);

        rootView.addView(createTextView("演示自定义 api 的动态化,宿主 api 的实现在 hello.apk 中", null));

        final TextView textView = createTextView("等待apk实现", null);
        rootView.addView(createButton("宿主自定义接口的动态化", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PluginHelper.getInstance().singlePool.execute(new Runnable() {
                    @Override
                    public void run() {
                        //hello.apk 里实现了 IHelloWorld
                        final IHelloWorld api = HelloWorldApiHolder.getHelloWorld(PluginHelper.getInstance().helloApkFile);
                        if (api == null) {
                            return;
                        }
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                api.sayHelloWorld(MainActivity.this, textView);
                            }
                        });
                    }
                });
            }
        }));
        rootView.addView(textView);

        setContentView(rootView);
    }

    public Button createButton(String title, View.OnClickListener listener) {
        Button button = new Button(this);
        button.setText(title);
        button.setOnClickListener(listener);
        return button;
    }

    public TextView createTextView(String title, View.OnClickListener listener) {
        TextView textView = new TextView(this);
        textView.setText(title);
        textView.setOnClickListener(listener);
        return textView;
    }
}


================================================
FILE: projects/sample/dynamic-apk/sample-hello-host/src/main/java/com/tencent/shadow/sample/host/PluginHelper.java
================================================
/*
 * Tencent is pleased to support the open source community by making Tencent Shadow available.
 * Copyright (C) 2019 THL A29 Limited, a Tencent company.  All rights reserved.
 *
 * Licensed under the BSD 3-Clause License (the "License"); you may not use
 * this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 *     https://opensource.org/licenses/BSD-3-Clause
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.tencent.shadow.sample.host;

import android.content.Context;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class PluginHelper {

    /**
     * 动态加载的 hello.apk
     */
    public final static String sHelloApkName = "hello.apk";

    public File helloApkFile;

    public ExecutorService singlePool = Executors.newSingleThreadExecutor();

    private Context mContext;

    private static PluginHelper sInstance = new PluginHelper();

    public static PluginHelper getInstance() {
        return sInstance;
    }

    private PluginHelper() {
    }

    public void init(Context context) {
        helloApkFile = new File(context.getFilesDir(), sHelloApkName);

        mContext = context.getApplicationContext();

        singlePool.execute(new Runnable() {
            @Override
            public void run() {
                preparePlugin();
            }
        });

    }

    private void preparePlugin() {
        try {
            InputStream is = mContext.getAssets().open(sHelloApkName);
            FileUtils.copyInputStreamToFile(is, helloApkFile);
        } catch (IOException e) {
            throw new RuntimeException("从assets中复制apk出错", e);
        }
    }


}


================================================
FILE: projects/sample/dynamic-apk/sample-hello-host/src/main/java/com/tencent/shadow/sample/host/api/FixedPathPmUpdater.java
================================================
/*
 * Tencent is pleased to support the open source community by making Tencent Shadow available.
 * Copyright (C) 2019 THL A29 Limited, a Tencent company.  All rights reserved.
 *
 * Licensed under the BSD 3-Clause License (the "License"); you may not use
 * this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 *     https://opensource.org/licenses/BSD-3-Clause
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.tencent.shadow.sample.host.api;

import com.tencent.shadow.sample.apk.hello.HelloWorldUpdater;

import java.io.File;
import java.util.concurrent.Future;

public class FixedPathPmUpdater implements HelloWorldUpdater {

    final private File apk;

    FixedPathPmUpdater(File apk) {
        this.apk = apk;
    }

    @Override
    public Future<File> update() {
        return null;
    }

    @Override
    public File getLatest() {
        return apk;
    }
}

================================================
FILE: projects/sample/dynamic-apk/sample-hello-host/src/main/java/com/tencent/shadow/sample/host/api/HelloWorldApiHolder.java
================================================
/*
 * Tencent is pleased to support the open source community by making Tencent Shadow available.
 * Copyright (C) 2019 THL A29 Limited, a Tencent company.  All rights reserved.
 *
 * Licensed under the BSD 3-Clause License (the "License"); you may not use
 * this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 *     https://opensource.org/licenses/BSD-3-Clause
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.tencent.shadow.sample.host.api;

import com.tencent.shadow.sample.api.hello.IHelloWorld;
import com.tencent.shadow.sample.apk.hello.DynamicHello;

import java.io.File;

public class HelloWorldApiHolder {

    public static IHelloWorld getHelloWorld(File apk) {
        final FixedPathPmUpdater fixedPathPmUpdater = new FixedPathPmUpdater(apk);
        File tempPm = fixedPathPmUpdater.getLatest();
        if (tempPm != null) {
            return new DynamicHello(fixedPathPmUpdater);
        }
        return null;
    }

}


================================================
FILE: projects/sample/maven/host-project/.gitignore
================================================
*.iml
.gradle
/local.properties
.idea
.DS_Store
/build
/captures
.externalNativeBuild


================================================
FILE: projects/sample/maven/host-project/build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.shadow_version = '2.2.1'
    repositories {
        if (!System.getenv().containsKey("DISABLE_TENCENT_MAVEN_MIRROR")) {
            maven { url 'https://mirrors.tencent.com/nexus/repository/maven-public/' }
        } else {
            google()
            mavenCentral()
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.0.2'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        if (!System.getenv().containsKey("DISABLE_TENCENT_MAVEN_MIRROR")) {
            maven { url 'https://mirrors.tencent.com/nexus/repository/maven-public/' }
        } else {
            google()
            mavenCentral()
        }
        maven {
            name = "GitHubPackages"
            url "https://maven.pkg.github.com/tencent/shadow"
            //一个只读账号兼容Github Packages暂时不支持匿名下载
            //https://github.community/t/download-from-github-package-registry-without-authentication/14407
            credentials {
                username = 'readonlypat'
                password = '\u0067hp_s3VOOZnLf1bTyvHWblPfaessrVYyEU4JdNbs'
            }
        }
        mavenLocal()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


================================================
FILE: projects/sample/maven/host-project/gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
#distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-bin.zip
distributionUrl=https\://mirrors.tencent.com/gradle/gradle-6.6.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists


================================================
FILE: projects/sample/maven/host-project/gradle.properties
================================================
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx4096m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official


================================================
FILE: projects/sample/maven/host-project/gradlew
================================================
#!/usr/bin/env sh

#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn () {
    echo "$*"
}

die () {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
  NONSTOP* )
    nonstop=true
    ;;
esac

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Escape application args
save () {
    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
    echo " "
}
APP_ARGS=$(save "$@")

# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"

# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
  cd "$(dirname "$0")"
fi

exec "$JAVACMD" "$@"


================================================
FILE: projects/sample/maven/host-project/gradlew.bat
================================================
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem      https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem

@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windows variants

if not "%OS%" == "Windows_NT" goto win9xME_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: projects/sample/maven/host-project/introduce-shadow-lib/.gitignore
================================================
/build


================================================
FILE: projects/sample/maven/host-project/introduce-shadow-lib/build.gradle
================================================
apply plugin: 'com.android.library'

android {
    compileSdkVersion 29


    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
    }

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

}

dependencies {
    implementation "com.tencent.shadow.dynamic:host:$shadow_version"
}


================================================
FILE: projects/sample/maven/host-project/introduce-shadow-lib/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: projects/sample/maven/host-project/introduce-shadow-lib/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tencent.shadow.sample.introduce_shadow_lib">

    <application>
        <service
            android:name=".MainPluginProcessService"
            android:process=":plugin" />

        <!--container 注册
          注意configChanges需要全注册
          theme需要注册成透明

          这些类不打包在host中,打包在runtime中,以便减少宿主方法数增量
          -->
        <activity
            android:name="com.tencent.shadow.sample.runtime.PluginDefaultProxyActivity"
            android:launchMode="standard"
            android:screenOrientation="portrait"
            android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|screenLayout|fontScale|uiMode|orientation|screenSize|smallestScreenSize|layoutDirection"
            android:hardwareAccelerated="true"
            android:theme="@style/PluginContainerActivity"
            android:process=":plugin" />

        <activity
            android:name="com.tencent.shadow.sample.runtime.PluginSingleInstance1ProxyActivity"
            android:launchMode="singleInstance"
            android:screenOrientation="portrait"
            android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|screenLayout|fontScale|uiMode|orientation|screenSize|smallestScreenSize|layoutDirection"
            android:hardwareAccelerated="true"
            android:theme="@style/PluginContainerActivity"
            android:process=":plugin" />

        <activity
            android:name="com.tencent.shadow.sample.runtime.PluginSingleTask1ProxyActivity"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|screenLayout|fontScale|uiMode|orientation|screenSize|smallestScreenSize|layoutDirection"
            android:hardwareAccelerated="true"
            android:theme="@style/PluginContainerActivity"
            android:process=":plugin" />

        <provider
            android:authorities="com.tencent.shadow.contentprovider.authority.dynamic"
            android:name="com.tencent.shadow.core.runtime.container.PluginContainerContentProvider" />
        <!--container 注册 end -->
    </application>
</manifest>


================================================
FILE: projects/sample/maven/host-project/introduce-shadow-lib/src/main/java/com/tencent/shadow/sample/introduce_shadow_lib/AndroidLoggerFactory.java
================================================
package com.tencent.shadow.sample.introduce_shadow_lib;

import android.util.Log;

import com.tencent.shadow.core.common.ILoggerFactory;
import com.tencent.shadow.core.common.Logger;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

public class AndroidLoggerFactory implements ILoggerFactory {

    private static final int LOG_LEVEL_TRACE = 5;
    private static final int LOG_LEVEL_DEBUG = 4;
    private static final int LOG_LEVEL_INFO = 3;
    private static final int LOG_LEVEL_WARN = 2;
    private static final int LOG_LEVEL_ERROR = 1;

    private static AndroidLoggerFactory sInstance = new AndroidLoggerFactory();

    public static ILoggerFactory getInstance() {
        return sInstance;
    }

    final private ConcurrentMap<String, Logger> loggerMap = new ConcurrentHashMap<String, Logger>();

    public Logger getLogger(String name) {
        Logger simpleLogger = loggerMap.get(name);
        if (simpleLogger != null) {
            return simpleLogger;
        } else {
            Logger newInstance = new IVLogger(name);
            Logger oldInstance = loggerMap.putIfAbsent(name, newInstance);
            return oldInstance == null ? newInstance : oldInstance;
        }
    }

    class IVLogger implements Logger {
        private String name;

        IVLogger(String name) {
            this.name = name;
        }

        @Override
        public String getName() {
            return name;
        }

        private void log(int level, String message, Throwable t) {
            final String tag = String.valueOf(name);

            switch (level) {
                case LOG_LEVEL_TRACE:
                case LOG_LEVEL_DEBUG:
                    if (t == null)
                        Log.d(tag, message);
                    else
                        Log.d(tag, message, t);
                    break;
                case LOG_LEVEL_INFO:
                    if (t == null)
                        Log.i(tag, message);
                    else
                        Log.i(tag, message, t);
                    break;
                case LOG_LEVEL_WARN:
                    if (t == null)
                        Log.w(tag, message);
                    else
                        Log.w(tag, message, t);
                    break;
                case LOG_LEVEL_ERROR:
                    if (t == null)
                        Log.e(tag, message);
                    else
                        Log.e(tag, message, t);
                    break;
                default:
                    break;
            }
        }

        @Override
        public boolean isTraceEnabled() {
            return true;
        }

        @Override
        public void trace(String msg) {
            log(LOG_LEVEL_TRACE, msg, null);
        }

        @Override
        public void trace(String format, Object o) {
            FormattingTuple tuple = MessageFormatter.format(format, o);
            log(LOG_LEVEL_TRACE, tuple.getMessage(), null);
        }

        @Override
        public void trace(String format, Object o, Object o1) {
            FormattingTuple tuple = MessageFormatter.format(format, o, o1);
            log(LOG_LEVEL_TRACE, tuple.getMessage(), null);
        }

        @Override
        public void trace(String format, Object... objects) {
            FormattingTuple tuple = MessageFormatter.arrayFormat(format, objects);
            log(LOG_LEVEL_TRACE, tuple.getMessage(), null);
        }

        @Override
        public void trace(String msg, Throwable throwable) {
            log(LOG_LEVEL_TRACE, msg, throwable);
        }

        @Override
        public boolean isDebugEnabled() {
            return true;
        }

        @Override
        public void debug(String msg) {
            log(LOG_LEVEL_DEBUG, msg, null);
        }

        @Override
        public void debug(String format, Object o) {
            FormattingTuple tuple = MessageFormatter.format(format, o);
            log(LOG_LEVEL_DEBUG, tuple.getMessage(), null);
        }

        @Override
        public void debug(String format, Object o, Object o1) {
            FormattingTuple tuple = MessageFormatter.format(format, o, o1);
            log(LOG_LEVEL_DEBUG, tuple.getMessage(), null);
        }

        @Override
        public void debug(String format, Object... objects) {
            FormattingTuple tuple = MessageFormatter.arrayFormat(format, objects);
            log(LOG_LEVEL_DEBUG, tuple.getMessage(), null);
        }

        @Override
        public void debug(String msg, Throwable throwable) {
            log(LOG_LEVEL_DEBUG, msg, throwable);
        }

        @Override
        public boolean isInfoEnabled() {
            return true;
        }

        @Override
        public void info(String msg) {
            log(LOG_LEVEL_INFO, msg, null);
        }

        @Override
        public void info(String format, Object o) {
            FormattingTuple tuple = MessageFormatter.format(format, o);
            log(LOG_LEVEL_INFO, tuple.getMessage(), null);
        }

        @Override
        public void info(String format, Object o, Object o1) {
            FormattingTuple tuple = MessageFormatter.format(format, o, o1);
            log(LOG_LEVEL_INFO, tuple.getMessage(), null);
        }

        @Override
        public void info(String format, Object... objects) {
            FormattingTuple tuple = MessageFormatter.arrayFormat(format, objects);
            log(LOG_LEVEL_INFO, tuple.getMessage(), null);
        }

        @Override
        public void info(String msg, Throwable throwable) {
            log(LOG_LEVEL_INFO, msg, throwable);
        }

        @Override
        public boolean isWarnEnabled() {
            return true;
        }

        @Override
        public void warn(String msg) {
            log(LOG_LEVEL_WARN, msg, null);
        }

        @Override
        public void warn(String format, Object o) {
            FormattingTuple tuple = MessageFormatter.format(format, o);
            log(LOG_LEVEL_WARN, tuple.getMessage(), null);
        }

        @Override
        public void warn(String format, Object o, Object o1) {
            FormattingTuple tuple = MessageFormatter.format(format, o, o1);
            log(LOG_LEVEL_WARN, tuple.getMessage(), null);
        }

        @Override
        public void warn(String format, Object... objects) {
            FormattingTuple tuple = MessageFormatter.arrayFormat(format, objects);
            log(LOG_LEVEL_WARN, tuple.getMessage(), null);
        }

        @Override
        public void warn(String msg, Throwable throwable) {
            log(LOG_LEVEL_WARN, msg, throwable);
        }

        @Override
        public boolean isErrorEnabled() {
            return true;
        }

        @Override
        public void error(String msg) {
            log(LOG_LEVEL_ERROR, msg, null);
        }

        @Override
        public void error(String format, Object o) {
            FormattingTuple tuple = MessageFormatter.format(format, o);
            log(LOG_LEVEL_ERROR, tuple.getMessage(), null);
        }

        @Override
        public void error(String format, Object o, Object o1) {
            FormattingTuple tuple = MessageFormatter.format(format, o, o1);
            log(LOG_LEVEL_ERROR, tuple.getMessage(), null);
        }

        @Override
        public void error(String format, Object... objects) {
            FormattingTuple tuple = MessageFormatter.arrayFormat(format, objects);
            log(LOG_LEVEL_ERROR, tuple.getMessage(), null);
        }

        @Override
        public void error(String msg, Throwable throwable) {
            log(LOG_LEVEL_ERROR, msg, throwable);
        }
    }
}

class FormattingTuple {

    static public FormattingTuple NULL = new FormattingTuple(null);

    private String message;
    private Throwable throwable;
    private Object[] argArray;

    public FormattingTuple(String message) {
        this(message, null, null);
    }

    public FormattingTuple(String message, Object[] argArray, Throwable throwable) {
        this.message = message;
        this.throwable = throwable;
        this.argArray = argArray;
    }

    public String getMessage() {
        return message;
    }

    public Object[] getArgArray() {
        return argArray;
    }

    public Throwable getThrowable() {
        return throwable;
    }

}

final class MessageFormatter {
    static final char DELIM_START = '{';
    static final char DELIM_STOP = '}';
    static final String DELIM_STR = "{}";
    private static final char ESCAPE_CHAR = '\\';

    /**
     * Performs single argument substitution for the 'messagePattern' passed as
     * parameter.
     * <p>
     * For example,
     *
     * <pre>
     * MessageFormatter.format(&quot;Hi {}.&quot;, &quot;there&quot;);
     * </pre>
     * <p>
     * will return the string "Hi there.".
     * <p>
     *
     * @param messagePattern The message pattern which will be parsed and formatted
     * @param arg            The argument to be substituted in place of the formatting anchor
     * @return The formatted message
     */
    final public static FormattingTuple format(String messagePattern, Object arg) {
        return arrayFormat(messagePattern, new Object[]{arg});
    }

    /**
     * Performs a two argument substitution for the 'messagePattern' passed as
     * parameter.
     * <p>
     * For example,
     *
     * <pre>
     * MessageFormatter.format(&quot;Hi {}. My name is {}.&quot;, &quot;Alice&quot;, &quot;Bob&quot;);
     * </pre>
     * <p>
     * will return the string "Hi Alice. My name is Bob.".
     *
     * @param messagePattern The message pattern which will be parsed and formatted
     * @param arg1           The argument to be substituted in place of the first formatting
     *                       anchor
     * @param arg2           The argument to be substituted in place of the second formatting
     *                       anchor
     * @return The formatted message
     */
    final public static FormattingTuple format(final String messagePattern, Object arg1, Object arg2) {
        return arrayFormat(messagePattern, new Object[]{arg1, arg2});
    }


    static final Throwable getThrowableCandidate(Object[] argArray) {
        if (argArray == null || argArray.length == 0) {
            return null;
        }

        final Object lastEntry = argArray[argArray.length - 1];
        if (lastEntry instanceof Throwable) {
            return (Throwable) lastEntry;
        }
        return null;
    }

    final public static FormattingTuple arrayFormat(final String messagePattern, final Object[] argArray) {
        Throwable throwableCandidate = getThrowableCandidate(argArray);
        Object[] args = argArray;
        if (throwableCandidate != null) {
            args = trimmedCopy(argArray);
        }
        return arrayFormat(messagePattern, args, throwableCandidate);
    }

    private static Object[] trimmedCopy(Object[] argArray) {
        if (argArray == null || argArray.length == 0) {
            throw new IllegalStateException("non-sensical empty or null argument array");
        }
        final int trimemdLen = argArray.length - 1;
        Object[] trimmed = new Object[trimemdLen];
        System.arraycopy(argArray, 0, trimmed, 0, trimemdLen);
        return trimmed;
    }

    final public static FormattingTuple arrayFormat(final String messagePattern, final Object[] argArray, Throwable throwable) {

        if (messagePattern == null) {
            return new FormattingTuple(null, argArray, throwable);
        }

        if (argArray == null) {
            return new FormattingTuple(messagePattern);
        }

        int i = 0;
        int j;
        // use string builder for better multicore performance
        StringBuilder sbuf = new StringBuilder(messagePattern.length() + 50);

        int L;
        for (L = 0; L < argArray.length; L++) {

            j = messagePattern.indexOf(DELIM_STR, i);

            if (j == -1) {
                // no more variables
                if (i == 0) { // this is a simple string
                    return new FormattingTuple(messagePattern, argArray, throwable);
                } else { // add the tail string which contains no variables and return
                    // the result.
                    sbuf.append(messagePattern, i, messagePattern.length());
                    return new FormattingTuple(sbuf.toString(), argArray, throwable);
                }
            } else {
                if (isEscapedDelimeter(messagePattern, j)) {
                    if (!isDoubleEscaped(messagePattern, j)) {
                        L--; // DELIM_START was escaped, thus should not be incremented
                        sbuf.append(messagePattern, i, j - 1);
                        sbuf.append(DELIM_START);
                        i = j + 1;
                    } else {
                        // The escape character preceding the delimiter start is
                        // itself escaped: "abc x:\\{}"
                        // we have to consume one backward slash
                        sbuf.append(messagePattern, i, j - 1);
                        deeplyAppendParameter(sbuf, argArray[L], new HashMap<Object[], Object>());
                        i = j + 2;
                    }
                } else {
                    // normal case
                    sbuf.append(messagePattern, i, j);
                    deeplyAppendParameter(sbuf, argArray[L], new HashMap<Object[], Object>());
                    i = j + 2;
                }
            }
        }
        // append the characters following the last {} pair.
        sbuf.append(messagePattern, i, messagePattern.length());
        return new FormattingTuple(sbuf.toString(), argArray, throwable);
    }

    final static boolean isEscapedDelimeter(String messagePattern, int delimeterStartIndex) {

        if (delimeterStartIndex == 0) {
            return false;
        }
        char potentialEscape = messagePattern.charAt(delimeterStartIndex - 1);
        if (potentialEscape == ESCAPE_CHAR) {
            return true;
        } else {
            return false;
        }
    }

    final static boolean isDoubleEscaped(String messagePattern, int delimeterStartIndex) {
        if (delimeterStartIndex >= 2 && messagePattern.charAt(delimeterStartIndex - 2) == ESCAPE_CHAR) {
            return true;
        } else {
            return false;
        }
    }

    // special treatment of array values was suggested by 'lizongbo'
    private static void deeplyAppendParameter(StringBuilder sbuf, Object o, Map<Object[], Object> seenMap) {
        if (o == null) {
            sbuf.append("null");
            return;
        }
        if (!o.getClass().isArray()) {
            safeObjectAppend(sbuf, o);
        } else {
            // check for primitive array types because they
            // unfortunately cannot be cast to Object[]
            if (o instanceof boolean[]) {
                booleanArrayAppend(sbuf, (boolean[]) o);
            } else if (o instanceof byte[]) {
                byteArrayAppend(sbuf, (byte[]) o);
            } else if (o instanceof char[]) {
                charArrayAppend(sbuf, (char[]) o);
            } else if (o instanceof short[]) {
                shortArrayAppend(sbuf, (short[]) o);
            } else if (o instanceof int[]) {
                intArrayAppend(sbuf, (int[]) o);
            } else if (o instanceof long[]) {
                longArrayAppend(sbuf, (long[]) o);
            } else if (o instanceof float[]) {
                floatArrayAppend(sbuf, (float[]) o);
            } else if (o instanceof double[]) {
                doubleArrayAppend(sbuf, (double[]) o);
            } else {
                objectArrayAppend(sbuf, (Object[]) o, seenMap);
            }
        }
    }

    private static void safeObjectAppend(StringBuilder sbuf, Object o) {
        try {
            String oAsString = o.toString();
            sbuf.append(oAsString);
        } catch (Throwable t) {
            sbuf.append("[FAILED toString()]");
        }

    }

    private static void objectArrayAppend(StringBuilder sbuf, Object[] a, Map<Object[], Object> seenMap) {
        sbuf.append('[');
        if (!seenMap.containsKey(a)) {
            seenMap.put(a, null);
            final int len = a.length;
            for (int i = 0; i < len; i++) {
                deeplyAppendParameter(sbuf, a[i], seenMap);
                if (i != len - 1)
                    sbuf.append(", ");
            }
            // allow repeats in siblings
            seenMap.remove(a);
        } else {
            sbuf.append("...");
        }
        sbuf.append(']');
    }

    private static void booleanArrayAppend(StringBuilder sbuf, boolean[] a) {
        sbuf.append('[');
        final int len = a.length;
        for (int i = 0; i < len; i++) {
            sbuf.append(a[i]);
            if (i != len - 1)
                sbuf.append(", ");
        }
        sbuf.append(']');
    }

    private static void byteArrayAppend(StringBuilder sbuf, byte[] a) {
        sbuf.append('[');
        final int len = a.length;
        for (int i = 0; i < len; i++) {
            sbuf.append(a[i]);
            if (i != len - 1)
                sbuf.append(", ");
        }
        sbuf.append(']');
    }

    private static void charArrayAppend(StringBuilder sbuf, char[] a) {
        sbuf.append('[');
        final int len = a.length;
        for (int i = 0; i < len; i++) {
            sbuf.append(a[i]);
            if (i != len - 1)
                sbuf.append(", ");
        }
        sbuf.append(']');
    }

    private static void shortArrayAppend(StringBuilder sbuf, short[] a) {
        sbuf.append('[');
        final int len = a.length;
        for (int i = 0; i < len; i++) {
            sbuf.append(a[i]);
            if (i != len - 1)
                sbuf.append(", ");
        }
        sbuf.append(']');
    }

    private static void intArrayAppend(StringBuilder sbuf, int[] a) {
        sbuf.append('[');
        final int len = a.length;
        for (int i = 0; i < len; i++) {
            sbuf.append(a[i]);
            if (i != len - 1)
                sbuf.append(", ");
        }
        sbuf.append(']');
    }

    private static void longArrayAppend(StringBuilder sbuf, long[] a) {
        sbuf.append('[');
        final int len = a.length;
        for (int i = 0; i < len; i++) {
            sbuf.append(a[i]);
            if (i != len - 1)
                sbuf.append(", ");
        }
        sbuf.append(']');
    }

    private static void floatArrayAppend(StringBuilder sbuf, float[] a) {
        sbuf.append('[');
        final int len = a.length;
        for (int i = 0; i < len; i++) {
            sbuf.append(a[i]);
            if (i != len - 1)
                sbuf.append(", ");
        }
        sbuf.append(']');
    }

    private static void doubleArrayAppend(StringBuilder sbuf, double[] a) {
        sbuf.append('[');
        final int len = a.length;
        for (int i = 0; i < len; i++) {
            sbuf.append(a[i]);
            if (i != len - 1)
                sbuf.append(", ");
        }
        sbuf.append(']');
    }

}



================================================
FILE: projects/sample/maven/host-project/introduce-shadow-lib/src/main/java/com/tencent/shadow/sample/introduce_shadow_lib/FixedPathPmUpdater.java
================================================
package com.tencent.shadow.sample.introduce_shadow_lib;

import com.tencent.shadow.dynamic.host.PluginManagerUpdater;

import java.io.File;
import java.util.concurrent.Future;

/**
 * 这个Updater没有任何升级能力。直接将指定路径作为其升级结果。
 */
public class FixedPathPmUpdater implements PluginManagerUpdater {

    final private File apk;

    FixedPathPmUpdater(File apk) {
        this.apk = apk;
    }


    @Override
    public boolean wasUpdating() {
        return false;
    }

    @Override
    public Future<File> update() {
        return null;
    }

    @Override
    public File getLatest() {
        return apk;
    }

    @Override
    public Future<Boolean> isAvailable(final File file) {
        return null;
    }
}

================================================
FILE: projects/sample/maven/host-project/introduce-shadow-lib/src/main/java/com/tencent/shadow/sample/introduce_shadow_lib/InitApplication.java
================================================
package com.tencent.shadow.sample.introduce_shadow_lib;

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

import com.tencent.shadow.core.common.LoggerFactory;
import com.tencent.shadow.dynamic.host.DynamicPluginManager;
import com.tencent.shadow.dynamic.host.DynamicRuntime;
import com.tencent.shadow.dynamic.host.PluginManager;

import java.io.File;
import java.util.concurrent.Future;

import static android.os.Process.myPid;

public class InitApplication {

    /**
     * 这个PluginManager对象在Manager升级前后是不变的。它内部持有具体实现,升级时更换具体实现。
     */
    private static PluginManager sPluginManager;

    public static PluginManager getPluginManager() {
        return sPluginManager;
    }

    public static void onApplicationCreate(Application application) {
        //Log接口Manager也需要使用,所以主进程也初始化。
        LoggerFactory.setILoggerFactory(new AndroidLoggerFactory());

        if (isProcess(application, ":plugin")) {
            //在全动态架构中,Activity组件没有打包在宿主而是位于被动态加载的runtime,
            //为了防止插件crash后,系统自动恢复crash前的Activity组件,此时由于没有加载runtime而发生classNotFound异常,导致二次crash
            //因此这里恢复加载上一次的runtime
            DynamicRuntime.recoveryRuntime(application);
        }

        if (isProcess(application, application.getPackageName())) {
            FixedPathPmUpdater fixedPathPmUpdater
                    = new FixedPathPmUpdater(new File("/data/local/tmp/sample-manager-debug.apk"));
            boolean needWaitingUpdate
                    = fixedPathPmUpdater.wasUpdating()//之前正在更新中,暗示更新出错了,应该放弃之前的缓存
                    || fixedPathPmUpdater.getLatest() == null;//没有本地缓存
            Future<File> update = fixedPathPmUpdater.update();
            if (needWaitingUpdate) {
                try {
                    update.get();//这里是阻塞的,需要业务自行保证更新Manager足够快。
                } catch (Exception e) {
                    throw new RuntimeException("Sample程序不容错", e);
                }
            }
            sPluginManager = new DynamicPluginManager(fixedPathPmUpdater);
        }
    }

    private static boolean isProcess(Context context, String processName) {
        String currentProcName = "";
        ActivityManager manager =
                (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
            if (processInfo.pid == myPid()) {
                currentProcName = processInfo.processName;
                break;
            }
        }

        return currentProcName.endsWith(processName);
    }
}


================================================
FILE: projects/sample/maven/host-project/introduce-shadow-lib/src/main/java/com/tencent/shadow/sample/introduce_shadow_lib/MainPluginProcessService.java
================================================
package com.tencent.shadow.sample.introduce_shadow_lib;

import com.tencent.shadow.dynamic.host.PluginProcessService;

/**
 * 一个PluginProcessService(简称PPS)代表一个插件进程。插件进程由PPS启动触发启动。
 * 新建PPS子类允许一个宿主中有多个互不影响的插件进程。
 */
public class MainPluginProcessService extends PluginProcessService {
}


================================================
FILE: projects/sample/maven/host-project/introduce-shadow-lib/src/main/res/values/themes.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="PluginContainerActivity" parent="@android:style/Theme.NoTitleBar.Fullscreen">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>
</resources>

================================================
FILE: projects/sample/maven/host-project/sample-host/.gitignore
================================================
/build


================================================
FILE: projects/sample/maven/host-project/sample-host/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    defaultConfig {
        applicationId "com.tencent.shadow.sample.host"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

            signingConfig signingConfigs.create("release")
            signingConfig.initWith(buildTypes.debug.signingConfig)
        }
    }
}

dependencies {
    implementation project(':introduce-shadow-lib')

    //如果introduce-shadow-lib发布到Maven,在pom中写明此依赖,宿主就不用写这个依赖了。
    implementation "com.tencent.shadow.dynamic:host:$shadow_version"
}


================================================
FILE: projects/sample/maven/host-project/sample-host/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
-keep class com.tencent.shadow.core.common.**{*;}
-keep class com.tencent.shadow.core.runtime.**{*;}
-keep class com.tencent.shadow.dynamic.host.**{*;}

================================================
FILE: projects/sample/maven/host-project/sample-host/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tencent.shadow.sample.host">

    <application
        android:allowBackup="true"
        android:label="Shadow Sample Host"
        android:name=".MyApplication"
        android:theme="@android:style/Theme.DeviceDefault">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

================================================
FILE: projects/sample/maven/host-project/sample-host/src/main/java/com/tencent/shadow/sample/host/MainActivity.java
================================================
package com.tencent.shadow.sample.host;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.tencent.shadow.dynamic.host.EnterCallback;
import com.tencent.shadow.dynamic.host.PluginManager;
import com.tencent.shadow.sample.introduce_shadow_lib.InitApplication;

public class MainActivity extends Activity {

    public static final int FROM_ID_START_ACTIVITY = 1001;
    public static final int FROM_ID_CALL_SERVICE = 1002;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final LinearLayout linearLayout = new LinearLayout(this);
        linearLayout.setOrientation(LinearLayout.VERTICAL);

        TextView textView = new TextView(this);
        textView.setText("宿主App");

        Button button = new Button(this);
        button.setText("启动插件");
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View v) {
                v.setEnabled(false);//防止点击重入

                PluginManager pluginManager = InitApplication.getPluginManager();
                pluginManager.enter(MainActivity.this, FROM_ID_START_ACTIVITY, new Bundle(), new EnterCallback() {
                    @Override
                    public void onShowLoadingView(View view) {
                        MainActivity.this.setContentView(view);//显示Manager传来的Loading页面
                    }

                    @Override
                    public void onCloseLoadingView() {
                        MainActivity.this.setContentView(linearLayout);
                    }

                    @Override
                    public void onEnterComplete() {
                        v.setEnabled(true);
                    }
                });
            }
        });

        linearLayout.addView(textView);
        linearLayout.addView(button);

        Button callServiceButton = new Button(this);
        callServiceButton.setText("调用插件Service,结果打印到Log");
        callServiceButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v.setEnabled(false);//防止点击重入

                PluginManager pluginManager = InitApplication.getPluginManager();
                pluginManager.enter(MainActivity.this, FROM_ID_CALL_SERVICE, null, null);
            }
        });

        linearLayout.addView(callServiceButton);

        setContentView(linearLayout);
    }
}

================================================
FILE: projects/sample/maven/host-project/sample-host/src/main/java/com/tencent/shadow/sample/host/MyApplication.java
================================================
package com.tencent.shadow.sample.host;

import android.app.Application;

import com.tencent.shadow.sample.introduce_shadow_lib.InitApplication;

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        InitApplication.onApplicationCreate(this);
    }
}


================================================
FILE: projects/sample/maven/host-project/settings.gradle
================================================
include ':sample-host', ':introduce-shadow-lib'


================================================
FILE: projects/sample/maven/manager-project/.gitignore
================================================
*.iml
.gradle
/local.properties
.idea
.DS_Store
/build
/captures
.externalNativeBuild


================================================
FILE: projects/sample/maven/manager-project/build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.shadow_version = '2.2.1'
    repositories {
        if (!System.getenv().containsKey("DISABLE_TENCENT_MAVEN_MIRROR")) {
            maven { url 'https://mirrors.tencent.com/nexus/repository/maven-public/' }
        } else {
            google()
            mavenCentral()
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.0.2'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        if (!System.getenv().containsKey("DISABLE_TENCENT_MAVEN_MIRROR")) {
            maven { url 'https://mirrors.tencent.com/nexus/repository/maven-public/' }
        } else {
            google()
            mavenCentral()
        }
        maven {
            name = "GitHubPackages"
            url "https://maven.pkg.github.com/tencent/shadow"
            //一个只读账号兼容Github Packages暂时不支持匿名下载
            //https://github.community/t/download-from-github-package-registry-without-authentication/14407
            credentials {
                username = 'readonlypat'
                password = '\u0067hp_s3VOOZnLf1bTyvHWblPfaessrVYyEU4JdNbs'
            }
        }
        mavenLocal()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


================================================
FILE: projects/sample/maven/manager-project/gradle/wrapper/gradle-wrapper.properties
================================================
#Wed May 08 11:09:16 CST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
#distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-bin.zip
distributionUrl=https\://mirrors.tencent.com/gradle/gradle-6.6.1-bin.zip


================================================
FILE: projects/sample/maven/manager-project/gradle.properties
================================================
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx4096m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official


================================================
FILE: projects/sample/maven/manager-project/gradlew
================================================
#!/usr/bin/env sh

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn () {
    echo "$*"
}

die () {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
  NONSTOP* )
    nonstop=true
    ;;
esac

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Escape application args
save () {
    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
    echo " "
}
APP_ARGS=$(save "$@")

# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"

# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
  cd "$(dirname "$0")"
fi

exec "$JAVACMD" "$@"


================================================
FILE: projects/sample/maven/manager-project/gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windows variants

if not "%OS%" == "Windows_NT" goto win9xME_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: projects/sample/maven/manager-project/sample-manager/.gitignore
================================================
/build


================================================
FILE: projects/sample/maven/manager-project/sample-manager/build.gradle
================================================
apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    defaultConfig {
        applicationId "com.tencent.shadow.sample.manager"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

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

            signingConfig signingConfigs.create("release")
            signingConfig.initWith(buildTypes.debug.signingConfig)
        }
    }
    lintOptions {
        abortOnError false
    }
}

dependencies {
    implementation "com.tencent.shadow.dynamic:manager:$shadow_version"
    compileOnly "com.tencent.shadow.core:common:$shadow_version"
    compileOnly "com.tencent.shadow.dynamic:host:$shadow_version"
}


================================================
FILE: projects/sample/maven/manager-project/sample-manager/proguard-rules.pro
================================================
-keep class com.tencent.shadow.dynamic.impl.**{*;}

-keep class com.tencent.shadow.dynamic.loader.**{*;}


================================================
FILE: projects/sample/maven/manager-project/sample-manager/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.tencent.shadow.sample.manager" />



================================================
FILE: projects/sample/maven/manager-project/sample-manager/src/main/aidl/com/tencent/shadow/sample/plugin/IMyAidlInterface.aidl
================================================
// IMyAidlInterface.aidl
package com.tencent.shadow.sample.plugin;

// Declare any non-default types here with import statements

interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    String basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);
}


================================================
FILE: projects/sample/maven/manager-project/sample-manager/src/main/java/com/tencent/shadow/dynamic/impl/ManagerFactoryImpl.java
================================================
package com.tencent.shadow.dynamic.impl;

import android.content.Context;

import com.tencent.shadow.dynamic.host.ManagerFactory;
import com.tencent.shadow.dynamic.host.PluginManagerImpl;
import com.tencent.shadow.sample.manager.SamplePluginManager;

/**
 * 此类包名及类名固定
 */
public final class ManagerFactoryImpl implements ManagerFactory {
    @Override
    public PluginManagerImpl buildManager(Context context) {
        return new SamplePluginManager(context);
    }
}


================================================
FILE: projects/sample/maven/manager-project/sample-manager/src/main/java/com/tencent/shadow/dynamic/impl/WhiteList.java
================================================
package com.tencent.shadow.dynamic.impl;

/**
 * 此类包名及类名固定
 * classLoader的白名单
 * PluginManager可以加载宿主中位于白名单内的类
 */
public interface WhiteList {
    String[] sWhiteList = new String[]
            {
            };
}


================================================
FILE: projects/sample/maven/manager-project/sample-manager/src/main/java/com/tencent/shadow/sample/manager/Constant.java
================================================
package com.tencent.shadow.sample.manager;

final public class Constant {
    public static final String KEY_PLUGIN_ZIP_PATH = "pluginZipPath";
    public static final String KEY_ACTIVITY_CLASSNAME = "KEY_ACTIVITY_CLASSNAME";
    public static final String KEY_EXTRAS = "KEY_EXTRAS";
    public static final String KEY_PLUGIN_PART_KEY = "KEY_PLUGIN_PART_KEY";
    public static final int FROM_ID_START_ACTIVITY = 1001;
    public static final int FROM_ID_CALL_SERVICE = 1002;
}


================================================
FILE: projects/sample/maven/manager-project/sample-manager/src/main/java/com/tencent/shadow/sample/manager/FastPluginManager.java
================================================
package com.tencent.shadow.sample.manager;

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

import com.tencent.shadow.core.common.Logger;
import com.tencent.shadow.core.common.LoggerFactory;
import com.tencent.shadow.core.manager.installplugin.InstalledPlugin;
import com.tencent.shadow.core.manager.installplugin.InstalledType;
import com.tencent.shadow.core.manager.installplugin.PluginConfig;
import com.tencent.shadow.dynamic.host.FailedException;
import com.tencent.shadow.dynamic.manager.PluginManagerThatUseDynamicLoader;

import org.json.JSONException;

import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public abstract class FastPluginManager extends PluginManagerThatUseDynamicLoader {

    private static final Logger mLogger = LoggerFactory.getLogger(FastPluginManager.class);

    private ExecutorService mFixedPool = Executors.newFixedThreadPool(4);

    public FastPluginManager(Context context) {
        super(context);
    }


    public InstalledPlugin installPlugin(String zip, String hash, boolean odex) throws IOException, JSONException, InterruptedException, ExecutionException {
        final PluginConfig pluginConfig = installPluginFromZip(new File(zip), hash);
        final String uuid = pluginConfig.UUID;
        List<Future> futures = new LinkedList<>();
        if (pluginConfig.runTime != null && pluginConfig.pluginLoader != null) {
            Future odexRuntime = mFixedPool.submit(new Callable() {
                @Override
                public Object call() throws Exception {
                    oDexPluginLoaderOrRunTime(uuid, InstalledType.TYPE_PLUGIN_RUNTIME,
                            pluginConfig.runTime.file);
                    return null;
                }
            });
            futures.add(odexRuntime);
            Future odexLoader = mFixedPool.submit(new Callable() {
                @Override
                public Object call() throws Exception {
                    oDexPluginLoaderOrRunTime(uuid, InstalledType.TYPE_PLUGIN_LOADER,
                            pluginConfig.pluginLoader.file);
                    return null;
                }
            });
            futures.add(odexLoader);
        }
        for (Map.Entry<String, PluginConfig.PluginFileInfo> plugin : pluginConfig.plugins.entrySet()) {
            final String partKey = plugin.getKey();
            final File apkFile = plugin.getValue().file;
            Future extractSo = mFixedPool.submit(new Callable() {
                @Override
                public Object call() throws Exception {
                    extractSo(uuid, partKey, apkFile);
                    return null;
                }
            });
            futures.add(extractSo);
            if (odex) {
                Future odexPlugin = mFixedPool.submit(new Callable() {
                    @Override
                    public Object call() throws Exception {
                        oDexPlugin(uuid, partKey, apkFile);
                        return null;
                    }
                });
                futures.add(odexPlugin);
            }
        }

        for (Future future : futures) {
            future.get();
        }
        onInstallCompleted(pluginConfig);

        return getInstalledPlugins(1).get(0);
    }


    public void startPluginActivity(Context context, InstalledPlugin installedPlugin, String partKey, Intent pluginIntent) throws RemoteException, TimeoutException, FailedException {
        Intent intent = convertActivityIntent(installedPlugin, partKey, pluginIntent);
        if (!(context instanceof Activity)) {
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
        context.startActivity(intent);
    }

    public Intent convertActivityIntent(InstalledPlugin installedPlugin, String partKey, Intent pluginIntent) throws RemoteException, TimeoutException, FailedException {
        loadPlugin(installedPlugin.UUID, partKey);
        return mPluginLoader.convertActivityIntent(pluginIntent);
    }

    private void loadPluginLoaderAndRuntime(String uuid) throws RemoteException, TimeoutException, FailedException {
        if (mPpsController == null) {
            bindPluginProcessService(getPluginProcessServiceName());
            waitServiceConnected(10, TimeUnit.SECONDS);
        }
        loadRunTime(uuid);
        loadPluginLoader(uuid);
    }

    protected void loadPlugin(String uuid, String partKey) throws RemoteException, TimeoutException, FailedException {
        loadPluginLoaderAndRuntime(uuid);
        Map map = mPluginLoader.getLoadedPlugin();
        if (!map.containsKey(partKey)) {
            mPluginLoader.loadPlugin(partKey);
        }
        Boolean isCall = (Boolean) map.get(partKey);
        if (isCall == null || !isCall) {
            mPluginLoader.callApplicationOnCreate(partKey);
        }
    }


    protected abstract String getPluginProcessServiceName();

}


================================================
FILE: projects/sample/maven/manager-project/sample-manager/src/main/java/com/tencent/shadow/sample/manager/SamplePluginManager.java
================================================
package com.tencent.shadow.sample.manager;

import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.*;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;

import com.tencent.shadow.core.manager.installplugin.InstalledPlugin;
import com.tencent.shadow.dynamic.host.EnterCallback;
import com.tencent.shadow.dynamic.loader.PluginServiceConnection;
import com.tencent.shadow.sample.plugin.IMyAidlInterface;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class SamplePluginManager extends FastPluginManager {

    private ExecutorService executorService = Executors.newSingleThreadExecutor();

    private Context mCurrentContext;

    public SamplePluginManager(Context context) {
        super(context);
        mCurrentContext = context;
    }

    /**
     * @return PluginManager实现的别名,用于区分不同PluginManager实现的数据存储路径
     */
    @Override
    protected String getName() {
        return "sample-manager";
    }

    /**
     * @return 宿主中注册的PluginProcessService实现的类名
     */
    @Override
    protected String getPluginProcessServiceName() {
        return "com.tencent.shadow.sample.introduce_shadow_lib.MainPluginProcessService";
    }

    @Override
    public void enter(final Context context, long fromId, Bundle bundle, final EnterCallback callback) {
        if (fromId == Constant.FROM_ID_START_ACTIVITY) {
            bundle.putString(Constant.KEY_PLUGIN_ZIP_PATH, "/data/local/tmp/plugin-debug.zip");
            bundle.putString(Constant.KEY_PLUGIN_PART_KEY, "sample-plugin");
            bundle.putString(Constant.KEY_ACTIVITY_CLASSNAME, "com.tencent.shadow.sample.plugin.MainActivity");
            onStartActivity(context, bundle, callback);
        } else if (fromId == Constant.FROM_ID_CALL_SERVICE) {
            callPluginService(context);
        } else {
            throw new IllegalArgumentException("不认识的fromId==" + fromId);
        }
    }

    private void onStartActivity(final Context context, Bundle bundle, final EnterCallback callback) {
        final String pluginZipPath = bundle.getString(Constant.KEY_PLUGIN_ZIP_PATH);
        final String partKey = bundle.getString(Constant.KEY_PLUGIN_PART_KEY);
        final String className = bundle.getString(Constant.KEY_ACTIVITY_CLASSNAME);
        if (className == null) {
            throw new NullPointerException("className == null");
        }
        final Bundle extras = bundle.getBundle(Constant.KEY_EXTRAS);

        if (callback != null) {
            final View view = LayoutInflater.from(mCurrentContext).inflate(R.layout.activity_load_plugin, null);
            callback.onShowLoadingView(view);
        }

        executorService.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    InstalledPlugin installedPlugin
                            = installPlugin(pluginZipPath, null, true);//这个调用是阻塞的
                    Intent pluginIntent = new Intent();
                    pluginIntent.setClassName(
                            context.getPackageName(),
                            className
                    );
                    if (extras != null) {
                        pluginIntent.replaceExtras(extras);
                    }

                    startPluginActivity(context, installedPlugin, partKey, pluginIntent);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
                if (callback != null) {
                    Handler uiHandler = new Handler(Looper.getMainLooper());
                    uiHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.onCloseLoadingView();
                            callback.onEnterComplete();
                        }
                    });
                }
            }
        });
    }

    private void callPluginService(final Context context) {
        final String pluginZipPath = "/data/local/tmp/plugin-debug.zip";
        final String partKey = "sample-plugin";
        final String className = "com.tencent.shadow.sample.plugin.MyService";

        Intent pluginIntent = new Intent();
        pluginIntent.setClassName(context.getPackageName(), className);

        executorService.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    InstalledPlugin installedPlugin
                            = installPlugin(pluginZipPath, null, true);//这个调用是阻塞的

                    loadPlugin(installedPlugin.UUID, partKey);

                    Intent pluginIntent = new Intent();
                    pluginIntent.setClassName(context.getPackageName(), className);

                    boolean callSuccess = mPluginLoader.bindPluginService(pluginIntent, new PluginServiceConnection() {
                        @Override
                        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                            IMyAidlInterface iMyAidlInterface = IMyAidlInterface.Stub.asInterface(iBinder);
                            try {
                                String s = iMyAidlInterface.basicTypes(1, 2, true, 4.0f, 5.0, "6");
                                Log.i("SamplePluginManager", "iMy
Download .txt
gitextract_9gwt80rw/

├── .commitlintrc.yml
├── .github/
│   ├── actions/
│   │   ├── post-build/
│   │   │   └── action.yml
│   │   └── pre-build/
│   │       └── action.yml
│   └── workflows/
│       ├── check-build-test.yml
│       └── release.yml
├── .gitignore
├── .idea/
│   └── codeStyles/
│       ├── Project.xml
│       └── codeStyleConfig.xml
├── CONTRIBUTING.md
├── LICENSE.txt
├── PRIVACY.md
├── README.md
├── build.gradle
├── buildScripts/
│   └── gradle/
│       ├── common.gradle
│       ├── fix_issue_1263.gradle
│       ├── maven.gradle
│       └── versions.properties
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── projects/
│   ├── sample/
│   │   ├── README.md
│   │   ├── dynamic-apk/
│   │   │   ├── sample-hello-api/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── build.gradle
│   │   │   │   ├── proguard-rules.pro
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           ├── AndroidManifest.xml
│   │   │   │           └── java/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── sample/
│   │   │   │                               └── api/
│   │   │   │                                   └── hello/
│   │   │   │                                       ├── HelloFactory.java
│   │   │   │                                       ├── IHelloWorld.java
│   │   │   │                                       └── IHelloWorldImpl.java
│   │   │   ├── sample-hello-api-holder/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── README.md
│   │   │   │   ├── build.gradle
│   │   │   │   ├── proguard-rules.pro
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           ├── AndroidManifest.xml
│   │   │   │           └── java/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── sample/
│   │   │   │                               └── apk/
│   │   │   │                                   └── hello/
│   │   │   │                                       ├── DynamicHello.java
│   │   │   │                                       ├── HelloImplLoader.java
│   │   │   │                                       └── HelloWorldUpdater.java
│   │   │   ├── sample-hello-apk/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   ├── proguard-rules.pro
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           ├── AndroidManifest.xml
│   │   │   │           ├── java/
│   │   │   │           │   └── com/
│   │   │   │           │       └── tencent/
│   │   │   │           │           └── shadow/
│   │   │   │           │               ├── dynamic/
│   │   │   │           │               │   └── impl/
│   │   │   │           │               │       ├── HelloFactoryImpl.java
│   │   │   │           │               │       └── WhiteList.java
│   │   │   │           │               └── sample/
│   │   │   │           │                   └── api/
│   │   │   │           │                       └── hello/
│   │   │   │           │                           └── SampleHelloWorld.java
│   │   │   │           └── res/
│   │   │   │               └── layout/
│   │   │   │                   └── activity_load_plugin.xml
│   │   │   └── sample-hello-host/
│   │   │       ├── .gitignore
│   │   │       ├── build.gradle
│   │   │       ├── proguard-rules.pro
│   │   │       └── src/
│   │   │           └── main/
│   │   │               ├── AndroidManifest.xml
│   │   │               └── java/
│   │   │                   └── com/
│   │   │                       └── tencent/
│   │   │                           └── shadow/
│   │   │                               └── sample/
│   │   │                                   └── host/
│   │   │                                       ├── AndroidLogLoggerFactory.java
│   │   │                                       ├── HostApplication.java
│   │   │                                       ├── MainActivity.java
│   │   │                                       ├── PluginHelper.java
│   │   │                                       └── api/
│   │   │                                           ├── FixedPathPmUpdater.java
│   │   │                                           └── HelloWorldApiHolder.java
│   │   ├── maven/
│   │   │   ├── host-project/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   ├── gradle/
│   │   │   │   │   └── wrapper/
│   │   │   │   │       ├── gradle-wrapper.jar
│   │   │   │   │       └── gradle-wrapper.properties
│   │   │   │   ├── gradle.properties
│   │   │   │   ├── gradlew
│   │   │   │   ├── gradlew.bat
│   │   │   │   ├── introduce-shadow-lib/
│   │   │   │   │   ├── .gitignore
│   │   │   │   │   ├── build.gradle
│   │   │   │   │   ├── proguard-rules.pro
│   │   │   │   │   └── src/
│   │   │   │   │       └── main/
│   │   │   │   │           ├── AndroidManifest.xml
│   │   │   │   │           ├── java/
│   │   │   │   │           │   └── com/
│   │   │   │   │           │       └── tencent/
│   │   │   │   │           │           └── shadow/
│   │   │   │   │           │               └── sample/
│   │   │   │   │           │                   └── introduce_shadow_lib/
│   │   │   │   │           │                       ├── AndroidLoggerFactory.java
│   │   │   │   │           │                       ├── FixedPathPmUpdater.java
│   │   │   │   │           │                       ├── InitApplication.java
│   │   │   │   │           │                       └── MainPluginProcessService.java
│   │   │   │   │           └── res/
│   │   │   │   │               └── values/
│   │   │   │   │                   └── themes.xml
│   │   │   │   ├── sample-host/
│   │   │   │   │   ├── .gitignore
│   │   │   │   │   ├── build.gradle
│   │   │   │   │   ├── proguard-rules.pro
│   │   │   │   │   └── src/
│   │   │   │   │       └── main/
│   │   │   │   │           ├── AndroidManifest.xml
│   │   │   │   │           └── java/
│   │   │   │   │               └── com/
│   │   │   │   │                   └── tencent/
│   │   │   │   │                       └── shadow/
│   │   │   │   │                           └── sample/
│   │   │   │   │                               └── host/
│   │   │   │   │                                   ├── MainActivity.java
│   │   │   │   │                                   └── MyApplication.java
│   │   │   │   └── settings.gradle
│   │   │   ├── manager-project/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   ├── gradle/
│   │   │   │   │   └── wrapper/
│   │   │   │   │       ├── gradle-wrapper.jar
│   │   │   │   │       └── gradle-wrapper.properties
│   │   │   │   ├── gradle.properties
│   │   │   │   ├── gradlew
│   │   │   │   ├── gradlew.bat
│   │   │   │   ├── sample-manager/
│   │   │   │   │   ├── .gitignore
│   │   │   │   │   ├── build.gradle
│   │   │   │   │   ├── proguard-rules.pro
│   │   │   │   │   └── src/
│   │   │   │   │       └── main/
│   │   │   │   │           ├── AndroidManifest.xml
│   │   │   │   │           ├── aidl/
│   │   │   │   │           │   └── com/
│   │   │   │   │           │       └── tencent/
│   │   │   │   │           │           └── shadow/
│   │   │   │   │           │               └── sample/
│   │   │   │   │           │                   └── plugin/
│   │   │   │   │           │                       └── IMyAidlInterface.aidl
│   │   │   │   │           ├── java/
│   │   │   │   │           │   └── com/
│   │   │   │   │           │       └── tencent/
│   │   │   │   │           │           └── shadow/
│   │   │   │   │           │               ├── dynamic/
│   │   │   │   │           │               │   └── impl/
│   │   │   │   │           │               │       ├── ManagerFactoryImpl.java
│   │   │   │   │           │               │       └── WhiteList.java
│   │   │   │   │           │               └── sample/
│   │   │   │   │           │                   └── manager/
│   │   │   │   │           │                       ├── Constant.java
│   │   │   │   │           │                       ├── FastPluginManager.java
│   │   │   │   │           │                       └── SamplePluginManager.java
│   │   │   │   │           └── res/
│   │   │   │   │               └── layout/
│   │   │   │   │                   └── activity_load_plugin.xml
│   │   │   │   └── settings.gradle
│   │   │   └── plugin-project/
│   │   │       ├── .gitignore
│   │   │       ├── build.gradle
│   │   │       ├── gradle/
│   │   │       │   └── wrapper/
│   │   │       │       ├── gradle-wrapper.jar
│   │   │       │       └── gradle-wrapper.properties
│   │   │       ├── gradle.properties
│   │   │       ├── gradlew
│   │   │       ├── gradlew.bat
│   │   │       ├── plugin-app/
│   │   │       │   ├── .gitignore
│   │   │       │   ├── build.gradle
│   │   │       │   ├── proguard-rules.pro
│   │   │       │   └── src/
│   │   │       │       └── main/
│   │   │       │           ├── AndroidManifest.xml
│   │   │       │           ├── aidl/
│   │   │       │           │   └── com/
│   │   │       │           │       └── tencent/
│   │   │       │           │           └── shadow/
│   │   │       │           │               └── sample/
│   │   │       │           │                   └── plugin/
│   │   │       │           │                       └── IMyAidlInterface.aidl
│   │   │       │           ├── java/
│   │   │       │           │   └── com/
│   │   │       │           │       └── tencent/
│   │   │       │           │           └── shadow/
│   │   │       │           │               └── sample/
│   │   │       │           │                   └── plugin/
│   │   │       │           │                       ├── MainActivity.java
│   │   │       │           │                       └── MyService.java
│   │   │       │           └── res/
│   │   │       │               ├── layout/
│   │   │       │               │   └── activity_main.xml
│   │   │       │               └── values/
│   │   │       │                   ├── colors.xml
│   │   │       │                   ├── strings.xml
│   │   │       │                   └── styles.xml
│   │   │       ├── sample-loader/
│   │   │       │   ├── .gitignore
│   │   │       │   ├── build.gradle
│   │   │       │   ├── proguard-rules.pro
│   │   │       │   └── src/
│   │   │       │       └── main/
│   │   │       │           ├── AndroidManifest.xml
│   │   │       │           └── java/
│   │   │       │               └── com/
│   │   │       │                   └── tencent/
│   │   │       │                       └── shadow/
│   │   │       │                           ├── dynamic/
│   │   │       │                           │   └── loader/
│   │   │       │                           │       └── impl/
│   │   │       │                           │           └── CoreLoaderFactoryImpl.java
│   │   │       │                           └── sample/
│   │   │       │                               └── loader/
│   │   │       │                                   ├── SampleComponentManager.java
│   │   │       │                                   └── SamplePluginLoader.java
│   │   │       ├── sample-runtime/
│   │   │       │   ├── .gitignore
│   │   │       │   ├── build.gradle
│   │   │       │   ├── proguard-rules.pro
│   │   │       │   └── src/
│   │   │       │       └── main/
│   │   │       │           ├── AndroidManifest.xml
│   │   │       │           └── java/
│   │   │       │               └── com/
│   │   │       │                   └── tencent/
│   │   │       │                       └── shadow/
│   │   │       │                           └── sample/
│   │   │       │                               └── runtime/
│   │   │       │                                   ├── PluginDefaultProxyActivity.java
│   │   │       │                                   ├── PluginSingleInstance1ProxyActivity.java
│   │   │       │                                   └── PluginSingleTask1ProxyActivity.java
│   │   │       └── settings.gradle
│   │   └── source/
│   │       ├── sample-constant/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   ├── proguard-rules.pro
│   │       │   └── src/
│   │       │       └── main/
│   │       │           ├── AndroidManifest.xml
│   │       │           └── java/
│   │       │               └── com/
│   │       │                   └── tencent/
│   │       │                       └── shadow/
│   │       │                           └── sample/
│   │       │                               └── constant/
│   │       │                                   └── Constant.java
│   │       ├── sample-host/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   ├── proguard-rules.pro
│   │       │   └── src/
│   │       │       └── main/
│   │       │           ├── AndroidManifest.xml
│   │       │           ├── java/
│   │       │           │   └── com/
│   │       │           │       └── tencent/
│   │       │           │           └── shadow/
│   │       │           │               └── sample/
│   │       │           │                   └── host/
│   │       │           │                       ├── AndroidLogLoggerFactory.java
│   │       │           │                       ├── HostApplication.java
│   │       │           │                       ├── MainActivity.java
│   │       │           │                       ├── Plugin2ProcessPPS.java
│   │       │           │                       ├── PluginHelper.java
│   │       │           │                       ├── PluginLoadActivity.java
│   │       │           │                       ├── PluginProcessPPS.java
│   │       │           │                       ├── manager/
│   │       │           │                       │   ├── FixedPathPmUpdater.java
│   │       │           │                       │   └── Shadow.java
│   │       │           │                       └── plugin_view/
│   │       │           │                           ├── HostAddPluginViewActivity.java
│   │       │           │                           └── MainProcessManagerReceiver.java
│   │       │           └── res/
│   │       │               ├── layout/
│   │       │               │   ├── activity_jump_to_plugin.xml
│   │       │               │   ├── activity_load.xml
│   │       │               │   └── part_key_adapter.xml
│   │       │               └── values/
│   │       │                   ├── strings.xml
│   │       │                   └── themes.xml
│   │       ├── sample-host-lib/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   ├── proguard-rules.pro
│   │       │   ├── sample-host-lib.pro
│   │       │   └── src/
│   │       │       └── main/
│   │       │           ├── AndroidManifest.xml
│   │       │           ├── java/
│   │       │           │   └── com/
│   │       │           │       └── tencent/
│   │       │           │           └── shadow/
│   │       │           │               └── sample/
│   │       │           │                   └── host/
│   │       │           │                       └── lib/
│   │       │           │                           ├── HostAddPluginViewContainer.java
│   │       │           │                           ├── HostAddPluginViewContainerHolder.java
│   │       │           │                           ├── HostUiLayerProvider.java
│   │       │           │                           └── LoadPluginCallback.java
│   │       │           └── res/
│   │       │               └── layout/
│   │       │                   └── host_ui_layer_layout.xml
│   │       ├── sample-manager/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   ├── proguard-rules.pro
│   │       │   └── src/
│   │       │       └── main/
│   │       │           ├── AndroidManifest.xml
│   │       │           ├── java/
│   │       │           │   └── com/
│   │       │           │       └── tencent/
│   │       │           │           └── shadow/
│   │       │           │               ├── dynamic/
│   │       │           │               │   └── impl/
│   │       │           │               │       ├── ManagerFactoryImpl.java
│   │       │           │               │       └── WhiteList.java
│   │       │           │               └── sample/
│   │       │           │                   └── manager/
│   │       │           │                       ├── FastPluginManager.java
│   │       │           │                       └── SamplePluginManager.java
│   │       │           └── res/
│   │       │               └── layout/
│   │       │                   └── activity_load_plugin.xml
│   │       └── sample-plugin/
│   │           ├── sample-app/
│   │           │   ├── .gitignore
│   │           │   ├── build.gradle
│   │           │   ├── proguard-rules.pro
│   │           │   └── src/
│   │           │       └── main/
│   │           │           ├── AndroidManifest.xml
│   │           │           ├── assets/
│   │           │           │   └── web/
│   │           │           │       └── test.html
│   │           │           ├── java/
│   │           │           │   └── com/
│   │           │           │       └── tencent/
│   │           │           │           └── shadow/
│   │           │           │               └── sample/
│   │           │           │                   └── plugin/
│   │           │           │                       └── app/
│   │           │           │                           └── lib/
│   │           │           │                               ├── UseCaseApplication.java
│   │           │           │                               └── usecases/
│   │           │           │                                   ├── activity/
│   │           │           │                                   │   ├── TestActivityOnCreate.java
│   │           │           │                                   │   ├── TestActivityOptionMenu.java
│   │           │           │                                   │   ├── TestActivityOrientation.java
│   │           │           │                                   │   ├── TestActivityReCreate.java
│   │           │           │                                   │   ├── TestActivityReCreateBySystem.java
│   │           │           │                                   │   ├── TestActivitySetTheme.java
│   │           │           │                                   │   └── TestActivityWindowSoftMode.java
│   │           │           │                                   ├── application/
│   │           │           │                                   │   └── TestApplicationActivity.java
│   │           │           │                                   ├── context/
│   │           │           │                                   │   ├── ActivityContextSubDirTestActivity.java
│   │           │           │                                   │   ├── ApplicationContextSubDirTestActivity.java
│   │           │           │                                   │   └── SubDirContextThemeWrapperTestActivity.java
│   │           │           │                                   ├── dialog/
│   │           │           │                                   │   ├── TestDialog.java
│   │           │           │                                   │   └── TestDialogActivity.java
│   │           │           │                                   ├── fragment/
│   │           │           │                                   │   ├── TestDialogFragment.java
│   │           │           │                                   │   ├── TestDialogFragmentActivity.java
│   │           │           │                                   │   ├── TestDynamicFragmentActivity.java
│   │           │           │                                   │   ├── TestFragment.java
│   │           │           │                                   │   └── TestXmlFragmentActivity.java
│   │           │           │                                   ├── host_communication/
│   │           │           │                                   │   └── PluginUseHostClassActivity.java
│   │           │           │                                   ├── packagemanager/
│   │           │           │                                   │   └── TestPackageManagerActivity.java
│   │           │           │                                   ├── provider/
│   │           │           │                                   │   ├── TestDBContentProviderActivity.java
│   │           │           │                                   │   ├── TestDBHelper.java
│   │           │           │                                   │   ├── TestFileProviderActivity.java
│   │           │           │                                   │   ├── TestProvider.java
│   │           │           │                                   │   └── TestProviderInfo.java
│   │           │           │                                   ├── receiver/
│   │           │           │                                   │   ├── MyReceiver.java
│   │           │           │                                   │   ├── TestDynamicReceiverActivity.java
│   │           │           │                                   │   └── TestReceiverActivity.java
│   │           │           │                                   ├── service/
│   │           │           │                                   │   └── HostAddPluginViewService.java
│   │           │           │                                   └── webview/
│   │           │           │                                       └── WebViewActivity.java
│   │           │           └── res/
│   │           │               ├── anim/
│   │           │               │   └── dialog_exit_fade_out.xml
│   │           │               ├── drawable/
│   │           │               │   ├── selector_group.xml
│   │           │               │   └── selector_item.xml
│   │           │               ├── layout/
│   │           │               │   ├── activity_test_file_provider.xml
│   │           │               │   ├── activity_test_re_create_by_system.xml
│   │           │               │   ├── layout_activity_lifecycle.xml
│   │           │               │   ├── layout_activity_settheme.xml
│   │           │               │   ├── layout_common.xml
│   │           │               │   ├── layout_dialog.xml
│   │           │               │   ├── layout_dialog_activity.xml
│   │           │               │   ├── layout_fragment_activity.xml
│   │           │               │   ├── layout_fragment_test.xml
│   │           │               │   ├── layout_fragment_xml_activity.xml
│   │           │               │   ├── layout_host_add_plugin_view.xml
│   │           │               │   ├── layout_orientation.xml
│   │           │               │   ├── layout_packagemanager.xml
│   │           │               │   ├── layout_provider_db.xml
│   │           │               │   ├── layout_receiver.xml
│   │           │               │   ├── layout_recreate.xml
│   │           │               │   ├── layout_result.xml
│   │           │               │   ├── layout_service.xml
│   │           │               │   ├── layout_softmode.xml
│   │           │               │   └── layout_test_view_cons_cache.xml
│   │           │               ├── menu/
│   │           │               │   └── case_test_activity_option_menu.xml
│   │           │               ├── values/
│   │           │               │   ├── strings.xml
│   │           │               │   ├── styles.xml
│   │           │               │   └── themes.xml
│   │           │               └── values-v21/
│   │           │                   └── themes.xml
│   │           ├── sample-base/
│   │           │   ├── .gitignore
│   │           │   ├── build.gradle
│   │           │   ├── proguard-rules.pro
│   │           │   └── src/
│   │           │       └── main/
│   │           │           └── AndroidManifest.xml
│   │           ├── sample-base-lib/
│   │           │   ├── .gitignore
│   │           │   ├── build.gradle
│   │           │   ├── proguard-rules.pro
│   │           │   └── src/
│   │           │       └── main/
│   │           │           ├── AndroidManifest.xml
│   │           │           ├── java/
│   │           │           │   └── com/
│   │           │           │       └── tencent/
│   │           │           │           └── shadow/
│   │           │           │               └── sample/
│   │           │           │                   └── plugin/
│   │           │           │                       └── app/
│   │           │           │                           └── lib/
│   │           │           │                               └── gallery/
│   │           │           │                                   ├── BaseActivity.java
│   │           │           │                                   ├── MainActivity.java
│   │           │           │                                   ├── TestApplication.java
│   │           │           │                                   ├── cases/
│   │           │           │                                   │   ├── UseCaseManager.java
│   │           │           │                                   │   ├── UseCaseSummaryFragment.java
│   │           │           │                                   │   └── entity/
│   │           │           │                                   │       ├── UseCase.java
│   │           │           │                                   │       └── UseCaseCategory.java
│   │           │           │                                   ├── splash/
│   │           │           │                                   │   ├── ISplashAnimation.java
│   │           │           │                                   │   ├── SplashActivity.java
│   │           │           │                                   │   └── SplashAnimation.java
│   │           │           │                                   └── util/
│   │           │           │                                       ├── PluginChecker.java
│   │           │           │                                       ├── ToastUtil.java
│   │           │           │                                       └── UiUtil.java
│   │           │           └── res/
│   │           │               ├── drawable/
│   │           │               │   └── child_bg.xml
│   │           │               ├── layout/
│   │           │               │   ├── layout_case_category_item.xml
│   │           │               │   ├── layout_case_item.xml
│   │           │               │   ├── layout_fragment_case_summary.xml
│   │           │               │   ├── layout_main.xml
│   │           │               │   ├── layout_main_above.xml
│   │           │               │   ├── layout_main_behind.xml
│   │           │               │   └── layout_splash.xml
│   │           │               ├── values/
│   │           │               │   ├── dimens.xml
│   │           │               │   ├── strings.xml
│   │           │               │   └── themes.xml
│   │           │               └── xml/
│   │           │                   └── filepaths.xml
│   │           ├── sample-loader/
│   │           │   ├── .gitignore
│   │           │   ├── build.gradle
│   │           │   ├── proguard-rules.pro
│   │           │   └── src/
│   │           │       └── main/
│   │           │           ├── AndroidManifest.xml
│   │           │           └── java/
│   │           │               └── com/
│   │           │                   └── tencent/
│   │           │                       └── shadow/
│   │           │                           ├── dynamic/
│   │           │                           │   ├── impl/
│   │           │                           │   │   └── WhiteList.java
│   │           │                           │   └── loader/
│   │           │                           │       └── impl/
│   │           │                           │           └── CoreLoaderFactoryImpl.java
│   │           │                           └── sample/
│   │           │                               └── plugin/
│   │           │                                   └── loader/
│   │           │                                       ├── SampleComponentManager.java
│   │           │                                       └── SamplePluginLoader.java
│   │           ├── sample-runtime/
│   │           │   ├── .gitignore
│   │           │   ├── build.gradle
│   │           │   ├── proguard-rules.pro
│   │           │   └── src/
│   │           │       └── main/
│   │           │           ├── AndroidManifest.xml
│   │           │           └── java/
│   │           │               └── com/
│   │           │                   └── tencent/
│   │           │                       └── shadow/
│   │           │                           └── sample/
│   │           │                               └── plugin/
│   │           │                                   └── runtime/
│   │           │                                       ├── PluginDefaultProxyActivity.java
│   │           │                                       ├── PluginSingleInstance1ProxyActivity.java
│   │           │                                       └── PluginSingleTask1ProxyActivity.java
│   │           └── third-party/
│   │               ├── pinnedheaderexpandablelistview/
│   │               │   ├── .gitignore
│   │               │   ├── LICENSE
│   │               │   ├── README.md
│   │               │   ├── build.gradle
│   │               │   ├── proguard-rules.pro
│   │               │   └── src/
│   │               │       └── main/
│   │               │           ├── AndroidManifest.xml
│   │               │           └── java/
│   │               │               └── com/
│   │               │                   └── ryg/
│   │               │                       └── expandable/
│   │               │                           └── ui/
│   │               │                               ├── PinnedHeaderExpandableListView.java
│   │               │                               └── StickyLayout.java
│   │               └── slidingmenu/
│   │                   ├── .gitignore
│   │                   ├── LICENSE.txt
│   │                   ├── README.md
│   │                   ├── build.gradle
│   │                   ├── proguard-rules.pro
│   │                   └── src/
│   │                       └── main/
│   │                           ├── AndroidManifest.xml
│   │                           ├── java/
│   │                           │   └── com/
│   │                           │       └── jeremyfeinstein/
│   │                           │           └── slidingmenu/
│   │                           │               └── lib/
│   │                           │                   ├── CanvasTransformerBuilder.java
│   │                           │                   ├── CustomViewAbove.java
│   │                           │                   ├── CustomViewBehind.java
│   │                           │                   └── SlidingMenu.java
│   │                           └── res/
│   │                               └── values/
│   │                                   ├── attrs.xml
│   │                                   └── ids.xml
│   ├── sdk/
│   │   ├── coding/
│   │   │   ├── .gitignore
│   │   │   ├── aar-to-jar-plugin/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           └── kotlin/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── coding/
│   │   │   │                               └── aar_to_jar_plugin/
│   │   │   │                                   └── AarToJarPlugin.kt
│   │   │   ├── android-jar/
│   │   │   │   ├── .gitignore
│   │   │   │   └── build.gradle
│   │   │   ├── build.gradle
│   │   │   ├── code-generator/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       ├── main/
│   │   │   │       │   └── kotlin/
│   │   │   │       │       └── com/
│   │   │   │       │           └── tencent/
│   │   │   │       │               └── shadow/
│   │   │   │       │                   ├── coding/
│   │   │   │       │                   │   └── code_generator/
│   │   │   │       │                   │       └── ActivityCodeGenerator.kt
│   │   │   │       │                   └── core/
│   │   │   │       │                       └── runtime/
│   │   │   │       │                           └── NeighborClass.kt
│   │   │   │       └── test/
│   │   │   │           └── kotlin/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── coding/
│   │   │   │                               └── code_generator/
│   │   │   │                                   └── ActivityCodeGeneratorTest.kt
│   │   │   ├── common-jar-settings/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           └── kotlin/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── coding/
│   │   │   │                               └── common_jar_settings/
│   │   │   │                                   └── CommonJarSettingsPlugin.kt
│   │   │   ├── get-android-jar/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           └── AndroidManifest.xml
│   │   │   ├── gradle/
│   │   │   │   └── wrapper/
│   │   │   │       ├── gradle-wrapper.jar
│   │   │   │       └── gradle-wrapper.properties
│   │   │   ├── gradlew
│   │   │   ├── gradlew.bat
│   │   │   ├── java-build-config/
│   │   │   │   ├── .gitignore
│   │   │   │   └── build.gradle
│   │   │   └── settings.gradle
│   │   ├── core/
│   │   │   ├── .gitignore
│   │   │   ├── activity-container/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           └── java/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── core/
│   │   │   │                               └── runtime/
│   │   │   │                                   └── container/
│   │   │   │                                       ├── DelegateProvider.java
│   │   │   │                                       ├── DelegateProviderHolder.java
│   │   │   │                                       ├── HostActivity.java
│   │   │   │                                       ├── HostActivityDelegate.java
│   │   │   │                                       ├── HostActivityDelegator.java
│   │   │   │                                       ├── HostNativeActivityDelegate.java
│   │   │   │                                       ├── HostNativeActivityDelegator.java
│   │   │   │                                       ├── NativePluginContainerActivity.java
│   │   │   │                                       └── PluginContainerActivity.java
│   │   │   ├── build.gradle
│   │   │   ├── common/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           └── java/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── core/
│   │   │   │                               ├── common/
│   │   │   │                               │   ├── ILoggerFactory.java
│   │   │   │                               │   ├── InstalledApk.java
│   │   │   │                               │   ├── Logger.java
│   │   │   │                               │   └── LoggerFactory.java
│   │   │   │                               └── runtime/
│   │   │   │                                   └── container/
│   │   │   │                                       ├── ContentProviderDelegateProvider.java
│   │   │   │                                       ├── ContentProviderDelegateProviderHolder.java
│   │   │   │                                       ├── HostContentProviderDelegate.java
│   │   │   │                                       └── PluginContainerContentProvider.java
│   │   │   ├── gradle/
│   │   │   │   └── wrapper/
│   │   │   │       ├── gradle-wrapper.jar
│   │   │   │       └── gradle-wrapper.properties
│   │   │   ├── gradle-plugin/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       ├── main/
│   │   │   │       │   └── kotlin/
│   │   │   │       │       └── com/
│   │   │   │       │           └── tencent/
│   │   │   │       │               └── shadow/
│   │   │   │       │                   └── core/
│   │   │   │       │                       └── gradle/
│   │   │   │       │                           ├── AGPCompat.kt
│   │   │   │       │                           ├── AGPCompatImpl.kt
│   │   │   │       │                           ├── CreatePackagePluginTask.kt
│   │   │   │       │                           ├── ShadowPlugin.kt
│   │   │   │       │                           ├── ShadowPluginHelper.kt
│   │   │   │       │                           └── extensions/
│   │   │   │       │                               ├── PackagePluginExtension.kt
│   │   │   │       │                               ├── PluginApkConfig.kt
│   │   │   │       │                               └── PluginBuildType.kt
│   │   │   │       └── test/
│   │   │   │           ├── kotlin/
│   │   │   │           │   └── com/
│   │   │   │           │       └── tencent/
│   │   │   │           │           └── shadow/
│   │   │   │           │               └── core/
│   │   │   │           │                   └── gradle/
│   │   │   │           │                       ├── PackageMultiPluginTest.kt
│   │   │   │           │                       ├── PackageOnlyPluginTest.kt
│   │   │   │           │                       └── PackagePluginTaskTest.kt
│   │   │   │           └── testProjects/
│   │   │   │               └── case1/
│   │   │   │                   ├── .gitignore
│   │   │   │                   ├── build.gradle
│   │   │   │                   ├── loader/
│   │   │   │                   │   ├── build.gradle
│   │   │   │                   │   └── src/
│   │   │   │                   │       └── main/
│   │   │   │                   │           └── AndroidManifest.xml
│   │   │   │                   ├── plugin1/
│   │   │   │                   │   ├── .gitignore
│   │   │   │                   │   ├── build.gradle
│   │   │   │                   │   └── src/
│   │   │   │                   │       └── main/
│   │   │   │                   │           └── AndroidManifest.xml
│   │   │   │                   ├── plugin2/
│   │   │   │                   │   ├── .gitignore
│   │   │   │                   │   ├── build.gradle
│   │   │   │                   │   └── src/
│   │   │   │                   │       └── main/
│   │   │   │                   │           └── AndroidManifest.xml
│   │   │   │                   ├── runtime/
│   │   │   │                   │   ├── build.gradle
│   │   │   │                   │   └── src/
│   │   │   │                   │       └── main/
│   │   │   │                   │           └── AndroidManifest.xml
│   │   │   │                   ├── settings.gradle
│   │   │   │                   └── src/
│   │   │   │                       └── main/
│   │   │   │                           └── AndroidManifest.xml
│   │   │   ├── gradle.properties
│   │   │   ├── gradlew
│   │   │   ├── gradlew.bat
│   │   │   ├── load-parameters/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           └── java/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── core/
│   │   │   │                               └── load_parameters/
│   │   │   │                                   └── LoadParameters.java
│   │   │   ├── loader/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       ├── main/
│   │   │   │       │   └── kotlin/
│   │   │   │       │       └── com/
│   │   │   │       │           └── tencent/
│   │   │   │       │               └── shadow/
│   │   │   │       │                   └── core/
│   │   │   │       │                       └── loader/
│   │   │   │       │                           ├── ShadowPluginLoader.kt
│   │   │   │       │                           ├── blocs/
│   │   │   │       │                           │   ├── CheckPackageNameBloc.kt
│   │   │   │       │                           │   ├── CreateApplicationBloc.kt
│   │   │   │       │                           │   ├── CreatePluginApplicationInfoBloc.kt
│   │   │   │       │                           │   ├── CreateResourceBloc.kt
│   │   │   │       │                           │   ├── LoadApkBloc.kt
│   │   │   │       │                           │   └── LoadPluginBloc.kt
│   │   │   │       │                           ├── classloaders/
│   │   │   │       │                           │   ├── CombineClassLoader.kt
│   │   │   │       │                           │   └── PluginClassLoader.kt
│   │   │   │       │                           ├── delegates/
│   │   │   │       │                           │   ├── DI.kt
│   │   │   │       │                           │   ├── PackageManagerWrapper.java
│   │   │   │       │                           │   ├── ShadowActivityDelegate.kt
│   │   │   │       │                           │   ├── ShadowContentProviderDelegate.kt
│   │   │   │       │                           │   ├── ShadowDelegate.kt
│   │   │   │       │                           │   └── ShadowNativeActivityDelegate.kt
│   │   │   │       │                           ├── exceptions/
│   │   │   │       │                           │   ├── CreateApplicationException.kt
│   │   │   │       │                           │   ├── LoadApkException.kt
│   │   │   │       │                           │   ├── LoadPluginException.kt
│   │   │   │       │                           │   └── ParsePluginApkException.kt
│   │   │   │       │                           ├── infos/
│   │   │   │       │                           │   ├── ContainerProviderInfo.kt
│   │   │   │       │                           │   └── PluginParts.kt
│   │   │   │       │                           └── managers/
│   │   │   │       │                               ├── ComponentManager.kt
│   │   │   │       │                               ├── PluginContentProviderManager.kt
│   │   │   │       │                               ├── PluginPackageManagerImpl.kt
│   │   │   │       │                               └── PluginServiceManager.kt
│   │   │   │       └── test/
│   │   │   │           └── kotlin/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── core/
│   │   │   │                               └── loader/
│   │   │   │                                   └── classloaders/
│   │   │   │                                       └── PluginClassLoaderTest.kt
│   │   │   ├── manager/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       ├── main/
│   │   │   │       │   └── java/
│   │   │   │       │       └── com/
│   │   │   │       │           └── tencent/
│   │   │   │       │               └── shadow/
│   │   │   │       │                   └── core/
│   │   │   │       │                       └── manager/
│   │   │   │       │                           ├── BasePluginManager.java
│   │   │   │       │                           └── installplugin/
│   │   │   │       │                               ├── AppCacheFolderManager.java
│   │   │   │       │                               ├── CopySoBloc.java
│   │   │   │       │                               ├── InstallPluginException.java
│   │   │   │       │                               ├── InstalledDao.java
│   │   │   │       │                               ├── InstalledPlugin.java
│   │   │   │       │                               ├── InstalledPluginDBHelper.java
│   │   │   │       │                               ├── InstalledRow.java
│   │   │   │       │                               ├── InstalledType.java
│   │   │   │       │                               ├── MinFileUtils.java
│   │   │   │       │                               ├── ODexBloc.java
│   │   │   │       │                               ├── PluginConfig.java
│   │   │   │       │                               ├── SafeZipFile.java
│   │   │   │       │                               └── UnpackManager.java
│   │   │   │       └── test/
│   │   │   │           └── java/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── core/
│   │   │   │                               └── manager/
│   │   │   │                                   └── installplugin/
│   │   │   │                                       └── SafeZipFileTest.java
│   │   │   ├── manager-db-test/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       ├── androidTest/
│   │   │   │       │   ├── java/
│   │   │   │       │   │   ├── com/
│   │   │   │       │   │   │   └── tencent/
│   │   │   │       │   │   │       └── shadow/
│   │   │   │       │   │   │           └── core/
│   │   │   │       │   │   │               ├── manager/
│   │   │   │       │   │   │               │   └── installplugin/
│   │   │   │       │   │   │               │       └── DbCompatibilityTest.java
│   │   │   │       │   │   │               └── pluginmanager/
│   │   │   │       │   │   │                   └── CustomAndroidJUnitRunner.java
│   │   │   │       │   │   └── common/
│   │   │   │       │   │       └── AndroidLogLoggerFactory.java
│   │   │   │       │   └── res/
│   │   │   │       │       └── raw/
│   │   │   │       │           ├── expect_sql_version1.sql
│   │   │   │       │           ├── expect_sql_version2.sql
│   │   │   │       │           ├── expect_sql_version3.sql
│   │   │   │       │           ├── expect_sql_version4.sql
│   │   │   │       │           ├── init_sql_version1.sql
│   │   │   │       │           ├── init_sql_version2.sql
│   │   │   │       │           ├── init_sql_version3.sql
│   │   │   │       │           ├── init_sql_version4.sql
│   │   │   │       │           └── plugin1.json
│   │   │   │       └── main/
│   │   │   │           └── AndroidManifest.xml
│   │   │   ├── manifest-parser/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       ├── main/
│   │   │   │       │   └── kotlin/
│   │   │   │       │       └── com/
│   │   │   │       │           └── tencent/
│   │   │   │       │               └── shadow/
│   │   │   │       │                   └── core/
│   │   │   │       │                       └── manifest_parser/
│   │   │   │       │                           ├── AndroidManifestKeys.kt
│   │   │   │       │                           ├── AndroidManifestReader.kt
│   │   │   │       │                           ├── ManifestParser.kt
│   │   │   │       │                           └── PluginManifestGenerator.kt
│   │   │   │       └── test/
│   │   │   │           ├── kotlin/
│   │   │   │           │   └── com/
│   │   │   │           │       └── tencent/
│   │   │   │           │           └── shadow/
│   │   │   │           │               └── core/
│   │   │   │           │                   └── manifest_parser/
│   │   │   │           │                       ├── AndroidManifestReaderTest.kt
│   │   │   │           │                       └── PluginManifestGeneratorTest.kt
│   │   │   │           └── resources/
│   │   │   │               ├── case_as_little_as_possible.xml
│   │   │   │               ├── noAppComponentFactory.xml
│   │   │   │               └── sample-app.xml
│   │   │   ├── runtime/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           └── java/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── core/
│   │   │   │                               └── runtime/
│   │   │   │                                   ├── ActivityOptionsSupport.java
│   │   │   │                                   ├── FixedContextLayoutInflater.java
│   │   │   │                                   ├── PackageManagerInvokeRedirect.java
│   │   │   │                                   ├── PluginActivity.java
│   │   │   │                                   ├── PluginManifest.java
│   │   │   │                                   ├── PluginPackageManager.java
│   │   │   │                                   ├── PluginPartInfo.java
│   │   │   │                                   ├── PluginPartInfoManager.java
│   │   │   │                                   ├── ResolverHook.java
│   │   │   │                                   ├── ShadowActivity.java
│   │   │   │                                   ├── ShadowActivityLifecycleCallbacks.java
│   │   │   │                                   ├── ShadowAppComponentFactory.java
│   │   │   │                                   ├── ShadowApplication.java
│   │   │   │                                   ├── ShadowContext.java
│   │   │   │                                   ├── ShadowDialogSupport.java
│   │   │   │                                   ├── ShadowFactory2.java
│   │   │   │                                   ├── ShadowFragmentSupport.java
│   │   │   │                                   ├── ShadowInstrumentation.java
│   │   │   │                                   ├── ShadowIntentService.java
│   │   │   │                                   ├── ShadowLayoutInflater.java
│   │   │   │                                   ├── ShadowNativeActivity.java
│   │   │   │                                   ├── ShadowPackageItemInfo.java
│   │   │   │                                   ├── ShadowPendingIntent.java
│   │   │   │                                   ├── ShadowService.java
│   │   │   │                                   ├── ShadowWebView.java
│   │   │   │                                   ├── ShadowWebViewLayoutInflater.java
│   │   │   │                                   ├── SubDirContextThemeWrapper.java
│   │   │   │                                   ├── UriConverter.java
│   │   │   │                                   ├── XmlPullParserUtil.java
│   │   │   │                                   └── package-info.java
│   │   │   ├── settings.gradle
│   │   │   ├── transform/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       ├── main/
│   │   │   │       │   └── kotlin/
│   │   │   │       │       └── com/
│   │   │   │       │           └── tencent/
│   │   │   │       │               └── shadow/
│   │   │   │       │                   └── core/
│   │   │   │       │                       └── transform/
│   │   │   │       │                           ├── DeprecatedTransformWrapper.kt
│   │   │   │       │                           ├── GradleTransformWrapper.kt
│   │   │   │       │                           ├── ShadowTransform.kt
│   │   │   │       │                           ├── TransformManager.kt
│   │   │   │       │                           └── specific/
│   │   │   │       │                               ├── ActivityOptionsSupportTransform.kt
│   │   │   │       │                               ├── ActivityTransform.kt
│   │   │   │       │                               ├── AppComponentFactoryTransform.kt
│   │   │   │       │                               ├── ApplicationTransform.kt
│   │   │   │       │                               ├── ContentProviderTransform.kt
│   │   │   │       │                               ├── DialogSupportTransform.kt
│   │   │   │       │                               ├── FragmentSupportTransform.kt
│   │   │   │       │                               ├── InstrumentationTransform.kt
│   │   │   │       │                               ├── IntentServiceTransform.kt
│   │   │   │       │                               ├── KeepHostContextTransform.kt
│   │   │   │       │                               ├── LayoutInflaterTransform.kt
│   │   │   │       │                               ├── PackageItemInfoTransform.kt
│   │   │   │       │                               ├── PackageManagerTransform.kt
│   │   │   │       │                               ├── PendingIntentTransform.kt
│   │   │   │       │                               ├── ReceiverSupportTransform.kt
│   │   │   │       │                               ├── ServiceTransform.kt
│   │   │   │       │                               ├── SimpleRenameTransform.kt
│   │   │   │       │                               └── WebViewTransform.kt
│   │   │   │       └── test/
│   │   │   │           ├── java/
│   │   │   │           │   ├── android/
│   │   │   │           │   │   ├── app/
│   │   │   │           │   │   │   ├── Activity.java
│   │   │   │           │   │   │   ├── Application.java
│   │   │   │           │   │   │   ├── Fragment.java
│   │   │   │           │   │   │   ├── Instrumentation.java
│   │   │   │           │   │   │   └── Service.java
│   │   │   │           │   │   ├── content/
│   │   │   │           │   │   │   ├── BroadcastReceiver.java
│   │   │   │           │   │   │   ├── ComponentName.java
│   │   │   │           │   │   │   ├── Context.java
│   │   │   │           │   │   │   ├── Intent.java
│   │   │   │           │   │   │   ├── pm/
│   │   │   │           │   │   │   │   ├── ActivityInfo.java
│   │   │   │           │   │   │   │   ├── ApplicationInfo.java
│   │   │   │           │   │   │   │   ├── PackageInfo.java
│   │   │   │           │   │   │   │   ├── PackageItemInfo.java
│   │   │   │           │   │   │   │   ├── PackageManager.java
│   │   │   │           │   │   │   │   ├── ProviderInfo.java
│   │   │   │           │   │   │   │   └── ServiceInfo.java
│   │   │   │           │   │   │   └── res/
│   │   │   │           │   │   │       └── XmlResourceParser.java
│   │   │   │           │   │   ├── os/
│   │   │   │           │   │   │   ├── Bundle.java
│   │   │   │           │   │   │   └── IBinder.java
│   │   │   │           │   │   ├── util/
│   │   │   │           │   │   │   └── AttributeSet.java
│   │   │   │           │   │   └── webkit/
│   │   │   │           │   │       └── WebView.java
│   │   │   │           │   ├── com/
│   │   │   │           │   │   └── tencent/
│   │   │   │           │   │       └── shadow/
│   │   │   │           │   │           └── core/
│   │   │   │           │   │               └── runtime/
│   │   │   │           │   │                   ├── PackageManagerInvokeRedirect.java
│   │   │   │           │   │                   ├── PluginPartInfo.java
│   │   │   │           │   │                   ├── PluginPartInfoManager.java
│   │   │   │           │   │                   ├── ShadowActivity.java
│   │   │   │           │   │                   ├── ShadowApplication.java
│   │   │   │           │   │                   ├── ShadowContext.java
│   │   │   │           │   │                   ├── ShadowFragmentSupport.java
│   │   │   │           │   │                   ├── ShadowInstrumentation.java
│   │   │   │           │   │                   └── ShadowWebView.java
│   │   │   │           │   └── test/
│   │   │   │           │       ├── EggReceiver.java
│   │   │   │           │       ├── TestActivity.java
│   │   │   │           │       ├── TestActivityLifecycleCallbacks.java
│   │   │   │           │       ├── TestApplication.java
│   │   │   │           │       ├── TestInstrumentation.java
│   │   │   │           │       ├── TestPackageManager.java
│   │   │   │           │       ├── TestReceiver.java
│   │   │   │           │       ├── TestService.java
│   │   │   │           │       ├── TestWebView.java
│   │   │   │           │       └── fragment/
│   │   │   │           │           ├── TestFragment.java
│   │   │   │           │           ├── UseGetActivityFragment.java
│   │   │   │           │           ├── UseStartActivityForResultFragment.java
│   │   │   │           │           └── UseStartActivityFragment.java
│   │   │   │           └── kotlin/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── core/
│   │   │   │                               └── transform/
│   │   │   │                                   └── specific/
│   │   │   │                                       ├── ActivityLifecycleCallbacksTransformTest.kt
│   │   │   │                                       ├── ActivityTransformTest.kt
│   │   │   │                                       ├── ApplicationTransformTest.kt
│   │   │   │                                       ├── FragmentSupportTransformTest.kt
│   │   │   │                                       ├── InstrumentationTransformTest.kt
│   │   │   │                                       ├── PackageManagerTransformTest.kt
│   │   │   │                                       ├── ReceiverSupportTransformTest.kt
│   │   │   │                                       ├── ServiceTransformTest.kt
│   │   │   │                                       ├── SimpleRenameTransformTest.kt
│   │   │   │                                       └── WebViewTransformTest.kt
│   │   │   ├── transform-kit/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── build.gradle
│   │   │   │   └── src/
│   │   │   │       ├── main/
│   │   │   │       │   ├── java/
│   │   │   │       │   │   └── javassist/
│   │   │   │       │   │       ├── EnhancedCodeConverter.java
│   │   │   │       │   │       └── convert/
│   │   │   │       │   │           ├── TransformCallExceptSuperCallToStatic.java
│   │   │   │       │   │           └── TransformNewClassFix.java
│   │   │   │       │   └── kotlin/
│   │   │   │       │       └── com/
│   │   │   │       │           └── tencent/
│   │   │   │       │               └── shadow/
│   │   │   │       │                   └── core/
│   │   │   │       │                       └── transform_kit/
│   │   │   │       │                           ├── AbstractTransform.kt
│   │   │   │       │                           ├── AbstractTransformManager.kt
│   │   │   │       │                           ├── AndroidClassPoolBuilder.kt
│   │   │   │       │                           ├── AutoMakeMissingClassPool.kt
│   │   │   │       │                           ├── ClassTransform.kt
│   │   │   │       │                           ├── JavassistTransform.kt
│   │   │   │       │                           ├── OverrideCheck.kt
│   │   │   │       │                           ├── ReplaceClassName.kt
│   │   │   │       │                           ├── SpecificTransform.kt
│   │   │   │       │                           └── TransformStep.kt
│   │   │   │       └── test/
│   │   │   │           ├── java/
│   │   │   │           │   └── test/
│   │   │   │           │       ├── MethodRedirectToStatic.java
│   │   │   │           │       └── override/
│   │   │   │           │           └── Foo.java
│   │   │   │           └── kotlin/
│   │   │   │               └── com/
│   │   │   │                   └── tencent/
│   │   │   │                       └── shadow/
│   │   │   │                           └── core/
│   │   │   │                               └── transform_kit/
│   │   │   │                                   ├── AbstractTransformTest.kt
│   │   │   │                                   ├── FilterRefClassesTest.kt
│   │   │   │                                   ├── OverrideCheckTest.kt
│   │   │   │                                   └── RedirectMethodCallToStaticTest.kt
│   │   │   └── utils/
│   │   │       ├── .gitignore
│   │   │       ├── build.gradle
│   │   │       └── src/
│   │   │           ├── main/
│   │   │           │   └── java/
│   │   │           │       └── com/
│   │   │           │           └── tencent/
│   │   │           │               └── shadow/
│   │   │           │                   └── core/
│   │   │           │                       └── utils/
│   │   │           │                           └── Md5.java
│   │   │           └── test/
│   │   │               └── java/
│   │   │                   └── com/
│   │   │                       └── tencent/
│   │   │                           └── shadow/
│   │   │                               └── core/
│   │   │                                   └── utils/
│   │   │                                       └── Md5Test.java
│   │   └── dynamic/
│   │       ├── .gitignore
│   │       ├── build.gradle
│   │       ├── dynamic-apk/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   ├── proguard-rules.pro
│   │       │   └── src/
│   │       │       └── main/
│   │       │           └── java/
│   │       │               └── com/
│   │       │                   └── tencent/
│   │       │                       └── shadow/
│   │       │                           └── dynamic/
│   │       │                               └── apk/
│   │       │                                   ├── ApkClassLoader.java
│   │       │                                   ├── ChangeApkContextWrapper.java
│   │       │                                   └── ImplLoader.java
│   │       ├── dynamic-host/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   ├── proguard-rules.pro
│   │       │   └── src/
│   │       │       └── main/
│   │       │           └── java/
│   │       │               └── com/
│   │       │                   └── tencent/
│   │       │                       └── shadow/
│   │       │                           └── dynamic/
│   │       │                               └── host/
│   │       │                                   ├── BasePluginProcessService.java
│   │       │                                   ├── BinderUuidManager.java
│   │       │                                   ├── DynamicPluginManager.java
│   │       │                                   ├── DynamicRuntime.java
│   │       │                                   ├── EnterCallback.java
│   │       │                                   ├── FailedException.java
│   │       │                                   ├── LoaderFactory.java
│   │       │                                   ├── LoaderImplLoader.java
│   │       │                                   ├── ManagerFactory.java
│   │       │                                   ├── ManagerImplLoader.java
│   │       │                                   ├── NotFoundException.java
│   │       │                                   ├── PluginLoaderImpl.java
│   │       │                                   ├── PluginManager.java
│   │       │                                   ├── PluginManagerImpl.java
│   │       │                                   ├── PluginManagerUpdater.java
│   │       │                                   ├── PluginProcessService.java
│   │       │                                   ├── PpsBinder.java
│   │       │                                   ├── PpsController.java
│   │       │                                   ├── PpsStatus.java
│   │       │                                   └── UuidManager.java
│   │       ├── dynamic-host-multi-loader-ext/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   ├── proguard-rules.pro
│   │       │   └── src/
│   │       │       └── main/
│   │       │           └── java/
│   │       │               └── com/
│   │       │                   └── tencent/
│   │       │                       └── shadow/
│   │       │                           └── dynamic/
│   │       │                               └── host/
│   │       │                                   ├── MultiDynamicContainer.java
│   │       │                                   ├── MultiLoaderPluginProcessService.java
│   │       │                                   ├── MultiLoaderPpsBinder.java
│   │       │                                   └── MultiLoaderPpsController.java
│   │       ├── dynamic-loader/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   └── src/
│   │       │       └── main/
│   │       │           └── java/
│   │       │               └── com/
│   │       │                   └── tencent/
│   │       │                       └── shadow/
│   │       │                           └── dynamic/
│   │       │                               └── loader/
│   │       │                                   ├── PluginLoader.java
│   │       │                                   └── PluginServiceConnection.java
│   │       ├── dynamic-loader-impl/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   └── src/
│   │       │       └── main/
│   │       │           └── kotlin/
│   │       │               └── com/
│   │       │                   └── tencent/
│   │       │                       └── shadow/
│   │       │                           └── dynamic/
│   │       │                               ├── impl/
│   │       │                               │   └── LoaderFactoryImpl.kt
│   │       │                               └── loader/
│   │       │                                   └── impl/
│   │       │                                       ├── BinderPluginServiceConnection.kt
│   │       │                                       ├── CoreLoaderFactory.kt
│   │       │                                       ├── DynamicPluginLoader.kt
│   │       │                                       ├── LoaderFactoryImpl.kt
│   │       │                                       └── PluginLoaderBinder.kt
│   │       ├── dynamic-manager/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   ├── proguard-rules.pro
│   │       │   └── src/
│   │       │       └── main/
│   │       │           └── java/
│   │       │               └── com/
│   │       │                   └── tencent/
│   │       │                       └── shadow/
│   │       │                           └── dynamic/
│   │       │                               └── manager/
│   │       │                                   ├── BaseDynamicPluginManager.java
│   │       │                                   ├── BinderPluginLoader.java
│   │       │                                   ├── PluginManagerThatUseDynamicLoader.java
│   │       │                                   ├── PluginServiceConnectionBinder.java
│   │       │                                   ├── UuidManagerBinder.java
│   │       │                                   └── UuidManagerImpl.java
│   │       ├── dynamic-manager-multi-loader-ext/
│   │       │   ├── .gitignore
│   │       │   ├── build.gradle
│   │       │   ├── proguard-rules.pro
│   │       │   └── src/
│   │       │       └── main/
│   │       │           └── java/
│   │       │               └── com/
│   │       │                   └── tencent/
│   │       │                       └── shadow/
│   │       │                           └── dynamic/
│   │       │                               └── manager/
│   │       │                                   └── PluginManagerThatSupportMultiLoader.java
│   │       ├── gradle/
│   │       │   └── wrapper/
│   │       │       ├── gradle-wrapper.jar
│   │       │       └── gradle-wrapper.properties
│   │       ├── gradle.properties
│   │       ├── gradlew
│   │       ├── gradlew.bat
│   │       └── settings.gradle
│   └── test/
│       ├── common-jar-settings-test/
│       │   ├── .gitignore
│       │   ├── build.gradle
│       │   └── src/
│       │       └── main/
│       │           └── java/
│       │               └── Test.java
│       ├── dynamic/
│       │   ├── host/
│       │   │   └── test-dynamic-host/
│       │   │       ├── .gitignore
│       │   │       ├── build.gradle
│       │   │       ├── proguard-rules.pro
│       │   │       └── src/
│       │   │           ├── androidTest/
│       │   │           │   ├── AndroidManifest.xml
│       │   │           │   └── java/
│       │   │           │       └── com/
│       │   │           │           ├── google/
│       │   │           │           │   └── devtools/
│       │   │           │           │       └── build/
│       │   │           │           │           └── android/
│       │   │           │           │               └── desugar/
│       │   │           │           │                   └── runtime/
│       │   │           │           │                       └── ThrowableExtension.java
│       │   │           │           └── tencent/
│       │   │           │               └── shadow/
│       │   │           │                   └── test/
│       │   │           │                       ├── CreateResourceTest.java
│       │   │           │                       ├── CustomAndroidJUnitRunner.java
│       │   │           │                       ├── PluginTest.java
│       │   │           │                       ├── cases/
│       │   │           │                       │   ├── plugin_androidx/
│       │   │           │                       │   │   ├── AppCompatActivityTest.java
│       │   │           │                       │   │   ├── ComponentFactoryTest.java
│       │   │           │                       │   │   ├── LiveDataWithActivityTest.java
│       │   │           │                       │   │   └── PluginAndroidxAppTest.java
│       │   │           │                       │   ├── plugin_main/
│       │   │           │                       │   │   ├── ActivityContextSubDirTest.java
│       │   │           │                       │   │   ├── ActivityLifecycleCallbacksTest.java
│       │   │           │                       │   │   ├── ActivityReCreateTest.java
│       │   │           │                       │   │   ├── ActivityWindowSoftModeTest.java
│       │   │           │                       │   │   ├── ApplicationContextInActivityTest.java
│       │   │           │                       │   │   ├── ApplicationContextSubDirTest.java
│       │   │           │                       │   │   ├── ApplicationTest.java
│       │   │           │                       │   │   ├── BasicTest.java
│       │   │           │                       │   │   ├── BootClassloaderTest.java
│       │   │           │                       │   │   ├── ContextGetPackageCodePathTest.java
│       │   │           │                       │   │   ├── GetCallingActivityTest.java
│       │   │           │                       │   │   ├── HostInterfaceTest.java
│       │   │           │                       │   │   ├── InstrumentationTest.java
│       │   │           │                       │   │   ├── LayoutInflaterTest.java
│       │   │           │                       │   │   ├── NullRefInXmlTest.java
│       │   │           │                       │   │   ├── PackageManagerTest.java
│       │   │           │                       │   │   ├── PluginBroadcastReceiverTest.java
│       │   │           │                       │   │   ├── PluginMainAppTest.java
│       │   │           │                       │   │   ├── PluginServiceTest.java
│       │   │           │                       │   │   ├── RegisterNullReceiverTest.java
│       │   │           │                       │   │   ├── ReinstallPluginTest.java
│       │   │           │                       │   │   ├── ServiceContextSubDirTest.java
│       │   │           │                       │   │   ├── SubDirContextThemeWrapperTest.java
│       │   │           │                       │   │   ├── TargetFragmentTest.java
│       │   │           │                       │   │   ├── ThemeTest.java
│       │   │           │                       │   │   ├── ViewIdTest.java
│       │   │           │                       │   │   ├── application_info/
│       │   │           │                       │   │   │   ├── ApplicationInfoTest.java
│       │   │           │                       │   │   │   ├── CommonApplicationInfoTest.java
│       │   │           │                       │   │   │   ├── ContextGetApplicationInfoTest.java
│       │   │           │                       │   │   │   ├── PackageManagerGetOtherInstalledApplicationInfoTest.java
│       │   │           │                       │   │   │   └── PackageManagerGetSelfApplicationInfoTest.java
│       │   │           │                       │   │   ├── dialog_support/
│       │   │           │                       │   │   │   ├── AlertDialogOwnerActivityTest.java
│       │   │           │                       │   │   │   └── DialogOwnerActivityTest.java
│       │   │           │                       │   │   └── fragment_support/
│       │   │           │                       │   │       ├── CommonFragmentSupportTest.java
│       │   │           │                       │   │       ├── FragmentSupportTest.java
│       │   │           │                       │   │       ├── ProgrammaticallyAddBaseFragmentTest.java
│       │   │           │                       │   │       ├── ProgrammaticallyAddDialogFragmentTest.java
│       │   │           │                       │   │       ├── ProgrammaticallyAddFragmentTest.java
│       │   │           │                       │   │       ├── ProgrammaticallyAddNormalFragmentTest.java
│       │   │           │                       │   │       ├── ProgrammaticallyAddOnlyOverrideOnAttachActivityFragmentTest.java
│       │   │           │                       │   │       ├── ProgrammaticallyAddOnlyOverrideOnAttachContextFragmentTest.java
│       │   │           │                       │   │       ├── ProgrammaticallyAddSubFragmentTest.java
│       │   │           │                       │   │       ├── XmlAddBaseFragmentTest.java
│       │   │           │                       │   │       ├── XmlAddFragmentTest.java
│       │   │           │                       │   │       ├── XmlAddNormalFragmentTest.java
│       │   │           │                       │   │       └── XmlAddSubFragmentTest.java
│       │   │           │                       │   └── plugin_service/
│       │   │           │                       │       ├── PluginIntentServiceConnectionTest.java
│       │   │           │                       │       ├── PluginServiceAppTest.java
│       │   │           │                       │       └── PluginServiceConnectionTest.java
│       │   │           │                       └── repeat/
│       │   │           │                           ├── Repeat.java
│       │   │           │                           └── RepeatRule.java
│       │   │           └── main/
│       │   │               ├── AndroidManifest.xml
│       │   │               ├── java/
│       │   │               │   └── com/
│       │   │               │       └── tencent/
│       │   │               │           └── shadow/
│       │   │               │               └── test/
│       │   │               │                   └── dynamic/
│       │   │               │                       └── host/
│       │   │               │                           ├── AndroidLogLoggerFactory.java
│       │   │               │                           ├── BindPluginServiceActivity.java
│       │   │               │                           ├── HostApplication.java
│       │   │               │                           ├── JumpToPluginActivity.java
│       │   │               │                           ├── MainActivity.java
│       │   │               │                           ├── PluginHelper.java
│       │   │               │                           ├── PluginLoadActivity.java
│       │   │               │                           ├── PluginProcessPPS.java
│       │   │               │                           ├── PluginServiceProcessPPS.java
│       │   │               │                           ├── SimpleIdlingResourceImpl.java
│       │   │               │                           └── manager/
│       │   │               │                               ├── FixedPathPmUpdater.java
│       │   │               │                               └── Shadow.java
│       │   │               └── res/
│       │   │                   ├── layout/
│       │   │                   │   ├── activity_jump_to_plugin.xml
│       │   │                   │   ├── activity_load.xml
│       │   │                   │   └── part_key_adapter.xml
│       │   │                   └── values/
│       │   │                       ├── strings.xml
│       │   │                       └── themes.xml
│       │   ├── manager/
│       │   │   └── test-dynamic-manager/
│       │   │       ├── .gitignore
│       │   │       ├── build.gradle
│       │   │       ├── proguard-rules.pro
│       │   │       └── src/
│       │   │           └── main/
│       │   │               ├── AndroidManifest.xml
│       │   │               ├── java/
│       │   │               │   └── com/
│       │   │               │       └── tencent/
│       │   │               │           └── shadow/
│       │   │               │               ├── dynamic/
│       │   │               │               │   └── impl/
│       │   │               │               │       ├── ManagerFactoryImpl.java
│       │   │               │               │       └── WhiteList.java
│       │   │               │               └── test/
│       │   │               │                   ├── UiUtil.java
│       │   │               │                   ├── cases/
│       │   │               │                   │   ├── PluginIntentServiceConnectionTestCase.java
│       │   │               │                   │   └── PluginServiceConnectionTestCase.java
│       │   │               │                   └── dynamic/
│       │   │               │                       └── manager/
│       │   │               │                           ├── ActivityTestDynamicPluginManager.java
│       │   │               │                           ├── FastPluginManager.java
│       │   │               │                           ├── ReinstallPluginTestDynamicPluginManager.java
│       │   │               │                           ├── ServiceTestDynamicPluginManager.java
│       │   │               │                           └── TestDynamicPluginManager.java
│       │   │               └── res/
│       │   │                   └── layout/
│       │   │                       └── activity_load_plugin.xml
│       │   └── plugin/
│       │       ├── test-dynamic-loader/
│       │       │   ├── .gitignore
│       │       │   ├── build.gradle
│       │       │   ├── proguard-rules.pro
│       │       │   └── src/
│       │       │       └── main/
│       │       │           ├── AndroidManifest.xml
│       │       │           └── java/
│       │       │               └── com/
│       │       │                   └── tencent/
│       │       │                       └── shadow/
│       │       │                           ├── dynamic/
│       │       │                           │   └── loader/
│       │       │                           │       └── impl/
│       │       │                           │           └── CoreLoaderFactoryImpl.java
│       │       │                           └── test/
│       │       │                               └── dynamic/
│       │       │                                   └── loader/
│       │       │                                       ├── TestComponentManager.java
│       │       │                                       └── TestPluginLoader.java
│       │       └── test-dynamic-runtime/
│       │           ├── .gitignore
│       │           ├── build.gradle
│       │           ├── proguard-rules.pro
│       │           └── src/
│       │               └── main/
│       │                   ├── AndroidManifest.xml
│       │                   └── java/
│       │                       └── com/
│       │                           └── tencent/
│       │                               └── shadow/
│       │                                   └── test/
│       │                                       └── dynamic/
│       │                                           └── runtime/
│       │                                               └── container/
│       │                                                   ├── PluginDefaultProxyActivity.java
│       │                                                   ├── PluginSingleInstance1ProxyActivity.java
│       │                                                   └── PluginSingleTask1ProxyActivity.java
│       ├── gradle-plugin-agp-compat-test/
│       │   ├── .gitignore
│       │   ├── README.md
│       │   ├── build.gradle
│       │   ├── gradle/
│       │   │   └── wrapper/
│       │   │       ├── gradle-wrapper.jar
│       │   │       └── gradle-wrapper.properties
│       │   ├── gradle.properties
│       │   ├── gradlew
│       │   ├── gradlew.bat
│       │   ├── settings.gradle
│       │   ├── stub-project/
│       │   │   ├── .gitignore
│       │   │   ├── build.gradle
│       │   │   ├── proguard-rules.pro
│       │   │   ├── settings.gradle
│       │   │   └── src/
│       │   │       └── main/
│       │   │           ├── AndroidManifest.xml
│       │   │           ├── java/
│       │   │           │   └── PluginManifestIncludeTest.java
│       │   │           └── res/
│       │   │               └── values/
│       │   │                   └── themes.xml
│       │   ├── test_JDK11.sh
│       │   ├── test_JDK17.sh
│       │   ├── test_clean.sh
│       │   └── test_prepare.sh
│       ├── lib/
│       │   ├── constant/
│       │   │   ├── .gitignore
│       │   │   ├── build.gradle
│       │   │   ├── proguard-rules.pro
│       │   │   └── src/
│       │   │       └── main/
│       │   │           ├── AndroidManifest.xml
│       │   │           └── java/
│       │   │               └── com/
│       │   │                   └── tencent/
│       │   │                       └── shadow/
│       │   │                           └── test/
│       │   │                               └── lib/
│       │   │                                   └── constant/
│       │   │                                       └── Constant.java
│       │   ├── custom-view/
│       │   │   ├── .gitignore
│       │   │   ├── build.gradle
│       │   │   ├── proguard-rules.pro
│       │   │   └── src/
│       │   │       └── main/
│       │   │           ├── AndroidManifest.xml
│       │   │           └── java/
│       │   │               └── com/
│       │   │                   └── tencent/
│       │   │                       └── shadow/
│       │   │                           └── test/
│       │   │                               └── lib/
│       │   │                                   └── custom_view/
│       │   │                                       └── TestViewConstructorCacheView.java
│       │   ├── plugin-use-host-code-lib/
│       │   │   ├── .gitignore
│       │   │   ├── build.gradle
│       │   │   └── src/
│       │   │       └── main/
│       │   │           └── java/
│       │   │               └── com/
│       │   │                   └── tencent/
│       │   │                       └── shadow/
│       │   │                           └── test/
│       │   │                               └── lib/
│       │   │                                   └── plugin_use_host_code_lib/
│       │   │                                       ├── interfaces/
│       │   │                                       │   ├── HostTestInterface.java
│       │   │                                       │   └── subpackage/
│       │   │                                       │       └── Foo.java
│       │   │                                       └── other/
│       │   │                                           └── HostOtherInterface.java
│       │   └── test-manager/
│       │       ├── .gitignore
│       │       ├── build.gradle
│       │       └── src/
│       │           └── main/
│       │               └── java/
│       │                   └── com/
│       │                       └── tencent/
│       │                           └── shadow/
│       │                               └── test/
│       │                                   └── lib/
│       │                                       └── test_manager/
│       │                                           ├── SimpleIdlingResource.java
│       │                                           └── TestManager.java
│       ├── none-dynamic/
│       │   └── host/
│       │       └── test-none-dynamic-host/
│       │           ├── .gitignore
│       │           ├── build.gradle
│       │           ├── proguard-rules.pro
│       │           └── src/
│       │               └── main/
│       │                   ├── AndroidManifest.xml
│       │                   ├── java/
│       │                   │   └── com/
│       │                   │       └── tencent/
│       │                   │           └── shadow/
│       │                   │               └── test/
│       │                   │                   └── none_dynamic/
│       │                   │                       └── host/
│       │                   │                           ├── DefaultContainerActivity.java
│       │                   │                           ├── HostApplication.java
│       │                   │                           ├── MainActivity.java
│       │                   │                           ├── PreparePluginApkBloc.java
│       │                   │                           ├── SLoggerFactory.java
│       │                   │                           ├── SingleTaskContainerActivity.java
│       │                   │                           ├── TestComponentManager.java
│       │                   │                           ├── TestLoadingActivity.java
│       │                   │                           └── TestPluginLoader.java
│       │                   └── res/
│       │                       ├── layout/
│       │                       │   ├── activity_main.xml
│       │                       │   └── qq_nearby_now_loading.xml
│       │                       └── values/
│       │                           ├── strings.xml
│       │                           └── themes.xml
│       └── plugin/
│           ├── androidx-cases/
│           │   └── test-plugin-androidx-cases/
│           │       ├── .gitignore
│           │       ├── build.gradle
│           │       ├── proguard-rules.pro
│           │       └── src/
│           │           └── main/
│           │               ├── AndroidManifest.xml
│           │               └── java/
│           │                   └── com/
│           │                       └── tencent/
│           │                           └── shadow/
│           │                               └── test/
│           │                                   └── plugin/
│           │                                       └── androidx_cases/
│           │                                           └── lib/
│           │                                               ├── AppCompatTestActivity.java
│           │                                               ├── AppComponentFactoryTestActivity.java
│           │                                               ├── LiveDataWithActivityTestActivity.java
│           │                                               ├── TestComponentFactory.java
│           │                                               └── UiUtil.java
│           ├── general-cases/
│           │   └── test-plugin-general-cases/
│           │       ├── .gitignore
│           │       ├── build.gradle
│           │       ├── proguard-rules.pro
│           │       └── src/
│           │           ├── androidTest/
│           │           │   └── java/
│           │           │       └── com/
│           │           │           └── tencent/
│           │           │               └── shadow/
│           │           │                   └── test/
│           │           │                       └── plugin/
│           │           │                           └── general_cases/
│           │           │                               └── app/
│           │           │                                   ├── ActivityLifecycleCallbacksTest.java
│           │           │                                   ├── CustomAndroidJUnitRunner.java
│           │           │                                   ├── NormalAppTest.java
│           │           │                                   └── PackageManagerTest.java
│           │           └── main/
│           │               ├── AndroidManifest.xml
│           │               ├── java/
│           │               │   ├── com/
│           │               │   │   └── tencent/
│           │               │   │       └── shadow/
│           │               │   │           └── test/
│           │               │   │               └── plugin/
│           │               │   │                   └── general_cases/
│           │               │   │                       └── lib/
│           │               │   │                           ├── gallery/
│           │               │   │                           │   ├── TestApplication.java
│           │               │   │                           │   └── util/
│           │               │   │                           │       ├── ToastUtil.java
│           │               │   │                           │       └── UiUtil.java
│           │               │   │                           └── usecases/
│           │               │   │                               ├── SimpleIdlingResource.java
│           │               │   │                               ├── WithIdlingResourceActivity.java
│           │               │   │                               ├── activity/
│           │               │   │                               │   ├── ApplicationContextActivity.java
│           │               │   │                               │   ├── PrintActivityResultActivity.java
│           │               │   │                               │   ├── TestActivityOnCreate.java
│           │               │   │                               │   ├── TestActivityOrientation.java
│           │               │   │                               │   ├── TestActivityReCreate.java
│           │               │   │                               │   ├── TestActivityReCreateBySystem.java
│           │               │   │                               │   ├── TestActivityWindowSoftMode.java
│           │               │   │                               │   ├── TestCallingActivity.java
│           │               │   │                               │   ├── TestListActivity.java
│           │               │   │                               │   └── WindowSoftModeJumpActivity.java
│           │               │   │                               ├── application/
│           │               │   │                               │   ├── ActivityLifecycleCallbacksTestActivity.java
│           │               │   │                               │   ├── TestApplicationActivity.java
│           │               │   │                               │   └── TestGetApplicationInfoActivity.java
│           │               │   │                               ├── classloader/
│           │               │   │                               │   └── TestBootClassloaderActivity.java
│           │               │   │                               ├── context/
│           │               │   │                               │   ├── ActivityContextSubDirTestActivity.java
│           │               │   │                               │   ├── ApplicationContextSubDirTestActivity.java
│           │               │   │                               │   ├── ContextGetPackageCodePathTestActivity.java
│           │               │   │                               │   ├── RegisterNullReceiverActivity.java
│           │               │   │                               │   ├── ServiceContextSubDirTestActivity.java
│           │               │   │                               │   ├── SubDirContextThemeWrapperTestActivity.java
│           │               │   │                               │   ├── TestLayoutInflaterActivity.java
│           │               │   │                               │   └── TestThemeActivity.java
│           │               │   │                               ├── dialog/
│           │               │   │                               │   ├── TestAlertDialogActivity.java
│           │               │   │                               │   ├── TestDialog.java
│           │               │   │                               │   └── TestDialogActivity.java
│           │               │   │                               ├── fragment/
│           │               │   │                               │   ├── BaseFragment.java
│           │               │   │                               │   ├── FragmentStartedActivity.java
│           │               │   │                               │   ├── OnlyOverrideActivityMethodBaseFragment.java
│           │               │   │                               │   ├── OnlyOverrideContextMethodBaseFragment.java
│           │               │   │                               │   ├── ProgrammaticallyAddFragmentActivity.java
│           │               │   │                               │   ├── SubTestBaseFragment.java
│           │               │   │                               │   ├── TargetFragmentTestActivity.java
│           │               │   │                               │   ├── TestBaseFragment.java
│           │               │   │                               │   ├── TestDialogFragment.java
│           │               │   │                               │   ├── TestFragment.java
│           │               │   │                               │   ├── TestFragmentCommonLogic.java
│           │               │   │                               │   ├── TestNormalFragment.java
│           │               │   │                               │   ├── TestSubFragment.java
│           │               │   │                               │   ├── TestSubOnlyOverrideOnAttachActivityFragment.java
│           │               │   │                               │   ├── TestSubOnlyOverrideOnAttachContextFragment.java
│           │               │   │                               │   └── XmlAddFragmentActivity.java
│           │               │   │                               ├── instrumentation/
│           │               │   │                               │   ├── MyInstrumentation.java
│           │               │   │                               │   └── TestInstrumentationActivity.java
│           │               │   │                               ├── interfaces/
│           │               │   │                               │   └── TestHostInterfaceActivity.java
│           │               │   │                               ├── packagemanager/
│           │               │   │                               │   └── TestPackageManagerActivity.java
│           │               │   │                               ├── provider/
│           │               │   │                               │   ├── TestDBContentProviderActivity.java
│           │               │   │                               │   ├── TestDBHelper.java
│           │               │   │                               │   ├── TestFileProviderActivity.java
│           │               │   │                               │   ├── TestProvider.java
│           │               │   │                               │   └── TestProviderInfo.java
│           │               │   │                               ├── receiver/
│           │               │   │                               │   ├── BroadCastHelper.java
│           │               │   │                               │   ├── MyReceiver.java
│           │               │   │                               │   ├── ReceiverWithoutAction.java
│           │               │   │                               │   └── TestReceiverActivity.java
│           │               │   │                               ├── service/
│           │               │   │                               │   ├── TestService.java
│           │               │   │                               │   └── TestStartServiceActivity.java
│           │               │   │                               └── view/
│           │               │   │                                   ├── TestNullRefInXmlActivity.java
│           │               │   │                                   ├── TestViewConstructorCache.java
│           │               │   │                                   └── TestViewIdActivity.java
│           │               │   └── org/
│           │               │       └── xmlpull/
│           │               │           └── v1/
│           │               │               └── XmlPullParser.java
│           │               └── res/
│           │                   ├── layout/
│           │                   │   ├── activity_list.xml
│           │                   │   ├── activity_test_file_provider.xml
│           │                   │   ├── activity_test_re_create_by_system.xml
│           │                   │   ├── layout_activity_lifecycle.xml
│           │                   │   ├── layout_common.xml
│           │                   │   ├── layout_fragment_activity.xml
│           │                   │   ├── layout_fragment_test.xml
│           │                   │   ├── layout_list_item.xml
│           │                   │   ├── layout_orientation.xml
│           │                   │   ├── layout_packagemanager.xml
│           │                   │   ├── layout_provider_db.xml
│           │                   │   ├── layout_receiver.xml
│           │                   │   ├── layout_recreate.xml
│           │                   │   ├── layout_result.xml
│           │                   │   ├── layout_service.xml
│           │                   │   ├── layout_softmode.xml
│           │                   │   ├── layout_test_null_ref.xml
│           │                   │   ├── layout_test_view_cons_cache.xml
│           │                   │   ├── layout_test_view_id.xml
│           │                   │   ├── layout_xml_add_base_fragment_activity.xml
│           │                   │   ├── layout_xml_add_normal_fragment_activity.xml
│           │                   │   └── layout_xml_add_sub_fragment_activity.xml
│           │                   ├── values/
│           │                   │   ├── strings.xml
│           │                   │   └── themes.xml
│           │                   └── xml/
│           │                       └── filepaths.xml
│           └── particular-cases/
│               └── plugin-service-for-host/
│                   ├── .gitignore
│                   ├── build.gradle
│                   └── src/
│                       └── main/
│                           ├── AndroidManifest.xml
│                           └── java/
│                               └── com/
│                                   └── tencent/
│                                       └── shadow/
│                                           └── test/
│                                               └── plugin/
│                                                   └── particular_cases/
│                                                       └── plugin_service_for_host/
│                                                           ├── SystemExitIntentService.java
│                                                           └── SystemExitService.java
└── settings.gradle
Download .txt
Showing preview only (291K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3115 symbols across 451 files)

FILE: projects/sample/dynamic-apk/sample-hello-api-holder/src/main/java/com/tencent/shadow/sample/apk/hello/DynamicHello.java
  class DynamicHello (line 36) | public final class DynamicHello implements IHelloWorld {
    method DynamicHello (line 43) | public DynamicHello(HelloWorldUpdater updater) {
    method sayHelloWorld (line 51) | @Override
    method release (line 61) | public void release() {
    method updateImpl (line 71) | private void updateImpl(Context context) {
    method getHelloWorkdImpl (line 94) | public IHelloWorld getHelloWorkdImpl() {

FILE: projects/sample/dynamic-apk/sample-hello-api-holder/src/main/java/com/tencent/shadow/sample/apk/hello/HelloImplLoader.java
  class HelloImplLoader (line 32) | final class HelloImplLoader extends ImplLoader {
    method HelloImplLoader (line 44) | HelloImplLoader(Context context, File apk) {
    method load (line 52) | IHelloWorldImpl load() {
    method getCustomWhiteList (line 77) | @Override

FILE: projects/sample/dynamic-apk/sample-hello-api-holder/src/main/java/com/tencent/shadow/sample/apk/hello/HelloWorldUpdater.java
  type HelloWorldUpdater (line 30) | public interface HelloWorldUpdater {
    method update (line 34) | Future<File> update();
    method getLatest (line 41) | File getLatest();

FILE: projects/sample/dynamic-apk/sample-hello-api/src/main/java/com/tencent/shadow/sample/api/hello/HelloFactory.java
  type HelloFactory (line 30) | public interface HelloFactory {
    method build (line 31) | IHelloWorldImpl build(Context context);

FILE: projects/sample/dynamic-apk/sample-hello-api/src/main/java/com/tencent/shadow/sample/api/hello/IHelloWorld.java
  type IHelloWorld (line 13) | public interface IHelloWorld {
    method sayHelloWorld (line 14) | void sayHelloWorld(Context context, TextView textView);

FILE: projects/sample/dynamic-apk/sample-hello-api/src/main/java/com/tencent/shadow/sample/api/hello/IHelloWorldImpl.java
  type IHelloWorldImpl (line 31) | public interface IHelloWorldImpl extends IHelloWorld {
    method onCreate (line 33) | void onCreate(Bundle bundle);
    method onSaveInstanceState (line 35) | void onSaveInstanceState(Bundle outState);
    method onDestroy (line 37) | void onDestroy();

FILE: projects/sample/dynamic-apk/sample-hello-apk/src/main/java/com/tencent/shadow/dynamic/impl/HelloFactoryImpl.java
  class HelloFactoryImpl (line 16) | public final class HelloFactoryImpl implements HelloFactory {
    method build (line 17) | @Override

FILE: projects/sample/dynamic-apk/sample-hello-apk/src/main/java/com/tencent/shadow/dynamic/impl/WhiteList.java
  type WhiteList (line 26) | public interface WhiteList {

FILE: projects/sample/dynamic-apk/sample-hello-apk/src/main/java/com/tencent/shadow/sample/api/hello/SampleHelloWorld.java
  class SampleHelloWorld (line 14) | public class SampleHelloWorld implements IHelloWorldImpl {
    method sayHelloWorld (line 15) | @Override
    method onCreate (line 24) | @Override
    method onSaveInstanceState (line 29) | @Override
    method onDestroy (line 34) | @Override

FILE: projects/sample/dynamic-apk/sample-hello-host/src/main/java/com/tencent/shadow/sample/host/AndroidLogLoggerFactory.java
  class AndroidLogLoggerFactory (line 31) | public class AndroidLogLoggerFactory implements ILoggerFactory {
    method getInstance (line 41) | public static ILoggerFactory getInstance() {
    method getLogger (line 47) | public Logger getLogger(String name) {
    class IVLogger (line 58) | class IVLogger implements Logger {
      method IVLogger (line 61) | IVLogger(String name) {
      method getName (line 65) | @Override
      method log (line 70) | private void log(int level, String message, Throwable t) {
      method isTraceEnabled (line 104) | @Override
      method trace (line 109) | @Override
      method trace (line 114) | @Override
      method trace (line 120) | @Override
      method trace (line 126) | @Override
      method trace (line 132) | @Override
      method isDebugEnabled (line 137) | @Override
      method debug (line 142) | @Override
      method debug (line 147) | @Override
      method debug (line 153) | @Override
      method debug (line 159) | @Override
      method debug (line 165) | @Override
      method isInfoEnabled (line 170) | @Override
      method info (line 175) | @Override
      method info (line 180) | @Override
      method info (line 186) | @Override
      method info (line 192) | @Override
      method info (line 198) | @Override
      method isWarnEnabled (line 203) | @Override
      method warn (line 208) | @Override
      method warn (line 213) | @Override
      method warn (line 219) | @Override
      method warn (line 225) | @Override
      method warn (line 231) | @Override
      method isErrorEnabled (line 236) | @Override
      method error (line 241) | @Override
      method error (line 246) | @Override
      method error (line 252) | @Override
      method error (line 258) | @Override
      method error (line 264) | @Override
  class FormattingTuple (line 271) | class FormattingTuple {
    method FormattingTuple (line 279) | public FormattingTuple(String message) {
    method FormattingTuple (line 283) | public FormattingTuple(String message, Object[] argArray, Throwable th...
    method getMessage (line 289) | public String getMessage() {
    method getArgArray (line 293) | public Object[] getArgArray() {
    method getThrowable (line 297) | public Throwable getThrowable() {
  class MessageFormatter (line 303) | final class MessageFormatter {
    method format (line 326) | final public static FormattingTuple format(String messagePattern, Obje...
    method format (line 349) | final public static FormattingTuple format(final String messagePattern...
    method getThrowableCandidate (line 354) | static final Throwable getThrowableCandidate(Object[] argArray) {
    method arrayFormat (line 366) | final public static FormattingTuple arrayFormat(final String messagePa...
    method trimmedCopy (line 375) | private static Object[] trimmedCopy(Object[] argArray) {
    method arrayFormat (line 385) | final public static FormattingTuple arrayFormat(final String messagePa...
    method isEscapedDelimeter (line 442) | final static boolean isEscapedDelimeter(String messagePattern, int del...
    method isDoubleEscaped (line 455) | final static boolean isDoubleEscaped(String messagePattern, int delime...
    method deeplyAppendParameter (line 464) | private static void deeplyAppendParameter(StringBuilder sbuf, Object o...
    method safeObjectAppend (line 496) | private static void safeObjectAppend(StringBuilder sbuf, Object o) {
    method objectArrayAppend (line 506) | private static void objectArrayAppend(StringBuilder sbuf, Object[] a, ...
    method booleanArrayAppend (line 524) | private static void booleanArrayAppend(StringBuilder sbuf, boolean[] a) {
    method byteArrayAppend (line 535) | private static void byteArrayAppend(StringBuilder sbuf, byte[] a) {
    method charArrayAppend (line 546) | private static void charArrayAppend(StringBuilder sbuf, char[] a) {
    method shortArrayAppend (line 557) | private static void shortArrayAppend(StringBuilder sbuf, short[] a) {
    method intArrayAppend (line 568) | private static void intArrayAppend(StringBuilder sbuf, int[] a) {
    method longArrayAppend (line 579) | private static void longArrayAppend(StringBuilder sbuf, long[] a) {
    method floatArrayAppend (line 590) | private static void floatArrayAppend(StringBuilder sbuf, float[] a) {
    method doubleArrayAppend (line 601) | private static void doubleArrayAppend(StringBuilder sbuf, double[] a) {

FILE: projects/sample/dynamic-apk/sample-hello-host/src/main/java/com/tencent/shadow/sample/host/HostApplication.java
  class HostApplication (line 28) | public class HostApplication extends Application {
    method onCreate (line 30) | @Override
    method setWebViewDataDirectorySuffix (line 40) | private static void setWebViewDataDirectorySuffix() {
    method detectNonSdkApiUsageOnAndroidP (line 47) | private static void detectNonSdkApiUsageOnAndroidP() {

FILE: projects/sample/dynamic-apk/sample-hello-host/src/main/java/com/tencent/shadow/sample/host/MainActivity.java
  class MainActivity (line 31) | public class MainActivity extends Activity {
    method onCreate (line 33) | @Override
    method createButton (line 70) | public Button createButton(String title, View.OnClickListener listener) {
    method createTextView (line 77) | public TextView createTextView(String title, View.OnClickListener list...

FILE: projects/sample/dynamic-apk/sample-hello-host/src/main/java/com/tencent/shadow/sample/host/PluginHelper.java
  class PluginHelper (line 31) | public class PluginHelper {
    method getInstance (line 46) | public static PluginHelper getInstance() {
    method PluginHelper (line 50) | private PluginHelper() {
    method init (line 53) | public void init(Context context) {
    method preparePlugin (line 67) | private void preparePlugin() {

FILE: projects/sample/dynamic-apk/sample-hello-host/src/main/java/com/tencent/shadow/sample/host/api/FixedPathPmUpdater.java
  class FixedPathPmUpdater (line 26) | public class FixedPathPmUpdater implements HelloWorldUpdater {
    method FixedPathPmUpdater (line 30) | FixedPathPmUpdater(File apk) {
    method update (line 34) | @Override
    method getLatest (line 39) | @Override

FILE: projects/sample/dynamic-apk/sample-hello-host/src/main/java/com/tencent/shadow/sample/host/api/HelloWorldApiHolder.java
  class HelloWorldApiHolder (line 26) | public class HelloWorldApiHolder {
    method getHelloWorld (line 28) | public static IHelloWorld getHelloWorld(File apk) {

FILE: projects/sample/maven/host-project/introduce-shadow-lib/src/main/java/com/tencent/shadow/sample/introduce_shadow_lib/AndroidLoggerFactory.java
  class AndroidLoggerFactory (line 13) | public class AndroidLoggerFactory implements ILoggerFactory {
    method getInstance (line 23) | public static ILoggerFactory getInstance() {
    method getLogger (line 29) | public Logger getLogger(String name) {
    class IVLogger (line 40) | class IVLogger implements Logger {
      method IVLogger (line 43) | IVLogger(String name) {
      method getName (line 47) | @Override
      method log (line 52) | private void log(int level, String message, Throwable t) {
      method isTraceEnabled (line 86) | @Override
      method trace (line 91) | @Override
      method trace (line 96) | @Override
      method trace (line 102) | @Override
      method trace (line 108) | @Override
      method trace (line 114) | @Override
      method isDebugEnabled (line 119) | @Override
      method debug (line 124) | @Override
      method debug (line 129) | @Override
      method debug (line 135) | @Override
      method debug (line 141) | @Override
      method debug (line 147) | @Override
      method isInfoEnabled (line 152) | @Override
      method info (line 157) | @Override
      method info (line 162) | @Override
      method info (line 168) | @Override
      method info (line 174) | @Override
      method info (line 180) | @Override
      method isWarnEnabled (line 185) | @Override
      method warn (line 190) | @Override
      method warn (line 195) | @Override
      method warn (line 201) | @Override
      method warn (line 207) | @Override
      method warn (line 213) | @Override
      method isErrorEnabled (line 218) | @Override
      method error (line 223) | @Override
      method error (line 228) | @Override
      method error (line 234) | @Override
      method error (line 240) | @Override
      method error (line 246) | @Override
  class FormattingTuple (line 253) | class FormattingTuple {
    method FormattingTuple (line 261) | public FormattingTuple(String message) {
    method FormattingTuple (line 265) | public FormattingTuple(String message, Object[] argArray, Throwable th...
    method getMessage (line 271) | public String getMessage() {
    method getArgArray (line 275) | public Object[] getArgArray() {
    method getThrowable (line 279) | public Throwable getThrowable() {
  class MessageFormatter (line 285) | final class MessageFormatter {
    method format (line 308) | final public static FormattingTuple format(String messagePattern, Obje...
    method format (line 331) | final public static FormattingTuple format(final String messagePattern...
    method getThrowableCandidate (line 336) | static final Throwable getThrowableCandidate(Object[] argArray) {
    method arrayFormat (line 348) | final public static FormattingTuple arrayFormat(final String messagePa...
    method trimmedCopy (line 357) | private static Object[] trimmedCopy(Object[] argArray) {
    method arrayFormat (line 367) | final public static FormattingTuple arrayFormat(final String messagePa...
    method isEscapedDelimeter (line 424) | final static boolean isEscapedDelimeter(String messagePattern, int del...
    method isDoubleEscaped (line 437) | final static boolean isDoubleEscaped(String messagePattern, int delime...
    method deeplyAppendParameter (line 446) | private static void deeplyAppendParameter(StringBuilder sbuf, Object o...
    method safeObjectAppend (line 478) | private static void safeObjectAppend(StringBuilder sbuf, Object o) {
    method objectArrayAppend (line 488) | private static void objectArrayAppend(StringBuilder sbuf, Object[] a, ...
    method booleanArrayAppend (line 506) | private static void booleanArrayAppend(StringBuilder sbuf, boolean[] a) {
    method byteArrayAppend (line 517) | private static void byteArrayAppend(StringBuilder sbuf, byte[] a) {
    method charArrayAppend (line 528) | private static void charArrayAppend(StringBuilder sbuf, char[] a) {
    method shortArrayAppend (line 539) | private static void shortArrayAppend(StringBuilder sbuf, short[] a) {
    method intArrayAppend (line 550) | private static void intArrayAppend(StringBuilder sbuf, int[] a) {
    method longArrayAppend (line 561) | private static void longArrayAppend(StringBuilder sbuf, long[] a) {
    method floatArrayAppend (line 572) | private static void floatArrayAppend(StringBuilder sbuf, float[] a) {
    method doubleArrayAppend (line 583) | private static void doubleArrayAppend(StringBuilder sbuf, double[] a) {

FILE: projects/sample/maven/host-project/introduce-shadow-lib/src/main/java/com/tencent/shadow/sample/introduce_shadow_lib/FixedPathPmUpdater.java
  class FixedPathPmUpdater (line 11) | public class FixedPathPmUpdater implements PluginManagerUpdater {
    method FixedPathPmUpdater (line 15) | FixedPathPmUpdater(File apk) {
    method wasUpdating (line 20) | @Override
    method update (line 25) | @Override
    method getLatest (line 30) | @Override
    method isAvailable (line 35) | @Override

FILE: projects/sample/maven/host-project/introduce-shadow-lib/src/main/java/com/tencent/shadow/sample/introduce_shadow_lib/InitApplication.java
  class InitApplication (line 17) | public class InitApplication {
    method getPluginManager (line 24) | public static PluginManager getPluginManager() {
    method onApplicationCreate (line 28) | public static void onApplicationCreate(Application application) {
    method isProcess (line 57) | private static boolean isProcess(Context context, String processName) {

FILE: projects/sample/maven/host-project/introduce-shadow-lib/src/main/java/com/tencent/shadow/sample/introduce_shadow_lib/MainPluginProcessService.java
  class MainPluginProcessService (line 9) | public class MainPluginProcessService extends PluginProcessService {

FILE: projects/sample/maven/host-project/sample-host/src/main/java/com/tencent/shadow/sample/host/MainActivity.java
  class MainActivity (line 14) | public class MainActivity extends Activity {
    method onCreate (line 19) | @Override

FILE: projects/sample/maven/host-project/sample-host/src/main/java/com/tencent/shadow/sample/host/MyApplication.java
  class MyApplication (line 7) | public class MyApplication extends Application {
    method onCreate (line 8) | @Override

FILE: projects/sample/maven/manager-project/sample-manager/src/main/java/com/tencent/shadow/dynamic/impl/ManagerFactoryImpl.java
  class ManagerFactoryImpl (line 12) | public final class ManagerFactoryImpl implements ManagerFactory {
    method buildManager (line 13) | @Override

FILE: projects/sample/maven/manager-project/sample-manager/src/main/java/com/tencent/shadow/dynamic/impl/WhiteList.java
  type WhiteList (line 8) | public interface WhiteList {

FILE: projects/sample/maven/manager-project/sample-manager/src/main/java/com/tencent/shadow/sample/manager/Constant.java
  class Constant (line 3) | final public class Constant {

FILE: projects/sample/maven/manager-project/sample-manager/src/main/java/com/tencent/shadow/sample/manager/FastPluginManager.java
  class FastPluginManager (line 31) | public abstract class FastPluginManager extends PluginManagerThatUseDyna...
    method FastPluginManager (line 37) | public FastPluginManager(Context context) {
    method installPlugin (line 42) | public InstalledPlugin installPlugin(String zip, String hash, boolean ...
    method startPluginActivity (line 98) | public void startPluginActivity(Context context, InstalledPlugin insta...
    method convertActivityIntent (line 106) | public Intent convertActivityIntent(InstalledPlugin installedPlugin, S...
    method loadPluginLoaderAndRuntime (line 111) | private void loadPluginLoaderAndRuntime(String uuid) throws RemoteExce...
    method loadPlugin (line 120) | protected void loadPlugin(String uuid, String partKey) throws RemoteEx...
    method getPluginProcessServiceName (line 133) | protected abstract String getPluginProcessServiceName();

FILE: projects/sample/maven/manager-project/sample-manager/src/main/java/com/tencent/shadow/sample/manager/SamplePluginManager.java
  class SamplePluginManager (line 21) | public class SamplePluginManager extends FastPluginManager {
    method SamplePluginManager (line 27) | public SamplePluginManager(Context context) {
    method getName (line 35) | @Override
    method getPluginProcessServiceName (line 43) | @Override
    method enter (line 48) | @Override
    method onStartActivity (line 62) | private void onStartActivity(final Context context, Bundle bundle, fin...
    method callPluginService (line 109) | private void callPluginService(final Context context) {

FILE: projects/sample/maven/plugin-project/plugin-app/src/main/java/com/tencent/shadow/sample/plugin/MainActivity.java
  class MainActivity (line 6) | public class MainActivity extends Activity {
    method onCreate (line 7) | @Override

FILE: projects/sample/maven/plugin-project/plugin-app/src/main/java/com/tencent/shadow/sample/plugin/MyService.java
  class MyService (line 8) | public class MyService extends Service {
    method MyService (line 9) | public MyService() {
    method onBind (line 12) | @Override

FILE: projects/sample/maven/plugin-project/sample-loader/src/main/java/com/tencent/shadow/dynamic/loader/impl/CoreLoaderFactoryImpl.java
  class CoreLoaderFactoryImpl (line 15) | public class CoreLoaderFactoryImpl implements CoreLoaderFactory {
    method build (line 17) | @NotNull

FILE: projects/sample/maven/plugin-project/sample-loader/src/main/java/com/tencent/shadow/sample/loader/SampleComponentManager.java
  class SampleComponentManager (line 12) | public class SampleComponentManager extends ComponentManager {
    method SampleComponentManager (line 23) | public SampleComponentManager(Context context) {
    method onBindContainerActivity (line 34) | @Override
    method onBindContainerContentProvider (line 47) | @Override

FILE: projects/sample/maven/plugin-project/sample-loader/src/main/java/com/tencent/shadow/sample/loader/SamplePluginLoader.java
  class SamplePluginLoader (line 13) | public class SamplePluginLoader extends ShadowPluginLoader {
    method SamplePluginLoader (line 19) | public SamplePluginLoader(Context hostAppContext) {
    method getComponentManager (line 24) | @Override

FILE: projects/sample/maven/plugin-project/sample-runtime/src/main/java/com/tencent/shadow/sample/runtime/PluginDefaultProxyActivity.java
  class PluginDefaultProxyActivity (line 6) | public class PluginDefaultProxyActivity extends PluginContainerActivity {

FILE: projects/sample/maven/plugin-project/sample-runtime/src/main/java/com/tencent/shadow/sample/runtime/PluginSingleInstance1ProxyActivity.java
  class PluginSingleInstance1ProxyActivity (line 6) | public class PluginSingleInstance1ProxyActivity extends PluginContainerA...

FILE: projects/sample/maven/plugin-project/sample-runtime/src/main/java/com/tencent/shadow/sample/runtime/PluginSingleTask1ProxyActivity.java
  class PluginSingleTask1ProxyActivity (line 6) | public class PluginSingleTask1ProxyActivity extends PluginContainerActiv...

FILE: projects/sample/source/sample-constant/src/main/java/com/tencent/shadow/sample/constant/Constant.java
  class Constant (line 21) | final public class Constant {

FILE: projects/sample/source/sample-host-lib/src/main/java/com/tencent/shadow/sample/host/lib/HostAddPluginViewContainer.java
  type HostAddPluginViewContainer (line 5) | public interface HostAddPluginViewContainer {
    method addView (line 6) | void addView(View view);

FILE: projects/sample/source/sample-host-lib/src/main/java/com/tencent/shadow/sample/host/lib/HostAddPluginViewContainerHolder.java
  class HostAddPluginViewContainerHolder (line 6) | public class HostAddPluginViewContainerHolder {

FILE: projects/sample/source/sample-host-lib/src/main/java/com/tencent/shadow/sample/host/lib/HostUiLayerProvider.java
  class HostUiLayerProvider (line 28) | public class HostUiLayerProvider {
    method init (line 31) | public static void init(Context mHostApplicationContext) {
    method getInstance (line 35) | public static HostUiLayerProvider getInstance() {
    method HostUiLayerProvider (line 41) | private HostUiLayerProvider(Context mHostApplicationContext) {
    method buildHostUiLayer (line 45) | public View buildHostUiLayer() {

FILE: projects/sample/source/sample-host-lib/src/main/java/com/tencent/shadow/sample/host/lib/LoadPluginCallback.java
  class LoadPluginCallback (line 6) | public class LoadPluginCallback {
    method setCallback (line 10) | public static void setCallback(Callback callback) {
    method getCallback (line 14) | public static Callback getCallback() {
    type Callback (line 18) | public interface Callback {
      method beforeLoadPlugin (line 19) | void beforeLoadPlugin(String partKey);
      method afterLoadPlugin (line 21) | void afterLoadPlugin(String partKey, ApplicationInfo applicationInfo...

FILE: projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/AndroidLogLoggerFactory.java
  class AndroidLogLoggerFactory (line 31) | public class AndroidLogLoggerFactory implements ILoggerFactory {
    method getInstance (line 41) | public static ILoggerFactory getInstance() {
    method getLogger (line 47) | public Logger getLogger(String name) {
    class IVLogger (line 58) | class IVLogger implements Logger {
      method IVLogger (line 61) | IVLogger(String name) {
      method getName (line 65) | @Override
      method log (line 70) | private void log(int level, String message, Throwable t) {
      method isTraceEnabled (line 104) | @Override
      method trace (line 109) | @Override
      method trace (line 114) | @Override
      method trace (line 120) | @Override
      method trace (line 126) | @Override
      method trace (line 132) | @Override
      method isDebugEnabled (line 137) | @Override
      method debug (line 142) | @Override
      method debug (line 147) | @Override
      method debug (line 153) | @Override
      method debug (line 159) | @Override
      method debug (line 165) | @Override
      method isInfoEnabled (line 170) | @Override
      method info (line 175) | @Override
      method info (line 180) | @Override
      method info (line 186) | @Override
      method info (line 192) | @Override
      method info (line 198) | @Override
      method isWarnEnabled (line 203) | @Override
      method warn (line 208) | @Override
      method warn (line 213) | @Override
      method warn (line 219) | @Override
      method warn (line 225) | @Override
      method warn (line 231) | @Override
      method isErrorEnabled (line 236) | @Override
      method error (line 241) | @Override
      method error (line 246) | @Override
      method error (line 252) | @Override
      method error (line 258) | @Override
      method error (line 264) | @Override
  class FormattingTuple (line 271) | class FormattingTuple {
    method FormattingTuple (line 279) | public FormattingTuple(String message) {
    method FormattingTuple (line 283) | public FormattingTuple(String message, Object[] argArray, Throwable th...
    method getMessage (line 289) | public String getMessage() {
    method getArgArray (line 293) | public Object[] getArgArray() {
    method getThrowable (line 297) | public Throwable getThrowable() {
  class MessageFormatter (line 303) | final class MessageFormatter {
    method format (line 326) | final public static FormattingTuple format(String messagePattern, Obje...
    method format (line 349) | final public static FormattingTuple format(final String messagePattern...
    method getThrowableCandidate (line 354) | static final Throwable getThrowableCandidate(Object[] argArray) {
    method arrayFormat (line 366) | final public static FormattingTuple arrayFormat(final String messagePa...
    method trimmedCopy (line 375) | private static Object[] trimmedCopy(Object[] argArray) {
    method arrayFormat (line 385) | final public static FormattingTuple arrayFormat(final String messagePa...
    method isEscapedDelimeter (line 442) | final static boolean isEscapedDelimeter(String messagePattern, int del...
    method isDoubleEscaped (line 455) | final static boolean isDoubleEscaped(String messagePattern, int delime...
    method deeplyAppendParameter (line 464) | private static void deeplyAppendParameter(StringBuilder sbuf, Object o...
    method safeObjectAppend (line 496) | private static void safeObjectAppend(StringBuilder sbuf, Object o) {
    method objectArrayAppend (line 506) | private static void objectArrayAppend(StringBuilder sbuf, Object[] a, ...
    method booleanArrayAppend (line 524) | private static void booleanArrayAppend(StringBuilder sbuf, boolean[] a) {
    method byteArrayAppend (line 535) | private static void byteArrayAppend(StringBuilder sbuf, byte[] a) {
    method charArrayAppend (line 546) | private static void charArrayAppend(StringBuilder sbuf, char[] a) {
    method shortArrayAppend (line 557) | private static void shortArrayAppend(StringBuilder sbuf, short[] a) {
    method intArrayAppend (line 568) | private static void intArrayAppend(StringBuilder sbuf, int[] a) {
    method longArrayAppend (line 579) | private static void longArrayAppend(StringBuilder sbuf, long[] a) {
    method floatArrayAppend (line 590) | private static void floatArrayAppend(StringBuilder sbuf, float[] a) {
    method doubleArrayAppend (line 601) | private static void doubleArrayAppend(StringBuilder sbuf, double[] a) {

FILE: projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/HostApplication.java
  class HostApplication (line 38) | public class HostApplication extends Application {
    method onCreate (line 43) | @Override
    method setWebViewDataDirectorySuffix (line 66) | private static void setWebViewDataDirectorySuffix() {
    method detectNonSdkApiUsageOnAndroidP (line 73) | private static void detectNonSdkApiUsageOnAndroidP() {
    method getApp (line 82) | public static HostApplication getApp() {
    method loadPluginManager (line 86) | public void loadPluginManager(File apk) {
    method getPluginManager (line 92) | public PluginManager getPluginManager() {
    method isProcess (line 96) | private static boolean isProcess(Context context, String processName) {

FILE: projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/MainActivity.java
  class MainActivity (line 37) | public class MainActivity extends Activity {
    method onCreate (line 39) | @Override

FILE: projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/Plugin2ProcessPPS.java
  class Plugin2ProcessPPS (line 28) | public class Plugin2ProcessPPS extends PluginProcessService {
    method Plugin2ProcessPPS (line 29) | public Plugin2ProcessPPS() {

FILE: projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/PluginHelper.java
  class PluginHelper (line 31) | public class PluginHelper {
    method getInstance (line 53) | public static PluginHelper getInstance() {
    method PluginHelper (line 57) | private PluginHelper() {
    method init (line 60) | public void init(Context context) {
    method preparePlugin (line 75) | private void preparePlugin() {

FILE: projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/PluginLoadActivity.java
  class PluginLoadActivity (line 31) | public class PluginLoadActivity extends Activity {
    method onCreate (line 38) | @Override
    method startPlugin (line 49) | public void startPlugin() {
    method onDestroy (line 87) | @Override

FILE: projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/PluginProcessPPS.java
  class PluginProcessPPS (line 28) | public class PluginProcessPPS extends PluginProcessService {
    method PluginProcessPPS (line 29) | public PluginProcessPPS() {

FILE: projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/manager/FixedPathPmUpdater.java
  class FixedPathPmUpdater (line 28) | public class FixedPathPmUpdater implements PluginManagerUpdater {
    method FixedPathPmUpdater (line 32) | FixedPathPmUpdater(File apk) {
    method wasUpdating (line 43) | @Override
    method update (line 48) | @Override
    method getLatest (line 53) | @Override
    method isAvailable (line 58) | @Override

FILE: projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/manager/Shadow.java
  class Shadow (line 26) | public class Shadow {
    method getPluginManager (line 28) | public static PluginManager getPluginManager(File apk) {

FILE: projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/plugin_view/HostAddPluginViewActivity.java
  class HostAddPluginViewActivity (line 15) | public class HostAddPluginViewActivity extends Activity implements HostA...
    method onCreate (line 18) | @Override
    method loadPluginView (line 54) | private void loadPluginView(View view) {
    method addView (line 70) | @Override

FILE: projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/plugin_view/MainProcessManagerReceiver.java
  class MainProcessManagerReceiver (line 10) | public class MainProcessManagerReceiver extends BroadcastReceiver {
    method onReceive (line 11) | @Override

FILE: projects/sample/source/sample-manager/src/main/java/com/tencent/shadow/dynamic/impl/ManagerFactoryImpl.java
  class ManagerFactoryImpl (line 30) | public final class ManagerFactoryImpl implements ManagerFactory {
    method buildManager (line 31) | @Override

FILE: projects/sample/source/sample-manager/src/main/java/com/tencent/shadow/dynamic/impl/WhiteList.java
  type WhiteList (line 26) | public interface WhiteList {

FILE: projects/sample/source/sample-manager/src/main/java/com/tencent/shadow/sample/manager/FastPluginManager.java
  class FastPluginManager (line 49) | public abstract class FastPluginManager extends PluginManagerThatUseDyna...
    method FastPluginManager (line 55) | public FastPluginManager(Context context) {
    method installPlugin (line 60) | public InstalledPlugin installPlugin(String zip, String hash, boolean ...
    method callApplicationOnCreate (line 117) | protected void callApplicationOnCreate(String partKey) throws RemoteEx...
    method loadPluginLoaderAndRuntime (line 125) | private void loadPluginLoaderAndRuntime(String uuid, String partKey) t...
    method loadPlugin (line 134) | protected void loadPlugin(String uuid, String partKey) throws RemoteEx...
    method getPluginProcessServiceName (line 143) | protected abstract String getPluginProcessServiceName(String partKey);

FILE: projects/sample/source/sample-manager/src/main/java/com/tencent/shadow/sample/manager/SamplePluginManager.java
  class SamplePluginManager (line 40) | public class SamplePluginManager extends FastPluginManager {
    method SamplePluginManager (line 46) | public SamplePluginManager(Context context) {
    method getName (line 54) | @Override
    method getPluginProcessServiceName (line 62) | @Override
    method enter (line 76) | @Override
    method loadViewToHost (line 91) | private void loadViewToHost(final Context context, Bundle bundle) {
    method onStartActivity (line 105) | private void onStartActivity(final Context context, Bundle bundle, fin...

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/UseCaseApplication.java
  class UseCaseApplication (line 31) | public class UseCaseApplication extends Application {
    method onCreate (line 32) | @Override
    method initCase (line 38) | private static void initCase() {

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/activity/TestActivityOnCreate.java
  class TestActivityOnCreate (line 29) | public class TestActivityOnCreate extends Activity {
    class Case (line 31) | public static class Case extends UseCase {
      method getName (line 32) | @Override
      method getSummary (line 37) | @Override
      method getPageClass (line 42) | @Override
    method onCreate (line 48) | @Override
    method onStart (line 55) | @Override
    method onRestart (line 61) | @Override
    method onResume (line 67) | @Override
    method onSaveInstanceState (line 73) | @Override
    method onRestoreInstanceState (line 79) | @Override
    method onStop (line 85) | @Override
    method onDestroy (line 91) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/activity/TestActivityOptionMenu.java
  class TestActivityOptionMenu (line 29) | public class TestActivityOptionMenu extends Activity {
    class Case (line 31) | public static class Case extends UseCase {
      method getName (line 32) | @Override
      method getSummary (line 37) | @Override
      method getPageClass (line 42) | @Override
    method onCreate (line 48) | @Override
    method onCreateOptionsMenu (line 56) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/activity/TestActivityOrientation.java
  class TestActivityOrientation (line 33) | public class TestActivityOrientation extends BaseActivity {
    class Case (line 35) | public static class Case extends UseCase {
      method getName (line 36) | @Override
      method getSummary (line 41) | @Override
      method getPageClass (line 46) | @Override
    method onCreate (line 52) | @Override
    method setOrientation (line 60) | public void setOrientation(View view) {
    method onConfigurationChanged (line 69) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/activity/TestActivityReCreate.java
  class TestActivityReCreate (line 31) | public class TestActivityReCreate extends Activity {
    class Case (line 34) | public static class Case extends UseCase {
      method getName (line 35) | @Override
      method getSummary (line 40) | @Override
      method getPageClass (line 45) | @Override
    method onCreate (line 51) | @Override
    method reCreate (line 61) | public void reCreate(View view) {
    method onStart (line 66) | @Override
    method onRestart (line 72) | @Override
    method onResume (line 78) | @Override
    method onSaveInstanceState (line 84) | @Override
    method onRestoreInstanceState (line 90) | @Override
    method onStop (line 96) | @Override
    method onDestroy (line 102) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/activity/TestActivityReCreateBySystem.java
  class TestActivityReCreateBySystem (line 28) | public class TestActivityReCreateBySystem extends Activity {
    class Case (line 30) | public static class Case extends UseCase {
      method getName (line 31) | @Override
      method getSummary (line 36) | @Override
      method getPageClass (line 41) | @Override
      method getPageParams (line 46) | @Override
    method onCreate (line 54) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/activity/TestActivitySetTheme.java
  class TestActivitySetTheme (line 31) | public class TestActivitySetTheme extends Activity {
    class Case (line 33) | public static class Case extends UseCase {
      method getName (line 34) | @Override
      method getSummary (line 39) | @Override
      method getPageClass (line 44) | @Override
    method onCreate (line 52) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/activity/TestActivityWindowSoftMode.java
  class TestActivityWindowSoftMode (line 32) | public class TestActivityWindowSoftMode extends BaseActivity {
    class Case (line 34) | public static class Case extends UseCase {
      method getName (line 35) | @Override
      method getSummary (line 40) | @Override
      method getPageClass (line 45) | @Override
    method onCreate (line 53) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/application/TestApplicationActivity.java
  class TestApplicationActivity (line 30) | public class TestApplicationActivity extends BaseActivity {
    method onCreate (line 34) | @Override
    method doClick (line 42) | public void doClick(View view) {

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/context/ActivityContextSubDirTestActivity.java
  class ActivityContextSubDirTestActivity (line 26) | public class ActivityContextSubDirTestActivity extends SubDirContextThem...
    class Case (line 27) | public static class Case extends UseCase {
      method getName (line 28) | @Override
      method getSummary (line 33) | @Override
      method getPageClass (line 38) | @Override
    method onCreate (line 44) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/context/ApplicationContextSubDirTestActivity.java
  class ApplicationContextSubDirTestActivity (line 26) | public class ApplicationContextSubDirTestActivity extends SubDirContextT...
    class Case (line 27) | public static class Case extends UseCase {
      method getName (line 28) | @Override
      method getSummary (line 33) | @Override
      method getPageClass (line 38) | @Override
    method onCreate (line 44) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/context/SubDirContextThemeWrapperTestActivity.java
  class SubDirContextThemeWrapperTestActivity (line 48) | abstract class SubDirContextThemeWrapperTestActivity extends BaseActivity {
    method onCreate (line 52) | @Override
    method fillTestValues (line 66) | protected void fillTestValues(Context testContext) {
    method getOpenFileInputAbsolutePath (line 278) | private String getOpenFileInputAbsolutePath(Context context, String na...
    method getOpenFileOutputAbsolutePath (line 290) | private String getOpenFileOutputAbsolutePath(Context context, String n...
    method isDeleteFileSuccess (line 307) | private String isDeleteFileSuccess(Context context, String name) {
    method getSharedPreferencesAbsolutePath (line 324) | private String getSharedPreferencesAbsolutePath(Context context, final...
    method isDeleteSharedPreferencesSuccess (line 354) | @RequiresApi(api = Build.VERSION_CODES.N)
    method isDeleteDatabaseSuccess (line 372) | private String isDeleteDatabaseSuccess(Context context, String name) {
    method makeItem (line 389) | private void makeItem(

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/dialog/TestDialog.java
  class TestDialog (line 28) | public class TestDialog extends Dialog {
    method TestDialog (line 30) | public TestDialog(@NonNull Context context) {

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/dialog/TestDialogActivity.java
  class TestDialogActivity (line 29) | public class TestDialogActivity extends BaseActivity {
    class Case (line 31) | public static class Case extends UseCase {
      method getName (line 32) | @Override
      method getSummary (line 37) | @Override
      method getPageClass (line 42) | @Override
    method onCreate (line 49) | @Override
    method show (line 55) | public void show(View view) {

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/fragment/TestDialogFragment.java
  class TestDialogFragment (line 17) | public class TestDialogFragment extends DialogFragment {
    method newInstance (line 19) | public static TestDialogFragment newInstance(Bundle bundle) {
    method onCreateDialog (line 25) | @Override
    method onDismiss (line 30) | @Override
    method onCreateView (line 35) | @Nullable

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/fragment/TestDialogFragmentActivity.java
  class TestDialogFragmentActivity (line 28) | public class TestDialogFragmentActivity extends BaseActivity {
    class Case (line 30) | public static class Case extends UseCase {
      method getName (line 31) | @Override
      method getSummary (line 36) | @Override
      method getPageClass (line 41) | @Override
    method onCreate (line 47) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/fragment/TestDynamicFragmentActivity.java
  class TestDynamicFragmentActivity (line 28) | public class TestDynamicFragmentActivity extends BaseActivity {
    class Case (line 30) | public static class Case extends UseCase {
      method getName (line 31) | @Override
      method getSummary (line 36) | @Override
      method getPageClass (line 41) | @Override
    method onCreate (line 47) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/fragment/TestFragment.java
  class TestFragment (line 32) | public class TestFragment extends Fragment {
    method newInstance (line 34) | public static TestFragment newInstance(Bundle bundle) {
    method onCreateView (line 41) | @Nullable

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/fragment/TestXmlFragmentActivity.java
  class TestXmlFragmentActivity (line 28) | public class TestXmlFragmentActivity extends BaseActivity {
    class Case (line 30) | public static class Case extends UseCase {
      method getName (line 31) | @Override
      method getSummary (line 36) | @Override
      method getPageClass (line 41) | @Override
    method onCreate (line 47) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/host_communication/PluginUseHostClassActivity.java
  class PluginUseHostClassActivity (line 30) | public class PluginUseHostClassActivity extends BaseActivity {
    class Case (line 31) | public static class Case extends UseCase {
      method getName (line 32) | @Override
      method getSummary (line 37) | @Override
      method getPageClass (line 42) | @Override
    method onCreate (line 48) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/packagemanager/TestPackageManagerActivity.java
  class TestPackageManagerActivity (line 35) | public class TestPackageManagerActivity extends BaseActivity {
    class Case (line 37) | public static class Case extends UseCase {
      method getName (line 38) | @Override
      method getSummary (line 43) | @Override
      method getPageClass (line 48) | @Override
    method onCreate (line 56) | @Override
    method getApplicationInfo (line 64) | public void getApplicationInfo(View view) {
    method getActivityInfo (line 76) | public void getActivityInfo(View view) {
    method getPackageInfo (line 87) | public void getPackageInfo(View view) {

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/provider/TestDBContentProviderActivity.java
  class TestDBContentProviderActivity (line 36) | public class TestDBContentProviderActivity extends BaseActivity {
    class Case (line 38) | public static class Case extends UseCase {
      method getName (line 39) | @Override
      method getSummary (line 44) | @Override
      method getPageClass (line 49) | @Override
    method onChange (line 61) | @Override
    method onCreate (line 69) | @Override
    method insert (line 80) | public void insert(View view) {
    method query (line 89) | public void query(View view) {
    method update (line 106) | public void update(View view) {
    method delete (line 127) | public void delete(View view) {
    method bulkInsert (line 145) | public void bulkInsert(View view) {
    method call (line 167) | public void call(View view) {
    method onDestroy (line 174) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/provider/TestDBHelper.java
  class TestDBHelper (line 26) | public class TestDBHelper extends SQLiteOpenHelper {
    method TestDBHelper (line 30) | public TestDBHelper(Context context) {
    method onCreate (line 34) | @Override
    method onUpgrade (line 43) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/provider/TestFileProviderActivity.java
  class TestFileProviderActivity (line 45) | public class TestFileProviderActivity extends Activity {
    class Case (line 49) | public static class Case extends UseCase {
      method getName (line 50) | @Override
      method getSummary (line 55) | @Override
      method getPageClass (line 60) | @Override
    method onCreate (line 71) | @Override
    method onSaveInstanceState (line 108) | @Override
    method onRestoreInstanceState (line 114) | @Override
    method targetSdkVersion (line 123) | private int targetSdkVersion() {
    method onActivityResult (line 127) | @Override
    method setPic (line 135) | @SuppressLint("LongLogTag")

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/provider/TestProvider.java
  class TestProvider (line 35) | public class TestProvider extends ContentProvider {
    method onCreate (line 38) | @Override
    method getType (line 45) | @Nullable
    method query (line 51) | @Nullable
    method insert (line 66) | @SuppressWarnings("ConstantConditions")
    method delete (line 88) | @Override
    method update (line 98) | @Override
    method call (line 108) | public Bundle call(@NonNull String method, String arg, @Nullable Bundl...
    method buildUriMatcher (line 120) | static UriMatcher buildUriMatcher() {

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/provider/TestProviderInfo.java
  class TestProviderInfo (line 28) | public class TestProviderInfo {
    class TestEntry (line 35) | public static final class TestEntry implements BaseColumns {
      method buildUri (line 39) | protected static Uri buildUri(long id) {

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/receiver/MyReceiver.java
  class MyReceiver (line 26) | public class MyReceiver extends BroadcastReceiver {
    method onReceive (line 28) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/receiver/TestDynamicReceiverActivity.java
  class TestDynamicReceiverActivity (line 36) | public class TestDynamicReceiverActivity extends BaseActivity {
    class Case (line 38) | public static class Case extends UseCase {
      method getName (line 39) | @Override
      method getSummary (line 44) | @Override
      method getPageClass (line 49) | @Override
    method onCreate (line 57) | @Override
    class DynamicBroadcastReceiver (line 82) | private class DynamicBroadcastReceiver extends BroadcastReceiver {
      method onReceive (line 83) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/receiver/TestReceiverActivity.java
  class TestReceiverActivity (line 31) | public class TestReceiverActivity extends BaseActivity {
    class Case (line 33) | public static class Case extends UseCase {
      method getName (line 34) | @Override
      method getSummary (line 39) | @Override
      method getPageClass (line 44) | @Override
    method onCreate (line 50) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/service/HostAddPluginViewService.java
  class HostAddPluginViewService (line 15) | public class HostAddPluginViewService extends IntentService {
    method HostAddPluginViewService (line 18) | public HostAddPluginViewService() {
    method onHandleIntent (line 22) | @Override

FILE: projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/webview/WebViewActivity.java
  class WebViewActivity (line 13) | public class WebViewActivity extends Activity {
    class Case (line 14) | public static class Case extends UseCase {
      method getName (line 15) | @Override
      method getSummary (line 20) | @Override
      method getPageClass (line 25) | @Override
    method onCreate (line 31) | @Override
  class FooWebView (line 47) | class FooWebView extends WebView {
    method FooWebView (line 49) | public FooWebView(@NonNull Context context) {
    method setWebViewClient (line 53) | @Override
  class FooWebViewClient (line 60) | class FooWebViewClient extends WebViewClient {

FILE: projects/sample/source/sample-plugin/sample-base-lib/src/main/java/com/tencent/shadow/sample/plugin/app/lib/gallery/BaseActivity.java
  class BaseActivity (line 25) | public class BaseActivity extends Activity {
    method onCreate (line 27) | @Override

FILE: projects/sample/source/sample-plugin/sample-base-lib/src/main/java/com/tencent/shadow/sample/plugin/app/lib/gallery/MainActivity.java
  class MainActivity (line 48) | public class MainActivity extends Activity implements
    method onCreate (line 62) | @Override
    class ExpandableListAdapter (line 91) | class ExpandableListAdapter extends BaseExpandableListAdapter {
      method ExpandableListAdapter (line 94) | public ExpandableListAdapter(Context context) {
      method getGroupCount (line 99) | @Override
      method getChildrenCount (line 105) | @Override
      method getGroup (line 110) | @Override
      method getChild (line 117) | @Override
      method getGroupId (line 122) | @Override
      method getChildId (line 127) | @Override
      method hasStableIds (line 132) | @Override
      method getGroupView (line 138) | @Override
      method getChildView (line 157) | @Override
      method isChildSelectable (line 177) | @Override
    method onGroupClick (line 183) | @Override
    method onChildClick (line 189) | @Override
    class CaseCategoryHolder (line 199) | class CaseCategoryHolder {
    class CaseItemHolder (line 203) | class CaseItemHolder {
    method getPinnedHeader (line 207) | @Override
    method updatePinnedHeader (line 216) | @Override
    method giveUpTouchEvent (line 226) | @Override

FILE: projects/sample/source/sample-plugin/sample-base-lib/src/main/java/com/tencent/shadow/sample/plugin/app/lib/gallery/TestApplication.java
  class TestApplication (line 23) | public class TestApplication extends Application {
    method onCreate (line 29) | @Override
    method getInstance (line 36) | public static TestApplication getInstance() {

FILE: projects/sample/source/sample-plugin/sample-base-lib/src/main/java/com/tencent/shadow/sample/plugin/app/lib/gallery/cases/UseCaseManager.java
  class UseCaseManager (line 26) | public class UseCaseManager {

FILE: projects/sample/source/sample-plugin/sample-base-lib/src/main/java/com/tencent/shadow/sample/plugin/app/lib/gallery/cases/UseCaseSummaryFragment.java
  class UseCaseSummaryFragment (line 38) | public class UseCaseSummaryFragment extends Fragment {
    method onCreateView (line 46) | @Nullable
    method setCase (line 55) | public void setCase(final UseCase useCase) {
    method bindViews (line 101) | private void bindViews(View view) {

FILE: projects/sample/source/sample-plugin/sample-base-lib/src/main/java/com/tencent/shadow/sample/plugin/app/lib/gallery/cases/entity/UseCase.java
  class UseCase (line 23) | public abstract class UseCase {
    method getName (line 25) | public abstract String getName();
    method getSummary (line 27) | public abstract String getSummary();
    method getPageClass (line 29) | public abstract Class getPageClass();
    method getPageParams (line 31) | public Bundle getPageParams() {

FILE: projects/sample/source/sample-plugin/sample-base-lib/src/main/java/com/tencent/shadow/sample/plugin/app/lib/gallery/cases/entity/UseCaseCategory.java
  class UseCaseCategory (line 21) | public class UseCaseCategory {
    method UseCaseCategory (line 27) | public UseCaseCategory(String title, UseCase[] caseList) {

FILE: projects/sample/source/sample-plugin/sample-base-lib/src/main/java/com/tencent/shadow/sample/plugin/app/lib/gallery/splash/ISplashAnimation.java
  type ISplashAnimation (line 21) | public interface ISplashAnimation {
    method start (line 23) | void start();
    method stop (line 25) | void stop();
    method setAnimationListener (line 27) | void setAnimationListener(AnimationListener animationListener);
    type AnimationListener (line 30) | interface AnimationListener {
      method onAnimationEnd (line 31) | void onAnimationEnd();

FILE: projects/sample/source/sample-plugin/sample-base-lib/src/main/java/com/tencent/shadow/sample/plugin/app/lib/gallery/splash/SplashActivity.java
  class SplashActivity (line 29) | public class SplashActivity extends Activity {
    method onCreate (line 33) | @Override

FILE: projects/sample/source/sample-plugin/sample-base-lib/src/main/java/com/tencent/shadow/sample/plugin/app/lib/gallery/splash/SplashAnimation.java
  class SplashAnimation (line 26) | public class SplashAnimation implements ISplashAnimation {
    method SplashAnimation (line 32) | public SplashAnimation(Context context) {
    method start (line 37) | @Override
    method stop (line 51) | @Override
    method setAnimationListener (line 56) | @Override

FILE: projects/sample/source/sample-plugin/sample-base-lib/src/main/java/com/tencent/shadow/sample/plugin/app/lib/gallery/util/PluginChecker.java
  class PluginChecker (line 22) | public class PluginChecker {
    method isPluginMode (line 32) | public static boolean isPluginMode() {

FILE: projects/sample/source/sample-plugin/sample-base-lib/src/main/java/com/tencent/shadow/sample/plugin/app/lib/gallery/util/ToastUtil.java
  class ToastUtil (line 24) | public class ToastUtil {
    method showToast (line 26) | public static void showToast(Context context, String message) {

FILE: projects/sample/source/sample-plugin/sample-base-lib/src/main/java/com/tencent/shadow/sample/plugin/app/lib/gallery/util/UiUtil.java
  class UiUtil (line 29) | final public class UiUtil {
    method makeItemView (line 30) | @SuppressLint("SetTextI18n")
    method setItemValue (line 49) | public static void setItemValue(ViewGroup viewGroupContainsItem, Strin...
    method makeItem (line 54) | public static ViewGroup makeItem(
    method makeItem (line 65) | public static ViewGroup makeItem(
    type AsyncGetValue (line 81) | interface AsyncGetValue {
      method getValue (line 82) | void getValue(AsyncGetValueCallback callback);
    type AsyncGetValueCallback (line 85) | interface AsyncGetValueCallback {
      method onGotValue (line 86) | void onGotValue(String value);

FILE: projects/sample/source/sample-plugin/sample-loader/src/main/java/com/tencent/shadow/dynamic/impl/WhiteList.java
  type WhiteList (line 26) | public interface WhiteList {

FILE: projects/sample/source/sample-plugin/sample-loader/src/main/java/com/tencent/shadow/dynamic/loader/impl/CoreLoaderFactoryImpl.java
  class CoreLoaderFactoryImpl (line 31) | public class CoreLoaderFactoryImpl implements CoreLoaderFactory {
    method build (line 32) | @Override

FILE: projects/sample/source/sample-plugin/sample-loader/src/main/java/com/tencent/shadow/sample/plugin/loader/SampleComponentManager.java
  class SampleComponentManager (line 27) | public class SampleComponentManager extends ComponentManager {
    method SampleComponentManager (line 38) | public SampleComponentManager(Context context) {
    method onBindContainerActivity (line 49) | @Override
    method onBindContainerContentProvider (line 62) | @Override

FILE: projects/sample/source/sample-plugin/sample-loader/src/main/java/com/tencent/shadow/sample/plugin/loader/SamplePluginLoader.java
  class SamplePluginLoader (line 38) | public class SamplePluginLoader extends ShadowPluginLoader {
    method SamplePluginLoader (line 44) | public SamplePluginLoader(Context hostAppContext) {
    method getComponentManager (line 49) | @Override
    method loadPlugin (line 54) | @Override
    method getDelegateProviderKey (line 84) | @Override

FILE: projects/sample/source/sample-plugin/sample-runtime/src/main/java/com/tencent/shadow/sample/plugin/runtime/PluginDefaultProxyActivity.java
  class PluginDefaultProxyActivity (line 26) | @SuppressLint("Registered")//无需注册在这个模块的Manifest中,要注册在宿主的Manifest中。
    method getDelegateProviderKey (line 29) | @Override

FILE: projects/sample/source/sample-plugin/sample-runtime/src/main/java/com/tencent/shadow/sample/plugin/runtime/PluginSingleInstance1ProxyActivity.java
  class PluginSingleInstance1ProxyActivity (line 25) | @SuppressLint("Registered")//无需注册在这个模块的Manifest中,要注册在宿主的Manifest中。

FILE: projects/sample/source/sample-plugin/sample-runtime/src/main/java/com/tencent/shadow/sample/plugin/runtime/PluginSingleTask1ProxyActivity.java
  class PluginSingleTask1ProxyActivity (line 25) | @SuppressLint("Registered")//无需注册在这个模块的Manifest中,要注册在宿主的Manifest中。

FILE: projects/sample/source/sample-plugin/third-party/pinnedheaderexpandablelistview/src/main/java/com/ryg/expandable/ui/PinnedHeaderExpandableListView.java
  class PinnedHeaderExpandableListView (line 41) | public class PinnedHeaderExpandableListView extends ExpandableListView i...
    type OnHeaderUpdateListener (line 45) | public interface OnHeaderUpdateListener {
      method getPinnedHeader (line 50) | public View getPinnedHeader();
      method updatePinnedHeader (line 52) | public void updatePinnedHeader(View headerView, int firstVisibleGrou...
    method PinnedHeaderExpandableListView (line 68) | public PinnedHeaderExpandableListView(Context context) {
    method PinnedHeaderExpandableListView (line 73) | public PinnedHeaderExpandableListView(Context context, AttributeSet at...
    method PinnedHeaderExpandableListView (line 78) | public PinnedHeaderExpandableListView(Context context, AttributeSet at...
    method initView (line 83) | private void initView() {
    method setOnScrollListener (line 88) | @Override
    method setOnGroupClickListener (line 106) | public void setOnGroupClickListener(OnGroupClickListener onGroupClickL...
    method setOnHeaderUpdateListener (line 111) | public void setOnHeaderUpdateListener(OnHeaderUpdateListener listener) {
    method onMeasure (line 126) | @Override
    method onLayout (line 137) | @Override
    method dispatchDraw (line 147) | @Override
    method dispatchTouchEvent (line 155) | @Override
    method getTouchTarget (line 187) | private View getTouchTarget(View view, int x, int y) {
    method isTouchPointInView (line 211) | private boolean isTouchPointInView(View view, int x, int y) {
    method requestRefreshHeader (line 219) | public void requestRefreshHeader() {
    method refreshHeader (line 224) | protected void refreshHeader() {
    method onScrollStateChanged (line 257) | @Override
    method onScroll (line 264) | @Override

FILE: projects/sample/source/sample-plugin/third-party/pinnedheaderexpandablelistview/src/main/java/com/ryg/expandable/ui/StickyLayout.java
  class StickyLayout (line 42) | public class StickyLayout extends LinearLayout {
    type OnGiveUpTouchEventListener (line 46) | public interface OnGiveUpTouchEventListener {
      method giveUpTouchEvent (line 47) | public boolean giveUpTouchEvent(MotionEvent event);
    method StickyLayout (line 79) | public StickyLayout(Context context) {
    method StickyLayout (line 83) | public StickyLayout(Context context, AttributeSet attrs) {
    method StickyLayout (line 87) | @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    method onWindowFocusChanged (line 92) | @Override
    method initData (line 100) | private void initData() {
    method setOnGiveUpTouchEventListener (line 120) | public void setOnGiveUpTouchEventListener(OnGiveUpTouchEventListener l) {
    method onInterceptTouchEvent (line 124) | @Override
    method onTouchEvent (line 170) | @Override
    method smoothSetHeaderHeight (line 213) | public void smoothSetHeaderHeight(final int from, final int to, long d...
    method smoothSetHeaderHeight (line 217) | public void smoothSetHeaderHeight(final int from, final int to, long d...
    method setOriginalHeaderHeight (line 253) | public void setOriginalHeaderHeight(int originalHeaderHeight) {
    method setHeaderHeight (line 257) | public void setHeaderHeight(int height, boolean modifyOriginalHeaderHe...
    method setHeaderHeight (line 264) | public void setHeaderHeight(int height) {
    method getHeaderHeight (line 295) | public int getHeaderHeight() {
    method setSticky (line 299) | public void setSticky(boolean isSticky) {
    method requestDisallowInterceptTouchEventOnHeader (line 303) | public void requestDisallowInterceptTouchEventOnHeader(boolean disallo...

FILE: projects/sample/source/sample-plugin/third-party/slidingmenu/src/main/java/com/jeremyfeinstein/slidingmenu/lib/CanvasTransformerBuilder.java
  class CanvasTransformerBuilder (line 8) | public class CanvasTransformerBuilder {
    method getInterpolation (line 13) | public float getInterpolation(float t) {
    method initTransformer (line 18) | private void initTransformer() {
    method zoom (line 26) | public CanvasTransformer zoom(final int openedX, final int closedX,
    method zoom (line 32) | public CanvasTransformer zoom(final int openedX, final int closedX,
    method rotate (line 47) | public CanvasTransformer rotate(final int openedDeg, final int closedDeg,
    method rotate (line 52) | public CanvasTransformer rotate(final int openedDeg, final int closedDeg,
    method translate (line 66) | public CanvasTransformer translate(final int openedX, final int closedX,
    method translate (line 71) | public CanvasTransformer translate(final int openedX, final int closedX,
    method concatTransformer (line 85) | public CanvasTransformer concatTransformer(final CanvasTransformer t) {

FILE: projects/sample/source/sample-plugin/third-party/slidingmenu/src/main/java/com/jeremyfeinstein/slidingmenu/lib/CustomViewAbove.java
  class CustomViewAbove (line 32) | public class CustomViewAbove extends ViewGroup {
    method getInterpolation (line 43) | public float getInterpolation(float t) {
    type OnPageChangeListener (line 105) | public interface OnPageChangeListener {
      method onPageScrolled (line 116) | public void onPageScrolled(int position, float positionOffset, int p...
      method onPageSelected (line 124) | public void onPageSelected(int position);
    class SimpleOnPageChangeListener (line 133) | public static class SimpleOnPageChangeListener implements OnPageChange...
      method onPageScrolled (line 135) | public void onPageScrolled(int position, float positionOffset, int p...
      method onPageSelected (line 139) | public void onPageSelected(int position) {
      method onPageScrollStateChanged (line 143) | public void onPageScrollStateChanged(int state) {
    method CustomViewAbove (line 149) | public CustomViewAbove(Context context) {
    method CustomViewAbove (line 153) | public CustomViewAbove(Context context, AttributeSet attrs) {
    method initCustomViewAbove (line 158) | void initCustomViewAbove() {
    method setCurrentItem (line 195) | public void setCurrentItem(int item) {
    method setCurrentItem (line 205) | public void setCurrentItem(int item, boolean smoothScroll) {
    method getCurrentItem (line 209) | public int getCurrentItem() {
    method setCurrentItemInternal (line 213) | void setCurrentItemInternal(int item, boolean smoothScroll, boolean al...
    method setCurrentItemInternal (line 217) | void setCurrentItemInternal(int item, boolean smoothScroll, boolean al...
    method setOnPageChangeListener (line 248) | public void setOnPageChangeListener(OnPageChangeListener listener) {
    method setOnOpenedListener (line 261) | public void setOnOpenedListener(OnOpenedListener l) {
    method setOnClosedListener (line 265) | public void setOnClosedListener(OnClosedListener l) {
    method setInternalPageChangeListener (line 275) | OnPageChangeListener setInternalPageChangeListener(OnPageChangeListene...
    method addIgnoredView (line 281) | public void addIgnoredView(View v) {
    method removeIgnoredView (line 287) | public void removeIgnoredView(View v) {
    method clearIgnoredViews (line 291) | public void clearIgnoredViews() {
    method distanceInfluenceForSnapDuration (line 299) | float distanceInfluenceForSnapDuration(float f) {
    method getDestScrollX (line 305) | public int getDestScrollX(int page) {
    method getLeftBound (line 316) | private int getLeftBound() {
    method getRightBound (line 320) | private int getRightBound() {
    method getContentLeft (line 324) | public int getContentLeft() {
    method isMenuOpen (line 328) | public boolean isMenuOpen() {
    method isInIgnoredView (line 332) | private boolean isInIgnoredView(MotionEvent ev) {
    method getBehindWidth (line 341) | public int getBehindWidth() {
    method getChildWidth (line 349) | public int getChildWidth(int i) {
    method isSlidingEnabled (line 360) | public boolean isSlidingEnabled() {
    method setSlidingEnabled (line 364) | public void setSlidingEnabled(boolean b) {
    method smoothScrollTo (line 374) | void smoothScrollTo(int x, int y) {
    method smoothScrollTo (line 385) | void smoothScrollTo(int x, int y, int velocity) {
    method setContent (line 431) | public void setContent(View v) {
    method getContent (line 438) | public View getContent() {
    method setCustomViewBehind (line 442) | public void setCustomViewBehind(CustomViewBehind cvb) {
    method onMeasure (line 446) | @Override
    method onSizeChanged (line 458) | @Override
    method onLayout (line 471) | @Override
    method setAboveOffset (line 478) | public void setAboveOffset(int i) {
    method computeScroll (line 486) | @Override
    method pageScrolled (line 510) | private void pageScrolled(int xpos) {
    method onPageScrolled (line 531) | protected void onPageScrolled(int position, float offset, int offsetPi...
    method completeScroll (line 540) | private void completeScroll() {
    method setTouchMode (line 566) | public void setTouchMode(int i) {
    method getTouchMode (line 570) | public int getTouchMode() {
    method thisTouchAllowed (line 574) | private boolean thisTouchAllowed(MotionEvent ev) {
    method thisSlideAllowed (line 591) | private boolean thisSlideAllowed(float dx) {
    method getPointerIndex (line 603) | private int getPointerIndex(MotionEvent ev, int id) {
    method onInterceptTouchEvent (line 612) | @Override
    method onTouchEvent (line 666) | @Override
    method determineDrag (line 776) | private void determineDrag(MotionEvent ev) {
    method scrollTo (line 797) | @Override
    method determineTargetPage (line 805) | private int determineTargetPage(float pageOffset, int velocity, int de...
    method getPercentOpen (line 819) | protected float getPercentOpen() {
    method dispatchDraw (line 823) | @Override
    method onSecondaryPointerUp (line 835) | private void onSecondaryPointerUp(MotionEvent ev) {
    method startDrag (line 851) | private void startDrag() {
    method endDrag (line 856) | private void endDrag() {
    method setScrollingCacheEnabled (line 868) | private void setScrollingCacheEnabled(boolean enabled) {
    method canScroll (line 894) | protected boolean canScroll(View v, boolean checkV, int dx, int x, int...
    method dispatchKeyEvent (line 916) | @Override
    method executeKeyEvent (line 930) | public boolean executeKeyEvent(KeyEvent event) {
    method arrowScroll (line 956) | public boolean arrowScroll(int direction) {
    method pageLeft (line 989) | boolean pageLeft() {
    method pageRight (line 997) | boolean pageRight() {

FILE: projects/sample/source/sample-plugin/third-party/slidingmenu/src/main/java/com/jeremyfeinstein/slidingmenu/lib/CustomViewBehind.java
  class CustomViewBehind (line 18) | public class CustomViewBehind extends ViewGroup {
    method CustomViewBehind (line 34) | public CustomViewBehind(Context context) {
    method CustomViewBehind (line 38) | public CustomViewBehind(Context context, AttributeSet attrs) {
    method setCustomViewAbove (line 44) | public void setCustomViewAbove(CustomViewAbove customViewAbove) {
    method setCanvasTransformer (line 48) | public void setCanvasTransformer(CanvasTransformer t) {
    method setWidthOffset (line 52) | public void setWidthOffset(int i) {
    method setMarginThreshold (line 57) | public void setMarginThreshold(int marginThreshold) {
    method getMarginThreshold (line 61) | public int getMarginThreshold() {
    method getBehindWidth (line 65) | public int getBehindWidth() {
    method setContent (line 69) | public void setContent(View v) {
    method getContent (line 76) | public View getContent() {
    method setSecondaryContent (line 85) | public void setSecondaryContent(View v) {
    method getSecondaryContent (line 92) | public View getSecondaryContent() {
    method setChildrenEnabled (line 96) | public void setChildrenEnabled(boolean enabled) {
    method scrollTo (line 100) | @Override
    method onInterceptTouchEvent (line 107) | @Override
    method onTouchEvent (line 112) | @Override
    method dispatchDraw (line 117) | @Override
    method onLayout (line 128) | @Override
    method onMeasure (line 137) | @Override
    method setMode (line 158) | public void setMode(int mode) {
    method getMode (line 168) | public int getMode() {
    method setScrollScale (line 172) | public void setScrollScale(float scrollScale) {
    method getScrollScale (line 176) | public float getScrollScale() {
    method setShadowDrawable (line 180) | public void setShadowDrawable(Drawable shadow) {
    method setSecondaryShadowDrawable (line 185) | public void setSecondaryShadowDrawable(Drawable shadow) {
    method setShadowWidth (line 190) | public void setShadowWidth(int width) {
    method setFadeEnabled (line 195) | public void setFadeEnabled(boolean b) {
    method setFadeDegree (line 199) | public void setFadeDegree(float degree) {
    method getMenuPage (line 205) | public int getMenuPage(int page) {
    method scrollBehindTo (line 216) | public void scrollBehindTo(View content, int x, int y) {
    method getMenuLeft (line 241) | public int getMenuLeft(View content, int page) {
    method getAbsLeftBound (line 267) | public int getAbsLeftBound(View content) {
    method getAbsRightBound (line 276) | public int getAbsRightBound(View content) {
    method marginTouchAllowed (line 285) | public boolean marginTouchAllowed(View content, int x) {
    method setTouchMode (line 299) | public void setTouchMode(int i) {
    method menuOpenTouchAllowed (line 303) | public boolean menuOpenTouchAllowed(View content, int currPage, float ...
    method menuTouchInQuickReturn (line 313) | public boolean menuTouchInQuickReturn(View content, int currPage, floa...
    method menuClosedSlideAllowed (line 322) | public boolean menuClosedSlideAllowed(float dx) {
    method menuOpenSlideAllowed (line 333) | public boolean menuOpenSlideAllowed(float dx) {
    method drawShadow (line 344) | public void drawShadow(View content, Canvas canvas) {
    method drawFade (line 363) | public void drawFade(View content, Canvas canvas, float openPercent) {
    method drawSelector (line 389) | public void drawSelector(View content, Canvas canvas, float openPercen...
    method setSelectorEnabled (line 413) | public void setSelectorEnabled(boolean b) {
    method setSelectedView (line 417) | public void setSelectedView(View v) {
    method getSelectorTop (line 429) | private int getSelectorTop() {
    method setSelectorBitmap (line 435) | public void setSelectorBitmap(Bitmap b) {

FILE: projects/sample/source/sample-plugin/third-party/slidingmenu/src/main/java/com/jeremyfeinstein/slidingmenu/lib/SlidingMenu.java
  class SlidingMenu (line 31) | public class SlidingMenu extends RelativeLayout {
    type OnOpenListener (line 91) | public interface OnOpenListener {
      method onOpen (line 96) | public void onOpen();
    type OnOpenedListener (line 110) | public interface OnOpenedListener {
      method onOpened (line 115) | public void onOpened();
    type OnCloseListener (line 129) | public interface OnCloseListener {
      method onClose (line 134) | public void onClose();
    type OnClosedListener (line 148) | public interface OnClosedListener {
      method onClosed (line 153) | public void onClosed();
    type CanvasTransformer (line 159) | public interface CanvasTransformer {
      method transformCanvas (line 167) | public void transformCanvas(Canvas canvas, float percentOpen);
    method SlidingMenu (line 175) | public SlidingMenu(Context context) {
    method SlidingMenu (line 185) | public SlidingMenu(Activity activity, int slideStyle) {
    method SlidingMenu (line 196) | public SlidingMenu(Context context, AttributeSet attrs) {
    method SlidingMenu (line 207) | public SlidingMenu(Context context, AttributeSet attrs, int defStyle) {
    method attachToActivity (line 297) | public void attachToActivity(Activity activity, int slideStyle) {
    method attachToActivity (line 308) | public void attachToActivity(Activity activity, int slideStyle, boolea...
    method setContent (line 352) | public void setContent(int res) {
    method setContent (line 361) | public void setContent(View view) {
    method getContent (line 371) | public View getContent() {
    method setMenu (line 381) | public void setMenu(int res) {
    method setMenu (line 390) | public void setMenu(View v) {
    method getMenu (line 399) | public View getMenu() {
    method setSecondaryMenu (line 409) | public void setSecondaryMenu(int res) {
    method setSecondaryMenu (line 418) | public void setSecondaryMenu(View v) {
    method getSecondaryMenu (line 428) | public View getSecondaryMenu() {
    method setSlidingEnabled (line 438) | public void setSlidingEnabled(boolean b) {
    method isSlidingEnabled (line 447) | public boolean isSlidingEnabled() {
    method setMode (line 456) | public void setMode(int mode) {
    method getMode (line 468) | public int getMode() {
    method setStatic (line 477) | public void setStatic(boolean b) {
    method showMenu (line 494) | public void showMenu() {
    method showMenu (line 503) | public void showMenu(boolean animate) {
    method showSecondaryMenu (line 511) | public void showSecondaryMenu() {
    method showSecondaryMenu (line 521) | public void showSecondaryMenu(boolean animate) {
    method showContent (line 528) | public void showContent() {
    method showContent (line 537) | public void showContent(boolean animate) {
    method toggle (line 544) | public void toggle() {
    method toggle (line 553) | public void toggle(boolean animate) {
    method isMenuShowing (line 566) | public boolean isMenuShowing() {
    method isSecondaryMenuShowing (line 575) | public boolean isSecondaryMenuShowing() {
    method getBehindOffset (line 584) | public int getBehindOffset() {
    method setBehindOffset (line 593) | public void setBehindOffset(int i) {
    method setBehindOffsetRes (line 608) | public void setBehindOffsetRes(int resID) {
    method setAboveOffset (line 618) | public void setAboveOffset(int i) {
    method setAboveOffsetRes (line 627) | public void setAboveOffsetRes(int resID) {
    method setBehindWidth (line 637) | @SuppressWarnings("deprecation")
    method setBehindWidthRes (line 661) | public void setBehindWidthRes(int res) {
    method getBehindScrollScale (line 671) | public float getBehindScrollScale() {
    method getTouchmodeMarginThreshold (line 680) | public int getTouchmodeMarginThreshold() {
    method setTouchmodeMarginThreshold (line 689) | public void setTouchmodeMarginThreshold(int touchmodeMarginThreshold) {
    method setBehindScrollScale (line 699) | public void setBehindScrollScale(float f) {
    method setBehindCanvasTransformer (line 710) | public void setBehindCanvasTransformer(CanvasTransformer t) {
    method getTouchModeAbove (line 719) | public int getTouchModeAbove() {
    method setTouchModeAbove (line 730) | public void setTouchModeAbove(int i) {
    method setTouchModeBehind (line 746) | public void setTouchModeBehind(int i) {
    method setShadowDrawable (line 760) | public void setShadowDrawable(int resId) {
    method setShadowDrawable (line 769) | public void setShadowDrawable(Drawable d) {
    method setSecondaryShadowDrawable (line 778) | public void setSecondaryShadowDrawable(int resId) {
    method setSecondaryShadowDrawable (line 787) | public void setSecondaryShadowDrawable(Drawable d) {
    method setShadowWidthRes (line 796) | public void setShadowWidthRes(int resId) {
    method setShadowWidth (line 805) | public void setShadowWidth(int pixels) {
    method setFadeEnabled (line 814) | public void setFadeEnabled(boolean b) {
    method setFadeDegree (line 824) | public void setFadeDegree(float f) {
    method setSelectorEnabled (line 833) | public void setSelectorEnabled(boolean b) {
    method setSelectedView (line 842) | public void setSelectedView(View v) {
    method setSelectorDrawable (line 851) | public void setSelectorDrawable(int res) {
    method setSelectorBitmap (line 860) | public void setSelectorBitmap(Bitmap b) {
    method addIgnoredView (line 869) | public void addIgnoredView(View v) {
    method removeIgnoredView (line 878) | public void removeIgnoredView(View v) {
    method clearIgnoredViews (line 885) | public void clearIgnoredViews() {
    method setOnOpenListener (line 894) | public void setOnOpenListener(OnOpenListener listener) {
    method setSecondaryOnOpenListner (line 906) | public void setSecondaryOnOpenListner(OnOpenListener listener) {
    method setOnCloseListener (line 915) | public void setOnCloseListener(OnCloseListener listener) {
    method setOnOpenedListener (line 925) | public void setOnOpenedListener(OnOpenedListener listener) {
    method setOnClosedListener (line 934) | public void setOnClosedListener(OnClosedListener listener) {
    class SavedState (line 938) | public static class SavedState extends BaseSavedState {
      method SavedState (line 942) | public SavedState(Parcelable superState, int item) {
      method SavedState (line 947) | private SavedState(Parcel in) {
      method getItem (line 952) | public int getItem() {
      method writeToParcel (line 959) | public void writeToParcel(Parcel out, int flags) {
      method createFromParcel (line 966) | public SavedState createFromParcel(Parcel in) {
      method newArray (line 970) | public SavedState[] newArray(int size) {
    method onSaveInstanceState (line 980) | @Override
    method onRestoreInstanceState (line 990) | @Override
    method fitSystemWindows (line 1000) | @SuppressLint("NewApi")
    method manageLayers (line 1014) | @TargetApi(Build.VERSION_CODES.HONEYCOMB)

FILE: projects/sdk/core/activity-container/src/main/java/com/tencent/shadow/core/runtime/container/DelegateProvider.java
  type DelegateProvider (line 28) | public interface DelegateProvider {
    method getHostActivityDelegate (line 39) | HostActivityDelegate getHostActivityDelegate(Class<? extends HostActiv...

FILE: projects/sdk/core/activity-container/src/main/java/com/tencent/shadow/core/runtime/container/DelegateProviderHolder.java
  class DelegateProviderHolder (line 34) | public class DelegateProviderHolder {
    method setDelegateProvider (line 47) | public static void setDelegateProvider(String key, DelegateProvider de...
    method getDelegateProvider (line 51) | public static DelegateProvider getDelegateProvider(String key) {

FILE: projects/sdk/core/activity-container/src/main/java/com/tencent/shadow/core/runtime/container/HostActivity.java
  type HostActivity (line 29) | public interface HostActivity {
    method getImplementActivity (line 35) | Activity getImplementActivity();
    method getImplementWindow (line 42) | Window getImplementWindow();

FILE: projects/sdk/core/activity-container/src/main/java/com/tencent/shadow/core/runtime/container/HostActivityDelegate.java
  type HostActivityDelegate (line 28) | public interface HostActivityDelegate extends GeneratedHostActivityDeleg...
    method setDelegator (line 29) | void setDelegator(HostActivityDelegator delegator);
    method getPluginActivity (line 31) | Object getPluginActivity();
    method getLoaderVersion (line 33) | String getLoaderVersion();

FILE: projects/sdk/core/activity-container/src/main/java/com/tencent/shadow/core/runtime/container/HostActivityDelegator.java
  type HostActivityDelegator (line 27) | public interface HostActivityDelegator extends GeneratedHostActivityDele...
    method getHostActivity (line 28) | HostActivity getHostActivity();

FILE: projects/sdk/core/activity-container/src/main/java/com/tencent/shadow/core/runtime/container/HostNativeActivityDelegate.java
  type HostNativeActivityDelegate (line 25) | public interface HostNativeActivityDelegate extends HostActivityDelegate {
    method getPackageManager (line 27) | PackageManager getPackageManager();
    method surfaceCreated (line 29) | void surfaceCreated(SurfaceHolder holder);
    method surfaceChanged (line 31) | void surfaceChanged(SurfaceHolder holder, int format, int width, int h...
    method surfaceRedrawNeeded (line 33) | void surfaceRedrawNeeded(SurfaceHolder holder);
    method surfaceDestroyed (line 35) | void surfaceDestroyed(SurfaceHolder holder);
    method onInputQueueCreated (line 37) | void onInputQueueCreated(InputQueue queue);
    method onInputQueueDestroyed (line 39) | void onInputQueueDestroyed(InputQueue queue);
    method onGlobalLayout (line 41) | void onGlobalLayout();

FILE: projects/sdk/core/activity-container/src/main/java/com/tencent/shadow/core/runtime/container/HostNativeActivityDelegator.java
  type HostNativeActivityDelegator (line 24) | public interface HostNativeActivityDelegator extends HostActivityDelegat...
    method superSurfaceCreated (line 25) | void superSurfaceCreated(SurfaceHolder holder);
    method superSurfaceChanged (line 27) | void superSurfaceChanged(SurfaceHolder holder, int format, int width, ...
    method superSurfaceRedrawNeeded (line 29) | void superSurfaceRedrawNeeded(SurfaceHolder holder);
    method superSurfaceDestroyed (line 31) | void superSurfaceDestroyed(SurfaceHolder holder);
    method superOnInputQueueCreated (line 33) | void superOnInputQueueCreated(InputQueue queue);
    method superOnInputQueueDestroyed (line 35) | void superOnInputQueueDestroyed(InputQueue queue);
    method superOnGlobalLayout (line 37) | void superOnGlobalLayout();

FILE: projects/sdk/core/activity-container/src/main/java/com/tencent/shadow/core/runtime/container/NativePluginContainerActivity.java
  class NativePluginContainerActivity (line 40) | public class NativePluginContainerActivity extends GeneratedNativePlugin...
    method NativePluginContainerActivity (line 47) | public NativePluginContainerActivity() {
    method getDelegateProviderKey (line 61) | protected String getDelegateProviderKey() {
    method getPluginActivity (line 65) | final public Object getPluginActivity() {
    method onCreate (line 73) | @Override
    method isIllegalIntent (line 108) | private boolean isIllegalIntent(Bundle savedInstanceState) {
    method onSaveInstanceState (line 125) | @Override
    method getHostActivity (line 137) | @Override
    method getImplementActivity (line 142) | @Override
    method getImplementWindow (line 147) | @Override
    method getTheme (line 160) | @Override
    method setTheme (line 172) | @Override
    method getPackageManager (line 179) | @Override
    method surfaceCreated (line 188) | @Override
    method surfaceChanged (line 197) | @Override
    method surfaceRedrawNeeded (line 206) | @Override
    method surfaceDestroyed (line 215) | @Override
    method onInputQueueCreated (line 224) | @Override
    method onInputQueueDestroyed (line 233) | @Override
    method onGlobalLayout (line 242) | @Override
    method superSurfaceCreated (line 251) | @Override
    method superSurfaceChanged (line 256) | @Override
    method superSurfaceRedrawNeeded (line 261) | @Override
    method superSurfaceDestroyed (line 266) | @Override
    method superOnInputQueueCreated (line 271) | @Override
    method superOnInputQueueDestroyed (line 276) | @Override
    method superOnGlobalLayout (line 281) | @Override

FILE: projects/sdk/core/activity-container/src/main/java/com/tencent/shadow/core/runtime/container/PluginContainerActivity.java
  class PluginContainerActivity (line 38) | public class PluginContainerActivity extends GeneratedPluginContainerAct...
    method PluginContainerActivity (line 45) | public PluginContainerActivity() {
    method getDelegateProviderKey (line 59) | protected String getDelegateProviderKey() {
    method getPluginActivity (line 63) | final public Object getPluginActivity() {
    method onCreate (line 71) | @Override
    method isIllegalIntent (line 106) | private boolean isIllegalIntent(Bundle savedInstanceState) {
    method onSaveInstanceState (line 123) | @Override
    method getHostActivity (line 135) | @Override
    method getImplementActivity (line 140) | @Override
    method getImplementWindow (line 145) | @Override
    method getTheme (line 158) | @Override
    method setTheme (line 170) | @Override

FILE: projects/sdk/core/common/src/main/java/com/tencent/shadow/core/common/ILoggerFactory.java
  type ILoggerFactory (line 21) | public interface ILoggerFactory {
    method getLogger (line 23) | Logger getLogger(String name);

FILE: projects/sdk/core/common/src/main/java/com/tencent/shadow/core/common/InstalledApk.java
  class InstalledApk (line 27) | public class InstalledApk implements Parcelable {
    method InstalledApk (line 37) | public InstalledApk(String apkFilePath, String oDexPath, String librar...
    method InstalledApk (line 41) | public InstalledApk(String apkFilePath, String oDexPath, String librar...
    method InstalledApk (line 48) | protected InstalledApk(Parcel in) {
    method writeToParcel (line 63) | @Override
    method describeContents (line 74) | @Override
    method createFromParcel (line 80) | @Override
    method newArray (line 85) | @Override

FILE: projects/sdk/core/common/src/main/java/com/tencent/shadow/core/common/Logger.java
  type Logger (line 21) | public interface Logger {
    method getName (line 23) | String getName();
    method isTraceEnabled (line 25) | boolean isTraceEnabled();
    method trace (line 27) | void trace(String msg);
    method trace (line 29) | void trace(String format, Object arg);
    method trace (line 31) | void trace(String format, Object arg1, Object arg2);
    method trace (line 33) | void trace(String format, Object... arguments);
    method trace (line 35) | void trace(String msg, Throwable t);
    method isDebugEnabled (line 37) | boolean isDebugEnabled();
    method debug (line 39) | void debug(String msg);
    method debug (line 41) | void debug(String format, Object arg);
    method debug (line 43) | void debug(String format, Object arg1, Object arg2);
    method debug (line 45) | void debug(String format, Object... arguments);
    method debug (line 47) | void debug(String msg, Throwable t);
    method isInfoEnabled (line 49) | boolean isInfoEnabled();
    method info (line 51) | void info(String msg);
    method info (line 53) | void info(String format, Object arg);
    method info (line 55) | void info(String format, Object arg1, Object arg2);
    method info (line 57) | void info(String format, Object... arguments);
    method info (line 59) | void info(String msg, Throwable t);
    method isWarnEnabled (line 61) | boolean isWarnEnabled();
    method warn (line 63) | void warn(String msg);
    method warn (line 65) | void warn(String format, Object arg);
    method warn (line 67) | void warn(String format, Object... arguments);
    method warn (line 69) | void warn(String format, Object arg1, Object arg2);
    method warn (line 71) | void warn(String msg, Throwable t);
    method isErrorEnabled (line 73) | boolean isErrorEnabled();
    method error (line 75) | void error(String msg);
    method error (line 77) | void error(String format, Object arg);
    method error (line 79) | void error(String format, Object arg1, Object arg2);
    method error (line 81) | void error(String format, Object... arguments);
    method error (line 83) | void error(String msg, Throwable t);

FILE: projects/sdk/core/common/src/main/java/com/tencent/shadow/core/common/LoggerFactory.java
  class LoggerFactory (line 21) | public final class LoggerFactory {
    method setILoggerFactory (line 25) | public static void setILoggerFactory(ILoggerFactory loggerFactory) {
    method getLogger (line 32) | final public static Logger getLogger(Class<?> clazz) {
    method getILoggerFactory (line 37) | public static ILoggerFactory getILoggerFactory() {

FILE: projects/sdk/core/common/src/main/java/com/tencent/shadow/core/runtime/container/ContentProviderDelegateProvider.java
  type ContentProviderDelegateProvider (line 29) | public interface ContentProviderDelegateProvider {
    method getHostContentProviderDelegate (line 36) | HostContentProviderDelegate getHostContentProviderDelegate();

FILE: projects/sdk/core/common/src/main/java/com/tencent/shadow/core/runtime/container/ContentProviderDelegateProviderHolder.java
  class ContentProviderDelegateProviderHolder (line 29) | public class ContentProviderDelegateProviderHolder {
    method setContentProviderDelegateProvider (line 33) | public static void setContentProviderDelegateProvider(ContentProviderD...
    method setDelegateProviderHolderPrepareListener (line 40) | public static void setDelegateProviderHolderPrepareListener(DelegatePr...
    method notifyDelegateProviderHolderPrepare (line 44) | private static void notifyDelegateProviderHolderPrepare() {
    type DelegateProviderHolderPrepareListener (line 50) | interface DelegateProviderHolderPrepareListener {
      method onPrepare (line 51) | void onPrepare();

FILE: projects/sdk/core/common/src/main/java/com/tencent/shadow/core/runtime/container/HostContentProviderDelegate.java
  type HostContentProviderDelegate (line 36) | public interface HostContentProviderDelegate {
    method onCreate (line 38) | boolean onCreate();
    method onConfigurationChanged (line 40) | void onConfigurationChanged(Configuration newConfig);
    method onLowMemory (line 42) | void onLowMemory();
    method onTrimMemory (line 44) | void onTrimMemory(int level);
    method query (line 46) | Cursor query(Uri uri, String[] projection, String selection, String[] ...
    method getType (line 48) | String getType(Uri uri);
    method insert (line 50) | Uri insert(Uri uri, ContentValues values);
    method delete (line 52) | int delete(Uri uri, String selection, String[] selectionArgs);
    method update (line 54) | int update(Uri uri, ContentValues values, String selection, String[] s...
    method bulkInsert (line 56) | int bulkInsert(Uri uri, ContentValues[] values);
    method call (line 58) | Bundle call(String method, String arg, Bundle extras);
    method openFile (line 60) | ParcelFileDescriptor openFile(Uri uri, String mode);
    method openFile (line 62) | ParcelFileDescriptor openFile(Uri uri, String mode, CancellationSignal...

FILE: projects/sdk/core/common/src/main/java/com/tencent/shadow/core/runtime/container/PluginContainerContentProvider.java
  class PluginContainerContentProvider (line 33) | public class PluginContainerContentProvider extends ContentProvider {
    method PluginContainerContentProvider (line 40) | public PluginContainerContentProvider() {
    method onCreate (line 61) | @Override
    method query (line 66) | @Override
    method getType (line 75) | @Override
    method insert (line 84) | @Override
    method delete (line 93) | @Override
    method update (line 102) | @Override
    method bulkInsert (line 112) | @Override
    method call (line 121) | @Override
    method onConfigurationChanged (line 131) | @Override
    method onLowMemory (line 138) | @Override
    method onTrimMemory (line 145) | @Override
    method openFile (line 152) | @Override
    method openFile (line 162) | @Override
    method checkHostContentProviderDelegate (line 172) | private void checkHostContentProviderDelegate() {

FILE: projects/sdk/core/load-parameters/src/main/java/com/tencent/shadow/core/load_parameters/LoadParameters.java
  class LoadParameters (line 33) | public class LoadParameters implements Parcelable {
    method LoadParameters (line 39) | public LoadParameters(String businessName, String partKey, String[] de...
    method LoadParameters (line 46) | public LoadParameters(Parcel in) {
    method writeToParcel (line 53) | @Override
    method describeContents (line 61) | @Override
    method createFromParcel (line 67) | @Override
    method newArray (line 72) | @Override

FILE: projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/delegates/PackageManagerWrapper.java
  class PackageManagerWrapper (line 34) | @SuppressLint("NewApi")
    method PackageManagerWrapper (line 38) | PackageManagerWrapper(PackageManager proxy) {
    method getPackageInfo (line 42) | @Override
    method getPackageInfo (line 47) | @Override
    method currentToCanonicalPackageNames (line 52) | @Override
    method canonicalToCurrentPackageNames (line 57) | @Override
    method getLaunchIntentForPackage (line 62) | @Override
    method getLeanbackLaunchIntentForPackage (line 67) | @Override
    method getPackageGids (line 72) | @Override
    method getPackageGids (line 77) | @Override
    method getPackageUid (line 82) | @Override
    method getPermissionInfo (line 87) | @Override
    method queryPermissionsByGroup (line 92) | @Override
    method getPermissionGroupInfo (line 97) | @Override
    method getAllPermissionGroups (line 102) | @Override
    method getApplicationInfo (line 107) | @Override
    method getActivityInfo (line 112) | @Override
    method getReceiverInfo (line 117) | @Override
    method getServiceInfo (line 122) | @Override
    method getProviderInfo (line 127) | @Override
    method getModuleInfo (line 132) | @Override
    method getInstalledModules (line 137) | @Override
    method getInstalledPackages (line 142) | @Override
    method getPackagesHoldingPermissions (line 147) | @Override
    method checkPermission (line 152) | @Override
    method isPermissionRevokedByPolicy (line 157) | @Override
    method addPermission (line 162) | @Override
    method addPermissionAsync (line 167) | @Override
    method removePermission (line 172) | @Override
    method getWhitelistedRestrictedPermissions (line 177) | @Override
    method addWhitelistedRestrictedPermission (line 182) | @Override
    method removeWhitelistedRestrictedPermission (line 187) | @Override
    method setAutoRevokeWhitelisted (line 192) | @Override
    method isAutoRevokeWhitelisted (line 197) | @Override
    method getBackgroundPermissionOptionLabel (line 202) | @Override
    method checkSignatures (line 207) | @Override
    method checkSignatures (line 212) | @Override
    method getPackagesForUid (line 217) | @Override
    method getNameForUid (line 222) | @Override
    method getInstalledApplications (line 227) | @Override
    method isInstantApp (line 232) | @Override
    method isInstantApp (line 237) | @Override
    method getInstantAppCookieMaxBytes (line 242) | @Override
    method getInstantAppCookie (line 247) | @Override
    method clearInstantAppCookie (line 252) | @Override
    method updateInstantAppCookie (line 257) | @Override
    method getSystemSharedLibraryNames (line 262) | @Override
    method getSharedLibraries (line 267) | @Override
    method getChangedPackages (line 272) | @Override
    method getSystemAvailableFeatures (line 277) | @Override
    method hasSystemFeature (line 282) | @Override
    method hasSystemFeature (line 287) | @Override
    method resolveActivity (line 292) | @Override
    method queryIntentActivities (line 297) | @Override
    method queryIntentActivityOptions (line 302) | @Override
    method queryBroadcastReceivers (line 307) | @Override
    method resolveService (line 312) | @Override
    method queryIntentServices (line 317) | @Override
    method queryIntentContentProviders (line 322) | @Override
    method resolveContentProvider (line 327) | @Override
    method queryContentProviders (line 332) | @Override
    method getInstrumentationInfo (line 337) | @Override
    method queryInstrumentation (line 342) | @Override
    method getDrawable (line 347) | @Override
    method getActivityIcon (line 352) | @Override
    method getActivityIcon (line 357) | @Override
    method getActivityBanner (line 362) | @Override
    method getActivityBanner (line 367) | @Override
    method getDefaultActivityIcon (line 372) | @Override
    method getApplicationIcon (line 377) | @Override
    method getApplicationIcon (line 382) | @Override
    method getApplicationBanner (line 387) | @Override
    method getApplicationBanner (line 392) | @Override
    method getActivityLogo (line 397) | @Override
    method getActivityLogo (line 402) | @Override
    method getApplicationLogo (line 407) | @Override
    method getApplicationLogo (line 412) | @Override
    method getUserBadgedIcon (line 417) | @Override
    method getUserBadgedDrawableForDensity (line 422) | @Override
    method getUserBadgedLabel (line 427) | @Override
    method getText (line 432) | @Override
    method getXml (line 437) | @Override
    method getApplicationLabel (line 442) | @Override
    method getResourcesForActivity (line 447) | @Override
    method getResourcesForApplication (line 452) | @Override
    method getResourcesForApplication (line 457) | @Override
    method getPackageArchiveInfo (line 462) | @Override
    method verifyPendingInstall (line 467) | @Override
    method extendVerificationTimeout (line 472) | @Override
    method setInstallerPackageName (line 477) | @Override
    method getInstallerPackageName (line 482) | @Override
    method getInstallSourceInfo (line 488) | @Override
    method addPackageToPreferred (line 493) | @Override
    method removePackageFromPreferred (line 499) | @Override
    method getPreferredPackages (line 505) | @Override
    method addPreferredActivity (line 511) | @Override
    method clearPackagePreferredActivities (line 517) | @Override
    method getPreferredActivities (line 523) | @Override
    method setComponentEnabledSetting (line 529) | @Override
    method getComponentEnabledSetting (line 534) | @Override
    method getSyntheticAppDetailsActivityEnabled (line 539) | @Override
    method setApplicationEnabledSetting (line 544) | @Override
    method getApplicationEnabledSetting (line 549) | @Override
    method isSafeMode (line 554) | @Override
    method isPackageSuspended (line 559) | @Override
    method isPackageSuspended (line 564) | @Override
    method getSuspendedPackageAppExtras (line 569) | @Override
    method setApplicationCategoryHint (line 574) | @Override
    method isDeviceUpgrading (line 579) | @Override
    method getPackageInstaller (line 584) | @Override
    method canRequestPackageInstalls (line 589) | @Override
    method hasSigningCertificate (line 594) | @Override
    method hasSigningCertificate (line 599) | @Override
    method isAutoRevokeWhitelisted (line 604) | @Override
    method isDefaultApplicationIcon (line 609) | @Override
    method setMimeGroup (line 614) | @Override
    method getMimeGroup (line 619) | @Override

FILE: projects/sdk/core/manager-db-test/src/androidTest/java/com/tencent/shadow/core/manager/installplugin/DbCompatibilityTest.java
  class DbCompatibilityTest (line 61) | @RunWith(AndroidJUnit4.class)
    method setUp (line 68) | @Before
    method testDbNamePrefixNotChanged (line 81) | @Test
    method testCompatibleWithVersion1 (line 89) | @Test
    method testCompatibleWithVersion2 (line 98) | @Test
    method testCompatibleWithVersion3 (line 107) | @Test
    method testCompatibleWithVersion4 (line 116) | @Test
    method generateCurrentVersionInitSqlFile (line 126) | public void generateCurrentVersionInitSqlFile() throws Exception {
    method initDbWithConfigJson (line 130) | private void initDbWithConfigJson(int... configJsonResId)
    method testCompatibleWithVersion (line 158) | private void testCompatibleWithVersion(int initSqlResId, int expectSql...
    method getResRawFile (line 185) | private File getResRawFile(int resId) throws IOException {
    method initDb (line 197) | private void initDb(File initSqlFile)
    method dumpDbToFile (line 223) | private void dumpDbToFile(File dumpSqlFile)
    method deleteDb (line 262) | private void deleteDb() throws IOException {

FILE: projects/sdk/core/manager-db-test/src/androidTest/java/com/tencent/shadow/core/pluginmanager/CustomAndroidJUnitRunner.java
  class CustomAndroidJUnitRunner (line 25) | public class CustomAndroidJUnitRunner extends AndroidJUnitRunner {
    method onCreate (line 26) | @Override

FILE: projects/sdk/core/manager-db-test/src/androidTest/java/common/AndroidLogLoggerFactory.java
  class AndroidLogLoggerFactory (line 31) | public class AndroidLogLoggerFactory implements ILoggerFactory {
    method getInstance (line 41) | public static ILoggerFactory getInstance() {
    method getLogger (line 47) | public Logger getLogger(String name) {
    class IVLogger (line 58) | class IVLogger implements Logger {
      method IVLogger (line 61) | IVLogger(String name) {
      method getName (line 65) | @Override
      method log (line 70) | private void log(int level, String message, Throwable t) {
      method isTraceEnabled (line 104) | @Override
      method trace (line 109) | @Override
      method trace (line 114) | @Override
      method trace (line 120) | @Override
      method trace (line 126) | @Override
      method trace (line 132) | @Override
      method isDebugEnabled (line 137) | @Override
      method debug (line 142) | @Override
      method debug (line 147) | @Override
      method debug (line 153) | @Override
      method debug (line 159) | @Override
      method debug (line 165) | @Override
      method isInfoEnabled (line 170) | @Override
      method info (line 175) | @Override
      method info (line 180) | @Override
      method info (line 186) | @Override
      method info (line 192) | @Override
      method info (line 198) | @Override
      method isWarnEnabled (line 203) | @Override
      method warn (line 208) | @Override
      method warn (line 213) | @Override
      method warn (line 219) | @Override
      method warn (line 225) | @Override
      method warn (line 231) | @Override
      method isErrorEnabled (line 236) | @Override
      method error (line 241) | @Override
      method error (line 246) | @Override
      method error (line 252) | @Override
      method error (line 258) | @Override
      method error (line 264) | @Override
  class FormattingTuple (line 271) | class FormattingTuple {
    method FormattingTuple (line 279) | public FormattingTuple(String message) {
    method FormattingTuple (line 283) | public FormattingTuple(String message, Object[] argArray, Throwable th...
    method getMessage (line 289) | public String getMessage() {
    method getArgArray (line 293) | public Object[] getArgArray() {
    method getThrowable (line 297) | public Throwable getThrowable() {
  class MessageFormatter (line 303) | final class MessageFormatter {
    method format (line 326) | final public static FormattingTuple format(String messagePattern, Obje...
    method format (line 349) | final public static FormattingTuple format(final String messagePattern...
    method getThrowableCandidate (line 354) | static final Throwable getThrowableCandidate(Object[] argArray) {
    method arrayFormat (line 366) | final public static FormattingTuple arrayFormat(final String messagePa...
    method trimmedCopy (line 375) | private static Object[] trimmedCopy(Object[] argArray) {
    method arrayFormat (line 385) | final public static FormattingTuple arrayFormat(final String messagePa...
    method isEscapedDelimeter (line 442) | final static boolean isEscapedDelimeter(String messagePattern, int del...
    method isDoubleEscaped (line 455) | final static boolean isDoubleEscaped(String messagePattern, int delime...
    method deeplyAppendParameter (line 464) | private static void deeplyAppendParameter(StringBuilder sbuf, Object o...
    method safeObjectAppend (line 496) | private static void safeObjectAppend(StringBuilder sbuf, Object o) {
    method objectArrayAppend (line 506) | private static void objectArrayAppend(StringBuilder sbuf, Object[] a, ...
    method booleanArrayAppend (line 524) | private static void booleanArrayAppend(StringBuilder sbuf, boolean[] a) {
    method byteArrayAppend (line 535) | private static void byteArrayAppend(StringBuilder sbuf, byte[] a) {
    method charArrayAppend (line 546) | private static void charArrayAppend(StringBuilder sbuf, char[] a) {
    method shortArrayAppend (line 557) | private static void shortArrayAppend(StringBuilder sbuf, short[] a) {
    method intArrayAppend (line 568) | private static void intArrayAppend(StringBuilder sbuf, int[] a) {
    method longArrayAppend (line 579) | private static void longArrayAppend(StringBuilder sbuf, long[] a) {
    method floatArrayAppend (line 590) | private static void floatArrayAppend(StringBuilder sbuf, float[] a) {
    method doubleArrayAppend (line 601) | private static void doubleArrayAppend(StringBuilder sbuf, double[] a) {

FILE: projects/sdk/core/manager-db-test/src/androidTest/res/raw/expect_sql_version1.sql
  type shadowPluginManager (line 3) | CREATE TABLE shadowPluginManager ( id INTEGER PRIMARY KEY AUTOINCREMENT,...

FILE: projects/sdk/core/manager-db-test/src/androidTest/res/raw/expect_sql_version2.sql
  type shadowPluginManager (line 3) | CREATE TABLE shadowPluginManager ( id INTEGER PRIMARY KEY AUTOINCREMENT,...

FILE: projects/sdk/core/manager-db-test/src/androidTest/res/raw/expect_sql_version3.sql
  type shadowPluginManager (line 3) | CREATE TABLE shadowPluginManager ( id INTEGER PRIMARY KEY AUTOINCREMENT,...

FILE: projects/sdk/core/manager-db-test/src/androidTest/res/raw/expect_sql_version4.sql
  type shadowPluginManager (line 3) | CREATE TABLE shadowPluginManager ( id INTEGER PRIMARY KEY AUTOINCREMENT,...

FILE: projects/sdk/core/manager-db-test/src/androidTest/res/raw/init_sql_version1.sql
  type android_metadata (line 9) | CREATE TABLE android_metadata (locale TEXT)
  type shadowPluginManager (line 11) | CREATE TABLE shadowPluginManager ( id INTEGER PRIMARY KEY AUTOINCREMENT,...

FILE: projects/sdk/core/manager-db-test/src/androidTest/res/raw/init_sql_version2.sql
  type android_metadata (line 8) | CREATE TABLE android_metadata (locale TEXT)
  type shadowPluginManager (line 10) | CREATE TABLE shadowPluginManager ( id INTEGER PRIMARY KEY AUTOINCREMENT,...

FILE: projects/sdk/core/manager-db-test/src/androidTest/res/raw/init_sql_version3.sql
  type android_metadata (line 8) | CREATE TABLE android_metadata (locale TEXT)
  type shadowPluginManager (line 10) | CREATE TABLE shadowPluginManager ( id INTEGER PRIMARY KEY AUTOINCREMENT,...

FILE: projects/sdk/core/manager-db-test/src/androidTest/res/raw/init_sql_version4.sql
  type shadowPluginManager (line 8) | CREATE TABLE shadowPluginManager ( id INTEGER PRIMARY KEY AUTOINCREMENT,...

FILE: projects/sdk/core/manager/src/main/java/com/tencent/shadow/core/manager/BasePluginManager.java
  class BasePluginManager (line 55) | public abstract class BasePluginManager {
    method BasePluginManager (line 78) | public BasePluginManager(Context context) {
    method getName (line 88) | abstract protected String getName();
    method installPluginFromDir (line 96) | public final PluginConfig installPluginFromDir(File dir) {
    method installPluginFromZip (line 107) | public final PluginConfig installPluginFromZip(File zip, String hash) ...
    method onInstallCompleted (line 133) | public final void onInstallCompleted(PluginConfig pluginConfig,
    method setWritableFalseForPluginFiles (line 147) | private static void setWritableFalseForPluginFiles(PluginConfig plugin...
    method getPluginPartByPartKey (line 158) | protected InstalledPlugin.Part getPluginPartByPartKey(String uuid, Str...
    method getInstalledPlugin (line 170) | protected InstalledPlugin getInstalledPlugin(String uuid) {
    method getLoaderOrRunTimePart (line 174) | protected InstalledPlugin.Part getLoaderOrRunTimePart(String uuid, int...
    method oDexPlugin (line 197) | public final void oDexPlugin(String uuid, String partKey, File apkFile...
    method oDexPluginLoaderOrRunTime (line 222) | public final void oDexPluginLoaderOrRunTime(String uuid, int type, Fil...
    method extractSo (line 253) | public final Pair<String, String> extractSo(String uuid, String partKe...
    method extractLoaderOrRunTimeSo (line 300) | public final Pair<String, String> extractLoaderOrRunTimeSo(String uuid,
    method getInstalledPlugins (line 337) | public final List<InstalledPlugin> getInstalledPlugins(int limit) {
    method deleteInstalledPlugin (line 348) | public boolean deleteInstalledPlugin(String uuid) {
    method deletePart (line 372) | private boolean deletePart(InstalledPlugin.Part part) {
    method deleteFileOrDirectory (line 392) | private boolean deleteFileOrDirectory(File fileOrDirectory) {
    method getPluginPreferredAbi (line 418) | protected String getPluginPreferredAbi(String[] pluginSupportedAbis, F...
    method getPluginSupportedAbis (line 451) | private String[] getPluginSupportedAbis() {
    method isKnownInstructionSet (line 478) | private static boolean isKnownInstructionSet(String instructionSet) {
    method is64BitInstructionSet (line 495) | private static boolean is64BitInstructionSet(String instructionSet) {
    method needExtractNativeLibs (line 501) | private static boolean needExtractNativeLibs(File apkFile, String filt...
    method close (line 524) | public void close() {

FILE: projects/sdk/core/manager/src/main/java/com/tencent/shadow/core/manager/installplugin/AppCacheFolderManager.java
  class AppCacheFolderManager (line 26) | public class AppCacheFolderManager {
    method getVersionDir (line 28) | public static File getVersionDir(File root, String appName, String ver...
    method getAppDir (line 32) | public static File getAppDir(File root, String appName) {
    method getODexDir (line 37) | public static File getODexDir(File root, String key) {
    method getODexCopiedFile (line 41) | public static File getODexCopiedFile(File oDexDir, String key) {
    method getODexRootDir (line 46) | private static File getODexRootDir(File root) {
    method getLibDir (line 50) | public static File getLibDir(File root, String key) {
    method getLibCopiedFile (line 54) | public static File getLibCopiedFile(File soDir, String key) {
    method getLibRootDir (line 59) | private static File getLibRootDir(File root) {

FILE: projects/sdk/core/manager/src/main/java/com/tencent/shadow/core/manager/installplugin/CopySoBloc.java
  class CopySoBloc (line 35) | public class CopySoBloc {
    method copySo (line 41) | public static void copySo(File apkFile, File soDir, File copiedTagFile...

FILE: projects/sdk/core/manager/src/main/java/com/tencent/shadow/core/manager/installplugin/InstallPluginException.java
  class InstallPluginException (line 21) | public class InstallPluginException extends Exception {
    method InstallPluginException (line 23) | public InstallPluginException(String message) {
    method InstallPluginException (line 27) | public InstallPluginException(String message, Throwable cause) {

FILE: projects/sdk/core/manager/src/main/java/com/tencent/shadow/core/manager/installplugin/InstalledDao.java
  class InstalledDao (line 36) | public class InstalledDao {
    method InstalledDao (line 40) | public InstalledDao(InstalledPluginDBHelper dbHelper) {
    method insert (line 51) | public void insert(PluginConfig pluginConfig, Map<String, String> soDi...
    method deleteByUUID (line 79) | public int deleteByUUID(String UUID) {
    method getInstalledPluginByUUID (line 98) | @SuppressLint("Range")
    method getArrayStringByColumnName (line 145) | private String[] getArrayStringByColumnName(String columnName, Cursor ...
    method getLastPlugins (line 169) | @Deprecated
    method getLatestPlugins (line 180) | public List<InstalledPlugin> getLatestPlugins(int limit) {
    method parseConfig (line 207) | private List<ContentValues> parseConfig(PluginConfig pluginConfig,
    method close (line 260) | public void close() {

FILE: projects/sdk/core/manager/src/main/java/com/tencent/shadow/core/manager/installplugin/InstalledPlugin.java
  class InstalledPlugin (line 35) | public class InstalledPlugin implements Serializable {
    method InstalledPlugin (line 61) | InstalledPlugin() {
    method hasPart (line 65) | public boolean hasPart(String partKey) {
    method getPlugin (line 69) | public PluginPart getPlugin(String partKey) {
    method getPart (line 73) | public Part getPart(String partKey) {
    class Part (line 77) | static public class Part implements Serializable {
      method Part (line 83) | Part(int pluginType, File file, File oDexDir, File libraryDir) {
    class PluginPart (line 91) | static public class PluginPart extends Part {
      method PluginPart (line 96) | PluginPart(int pluginType, String businessName, File file, File oDex...

FILE: projects/sdk/core/manager/src/main/java/com/tencent/shadow/core/manager/installplugin/InstalledPluginDBHelper.java
  class InstalledPluginDBHelper (line 31) | public class InstalledPluginDBHelper extends SQLiteOpenHelper {
    method InstalledPluginDBHelper (line 100) | public InstalledPluginDBHelper(Context context, String name) {
    method onCreate (line 104) | @Override
    method onUpgrade (line 124) | @Override

FILE: projects/sdk/core/manager/src/main/java/com/tencent/shadow/core/manager/installplugin/InstalledRow.java
  class InstalledRow (line 27) | public class InstalledRow {
    method InstalledRow (line 53) | public InstalledRow() {
    method InstalledRow (line 56) | public InstalledRow(String hash, String partKey, String filePath, int ...
    method InstalledRow (line 65) | public InstalledRow(String hash, String businessName, String partKey, ...
    method toContentValues (line 72) | public ContentValues toContentValues() {

FILE: projects/sdk/core/manager/src/main/java/com/tencent/shadow/core/manager/installplugin/InstalledType.java
  class InstalledType (line 21) | public class InstalledType {

FILE: projects/sdk/core/manager/src/main/java/com/tencent/shadow/core/manager/installplugin/MinFileUtils.java
  class MinFileUtils (line 41) | public class MinFileUtils {
    method ensureParentDirExists (line 51) | public static void ensureParentDirExists(File file) throws IOException {
    method cleanDirectory (line 65) | public static void cleanDirectory(final File directory) throws IOExcep...
    method forceDelete (line 97) | private static void forceDelete(final File file) throws IOException {
    method deleteDirectory (line 120) | private static void deleteDirectory(final File directory) throws IOExc...
    method verifiedListFiles (line 141) | private static File[] verifiedListFiles(File directory) throws IOExcep...
    method writeOutZipEntry (line 159) | public static void writeOutZipEntry(ZipFile zipFile, ZipEntry entry,
    method writeOutInputStream (line 172) | public static void writeOutInputStream(File outputDir, String outputFi...

FILE: projects/sdk/core/manager/src/main/java/com/tencent/shadow/core/manager/installplugin/ODexBloc.java
  class ODexBloc (line 29) | public class ODexBloc {
    method isEffective (line 39) | public static boolean isEffective() {
    method oDexPlugin (line 43) | public static void oDexPlugin(File apkFile, File oDexDir, File copiedT...

FILE: projects/sdk/core/manager/src/main/java/com/tencent/shadow/core/manager/installplugin/PluginConfig.java
  class PluginConfig (line 29) | public class PluginConfig {
    method isUnpacked (line 64) | public boolean isUnpacked() {
    class FileInfo (line 82) | public static class FileInfo {
      method FileInfo (line 86) | FileInfo(File file, String hash) {
    class PluginFileInfo (line 92) | public static class PluginFileInfo extends FileInfo {
      method PluginFileInfo (line 97) | PluginFileInfo(String businessName, FileInfo fileInfo, String[] depe...
      method PluginFileInfo (line 101) | PluginFileInfo(String businessName, File file, String hash, String[]...
    method parseFromJson (line 109) | public static PluginConfig parseFromJson(JSONObject configJson, File s...
    method getFileInfo (line 146) | private static FileInfo getFileInfo(JSONObject jsonObject, File storag...
    method getPluginFileInfo (line 152) | private static PluginFileInfo getPluginFileInfo(JSONObject jsonObject,...
    method getArrayStringByName (line 160) | private static String[] getArrayStringByName(JSONObject jsonObject, St...

FILE: projects/sdk/core/manager/src/main/java/com/tencent/shadow/core/manager/installplugin/SafeZipFile.java
  class SafeZipFile (line 30) | public class SafeZipFile extends ZipFile {
    method SafeZipFile (line 32) | public SafeZipFile(File file) throws IOException {
    method entries (line 36) | @Override
    class SafeZipEntryIterator (line 41) | private static class SafeZipEntryIterator implements Enumeration<ZipEn...
      method SafeZipEntryIterator (line 45) | private SafeZipEntryIterator(Enumeration<? extends ZipEntry> delegat...
      method hasMoreElements (line 49) | @Override
      method nextElement (line 54) | @Override

FILE: projects/sdk/core/manager/src/main/java/com/tencent/shadow/core/manager/installplugin/UnpackManager.java
  class UnpackManager (line 39) | public class UnpackManager {
    method UnpackManager (line 50) | public UnpackManager(File root, String appName) {
    method getVersionDir (line 58) | File getVersionDir(String appHash) {
    method getAppDir (line 62) | public File getAppDir() {
    method getPluginUnpackDir (line 72) | public File getPluginUnpackDir(String appHash, File target) {
    method zipHash (line 76) | public String zipHash(File zip) {
    method getConfigJson (line 80) | public JSONObject getConfigJson(File zip) {
    method unpackPlugin (line 112) | public void unpackPlugin(File target, File pluginUnpackDir) throws IOE...

FILE: projects/sdk/core/manager/src/test/java/com/tencent/shadow/core/manager/installplugin/SafeZipFileTest.java
  class SafeZipFileTest (line 18) | public class SafeZipFileTest {
    method setUp (line 22) | @Before
    method tearDown (line 28) | @After
    method testContainsManifest (line 37) | @Test

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ActivityOptionsSupport.java
  class ActivityOptionsSupport (line 30) | @SuppressLint("NewApi")
    method makeSceneTransitionAnimation (line 33) | public static ActivityOptions makeSceneTransitionAnimation(
    method makeSceneTransitionAnimation (line 46) | @SafeVarargs

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/FixedContextLayoutInflater.java
  class FixedContextLayoutInflater (line 35) | public abstract class FixedContextLayoutInflater extends LayoutInflater {
    method FixedContextLayoutInflater (line 46) | public FixedContextLayoutInflater(Context context) {
    method FixedContextLayoutInflater (line 50) | public FixedContextLayoutInflater(LayoutInflater original, Context new...
    method onCreateView (line 54) | @Override
    method cloneInContext (line 76) | @Override
    method createNewContextLayoutInflater (line 81) | abstract LayoutInflater createNewContextLayoutInflater(Context context);
    method changeViewNameAndPrefix (line 83) | abstract Pair<String, String> changeViewNameAndPrefix(String name, Str...

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/PackageManagerInvokeRedirect.java
  class PackageManagerInvokeRedirect (line 41) | public class PackageManagerInvokeRedirect {
    method getPluginPackageManager (line 43) | public static PluginPackageManager getPluginPackageManager(ClassLoader...
    method getApplicationInfo (line 47) | public static ApplicationInfo getApplicationInfo(ClassLoader classLoad...
    method getActivityInfo (line 51) | public static ActivityInfo getActivityInfo(ClassLoader classLoaderOfIn...
    method getServiceInfo (line 55) | public static ServiceInfo getServiceInfo(ClassLoader classLoaderOfInvo...
    method getProviderInfo (line 59) | public static ProviderInfo getProviderInfo(ClassLoader classLoaderOfIn...
    method getPackageInfo (line 63) | public static PackageInfo getPackageInfo(ClassLoader classLoaderOfInvo...
    method getPackageInfo (line 67) | @TargetApi(Build.VERSION_CODES.O)
    method getPackageInfo (line 73) | @TargetApi(Build.VERSION_CODES.TIRAMISU)
    method getPackageInfo (line 79) | @TargetApi(Build.VERSION_CODES.TIRAMISU)
    method resolveContentProvider (line 85) | public static ProviderInfo resolveContentProvider(ClassLoader classLoa...
    method queryContentProviders (line 89) | public static List<ProviderInfo> queryContentProviders(ClassLoader cla...
    method resolveActivity (line 93) | public static ResolveInfo resolveActivity(ClassLoader classLoaderOfInv...
    method resolveService (line 97) | public static ResolveInfo resolveService(ClassLoader classLoaderOfInvo...

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/PluginActivity.java
  class PluginActivity (line 31) | public abstract class PluginActivity extends GeneratedPluginActivity {
    method get (line 33) | static PluginActivity get(PluginContainerActivity pluginContainerActiv...
    method registerActivityLifecycleCallbacks (line 49) | public void registerActivityLifecycleCallbacks(
    method unregisterActivityLifecycleCallbacks (line 56) | public void unregisterActivityLifecycleCallbacks(
    method setHostContextAsBase (line 63) | public final void setHostContextAsBase(Context context) {
    method setHostActivityDelegator (line 67) | public void setHostActivityDelegator(HostActivityDelegator delegator) {
    method setPluginApplication (line 72) | public void setPluginApplication(ShadowApplication pluginApplication) {
    method onCreatePanelMenu (line 76) | public boolean onCreatePanelMenu(int featureId, Menu menu) {
    method getLayoutInflater (line 84) | public LayoutInflater getLayoutInflater() {
    method onChildTitleChanged (line 89) | public void onChildTitleChanged(Activity childActivity, CharSequence t...
    method onNavigateUpFromChild (line 93) | @Override
    method onChildTitleChanged (line 98) | @Override
    method setCallingActivity (line 103) | public void setCallingActivity(ComponentName callingActivity) {
    method setTheme (line 107) | @Override
    method getSystemService (line 113) | @Override

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/PluginManifest.java
  type PluginManifest (line 6) | public interface PluginManifest {
    method getApplicationPackageName (line 10) | String getApplicationPackageName();
    method getApplicationClassName (line 15) | String getApplicationClassName();
    method getAppComponentFactory (line 20) | String getAppComponentFactory();
    method getApplicationTheme (line 25) | int getApplicationTheme();
    method getActivities (line 27) | ActivityInfo[] getActivities();
    method getServices (line 29) | ServiceInfo[] getServices();
    method getReceivers (line 31) | ReceiverInfo[] getReceivers();
    method getProviders (line 33) | ProviderInfo[] getProviders();
    class ComponentInfo (line 35) | abstract class ComponentInfo implements Parcelable {
      method ComponentInfo (line 38) | public ComponentInfo(String className) {
      method ComponentInfo (line 42) | protected ComponentInfo(Parcel in) {
      method writeToParcel (line 46) | @Override
      method describeContents (line 51) | @Override
      method createFromParcel (line 57) | @Override
      method newArray (line 62) | @Override
    class ActivityInfo (line 69) | final class ActivityInfo extends ComponentInfo implements Parcelable {
      method ActivityInfo (line 75) | public ActivityInfo(String className,
      method ActivityInfo (line 87) | protected ActivityInfo(Parcel in) {
      method writeToParcel (line 95) | @Override
      method describeContents (line 104) | @Override
      method createFromParcel (line 110) | @Override
      method newArray (line 115) | @Override
    class ServiceInfo (line 122) | final class ServiceInfo extends ComponentInfo {
      method ServiceInfo (line 124) | public ServiceInfo(String className) {
    class ReceiverInfo (line 129) | final class ReceiverInfo extends ComponentInfo {
      method ReceiverInfo (line 132) | public ReceiverInfo(String className, String[] actions) {
    class ProviderInfo (line 138) | final class ProviderInfo extends ComponentInfo {
      method ProviderInfo (line 142) | public ProviderInfo(String className, String authorities, boolean gr...

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/PluginPackageManager.java
  type PluginPackageManager (line 18) | public interface PluginPackageManager {
    method getApplicationInfo (line 19) | ApplicationInfo getApplicationInfo(String packageName, int flags);
    method getActivityInfo (line 21) | ActivityInfo getActivityInfo(ComponentName component, int flags);
    method getServiceInfo (line 23) | ServiceInfo getServiceInfo(ComponentName component, int flags);
    method getProviderInfo (line 25) | ProviderInfo getProviderInfo(ComponentName component, int flags);
    method getPackageInfo (line 27) | PackageInfo getPackageInfo(String packageName, int flags);
    method getPackageInfo (line 29) | PackageInfo getPackageInfo(VersionedPackage versionedPackage, int flags);
    method getPackageInfo (line 31) | @TargetApi(Build.VERSION_CODES.TIRAMISU)
    method getPackageInfo (line 34) | @TargetApi(Build.VERSION_CODES.TIRAMISU)
    method resolveContentProvider (line 37) | ProviderInfo resolveContentProvider(String name, int flags);
    method queryContentProviders (line 39) | List<ProviderInfo> queryContentProviders(String processName, int uid, ...
    method resolveActivity (line 41) | ResolveInfo resolveActivity(Intent intent, int flags);
    method resolveService (line 43) | ResolveInfo resolveService(Intent intent, int flags);
    method getArchiveFilePath (line 45) | String getArchiveFilePath();

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/PluginPartInfo.java
  class PluginPartInfo (line 23) | public class PluginPartInfo {
    method PluginPartInfo (line 34) | public PluginPartInfo(ShadowApplication application, Resources resourc...

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/PluginPartInfoManager.java
  class PluginPartInfoManager (line 25) | public class PluginPartInfoManager {
    method addPluginInfo (line 29) | public static void addPluginInfo(ClassLoader classLoader, PluginPartIn...
    method getPluginInfo (line 33) | public static PluginPartInfo getPluginInfo(ClassLoader classLoader) {
    method getAllPluginInfo (line 42) | public static Collection<PluginPartInfo> getAllPluginInfo() {

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ResolverHook.java
  class ResolverHook (line 30) | public class ResolverHook {
    method insert (line 32) | public static Uri insert(ContentResolver resolver, Uri url, ContentVal...
    method delete (line 37) | public static int delete(ContentResolver resolver, Uri url, String whe...
    method update (line 42) | public static int update(ContentResolver resolver, Uri uri, ContentVal...
    method query (line 47) | @TargetApi(Build.VERSION_CODES.O)
    method query (line 54) | public static Cursor query(ContentResolver resolver, Uri uri, String[]...
    method query (line 60) | public static Cursor query(ContentResolver resolver, Uri uri, String[]...
    method call (line 71) | public static Bundle call(ContentResolver resolver, Uri uri, String me...
    method bulkInsert (line 79) | public static int bulkInsert(ContentResolver resolver, Uri url, Conten...

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ShadowActivity.java
  class ShadowActivity (line 30) | public class ShadowActivity extends PluginActivity {
    method setContentView (line 32) | @Override
    method getApplication (line 45) | @Override
    method getParent (line 50) | @Override
    method overridePendingTransition (line 55) | @Override
    method startActivityForResult (line 68) | @Override
    method startActivityForResult (line 73) | @Override
    method getPreferences (line 85) | @Override
    method getLocalClassName (line 90) | @Override
    method shouldUpRecreateTask (line 96) | @Override
    method navigateUpTo (line 102) | @Override
    method requireViewById (line 108) | @Override
    method startIntentSenderFromChild (line 117) | @Override
    method startIntentSenderFromChild (line 122) | @Override
    method navigateUpToFromChild (line 127) | @Override
    method finishFromChild (line 132) | @Override
    method finishActivityFromChild (line 137) | @Override
    method getCallingActivity (line 142) | @Override
    method startActivityFromChild (line 155) | @Override
    method startActivityFromChild (line 168) | @Override

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ShadowActivityLifecycleCallbacks.java
  type ShadowActivityLifecycleCallbacks (line 35) | public interface ShadowActivityLifecycleCallbacks {
    method onActivityPreCreated (line 37) | void onActivityPreCreated(ShadowActivity activity, Bundle savedInstanc...
    method onActivityCreated (line 39) | void onActivityCreated(ShadowActivity activity, Bundle savedInstanceSt...
    method onActivityPostCreated (line 41) | void onActivityPostCreated(ShadowActivity activity, Bundle savedInstan...
    method onActivityPreStarted (line 44) | void onActivityPreStarted(ShadowActivity activity);
    method onActivityStarted (line 47) | void onActivityStarted(ShadowActivity activity);
    method onActivityPostStarted (line 50) | void onActivityPostStarted(ShadowActivity activity);
    method onActivityPreResumed (line 53) | void onActivityPreResumed(ShadowActivity activity);
    method onActivityResumed (line 56) | void onActivityResumed(ShadowActivity activity);
    method onActivityPostResumed (line 59) | void onActivityPostResumed(ShadowActivity activity);
    method onActivityPrePaused (line 62) | void onActivityPrePaused(ShadowActivity activity);
    method onActivityPaused (line 65) | void onActivityPaused(ShadowActivity activity);
    method onActivityPostPaused (line 68) | void onActivityPostPaused(ShadowActivity activity);
    method onActivityPreStopped (line 71) | void onActivityPreStopped(ShadowActivity activity);
    method onActivityStopped (line 74) | void onActivityStopped(ShadowActivity activity);
    method onActivityPostStopped (line 77) | void onActivityPostStopped(ShadowActivity activity);
    method onActivityPreSaveInstanceState (line 80) | void onActivityPreSaveInstanceState(ShadowActivity activity, Bundle ou...
    method onActivitySaveInstanceState (line 83) | void onActivitySaveInstanceState(ShadowActivity activity, Bundle outSt...
    method onActivityPostSaveInstanceState (line 86) | void onActivityPostSaveInstanceState(ShadowActivity activity, Bundle o...
    method onActivityPreDestroyed (line 89) | void onActivityPreDestroyed(ShadowActivity activity);
    method onActivityDestroyed (line 92) | void onActivityDestroyed(ShadowActivity activity);
    method onActivityPostDestroyed (line 95) | void onActivityPostDestroyed(ShadowActivity activity);
    class Wrapper (line 97) | class Wrapper implements Application.ActivityLifecycleCallbacks {
      method Wrapper (line 103) | public Wrapper(ShadowActivityLifecycleCallbacks shadowActivityLifecy...
      method getPluginActivity (line 108) | private ShadowActivity getPluginActivity(Activity activity) {
      method onActivityCreated (line 116) | @Override
      method onActivityStarted (line 124) | @Override
      method onActivityResumed (line 132) | @Override
      method onActivityPaused (line 140) | @Override
      method onActivityStopped (line 148) | @Override
      method onActivitySaveInstanceState (line 156) | @Override
      method onActivityDestroyed (line 164) | @Override
      method onActivityPreCreated (line 172) | @Override
      method onPluginActivityPreCreated (line 177) | public void onPluginActivityPreCreated(ShadowActivity pluginActivity...
      method onActivityPostCreated (line 187) | @Override
      method onActivityPreStarted (line 199) | @Override
      method onActivityPostStarted (line 211) | @Override
      method onActivityPreResumed (line 223) | @Override
      method onActivityPostResumed (line 235) | @Override
      method onActivityPrePaused (line 247) | @Override
      method onActivityPostPaused (line 259) | @Override
      method onActivityPreStopped (line 271) | @Override
      method onActivityPostStopped (line 283) | @Override
      method onActivityPreSaveInstanceState (line 295) | @Override
      method onActivityPostSaveInstanceState (line 307) | @Override
      method onActivityPreDestroyed (line 319) | @Override
      method onActivityPostDestroyed (line 331) | @Override
      method checkOwnerActivity (line 349) | private boolean checkOwnerActivity(PluginActivity activity) {
    class Holder (line 360) | class Holder {
      method notifyPluginActivityPreCreated (line 377) | public void notifyPluginActivityPreCreated(ShadowActivity pluginActi...
      method shadowActivityLifecycleCallbacksToWrapper (line 399) | private ShadowActivityLifecycleCallbacks.Wrapper shadowActivityLifec...
      method registerActivityLifecycleCallbacks (line 421) | void registerActivityLifecycleCallbacks(ShadowActivityLifecycleCallb...
      method unregisterActivityLifecycleCallbacks (line 435) | void unregisterActivityLifecycleCallbacks(ShadowActivityLifecycleCal...

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ShadowAppComponentFactory.java
  class ShadowAppComponentFactory (line 7) | public class ShadowAppComponentFactory {
    method instantiateApplication (line 9) | public ShadowApplication instantiateApplication(ClassLoader cl,
    method instantiateActivity (line 15) | public ShadowActivity instantiateActivity(ClassLoader cl, String class...
    method instantiateReceiver (line 21) | public BroadcastReceiver instantiateReceiver(ClassLoader cl,
    method instantiateService (line 27) | public ShadowService instantiateService(ClassLoader cl,
    method instantiateProvider (line 33) | public ContentProvider instantiateProvider(ClassLoader cl,

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ShadowApplication.java
  class ShadowApplication (line 38) | public class ShadowApplication extends ShadowContext {
    method getApplicationContext (line 51) | @Override
    method registerActivityLifecycleCallbacks (line 56) | public void registerActivityLifecycleCallbacks(
    method unregisterActivityLifecycleCallbacks (line 63) | public void unregisterActivityLifecycleCallbacks(
    method onCreate (line 70) | public void onCreate() {
    method onTerminate (line 117) | public void onTerminate() {
    method onConfigurationChanged (line 122) | public void onConfigurationChanged(Configuration newConfig) {
    method onLowMemory (line 127) | public void onLowMemory() {
    method onTrimMemory (line 132) | public void onTrimMemory(int level) {
    method registerComponentCallbacks (line 137) | public void registerComponentCallbacks(ComponentCallbacks callback) {
    method unregisterComponentCallbacks (line 142) | public void unregisterComponentCallbacks(ComponentCallbacks callback) {
    method registerOnProvideAssistDataListener (line 146) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
    method unregisterOnProvideAssistDataListener (line 152) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
    method setHostApplicationContextAsBase (line 157) | public void setHostApplicationContextAsBase(Context hostAppContext) {
    method setBroadcasts (line 162) | public void setBroadcasts(PluginManifest.ReceiverInfo[] receiverInfos) {
    method attachBaseContext (line 172) | public void attachBaseContext(Context base) {
    method setAppComponentFactory (line 176) | public void setAppComponentFactory(ShadowAppComponentFactory factory) {
    method getProcessName (line 180) | @SuppressLint("NewApi")

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ShadowContext.java
  class ShadowContext (line 36) | public class ShadowContext extends SubDirContextThemeWrapper {
    method ShadowContext (line 46) | public ShadowContext() {
    method ShadowContext (line 49) | public ShadowContext(Context base, int themeResId) {
    method setPluginResources (line 53) | public final void setPluginResources(Resources resources) {
    method setPluginClassLoader (line 57) | public final void setPluginClassLoader(ClassLoader classLoader) {
    method setPluginComponentLauncher (line 61) | public void setPluginComponentLauncher(PluginComponentLauncher pluginC...
    method setShadowApplication (line 65) | public void setShadowApplication(ShadowApplication shadowApplication) {
    method setApplicationInfo (line 69) | public void setApplicationInfo(ApplicationInfo applicationInfo) {
    method setBusinessName (line 75) | public void setBusinessName(String businessName) {
    method setPluginPartKey (line 82) | public void setPluginPartKey(String partKey) {
    method getApplicationContext (line 86) | @Override
    method getResources (line 91) | @Override
    method getAssets (line 96) | @Override
    method getSystemService (line 101) | @Override
    method getClassLoader (line 113) | @Override
    type PluginComponentLauncher (line 118) | public interface PluginComponentLauncher {
      method startActivity (line 127) | boolean startActivity(ShadowContext shadowContext, Intent intent, Bu...
      method startActivityForResult (line 138) | boolean startActivityForResult(GeneratedHostActivityDelegator delega...
      method startService (line 140) | Pair<Boolean, ComponentName> startService(ShadowContext context, Int...
      method stopService (line 142) | Pair<Boolean, Boolean> stopService(ShadowContext context, Intent name);
      method bindService (line 144) | Pair<Boolean, Boolean> bindService(ShadowContext context, Intent ser...
      method unbindService (line 146) | Pair<Boolean, ?> unbindService(ShadowContext context, ServiceConnect...
      method convertPluginActivityIntent (line 148) | Intent convertPluginActivityIntent(Intent pluginIntent);
    method startActivity (line 152) | @Override
    method startActivity (line 157) | @Override
    method superStartActivity (line 167) | @android.annotation.TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    method unbindService (line 172) | @Override
    method bindService (line 178) | @Override
    method stopService (line 189) | @Override
    method startService (line 200) | @Override
    method getApplicationInfo (line 211) | @Override
    method getPendingIntentConverter (line 216) | public PluginComponentLauncher getPendingIntentConverter() {
    method getSubDirName (line 220) | @Override
    method getPackageName (line 229) | @Override
    method getPackageCodePath (line 234) | @Override

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ShadowDialogSupport.java
  class ShadowDialogSupport (line 8) | public class ShadowDialogSupport {
    method dialogSetOwnerActivity (line 10) | public static void dialogSetOwnerActivity(Dialog dialog, ShadowActivit...
    method dialogGetOwnerActivity (line 15) | public static ShadowActivity dialogGetOwnerActivity(Dialog dialog) {

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ShadowFactory2.java
  class ShadowFactory2 (line 36) | public class ShadowFactory2 implements LayoutInflater.Factory2 {
    method ShadowFactory2 (line 55) | public ShadowFactory2(String partKey, LayoutInflater layoutInflater) {
    method onCreateView (line 60) | @Override
    method onCreateView (line 82) | @Override
    method createCustomView (line 88) | private View createCustomView(String name, Context context, AttributeS...
    method verifyClassLoader (line 131) | private final boolean verifyClassLoader(Context context, Constructor<?...

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ShadowFragmentSupport.java
  class ShadowFragmentSupport (line 11) | @SuppressLint("NewApi")
    method fragmentGetActivity (line 14) | public static ShadowActivity fragmentGetActivity(Fragment fragment) {
    method fragmentGetContext (line 25) | public static Context fragmentGetContext(Fragment fragment) {
    method fragmentGetHost (line 34) | public static Object fragmentGetHost(Fragment fragment) {
    method fragmentStartActivity (line 43) | public static void fragmentStartActivity(Fragment fragment, Intent int...
    method fragmentStartActivity (line 47) | @SuppressLint("NewApi")
    method fragmentStartActivityForResult (line 59) | public static void fragmentStartActivityForResult(Fragment fragment, I...
    method fragmentStartActivityForResult (line 63) | public static void fragmentStartActivityForResult(Fragment fragment, I...
    method toPluginContext (line 74) | public static Context toPluginContext(Context pluginContainerActivity) {
    method toOriginalContext (line 78) | public static Context toOriginalContext(Context pluginActivity) {

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ShadowInstrumentation.java
  class ShadowInstrumentation (line 30) | public class ShadowInstrumentation extends Instrumentation {
    method callActivityOnDestroy (line 32) | public void callActivityOnDestroy(ShadowActivity activity) {
    method newShadowApplication (line 37) | static public ShadowApplication newShadowApplication(Class<?> clazz, C...
    method newShadowApplication (line 54) | public ShadowApplication newShadowApplication(ClassLoader cl, String c...
    method newShadowActivity (line 65) | public ShadowActivity newShadowActivity(ClassLoader cl, String classNa...
    method callApplicationOnCreate (line 70) | public void callApplicationOnCreate(ShadowApplication app) {
    method execStartActivity (line 82) | public ActivityResult execStartActivity(Context who, IBinder contextTh...
    method execStartActivity (line 86) | public ActivityResult execStartActivity(Context who, IBinder contextTh...
    method execStartActivity (line 90) | public ActivityResult execStartActivity(Context who, IBinder contextTh...
    method execStartActivity (line 94) | public ActivityResult execStartActivity(Context who, IBinder contextTh...
    method callActivityOnCreate (line 102) | public void callActivityOnCreate(ShadowActivity activity, Bundle icicl...
    method callActivityOnCreate (line 105) | public void callActivityOnCreate(ShadowActivity activity, Bundle icicl...

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ShadowIntentService.java
  class ShadowIntentService (line 13) | public abstract class ShadowIntentService extends ShadowService {
    class ServiceHandler (line 19) | private final class ServiceHandler extends Handler {
      method ServiceHandler (line 20) | public ServiceHandler(Looper looper) {
      method handleMessage (line 24) | @Override
    method ShadowIntentService (line 31) | public ShadowIntentService(String name) {
    method setIntentRedelivery (line 36) | public void setIntentRedelivery(boolean enabled) {
    method onCreate (line 40) | @Override
    method onStart (line 54) | @Override
    method onStartCommand (line 62) | @Override
    method onDestroy (line 68) | @Override
    method onBind (line 73) | @Override
    method onHandleIntent (line 78) | protected abstract void onHandleIntent(Intent intent);

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ShadowLayoutInflater.java
  class ShadowLayoutInflater (line 30) | public class ShadowLayoutInflater extends ShadowWebViewLayoutInflater {
    method setFactory (line 35) | @Override
    method setFactory2 (line 41) | @Override
    method getOriginalFactory (line 47) | public static Factory getOriginalFactory(LayoutInflater inflater) {
    method getOriginalFactory2 (line 55) | public static Factory2 getOriginalFactory2(LayoutInflater inflater) {
    method build (line 63) | public static ShadowLayoutInflater build(LayoutInflater original, Cont...
    class InnerInflater (line 68) | private static class InnerInflater extends ShadowLayoutInflater {
      method InnerInflater (line 69) | private InnerInflater(LayoutInflater original, Context newContext, S...
    method ShadowLayoutInflater (line 75) | private ShadowLayoutInflater(LayoutInflater original, Context newConte...

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ShadowNativeActivity.java
  class ShadowNativeActivity (line 10) | public class ShadowNativeActivity extends ShadowActivity implements Surf...
    method setHostActivityDelegator (line 15) | @Override
    method surfaceCreated (line 21) | @Override
    method surfaceChanged (line 26) | @Override
    method surfaceRedrawNeeded (line 31) | @Override
    method surfaceDestroyed (line 36) | @Override
    method onInputQueueCreated (line 41) | @Override
    method onInputQueueDestroyed (line 46) | @Override
    method onGlobalLayout (line 51) | @Override

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ShadowPackageItemInfo.java
  class ShadowPackageItemInfo (line 26) | public class ShadowPackageItemInfo {
    method loadXmlMetaData (line 35) | public static XmlResourceParser loadXmlMetaData(ClassLoader classLoade...

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ShadowPendingIntent.java
  class ShadowPendingIntent (line 29) | public class ShadowPendingIntent {
    method getService (line 31) | public static PendingIntent getService(Context context, int requestCode,
    method getActivity (line 37) | public static PendingIntent getActivity(Context context, int requestCode,
    method getActivity (line 42) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN)

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ShadowService.java
  class ShadowService (line 34) | public abstract class ShadowService extends ShadowContext {
    method setHostContextAsBase (line 37) | public final void setHostContextAsBase(Context context) {
    method onBind (line 42) | public IBinder onBind(Intent intent) {
    method onStartCommand (line 46) | public int onStartCommand(Intent intent, int flags, int startId) {
    method onDestroy (line 50) | public void onDestroy() {
    method onConfigurationChanged (line 54) | public void onConfigurationChanged(Configuration newConfig) {
    method onLowMemory (line 58) | public void onLowMemory() {
    method onTrimMemory (line 62) | public void onTrimMemory(int level) {
    method onUnbind (line 66) | public boolean onUnbind(Intent intent) {
    method onTaskRemoved (line 70) | public void onTaskRemoved(Intent rootIntent) {
    method onCreate (line 74) | public void onCreate() {
    method onRebind (line 78) | public void onRebind(Intent intent) {
    method onStart (line 82) | @Deprecated
    method setForeground (line 86) | @Deprecated
    method startForeground (line 91) | public final void startForeground(int id, Notification notification) {
    method stopForeground (line 96) | public final void stopForeground(boolean removeNotification) {
    method startForeground (line 101) | public final void startForeground(int id, Notification notification, i...
    method stopForeground (line 105) | public final void stopForeground(int flags) {
    method stopSelf (line 109) | public final void stopSelf() {
    method stopSelf (line 116) | public final void stopSelf(int startId) {
    method stopSelfResult (line 123) | public final boolean stopSelfResult(int startId) {
    method getApplication (line 128) | public final ShadowApplication getApplication() {
    method dump (line 132) | protected void dump(FileDescriptor fd, PrintWriter writer, String[] ar...

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ShadowWebView.java
  class ShadowWebView (line 46) | public class ShadowWebView extends WebView {
    method ShadowWebView (line 54) | public ShadowWebView(Context context) {
    method ShadowWebView (line 59) | public ShadowWebView(Context context, AttributeSet attrs) {
    method ShadowWebView (line 64) | public ShadowWebView(Context context, AttributeSet attrs, int defStyle...
    method ShadowWebView (line 69) | @TargetApi(21)
    method ShadowWebView (line 75) | public ShadowWebView(Context context, AttributeSet attrs, int defStyle...
    method init (line 80) | private void init(Context context) {
    method loadUrl (line 85) | @Override
    method setWebViewClient (line 93) | @Override
    class WarpWebViewClient (line 98) | class WarpWebViewClient extends WebViewClient {
      method WarpWebViewClient (line 103) | public WarpWebViewClient(WebViewClient webViewClient, Context contex...
      method getInterceptResponse (line 108) | private WebResourceResponse getInterceptResponse(String url) {
      method shouldOverrideUrlLoading (line 132) | @Override
      method shouldOverrideUrlLoading (line 137) | @TargetApi(Build.VERSION_CODES.N)
      method onPageStarted (line 143) | @Override
      method onPageFinished (line 148) | @Override
      method onLoadResource (line 153) | @Override
      method onPageCommitVisible (line 158) | @TargetApi(Build.VERSION_CODES.M)
      method shouldInterceptRequest (line 164) | @Override
      method shouldInterceptRequest (line 173) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
      method onTooManyRedirects (line 184) | @Override
      method onReceivedError (line 189) | @Override
      method onReceivedError (line 195) | @TargetApi(Build.VERSION_CODES.M)
      method onReceivedHttpError (line 202) | @TargetApi(Build.VERSION_CODES.M)
      method onFormResubmission (line 208) | @Override
      method doUpdateVisitedHistory (line 213) | @Override
      method onReceivedSslError (line 218) | @Override
      method onReceivedClientCertRequest (line 224) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
      method onReceivedHttpAuthRequest (line 230) | @Override
      method shouldOverrideKeyEvent (line 235) | @Override
      method onUnhandledKeyEvent (line 240) | @Override
      method onScaleChanged (line 245) | @Override
      method onReceivedLoginRequest (line 250) | @Override
      method onRenderProcessGone (line 256) | @TargetApi(Build.VERSION_CODES.O)
      method onSafeBrowsingHit (line 262) | @TargetApi(Build.VERSION_CODES.O_MR1)

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/ShadowWebViewLayoutInflater.java
  class ShadowWebViewLayoutInflater (line 31) | public class ShadowWebViewLayoutInflater extends FixedContextLayoutInfla...
    method ShadowWebViewLayoutInflater (line 39) | public ShadowWebViewLayoutInflater(LayoutInflater original, Context ne...
    method createNewContextLayoutInflater (line 43) | @Override
    method changeViewNameAndPrefix (line 54) | @Override

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/SubDirContextThemeWrapper.java
  class SubDirContextThemeWrapper (line 38) | abstract class SubDirContextThemeWrapper extends ContextThemeWrapper {
    method getSubDirName (line 48) | abstract String getSubDirName();
    method SubDirContextThemeWrapper (line 50) | public SubDirContextThemeWrapper() {
    method SubDirContextThemeWrapper (line 54) | public SubDirContextThemeWrapper(Context base, int themeResId) {
    method SubDirContextThemeWrapper (line 58) | @TargetApi(Build.VERSION_CODES.M)
    method getDataDir (line 63) | @Override
    method getFilesDir (line 76) | @Override
    method openFileInput (line 89) | @Override
    method openFileOutput (line 99) | @Override
    method deleteFile (line 109) | @Override
    method getNoBackupFilesDir (line 115) | @Override
    method getExternalFilesDir (line 128) | @Override
    method getExternalFilesDirs (line 136) | @Override
    method getObbDir (line 149) | @Override
    method getObbDirs (line 162) | @Override
    method getCacheDir (line 175) | @Override
    method getCodeCacheDir (line 188) | @Override
    method getExternalCacheDir (line 201) | @Override
    method getExternalCacheDirs (line 214) | @Override
    method getExternalMediaDirs (line 227) | @Override
    method getDir (line 240) | @Override
    method getSharedPreferences (line 248) | @Override
    method deleteSharedPreferences (line 257) | @Override
    method openOrCreateDatabase (line 266) | @Override
    method openOrCreateDatabase (line 275) | @Override
    method moveDatabaseFrom (line 284) | @Override
    method deleteDatabase (line 293) | @Override
    method getDatabasePath (line 302) | @Override
    method databaseList (line 312) | @Override
    method makeSubName (line 339) | private String makeSubName(String name) {
    method ensurePrivateDirExists (line 343) | private static File ensurePrivateDirExists(File dir) {
    method makeFilename (line 349) | private static File makeFilename(File base, String name) {

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/UriConverter.java
  class UriConverter (line 28) | public class UriConverter {
    method setUriParseDelegate (line 32) | public static void setUriParseDelegate(UriParseDelegate sUriParseDeleg...
    type UriParseDelegate (line 36) | public interface UriParseDelegate {
      method parse (line 38) | Uri parse(String uriString);
      method parseCall (line 40) | Uri parseCall(String uriString, Bundle extra);
    method parse (line 43) | public static Uri parse(String uriString) {
    method parseCall (line 51) | public static Uri parseCall(String uriString, Bundle bundle) {
    method build (line 59) | public static Uri build(Uri.Builder builder) {
    method call (line 64) | public static Bundle call(ContentResolver resolver, Uri uri, String me...
    method notifyChange (line 72) | public static void notifyChange(ContentResolver resolver, Uri uri, Con...
    method notifyChange (line 77) | public static void notifyChange(ContentResolver resolver, Uri uri, Con...
    method notifyChange (line 83) | @TargetApi(Build.VERSION_CODES.O)

FILE: projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/XmlPullParserUtil.java
  class XmlPullParserUtil (line 28) | public class XmlPullParserUtil {
    method getLayoutStartTagName (line 30) | public static String getLayoutStartTagName(Resources res, int layoutRe...

FILE: projects/sdk/core/transform-kit/src/main/java/javassist/EnhancedCodeConverter.java
  class EnhancedCodeConverter (line 6) | public class EnhancedCodeConverter extends CodeConverter {
    method redirectMethodCallExceptSuperCallToStatic (line 8) | public void redirectMethodCallExceptSuperCallToStatic(CtMethod origMet...
    method replaceNew (line 13) | public void replaceNew(CtClass oldClass, CtClass newClass) {

FILE: projects/sdk/core/transform-kit/src/main/java/javassist/convert/TransformCallExceptSuperCallToStatic.java
  class TransformCallExceptSuperCallToStatic (line 11) | public class TransformCallExceptSuperCallToStatic extends TransformCallT...
    method TransformCallExceptSuperCallToStatic (line 12) | public TransformCallExceptSuperCallToStatic(Transformer next, CtMethod...
    method transform (line 17) | @Override
    method matchClass (line 34) | private boolean matchClass(String name, ClassPool pool) {

FILE: projects/sdk/core/transform-kit/src/main/java/javassist/convert/TransformNewClassFix.java
  class TransformNewClassFix (line 13) | final public class TransformNewClassFix extends Transformer {
    method TransformNewClassFix (line 18) | public TransformNewClassFix(Transformer next,
    method initialize (line 25) | @Override
    method transform (line 38) | @Override

FILE: projects/sdk/core/transform-kit/src/test/java/test/MethodRedirectToStatic.java
  class MethodRedirectToStatic (line 21) | public class MethodRedirectToStatic {
    method main (line 23) | public static void main(String[] args) {
    method add (line 27) | int add(int a, int b) {
    method test (line 31) | public int test() {
  class MethodRedirectToStatic2 (line 36) | class MethodRedirectToStatic2 {
    method add2 (line 37) | public static int add2(MethodRedirectToStatic target, int a, int b) {

FILE: projects/sdk/core/transform-kit/src/test/java/test/override/Foo.java
  class ArgBase (line 3) | class ArgBase {
  class Arg (line 7) | class Arg extends ArgBase {
  class NewArg (line 11) | class NewArg extends ArgBase {
  class SuperSuper (line 15) | class SuperSuper {
    method ss1 (line 16) | protected void ss1() {
    method methodCannotOverride (line 20) | final protected void methodCannotOverride() {
  class Super (line 25) | class Super extends SuperSuper {
    method s1 (line 26) | protected void s1(Arg arg) {
    method s2 (line 30) | protected void s2(Arg arg) {
  class NewSuper (line 35) | class NewSuper extends SuperSuper {
    method s1 (line 36) | protected void s1(NewArg newArg) {
  class Foo (line 41) | class Foo extends Super {
    method ss1 (line 43) | @Override
    method s1 (line 48) | @Override
    method s2 (line 53) | @Override
  class Bar (line 59) | class Bar extends Foo {
    method ss1 (line 60) | @Override
    method s1 (line 65) | @Override
    method s2 (line 70) | @Override
  class UseFooAsSuperSuper (line 80) | class UseFooAsSuperSuper {
    method useFooAsSuperSuper (line 81) | void useFooAsSuperSuper() {

FILE: projects/sdk/core/transform/src/test/java/android/app/Activity.java
  class Activity (line 21) | public class Activity {

FILE: projects/sdk/core/transform/src/test/java/android/app/Application.java
  class Application (line 21) | public class Application {
    type ActivityLifecycleCallbacks (line 23) | public interface ActivityLifecycleCallbacks {

FILE: projects/sdk/core/transform/src/test/java/android/app/Fragment.java
  class Fragment (line 14) | public class Fragment {
    method getActivity (line 15) | final public ShadowActivity getActivity() {
    method getContext (line 19) | public Context getContext() {
    method getHost (line 23) | final public Object getHost() {
    method startActivity (line 27) | public void startActivity(Intent intent) {
    method startActivity (line 31) | public void startActivity(Intent intent, Bundle options) {
    method startActivityForResult (line 35) | public void startActivityForResult(Intent intent, int requestCode) {
    method startActivityForResult (line 39) | public void startActivityForResult(Intent intent, int requestCode, Bun...
    method onAttach (line 43) | public void onAttach(Context context) {

FILE: projects/sdk/core/transform/src/test/java/android/app/Instrumentation.java
  class Instrumentation (line 23) | public class Instrumentation {
    class ActivityResult (line 25) | public static class ActivityResult {
      method ActivityResult (line 26) | public ActivityResult(int code, Intent intent) {

FILE: projects/sdk/core/transform/src/test/java/android/app/Service.java
  class Service (line 21) | public class Service {

FILE: projects/sdk/core/transform/src/test/java/android/content/BroadcastReceiver.java
  class BroadcastReceiver (line 3) | public abstract class BroadcastReceiver {
    method onReceive (line 4) | public abstract void onReceive(Context context, Intent intent);

FILE: projects/sdk/core/transform/src/test/java/android/content/ComponentName.java
  class ComponentName (line 21) | public class ComponentName {

FILE: projects/sdk/core/transform/src/test/java/android/content/Context.java
  class Context (line 21) | public class Context {

FILE: projects/sdk/core/transform/src/test/java/android/content/Intent.java
  class Intent (line 3) | public class Intent {
    method Intent (line 4) | public Intent() {
    method Intent (line 7) | public Intent(Intent intent) {
    method setExtrasClassLoader (line 10) | public void setExtrasClassLoader(ClassLoader loader) {

FILE: projects/sdk/core/transform/src/test/java/android/content/pm/ActivityInfo.java
  class ActivityInfo (line 21) | public class ActivityInfo extends PackageItemInfo {

FILE: projects/sdk/core/transform/src/test/java/android/content/pm/ApplicationInfo.java
  class ApplicationInfo (line 22) | public class ApplicationInfo extends PackageItemInfo {

FILE: projects/sdk/core/transform/src/test/java/android/content/pm/PackageInfo.java
  class PackageInfo (line 21) | public class PackageInfo {

FILE: projects/sdk/core/transform/src/test/java/android/content/pm/PackageItemInfo.java
  class PackageItemInfo (line 23) | public class PackageItemInfo {
    method loadXmlMetaData (line 25) | public XmlResourceParser loadXmlMetaData(PackageManager pm, String nam...

FILE: projects/sdk/core/transform/src/test/java/android/content/pm/PackageManager.java
  class PackageManager (line 23) | public class PackageManager {
    method getApplicationInfo (line 26) | public ApplicationInfo getApplicationInfo(String packageName, int flag) {
    method getActivityInfo (line 31) | public ActivityInfo getActivityInfo(ComponentName component, int flags) {
    method getPackageInfo (line 36) | public PackageInfo getPackageInfo(String packageName, int flags) {
    method resolveContentProvider (line 41) | public ProviderInfo resolveContentProvider(String name, int flags) {

FILE: projects/sdk/core/transform/src/test/java/android/content/pm/ProviderInfo.java
  class ProviderInfo (line 21) | public class ProviderInfo extends PackageItemInfo {

FILE: projects/sdk/core/transform/src/test/java/android/content/pm/ServiceInfo.java
  class ServiceInfo (line 21) | public class ServiceInfo extends PackageItemInfo {

FILE: projects/sdk/core/transform/src/test/java/android/content/res/XmlResourceParser.java
  type XmlResourceParser (line 21) | public interface XmlResourceParser {

FILE: projects/sdk/core/transform/src/test/java/android/os/Bundle.java
  class Bundle (line 3) | public class Bundle {

FILE: projects/sdk/core/transform/src/test/java/android/os/IBinder.java
  type IBinder (line 3) | public interface IBinder {

FILE: projects/sdk/core/transform/src/test/java/android/util/AttributeSet.java
  class AttributeSet (line 3) | public class AttributeSet {

FILE: projects/sdk/core/transform/src/test/java/android/webkit/WebView.java
  class WebView (line 23) | public class WebView {
    method WebView (line 24) | public WebView(Context context) {

FILE: projects/sdk/core/transform/src/test/java/com/tencent/shadow/core/runtime/PackageManagerInvokeRedirect.java
  class PackageManagerInvokeRedirect (line 27) | public class PackageManagerInvokeRedirect {
    method getApplicationInfo (line 30) | public static ApplicationInfo getApplicationInfo(ClassLoader classLoad...
    method getActivityInfo (line 35) | public static ActivityInfo getActivityInfo(ClassLoader classLoader, Co...
    method getPackageInfo (line 40) | public static PackageInfo getPackageInfo(ClassLoader classLoader, Stri...
    method resolveContentProvider (line 45) | public static ProviderInfo resolveContentProvider(ClassLoader classLoa...

FILE: projects/sdk/core/transform/src/test/java/com/tencent/shadow/core/runtime/PluginPartInfo.java
  class PluginPartInfo (line 3) | public class PluginPartInfo {

FILE: projects/sdk/core/transform/src/test/java/com/tencent/shadow/core/runtime/PluginPartInfoManager.java
  class PluginPartInfoManager (line 3) | public class PluginPartInfoManager {
    method getPluginInfo (line 4) | public static PluginPartInfo getPluginInfo(ClassLoader classLoader) {

FILE: projects/sdk/core/transform/src/test/java/com/tencent/shadow/core/runtime/ShadowActivity.java
  class ShadowActivity (line 3) | public class ShadowActivity {

FILE: projects/sdk/core/transform/src/test/java/com/tencent/shadow/core/runtime/ShadowApplication.java
  class ShadowApplication (line 3) | public class ShadowApplication extends ShadowContext {
    method onCreate (line 5) | public void onCreate() {

FILE: projects/sdk/core/transform/src/test/java/com/tencent/shadow/core/runtime/ShadowContext.java
  class ShadowContext (line 5) | public class ShadowContext extends Context {

FILE: projects/sdk/core/transform/src/test/java/com/tencent/shadow/core/runtime/ShadowFragmentSupport.java
  class ShadowFragmentSupport (line 8) | public class ShadowFragmentSupport {
    method fragmentGetActivity (line 10) | public static ShadowActivity fragmentGetActivity(Fragment fragment) {
    method fragmentGetContext (line 14) | public static Context fragmentGetContext(Fragment fragment) {
    method fragmentGetHost (line 18) | public static Object fragmentGetHost(Fragment fragment) {
    method fragmentStartActivity (line 22) | public void fragmentStartActivity(Fragment fragment, Intent intent) {
    method fragmentStartActivity (line 25) | public void fragmentStartActivity(Fragment fragment, Intent intent, Bu...
    method fragmentStartActivityForResult (line 28) | public static void fragmentStartActivityForResult(Fragment fragment, I...
    method fragmentStartActivityForResult (line 31) | public static void fragmentStartActivityForResult(Fragment fragment, I...
    method toPluginContext (line 34) | public static Context toPluginContext(Context pluginContainerActivity) {
    method toOriginalContext (line 38) | public static Context toOriginalContext(Context pluginActivity) {

FILE: projects/sdk/core/transform/src/test/java/com/tencent/shadow/core/runtime/ShadowInstrumentation.java
  class ShadowInstrumentation (line 10) | public class ShadowInstrumentation {
    method callActivityOnDestroy (line 11) | public void callActivityOnDestroy(ShadowActivity activity) {
    method newShadowApplication (line 14) | static public ShadowApplication newShadowApplication(Class<?> clazz, C...
    method newApplication (line 20) | public ShadowApplication newApplication(ClassLoader cl, String classNa...
    method newShadowActivity (line 25) | public ShadowActivity newShadowActivity(ClassLoader cl, String classNa...
    method callApplicationOnCreate (line 30) | public void callApplicationOnCreate(ShadowApplication app) {
    method execStartActivity (line 34) | public Instrumentation.ActivityResult execStartActivity(Context who, I...
    method execStartActivity (line 38) | public Instrumentation.ActivityResult execStartActivity(Context who, I...
    method execStartActivity (line 42) | public Instrumentation.ActivityResult execStartActivity(Context who, I...
    method execStartActivity (line 46) | public Instrumentation.ActivityResult execStartActivity(Context who, I...

FILE: projects/sdk/core/transform/src/test/java/com/tencent/shadow/core/runtime/ShadowWebView.java
  class ShadowWebView (line 24) | public class ShadowWebView extends WebView {
    method ShadowWebView (line 26) | public ShadowWebView(Context context) {

FILE: projects/sdk/core/transform/src/test/java/test/EggReceiver.java
  class EggReceiver (line 9) | abstract class EggReceiver extends BroadcastReceiver {
    method EggReceiver (line 12) | EggReceiver(List<String> log) {
    method onReceive (line 16) | @Override
    class FoxReceiver (line 21) | public static class FoxReceiver extends EggReceiver {
      method FoxReceiver (line 22) | FoxReceiver(List<String> log) {

FILE: projects/sdk/core/transform/src/test/java/test/TestActivity.java
  class TestActivity (line 23) | public class TestActivity extends Activity {
    method foo (line 25) | Activity foo(Activity activity) {

FILE: projects/sdk/core/transform/src/test/java/test/TestActivityLifecycleCallbacks.java
  class TestActivityLifecycleCallbacks (line 23) | public class TestActivityLifecycleCallbacks implements Application.Activ...
    method get (line 25) | Application.ActivityLifecycleCallbacks get() {

FILE: projects/sdk/core/transform/src/test/java/test/TestApplication.java
  class TestApplication (line 23) | public class TestApplication extends Application {
    method get (line 25) | Application get() {

FILE: projects/sdk/core/transform/src/test/java/test/TestInstrumentation.java
  class TestInstrumentation (line 23) | public class TestInstrumentation extends Instrumentation {

FILE: projects/sdk/core/transform/src/test/java/test/TestPackageManager.java
  class TestPackageManager (line 24) | public class TestPackageManager {
    method test1 (line 26) | void test1() {
    method test2 (line 34) | void test2() {
    class Inner (line 58) | class Inner {
      method run (line 59) | void run() {

FILE: projects/sdk/core/transform/src/test/java/test/TestReceiver.java
  class AceReceiver (line 14) | class AceReceiver extends BroadcastReceiver {
    method AceReceiver (line 17) | AceReceiver(List<String> log) {
    method onReceive (line 21) | @Override
  class BarReceiver (line 32) | class BarReceiver extends AceReceiver {
    method BarReceiver (line 35) | BarReceiver(List<String> log) {
    method onReceive (line 40) | @Override
  class CatReceiver (line 55) | class CatReceiver extends BarReceiver {
    method CatReceiver (line 58) | CatReceiver(List<String> log) {
    method onReceive (line 63) | @Override
  class DogReceiver (line 76) | class DogReceiver extends CatReceiver {
    method DogReceiver (line 79) | DogReceiver(List<String> log) {

FILE: projects/sdk/core/transform/src/test/java/test/TestService.java
  class TestService (line 23) | public class TestService extends Service {
    method getService (line 25) | Service getService() {

FILE: projects/sdk/core/transform/src/test/java/test/TestWebView.java
  class TestWebView (line 24) | public class TestWebView extends WebView {
    method TestWebView (line 26) | public TestWebView(Context context) {
    method getWebView (line 30) | WebView getWebView() {
    method testNewWebView (line 35) | void testNewWebView() {

FILE: projects/sdk/core/transform/src/test/java/test/fragment/TestFragment.java
  class TestFragment (line 6) | public class TestFragment extends Fragment {
    method onAttach (line 8) | @Override

FILE: projects/sdk/core/transform/src/test/java/test/fragment/UseGetActivityFragment.java
  class UseGetActivityFragment (line 8) | public class UseGetActivityFragment {
    method test (line 10) | ShadowActivity test(TestFragment fragment) {

FILE: projects/sdk/core/transform/src/test/java/test/fragment/UseStartActivityForResultFragment.java
  class UseStartActivityForResultFragment (line 8) | public class UseStartActivityForResultFragment {
    method test (line 10) | ShadowActivity test(TestFragment fragment) {

FILE: projects/sdk/core/transform/src/test/java/test/fragment/UseStartActivityFragment.java
  class UseStartActivityFragment (line 8) | public class UseStartActivityFragment {
    method test (line 10) | ShadowActivity test(TestFragment fragment) {

FILE: projects/sdk/core/utils/src/main/java/com/tencent/shadow/core/utils/Md5.java
  class Md5 (line 10) | public class Md5 {
    method md5File (line 16) | public static String md5File(File file) {
    method closeQuietly (line 40) | static void closeQuietly(final Closeable closeable) {

FILE: projects/sdk/core/utils/src/test/java/com/tencent/shadow/core/utils/Md5Test.java
  class Md5Test (line 11) | public class Md5Test {
    method nullAsFile (line 13) | @Test(expected = RuntimeException.class)
    method emptyFile (line 18) | @Test
    method smallFile (line 29) | @Test

FILE: projects/sdk/dynamic/dynamic-apk/src/main/java/com/tencent/shadow/dynamic/apk/ApkClassLoader.java
  class ApkClassLoader (line 38) | public class ApkClassLoader extends DexClassLoader {
    method ApkClassLoader (line 42) | public ApkClassLoader(InstalledApk installedApk,
    method loadClass (line 53) | @Override
    method getInterface (line 109) | public <T> T getInterface(Class<T> clazz, String className) throws Exc...

FILE: projects/sdk/dynamic/dynamic-apk/src/main/java/com/tencent/shadow/dynamic/apk/ChangeApkContextWrapper.java
  class ChangeApkContextWrapper (line 34) | public class ChangeApkContextWrapper extends ContextWrapper {
    method ChangeApkContextWrapper (line 44) | public ChangeApkContextWrapper(Context base, String apkPath, ClassLoad...
    method createResources (line 50) | private Resources createResources(String apkPath, Context base) {
    method getAssets (line 63) | @Override
    method getResources (line 68) | @Override
    method getTheme (line 73) | @Override
    method getSystemService (line 87) | @Override
    method getClassLoader (line 99) | @Override

FILE: projects/sdk/dynamic/dynamic-apk/src/main/java/com/tencent/shadow/dynamic/apk/ImplLoader.java
  class ImplLoader (line 27) | public abstract class ImplLoader {
    method getCustomWhiteList (line 31) | protected abstract String[] getCustomWhiteList();
    method loadWhiteList (line 33) | public String[] loadWhiteList(InstalledApk installedApk) {
    method loadWhiteList (line 37) | public String[] loadWhiteList(InstalledApk installedApk, String whiteL...
    method concatenate (line 67) | private static String[] concatenate(String[] a, String[] b) {

FILE: projects/sdk/dynamic/dynamic-host-multi-loader-ext/src/main/java/com/tencent/shadow/dynamic/host/MultiDynamicContainer.java
  class MultiDynamicContainer (line 19) | public class MultiDynamicContainer {
    method loadContainerApk (line 30) | public static boolean loadContainerApk(String containerKey, InstalledA...
    method findContainerClassLoader (line 71) | private static ContainerClassLoader findContainerClassLoader(String co...
    method removeContainerClassLoader (line 86) | private static void removeContainerClassLoader(ContainerClassLoader co...
    method hackContainerClassLoader (line 102) | private static void hackContainerClassLoader(String containerKey, Inst...
    class ContainerClassLoader (line 108) | private static class ContainerClassLoader extends BaseDexClassLoader {
      method ContainerClassLoader (line 112) | public ContainerClassLoader(String containerKey, InstalledApk instal...
      method loadClass (line 118) | @Override

FILE: projects/sdk/dynamic/dynamic-host-multi-loader-ext/src/main/java/com/tencent/shadow/dynamic/host/MultiLoaderPluginProcessService.java
  class MultiLoaderPluginProcessService (line 23) | public class MultiLoaderPluginProcessService extends BasePluginProcessSe...
    method getActivityHolder (line 33) | public static Application.ActivityLifecycleCallbacks getActivityHolder...
    method wrapBinder (line 37) | public static MultiLoaderPpsController wrapBinder(IBinder ppsBinder) {
    method onBind (line 41) | @Override
    method loadRuntimeForPlugin (line 49) | synchronized void loadRuntimeForPlugin(String pluginKey, String uuid) ...
    method loadPluginLoaderForPlugin (line 84) | synchronized void loadPluginLoaderForPlugin(String pluginKey, String u...
    method setUuidManagerForPlugin (line 133) | synchronized void setUuidManagerForPlugin(String pluginKey, UuidManage...
    method getPpsStatusForPlugin (line 147) | synchronized PpsStatus getPpsStatusForPlugin(String pluginKey) {
    method getPluginLoaderForPlugin (line 151) | synchronized IBinder getPluginLoaderForPlugin(String pluginKey) {
    method exit (line 155) | void exit() {
    method checkUuidManagerNotNull (line 167) | private UuidManager checkUuidManagerNotNull(String pluginKey) throws F...
    method isRuntimeLoaded (line 175) | private boolean isRuntimeLoaded(String pluginKey) {
    method markRuntimeLoaded (line 180) | private void markRuntimeLoaded(String pluginKey) {
    method addUuidForPlugin (line 184) | private void addUuidForPlugin(String pluginKey, String uuid) throws Fa...

FILE: projects/sdk/dynamic/dynamic-host-multi-loader-ext/src/main/java/com/tencent/shadow/dynamic/host/MultiLoaderPpsBinder.java
  class MultiLoaderPpsBinder (line 9) | public class MultiLoaderPpsBinder extends Binder {
    method MultiLoaderPpsBinder (line 25) | MultiLoaderPpsBinder(MultiLoaderPluginProcessService pps) {
    method onTransact (line 29) | @Override

FILE: projects/sdk/dynamic/dynamic-host-multi-loader-ext/src/main/java/com/tencent/shadow/dynamic/host/MultiLoaderPpsController.java
  class MultiLoaderPpsController (line 14) | public class MultiLoaderPpsController {
    method MultiLoaderPpsController (line 17) | MultiLoaderPpsController(IBinder remote) {
    method loadRuntimeForPlugin (line 21) | public void loadRuntimeForPlugin(String pluginKey, String uuid) throws...
    method loadPluginLoaderForPlugin (line 41) | public void loadPluginLoaderForPlugin(String pluginKey, String uuid) t...
    method setUuidManagerForPlugin (line 61) | public void setUuidManagerForPlugin(String pluginKey, IBinder uuidMana...
    method getPpsStatusForPlugin (line 76) | public PpsStatus getPpsStatusForPlugin(String pluginKey) throws Remote...
    method getPluginLoaderForPlugin (line 93) | public IBinder getPluginLoaderForPlugin(String pluginKey) throws Remot...
    method exit (line 110) | public void exit() throws RemoteException {

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/BasePluginProcessService.java
  class BasePluginProcessService (line 15) | abstract public class BasePluginProcessService extends Service {
    method onCreate (line 27) | @Override
    method onUnbind (line 40) | @Override
    method onRebind (line 48) | @Override
    method onDestroy (line 56) | @Override
    method onTaskRemoved (line 64) | @Override
    class ActivityHolder (line 72) | public static class ActivityHolder implements Application.ActivityLife...
      method finishAll (line 76) | void finishAll() {
      method onActivityCreated (line 82) | @Override
      method onActivityDestroyed (line 87) | @Override
      method onActivityStarted (line 92) | @Override
      method onActivityResumed (line 97) | @Override
      method onActivityPaused (line 102) | @Override
      method onActivityStopped (line 107) | @Override
      method onActivitySaveInstanceState (line 112) | @Override

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/BinderUuidManager.java
  class BinderUuidManager (line 26) | class BinderUuidManager implements UuidManager {
    method BinderUuidManager (line 29) | BinderUuidManager(IBinder remote) {
    method checkException (line 33) | private void checkException(Parcel _reply) throws FailedException, Not...
    method getPlugin (line 44) | @Override
    method getPluginLoader (line 67) | @Override
    method getRuntime (line 89) | @Override

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/DynamicPluginManager.java
  class DynamicPluginManager (line 32) | public final class DynamicPluginManager implements PluginManager {
    method DynamicPluginManager (line 39) | public DynamicPluginManager(PluginManagerUpdater updater) {
    method enter (line 47) | @Override
    method release (line 57) | public void release() {
    method updateManagerImpl (line 67) | private void updateManagerImpl(Context context) {
    method getManagerImpl (line 90) | public PluginManager getManagerImpl() {

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/DynamicRuntime.java
  class DynamicRuntime (line 41) | public class DynamicRuntime {
    method loadRuntime (line 56) | public static boolean loadRuntime(InstalledApk installedRuntimeApk) {
    method recoveryClassLoader (line 92) | private static void recoveryClassLoader() throws Exception {
    method getRuntimeClassLoader (line 107) | private static RuntimeClassLoader getRuntimeClassLoader() {
    method hackParentToRuntime (line 120) | private static void hackParentToRuntime(InstalledApk installedRuntimeA...
    method hackParentClassLoader (line 134) | static void hackParentClassLoader(ClassLoader classLoader,
    method getParentField (line 149) | private static Field getParentField() {
    method recoveryRuntime (line 174) | public static boolean recoveryRuntime(Context context) {
    method saveLastRuntimeInfo (line 193) | @SuppressLint("ApplySharedPref")
    method getLastRuntimeInfo (line 203) | private static InstalledApk getLastRuntimeInfo(Context context) {
    method removeLastRuntimeInfo (line 216) | @SuppressLint("ApplySharedPref")
    class RuntimeClassLoader (line 227) | static class RuntimeClassLoader extends BaseDexClassLoader {
      method RuntimeClassLoader (line 234) | RuntimeClassLoader(String dexPath, String optimizedDirectory, String...

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/EnterCallback.java
  type EnterCallback (line 23) | public interface EnterCallback {
    method onShowLoadingView (line 25) | void onShowLoadingView(View view);
    method onCloseLoadingView (line 27) | void onCloseLoadingView();
    method onEnterComplete (line 29) | void onEnterComplete();

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/FailedException.java
  class FailedException (line 25) | public class FailedException extends Exception implements Parcelable {
    method FailedException (line 38) | public FailedException(RemoteException e) {
    method FailedException (line 43) | public FailedException(RuntimeException e) {
    method FailedException (line 48) | public FailedException(int errorCode, String errorMessage) {
    method FailedException (line 53) | protected FailedException(Parcel in) {
    method writeToParcel (line 58) | @Override
    method describeContents (line 64) | @Override
    method createFromParcel (line 70) | @Override
    method newArray (line 75) | @Override

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/LoaderFactory.java
  type LoaderFactory (line 23) | public interface LoaderFactory {
    method buildLoader (line 24) | PluginLoaderImpl buildLoader(String uuid, Context context);

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/LoaderImplLoader.java
  class LoaderImplLoader (line 27) | final class LoaderImplLoader extends ImplLoader {
    method load (line 43) | PluginLoaderImpl load(InstalledApk installedApk, String uuid, Context ...
    method getCustomWhiteList (line 58) | @Override

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/ManagerFactory.java
  type ManagerFactory (line 23) | public interface ManagerFactory {
    method buildManager (line 24) | PluginManagerImpl buildManager(Context context);

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/ManagerImplLoader.java
  class ManagerImplLoader (line 30) | final class ManagerImplLoader extends ImplLoader {
    method ManagerImplLoader (line 40) | ManagerImplLoader(Context context, File apk) {
    method load (line 48) | PluginManagerImpl load() {
    method getCustomWhiteList (line 74) | @Override

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/NotFoundException.java
  class NotFoundException (line 24) | public class NotFoundException extends Exception implements Parcelable {
    method NotFoundException (line 25) | public NotFoundException(String message) {
    method NotFoundException (line 29) | protected NotFoundException(Parcel in) {
    method writeToParcel (line 33) | @Override
    method describeContents (line 38) | @Override
    method createFromParcel (line 44) | @Override
    method newArray (line 49) | @Override

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/PluginLoaderImpl.java
  type PluginLoaderImpl (line 23) | public interface PluginLoaderImpl extends IBinder {
    method setUuidManager (line 24) | void setUuidManager(UuidManager uuidManager);

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/PluginManager.java
  type PluginManager (line 29) | public interface PluginManager {
    method enter (line 37) | void enter(Context context, long fromId, Bundle bundle, EnterCallback ...

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/PluginManagerImpl.java
  type PluginManagerImpl (line 28) | public interface PluginManagerImpl extends PluginManager {
    method onCreate (line 30) | void onCreate(Bundle bundle);
    method onSaveInstanceState (line 32) | void onSaveInstanceState(Bundle outState);
    method onDestroy (line 34) | void onDestroy();

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/PluginManagerUpdater.java
  type PluginManagerUpdater (line 30) | public interface PluginManagerUpdater {
    method wasUpdating (line 34) | boolean wasUpdating();
    method update (line 41) | Future<File> update();
    method getLatest (line 48) | File getLatest();
    method isAvailable (line 56) | Future<Boolean> isAvailable(File file);

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/PluginProcessService.java
  class PluginProcessService (line 39) | public class PluginProcessService extends BasePluginProcessService {
    method getActivityHolder (line 45) | public static Application.ActivityLifecycleCallbacks getActivityHolder...
    method wrapBinder (line 49) | public static PpsController wrapBinder(IBinder ppsBinder) {
    method onBind (line 53) | @Override
    method setUuid (line 72) | private void setUuid(String uuid) throws FailedException {
    method checkUuidManagerNotNull (line 80) | private void checkUuidManagerNotNull() throws FailedException {
    method loadRuntime (line 86) | void loadRuntime(String uuid) throws FailedException {
    method loadPluginLoader (line 120) | void loadPluginLoader(String uuid) throws FailedException {
    method setUuidManager (line 169) | void setUuidManager(UuidManager uuidManager) {
    method exit (line 182) | void exit() {
    method getPpsStatus (line 194) | PpsStatus getPpsStatus() {
    method getPluginLoader (line 198) | IBinder getPluginLoader() {

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/PpsBinder.java
  class PpsBinder (line 26) | class PpsBinder extends android.os.Binder {
    method PpsBinder (line 41) | PpsBinder(PluginProcessService pps) {
    method onTransact (line 45) | @Override

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/PpsController.java
  class PpsController (line 28) | public class PpsController {
    method PpsController (line 31) | PpsController(IBinder remote) {
    method loadRuntime (line 35) | public void loadRuntime(String uuid) throws RemoteException, FailedExc...
    method loadPluginLoader (line 54) | public void loadPluginLoader(String uuid) throws RemoteException, Fail...
    method setUuidManager (line 73) | public void setUuidManager(IBinder uuidManagerBinder) throws RemoteExc...
    method exit (line 87) | public void exit() throws RemoteException {
    method getPpsStatus (line 100) | public PpsStatus getPpsStatus() throws RemoteException {
    method getPluginLoader (line 116) | public IBinder getPluginLoader() throws RemoteException {

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/PpsStatus.java
  class PpsStatus (line 24) | public final class PpsStatus implements Parcelable {
    method PpsStatus (line 30) | PpsStatus(String uuid, boolean runtimeLoaded, boolean loaderLoaded, bo...
    method PpsStatus (line 37) | PpsStatus(Parcel in) {
    method writeToParcel (line 44) | @Override
    method describeContents (line 52) | @Override
    method createFromParcel (line 58) | @Override
    method newArray (line 63) | @Override

FILE: projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/UuidManager.java
  type UuidManager (line 25) | public interface UuidManager {
    method getPlugin (line 35) | InstalledApk getPlugin(String uuid, String partKey) throws RemoteExcep...
    method getPluginLoader (line 37) | InstalledApk getPluginLoader(String uuid) throws RemoteException, NotF...
    method getRuntime (line 39) | InstalledApk getRuntime(String uuid) throws RemoteException, NotFoundE...

FILE: projects/sdk/dynamic/dynamic-loader/src/main/java/com/tencent/shadow/dynamic/loader/PluginLoader.java
  type PluginLoader (line 32) | public interface PluginLoader {
    method loadPlugin (line 45) | void loadPlugin(String partKey) throws RemoteException;
    method getLoadedPlugin (line 47) | Map getLoadedPlugin() throws RemoteException;
    method callApplicationOnCreate (line 49) | void callApplicationOnCreate(String partKey) throws RemoteException;
    method convertActivityIntent (line 51) | Intent convertActivityIntent(Intent pluginActivityIntent) throws Remot...
    method startPluginService (line 53) | ComponentName startPluginService(Intent pluginServiceIntent) throws Re...
    method stopPluginService (line 55) | boolean stopPluginService(Intent pluginServiceIntent) throws RemoteExc...
    method bindPluginService (line 57) | boolean bindPluginService(Intent pluginServiceIntent, PluginServiceCon...
    method unbindService (line 59) | void unbindService(PluginServiceConnection conn) throws RemoteException;
    method startActivityInPluginProcess (line 61) | void startActivityInPluginProcess(Intent intent) throws RemoteException;

FILE: projects/sdk/dynamic/dynamic-loader/src/main/java/com/tencent/shadow/dynamic/loader/PluginServiceConnection.java
  type PluginServiceConnection (line 28) | public interface PluginServiceConnection {
    method onServiceConnected (line 33) | void onServiceConnected(ComponentName name, IBinder service);
    method onServiceDisconnected (line 35) | void onServiceDisconnected(ComponentName name);

FILE: projects/sdk/dynamic/dynamic-manager-multi-loader-ext/src/main/java/com/tencent/shadow/dynamic/manager/PluginManagerThatSupportMultiLoader.java
  class PluginManagerThatSupportMultiLoader (line 19) | abstract public class PluginManagerThatSupportMultiLoader extends BaseDy...
    method PluginManagerThatSupportMultiLoader (line 32) | public PluginManagerThatSupportMultiLoader(Context context) {
    method getPluginKey (line 40) | public abstract String getPluginKey();
    method onPluginServiceConnected (line 42) | @Override
    method onPluginServiceDisconnected (line 73) | @Override
    method loadRunTime (line 79) | public final void loadRunTime(String uuid) throws RemoteException, Fai...
    method loadPluginLoader (line 89) | public final void loadPluginLoader(String uuid) throws RemoteException...

FILE: projects/sdk/dynamic/dynamic-manager/src/main/java/com/tencent/shadow/dynamic/manager/BaseDynamicPluginManager.java
  class BaseDynamicPluginManager (line 31) | abstract public class BaseDynamicPluginManager extends BasePluginManager...
    method BaseDynamicPluginManager (line 34) | public BaseDynamicPluginManager(Context context) {
    method bindPluginProcessService (line 52) | public final void bindPluginProcessService(final String serviceName) {
    method waitServiceConnected (line 116) | public final void waitServiceConnected(int timeout, TimeUnit timeUnit)...
    method onPluginServiceConnected (line 137) | protected abstract void onPluginServiceConnected(ComponentName name, I...
    method onPluginServiceDisconnected (line 139) | protected abstract void onPluginServiceDisconnected(ComponentName name);
    method onCreate (line 147) | public void onCreate(Bundle bundle) {
    method onSaveInstanceState (line 158) | public void onSaveInstanceState(Bundle bundle) {
    method onDestroy (line 167) | public void onDestroy() {
    method getPlugin (line 173) | public InstalledApk getPlugin(String uuid, String partKey) throws Fail...
    method getInstalledPL (line 206) | private InstalledApk getInstalledPL(String uuid, int type) throws Fail...
    method getPluginLoader (line 225) | public InstalledApk getPluginLoader(String uuid) throws FailedExceptio...
    method getRuntime (line 229) | public InstalledApk getRuntime(String uuid) throws FailedException, No...

FILE: projects/sdk/dynamic/dynamic-manager/src/main/java/com/tencent/shadow/dynamic/manager/BinderPluginLoader.java
  class BinderPluginLoader (line 33) | class BinderPluginLoader implements PluginLoader {
    method BinderPluginLoader (line 38) | BinderPluginLoader(IBinder remote) {
    method loadPlugin (line 42) | @Override
    method getLoadedPlugin (line 57) | @Override
    method callApplicationOnCreate (line 75) | @Override
    method convertActivityIntent (line 90) | @Override
    method startPluginService (line 117) | @Override
    method stopPluginService (line 144) | @Override
    method bindPluginService (line 167) | @Override
    method unbindService (line 197) | @Override
    method startActivityInPluginProcess (line 217) | @Override

FILE: projects/sdk/dynamic/dynamic-manager/src/main/java/com/tencent/shadow/dynamic/manager/PluginManagerThatUseDynamicLoader.java
  class PluginManagerThatUseDynamicLoader (line 36) | public abstract class PluginManagerThatUseDynamicLoader extends BaseDyna...
    method PluginManagerThatUseDynamicLoader (line 49) | protected PluginManagerThatUseDynamicLoader(Context context) {
    method onPluginServiceConnected (line 53) | @Override
    method onPluginServiceDisconnected (line 84) | @Override
    method loadRunTime (line 90) | public final void loadRunTime(String uuid) throws RemoteException, Fai...
    method loadPluginLoader (line 100) | public final void loadPluginLoader(String uuid) throws RemoteException...

FILE: projects/sdk/dynamic/dynamic-manager/src/main/java/com/tencent/shadow/dynamic/manager/PluginServiceConnectionBinder.java
  class PluginServiceConnectionBinder (line 36) | class PluginServiceConnectionBinder extends Binder {
    method PluginServiceConnectionBinder (line 43) | PluginServiceConnectionBinder(PluginServiceConnection psc) {
    method onTransact (line 47) | @Override

FILE: projects/sdk/dynamic/dynamic-manager/src/main/java/com/tencent/shadow/dynamic/manager/UuidManagerBinder.java
  class UuidManagerBinder (line 28) | class UuidManagerBinder extends android.os.Binder {
    method UuidManagerBinder (line 32) | UuidManagerBinder(UuidManagerImpl uuidManager) {
    method onTransact (line 36) | @Override

FILE: projects/sdk/dynamic/dynamic-manager/src/main/java/com/tencent/shadow/dynamic/manager/UuidManagerImpl.java
  type UuidManagerImpl (line 7) | public interface UuidManagerImpl {
    method getPlugin (line 8) | InstalledApk getPlugin(String uuid, String partKey) throws NotFoundExc...
    method getPluginLoader (line 10) | InstalledApk getPluginLoader(String uuid) throws NotFoundException, Fa...
    method getRuntime (line 12) | InstalledApk getRuntime(String uuid) throws NotFoundException, FailedE...

FILE: projects/test/common-jar-settings-test/src/main/java/Test.java
  class Test (line 3) | class Test {
    method test (line 4) | public static void test(ByteBuffer byteBuffer) {

FILE: projects/test/dynamic/host/test-dynamic-host/src/androidTest/java/com/google/devtools/build/android/desugar/runtime/ThrowableExtension.java
  class ThrowableExtension (line 40) | public final class ThrowableExtension {
    method getStrategy (line 83) | public static AbstractDesugaringStrategy getStrategy() {
    method addSuppressed (line 87) | public static void addSuppressed(Throwable receiver, Throwable suppres...
    method getSuppressed (line 91) | public static Throwable[] getSuppressed(Throwable receiver) {
    method printStackTrace (line 95) | public static void printStackTrace(Throwable receiver) {
    method printStackTrace (line 99) | public static void printStackTrace(Throwable receiver, PrintWriter wri...
    method printStackTrace (line 103) | public static void printStackTrace(Throwable receiver, PrintStream str...
    method closeResource (line 107) | public static void closeResource(Throwable throwable, Object resource)...
    method useMimicStrategy (line 145) | private static boolean useMimicStrategy() {
    method readApiLevelFromBuildVersion (line 163) | private static Integer readApiLevelFromBuildVersion() {
    class AbstractDesugaringStrategy (line 182) | abstract static class AbstractDesugaringStrategy {
      method addSuppressed (line 186) | public abstract void addSuppressed(Throwable receiver, Throwable sup...
      method getSuppressed (line 188) | public abstract Throwable[] getSuppressed(Throwable receiver);
      method printStackTrace (line 190) | public abstract void printStackTrace(Throwable receiver);
      method printStackTrace (line 192) | public abstract void printStackTrace(Throwable receiver, PrintStream...
      method printStackTrace (line 194) | public abstract void printStackTrace(Throwable receiver, PrintWriter...
    class ReuseDesugaringStrategy (line 200) | static final class ReuseDesugaringStrategy extends AbstractDesugaringS...
      method addSuppressed (line 202) | @Override
      method getSuppressed (line 207) | @Override
      method printStackTrace (line 212) | @Override
      method printStackTrace (line 217) | @Override
      method printStackTrace (line 222) | @Override
    class MimicDesugaringStrategy (line 231) | static final class MimicDesugaringStrategy extends AbstractDesugaringS...
      method addSuppressed (line 240) | @Override
      method getSuppressed (line 252) | @Override
      method printStackTrace (line 268) | @Override
Condensed preview — 948 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,346K chars).
[
  {
    "path": ".commitlintrc.yml",
    "chars": 229,
    "preview": "extends:\n  - '@commitlint/config-conventional'\ndefaultIgnores: false\nrules:\n  #允许中文\n  subject-case: [ 0 ]\n  footer-max-l"
  },
  {
    "path": ".github/actions/post-build/action.yml",
    "chars": 170,
    "preview": "name: post-build\ndescription: '清理构建环境'\nruns:\n  using: \"composite\"\n  steps:\n    - name: stop gradle deamon for actions/ca"
  },
  {
    "path": ".github/actions/pre-build/action.yml",
    "chars": 961,
    "preview": "name: pre-build\ndescription: '准备构建环境'\nruns:\n  using: \"composite\"\n  steps:\n    - name: revert gradle distributionUrl in e"
  },
  {
    "path": ".github/workflows/check-build-test.yml",
    "chars": 6829,
    "preview": "name: Check & Build & Test\non:\n  workflow_call:\n  push:\n    branches:\n      - master\n  pull_request:\n    branches: [ mas"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 610,
    "preview": "name: Publish release\n\non:\n  release:\n    types:\n      - published #https://docs.github.com/en/actions/using-workflows/e"
  },
  {
    "path": ".gitignore",
    "chars": 134,
    "preview": "*.iml\n.gradle\n/local.properties\n!.idea\n.idea/*\n!.idea/codeStyles\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n.gradle"
  },
  {
    "path": ".idea/codeStyles/Project.xml",
    "chars": 5305,
    "preview": "<component name=\"ProjectCodeStyleConfiguration\">\n    <code_scheme name=\"Project\" version=\"173\">\n        <JetCodeStyleSet"
  },
  {
    "path": ".idea/codeStyles/codeStyleConfig.xml",
    "chars": 150,
    "preview": "<component name=\"ProjectCodeStyleConfiguration\">\n    <state>\n        <option name=\"USE_PER_PROJECT_SETTINGS\" value=\"true"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 3238,
    "preview": "# Contributing\n我们非常欢迎您向Tencent Shadow提交Issue或Pull Request。\n\n# Issue\n在Tencent Shadow开源的初期,我们会密切关注所有Issue反馈。晚些时候再根据反馈的情况制定"
  },
  {
    "path": "LICENSE.txt",
    "chars": 1501,
    "preview": "Copyright (C) 2019 THL A29 Limited, a Tencent company.  All rights reserved.\n\nRedistribution and use in source and binar"
  },
  {
    "path": "PRIVACY.md",
    "chars": 776,
    "preview": "# Tencent Shadow SDK个人信息保护规则\n_生效日期:2022年4月6日_\n\n## 引言\n\nTencent Shadow SDK (以下简称“SDK产品”)由深圳市腾讯计算机系统有限公司(以下简称“我们”)开发, 公司注册地"
  },
  {
    "path": "README.md",
    "chars": 2305,
    "preview": "# Shadow\n\n![Android CI](https://github.com/Tencent/Shadow/workflows/Android%20CI/badge.svg?event=push)\n[![PRs Welcome](h"
  },
  {
    "path": "build.gradle",
    "chars": 1361,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\n//buildscript不能从其他g"
  },
  {
    "path": "buildScripts/gradle/common.gradle",
    "chars": 1222,
    "preview": "def gitShortRev() {\n    def gitCommit = \"\"\n    def proc = \"git rev-parse --short HEAD\".execute()\n    proc.in.eachLine { "
  },
  {
    "path": "buildScripts/gradle/fix_issue_1263.gradle",
    "chars": 3408,
    "preview": "/**\n * 这个脚本通过hook create*ApkListingFileRedirect任务,\n * 在它执行完成后,即生成了apk_ide_redirect_file,也应该生成了apk之后,\n * 补充一个复制build/inte"
  },
  {
    "path": "buildScripts/gradle/maven.gradle",
    "chars": 21561,
    "preview": "task buildSdk() {\n    dependsOn gradle.includedBuild('core').task(':gradle-plugin:assemble')\n    dependsOn gradle.includ"
  },
  {
    "path": "buildScripts/gradle/versions.properties",
    "chars": 582,
    "preview": "COMPILE_SDK_VERSION=33\nMIN_SDK_VERSION=14\nTARGET_SDK_VERSION=28\nVERSION_CODE=1\nVERSION_NAME=local\nandroid_build_tools_ve"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "chars": 272,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\n#distributionUrl=https\\://services.gradle.org/distribut"
  },
  {
    "path": "gradle.properties",
    "chars": 809,
    "preview": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will ov"
  },
  {
    "path": "gradlew",
    "chars": 5766,
    "preview": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "gradlew.bat",
    "chars": 2674,
    "preview": "@rem\n@rem Copyright 2015 the original author or authors.\n@rem\n@rem Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "projects/sample/README.md",
    "chars": 2592,
    "preview": "# Sample\n\n在Shadow框架下,应用由几部分构成。\n宿主应用打包了很简单的一些接口,并在Manifest中注册了壳子代理组件,\n还打包了插件管理器(manager)的动态升级逻辑。\nmanager负责下载、安装插件,还带有一个动态"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-api/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-api/README.md",
    "chars": 116,
    "preview": "演示如何将自定义接口动态化,使得宿主能够使用apk中的实现\n\nsample-hello-api:定义宿主api接口\nsample-hello-api-holder:将 api 动态化,宿主通过这个包提供的方法来获取apk中的实现\n\n"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-api/build.gradle",
    "chars": 579,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion project.COMPILE_SDK_VERSION\n\n    defaultConfig {\n  "
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-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": "projects/sample/dynamic-apk/sample-hello-api/src/main/AndroidManifest.xml",
    "chars": 59,
    "preview": "<manifest package=\"com.tencent.shadow.sample.api.hello\" />\n"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-api/src/main/java/com/tencent/shadow/sample/api/hello/HelloFactory.java",
    "chars": 1025,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-api/src/main/java/com/tencent/shadow/sample/api/hello/IHelloWorld.java",
    "chars": 346,
    "preview": "package com.tencent.shadow.sample.api.hello;\n\nimport android.content.Context;\nimport android.widget.TextView;\n\n/**\n * @a"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-api/src/main/java/com/tencent/shadow/sample/api/hello/IHelloWorldImpl.java",
    "chars": 1189,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-api-holder/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-api-holder/README.md",
    "chars": 178,
    "preview": "演示如何将自定义接口动态化,使得宿主能够使用apk中的实现\n\nsample-hello-api:定义宿主api接口\nsample-hello-api-holder:将 api 动态化,宿主通过这个包提供的方法来获取apk中的实现\n\n宿主引入"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-api-holder/build.gradle",
    "chars": 819,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion project.COMPILE_SDK_VERSION\n\n    defaultConfig {\n  "
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-api-holder/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": "projects/sample/dynamic-apk/sample-hello-api-holder/src/main/AndroidManifest.xml",
    "chars": 59,
    "preview": "<manifest package=\"com.tencent.shadow.sample.apk.hello\" />\n"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-api-holder/src/main/java/com/tencent/shadow/sample/apk/hello/DynamicHello.java",
    "chars": 3326,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-api-holder/src/main/java/com/tencent/shadow/sample/apk/hello/HelloImplLoader.java",
    "chars": 2974,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-api-holder/src/main/java/com/tencent/shadow/sample/apk/hello/HelloWorldUpdater.java",
    "chars": 1141,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-apk/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-apk/build.gradle",
    "chars": 1103,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion project.COMPILE_SDK_VERSION\n    defaultConfig {"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-apk/proguard-rules.pro",
    "chars": 886,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-apk/src/main/AndroidManifest.xml",
    "chars": 97,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"com.tencent.shadow.sample.manager\" />\n\n"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-apk/src/main/java/com/tencent/shadow/dynamic/impl/HelloFactoryImpl.java",
    "chars": 547,
    "preview": "package com.tencent.shadow.dynamic.impl;\n\nimport android.content.Context;\n\nimport com.tencent.shadow.sample.api.hello.He"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-apk/src/main/java/com/tencent/shadow/dynamic/impl/WhiteList.java",
    "chars": 1056,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-apk/src/main/java/com/tencent/shadow/sample/api/hello/SampleHelloWorld.java",
    "chars": 763,
    "preview": "package com.tencent.shadow.sample.api.hello;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.w"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-apk/src/main/res/layout/activity_load_plugin.xml",
    "chars": 1524,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Tencent is pleased to support the open source community by making Tencent"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-host/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-host/build.gradle",
    "chars": 3089,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion project.COMPILE_SDK_VERSION\n    defaultConfig {"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-host/proguard-rules.pro",
    "chars": 972,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-host/src/main/AndroidManifest.xml",
    "chars": 863,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:to"
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-host/src/main/java/com/tencent/shadow/sample/host/AndroidLogLoggerFactory.java",
    "chars": 20032,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-host/src/main/java/com/tencent/shadow/sample/host/HostApplication.java",
    "chars": 1838,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-host/src/main/java/com/tencent/shadow/sample/host/MainActivity.java",
    "chars": 3037,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-host/src/main/java/com/tencent/shadow/sample/host/PluginHelper.java",
    "chars": 2095,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-host/src/main/java/com/tencent/shadow/sample/host/api/FixedPathPmUpdater.java",
    "chars": 1212,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/dynamic-apk/sample-hello-host/src/main/java/com/tencent/shadow/sample/host/api/HelloWorldApiHolder.java",
    "chars": 1276,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/maven/host-project/.gitignore",
    "chars": 86,
    "preview": "*.iml\n.gradle\n/local.properties\n.idea\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": "projects/sample/maven/host-project/build.gradle",
    "chars": 1426,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    e"
  },
  {
    "path": "projects/sample/maven/host-project/gradle/wrapper/gradle-wrapper.properties",
    "chars": 276,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\n#distributionUrl=https\\://services.gradle.org/distribut"
  },
  {
    "path": "projects/sample/maven/host-project/gradle.properties",
    "chars": 817,
    "preview": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will ov"
  },
  {
    "path": "projects/sample/maven/host-project/gradlew",
    "chars": 5960,
    "preview": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0"
  },
  {
    "path": "projects/sample/maven/host-project/gradlew.bat",
    "chars": 2842,
    "preview": "@rem\n@rem Copyright 2015 the original author or authors.\n@rem\n@rem Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "projects/sample/maven/host-project/introduce-shadow-lib/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "projects/sample/maven/host-project/introduce-shadow-lib/build.gradle",
    "chars": 479,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 29\n\n\n    defaultConfig {\n        minSdkVersion 16\n "
  },
  {
    "path": "projects/sample/maven/host-project/introduce-shadow-lib/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": "projects/sample/maven/host-project/introduce-shadow-lib/src/main/AndroidManifest.xml",
    "chars": 2288,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.tencent.shadow.sample.introduce_sh"
  },
  {
    "path": "projects/sample/maven/host-project/introduce-shadow-lib/src/main/java/com/tencent/shadow/sample/introduce_shadow_lib/AndroidLoggerFactory.java",
    "chars": 19300,
    "preview": "package com.tencent.shadow.sample.introduce_shadow_lib;\n\nimport android.util.Log;\n\nimport com.tencent.shadow.core.common"
  },
  {
    "path": "projects/sample/maven/host-project/introduce-shadow-lib/src/main/java/com/tencent/shadow/sample/introduce_shadow_lib/FixedPathPmUpdater.java",
    "chars": 711,
    "preview": "package com.tencent.shadow.sample.introduce_shadow_lib;\n\nimport com.tencent.shadow.dynamic.host.PluginManagerUpdater;\n\ni"
  },
  {
    "path": "projects/sample/maven/host-project/introduce-shadow-lib/src/main/java/com/tencent/shadow/sample/introduce_shadow_lib/InitApplication.java",
    "chars": 2589,
    "preview": "package com.tencent.shadow.sample.introduce_shadow_lib;\n\nimport android.app.ActivityManager;\nimport android.app.Applicat"
  },
  {
    "path": "projects/sample/maven/host-project/introduce-shadow-lib/src/main/java/com/tencent/shadow/sample/introduce_shadow_lib/MainPluginProcessService.java",
    "chars": 286,
    "preview": "package com.tencent.shadow.sample.introduce_shadow_lib;\n\nimport com.tencent.shadow.dynamic.host.PluginProcessService;\n\n/"
  },
  {
    "path": "projects/sample/maven/host-project/introduce-shadow-lib/src/main/res/values/themes.xml",
    "chars": 431,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"PluginContainerActivity\" parent=\"@android:style/The"
  },
  {
    "path": "projects/sample/maven/host-project/sample-host/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "projects/sample/maven/host-project/sample-host/build.gradle",
    "chars": 774,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 29\n    defaultConfig {\n        applicationId \"c"
  },
  {
    "path": "projects/sample/maven/host-project/sample-host/proguard-rules.pro",
    "chars": 902,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "projects/sample/maven/host-project/sample-host/src/main/AndroidManifest.xml",
    "chars": 650,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "projects/sample/maven/host-project/sample-host/src/main/java/com/tencent/shadow/sample/host/MainActivity.java",
    "chars": 2588,
    "preview": "package com.tencent.shadow.sample.host;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.View"
  },
  {
    "path": "projects/sample/maven/host-project/sample-host/src/main/java/com/tencent/shadow/sample/host/MyApplication.java",
    "chars": 324,
    "preview": "package com.tencent.shadow.sample.host;\n\nimport android.app.Application;\n\nimport com.tencent.shadow.sample.introduce_sha"
  },
  {
    "path": "projects/sample/maven/host-project/settings.gradle",
    "chars": 48,
    "preview": "include ':sample-host', ':introduce-shadow-lib'\n"
  },
  {
    "path": "projects/sample/maven/manager-project/.gitignore",
    "chars": 86,
    "preview": "*.iml\n.gradle\n/local.properties\n.idea\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": "projects/sample/maven/manager-project/build.gradle",
    "chars": 1426,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    e"
  },
  {
    "path": "projects/sample/maven/manager-project/gradle/wrapper/gradle-wrapper.properties",
    "chars": 306,
    "preview": "#Wed May 08 11:09:16 CST 2019\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "projects/sample/maven/manager-project/gradle.properties",
    "chars": 817,
    "preview": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will ov"
  },
  {
    "path": "projects/sample/maven/manager-project/gradlew",
    "chars": 5296,
    "preview": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up"
  },
  {
    "path": "projects/sample/maven/manager-project/gradlew.bat",
    "chars": 2176,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
  },
  {
    "path": "projects/sample/maven/manager-project/sample-manager/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "projects/sample/maven/manager-project/sample-manager/build.gradle",
    "chars": 993,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 29\n    defaultConfig {\n        applicationId \"c"
  },
  {
    "path": "projects/sample/maven/manager-project/sample-manager/proguard-rules.pro",
    "chars": 105,
    "preview": "-keep class com.tencent.shadow.dynamic.impl.**{*;}\n\n-keep class com.tencent.shadow.dynamic.loader.**{*;}\n"
  },
  {
    "path": "projects/sample/maven/manager-project/sample-manager/src/main/AndroidManifest.xml",
    "chars": 97,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"com.tencent.shadow.sample.manager\" />\n\n"
  },
  {
    "path": "projects/sample/maven/manager-project/sample-manager/src/main/aidl/com/tencent/shadow/sample/plugin/IMyAidlInterface.aidl",
    "chars": 401,
    "preview": "// IMyAidlInterface.aidl\npackage com.tencent.shadow.sample.plugin;\n\n// Declare any non-default types here with import st"
  },
  {
    "path": "projects/sample/maven/manager-project/sample-manager/src/main/java/com/tencent/shadow/dynamic/impl/ManagerFactoryImpl.java",
    "chars": 470,
    "preview": "package com.tencent.shadow.dynamic.impl;\n\nimport android.content.Context;\n\nimport com.tencent.shadow.dynamic.host.Manage"
  },
  {
    "path": "projects/sample/maven/manager-project/sample-manager/src/main/java/com/tencent/shadow/dynamic/impl/WhiteList.java",
    "chars": 213,
    "preview": "package com.tencent.shadow.dynamic.impl;\n\n/**\n * 此类包名及类名固定\n * classLoader的白名单\n * PluginManager可以加载宿主中位于白名单内的类\n */\npublic"
  },
  {
    "path": "projects/sample/maven/manager-project/sample-manager/src/main/java/com/tencent/shadow/sample/manager/Constant.java",
    "chars": 478,
    "preview": "package com.tencent.shadow.sample.manager;\n\nfinal public class Constant {\n    public static final String KEY_PLUGIN_ZIP_"
  },
  {
    "path": "projects/sample/maven/manager-project/sample-manager/src/main/java/com/tencent/shadow/sample/manager/FastPluginManager.java",
    "chars": 5329,
    "preview": "package com.tencent.shadow.sample.manager;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android."
  },
  {
    "path": "projects/sample/maven/manager-project/sample-manager/src/main/java/com/tencent/shadow/sample/manager/SamplePluginManager.java",
    "chars": 6231,
    "preview": "package com.tencent.shadow.sample.manager;\n\nimport android.app.Service;\nimport android.content.ComponentName;\nimport and"
  },
  {
    "path": "projects/sample/maven/manager-project/sample-manager/src/main/res/layout/activity_load_plugin.xml",
    "chars": 738,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "projects/sample/maven/manager-project/settings.gradle",
    "chars": 26,
    "preview": "include ':sample-manager'\n"
  },
  {
    "path": "projects/sample/maven/plugin-project/.gitignore",
    "chars": 86,
    "preview": "*.iml\n.gradle\n/local.properties\n.idea\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": "projects/sample/maven/plugin-project/build.gradle",
    "chars": 1426,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    e"
  },
  {
    "path": "projects/sample/maven/plugin-project/gradle/wrapper/gradle-wrapper.properties",
    "chars": 306,
    "preview": "#Wed May 08 11:09:16 CST 2019\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "projects/sample/maven/plugin-project/gradle.properties",
    "chars": 817,
    "preview": "# Project-wide Gradle settings.\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will ov"
  },
  {
    "path": "projects/sample/maven/plugin-project/gradlew",
    "chars": 5296,
    "preview": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up"
  },
  {
    "path": "projects/sample/maven/plugin-project/gradlew.bat",
    "chars": 2176,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
  },
  {
    "path": "projects/sample/maven/plugin-project/plugin-app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "projects/sample/maven/plugin-project/plugin-app/build.gradle",
    "chars": 3648,
    "preview": "apply plugin: 'com.android.application'\napply plugin: 'com.tencent.shadow.plugin'\n\nandroid {\n    compileSdkVersion 30\n  "
  },
  {
    "path": "projects/sample/maven/plugin-project/plugin-app/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": "projects/sample/maven/plugin-project/plugin-app/src/main/AndroidManifest.xml",
    "chars": 684,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "projects/sample/maven/plugin-project/plugin-app/src/main/aidl/com/tencent/shadow/sample/plugin/IMyAidlInterface.aidl",
    "chars": 401,
    "preview": "// IMyAidlInterface.aidl\npackage com.tencent.shadow.sample.plugin;\n\n// Declare any non-default types here with import st"
  },
  {
    "path": "projects/sample/maven/plugin-project/plugin-app/src/main/java/com/tencent/shadow/sample/plugin/MainActivity.java",
    "chars": 314,
    "preview": "package com.tencent.shadow.sample.plugin;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\npublic class MainActi"
  },
  {
    "path": "projects/sample/maven/plugin-project/plugin-app/src/main/java/com/tencent/shadow/sample/plugin/MyService.java",
    "chars": 640,
    "preview": "package com.tencent.shadow.sample.plugin;\n\nimport android.app.Service;\nimport android.content.Intent;\nimport android.os."
  },
  {
    "path": "projects/sample/maven/plugin-project/plugin-app/src/main/res/layout/activity_main.xml",
    "chars": 428,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns"
  },
  {
    "path": "projects/sample/maven/plugin-project/plugin-app/src/main/res/values/colors.xml",
    "chars": 208,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#008577</color>\n    <color name=\"color"
  },
  {
    "path": "projects/sample/maven/plugin-project/plugin-app/src/main/res/values/strings.xml",
    "chars": 83,
    "preview": "<resources>\n    <string name=\"app_name\">Shadow Sample Plugin</string>\n</resources>\n"
  },
  {
    "path": "projects/sample/maven/plugin-project/plugin-app/src/main/res/values/styles.xml",
    "chars": 134,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"android:Theme.NoTitleBar\"></style>\n"
  },
  {
    "path": "projects/sample/maven/plugin-project/sample-loader/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "projects/sample/maven/plugin-project/sample-loader/build.gradle",
    "chars": 1089,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 29\n    defaultConfig {\n        applicationId \"c"
  },
  {
    "path": "projects/sample/maven/plugin-project/sample-loader/proguard-rules.pro",
    "chars": 1725,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "projects/sample/maven/plugin-project/sample-loader/src/main/AndroidManifest.xml",
    "chars": 96,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"com.tencent.shadow.sample.loader\" />\n\n"
  },
  {
    "path": "projects/sample/maven/plugin-project/sample-loader/src/main/java/com/tencent/shadow/dynamic/loader/impl/CoreLoaderFactoryImpl.java",
    "chars": 583,
    "preview": "package com.tencent.shadow.dynamic.loader.impl;\n\nimport android.content.Context;\n\nimport com.tencent.shadow.core.loader."
  },
  {
    "path": "projects/sample/maven/plugin-project/sample-loader/src/main/java/com/tencent/shadow/sample/loader/SampleComponentManager.java",
    "chars": 1729,
    "preview": "package com.tencent.shadow.sample.loader;\n\nimport android.content.ComponentName;\nimport android.content.Context;\n\nimport"
  },
  {
    "path": "projects/sample/maven/plugin-project/sample-loader/src/main/java/com/tencent/shadow/sample/loader/SamplePluginLoader.java",
    "chars": 776,
    "preview": "package com.tencent.shadow.sample.loader;\n\nimport android.content.Context;\n\nimport com.tencent.shadow.core.loader.Shadow"
  },
  {
    "path": "projects/sample/maven/plugin-project/sample-runtime/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "projects/sample/maven/plugin-project/sample-runtime/build.gradle",
    "chars": 838,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 29\n    defaultConfig {\n        applicationId \"c"
  },
  {
    "path": "projects/sample/maven/plugin-project/sample-runtime/proguard-rules.pro",
    "chars": 1117,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "projects/sample/maven/plugin-project/sample-runtime/src/main/AndroidManifest.xml",
    "chars": 97,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"com.tencent.shadow.sample.runtime\" />\n\n"
  },
  {
    "path": "projects/sample/maven/plugin-project/sample-runtime/src/main/java/com/tencent/shadow/sample/runtime/PluginDefaultProxyActivity.java",
    "chars": 196,
    "preview": "package com.tencent.shadow.sample.runtime;\n\n\nimport com.tencent.shadow.core.runtime.container.PluginContainerActivity;\n\n"
  },
  {
    "path": "projects/sample/maven/plugin-project/sample-runtime/src/main/java/com/tencent/shadow/sample/runtime/PluginSingleInstance1ProxyActivity.java",
    "chars": 204,
    "preview": "package com.tencent.shadow.sample.runtime;\n\n\nimport com.tencent.shadow.core.runtime.container.PluginContainerActivity;\n\n"
  },
  {
    "path": "projects/sample/maven/plugin-project/sample-runtime/src/main/java/com/tencent/shadow/sample/runtime/PluginSingleTask1ProxyActivity.java",
    "chars": 200,
    "preview": "package com.tencent.shadow.sample.runtime;\n\n\nimport com.tencent.shadow.core.runtime.container.PluginContainerActivity;\n\n"
  },
  {
    "path": "projects/sample/maven/plugin-project/settings.gradle",
    "chars": 73,
    "preview": "include ':plugin-app'\ninclude ':sample-runtime'\ninclude ':sample-loader'\n"
  },
  {
    "path": "projects/sample/source/sample-constant/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "projects/sample/source/sample-constant/build.gradle",
    "chars": 582,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion project.COMPILE_SDK_VERSION\n\n\n    defaultConfig {\n "
  },
  {
    "path": "projects/sample/source/sample-constant/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": "projects/sample/source/sample-constant/src/main/AndroidManifest.xml",
    "chars": 58,
    "preview": "<manifest package=\"com.tencent.shadow.sample.constant\" />\n"
  },
  {
    "path": "projects/sample/source/sample-constant/src/main/java/com/tencent/shadow/sample/constant/Constant.java",
    "chars": 1554,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-host/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "projects/sample/source/sample-host/build.gradle",
    "chars": 3428,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion project.COMPILE_SDK_VERSION\n    defaultConfig {"
  },
  {
    "path": "projects/sample/source/sample-host/proguard-rules.pro",
    "chars": 972,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "projects/sample/source/sample-host/src/main/AndroidManifest.xml",
    "chars": 3849,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:to"
  },
  {
    "path": "projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/AndroidLogLoggerFactory.java",
    "chars": 20032,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/HostApplication.java",
    "chars": 3560,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/MainActivity.java",
    "chars": 4010,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/Plugin2ProcessPPS.java",
    "chars": 1752,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/PluginHelper.java",
    "chars": 2677,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/PluginLoadActivity.java",
    "chars": 3310,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/PluginProcessPPS.java",
    "chars": 1748,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/manager/FixedPathPmUpdater.java",
    "chars": 1636,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/manager/Shadow.java",
    "chars": 1282,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/plugin_view/HostAddPluginViewActivity.java",
    "chars": 2446,
    "preview": "package com.tencent.shadow.sample.host.plugin_view;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport "
  },
  {
    "path": "projects/sample/source/sample-host/src/main/java/com/tencent/shadow/sample/host/plugin_view/MainProcessManagerReceiver.java",
    "chars": 564,
    "preview": "package com.tencent.shadow.sample.host.plugin_view;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Co"
  },
  {
    "path": "projects/sample/source/sample-host/src/main/res/layout/activity_jump_to_plugin.xml",
    "chars": 1194,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Tencent is pleased to support the open source community by making Tencent"
  },
  {
    "path": "projects/sample/source/sample-host/src/main/res/layout/activity_load.xml",
    "chars": 1032,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Tencent is pleased to support the open source community by making Tencent"
  },
  {
    "path": "projects/sample/source/sample-host/src/main/res/layout/part_key_adapter.xml",
    "chars": 993,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Tencent is pleased to support the open source community by making Tencent"
  },
  {
    "path": "projects/sample/source/sample-host/src/main/res/values/strings.xml",
    "chars": 1062,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Tencent is pleased to support the open source community by making Tencent"
  },
  {
    "path": "projects/sample/source/sample-host/src/main/res/values/themes.xml",
    "chars": 909,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Tencent is pleased to support the open source community by making Tencent"
  },
  {
    "path": "projects/sample/source/sample-host-lib/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "projects/sample/source/sample-host-lib/build.gradle",
    "chars": 692,
    "preview": "apply plugin: 'com.android.library'\napply plugin: 'com.tencent.shadow.internal.aar-to-jar'\n\nandroid {\n    compileSdkVers"
  },
  {
    "path": "projects/sample/source/sample-host-lib/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": "projects/sample/source/sample-host-lib/sample-host-lib.pro",
    "chars": 94,
    "preview": "#让宿主在打包时能够keep住插件要使用到的类名和方法\n-keep class com.tencent.shadow.sample.host.lib.*{\n    public *;\n}\n"
  },
  {
    "path": "projects/sample/source/sample-host-lib/src/main/AndroidManifest.xml",
    "chars": 58,
    "preview": "<manifest package=\"com.tencent.shadow.sample.host.lib\" />\n"
  },
  {
    "path": "projects/sample/source/sample-host-lib/src/main/java/com/tencent/shadow/sample/host/lib/HostAddPluginViewContainer.java",
    "chars": 149,
    "preview": "package com.tencent.shadow.sample.host.lib;\n\nimport android.view.View;\n\npublic interface HostAddPluginViewContainer {\n  "
  },
  {
    "path": "projects/sample/source/sample-host-lib/src/main/java/com/tencent/shadow/sample/host/lib/HostAddPluginViewContainerHolder.java",
    "chars": 238,
    "preview": "package com.tencent.shadow.sample.host.lib;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class HostAddPlugin"
  },
  {
    "path": "projects/sample/source/sample-host-lib/src/main/java/com/tencent/shadow/sample/host/lib/HostUiLayerProvider.java",
    "chars": 1599,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-host-lib/src/main/java/com/tencent/shadow/sample/host/lib/LoadPluginCallback.java",
    "chars": 596,
    "preview": "package com.tencent.shadow.sample.host.lib;\n\nimport android.content.pm.ApplicationInfo;\nimport android.content.res.Resou"
  },
  {
    "path": "projects/sample/source/sample-host-lib/src/main/res/layout/host_ui_layer_layout.xml",
    "chars": 480,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "projects/sample/source/sample-manager/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "projects/sample/source/sample-manager/build.gradle",
    "chars": 1232,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion project.COMPILE_SDK_VERSION\n    defaultConfig {"
  },
  {
    "path": "projects/sample/source/sample-manager/proguard-rules.pro",
    "chars": 886,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "projects/sample/source/sample-manager/src/main/AndroidManifest.xml",
    "chars": 97,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"com.tencent.shadow.sample.manager\" />\n\n"
  },
  {
    "path": "projects/sample/source/sample-manager/src/main/java/com/tencent/shadow/dynamic/impl/ManagerFactoryImpl.java",
    "chars": 1209,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-manager/src/main/java/com/tencent/shadow/dynamic/impl/WhiteList.java",
    "chars": 1059,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-manager/src/main/java/com/tencent/shadow/sample/manager/FastPluginManager.java",
    "chars": 5744,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-manager/src/main/java/com/tencent/shadow/sample/manager/SamplePluginManager.java",
    "chars": 5864,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-manager/src/main/res/layout/activity_load_plugin.xml",
    "chars": 1524,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Tencent is pleased to support the open source community by making Tencent"
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/build.gradle",
    "chars": 7126,
    "preview": "buildscript {\n    repositories {\n        if (!System.getenv().containsKey(\"DISABLE_TENCENT_MAVEN_MIRROR\")) {\n           "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/proguard-rules.pro",
    "chars": 808,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /U"
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/AndroidManifest.xml",
    "chars": 3811,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/assets/web/test.html",
    "chars": 245,
    "preview": "<html>\n<body>\nlocation.search:\n\n<script type=\"text/javascript\">\ndocument.write(location.search);\n\n</script>\n\n<select nam"
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/UseCaseApplication.java",
    "chars": 4901,
    "preview": "package com.tencent.shadow.sample.plugin.app.lib;\n\nimport static com.tencent.shadow.sample.plugin.app.lib.gallery.cases."
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/activity/TestActivityOnCreate.java",
    "chars": 2795,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/activity/TestActivityOptionMenu.java",
    "chars": 1984,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/activity/TestActivityOrientation.java",
    "chars": 2463,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/activity/TestActivityReCreate.java",
    "chars": 3149,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/activity/TestActivityReCreateBySystem.java",
    "chars": 1995,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/activity/TestActivitySetTheme.java",
    "chars": 2747,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/activity/TestActivityWindowSoftMode.java",
    "chars": 2275,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/application/TestApplicationActivity.java",
    "chars": 1577,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/context/ActivityContextSubDirTestActivity.java",
    "chars": 1635,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/context/ApplicationContextSubDirTestActivity.java",
    "chars": 1659,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/context/SubDirContextThemeWrapperTestActivity.java",
    "chars": 14523,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/dialog/TestDialog.java",
    "chars": 1285,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/dialog/TestDialogActivity.java",
    "chars": 1884,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/fragment/TestDialogFragment.java",
    "chars": 1721,
    "preview": "package com.tencent.shadow.sample.plugin.app.lib.usecases.fragment;\n\nimport android.app.Dialog;\nimport android.app.Dialo"
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/fragment/TestDialogFragmentActivity.java",
    "chars": 2085,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/fragment/TestDynamicFragmentActivity.java",
    "chars": 2009,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/fragment/TestFragment.java",
    "chars": 1897,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/fragment/TestXmlFragmentActivity.java",
    "chars": 1727,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/host_communication/PluginUseHostClassActivity.java",
    "chars": 2025,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/packagemanager/TestPackageManagerActivity.java",
    "chars": 3456,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/provider/TestDBContentProviderActivity.java",
    "chars": 6744,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  },
  {
    "path": "projects/sample/source/sample-plugin/sample-app/src/main/java/com/tencent/shadow/sample/plugin/app/lib/usecases/provider/TestDBHelper.java",
    "chars": 1803,
    "preview": "/*\n * Tencent is pleased to support the open source community by making Tencent Shadow available.\n * Copyright (C) 2019 "
  }
]

// ... and 748 more files (download for full content)

About this extraction

This page contains the full source code of the Tencent/Shadow GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 948 files (2.0 MB), approximately 611.5k tokens, and a symbol index with 3115 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!