Full Code of Qihoo360/RePlugin for AI

dev 36db020bf190 cached
560 files
2.1 MB
594.7k tokens
2870 symbols
1 requests
Download .txt
Showing preview only (2,378K chars total). Download the full file or copy to clipboard to get everything.
Repository: Qihoo360/RePlugin
Branch: dev
Commit: 36db020bf190
Files: 560
Total size: 2.1 MB

Directory structure:
gitextract_twe1voez/

├── .github/
│   ├── ISSUE_TEMPLATE.md
│   └── PULL_REQUEST_TEMPLATE.md
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── README_CN.md
├── deploy.sh
├── replugin-host-gradle/
│   ├── README.md
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── gradlew
│   ├── gradlew.bat
│   └── src/
│       └── main/
│           ├── groovy/
│           │   └── com/
│           │       └── qihoo360/
│           │           └── replugin/
│           │               └── gradle/
│           │                   ├── compat/
│           │                   │   ├── ScopeCompat.groovy
│           │                   │   └── VariantCompat.groovy
│           │                   └── host/
│           │                       ├── AppConstant.groovy
│           │                       ├── RePlugin.groovy
│           │                       ├── creator/
│           │                       │   ├── FileCreators.groovy
│           │                       │   ├── IFileCreator.groovy
│           │                       │   └── impl/
│           │                       │       ├── java/
│           │                       │       │   └── RePluginHostConfigCreator.groovy
│           │                       │       └── json/
│           │                       │           ├── PluginBuiltinJsonCreator.groovy
│           │                       │           ├── PluginInfo.groovy
│           │                       │           └── PluginInfoParser.groovy
│           │                       └── handlemanifest/
│           │                           └── ComponentsGenerator.groovy
│           └── resources/
│               └── META-INF/
│                   └── gradle-plugins/
│                       └── replugin-host-gradle.properties
├── replugin-host-library/
│   ├── README.md
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── gradlew
│   ├── gradlew.bat
│   ├── replugin-host-lib/
│   │   ├── bintray.gradle
│   │   ├── build.gradle
│   │   ├── replugin-rules.pro
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── aidl/
│   │           │   └── com/
│   │           │       └── qihoo360/
│   │           │           ├── loader2/
│   │           │           │   ├── IPlugin.aidl
│   │           │           │   ├── IPluginClient.aidl
│   │           │           │   ├── IPluginHost.aidl
│   │           │           │   ├── PluginBinderInfo.aidl
│   │           │           │   ├── mgr/
│   │           │           │   │   └── IServiceConnection.aidl
│   │           │           │   └── sp/
│   │           │           │       └── IPref.aidl
│   │           │           ├── mobilesafe/
│   │           │           │   └── svcmanager/
│   │           │           │       └── IServiceChannel.aidl
│   │           │           └── replugin/
│   │           │               ├── IBinderGetter.aidl
│   │           │               ├── component/
│   │           │               │   └── service/
│   │           │               │       └── server/
│   │           │               │           └── IPluginServiceServer.aidl
│   │           │               ├── model/
│   │           │               │   └── PluginInfo.aidl
│   │           │               └── packages/
│   │           │                   ├── IPluginManagerServer.aidl
│   │           │                   └── PluginRunningList.aidl
│   │           └── java/
│   │               └── com/
│   │                   └── qihoo360/
│   │                       ├── i/
│   │                       │   ├── Factory.java
│   │                       │   ├── Factory2.java
│   │                       │   ├── IModule.java
│   │                       │   ├── IPlugin.java
│   │                       │   └── IPluginManager.java
│   │                       ├── loader/
│   │                       │   ├── utils/
│   │                       │   │   ├── LocalBroadcastManager.java
│   │                       │   │   ├── PackageUtils.java
│   │                       │   │   ├── PatchClassLoaderUtils.java
│   │                       │   │   ├── ProcessLocker.java
│   │                       │   │   ├── StringUtils.java
│   │                       │   │   └── SysUtils.java
│   │                       │   └── utils2/
│   │                       │       └── FilePermissionUtils.java
│   │                       ├── loader2/
│   │                       │   ├── BinderCursor.java
│   │                       │   ├── BuildCompat.java
│   │                       │   ├── Builder.java
│   │                       │   ├── CertUtils.java
│   │                       │   ├── Constant.java
│   │                       │   ├── DumpUtils.java
│   │                       │   ├── Finder.java
│   │                       │   ├── FinderBuiltin.java
│   │                       │   ├── LaunchModeStates.java
│   │                       │   ├── Loader.java
│   │                       │   ├── MP.java
│   │                       │   ├── PMF.java
│   │                       │   ├── Plugin.java
│   │                       │   ├── PluginBinderInfo.java
│   │                       │   ├── PluginCommImpl.java
│   │                       │   ├── PluginContainers.java
│   │                       │   ├── PluginContext.java
│   │                       │   ├── PluginDesc.java
│   │                       │   ├── PluginIntent.java
│   │                       │   ├── PluginLibraryInternalProxy.java
│   │                       │   ├── PluginManager.java
│   │                       │   ├── PluginNativeLibsHelper.java
│   │                       │   ├── PluginProcessMain.java
│   │                       │   ├── PluginProcessPer.java
│   │                       │   ├── PluginProviderStub.java
│   │                       │   ├── PluginStatusController.java
│   │                       │   ├── PluginTable.java
│   │                       │   ├── PmBase.java
│   │                       │   ├── PmHostSvc.java
│   │                       │   ├── ProcessStates.java
│   │                       │   ├── StubProcessManager.java
│   │                       │   ├── TaskAffinityStates.java
│   │                       │   ├── V5FileInfo.java
│   │                       │   ├── V5Finder.java
│   │                       │   ├── VMRuntimeCompat.java
│   │                       │   ├── alc/
│   │                       │   │   ├── ActivityController.java
│   │                       │   │   └── IActivityWatcher.java
│   │                       │   ├── mgr/
│   │                       │   │   ├── PluginProviderClient.java
│   │                       │   │   └── PluginServiceClient.java
│   │                       │   └── sp/
│   │                       │       └── PrefImpl.java
│   │                       ├── mobilesafe/
│   │                       │   ├── api/
│   │                       │   │   ├── AppVar.java
│   │                       │   │   ├── IPC.java
│   │                       │   │   ├── Intents.java
│   │                       │   │   ├── Pref.java
│   │                       │   │   └── Tasks.java
│   │                       │   ├── loader/
│   │                       │   │   ├── a/
│   │                       │   │   │   └── DummyActivity.java
│   │                       │   │   ├── p/
│   │                       │   │   │   └── DummyProvider.java
│   │                       │   │   └── s/
│   │                       │   │       └── DummyService.java
│   │                       │   ├── parser/
│   │                       │   │   └── manifest/
│   │                       │   │       ├── ManifestParser.java
│   │                       │   │       ├── XmlHandler.java
│   │                       │   │       └── bean/
│   │                       │   │           ├── ComponentBean.java
│   │                       │   │           └── DataBean.java
│   │                       │   └── svcmanager/
│   │                       │       ├── ParcelBinder.java
│   │                       │       ├── PluginServiceManager.java
│   │                       │       ├── PluginServiceRecord.java
│   │                       │       ├── PluginServiceReferenceManager.java
│   │                       │       ├── QihooServiceManager.java
│   │                       │       ├── ServiceChannelCursor.java
│   │                       │       ├── ServiceChannelImpl.java
│   │                       │       ├── ServiceProvider.java
│   │                       │       └── ServiceWrapper.java
│   │                       └── replugin/
│   │                           ├── ContextInjector.java
│   │                           ├── DefaultRePluginCallbacks.java
│   │                           ├── DefaultRePluginEventCallbacks.java
│   │                           ├── IHostBinderFetcher.java
│   │                           ├── PluginDexClassLoader.java
│   │                           ├── PluginDexClassLoaderPatch.java
│   │                           ├── RePlugin.java
│   │                           ├── RePluginApplication.java
│   │                           ├── RePluginCallbacks.java
│   │                           ├── RePluginClassLoader.java
│   │                           ├── RePluginConfig.java
│   │                           ├── RePluginConstants.java
│   │                           ├── RePluginEventCallbacks.java
│   │                           ├── RePluginInternal.java
│   │                           ├── base/
│   │                           │   ├── AMSUtils.java
│   │                           │   ├── IPC.java
│   │                           │   ├── LocalBroadcastHelper.java
│   │                           │   └── ThreadUtils.java
│   │                           ├── component/
│   │                           │   ├── ComponentList.java
│   │                           │   ├── activity/
│   │                           │   │   ├── ActivityInjector.java
│   │                           │   │   └── DynamicClassProxyActivity.java
│   │                           │   ├── app/
│   │                           │   │   └── PluginApplicationClient.java
│   │                           │   ├── dummy/
│   │                           │   │   ├── DummyActivity.java
│   │                           │   │   ├── DummyProvider.java
│   │                           │   │   ├── DummyReceiver.java
│   │                           │   │   ├── DummyService.java
│   │                           │   │   └── ForwardActivity.java
│   │                           │   ├── process/
│   │                           │   │   ├── PluginProcessHost.java
│   │                           │   │   ├── ProcessPitProviderBase.java
│   │                           │   │   ├── ProcessPitProviderLoader0.java
│   │                           │   │   ├── ProcessPitProviderLoader1.java
│   │                           │   │   ├── ProcessPitProviderP0.java
│   │                           │   │   ├── ProcessPitProviderP1.java
│   │                           │   │   ├── ProcessPitProviderP2.java
│   │                           │   │   ├── ProcessPitProviderPersist.java
│   │                           │   │   └── ProcessPitProviderUI.java
│   │                           │   ├── provider/
│   │                           │   │   ├── PluginPitProviderBase.java
│   │                           │   │   ├── PluginPitProviderP0.java
│   │                           │   │   ├── PluginPitProviderP1.java
│   │                           │   │   ├── PluginPitProviderP2.java
│   │                           │   │   ├── PluginPitProviderPersist.java
│   │                           │   │   ├── PluginPitProviderUI.java
│   │                           │   │   ├── PluginProviderClient.java
│   │                           │   │   ├── PluginProviderClient2.java
│   │                           │   │   └── PluginProviderHelper.java
│   │                           │   ├── receiver/
│   │                           │   │   ├── PluginReceiverHelper.java
│   │                           │   │   └── PluginReceiverProxy.java
│   │                           │   ├── service/
│   │                           │   │   ├── PluginServiceClient.java
│   │                           │   │   ├── PluginServiceDispatcherManager.java
│   │                           │   │   ├── PluginServiceServerFetcher.java
│   │                           │   │   ├── ServiceDispatcher.java
│   │                           │   │   └── server/
│   │                           │   │       ├── ConnectionBindRecord.java
│   │                           │   │       ├── IntentBindRecord.java
│   │                           │   │       ├── PluginPitService.java
│   │                           │   │       ├── PluginServiceServer.java
│   │                           │   │       ├── ProcessBindRecord.java
│   │                           │   │       ├── ProcessRecord.java
│   │                           │   │       └── ServiceRecord.java
│   │                           │   └── utils/
│   │                           │       ├── ApkCommentReader.java
│   │                           │       ├── IntentMatcherHelper.java
│   │                           │       └── PluginClientHelper.java
│   │                           ├── debugger/
│   │                           │   └── DebuggerReceivers.java
│   │                           ├── ext/
│   │                           │   └── parser/
│   │                           │       ├── AbstractApkParser.java
│   │                           │       ├── ApkParser.java
│   │                           │       ├── exception/
│   │                           │       │   └── ParserException.java
│   │                           │       ├── parser/
│   │                           │       │   ├── BinaryXmlParser.java
│   │                           │       │   ├── StringPoolEntry.java
│   │                           │       │   ├── XmlNamespaces.java
│   │                           │       │   ├── XmlStreamer.java
│   │                           │       │   └── XmlTranslator.java
│   │                           │       ├── struct/
│   │                           │       │   ├── ChunkHeader.java
│   │                           │       │   ├── ChunkType.java
│   │                           │       │   ├── ResourceValue.java
│   │                           │       │   ├── StringPool.java
│   │                           │       │   ├── StringPoolHeader.java
│   │                           │       │   └── xml/
│   │                           │       │       ├── Attribute.java
│   │                           │       │       ├── Attributes.java
│   │                           │       │       ├── NullHeader.java
│   │                           │       │       ├── XmlHeader.java
│   │                           │       │       ├── XmlNamespaceEndTag.java
│   │                           │       │       ├── XmlNamespaceStartTag.java
│   │                           │       │       ├── XmlNodeEndTag.java
│   │                           │       │       ├── XmlNodeHeader.java
│   │                           │       │       ├── XmlNodeStartTag.java
│   │                           │       │       └── XmlResourceMapHeader.java
│   │                           │       └── utils/
│   │                           │           ├── Buffers.java
│   │                           │           ├── ParseUtils.java
│   │                           │           └── xml/
│   │                           │               ├── AggregateTranslator.java
│   │                           │               ├── CharSequenceTranslator.java
│   │                           │               ├── CodePointTranslator.java
│   │                           │               ├── EntityArrays.java
│   │                           │               ├── LookupTranslator.java
│   │                           │               ├── NumericEntityEscaper.java
│   │                           │               ├── UnicodeUnpairedSurrogateRemover.java
│   │                           │               └── XmlEscaper.java
│   │                           ├── helper/
│   │                           │   ├── HostConfigHelper.java
│   │                           │   ├── JSONHelper.java
│   │                           │   ├── LogDebug.java
│   │                           │   └── LogRelease.java
│   │                           ├── model/
│   │                           │   ├── PluginInfo.java
│   │                           │   └── PluginInfoList.java
│   │                           ├── packages/
│   │                           │   ├── PluginFastInstallProvider.java
│   │                           │   ├── PluginFastInstallProviderProxy.java
│   │                           │   ├── PluginInfoUpdater.java
│   │                           │   ├── PluginManagerProxy.java
│   │                           │   ├── PluginManagerServer.java
│   │                           │   ├── PluginPublishFileGenerator.java
│   │                           │   ├── PluginRunningList.java
│   │                           │   └── RePluginInstaller.java
│   │                           └── utils/
│   │                               ├── AssetsUtils.java
│   │                               ├── Charsets.java
│   │                               ├── CloseableUtils.java
│   │                               ├── Dex2OatUtils.java
│   │                               ├── FileUtils.java
│   │                               ├── FixOTranslucentOrientation.java
│   │                               ├── IOUtils.java
│   │                               ├── InterpretDex2OatHelper.java
│   │                               ├── ReflectUtils.java
│   │                               ├── StringBuilderWriter.java
│   │                               ├── Validate.java
│   │                               ├── basic/
│   │                               │   ├── ArrayMap.java
│   │                               │   ├── ArraySet.java
│   │                               │   ├── ByteConvertor.java
│   │                               │   ├── ContainerHelpers.java
│   │                               │   ├── MapCollections.java
│   │                               │   ├── SecurityUtil.java
│   │                               │   └── SimpleArrayMap.java
│   │                               └── pkg/
│   │                                   └── PackageFilesUtil.java
│   └── settings.gradle
├── replugin-plugin-gradle/
│   ├── README.md
│   ├── bintray.gradle
│   ├── build.gradle
│   ├── config.gradle
│   ├── config.properties
│   ├── gradle/
│   │   └── wrapper/
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── gradlew
│   ├── gradlew.bat
│   └── src/
│       └── main/
│           ├── groovy/
│           │   └── com/
│           │       └── qihoo360/
│           │           └── replugin/
│           │               └── gradle/
│           │                   └── plugin/
│           │                       ├── AppConstant.groovy
│           │                       ├── ReClassPlugin.groovy
│           │                       ├── debugger/
│           │                       │   └── PluginDebugger.groovy
│           │                       ├── injector/
│           │                       │   ├── BaseInjector.groovy
│           │                       │   ├── IClassInjector.groovy
│           │                       │   ├── Injectors.groovy
│           │                       │   ├── identifier/
│           │                       │   │   ├── GetIdentifierExprEditor.groovy
│           │                       │   │   └── GetIdentifierInjector.groovy
│           │                       │   ├── loaderactivity/
│           │                       │   │   └── LoaderActivityInjector.groovy
│           │                       │   ├── localbroadcast/
│           │                       │   │   ├── LocalBroadcastExprEditor.groovy
│           │                       │   │   └── LocalBroadcastInjector.groovy
│           │                       │   └── provider/
│           │                       │       ├── ProviderExprEditor.groovy
│           │                       │       ├── ProviderExprEditor2.groovy
│           │                       │       ├── ProviderInjector.groovy
│           │                       │       └── ProviderInjector2.groovy
│           │                       ├── inner/
│           │                       │   ├── ClassFileVisitor.groovy
│           │                       │   ├── CommonData.groovy
│           │                       │   ├── ReClassTransform.groovy
│           │                       │   └── Util.groovy
│           │                       ├── manifest/
│           │                       │   ├── IManifest.groovy
│           │                       │   ├── ManifestAPI.groovy
│           │                       │   └── ManifestReader.groovy
│           │                       └── util/
│           │                           └── CmdUtil.groovy
│           └── resources/
│               └── META-INF/
│                   └── gradle-plugins/
│                       └── replugin-plugin-gradle.properties
├── replugin-plugin-library/
│   ├── README.md
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── gradlew
│   ├── gradlew.bat
│   ├── replugin-plugin-lib/
│   │   ├── bintray.gradle
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   ├── replugin-library-rules.pro
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── aidl/
│   │           │   └── com/
│   │           │       └── qihoo360/
│   │           │           ├── loader2/
│   │           │           │   └── IPlugin.aidl
│   │           │           └── replugin/
│   │           │               └── IBinderGetter.aidl
│   │           └── java/
│   │               └── com/
│   │                   └── qihoo360/
│   │                       └── replugin/
│   │                           ├── Entry.java
│   │                           ├── MethodInvoker.java
│   │                           ├── RePlugin.java
│   │                           ├── RePluginCompat.java
│   │                           ├── RePluginEnv.java
│   │                           ├── RePluginFramework.java
│   │                           ├── RePluginInternal.java
│   │                           ├── RePluginServiceManager.java
│   │                           ├── base/
│   │                           │   └── IPC.java
│   │                           ├── helper/
│   │                           │   ├── JSONHelper.java
│   │                           │   ├── LogDebug.java
│   │                           │   └── LogRelease.java
│   │                           ├── i/
│   │                           │   └── IPluginManager.java
│   │                           ├── loader/
│   │                           │   ├── PluginResource.java
│   │                           │   ├── a/
│   │                           │   │   ├── PluginActivity.java
│   │                           │   │   ├── PluginActivityGroup.java
│   │                           │   │   ├── PluginAppCompatActivity.java
│   │                           │   │   ├── PluginAppCompatXActivity.java
│   │                           │   │   ├── PluginExpandableListActivity.java
│   │                           │   │   ├── PluginFragmentActivity.java
│   │                           │   │   ├── PluginFragmentXActivity.java
│   │                           │   │   ├── PluginListActivity.java
│   │                           │   │   ├── PluginPreferenceActivity.java
│   │                           │   │   └── PluginTabActivity.java
│   │                           │   ├── b/
│   │                           │   │   └── PluginLocalBroadcastManager.java
│   │                           │   ├── p/
│   │                           │   │   └── PluginProviderClient.java
│   │                           │   └── s/
│   │                           │       └── PluginServiceClient.java
│   │                           ├── model/
│   │                           │   └── PluginInfo.java
│   │                           ├── packages/
│   │                           │   └── PluginRunningList.java
│   │                           └── utils/
│   │                               ├── ParcelUtils.java
│   │                               └── ReflectUtils.java
│   └── settings.gradle
├── replugin-sample/
│   ├── README.md
│   ├── host/
│   │   ├── app/
│   │   │   ├── build.gradle
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── AndroidManifest.xml
│   │   │           ├── assets/
│   │   │           │   ├── external/
│   │   │           │   │   └── README
│   │   │           │   └── plugins/
│   │   │           │       ├── demo1.jar
│   │   │           │       ├── demo2.jar
│   │   │           │       └── webview.jar
│   │   │           ├── java/
│   │   │           │   └── com/
│   │   │           │       └── qihoo360/
│   │   │           │           └── replugin/
│   │   │           │               └── sample/
│   │   │           │                   └── host/
│   │   │           │                       ├── FileProvider.java
│   │   │           │                       ├── MainActivity.java
│   │   │           │                       ├── PluginFragmentActivity.java
│   │   │           │                       ├── SampleApplication.java
│   │   │           │                       └── TimeUtils.java
│   │   │           └── res/
│   │   │               ├── layout/
│   │   │               │   ├── activity_main.xml
│   │   │               │   └── activity_plugin_fragment.xml
│   │   │               ├── values/
│   │   │               │   ├── colors.xml
│   │   │               │   ├── public.xml
│   │   │               │   ├── strings.xml
│   │   │               │   └── styles.xml
│   │   │               └── xml/
│   │   │                   └── fileprovider_path.xml
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   └── settings.gradle
│   └── plugin/
│       ├── plugin-demo1/
│       │   ├── README.md
│       │   ├── app/
│       │   │   ├── build.gradle
│       │   │   ├── case.gradle
│       │   │   ├── proguard-rules.pro
│       │   │   └── src/
│       │   │       └── main/
│       │   │           ├── AndroidManifest.xml
│       │   │           ├── aidl/
│       │   │           │   └── com/
│       │   │           │       └── qihoo360/
│       │   │           │           └── replugin/
│       │   │           │               └── sample/
│       │   │           │                   └── demo2/
│       │   │           │                       └── IDemo2.aidl
│       │   │           ├── java/
│       │   │           │   └── com/
│       │   │           │       └── qihoo360/
│       │   │           │           └── replugin/
│       │   │           │               └── sample/
│       │   │           │                   └── demo1/
│       │   │           │                       ├── BaseActivity.java
│       │   │           │                       ├── LibMainActivity.java
│       │   │           │                       ├── MainActivity.java
│       │   │           │                       ├── MainApp.java
│       │   │           │                       ├── TestItem.java
│       │   │           │                       ├── TimeUtils.java
│       │   │           │                       ├── activity/
│       │   │           │                       │   ├── file_provider/
│       │   │           │                       │   │   ├── BitmapUtils.java
│       │   │           │                       │   │   └── FileProviderActivity.java
│       │   │           │                       │   ├── for_result/
│       │   │           │                       │   │   └── ForResultActivity.java
│       │   │           │                       │   ├── intent_filter/
│       │   │           │                       │   │   └── IntentFilterDemoActivity1.java
│       │   │           │                       │   ├── notify_test/
│       │   │           │                       │   │   └── NotifyActivity.java
│       │   │           │                       │   ├── preference/
│       │   │           │                       │   │   ├── PrefActivity1.java
│       │   │           │                       │   │   └── PrefActivity2.java
│       │   │           │                       │   ├── single_instance/
│       │   │           │                       │   │   └── TIActivity1.java
│       │   │           │                       │   ├── single_top/
│       │   │           │                       │   │   └── SingleTopActivity1.java
│       │   │           │                       │   ├── standard/
│       │   │           │                       │   │   └── StandardActivity.java
│       │   │           │                       │   ├── task_affinity/
│       │   │           │                       │   │   ├── TAActivity1.java
│       │   │           │                       │   │   ├── TAActivity2.java
│       │   │           │                       │   │   ├── TAActivity3.java
│       │   │           │                       │   │   ├── TAActivity4.java
│       │   │           │                       │   │   └── package-info.java
│       │   │           │                       │   ├── task_affinity_2/
│       │   │           │                       │   │   ├── TA2Activity1.java
│       │   │           │                       │   │   ├── TA2Activity2.java
│       │   │           │                       │   │   ├── TA2Activity3.java
│       │   │           │                       │   │   ├── TA2Activity4.java
│       │   │           │                       │   │   └── package-info.java
│       │   │           │                       │   ├── theme/
│       │   │           │                       │   │   ├── ThemeBlackNoTitleBarActivity.java
│       │   │           │                       │   │   ├── ThemeBlackNoTitleBarFullscreenActivity.java
│       │   │           │                       │   │   └── ThemeDialogActivity.java
│       │   │           │                       │   └── webview/
│       │   │           │                       │       └── WebViewActivity.java
│       │   │           │                       ├── fragment/
│       │   │           │                       │   ├── DemoCodeFragment.java
│       │   │           │                       │   └── DemoFragment.java
│       │   │           │                       ├── provider/
│       │   │           │                       │   ├── FileProvider.java
│       │   │           │                       │   └── Provider2.java
│       │   │           │                       ├── receivers/
│       │   │           │                       │   └── PluginDemo1Receiver.java
│       │   │           │                       ├── service/
│       │   │           │                       │   ├── PluginDemoAppService.java
│       │   │           │                       │   ├── PluginDemoService1.java
│       │   │           │                       │   └── PluginDemoService2.java
│       │   │           │                       ├── support/
│       │   │           │                       │   ├── LogX.java
│       │   │           │                       │   └── NotifyUtils.java
│       │   │           │                       └── webview/
│       │   │           │                           ├── IWebPage.java
│       │   │           │                           ├── ViewProxy.java
│       │   │           │                           └── WebPageProxy.java
│       │   │           └── res/
│       │   │               ├── layout/
│       │   │               │   ├── content_lib_main.xml
│       │   │               │   ├── layout_notify.xml
│       │   │               │   ├── lib_activity_main.xml
│       │   │               │   ├── main.xml
│       │   │               │   ├── main_fragment.xml
│       │   │               │   ├── simple.xml
│       │   │               │   ├── simple_2.xml
│       │   │               │   └── simple_4.xml
│       │   │               ├── values/
│       │   │               │   └── strings.xml
│       │   │               └── xml/
│       │   │                   ├── fileprovider_path.xml
│       │   │                   └── pref_headers.xml
│       │   ├── build.gradle
│       │   ├── gradle/
│       │   │   └── wrapper/
│       │   │       ├── gradle-wrapper.jar
│       │   │       └── gradle-wrapper.properties
│       │   ├── gradle.properties
│       │   ├── gradlew
│       │   ├── gradlew.bat
│       │   └── settings.gradle
│       ├── plugin-demo2/
│       │   ├── README.md
│       │   ├── app/
│       │   │   ├── build.gradle
│       │   │   ├── case.gradle
│       │   │   ├── proguard-rules.pro
│       │   │   └── src/
│       │   │       └── main/
│       │   │           ├── AndroidManifest.xml
│       │   │           ├── aidl/
│       │   │           │   └── com/
│       │   │           │       └── qihoo360/
│       │   │           │           └── replugin/
│       │   │           │               └── sample/
│       │   │           │                   └── demo2/
│       │   │           │                       └── IDemo2.aidl
│       │   │           ├── java/
│       │   │           │   └── com/
│       │   │           │       └── qihoo360/
│       │   │           │           └── replugin/
│       │   │           │               └── sample/
│       │   │           │                   └── demo2/
│       │   │           │                       ├── Demo2Impl.java
│       │   │           │                       ├── MainActivity.java
│       │   │           │                       ├── MainApp.java
│       │   │           │                       ├── activity/
│       │   │           │                       │   ├── appcompat/
│       │   │           │                       │   │   └── AppCompatActivityDemo.java
│       │   │           │                       │   └── for_result/
│       │   │           │                       │       └── ForResultActivity.java
│       │   │           │                       ├── databinding/
│       │   │           │                       │   ├── DataBindingActivity.java
│       │   │           │                       │   └── Entry.java
│       │   │           │                       ├── receivers/
│       │   │           │                       │   └── PluginDemo2Receiver.java
│       │   │           │                       ├── service/
│       │   │           │                       │   └── PluginDemo2Service.java
│       │   │           │                       ├── support/
│       │   │           │                       │   └── LogX.java
│       │   │           │                       └── testcase/
│       │   │           │                           └── TestMultiDex.java
│       │   │           └── res/
│       │   │               ├── layout/
│       │   │               │   ├── databinding_test.xml
│       │   │               │   └── from_demo1.xml
│       │   │               └── values/
│       │   │                   └── strings.xml
│       │   ├── build.gradle
│       │   ├── gradle/
│       │   │   └── wrapper/
│       │   │       ├── gradle-wrapper.jar
│       │   │       └── gradle-wrapper.properties
│       │   ├── gradle.properties
│       │   ├── gradlew
│       │   ├── gradlew.bat
│       │   └── settings.gradle
│       ├── plugin-demo3-kotlin/
│       │   ├── README.md
│       │   ├── app/
│       │   │   ├── build.gradle
│       │   │   ├── proguard-rules.pro
│       │   │   └── src/
│       │   │       └── main/
│       │   │           ├── AndroidManifest.xml
│       │   │           ├── aidl/
│       │   │           │   └── com/
│       │   │           │       └── qihoo360/
│       │   │           │           └── replugin/
│       │   │           │               └── sample/
│       │   │           │                   └── demo2/
│       │   │           │                       └── IDemo2.aidl
│       │   │           ├── java/
│       │   │           │   └── com/
│       │   │           │       └── qihoo360/
│       │   │           │           └── replugin/
│       │   │           │               └── sample/
│       │   │           │                   └── demo3/
│       │   │           │                       ├── BaseActivity.kt
│       │   │           │                       ├── MainActivity.kt
│       │   │           │                       ├── MainApp.kt
│       │   │           │                       ├── TestItem.kt
│       │   │           │                       ├── activity/
│       │   │           │                       │   └── theme/
│       │   │           │                       │       └── ThemeBlackNoTitleBarActivity.kt
│       │   │           │                       ├── receivers/
│       │   │           │                       │   └── PluginDemo3Receiver.kt
│       │   │           │                       ├── service/
│       │   │           │                       │   └── PluginDemoService1.kt
│       │   │           │                       └── support/
│       │   │           │                           └── LogX.kt
│       │   │           └── res/
│       │   │               ├── layout/
│       │   │               │   ├── main.xml
│       │   │               │   ├── main_fragment.xml
│       │   │               │   └── simple.xml
│       │   │               └── values/
│       │   │                   └── strings.xml
│       │   ├── build.gradle
│       │   ├── gradle/
│       │   │   └── wrapper/
│       │   │       ├── gradle-wrapper.jar
│       │   │       └── gradle-wrapper.properties
│       │   ├── gradle.properties
│       │   ├── gradlew
│       │   ├── gradlew.bat
│       │   └── settings.gradle
│       └── plugin-webview/
│           ├── README.md
│           ├── app/
│           │   ├── build.gradle
│           │   ├── proguard-rules.pro
│           │   └── src/
│           │       └── main/
│           │           ├── AndroidManifest.xml
│           │           ├── java/
│           │           │   └── com/
│           │           │       └── qihoo360/
│           │           │           └── replugin/
│           │           │               └── sample/
│           │           │                   └── webview/
│           │           │                       ├── MainActivity.java
│           │           │                       ├── MainApp.java
│           │           │                       ├── common/
│           │           │                       │   ├── CommonWebChromeClient.java
│           │           │                       │   ├── CommonWebView.java
│           │           │                       │   └── CommonWebViewClient.java
│           │           │                       ├── env/
│           │           │                       │   └── Env.java
│           │           │                       ├── utils/
│           │           │                       │   ├── ReflectUtil.java
│           │           │                       │   └── WebViewResourceHelper.java
│           │           │                       └── views/
│           │           │                           ├── SimpleWebPage.java
│           │           │                           └── SimpleWebView.java
│           │           └── res/
│           │               ├── layout/
│           │               │   ├── web_page.xml
│           │               │   └── webview.xml
│           │               └── values/
│           │                   ├── colors.xml
│           │                   └── strings.xml
│           ├── build.gradle
│           ├── gradle/
│           │   └── wrapper/
│           │       ├── gradle-wrapper.jar
│           │       └── gradle-wrapper.properties
│           ├── gradle.properties
│           ├── gradlew
│           ├── gradlew.bat
│           └── settings.gradle
├── replugin-sample-extra/
│   ├── README.md
│   └── fresco/
│       ├── FrescoHost/
│       │   ├── .gitignore
│       │   ├── app/
│       │   │   ├── .gitignore
│       │   │   ├── build.gradle
│       │   │   ├── libs/
│       │   │   │   ├── drawee-modified-1.7.1.jar
│       │   │   │   ├── fbcore-1.7.1.jar
│       │   │   │   ├── fresco-1.7.1.jar
│       │   │   │   ├── imagepipeline-1.7.1.jar
│       │   │   │   └── imagepipeline-base-1.7.1.jar
│       │   │   ├── proguard-rules.pro
│       │   │   └── src/
│       │   │       └── main/
│       │   │           ├── AndroidManifest.xml
│       │   │           ├── assets/
│       │   │           │   └── plugins/
│       │   │           │       └── plugin1.jar
│       │   │           ├── java/
│       │   │           │   └── com/
│       │   │           │       ├── facebook/
│       │   │           │       │   └── fresco/
│       │   │           │       │       └── patch/
│       │   │           │       │           ├── DraweeStyleableCallbackImpl.java
│       │   │           │       │           └── FrescoPatch.java
│       │   │           │       └── qihoo360/
│       │   │           │           └── replugin/
│       │   │           │               └── fresco/
│       │   │           │                   └── host/
│       │   │           │                       ├── HostApp.java
│       │   │           │                       ├── HostFrescoActivity.java
│       │   │           │                       └── MainActivity.java
│       │   │           └── res/
│       │   │               ├── layout/
│       │   │               │   ├── activity_host_fresco.xml
│       │   │               │   └── activity_main.xml
│       │   │               └── values/
│       │   │                   ├── attrs.xml
│       │   │                   ├── colors.xml
│       │   │                   ├── strings.xml
│       │   │                   └── styles.xml
│       │   ├── build.gradle
│       │   ├── gradle/
│       │   │   └── wrapper/
│       │   │       ├── gradle-wrapper.jar
│       │   │       └── gradle-wrapper.properties
│       │   ├── gradle.properties
│       │   ├── gradlew
│       │   ├── gradlew.bat
│       │   └── settings.gradle
│       └── FrescoPlugin/
│           ├── .gitignore
│           ├── app/
│           │   ├── .gitignore
│           │   ├── build.gradle
│           │   ├── libs/
│           │   │   ├── drawee-modified-1.7.1.jar
│           │   │   ├── fbcore-1.7.1.jar
│           │   │   ├── fresco-1.7.1.jar
│           │   │   ├── imagepipeline-1.7.1.jar
│           │   │   └── imagepipeline-base-1.7.1.jar
│           │   ├── proguard-rules.pro
│           │   └── src/
│           │       └── main/
│           │           ├── AndroidManifest.xml
│           │           ├── java/
│           │           │   └── com/
│           │           │       ├── facebook/
│           │           │       │   └── fresco/
│           │           │       │       └── patch/
│           │           │       │           ├── DraweeStyleableCallbackImpl.java
│           │           │       │           └── FrescoPatch.java
│           │           │       └── qihoo360/
│           │           │           └── replugin/
│           │           │               └── fresco/
│           │           │                   └── plugin/
│           │           │                       ├── MainActivity.java
│           │           │                       └── PluginApp.java
│           │           └── res/
│           │               ├── layout/
│           │               │   └── activity_main.xml
│           │               └── values/
│           │                   ├── attrs.xml
│           │                   ├── colors.xml
│           │                   ├── strings.xml
│           │                   └── styles.xml
│           ├── build.gradle
│           ├── gradle/
│           │   └── wrapper/
│           │       ├── gradle-wrapper.jar
│           │       └── gradle-wrapper.properties
│           ├── gradle.properties
│           ├── gradlew
│           ├── gradlew.bat
│           └── settings.gradle
├── rp-config.gradle
└── rp-publish.gradle

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

================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
#### 问题详细描述 Detailed description of the problem


#### 复现问题步骤 Steps to reproduce the problem
1. 
2. 

#### 其它重要信息 Other important information

replugin-host-lib/gradle Version:
rePlugin-plugin-lib/gradle Version:

Android API Version:
Android 手机型号&ROM(Phone model & ROM): 

#### Logcat上下文 Logcat context


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
#### 要解决的问题 Describe the problem to be solved
1.
2.

#### 要解决的Issue编号(可多个) Associated issue number (multiple)
#

================================================
FILE: .gitignore
================================================
# --------
# Git Global Ignores
# Power By github/gitignore (License: CC0 1.0)
# Collect by RePlugin Team
# --------


# --------
# Android
# https://github.com/github/gitignore/blob/master/Android.gitignore
# Date: 17 Feb 2017
# --------

# Built application files
*.apk
*.ap_

# Files for the ART/Dalvik VM
*.dex

# Java class files
*.class

# Generated files
bin/
gen/
out/

# Gradle files
.gradle/
build/

# Local configuration file (sdk path, etc)
local.properties

# Proguard folder generated by Eclipse
proguard/

# Log Files
*.log

# Android Studio Navigation editor temp files
.navigation/

# Android Studio captures folder
captures/

# Intellij
*.iml
.idea

# Keystore files
*.jks

# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild

# Google Services (e.g. APIs or Firebase)
google-services.json

# Freeline
freeline.py
freeline/
freeline_project_description.json


# --------
# Gradle
# https://raw.githubusercontent.com/github/gitignore/master/Gradle.gitignore
# Date: 25 Jun 2016
# --------

.gradle
/build/

# Ignore Gradle GUI config
gradle-app.setting

# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
!gradle-wrapper.jar

# Cache of project
.gradletasknamecache

# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898
# gradle/wrapper/gradle-wrapper.properties


# --------
# Eclipse
# https://github.com/github/gitignore/blob/master/Global/Eclipse.gitignore
# Date: 28 Mar 2017
# --------

.metadata
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.settings/
.loadpath
.recommenders

# External tool builders
.externalToolBuilders/

# Locally stored "Eclipse launch configurations"
*.launch

# PyDev specific (Python IDE for Eclipse)
*.pydevproject

# CDT-specific (C/C++ Development Tooling)
.cproject

# Java annotation processor (APT)
.factorypath

# PDT-specific (PHP Development Tools)
.buildpath

# sbteclipse plugin
.target

# Tern plugin
.tern-project

# TeXlipse plugin
.texlipse

# STS (Spring Tool Suite)
.springBeans

# Code Recommenders
.recommenders/

# Scala IDE specific (Scala & Java development for Eclipse)
.cache-main
.scala_dependencies
.worksheet

# --------
# Windows
# https://github.com/github/gitignore/blob/master/Global/Windows.gitignore
# Date: 10 May 2017
# --------

# Windows thumbnail cache files
Thumbs.db
ehthumbs.db
ehthumbs_vista.db

# Dump file
*.stackdump

# Folder config file
Desktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Windows Installer files
*.cab
*.msi
*.msm
*.msp

# Windows shortcuts
*.lnk

# --------
# Linux
# https://github.com/github/gitignore/blob/master/Global/Linux.gitignore
# --------

*~

# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*

# KDE directory preferences
.directory

# Linux trash folder which might appear on any partition or disk
.Trash-*

# .nfs files are created when an open file is removed but is still being accessed
.nfs*

# --------
# Mac OS
# https://github.com/github/gitignore/blob/master/Global/macOS.gitignore
# Date: 01 Apr 2017
# --------
# General
*.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon


# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

# --------
# Tortoise Git
# Author: RePlugin Team
# Date: 20 Dec 2016
# --------
# Project-level settings
/.tgitconfig

================================================
FILE: CONTRIBUTING.md
================================================
欢迎关注和使用RePlugin。为了让解决问题、贡献代码的效率更高,请务必按照下面流程来做。

## 有关Issue

如果遇到接入上的问题,请随时提出**【有效的】**Issue。

#### 如果是问题反馈

> 出于效率考虑,请**务必按照 Issue模板 所列来完整的填写反馈**(我们已自动帮您建立模板,您在写新Issue时会有,您也可以[点击此处查看模板内容](https://github.com/Qihoo360/RePlugin/blob/dev/.github/ISSUE_TEMPLATE.md))
> 
> 注意:**未按照模板填写,且不能帮助我们定位问题的,我们将其标记为“Invalid”,并直接关闭,不会进一步问询。直到按照完整模板填写后,再行Reopen**。
> 
> 此外,我们都希望提出的问题是**“高质量的”**。因此,请[点击此处阅读《提出Issue》](https://github.com/Qihoo360/RePlugin/wiki/%E6%8F%90%E5%87%BAIssue)一文,来详细了解提交Issue的最佳实践,帮助更快的解决您遇到的问题。

#### 如果是意见和建议

我们的Issue模板只针对“问题反馈”而设计。而若您在RePlugin中有一些新的想法想讨论的话,可“无需按照Issue模板”来提,但请留意:

1. 请尽量将您的建议、提出建议的原因等描述清楚。不要只写个标题(除非这个标题让人一看就全懂)
2. 如果可能,请尽可能发动所有牛人的力量,共同参与讨论,并由社区(尤其是您自己)提出Pull Request,帮助所有人解决问题
3. 我们(以及社区大牛)会对您提的建议做评估,并将其贴上标签并待完成。有些建议虽然很好,但由于时间和精力关系,可能不会很快实现,对此我们不能、也不会承诺最终时间。

如果提出的Issue是“模棱两可”、无法看懂的,在一次回复没有答复后,我们可能将其标记为Invalid,并直接关闭。还请理解。

## 有关 Pull Request

当然,和Issue相比,我们非常欢迎您研究RePlugin的源码,发现相应的问题和改善方案,并提交自己的Pull Request。**高质量的PR将有助于打造自己的技术品牌,好处很多**。

在提出Pull Request之前,**建议请先提下Issue,这样可以在编写代码前,和大家做较为充分的讨论**,以免在后期出现“大量修改”的情况。

> 有关如何完成一个“高质量”的Pull Request,请[点击此处阅读《贡献力量》](https://github.com/Qihoo360/RePlugin/wiki/%E8%B4%A1%E7%8C%AE%E5%8A%9B%E9%87%8F)一文了解更多。

> 如果想知道哪些“牛人”为RePlugin做出了杰出贡献,请[点击此处阅读《金牌贡献者》](https://github.com/Qihoo360/RePlugin/wiki/%E9%87%91%E7%89%8C%E8%B4%A1%E7%8C%AE%E8%80%85),看看哪些您熟知的人也在其中。


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "{}"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright (C) 2005-2017 Qihoo 360 Inc.

   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

       http://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.

================================================
FILE: README.md
================================================
<p align="center">
  <a href="https://github.com/Qihoo360/RePlugin/wiki">
    <img alt="RePlugin Logo" src="https://github.com/Qihoo360/RePlugin/wiki/img/RePlugin.png" width="400"/>
  </a>
</p>

[![license](http://img.shields.io/badge/license-Apache2.0-brightgreen.svg?style=flat)](https://github.com/Qihoo360/RePlugin/blob/master/LICENSE)

[![Release Version](https://img.shields.io/badge/release-2.3.3-brightgreen.svg)](https://github.com/Qihoo360/RePlugin/releases)

## !!!重要通知!!!

由于jcenter停服原因,RePlugin将迁移到http://maven.geelib.360.cn/nexus上

如果需要继续接入RePlugin,需要在项目的build.gradle内增加新的仓库地址:

maven {url "http://maven.geelib.360.cn/nexus/repository/replugin/"}


## 通知


**360开源又一力作——[ArgusAPM移动性能监控平台](https://github.com/Qihoo360/ArgusAPM)**

[ArgusAPM](https://github.com/Qihoo360/ArgusAPM)是360手机卫士客户端团队继RePlugin之后开源的又一个重量级开源项目。ArgusAPM是360移动端产品使用的可视化性能监控平台,为移动端APP提供性能监控与管理,可以迅速发现和定位各类APP性能和使用问题,帮助APP不断的提升用户体验。


**360移动技术最新活动通知:**

2018年12月16日,360移动性能开放日邀您参加,届时将会有360、美团技术大牛为大家分享Android、iOS性能监控实践。
欢迎报名参加,戳戳戳!!!-->https://mp.weixin.qq.com/s/-7DCnXI_EBMBwYG_PUuUDg

## RePlugin —— A flexible, stable, easy-to-use Android Plug-in Framework

RePlugin is a complete Android plug-in solution which is suitable for general use.

([文档,还是中文的好](./README_CN.md))

It is major strengths are:
* **Extreme flexibility**: Apps do not need to be upgraded to support new components, **even brand new plug-ins**.
* **Extraordinary stability**: With only **ONE** hook (ClassLoader), **NO BINDER HOOK**. RePlugin’s Crash ratio is **as low as Ten thousandth (0.01%)**. In addition, RePlugin is compatible with almost **ALL Android ROMs** in the market.
* **Rich features**: RePlugin supports **almost all features seamlessly as an installed application**, including static Receiver, Task-Affinity, user-defined Theme, AppCompat, DataBinding, etc.
* **Easy integration**: It takes only couple lines to access, whether plug-ins or main programs. 
* **Mature management**: RePlugin owns stable plug-in management solution which supports installation, upgrade, uninstallation and version management. Process communication, protocol versions and security check are also included. 
* **Hundreds of millions support**: RePlugin possesses **hundreds of millions users from 360 MobileSafe.** After more than three-year verification, we guarantee the solution that Apps use is the most stable and suitable.

By the end of June 2017, RePlugin has already made some achievements:

| Feature | Achievement |
|:-------------:|:-------------:|
| **Plug-in Number** | **103** |
| **Ratio of plug-ins to applications** | **83%** |
| **Version released pre year** | **596** |
| **Crash** | **0.01%, Extraordinary stability** |
| **First Release** | **2014** |

At present, almost **all Apps with hundreds of millions users from 360, and many mainstream third-party Apps, are using RePlugin solution**. 

### We support:

| Feature | Description |
|:-------------:|:-------------:|
| Components | **Activity, Service, Provider, Receiver(Including static)** |
| Not need to upgrade when brand a new Plug-in | **Supported** |
| Android Feature | **Supported almost all features** |
| TaskAffinity & Multi-Process | **Perfect supported!** |
| Support Plug-in Type | **Built-in (Only Two Step) and External(Download)** |
| Plug-in Coupling | **Binder, Class Loader, Resources, etc.** |
| Interprocess communication | **Sync, Async, Binder and Cross-plug-in broadcast** |
| User-Defined Theme & AppComat | **Supported** |
| DataBinding | **Supported** |
| Safety check when installed | **Supported** |
| Resources Solution | **Independent Resources + Context pass(No Adaptation ROM)** |
| Android Version | **API Level 9 (Android 2.3 and above)** |

## Our Vision
Make RePlugin be used in all kinds of ordinary Apps; and provide stable, flexible, liberal plug-ins which adopt for both large and small projects.

## Latest features
Solved the Android P (Android 9.0) related adaptation issues, fully support the official version of Android P (Android 9.0).

## RePlugin Architecture

<p align="center">
  <a href="https://github.com/Qihoo360/RePlugin/wiki">
    <img alt="RePlugin Framework" src="https://github.com/Qihoo360/RePlugin/wiki/img/RePluginFramePic.jpeg" height="600" />
  </a>
</p>

## How to Use RePlugin
Using RePlugin is very simple. Under most conditions, using it is no different than developing an App.

If you are **the first-time user, please [click here to read Quick Start Guide(Chinese Version)](https://github.com/Qihoo360/RePlugin/wiki/%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B).** Following our guide, you will learn more about RePlugin.

If you wish to **learn more gameplays about RePlugin, please [click here to read Step-by-step Tutorial(Chinese Version)](https://github.com/Qihoo360/RePlugin/wiki/%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B)**.

If you want to **view RePlugin’s sample project, and learn concrete usage of the frame, please [click here to check Sample SC](https://github.com/Qihoo360/RePlugin/blob/master/replugin-sample)**.

If you **have any question, please [click here to read FAQ(Chinese Version)](https://github.com/Qihoo360/RePlugin/wiki/FAQ)**.


## These apps are using RePlugin

<table align="center">
    <tr align="center">
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/mobilesafe.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/appstore.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/browser.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/camera.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/clean.png" width="80" height="80"/></td>
    </tr>
    <tr align="center">
        <td><b><a href="https://shouji.360.cn/index.html">360 Mobile Safe</a></b></td>
        <td><b><a href="http://sj.360.cn/index.html">360 App Store</a></b></td>
        <td><b><a href="http://mse.360.cn/m/index.html">360 Mobile Browser</a></b></td>
        <td><b><a href="http://xj.huajiao.com/xji/home/pc">HuaJiao Camera</a></b></td>
        <td><b><a href="https://shouji.360.cn/360cleandroid/index.html">360 Clean Master</a></b></td>
    </tr>
    <tr align="center">
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/movie.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/jieqianba.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/haitao1hao.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/huaruntong.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/jielema.png" width="80" height="80"/></td>
    </tr>
    <tr align="center">
        <td><b><a href="http://www.360kan.com/appdownload">360 Kan Movie</a></b></td>
        <td><b><a href="">JieQianBa</a></b></td>
        <td><b><a href="http://www.1haitao.com/">1 HaiTao</a></b></td>
        <td><b><a href="http://www.huaruntong.com/">HuaRun Tong</a></b></td>
        <td><b><a href="http://www.jielem.com/">JieLeMa</a></b></td>
    </tr>
    <tr align="center">
        <td><img src="https://raw.githubusercontent.com/wiki/Qihoo360/RePlugin/img/apps/qihoo_os.jpg" width="80" height="80"/></td>
        <td><img src="https://raw.githubusercontent.com/wiki/Qihoo360/RePlugin/img/apps/qihoo_jietiao.jpg" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/yourapps.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/yourapps.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/yourapps.png" width="80" height="80"/></td>
    </tr>
    <tr align="center">
        <td><b><a href="http://www.qiku.com/product/360os2/index.html">360OS App</a></b></td>
        <td><b><a href="https://www.360jie.com.cn/">360 Loan</a></b></td>
        <td><b><a href="">(Internal App)</a></b></td>
        <td><b><a href="">(Internal App)</a></b></td>
        <td><b><a href="">(Internal App)</a></b></td>
    </tr>
</table>

## Plug-ins Accessed in RePlugin

For your reference, plug-ins accessed can be classified into following categories: 

* **Expo plug-ins**: Safe Home Page, physical examination, information flow, etc. 
* **Business plug-ins**: cleaning, disturbance intercept, floating window, etc.
* **Cooperation plug-ins**: App Lock, free Wi-Fi, security desktop, etc.
* **Background plug-ins**: Push, service management, Protobuf, etc.
* **Base plug-ins**: Security WebView, share, location service, etc.

By the end of June 2017, we already have 102 plug-ins like these. We look forward to you becoming a part of RePlugin family!

## Contribute Your Share
We sincerely welcome and appreciate your contribution of any kind. You can submit code, raise suggestions, write documentation, etc. For more information, please [click here to read Contribute Your Share(Chinese Version)](https://github.com/Qihoo360/RePlugin/wiki/%E8%B4%A1%E7%8C%AE%E5%8A%9B%E9%87%8F).


## License

RePlugin is [Apache v2.0 licensed](./LICENSE).

(Thanks Xiezihan(谢子晗) for providing the translations.)


================================================
FILE: README_CN.md
================================================
<p align="center">
  <a href="https://github.com/Qihoo360/RePlugin/wiki">
    <img alt="RePlugin Logo" src="https://github.com/Qihoo360/RePlugin/wiki/img/RePlugin.png" width="400"/>
  </a>
</p>

[![license](http://img.shields.io/badge/license-Apache2.0-brightgreen.svg?style=flat)](https://github.com/Qihoo360/RePlugin/blob/master/LICENSE)

[![Release Version](https://img.shields.io/badge/release-2.3.3-brightgreen.svg)](https://github.com/Qihoo360/RePlugin/releases)

## 通知

**360开源又一力作——[ArgusAPM移动性能监控平台](https://github.com/Qihoo360/ArgusAPM)**

[ArgusAPM](https://github.com/Qihoo360/ArgusAPM)是360手机卫士客户端团队继RePlugin之后开源的又一个重量级开源项目。ArgusAPM是360移动端产品使用的可视化性能监控平台,为移动端APP提供性能监控与管理,可以迅速发现和定位各类APP性能和使用问题,帮助APP不断的提升用户体验。


**360移动技术最新活动通知:**

2018年12月16日,360移动性能开放日邀您参加,届时将会有360、美团技术大牛为大家分享Android、iOS性能监控实践。
欢迎报名参加,戳戳戳!!!-->https://mp.weixin.qq.com/s/-7DCnXI_EBMBwYG_PUuUDg

## RePlugin —— 历经三年多考验,数亿设备使用的,稳定占坑类插件化方案

RePlugin是一套完整的、稳定的、适合全面使用的,占坑类插件化方案,由360手机卫士的RePlugin Team研发,也是业内首个提出”全面插件化“(全面特性、全面兼容、全面使用)的方案。

其主要优势有:
* **极其灵活**:主程序无需升级(无需在Manifest中预埋组件),即可支持新增的四大组件,甚至全新的插件
* **非常稳定**:Hook点**仅有一处(ClassLoader),无任何Binder Hook**!如此可做到其**崩溃率仅为“万分之一”,并完美兼容市面上近乎所有的Android ROM**
* **特性丰富**:支持近乎所有在“单品”开发时的特性。**包括静态Receiver、Task-Affinity坑位、自定义Theme、进程坑位、AppCompat、DataBinding等**
* **易于集成**:无论插件还是主程序,**只需“数行”就能完成接入**
* **管理成熟**:拥有成熟稳定的“插件管理方案”,支持插件安装、升级、卸载、版本管理,甚至包括进程通讯、协议版本、安全校验等
* **数亿支撑**:有360手机卫士庞大的**数亿**用户做支撑,**三年多的残酷验证**,确保App用到的方案是最稳定、最适合使用的

截止2017年6月底,RePlugin的:

| 特性 | 描述 |
|:-------------:|:-------------:|
| **插件数** | **103(核心57个)** |
| **插件占应用比** | **高达83%** |
| **年发版次数** | **高达596次(工作日均2次)** |
| **崩溃率** | **万分之一(0.01%),极低** |
| **时间** | **2014年应用,3年验证** |

目前360公司几乎**所有的亿级用户量的APP**,以及多款主流第三方APP,都采用了RePlugin方案。

有关RePlugin的详细介绍,请[点击这里阅读《RePlugin 官方 WiKi》](https://github.com/Qihoo360/RePlugin/wiki)。

### 我们还支持以下特性

| 特性 | 描述 |
|:-------------:|:-------------:|
| 组件 | **四大组件(含静态Receiver)** |
| 升级无需改主程序Manifest | **完美支持** |
| Android特性 | **支持近乎所有(包括SO库等)** |
| TaskAffinity & 多进程 | **支持(*坑位方案*)** |
| 插件类型 | **支持自带插件(*自识别*)、外置插件** |
| 插件间耦合 | **支持Binder、Class Loader、资源等** |
| 进程间通讯 | **支持同步、异步、Binder、广播等** |
| 自定义Theme & AppComat | **支持** |
| DataBinding | **支持** |
| 安全校验 | **支持** |
| 资源方案 | **独立资源 + Context传递(相对稳定)** |
| Android 版本 | **API Level 9+ (2.3及以上)** |

## 愿景

让插件化能**飞入寻常应用家**,做到稳定、灵活、自由,大小项目兼用。

## 最新特性

解决了Android P(Android 9.0)相关适配问题,全面支持Android P(Android 9.0)正式版。

## RePlugin 架构图

<p align="center">
  <a href="https://github.com/Qihoo360/RePlugin/wiki">
    <img alt="RePlugin Framework" src="https://github.com/Qihoo360/RePlugin/wiki/img/RePluginFramePic.jpeg" height="600" />
  </a>
</p>

以360手机卫士为例:

* **系统层——Android**:为Android Framework层。**只有ClassLoader是Hook的**,而AMS、Resources等都没有做Hook,确保了其稳定性。
* **框架层——RePlugin框架**:RePlugin框架层,**只有RePlugin是对“上层完全公开”的**,其余均为Internal,或“动态编译方案”生效后的调用,对开发者而言是“无需关心”的。
* **插件层——各插件**:“标蓝部分”是各插件,包括大部分的业务插件(如体检、清理、桌面插件等)。而其中“标黄部分”是支撑一个应用的各种基础插件,如WebView、Download、Share,甚至Protobuf都能成为基础插件。

## 使用方法

RePlugin的使用方法非常简单,大部分情况下和“单品”开发无异。

若您是**第一次接触RePlugin,则[请点击这里阅读《快速上手》](https://github.com/Qihoo360/RePlugin/wiki/%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B)**,跟随我们的指引,了解更多的内容。

若您想**了解更多有关RePlugin的玩法,则[请点击这里阅读《详细教程》](https://github.com/Qihoo360/RePlugin/wiki/%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B)**,了解更多好玩的玩法。

若您想**看下RePlugin的Sample工程,进而了解框架的具体用法,则[请点击这里查看Sample源代码](https://github.com/Qihoo360/RePlugin/blob/master/replugin-sample)**。

若您在接入RePlugin中**遇到了任何问题,则[请点击这里阅读《FAQ》](https://github.com/Qihoo360/RePlugin/wiki/FAQ)**,相信会有您想要的答案。

## 插件管理服务—与RePlugin配套的插件管理、下发、统计服务

至今为止有数不清的用户联系我们让做配套的插件管理功能,所以 RePlugin 团队联合 360 Web 平台部,合力推出 RePlugin 插件管理服务,再次大幅降低了用户使用RePlugin的门槛,插件管理服务功能介绍如下:

* **插件版本管理**:对APK插件包名、别名和版本号的交集限制,防止下发出错。

* **打点统计**:上报即显示下发量、下载量、安装量和错误量数据。

* **升版管理**:严格要求用户新建下发任务为面向虚拟用户或部分真实用户的“测试版”下发任务(适用于内测、AB和灰度),测试没问题以后才能切换到面对所有真实用户的“线上版”下发任务,防止出错。

* **下发限速**:开发者可自定义自己想要的插件下发速度。

* **运营商和厂商限制**:开发者可自定义自己想下发的运营商和目标终端厂商。

* **灵活的下发条件设置**:根据用户群体对下发条件的要求程度,我们提供了4种条件设置功能,对下发条件要求不高的用户可直接使用便捷条件下发(包括按人数和指定设备下发);对下发条件要求高的用户可使用自定义条件下发(包括文字条件编辑器和代码条件编辑器)。

**PS**:我们原创的文字版条件编辑器很有意思哦,它能将复杂繁琐的条件代码还原成有语法有逻辑的中国话,真的是能让非技术人员第一次使用就看得懂会操作的优秀功能,目前为止我们应该是第一个将体验做到如此细腻的产品。

使用地址:[360移动开发者-RePlugin插件管理](https://dc.360.cn/)

## 已接入RePlugin的应用

我们诚挚期待您成为咱们RePlugin应用大家庭中的一员!

除了**360集团旗下的亿级别应用**以外,还有一些对**稳定要求极其严苛的“金融类”产品**,及第三方合作应用也接入了RePlugin(含SDK):


<table align="center">
    <tr align="center">
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/mobilesafe.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/appstore.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/browser.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/camera.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/clean.png" width="80" height="80"/></td>
    </tr>
    <tr align="center">
        <td><b><a href="https://shouji.360.cn/index.html">360 手机卫士</a></b></td>
        <td><b><a href="http://sj.360.cn/index.html">360 手机助手</a></b></td>
        <td><b><a href="http://mse.360.cn/m/index.html">360 手机浏览器</a></b></td>
        <td><b><a href="http://xj.huajiao.com/xji/home/pc">花椒相机</a></b></td>
        <td><b><a href="https://shouji.360.cn/360cleandroid/index.html">360 清理大师</a></b></td>
    </tr>
    <tr align="center">
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/movie.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/jieqianba.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/haitao1hao.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/huaruntong.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/jielema.png" width="80" height="80"/></td>
    </tr>
    <tr align="center">
        <td><b><a href="http://www.360kan.com/appdownload">360 影视大全</a></b></td>
        <td><b><a href="">J借钱吧</a></b></td>
        <td><b><a href="http://www.1haitao.com/">海淘1号</a></b></td>
        <td><b><a href="http://www.huaruntong.com/">华润通</a></b></td>
        <td><b><a href="http://www.jielem.com/">借了吗</a></b></td>
    </tr>
    <tr align="center">
        <td><img src="https://raw.githubusercontent.com/wiki/Qihoo360/RePlugin/img/apps/qihoo_os.jpg" width="80" height="80"/></td>
        <td><img src="https://raw.githubusercontent.com/wiki/Qihoo360/RePlugin/img/apps/qihoo_jietiao.jpg" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/yourapps.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/yourapps.png" width="80" height="80"/></td>
        <td><img src="https://github.com/Qihoo360/RePlugin/wiki/img/apps/yourapps.png" width="80" height="80"/></td>
    </tr>
    <tr align="center">
        <td><b><a href="http://www.qiku.com/product/360os2/index.html">360OS 系统应用</a></b></td>
        <td><b><a href="https://www.360jie.com.cn/">360 借条</a></b></td>
        <td><b><a href="">(即将发布)</a></b></td>
        <td><b><a href="">(即将发布)</a></b></td>
        <td><b><a href="">(即将发布)</a></b></td>
    </tr>
</table>

这里**衷心感谢** “360手机助手”,以及其它各App团队成员,帮助我们发现了很多需要改进的地方,并给予了非常积极的反馈。您们的鼓励与支持,让咱们的RePlugin能走的更远、更好!

## 已接入RePlugin的插件

目前已有的插件,可以分为以下几类,供各App开发者参考:
* **展示插件**:如**卫士首页**(是的,你没看错)、体检、信息流等
* **业务插件**:如清理、骚扰拦截、悬浮窗等
* **合作插件**:如程序锁、免费WiFi、安全桌面等
* **后台插件**:如Push、服务管理、Protobuf等
* **基础插件**:如安全WebView、分享、定位等

截止2017年6月底,这样的插件,我们有**103**个。衷心希望您能成为这个数字中的新的一员!

## 贡献自己的力量

我们欢迎任何形式的贡献,并致以诚挚的感谢!

你可以贡献代码、提出问题、编写文档等。有关“贡献”相关的内容,请[点击这里阅读《贡献力量》](https://github.com/Qihoo360/RePlugin/wiki/%E8%B4%A1%E7%8C%AE%E5%8A%9B%E9%87%8F)

## 与我们联系

欢迎您加入到我们的RePlugin微信群、QQ群大家庭。

微信群已超过上限,请进入我们的QQ群

QQ群 1:**653205923** QQ群 2:**589652294**

## License

RePlugin is [Apache v2.0 licensed](./LICENSE).


================================================
FILE: deploy.sh
================================================
#!/bin/bash

export RP_BASE_DIR=$(cd "$(dirname "$0")"; pwd)

export TARGET_PROJECTS=(
replugin-host-gradle
replugin-host-library
replugin-plugin-gradle
replugin-plugin-library
)

__gradle_exec(){ if [[ -x gradlew ]];then ./gradlew ${@}; else gradle ${@}; fi; }

__rp_deploy_project(){
	[[ ! -d ${1} ]] && echo ">>> INVALID ${1}!!! <<<" && return
	# execute deploying
	echo ">>> ${1} <<<" && cd ${1} && __gradle_exec -p ${1} clean bintrayUpload
	# revert changed files
	git checkout ${1}
}

rp_revert_AppConstant(){
	git status -s | sed s/^...// | grep '/AppConstant.groovy' | git checkout ${f}
}

rp_deploy(){
	local current=`pwd` && cd ${RP_BASE_DIR}
	# revert AppConstant.groovy
	rp_revert_AppConstant
	# saving all changes: git stash save "saving stash for deploying!!!"
	# deploy
	for p in ${TARGET_PROJECTS}; do __rp_deploy_project ${RP_BASE_DIR}/${p}; done
	# revert local changes: git revert --hard HEAD; git stash pop
	rp_revert_AppConstant
	# back
	cd ${current}
}

rp_test(){
	local projects=(
		# replugin-sample/host/app
		replugin-sample/host
		# replugin-sample/plugin/plugin-demo1/app
		replugin-sample/plugin/plugin-demo1
		# replugin-sample/plugin/plugin-demo2/app
		replugin-sample/plugin/plugin-demo2
		# replugin-sample/plugin/plugin-demo3-kotlin/app
		replugin-sample/plugin/plugin-demo3-kotlin
		# replugin-sample/plugin/plugin-webview/app
		replugin-sample/plugin/plugin-webview
		# replugin-sample-extra/fresco/FrescoHost/app
		replugin-sample-extra/fresco/FrescoHost
		# replugin-sample-extra/fresco/FrescoPlugin/app
		replugin-sample-extra/fresco/FrescoPlugin
	)
	local log=${RP_BASE_DIR}/build/rp_test.log && [[ -f $log ]] && rm -f $log && touch $log
	local current=`pwd`
	for p in ${projects}; do
		local p=${RP_BASE_DIR}/${p}
		echo -e ">>> BUILDING ${RP_BASE_DIR}/${p}"
		cd ${p} && { __gradle_exec -p ${p} clean asDebug  }
		ls -l ${p}/app/build/outputs/apk
	done
	cd ${current}
}

# grep --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,build,.gradle} -inr '2\.3\.0' .

================================================
FILE: replugin-host-gradle/README.md
================================================
# RePlugin Host Gradle

RePlugin Host Gradle是一个Gradle插件,由 **主程序** 负责引入。

该Gradle插件主要负责在主程序的编译期中做一些事情,此外,开发者可通过修改其属性而做一些自定义的操作。

大致包括:

* 生成带 RePlugin 插件坑位的 AndroidManifest.xml(允许自定义数量)
* 生成HostBuildConfig类,方便插件框架读取并自定义其属性

开发者需要依赖此Gradle插件,以实现对RePlugin的接入。请参见WiKi以了解接入方法。

有关RePlugin Host Gradle的详细描述,请访问我们的WiKi,以了解更多的内容。
(文档正在完善,请耐心等待)

================================================
FILE: replugin-host-gradle/build.gradle
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

plugins {
    id 'java'
    id 'groovy'
    id 'maven-publish'
}

repositories {
    google()
    mavenCentral()
}

dependencies {
    implementation 'com.android.tools.build:gradle:7.4.2'
    implementation 'org.json:json:20160212'
    implementation 'org.codehaus.groovy:groovy:2.4.7'
    implementation 'com.squareup:javapoet:1.5.1'

    implementation gradleApi()
    implementation localGroovy()

    implementation 'com.google.gradle:osdetector-gradle-plugin:1.2.1'
    implementation 'net.dongliu:apk-parser:2.2.0'
}

project.ext.RP_ARTIFACT_ID = 'replugin-host-gradle'
apply from: '../rp-publish.gradle'

================================================
FILE: replugin-host-gradle/gradle/wrapper/gradle-wrapper.properties
================================================
#
# Copyright (C) 2005-2017 Qihoo 360 Inc.
#
# 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
#
# http://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.
#

#Mon Dec 28 10:00:20 PST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip


================================================
FILE: replugin-host-gradle/gradle.properties
================================================
#
# Copyright (C) 2005-2017 Qihoo 360 Inc.
#
# 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
#
# http://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.
#

# 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=-Xmx1536m

# 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


================================================
FILE: replugin-host-gradle/gradlew
================================================
#!/usr/bin/env bash

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

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

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

# 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
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
esac

# 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

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" ] ; 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

# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
    JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"


================================================
FILE: replugin-host-gradle/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

@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=

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

@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 Windowz variants

if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_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=%*
goto execute

:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
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: replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/compat/ScopeCompat.groovy
================================================
package com.qihoo360.replugin.gradle.compat

/**
 * @author hyongbai
 */
class ScopeCompat {
    static def getAdbExecutable(def scope) {
        final MetaClass scopeClz = scope.metaClass
        if (scopeClz.hasProperty(scope, "androidBuilder")) {
            return scope.androidBuilder.sdkInfo.adb
        }
        if (scopeClz.hasProperty(scope, "sdkComponents")) {
            return scope.sdkComponents.adbExecutableProvider.get()
        }
    }

    // TODO: getBuilderTarget
//    static def getBuilderTarget(def scope, def target){
//        final MetaClass scopeClz = scope.metaClass
//
//        if (scopeClz.hasProperty(scope, "androidBuilder")) {
//            return scope.getAndroidBuilder().getTarget().getPath(target) //IAndroidTarget.ANDROID_JAR
//        }
//
//        return globalScope.getAndroidBuilder().getTarget().getPath(IAndroidTarget.ANDROID_JAR)
//    }

//    static def getAndroidJar(def scope){
//        final MetaClass scopeClz = scope.metaClass
//
//        if (scopeClz.hasProperty(scope, "androidBuilder")) {
//            return scope.getAndroidBuilder().getTarget().getPath(IAndroidTarget.ANDROID_JAR)
//        }
//        if (scopeClz.hasProperty(scope, "sdkComponents")) {
//            return scope.sdkComponents.androidJarProvider.get().getAbsolutePath()
//        }
//    }
}

================================================
FILE: replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/compat/VariantCompat.groovy
================================================
package com.qihoo360.replugin.gradle.compat

import org.gradle.api.Task

/**
 * @author hyongbai
 */
class VariantCompat {
    static def getAssembleTask(def variant) {
        return compatGetTask(variant, "getAssembleProvider", "getAssemble")
    }

    static def getMergeAssetsTask(def variant) {
        return compatGetTask(variant, "getMergeAssetsProvider", "getMergeAssets")
    }

    static def getGenerateBuildConfigTask(def variant) {
        return compatGetTask(variant, "getGenerateBuildConfigProvider", "getGenerateBuildConfig")
    }

    static def getProcessManifestTask(def variant) {
        return compatGetTask(variant, "getProcessManifestProvider", "getProcessManifest")
    }

    static def compatGetTask(def variant, String... candidates) {
        candidates?.findResult {
            variant.metaClass.respondsTo(variant, it).with {
                if (!it.isEmpty()) return it
            }
        }?.find {
            it.getParameterTypes().length == 0
        }?.invoke(variant)?.with {
            //TODO: check if is provider!!!
            Task.class.isInstance(it) ? it : it?.get()
        }
    }

}

================================================
FILE: replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/AppConstant.groovy
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

package com.qihoo360.replugin.gradle.host

/**
 * 程序常量定义区
 * @author RePlugin Team
 */
class AppConstant {

    /** 版本号 */
    def static final VER = "${RP_VERSION}"

    /** 打印信息时候的前缀 */
    def static final TAG = "< replugin-host-v${VER} >"

    /** 外部用户配置信息 */
    def static final USER_CONFIG = "repluginHostConfig"

    /** 用户Task组 */
    def static final TASKS_GROUP = "replugin-plugin"

    /** Task前缀 */
    def static final TASKS_PREFIX = "rp"

    /** 用户Task:安装插件 */
    def static final TASK_SHOW_PLUGIN = TASKS_PREFIX + "ShowPlugins"

    /** 用户Task:Generate任务 */
    def static final TASK_GENERATE = TASKS_PREFIX + "Generate"


    private AppConstant() {}
}


================================================
FILE: replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/RePlugin.groovy
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

package com.qihoo360.replugin.gradle.host

import com.android.build.gradle.AppExtension
import com.android.build.gradle.AppPlugin
import com.qihoo360.replugin.gradle.compat.VariantCompat
import com.qihoo360.replugin.gradle.host.creator.FileCreators
import com.qihoo360.replugin.gradle.host.creator.IFileCreator
import com.qihoo360.replugin.gradle.host.creator.impl.json.PluginBuiltinJsonCreator
import com.qihoo360.replugin.gradle.host.handlemanifest.ComponentsGenerator
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.logging.LogLevel

/**
 * @author RePlugin Team
 */
public class Replugin implements Plugin<Project> {

    def static TAG = AppConstant.TAG
    def project
    def config

    @Override
    public void apply(Project project) {
        println "${TAG} Welcome to replugin world ! "

        this.project = project

        /* Extensions */
        project.extensions.create(AppConstant.USER_CONFIG, RepluginConfig)
        if (project.plugins.hasPlugin(AppPlugin)) {
            def android = project.extensions.getByType(AppExtension)
            android.applicationVariants.all { variant ->
                addShowPluginTask(variant)
                if (config == null) {
                    config = project.extensions.getByName(AppConstant.USER_CONFIG)
                    checkUserConfig(config)
                }
                def generateBuildConfigTask = VariantCompat.getGenerateBuildConfigTask(variant)
                def appID = [variant.getApplicationId(), variant.buildType.applicationIdSuffix].findAll().join()

                def newManifest = ComponentsGenerator.generateComponent(appID, config)
                println "${TAG} countTask=${config.countTask}"
                //host generate task

                def generateHostConfigTaskName = getTaskName(variant, AppConstant.TASK_GENERATE, "HostConfig")
                def generateHostConfigTask = project.task(generateHostConfigTaskName)
                generateHostConfigTask.doLast {
                    FileCreators.createHostConfig(project, generateBuildConfigTask, config)
                }
                generateHostConfigTask.group = AppConstant.TASKS_GROUP
                //depends on build config task
                if (generateBuildConfigTask) {
                    generateHostConfigTask.dependsOn generateBuildConfigTask
                    generateBuildConfigTask.finalizedBy generateHostConfigTask
                }
                //depends on mergeAssets Task
                def mergeAssetsTask = VariantCompat.getMergeAssetsTask(variant)
                if (mergeAssetsTask) {
                    mergeAssetsTask.doLast{
                        FileCreators.createBuiltinJson(project, variant, config)
                    }
                }

                variant.outputs.each { output ->
                    VariantCompat.getProcessManifestTask(output).doLast {
                        println "${AppConstant.TAG} processManifest: ${it.outputs.files}"
                        it.outputs.files.each { File file ->
                            updateManifest(file, newManifest)
                        }
                    }
                }
            }
        }
    }

    /**
     *
     * @hyongbai
     *
     * 在gradle plugin 3.0.0之前,file是文件,且文件名为AndroidManifest.xml
     * 在gradle plugin 3.0.0之后,file是目录,(特别是3.3.2)在这里改成递归的方式替换内部所有的 manifest 文件
     *
     * @param file manifest文件
     * @param newManifest 需要添加的 manifest 信息
     */
    def updateManifest(def file, def newManifest) {
        // 除了目录和AndroidManifest.xml之外,还可能会包含manifest-merger-debug-report.txt等不相干的文件,过滤它
        if (file == null || !file.exists() || newManifest == null) return
        if (file.isDirectory()) {
            println "${AppConstant.TAG} updateManifest: ${file}"
            file.listFiles().each {
                updateManifest(it, newManifest)
            }
        } else if (file.name.equalsIgnoreCase("AndroidManifest.xml")) {
            appendManifest(file, newManifest)
        }
    }
    def appendManifest(def file, def content) {
        if (file == null || !file.exists()) return
        println "${AppConstant.TAG} appendManifest: ${file}"
        def updatedContent = file.getText("UTF-8").replaceAll("</application>", content + "</application>")
        file.write(updatedContent, 'UTF-8')
    }
    // 添加 【查看所有插件信息】 任务
    def addShowPluginTask(def variant) {
        def showPluginsTaskName = getTaskName(variant, AppConstant.TASK_SHOW_PLUGIN, "")
        def showPluginsTask = project.task(showPluginsTaskName)
        showPluginsTask.doLast {
            IFileCreator creator = new PluginBuiltinJsonCreator(project, variant, config)
            def dir = creator.getFileDir()
            if (!dir.exists()) {
                println "${AppConstant.TAG} The ${dir.absolutePath} does not exist "
                println "${AppConstant.TAG} pluginsInfo=null"
                return
            }
            String fileContent = creator.getFileContent()
            if (null == fileContent) {
                return
            }
            new File(dir, creator.getFileName()).write(fileContent, 'UTF-8')
        }
        showPluginsTask.group = AppConstant.TASKS_GROUP
        //get mergeAssetsTask name, get real gradle task
        def mergeAssetsTask = VariantCompat.getMergeAssetsTask(variant)
        //depend on mergeAssetsTask so that assets have been merged
        if (mergeAssetsTask) {
            showPluginsTask.dependsOn mergeAssetsTask
        }
    }
    /**
     * 检查用户配置项
     */
    def checkUserConfig(config) {
/*
        def persistentName = config.persistentName
        if (persistentName == null || persistentName.trim().equals("")) {
            project.logger.log(LogLevel.ERROR, "\n---------------------------------------------------------------------------------")
            project.logger.log(LogLevel.ERROR, " ERROR: persistentName can'te be empty, please set persistentName in replugin. ")
            project.logger.log(LogLevel.ERROR, "---------------------------------------------------------------------------------\n")
            System.exit(0)
            return
        }
*/
        doCheckConfig("countProcess", config.countProcess)
        doCheckConfig("countTranslucentStandard", config.countTranslucentStandard)
        doCheckConfig("countTranslucentSingleTop", config.countTranslucentSingleTop)
        doCheckConfig("countTranslucentSingleTask", config.countTranslucentSingleTask)
        doCheckConfig("countTranslucentSingleInstance", config.countTranslucentSingleInstance)
        doCheckConfig("countNotTranslucentStandard", config.countNotTranslucentStandard)
        doCheckConfig("countNotTranslucentSingleTop", config.countNotTranslucentSingleTop)
        doCheckConfig("countNotTranslucentSingleTask", config.countNotTranslucentSingleTask)
        doCheckConfig("countNotTranslucentSingleInstance", config.countNotTranslucentSingleInstance)

        // 横屏
        doCheckConfig("countTranslucentStandardLand", config.countTranslucentStandardLand)
        doCheckConfig("countTranslucentSingleTopLand", config.countTranslucentSingleTopLand)
        doCheckConfig("countTranslucentSingleTaskLand", config.countTranslucentSingleTaskLand)
        doCheckConfig("countTranslucentSingleInstanceLand", config.countTranslucentSingleInstanceLand)
        doCheckConfig("countNotTranslucentStandardLand", config.countNotTranslucentStandardLand)
        doCheckConfig("countNotTranslucentSingleTopLand", config.countNotTranslucentSingleTopLand)
        doCheckConfig("countNotTranslucentSingleTaskLand", config.countNotTranslucentSingleTaskLand)
        doCheckConfig("countNotTranslucentSingleInstanceLand", config.countNotTranslucentSingleInstanceLand)

        doCheckConfig("countTask", config.countTask)

        println '--------------------------------------------------------------------------'
//        println "${TAG} appID=${appID}"
        println "${TAG} useAppCompat=${config.useAppCompat}"
        println "${TAG} useOccupyLand=${config.useOccupyLand}"
        println "${TAG} useAndroidX=${config.useAndroidX}"
        // println "${TAG} persistentName=${config.persistentName}"

        println "${TAG} countProcess=${config.countProcess}"

        println "${TAG} countTranslucentStandard=${config.countTranslucentStandard}"
        println "${TAG} countTranslucentSingleTop=${config.countTranslucentSingleTop}"
        println "${TAG} countTranslucentSingleTask=${config.countTranslucentSingleTask}"
        println "${TAG} countTranslucentSingleInstance=${config.countTranslucentSingleInstance}"
        println "${TAG} countNotTranslucentStandard=${config.countNotTranslucentStandard}"
        println "${TAG} countNotTranslucentSingleTop=${config.countNotTranslucentSingleTop}"
        println "${TAG} countNotTranslucentSingleTask=${config.countNotTranslucentSingleTask}"
        println "${TAG} countNotTranslucentSingleInstance=${config.countNotTranslucentSingleInstance}"

        // 横屏
        println "${TAG} countTranslucentStandardLand=${config.countTranslucentStandardLand()}"
        println "${TAG} countTranslucentSingleTopLand=${config.countTranslucentSingleTopLand()}"
        println "${TAG} countTranslucentSingleTaskLand=${config.countTranslucentSingleTaskLand()}"
        println "${TAG} countTranslucentSingleInstanceLand=${config.countTranslucentSingleInstanceLand()}"
        println "${TAG} countNotTranslucentStandardLand=${config.countNotTranslucentStandardLand()}"
        println "${TAG} countNotTranslucentSingleTopLand=${config.countNotTranslucentSingleTopLand()}"
        println "${TAG} countNotTranslucentSingleTaskLand=${config.countNotTranslucentSingleTaskLand()}"
        println "${TAG} countNotTranslucentSingleInstanceLand=${config.countNotTranslucentSingleInstanceLand()}"

        println "${TAG} countTask=${config.countTask}"
        println '--------------------------------------------------------------------------'
    }

    /**
     * 检查配置项是否正确
     * @param name 配置项
     * @param count 配置值
     */
    def doCheckConfig(def name, def count) {
        if (!(count instanceof Integer) || count < 0) {
            this.project.logger.log(LogLevel.ERROR, "\n--------------------------------------------------------")
            this.project.logger.log(LogLevel.ERROR, " ${TAG} ERROR: ${name} must be an positive integer. ")
            this.project.logger.log(LogLevel.ERROR, "--------------------------------------------------------\n")
            System.exit(0)
        }
    }
    String getTaskName(def variant, def prefix, def suffix){
        return prefix + variant.name + suffix
    }
}

class RepluginConfig {

    /** 自定义进程的数量(除 UI 和 Persistent 进程) */
    def countProcess = 3

    /** 是否使用常驻进程? */
    def persistentEnable = true

    /** 常驻进程名称(也就是上面说的 Persistent 进程,开发者可自定义)*/
    def persistentName = ':GuardService'

    /**
     * 是否使用 横屏坑位
     */
    def useOccupyLand = false

    /** 背景不透明的坑的数量 */
    def countNotTranslucentStandard = 6
    def countNotTranslucentSingleTop = 2
    def countNotTranslucentSingleTask = 3
    def countNotTranslucentSingleInstance = 2

    /** 背景透明的坑的数量 */
    def countTranslucentStandard = 2
    def countTranslucentSingleTop = 2
    def countTranslucentSingleTask = 2
    def countTranslucentSingleInstance = 3

    /** 背景不透明的坑的数量 横屏 */
    def countNotTranslucentStandardLand = 1
    def countNotTranslucentSingleTopLand = 1
    def countNotTranslucentSingleTaskLand = 1
    def countNotTranslucentSingleInstanceLand = 1
    def countNotTranslucentStandardLand(){useOccupyLand ? countNotTranslucentStandardLand : 0}
    def countNotTranslucentSingleTopLand(){useOccupyLand ? countNotTranslucentSingleTopLand : 0}
    def countNotTranslucentSingleTaskLand(){useOccupyLand ? countNotTranslucentSingleTaskLand : 0}
    def countNotTranslucentSingleInstanceLand(){useOccupyLand ? countNotTranslucentSingleInstanceLand : 0}

    /** 背景透明的坑的数量 横屏*/
    def countTranslucentStandardLand = 1
    def countTranslucentSingleTopLand = 1
    def countTranslucentSingleTaskLand = 1
    def countTranslucentSingleInstanceLand = 1
    def countTranslucentStandardLand(){useOccupyLand ? countTranslucentStandardLand : 0}
    def countTranslucentSingleTopLand(){useOccupyLand ? countTranslucentSingleTopLand : 0}
    def countTranslucentSingleTaskLand(){useOccupyLand ? countTranslucentSingleTaskLand : 0}
    def countTranslucentSingleInstanceLand(){useOccupyLand ? countTranslucentSingleInstanceLand : 0}

    /** 宿主中声明的 TaskAffinity 的组数 */
    def countTask = 2

    /**
     * 是否使用 AppCompat 库
     * com.android.support:appcompat-v7:25.2.0
     */
    def useAppCompat = false

    /** HOST 向下兼容的插件版本 */
    def compatibleVersion = 10

    /** HOST 插件版本 */
    def currentVersion = 12

    /** plugins-builtin.json 文件名自定义,默认是 "plugins-builtin.json" */
    def builtInJsonFileName = "plugins-builtin.json"

    /** 是否自动管理 plugins-builtin.json 文件,默认自动管理 */
    def autoManageBuiltInJsonFile = true

    /** assert目录下放置插件文件的目录自定义,默认是 assert 的 "plugins" */
    def pluginDir = "plugins"

    /** 插件文件的后缀自定义,默认是".jar" 暂时支持 jar 格式*/
    def pluginFilePostfix = ".jar"

    /** 当发现插件目录下面有不合法的插件 jar (有可能是特殊定制 jar)时是否停止构建,默认是 true */
    def enablePluginFileIllegalStopBuild = true

    /** 宿主是否支持了 Androidx 库 */
    def useAndroidX = false
}


================================================
FILE: replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/creator/FileCreators.groovy
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

package com.qihoo360.replugin.gradle.host.creator

import com.qihoo360.replugin.gradle.host.AppConstant
import com.qihoo360.replugin.gradle.host.creator.impl.java.RePluginHostConfigCreator
import com.qihoo360.replugin.gradle.host.creator.impl.json.PluginBuiltinJsonCreator

/**
 * @author RePlugin Team
 */
public class FileCreators {

    static def create(IFileCreator creator) {
        if (creator == null) {
            return
        }
      
     
        def dir = creator.getFileDir()
        if (!dir.exists()) {
            println "${AppConstant.TAG} mkdirs ${dir.getAbsolutePath()} : ${dir.mkdirs()}"
        }

        def targetFile = new File(dir, creator.getFileName())
      
        String fileContent = creator.getFileContent()
        if (null == fileContent){
            return
        }
      
        targetFile.write(fileContent, 'UTF-8')
        println "${AppConstant.TAG} rewrite ${targetFile.getAbsoluteFile()}"
    }

    static def createHostConfig(project, generateBuildConfigTask, config) {
        def creator = new RePluginHostConfigCreator(project, generateBuildConfigTask, config)
        create(creator)
    }


    static def createBuiltinJson(project, variant, config) {
        if (config.autoManageBuiltInJsonFile) {
            def creator = new PluginBuiltinJsonCreator(project, variant, config)
            create(creator)
        }
    }
}


================================================
FILE: replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/creator/IFileCreator.groovy
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

package com.qihoo360.replugin.gradle.host.creator;

/**
 * @author RePlugin Team
 */
public interface IFileCreator {

    /**
     * 要生成的文件所在目录
     */
    File getFileDir()

    /**
     * 要生成的文件的名称
     */
    String getFileName()

    /**
     * 要生成的文件内容
     */
    String getFileContent()
}


================================================
FILE: replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/creator/impl/java/RePluginHostConfigCreator.groovy
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

package com.qihoo360.replugin.gradle.host.creator.impl.java

import com.qihoo360.replugin.gradle.host.creator.IFileCreator

/**
 * @author RePlugin Team
 */
public class RePluginHostConfigCreator implements IFileCreator {

    def static final HOST_CONFIG_PATH = '/com/qihoo360/replugin/gen/'
    def static final HOST_CONFIG_NAME = 'RePluginHostConfig.java'

    def config
    def project
    def generateBuildConfigTask
    def fileDir
    def fileName
    def RePluginHostConfigCreator(def project, def generateBuildConfigTask, def cfg) {
        this.project = project
        this.generateBuildConfigTask = generateBuildConfigTask
        this.config = cfg
        //make it generated in buildConfig output dir so that we don't need to hook anything
        File buildConfigGeneratedDir = this.generateBuildConfigTask.sourceOutputDir.asFile.get()
        fileName = HOST_CONFIG_NAME;
        fileDir = new File(buildConfigGeneratedDir, HOST_CONFIG_PATH)
    }

    @Override
    String getFileName() {
        fileName
    }

    @Override
    File getFileDir() {
        fileDir
    }

    @Override
    String getFileContent() {
        return """
package com.qihoo360.replugin.gen;

/**
 * 注意:此文件由插件化框架自动生成,请不要手动修改。
 */
public class RePluginHostConfig {

    // 常驻进程名字
    public static String PERSISTENT_NAME = "${config.persistentName}";

    // 是否使用“常驻进程”(见PERSISTENT_NAME)作为插件的管理进程。若为False,则会使用默认进程
    public static boolean PERSISTENT_ENABLE = ${config.persistentEnable};

    // 背景透明的坑的数量(每种 launchMode 不同)
    public static int ACTIVITY_PIT_COUNT_TS_STANDARD = ${config.countTranslucentStandard};
    public static int ACTIVITY_PIT_COUNT_TS_SINGLE_TOP = ${config.countTranslucentSingleTop};
    public static int ACTIVITY_PIT_COUNT_TS_SINGLE_TASK = ${config.countTranslucentSingleTask};
    public static int ACTIVITY_PIT_COUNT_TS_SINGLE_INSTANCE = ${
            config.countTranslucentSingleInstance
        };

    // 背景透明的坑的数量(每种 launchMode 不同)横屏
    public static int ACTIVITY_PIT_COUNT_TS_STANDARD_LAND = ${config.countTranslucentStandardLand()};
    public static int ACTIVITY_PIT_COUNT_TS_SINGLE_TOP_LAND = ${config.countTranslucentSingleTopLand()};
    public static int ACTIVITY_PIT_COUNT_TS_SINGLE_TASK_LAND = ${config.countTranslucentSingleTaskLand()};
    public static int ACTIVITY_PIT_COUNT_TS_SINGLE_INSTANCE_LAND = ${
            config.countTranslucentSingleInstanceLand()
        };

    // 背景不透明的坑的数量(每种 launchMode 不同)
    public static int ACTIVITY_PIT_COUNT_NTS_STANDARD = ${config.countNotTranslucentStandard};
    public static int ACTIVITY_PIT_COUNT_NTS_SINGLE_TOP = ${config.countNotTranslucentSingleTop};
    public static int ACTIVITY_PIT_COUNT_NTS_SINGLE_TASK = ${config.countNotTranslucentSingleTask};
    public static int ACTIVITY_PIT_COUNT_NTS_SINGLE_INSTANCE = ${
            config.countNotTranslucentSingleInstance
        };

    // 背景不透明的坑的数量(每种 launchMode 不同)横屏
    public static int ACTIVITY_PIT_COUNT_NTS_STANDARD_LAND = ${config.countNotTranslucentStandardLand()};
    public static int ACTIVITY_PIT_COUNT_NTS_SINGLE_TOP_LAND = ${config.countNotTranslucentSingleTopLand()};
    public static int ACTIVITY_PIT_COUNT_NTS_SINGLE_TASK_LAND = ${config.countNotTranslucentSingleTaskLand()};
    public static int ACTIVITY_PIT_COUNT_NTS_SINGLE_INSTANCE_LAND = ${
            config.countNotTranslucentSingleInstanceLand()
        };

    // TaskAffinity 组数
    public static int ACTIVITY_PIT_COUNT_TASK = ${config.countTask};

    // 是否使用 AppCompat 库
    public static boolean ACTIVITY_PIT_USE_APPCOMPAT = ${config.useAppCompat};

   // HOST 是否使用 androidx 库
    public static boolean HOST_USE_ANDROIDX = ${config.useAndroidX};

   // 是否使用 横屏坑位
    public static boolean HOST_USE_OCCUPYLAND = ${config.useOccupyLand};
   
    //------------------------------------------------------------
    // 主程序支持的插件版本范围
    //------------------------------------------------------------

    // HOST 向下兼容的插件版本
    public static int ADAPTER_COMPATIBLE_VERSION = ${config.compatibleVersion};

    // HOST 插件版本
    public static int ADAPTER_CURRENT_VERSION = ${config.currentVersion};
}"""
    }
}


================================================
FILE: replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/creator/impl/json/PluginBuiltinJsonCreator.groovy
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

package com.qihoo360.replugin.gradle.host.creator.impl.json

import com.qihoo360.replugin.gradle.host.AppConstant
import com.qihoo360.replugin.gradle.compat.VariantCompat
import com.qihoo360.replugin.gradle.host.creator.IFileCreator
import groovy.io.FileType
import groovy.json.JsonOutput

/**
 * @author RePlugin Team
 */
public class PluginBuiltinJsonCreator implements IFileCreator {

    def variant
    def config
    File fileDir
    def fileName
    def pluginInfos = []

    def PluginBuiltinJsonCreator(def project, def variant, def cfg) {
        this.config = cfg
        this.variant = variant
        // make sure processResources Task execute after mergeAssets Task, get real gradle task
        // 在 com.android.tools.build:gradle:3.3.2 及之前 outputDir 为 File 类型。
        // 但从 com.android.tools.build:gradle:3.4.1 开始 Google 将此类型改为 `Provider<Directory>`。
        final def out = VariantCompat.getMergeAssetsTask(variant)?.outputDir
        fileDir = File.class.isInstance(out) ? out : out?.get()?.getAsFile()
        fileName = config.builtInJsonFileName
    }

    @Override
    String getFileName() {
        fileName
    }

    @Override
    File getFileDir() {
        fileDir
    }

    @Override
    String getFileContent() {
        //查找插件文件并抽取信息,如果没有就直接返回null
        File pluginDirFile = new File(fileDir?.getAbsolutePath() + File.separator + config.pluginDir)
        if (!pluginDirFile.exists()) {
            println "${AppConstant.TAG} The ${pluginDirFile.absolutePath} does not exist "
            println "${AppConstant.TAG} pluginsInfo=null"
            return null
        }

        new File(fileDir.getAbsolutePath() + File.separator + config.pluginDir)
                .traverse(type: FileType.FILES, nameFilter: ~/.*\${config.pluginFilePostfix}/) {

            PluginInfoParser parser = null
            try {
                parser = new PluginInfoParser(it.absoluteFile, config)
            } catch (Exception e) {
                if (config.enablePluginFileIllegalStopBuild) {
                    System.err.println "${AppConstant.TAG} the plugin(${it.absoluteFile.absolutePath}) is illegal !!!"
                    throw new Exception(e)
                }
            }

            if (null != parser) {
                pluginInfos << parser.pluginInfo
            }
        }

        //插件为0个
        if (pluginInfos.isEmpty()) {
            println "${AppConstant.TAG} pluginsSize=0"
            println "${AppConstant.TAG} pluginsInfo=null"
            return null
        }

        //构建插件们的json信息
        def jsonOutput = new JsonOutput()
        String pluginInfosJson = jsonOutput.toJson(pluginInfos)
        //格式化打印插件们的json信息
        println "${AppConstant.TAG} pluginsSize=${pluginInfos.size()}"
        println "${AppConstant.TAG} pluginsInfo=${jsonOutput.prettyPrint(pluginInfosJson)}"

        return pluginInfosJson
    }

}


================================================
FILE: replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/creator/impl/json/PluginInfo.groovy
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

package com.qihoo360.replugin.gradle.host.creator.impl.json

/**
 * 插件信息模型
 * @author RePlugin Team
 */
class PluginInfo {

    /** 插件文件路径 */
    def path
    /** 插件包名 */
    def pkg
    /** 插件名 */
    def name
    /** 插件最低兼容版本 */
    Long low
    /** 插件最高兼容版本 */
    Long high
    /** 插件版本号 */
    Long ver
    /** 框架版本号 */
    Long frm

}


================================================
FILE: replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/creator/impl/json/PluginInfoParser.groovy
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

package com.qihoo360.replugin.gradle.host.creator.impl.json

import net.dongliu.apk.parser.ApkFile
import org.xml.sax.Attributes
import org.xml.sax.SAXException
import org.xml.sax.helpers.DefaultHandler

import javax.xml.parsers.SAXParser
import javax.xml.parsers.SAXParserFactory

/**
 * 从manifest的xml中抽取PluginInfo信息
 * @author RePlugin Team
 */
public class PluginInfoParser extends DefaultHandler {

    private final String ANDROID_NAME = "android:name"
    private final String ANDROID_VALUE = "android:value"

    private final String TAG_NAME = "com.qihoo360.plugin.name"
    private final String TAG_VERSION_LOW = "com.qihoo360.plugin.version.low"
    private final String TAG_VERSION_HIGH = "com.qihoo360.plugin.version.high"
    private final String TAG_VERSION_VER = "com.qihoo360.plugin.version.ver"
    private final String TAG_FRAMEWORK_VER = "com.qihoo360.framework.ver"

    private PluginInfo pluginInfo


    public PluginInfoParser(File pluginFile, def config) {

        pluginInfo = new PluginInfo()

        ApkFile apkFile = new ApkFile(pluginFile)

        String manifestXmlStr = apkFile.getManifestXml()
        ByteArrayInputStream inputStream = new ByteArrayInputStream(manifestXmlStr.getBytes("UTF-8"))

        SAXParserFactory factory = SAXParserFactory.newInstance()
        SAXParser parser = factory.newSAXParser()
        parser.parse(inputStream, this)

        String fullName = pluginFile.name
        pluginInfo.path = config.pluginDir + "/" + fullName

        String postfix = config.pluginFilePostfix
        pluginInfo.name = fullName.substring(0, fullName.length() - postfix.length())
    }


    public PluginInfo getPluginInfo() {
        return pluginInfo;
    }


    @Override
    public void startDocument() throws SAXException {
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

        if ("meta-data" == qName) {
            switch (attributes.getValue(ANDROID_NAME)) {
                case TAG_NAME:
                    pluginInfo.name = attributes.getValue(ANDROID_VALUE)
                    break;
                case TAG_VERSION_LOW:
                    pluginInfo.low = new Long(attributes.getValue(ANDROID_VALUE))
                    break;
                case TAG_VERSION_HIGH:
                    pluginInfo.high = new Long(attributes.getValue(ANDROID_VALUE))
                    break;
                case TAG_VERSION_VER:
                    pluginInfo.ver = new Long(attributes.getValue(ANDROID_VALUE))
                    break
                case TAG_FRAMEWORK_VER:
                    pluginInfo.frm = new Long(attributes.getValue(ANDROID_VALUE))
                    break
                default:
                    break
            }
        } else if ("manifest" == qName) {
            pluginInfo.pkg = attributes.getValue("package")
            pluginInfo.ver = new Long(attributes.getValue("android:versionCode"))
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
    }

}


================================================
FILE: replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/handlemanifest/ComponentsGenerator.groovy
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

package com.qihoo360.replugin.gradle.host.handlemanifest

import groovy.xml.MarkupBuilder

/**
 * @author RePlugin Team
 */
class ComponentsGenerator {

    def static final infix = 'loader.a.Activity'

    def static final name = 'android:name'
    def static final process = 'android:process'
    def static final task = 'android:taskAffinity'
    def static final launchMode = 'android:launchMode'
    def static final authorities = 'android:authorities'
    def static final multiprocess = 'android:multiprocess'

    def static final cfg = 'android:configChanges'
    def static final cfgV = 'keyboard|keyboardHidden|orientation|screenSize'

    def static final exp = 'android:exported'
    def static final expV = 'false'

    def static final ori = 'android:screenOrientation'
    def static final oriV = 'portrait'
    def static final oriL = 'landscape'
    def static final LAND = 'LAND'

    def static final theme = 'android:theme'
    def static final themeTS = '@android:style/Theme.Translucent.NoTitleBar'

    def static final THEME_NTS_USE_APP_COMPAT = '@style/Theme.AppCompat'
    def static final THEME_NTS_NOT_USE_APP_COMPAT = '@android:style/Theme.NoTitleBar'
    def static themeNTS = THEME_NTS_NOT_USE_APP_COMPAT

    /**
     * 动态生成插件化框架中需要的组件
     *
     * @param applicationID 宿主的 applicationID
     * @param config 用户配置
     * @return String       插件化框架中需要的组件
     */
    def static generateComponent(def applicationID, def config) {
        // 是否使用 AppCompat 库(涉及到默认主题)
        if (config.useAppCompat) {
            themeNTS = THEME_NTS_USE_APP_COMPAT
        } else {
            themeNTS = THEME_NTS_NOT_USE_APP_COMPAT
        }

        def writer = new StringWriter()
        def xml = new MarkupBuilder(writer)

        /* UI 进程 */
        xml.application {

            /* 需要编译期动态修改进程名的组件*/

            String pluginMgrProcessName = config.persistentEnable ? config.persistentName : applicationID

            // 常驻进程Provider
            provider(
                    "${name}":"com.qihoo360.replugin.component.process.ProcessPitProviderPersist",
                    "${authorities}":"${applicationID}.loader.p.main",
                    "${exp}":"false",
                    "${process}":"${pluginMgrProcessName}")

            provider(
                    "${name}":"com.qihoo360.replugin.component.provider.PluginPitProviderPersist",
                    "${authorities}":"${applicationID}.Plugin.NP.PSP",
                    "${exp}":"false",
                    "${process}":"${pluginMgrProcessName}")

            // ServiceManager 服务框架
            provider(
                    "${name}":"com.qihoo360.mobilesafe.svcmanager.ServiceProvider",
                    "${authorities}":"${applicationID}.svcmanager",
                    "${exp}":"false",
                    "${multiprocess}":"false",
                    "${process}":"${pluginMgrProcessName}")

            service(
                    "${name}":"com.qihoo360.replugin.component.service.server.PluginPitServiceGuard",
                    "${process}":"${pluginMgrProcessName}")

            /* 透明坑 */
            config.countTranslucentStandard.times {
                activity(
                        "${name}": "${applicationID}.${infix}N1NRTS${it}",
                        "${cfg}": "${cfgV}",
                        "${exp}": "${expV}",
                        "${ori}": "${oriV}",
                        "${theme}": "${themeTS}")
            }
            config.countTranslucentSingleTop.times {
                activity(
                        "${name}": "${applicationID}.${infix}N1STPTS${it}",
                        "${cfg}": "${cfgV}",
                        "${exp}": "${expV}",
                        "${ori}": "${oriV}",
                        "${theme}": "${themeTS}",
                        "${launchMode}": "singleTop")
            }
            config.countTranslucentSingleTask.times {
                activity(
                        "${name}": "${applicationID}.${infix}N1STTS${it}",
                        "${cfg}": "${cfgV}",
                        "${exp}": "${expV}",
                        "${ori}": "${oriV}",
                        "${theme}": "${themeTS}",
                        "${launchMode}": "singleTask")
            }
            config.countTranslucentSingleInstance.times {
                activity(
                        "${name}": "${applicationID}.${infix}N1SITS${it}",
                        "${cfg}": "${cfgV}",
                        "${exp}": "${expV}",
                        "${ori}": "${oriV}",
                        "${theme}": "${themeTS}",
                        "${launchMode}": "singleInstance")
            }
            /* 透明坑 横屏*/
            config.countTranslucentStandardLand().times {
                activity(
                        "${name}": "${applicationID}.${infix}N1${LAND}NRTS${it}",
                        "${cfg}": "${cfgV}",
                        "${exp}": "${expV}",
                        "${ori}": "${oriL}",
                        "${theme}": "${themeTS}")
            }
            config.countTranslucentSingleTopLand().times {
                activity(
                        "${name}": "${applicationID}.${infix}N1${LAND}STPTS${it}",
                        "${cfg}": "${cfgV}",
                        "${exp}": "${expV}",
                        "${ori}": "${oriL}",
                        "${theme}": "${themeTS}",
                        "${launchMode}": "singleTop")
            }
            config.countTranslucentSingleTaskLand().times {
                activity(
                        "${name}": "${applicationID}.${infix}N1${LAND}STTS${it}",
                        "${cfg}": "${cfgV}",
                        "${exp}": "${expV}",
                        "${ori}": "${oriL}",
                        "${theme}": "${themeTS}",
                        "${launchMode}": "singleTask")
            }
            config.countTranslucentSingleInstanceLand().times {
                activity(
                        "${name}": "${applicationID}.${infix}N1${LAND}SITS${it}",
                        "${cfg}": "${cfgV}",
                        "${exp}": "${expV}",
                        "${ori}": "${oriL}",
                        "${theme}": "${themeTS}",
                        "${launchMode}": "singleInstance")
            }

            /* 不透明坑 */
            config.countNotTranslucentStandard.times {
                activity(
                        "${name}": "${applicationID}.${infix}N1NRNTS${it}",
                        "${cfg}": "${cfgV}",
                        "${exp}": "${expV}",
                        "${ori}": "${oriV}",
                        "${theme}": "${themeNTS}")
            }
            config.countNotTranslucentSingleTop.times {
                activity(
                        "${name}": "${applicationID}.${infix}N1STPNTS${it}",
                        "${cfg}": "${cfgV}",
                        "${exp}": "${expV}",
                        "${ori}": "${oriV}",
                        "${theme}": "${themeNTS}",
                        "${launchMode}": "singleTop")
            }
            config.countNotTranslucentSingleTask.times {
                activity(
                        "${name}": "${applicationID}.${infix}N1STNTS${it}",
                        "${cfg}": "${cfgV}",
                        "${exp}": "${expV}",
                        "${ori}": "${oriV}",
                        "${theme}": "${themeNTS}",
                        "${launchMode}": "singleTask",)
            }
            config.countNotTranslucentSingleInstance.times {
                activity(
                        "${name}": "${applicationID}.${infix}N1SINTS${it}",
                        "${cfg}": "${cfgV}",
                        "${exp}": "${expV}",
                        "${ori}": "${oriV}",
                        "${theme}": "${themeNTS}",
                        "${launchMode}": "singleInstance")
            }

            /* 不透明坑 */
            config.countNotTranslucentStandardLand().times {
                activity(
                        "${name}": "${applicationID}.${infix}N1${LAND}NRNTS${it}",
                        "${cfg}": "${cfgV}",
                        "${exp}": "${expV}",
                        "${ori}": "${oriL}",
                        "${theme}": "${themeNTS}")
            }
            config.countNotTranslucentSingleTopLand().times {
                activity(
                        "${name}": "${applicationID}.${infix}N1${LAND}STPNTS${it}",
                        "${cfg}": "${cfgV}",
                        "${exp}": "${expV}",
                        "${ori}": "${oriL}",
                        "${theme}": "${themeNTS}",
                        "${launchMode}": "singleTop")
            }
            config.countNotTranslucentSingleTaskLand().times {
                activity(
                        "${name}": "${applicationID}.${infix}N1${LAND}STNTS${it}",
                        "${cfg}": "${cfgV}",
                        "${exp}": "${expV}",
                        "${ori}": "${oriL}",
                        "${theme}": "${themeNTS}",
                        "${launchMode}": "singleTask",)
            }
            config.countNotTranslucentSingleInstanceLand().times {
                activity(
                        "${name}": "${applicationID}.${infix}N1${LAND}SINTS${it}",
                        "${cfg}": "${cfgV}",
                        "${exp}": "${expV}",
                        "${ori}": "${oriL}",
                        "${theme}": "${themeNTS}",
                        "${launchMode}": "singleInstance")
            }

            /* TaskAffinity */
            // N1TA0NRTS1:UI进程->第0组->standardMode->透明主题->第1个坑位 (T: Task, NR: Standard, TS: Translucent)
            config.countTask.times { i ->
                config.countTranslucentStandard.times { j ->
                    activity(
                            "${name}": "${applicationID}.${infix}N1TA${i}NRTS${j}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriV}",
                            "${theme}": "${themeTS}",
                            "${task}": ":t${i}")
                }
                config.countTranslucentSingleTop.times { j ->
                    activity(
                            "${name}": "${applicationID}.${infix}N1TA${i}STPTS${j}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriV}",
                            "${theme}": "${themeTS}",
                            "${task}": ":t${i}",
                            "${launchMode}": "singleTop")
                }
                config.countTranslucentSingleTask.times { j ->
                    activity(
                            "${name}": "${applicationID}.${infix}N1TA${i}STTS${j}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriV}",
                            "${theme}": "${themeTS}",
                            "${task}": ":t${i}",
                            "${launchMode}": "singleTask")
                }

                config.countNotTranslucentStandard.times { j ->
                    activity(
                            "${name}": "${applicationID}.${infix}N1TA${i}NRNTS${j}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriV}",
                            "${theme}": "${themeNTS}",
                            "${task}": ":t${i}")
                }
                config.countNotTranslucentSingleTop.times { j ->
                    activity(
                            "${name}": "${applicationID}.${infix}N1TA${i}STPNTS${j}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriV}",
                            "${theme}": "${themeNTS}",
                            "${task}": ":t${i}",
                            "${launchMode}": "singleTop")
                }
                config.countNotTranslucentSingleTask.times { j ->
                    activity(
                            "${name}": "${applicationID}.${infix}N1TA${i}STNTS${j}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriV}",
                            "${theme}": "${themeNTS}",
                            "${task}": ":t${i}",
                            "${launchMode}": "singleTask")
                }
                // 横屏
                config.countTranslucentStandardLand().times { j ->
                    activity(
                            "${name}": "${applicationID}.${infix}N1TA${i}${LAND}NRTS${j}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriL}",
                            "${theme}": "${themeTS}",
                            "${task}": ":t${i}")
                }
                config.countTranslucentSingleTopLand().times { j ->
                    activity(
                            "${name}": "${applicationID}.${infix}N1TA${i}${LAND}STPTS${j}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriL}",
                            "${theme}": "${themeTS}",
                            "${task}": ":t${i}",
                            "${launchMode}": "singleTop")
                }
                config.countTranslucentSingleTaskLand().times { j ->
                    activity(
                            "${name}": "${applicationID}.${infix}N1TA${i}${LAND}STTS${j}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriL}",
                            "${theme}": "${themeTS}",
                            "${task}": ":t${i}",
                            "${launchMode}": "singleTask")
                }

                config.countNotTranslucentStandardLand().times { j ->
                    activity(
                            "${name}": "${applicationID}.${infix}N1TA${i}${LAND}NRNTS${j}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriL}",
                            "${theme}": "${themeNTS}",
                            "${task}": ":t${i}")
                }
                config.countNotTranslucentSingleTopLand().times { j ->
                    activity(
                            "${name}": "${applicationID}.${infix}N1TA${i}${LAND}STPNTS${j}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriL}",
                            "${theme}": "${themeNTS}",
                            "${task}": ":t${i}",
                            "${launchMode}": "singleTop")
                }
                config.countNotTranslucentSingleTaskLand().times { j ->
                    activity(
                            "${name}": "${applicationID}.${infix}N1TA${i}${LAND}STNTS${j}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriL}",
                            "${theme}": "${themeNTS}",
                            "${task}": ":t${i}",
                            "${launchMode}": "singleTask")
                }
            }
        }
        // 删除 application 标签
        def normalStr = writer.toString().replace("<application>", "").replace("</application>", "")

        // 将单进程和多进程的组件相加
        normalStr + generateMultiProcessComponent(applicationID, config)
    }

    /**
     * 生成多进程坑位配置
     */
    def static generateMultiProcessComponent(def applicationID, def config) {
        if (config.countProcess == 0) {
            return ''
        }

        def writer = new StringWriter()
        def xml = new MarkupBuilder(writer)

        /* 自定义进程 */
        xml.application {
            config.countProcess.times { p ->
                config.countTranslucentStandard.times {
                    activity(
                            "${name}": "${applicationID}.${infix}P${p}NRTS${it}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriV}",
                            "${theme}": "${themeTS}",
                            "${process}": ":p${p}")
                }
                config.countTranslucentSingleTop.times {
                    activity(
                            "${name}": "${applicationID}.${infix}P${p}STPTS${it}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriV}",
                            "${theme}": "${themeTS}",
                            "${process}": ":p${p}",
                            "${launchMode}": "singleTop")
                }
                config.countTranslucentSingleTask.times {
                    activity(
                            "${name}": "${applicationID}.${infix}P${p}STTS${it}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriV}",
                            "${theme}": "${themeTS}",
                            "${process}": ":p${p}",
                            "${launchMode}": "singleTask")
                }
                config.countTranslucentSingleInstance.times {
                    activity(
                            "${name}": "${applicationID}.${infix}P${p}SITS${it}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriV}",
                            "${theme}": "${themeTS}",
                            "${process}": ":p${p}",
                            "${launchMode}": "singleInstance")
                }
                config.countNotTranslucentStandard.times {
                    activity(
                            "${name}": "${applicationID}.${infix}P${p}NRNTS${it}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriV}",
                            "${theme}": "${themeNTS}",
                            "${process}": ":p${p}")
                }
                config.countNotTranslucentSingleTop.times {
                    activity(
                            "${name}": "${applicationID}.${infix}P${p}STPNTS${it}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriV}",
                            "${theme}": "${themeNTS}",
                            "${process}": ":p${p}",
                            "${launchMode}": "singleTop")
                }
                config.countNotTranslucentSingleTask.times {
                    activity(
                            "${name}": "${applicationID}.${infix}P${p}STNTS${it}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriV}",
                            "${theme}": "${themeNTS}",
                            "${process}": ":p${p}",
                            "${launchMode}": "singleTask")
                }
                config.countNotTranslucentSingleInstance.times {
                    activity(
                            "${name}": "${applicationID}.${infix}P${p}SINTS${it}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriV}",
                            "${theme}": "${themeNTS}",
                            "${process}": ":p${p}",
                            "${launchMode}": "singleInstance")
                }

                config.countTranslucentStandardLand().times {
                    activity(
                            "${name}": "${applicationID}.${infix}P${p}${LAND}NRTS${it}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriL}",
                            "${theme}": "${themeTS}",
                            "${process}": ":p${p}")
                }
                config.countTranslucentSingleTopLand().times {
                    activity(
                            "${name}": "${applicationID}.${infix}P${p}${LAND}STPTS${it}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriL}",
                            "${theme}": "${themeTS}",
                            "${process}": ":p${p}",
                            "${launchMode}": "singleTop")
                }
                config.countTranslucentSingleTaskLand().times {
                    activity(
                            "${name}": "${applicationID}.${infix}P${p}${LAND}STTS${it}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriL}",
                            "${theme}": "${themeTS}",
                            "${process}": ":p${p}",
                            "${launchMode}": "singleTask")
                }
                config.countTranslucentSingleInstanceLand().times {
                    activity(
                            "${name}": "${applicationID}.${infix}P${p}${LAND}SITS${it}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriL}",
                            "${theme}": "${themeTS}",
                            "${process}": ":p${p}",
                            "${launchMode}": "singleInstance")
                }
                config.countNotTranslucentStandardLand().times {
                    activity(
                            "${name}": "${applicationID}.${infix}P${p}${LAND}NRNTS${it}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriL}",
                            "${theme}": "${themeNTS}",
                            "${process}": ":p${p}")
                }
                config.countNotTranslucentSingleTopLand().times {
                    activity(
                            "${name}": "${applicationID}.${infix}P${p}${LAND}STPNTS${it}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriL}",
                            "${theme}": "${themeNTS}",
                            "${process}": ":p${p}",
                            "${launchMode}": "singleTop")
                }
                config.countNotTranslucentSingleTaskLand().times {
                    activity(
                            "${name}": "${applicationID}.${infix}P${p}${LAND}STNTS${it}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriL}",
                            "${theme}": "${themeNTS}",
                            "${process}": ":p${p}",
                            "${launchMode}": "singleTask")
                }
                config.countNotTranslucentSingleInstanceLand().times {
                    activity(
                            "${name}": "${applicationID}.${infix}P${p}${LAND}SINTS${it}",
                            "${cfg}": "${cfgV}",
                            "${exp}": "${expV}",
                            "${ori}": "${oriL}",
                            "${theme}": "${themeNTS}",
                            "${process}": ":p${p}",
                            "${launchMode}": "singleInstance")
                }

                /* TaskAffinity */
                config.countTask.times { i ->
                    config.countTranslucentStandard.times { j ->
                        activity(
                                "${name}": "${applicationID}.${infix}P${p}TA${i}NRTS${j}",
                                "${cfg}": "${cfgV}",
                                "${exp}": "${expV}",
                                "${ori}": "${oriV}",
                                "${theme}": "${themeTS}",
                                "${process}": ":p${p}",
                                "${task}": ":t${i}")
                    }
                    config.countTranslucentSingleTop.times { j ->
                        activity(
                                "${name}": "${applicationID}.${infix}P${p}TA${i}STPTS${j}",
                                "${cfg}": "${cfgV}",
                                "${exp}": "${expV}",
                                "${ori}": "${oriV}",
                                "${theme}": "${themeTS}",
                                "${launchMode}": "singleTop",
                                "${process}": ":p${p}",
                                "${task}": ":t${i}")
                    }
                    config.countTranslucentSingleTask.times { j ->
                        activity(
                                "${name}": "${applicationID}.${infix}P${p}TA${i}STTS${j}",
                                "${cfg}": "${cfgV}",
                                "${exp}": "${expV}",
                                "${ori}": "${oriV}",
                                "${theme}": "${themeTS}",
                                "${launchMode}": "singleTask",
                                "${process}": ":p${p}",
                                "${task}": ":t${i}")
                    }
                    config.countNotTranslucentStandard.times { j ->
                        activity(
                                "${name}": "${applicationID}.${infix}P${p}TA${i}NRNTS${j}",
                                "${cfg}": "${cfgV}",
                                "${exp}": "${expV}",
                                "${ori}": "${oriV}",
                                "${theme}": "${themeNTS}",
                                "${process}": ":p${p}",
                                "${task}": ":t${i}")
                    }
                    config.countNotTranslucentSingleTop.times { j ->
                        activity(
                                "${name}": "${applicationID}.${infix}P${p}TA${i}STPNTS${j}",
                                "${cfg}": "${cfgV}",
                                "${exp}": "${expV}",
                                "${ori}": "${oriV}",
                                "${theme}": "${themeNTS}",
                                "${launchMode}": "singleTop",
                                "${process}": ":p${p}",
                                "${task}": ":t${i}")
                    }
                    config.countNotTranslucentSingleTask.times { j ->
                        activity(
                                "${name}": "${applicationID}.${infix}P${p}TA${i}STNTS${j}",
                                "${cfg}": "${cfgV}",
                                "${exp}": "${expV}",
                                "${ori}": "${oriV}",
                                "${theme}": "${themeNTS}",
                                "${launchMode}": "singleTask",
                                "${process}": ":p${p}",
                                "${task}": ":t${i}")
                    }

                    // 横屏
                    config.countTranslucentStandardLand().times { j ->
                        activity(
                                "${name}": "${applicationID}.${infix}P${p}${LAND}TA${i}NRTS${j}",
                                "${cfg}": "${cfgV}",
                                "${exp}": "${expV}",
                                "${ori}": "${oriL}",
                                "${theme}": "${themeTS}",
                                "${process}": ":p${p}",
                                "${task}": ":t${i}")
                    }
                    config.countTranslucentSingleTopLand().times { j ->
                        activity(
                                "${name}": "${applicationID}.${infix}P${p}${LAND}TA${i}STPTS${j}",
                                "${cfg}": "${cfgV}",
                                "${exp}": "${expV}",
                                "${ori}": "${oriL}",
                                "${theme}": "${themeTS}",
                                "${launchMode}": "singleTop",
                                "${process}": ":p${p}",
                                "${task}": ":t${i}")
                    }
                    config.countTranslucentSingleTaskLand().times { j ->
                        activity(
                                "${name}": "${applicationID}.${infix}P${p}${LAND}TA${i}STTS${j}",
                                "${cfg}": "${cfgV}",
                                "${exp}": "${expV}",
                                "${ori}": "${oriL}",
                                "${theme}": "${themeTS}",
                                "${launchMode}": "singleTask",
                                "${process}": ":p${p}",
                                "${task}": ":t${i}")
                    }
                    config.countNotTranslucentStandardLand().times { j ->
                        activity(
                                "${name}": "${applicationID}.${infix}P${p}TA${i}NRNTS${LAND}${j}",
                                "${cfg}": "${cfgV}",
                                "${exp}": "${expV}",
                                "${ori}": "${oriL}",
                                "${theme}": "${themeNTS}",
                                "${process}": ":p${p}",
                                "${task}": ":t${i}")
                    }
                    config.countNotTranslucentSingleTopLand().times { j ->
                        activity(
                                "${name}": "${applicationID}.${infix}P${p}${LAND}TA${i}STPNTS${j}",
                                "${cfg}": "${cfgV}",
                                "${exp}": "${expV}",
                                "${ori}": "${oriL}",
                                "${theme}": "${themeNTS}",
                                "${launchMode}": "singleTop",
                                "${process}": ":p${p}",
                                "${task}": ":t${i}")
                    }
                    config.countNotTranslucentSingleTaskLand().times { j ->
                        activity(
                                "${name}": "${applicationID}.${infix}P${p}${LAND}TA${i}STNTS${j}",
                                "${cfg}": "${cfgV}",
                                "${exp}": "${expV}",
                                "${ori}": "${oriL}",
                                "${theme}": "${themeNTS}",
                                "${launchMode}": "singleTask",
                                "${process}": ":p${p}",
                                "${task}": ":t${i}")
                    }
                }

                /* Provider */
                // 支持插件中的 Provider 调用
                provider("${name}": "com.qihoo360.replugin.component.provider.PluginPitProviderP${p}",
                        "android:authorities": "${applicationID}.Plugin.NP.${p}",
                        "${process}": ":p${p}",
                        "${exp}": "${expV}")

                // fixme hujunjie 100 不写死
                // 支持进程Provider拉起
                provider("${name}": "com.qihoo360.replugin.component.process.ProcessPitProviderP${p}",
                        "android:authorities": "${applicationID}.loader.p.mainN${100 - p}",
                        "${process}": ":p${p}",
                        "${exp}": "${expV}")

                /* Service */
                // 支持使用插件的Service坑位
                // Added by Jiongxuan Zhang
                service("${name}": "com.qihoo360.replugin.component.service.server.PluginPitServiceP${p}",
                        "${process}": ":p${p}",
                        "${exp}": "${expV}")
            }
        }

        // 删除 application 标签
        return writer.toString().replace("<application>", "").replace("</application>", "")
    }
}


================================================
FILE: replugin-host-gradle/src/main/resources/META-INF/gradle-plugins/replugin-host-gradle.properties
================================================
#
# Copyright (C) 2005-2017 Qihoo 360 Inc.
#
# 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
#
# http://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.
#
implementation-class=com.qihoo360.replugin.gradle.host.Replugin


================================================
FILE: replugin-host-library/README.md
================================================
# RePlugin Host Library

RePlugin Host Library是一个Java工程,由 **主程序** 负责引入。

几乎所有和RePlugin相关的代码都在其中,是核心工程。

开发者需要依赖此Library,以实现对RePlugin的接入。请参见WiKi以了解接入方法。

有关RePlugin Host Library的详细描述,请访问我们的WiKi,以了解更多的内容。

================================================
FILE: replugin-host-library/build.gradle
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id 'com.android.application' version '7.4.2' apply false
    id 'maven-publish'
}

configure(allprojects - project(':replugin-host-lib')) {
    println "applying java plugin to $project"
    apply plugin: 'java-library'
}


================================================
FILE: replugin-host-library/gradle/wrapper/gradle-wrapper.properties
================================================
#
# Copyright (C) 2005-2017 Qihoo 360 Inc.
#
# 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
#
# http://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.
#

#Fri Mar 03 10:15:50 CST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip


================================================
FILE: replugin-host-library/gradle.properties
================================================
#
# Copyright (C) 2005-2017 Qihoo 360 Inc.
#
# 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
#
# http://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.
#

# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true


================================================
FILE: replugin-host-library/gradlew
================================================
#!/usr/bin/env bash

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

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

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

# 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
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
esac

# 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

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" ] ; 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

# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
    JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"


================================================
FILE: replugin-host-library/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

@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=

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

@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 Windowz variants

if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_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=%*
goto execute

:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
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: replugin-host-library/replugin-host-lib/bintray.gradle
================================================
apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.bintray'

def siteUrl = ''
def gitUrl = ''

group = 'com.qihoo360.replugin'
version = '3.1.0'

//生成文档注释
task androidJavadocs(type: Javadoc) {
    failOnError = false
    source = android.sourceSets.main.java.srcDirs
    ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
    classpath += files(ext.androidJar)
}
//将文档打包成jar
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
    archiveClassifier.set('javadoc')
    from androidJavadocs.destinationDir
}
//将源码打包,这一点对kotlin来说很重要,否则业务侧无法看到源码
task androidSourcesJar(type: Jar) {
    archiveClassifier.set('sources')
    from android.sourceSets.main.java.srcDirs
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            groupId = group
            artifactId = 'replugin-host-lib'
            version = version
            artifact(androidSourcesJar)//将源码打包进aar,如果不需要可以去掉
            artifact(androidJavadocsJar)//将注释打包进aar,如果不需要可以去掉
            versionMapping {
                usage('java-api') {
                    fromResolutionOf('runtimeClasspath')
                }
                usage('java-runtime') {
                    fromResolutionResult()
                }
            }
            pom {
                name = 'My Library'
                description = 'RePlugin - A flexible, stable, easy-to-use Android Plug-in Framework'
                url = siteUrl
                properties = [
                         myProp: "value",
                        "prop.with.dots": "anotherValue"
                ]
                licenses {
                    license {
                        name = 'The Apache License, Version 2.0'
                        url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                developers {
                    developer {
                        id 'qihoo360'    //填写的一些基本信息
                        name 'qihoo360'
                        email 'replugin@gmail.com'
                    }
                }
                scm {
                    connection gitUrl
                    developerConnection gitUrl
                    url siteUrl
                }
            }
        }
    }
//    repositories {
//        maven {
//            // change URLs to point to your repos, e.g. http://my.org/repo
//            def releasesRepoUrl = layout.buildDirectory.dir('repos/releases')
//            def snapshotsRepoUrl = layout.buildDirectory.dir('repos/snapshots')
//            url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
//        }
//    }
}


================================================
FILE: replugin-host-library/replugin-host-lib/build.gradle
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

/**
 * @author RePlugin Team
 */
plugins {
    id 'com.android.library'
    id 'maven-publish'
}

android {
    namespace 'com.qihoo360.mobilesafe.core'
    compileSdk 34

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 34

        versionCode 2
        versionName version
        consumerProguardFiles 'replugin-rules.pro'

        buildConfigField "int", 'VERSION_CODE', String.valueOf(2)
        buildConfigField 'String', 'VERSION_NAME', "\"" + version + "\""
    }

    lintOptions {
        abortOnError false
    }

    // 务必要加上此段话,这样默认会出Debug版AAR,会带上日志方便定位
    defaultPublishConfig "debug"

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

project.ext.RP_ARTIFACT_ID = 'replugin-host-lib'
apply from: '../../rp-publish.gradle'


================================================
FILE: replugin-host-library/replugin-host-lib/replugin-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ./sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# 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 *;
#}

# ——————————————————————————————————————
# aar 的接入方在构建 apk 时会使用的混淆规则
#
# 即:此处 keep 的内容可以被宿主'插件'调用,宿主的 Release 中,以下内容也可以访问。
# 注:因为 proguardFiles 也添加了此文件,所以生成 aar 包时,也会应用此混淆规则。
# ————————————————————————————————————————————————————————————————————————————

# RePlugin混淆时必须用到的。有两个目的:
# 1. 不添加该方法,则插件在运行时会抛出各种异常(因为需要调用一些Keep住的类)
# 2. 防止恶意开发者对RePlugin做反编译,并对您的应用做出一些破坏性的处理

# ——————————————————————————————————————

# 混淆时将LogDebug全部干掉,防止泄露到外界。需使用sdk/proguard-android-optimize.txt
# 【有问题,已注释掉】,因为它对“带操作符”和“需要函数调用”的地方不会被优化掉。如,原来是
#       LogDebug.d("XXX", "YYY" + a);
# 优化后变成:
#       new StringBuilder("YYY").append(a);
# 等于还是输出了Log。
# -assumenosideeffects class com.qihoo360.replugin.helper.LogDebug

# -keepattributes SourceFile,LineNumberTable
-keepattributes LineNumberTable

# 架构基础类
-keep class com.qihoo360.replugin.RePlugin {
    public protected *;
}
# LocalBroadcastManager,插件会用
-keep public class android.support.v4.content.LocalBroadcastManager {
    public *;
}

# 架构具体实现,和插件反射调用部分
-keep class com.qihoo360.replugin.model.PluginInfo {
    public protected *;
}
-keep class com.qihoo360.replugin.IBinderGetter {
     public protected *;
}
-keep class com.qihoo360.replugin.component.ComponentList {
    public protected *;
}
-keep class com.qihoo360.framework.** {
    public protected *;
}
-keep class com.qihoo360.i.** {
    public protected *;
}
-keep class com.qihoo360.plugins.** {
    public protected *;
}
-keep class com.qihoo360.plugin.** {
    public protected *;
}
-keep class com.qihoo360.replugin.component.dummy.** {
    public protected *;
}
-keep class com.qihoo360.replugin.component.provider.PluginProviderClient {
    public protected *;
}
-keep class com.qihoo360.replugin.component.provider.PluginProviderClient2 {
    public protected *;
}
-keep class com.qihoo360.replugin.component.service.PluginServiceClient {
    public protected *;
}
-keep class com.qihoo360.replugin.component.provider.PluginPitProviderP0 { public protected *; }
-keep class com.qihoo360.replugin.component.provider.PluginPitProviderP1 { public protected *; }
-keep class com.qihoo360.replugin.component.provider.PluginPitProviderP2 { public protected *; }

# ProcessPitProviderP0 未被自动 keep
-keep class com.qihoo360.replugin.component.process.ProcessPitProviderP0 { public protected *; }
-keep class com.qihoo360.replugin.component.process.ProcessPitProviderP1 { public protected *; }
-keep class com.qihoo360.replugin.component.process.ProcessPitProviderP2 { public protected *; }

# TODO 可能要废弃的类。目前旧卫士插件在用
# Pref
-keep public class com.qihoo360.mobilesafe.api.Pref {
    public *;
}
# IPC
-keep public class com.qihoo360.replugin.base.IPC {
    public *;
}
# QihooServiceManager
-keep public class com.qihoo360.mobilesafe.svcmanager.QihooServiceManager {
    public *;
}
# Old PPC/PSC
-keep class com.qihoo360.loader2.mgr.PluginProviderClient {
    public protected *;
}
-keep class com.qihoo360.loader2.mgr.PluginServiceClient {
    public protected *;
}

# ------------ keep 以下类,以防卫士主程序 AOP DEBUG 失败 ------------
-keep class com.qihoo360.replugin.component.activity.ActivityInjector { *;}

# replugin-host-gradle 生成的 java 文件
-keep class com.qihoo360.replugin.gen.RePluginHostConfig { public *; }


================================================
FILE: replugin-host-library/replugin-host-lib/src/main/AndroidManifest.xml
================================================
<!--
  ~ Copyright (C) 2005-2017 Qihoo 360 Inc.
  ~
  ~ 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
  ~
  ~ http://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.
  -->

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.qihoo360.mobilesafe.core">

    <application>

        <!-- 注意:此文件不要写入与'坑位'配置相关的组件(Activity、Provider),它们由 gradle 插件自动生成) -->
        <!-- 注意:此文件不要写入与'坑位'配置相关的组件(Activity、Provider),它们由 gradle 插件自动生成) -->
        <!-- 注意:此文件不要写入与'坑位'配置相关的组件(Activity、Provider),它们由 gradle 插件自动生成) -->

        <!-- ======================================================================== -->
        <!-- 开始:插件stub -->
        <!-- Activity坑中的screenSize属性 7.3.0以上才支持 -->

        <provider
            android:name="com.qihoo360.replugin.component.process.ProcessPitProviderUI"
            android:authorities="${applicationId}.loader.p.mainN1"
            android:exported="false" />
        <provider
            android:name="${applicationId}.loader.p.ProviderN1"
            android:authorities="${applicationId}.loader.p.prN1"
            android:exported="false" />

        <service
            android:name="${applicationId}.loader.s.ServiceN1"
            android:exported="false" />

        <provider
            android:name="com.qihoo360.replugin.component.process.ProcessPitProviderLoader0"
            android:authorities="${applicationId}.loader.p.main0"
            android:exported="false"
            android:process=":loader0" />
        <provider
            android:name="${applicationId}.loader.p.Provider0"
            android:authorities="${applicationId}.loader.p.pr0"
            android:exported="false"
            android:process=":loader0" />

        <service
            android:name="${applicationId}.loader.s.Service0"
            android:exported="false"
            android:process=":loader0" />

        <activity
            android:name="${applicationId}.loader.a.Activity0_singleTask1"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:exported="false"
            android:launchMode="singleTask"
            android:process=":loader0"
            android:screenOrientation="portrait"
            android:taskAffinity=":loader0"
            android:theme="@android:style/Theme.NoTitleBar" />
        <activity
            android:name="${applicationId}.loader.a.Activity0_singleInstance1"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:exported="false"
            android:launchMode="singleInstance"
            android:process=":loader0"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.NoTitleBar" />
        <activity
            android:name="${applicationId}.loader.a.Activity0_task"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:exported="false"
            android:process=":loader0"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.NoTitleBar" />
        <activity
            android:name="${applicationId}.loader.a.Activity0_fullscreen"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:exported="false"
            android:process=":loader0"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
        <activity
            android:name="${applicationId}.loader.a.Activity0_translucent"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:exported="false"
            android:process=":loader0"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
        <activity
            android:name="${applicationId}.loader.a.Activity0_translucent_fullscreen"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:exported="false"
            android:process=":loader0"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
        <activity
            android:name="${applicationId}.loader.a.Activity0_dialog"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:exported="false"
            android:process=":loader0"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Dialog" />
        <activity
            android:name="${applicationId}.loader.a.Activity0"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:exported="false"
            android:process=":loader0"
            android:screenOrientation="portrait"
            android:taskAffinity=":loader0"
            android:theme="@android:style/Theme.NoTitleBar" />

        <provider
            android:name="com.qihoo360.replugin.component.process.ProcessPitProviderLoader1"
            android:authorities="${applicationId}.loader.p.main1"
            android:exported="false"
            android:process=":loader1" />
        <provider
            android:name="${applicationId}.loader.p.Provider1"
            android:authorities="${applicationId}.loader.p.pr1"
            android:exported="false"
            android:process=":loader1" />

        <service
            android:name="${applicationId}.loader.s.Service1"
            android:exported="false"
            android:process=":loader1" />

        <activity
            android:name="${applicationId}.loader.a.Activity1_singleTask1"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:exported="false"
            android:launchMode="singleTask"
            android:process=":loader1"
            android:screenOrientation="portrait"
            android:taskAffinity=":loader1"
            android:theme="@android:style/Theme.NoTitleBar" />
        <activity
            android:name="${applicationId}.loader.a.Activity1_singleInstance1"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:exported="false"
            android:launchMode="singleInstance"
            android:process=":loader1"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.NoTitleBar" />
        <activity
            android:name="${applicationId}.loader.a.Activity1_task"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:exported="false"
            android:process=":loader1"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.NoTitleBar" />
        <activity
            android:name="${applicationId}.loader.a.Activity1_fullscreen"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:exported="false"
            android:process=":loader1"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
        <activity
            android:name="${applicationId}.loader.a.Activity1_translucent"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:exported="false"
            android:process=":loader1"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
        <activity
            android:name="${applicationId}.loader.a.Activity1_translucent_fullscreen"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:exported="false"
            android:process=":loader1"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
        <activity
            android:name="${applicationId}.loader.a.Activity1_dialog"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:exported="false"
            android:process=":loader1"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Dialog" />
        <activity
            android:name="${applicationId}.loader.a.Activity1"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:exported="false"
            android:process=":loader1"
            android:screenOrientation="portrait"
            android:taskAffinity=":loader1"
            android:theme="@android:style/Theme.NoTitleBar" />

        <provider
            android:name="com.qihoo360.replugin.component.provider.PluginPitProviderUI"
            android:authorities="${applicationId}.Plugin.NP.UIP"
            android:exported="false" />

        <service
            android:name="com.qihoo360.replugin.component.service.server.PluginPitServiceUI" />

        <!-- 结束:插件stub -->
        <!-- ======================================================================== -->

        <!-- 在UI进程中安装插件。请参见类的说明 -->
        <provider
            android:name="com.qihoo360.replugin.packages.PluginFastInstallProvider"
            android:authorities="${applicationId}.loader.p.pip"
            android:exported="false" >
        </provider>

    </application>
</manifest>


================================================
FILE: replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/loader2/IPlugin.aidl
================================================
package com.qihoo360.loader2;

/**
 * @author RePlugin Team
 */
interface IPlugin {

    IBinder query(String name);
}


================================================
FILE: replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/loader2/IPluginClient.aidl
================================================
package com.qihoo360.loader2;

import com.qihoo360.replugin.component.service.server.IPluginServiceServer;

/**
 * @author RePlugin Team
 */
interface IPluginClient {

    // 参数 plugin, process 可能有冗余,目前临时使用,后续可能优化
    String allocActivityContainer(String plugin, int process, String target, in Intent intent);

    // 参数 plugin 用来处理多插件单进程情况
    IBinder queryBinder(String plugin, String binder);

    void releaseBinder();

    oneway void sendIntent(in Intent intent);

    void sendIntentSync(in Intent intent);

    int sumActivities();

    IPluginServiceServer fetchServiceServer();

    /**
     * 插件收到广播
     *
     * @param plugin   插件名称
     * @param receiver Receiver 名称
     * @param Intent   广播的 Intent 数据
     */
    void onReceive(String plugin, String receiver, in Intent intent);

    /**
     * dump通过插件化框架启动起来的Service信息
     */
    String dumpServices();

    /**
     * dump插件化框架中存储的详细Activity坑位映射表
     */
    String dumpActivities();
}

================================================
FILE: replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/loader2/IPluginHost.aidl
================================================
package com.qihoo360.loader2;

import android.content.IntentFilter;
import android.content.Intent;

import com.qihoo360.loader2.IPluginClient;
import com.qihoo360.loader2.PluginBinderInfo;
import com.qihoo360.replugin.model.PluginInfo;

import com.qihoo360.replugin.component.service.server.IPluginServiceServer;

import com.qihoo360.replugin.packages.IPluginManagerServer;

/**
 * @author RePlugin Team
 */
interface IPluginHost {

    void installBinder(String name, in IBinder binder);

    IBinder fetchBinder(String name);

    long fetchPersistentCookie();

    IPluginClient startPluginProcess(String plugin, int process, inout PluginBinderInfo info);

    String attachPluginProcess(String process, int index, in IBinder binder, String def);

    List<PluginInfo> listPlugins();

    void regActivity(int index, String plugin, String container, String activity);

    void unregActivity(int index, String plugin, String container, String activity);

    void regService(int index, String plugin, String service);

    void unregService(int index, String plugin, String service);

    void regPluginBinder(in PluginBinderInfo info, IBinder binder);

    void unregPluginBinder(in PluginBinderInfo info, IBinder binder);

    /**
    * 注册某插件下所有静态声明的的 receiver 到常驻进程
    */
    void regReceiver(String plugin, in Map receiverFilterMap);

    void unregReceiver();

    /**
     * 插件收到广播
     *
     * @param plugin 插件名称
     * @param receiver Receiver 名称
     * @param Intent 广播的 Intent 数据
     */
    void onReceive(String plugin, String receiver, in Intent intent);

    int sumBinders(int index);

    void updatePluginInfo(in PluginInfo info);

    PluginInfo pluginDownloaded(String path);

    boolean pluginUninstalled(in PluginInfo info);

    boolean pluginExtracted(String path);

    oneway void sendIntent2Process(String target, in Intent intent);

    oneway void sendIntent2Plugin(String target, in Intent intent);

    void sendIntent2ProcessSync(String target, in Intent intent);

    void sendIntent2PluginSync(String target, in Intent intent);

    boolean isProcessAlive(String name);

    IBinder queryPluginBinder(String plugin, String binder);

    /**
     * 根据 Inent 查询所有插件中的与之匹配的 Receivers
     */
    List queryPluginsReceiverList(in Intent intent);

    /**
     * 获取“全新Service管理方案”在Server端的服务
     * Added by Jiongxuan Zhang
     */
    IPluginServiceServer fetchServiceServer();

    /**
     * 获取 IPluginManagerServer(纯APK方案使用)的插件服务
     * Added by Jiongxuan Zhang
     */
    IPluginManagerServer fetchManagerServer();

    /**
     * 根据 taskAffinity,判断应该取第几组 TaskAffinity
     * 由于 taskAffinity 是跨进程的属性,所以这里要将 taskAffinityGroup 的数据保存在常驻进程中
     * Added by hujunjie
     */
    int getTaskAffinityGroupIndex(String taskAffinity);

    /**
     * 通过进程名来获取PID
     */
    int getPidByProcessName(String processName);

    /**
     * 通过PID来获取进程名
     */
    String getProcessNameByPid(int pid);

    /**
     * dump详细的运行时信息
     */
    String dump();
}

================================================
FILE: replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/loader2/PluginBinderInfo.aidl
================================================
package com.qihoo360.loader2;

parcelable PluginBinderInfo;

================================================
FILE: replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/loader2/mgr/IServiceConnection.aidl
================================================
// IServiceConnection.aidl
// Same as android.app.IServiceConnection
package com.qihoo360.loader2.mgr;

import android.content.ComponentName;

/** @hide */
oneway interface IServiceConnection {
    void connected(in ComponentName name, IBinder service);
}


================================================
FILE: replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/loader2/sp/IPref.aidl
================================================
package com.qihoo360.loader2.sp;

import android.os.Bundle;

/**
 * @author RePlugin Team
 */
interface IPref {

    String get(String category, String key, String defValue);

    void set(String category, String key, String value);

    Bundle getAll(String category);
}


================================================
FILE: replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/mobilesafe/svcmanager/IServiceChannel.aidl
================================================
package com.qihoo360.mobilesafe.svcmanager;

import com.qihoo360.replugin.IBinderGetter;

interface IServiceChannel {

    IBinder getService(String serviceName);

    void addService(String serviceName, IBinder service);

    void addServiceDelayed(String serviceName, IBinderGetter getter);

    void removeService(String serviceName);

    IBinder getPluginService(String pluginName, String serviceName, IBinder deathMonitor);

    void onPluginServiceRefReleased(String pluginName, String serviceName);
}

================================================
FILE: replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/replugin/IBinderGetter.aidl
================================================
package com.qihoo360.replugin;

/**
 * Binder的获取器,可用于延迟加载IBinder的情况。
 * <p>
 * 目前用于:
 * <p>
 * * RePlugin.registerGlobalBinderDelayed
 *
 * @author RePlugin Team
 */
interface IBinderGetter {

    /**
     * 获取IBinder对象
     */
    IBinder get();
}


================================================
FILE: replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/replugin/component/service/server/IPluginServiceServer.aidl
================================================
package com.qihoo360.replugin.component.service.server;

import android.content.ComponentName;
import android.os.Messenger;

import com.qihoo360.loader2.mgr.IServiceConnection;

/**
 * 负责Server端的服务调度、提供等工作,是服务的提供方,核心类之一
 *
 * @hide 框架内部使用
 * @author RePlugin Team
 */
interface IPluginServiceServer {
    ComponentName startService(in Intent intent, in Messenger client);
    int stopService(in Intent intent, in Messenger client);

    int bindService(in Intent intent, in IServiceConnection conn, int flags, in Messenger client);
    boolean unbindService(in IServiceConnection conn);

    String dump();
}

================================================
FILE: replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/replugin/model/PluginInfo.aidl
================================================
package com.qihoo360.replugin.model;

parcelable PluginInfo;

================================================
FILE: replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/replugin/packages/IPluginManagerServer.aidl
================================================
package com.qihoo360.replugin.packages;

import com.qihoo360.replugin.model.PluginInfo;
import com.qihoo360.replugin.packages.PluginRunningList;

/**
 * 插件管理器。用来控制插件的安装、卸载、获取等。运行在常驻进程中
 * <p>
 * 补充:涉及到插件交互、运行机制有关的管理器,在IPluginHost中
 *
 * @author RePlugin Team
 */
interface IPluginManagerServer {

    /**
     * 安装一个插件
     * <p>
     * 注意:若为旧插件(p-n开头),则应使用IPluginHost的pluginDownloaded方法
     *
     * @return 安装的插件的PluginInfo对象
     */
    PluginInfo install(String path);

    /**
     * 卸载一个插件
     * <p>
     * 注意:只针对“纯APK”插件方案
     *
     * @param info 插件信息
     * @return 是否成功卸载插件?
     */
    boolean uninstall(in PluginInfo info);

    /**
     * 加载插件列表,方便之后使用
     * <p>
     * TODO 这里只返回"新版插件",供PmBase使用。将来会合并
     *
     * @return PluginInfo的列表
     */
    List<PluginInfo> load();

    /**
     * 更新所有插件列表
     *
     * @return PluginInfo的列表
     */
    List<PluginInfo> updateAll();

    /**
     * 设置isUsed状态,并通知所有进程更新
     *
     * @param pluginName 插件名
     * @param used 是否已经使用
     */
    void updateUsed(String pluginName, boolean used);

    /**
     * 获取正在运行的插件列表
     *
     * @return 正在运行的插件名列表
     */
    PluginRunningList getRunningPlugins();

    /**
     * 插件是否正在运行?
     *
     * @param pluginName 插件名
     * @param process 指定进程名,如为Null则表示查所有
     * @return 是否在运行?
     */
    boolean isPluginRunning(String pluginName, String process);

    /**
     * 当进程启动时,同步正在运行的插件状态到Server端
     *
     * @param list         正在运行的插件名列表
     */
    void syncRunningPlugins(in PluginRunningList list);

    /**
     * 当进程启动时,同步正在运行的插件状态到Server端
     *
     * @param processName  进程名
     * @param pluginName   正在运行的插件名
     */
    void addToRunningPlugins(String processName, int pid, String pluginName);

    /**
     * 获取正在运行此插件的进程名列表
     *
     * @param pluginName 要查询的插件名
     * @return 正在运行此插件的进程名列表。一定不会为Null
     */
    String[] getRunningProcessesByPlugin(String pluginName);

    /**
     * 预安装内置插件到app_p_a目录,只做p.l文件的写入,真正的安装执行,在做插件Load的时候执行
     *
     * @param 待安装的插件列表
     * @return 安装后的所有插件列表
     */
    List<PluginInfo> preInstallBuiltins(in List<PluginInfo> pluginInfos);

    void updateTP(String plugin,int type,String path);

     /**
      * 设置isUsed状态,并通知所有进程更新
      *
      * @param pluginName 插件名
      * @param path 是否已经使用
      * @param type 是否已经使用
      * @param used 是否已经使用
      */
    void updateUsedNew(String pluginName, String path, int type, boolean used);


}


================================================
FILE: replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/replugin/packages/PluginRunningList.aidl
================================================
package com.qihoo360.replugin.packages;

parcelable PluginRunningList;

================================================
FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/i/Factory.java
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

package com.qihoo360.i;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.ServiceInfo;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.text.TextUtils;

import com.qihoo360.loader2.PluginCommImpl;
import com.qihoo360.mobilesafe.core.BuildConfig;
import com.qihoo360.replugin.RePlugin;
import com.qihoo360.replugin.component.ComponentList;

import java.util.List;

/**
 * Wrapper类,简化使用代码
 *
 * <p>插件文件名规范:barcode-1-10-2.jar<p>
 * <ul>
 * <li>
 * 最小支持版本 :例如 1<br>
 * 插件可选择host/adapter,低于该版本的host/adapter是无法使用<br>
 * 即插件可限制老的host/adapter不能使用,只能在特定版本以后的新的host/adapter使用
 * </li>
 * <li>
 * 当前接口版本:例如 10<br>
 * host/adapter可选择插件
 * </li>
 * <li>
 * 插件自身版本:例如 2<br>
 * 通常是用来表示是一个bug修复版本
 * </li>
 * </ul>
 *
 * <p>适配器文件名规范:adapter-1-10-3.jar<p>
 * <ul>
 * <li>
 * 支持接口版本 :例如 1<br>
 * 表明该适配器支持的主程序
 * </li>
 * <li>
 * 当前接口版本:例如 10<br>
 * 当插件的当前接口版本小于或等于该值时才会加载,即适配器可选择特定版本以前的插件<br>
 * 也就是说,限制只能使用较老插件,不支持超出适配器能力之外的插件
 * </li>
 * <li>
 * 适配器自身版本:例如 3<br>
 * 通常是用来表示是一个bug修复版本
 * </li>
 * </ul>
 *
 * @author RePlugin Team
 * @deprecated 慢慢会被废弃掉,只留着旧卫士插件反射用。现阶段先不做优化
 */
public final class Factory {

    /**
     * 插件的入口包名前缀
     * 在插件中,该包名不能混淆
     * 例如,二维码的插件入口类为:com.qihoo360.plugin.barcode.Entry
     * @hide 内部框架使用
     */
    public static final String PLUGIN_ENTRY_PACKAGE_PREFIX = "com.qihoo360.plugin";

    /**
     * 新版SDK(RePlugin-library)插件入口报名前缀
     * 在插件中,该包名不能混淆
     */
    public static final String REPLUGIN_LIBRARY_ENTRY_PACKAGE_PREFIX = "com.qihoo360.replugin";

    /**
     * 插件的入口类
     * 在插件中,该名字不能混淆
     * @hide 内部框架使用
     */
    public static final String PLUGIN_ENTRY_CLASS_NAME = "Entry";

    /**
     * 插件的入口类导出函数
     * 在插件中,该方法名不能混淆
     * 通过该函数创建IPlugin对象
     * @hide 内部框架使用
     */
    public static final String PLUGIN_ENTRY_EXPORT_METHOD_NAME = "create";

    /**
     * 参数1:插件上下文,可通过它获取应用上下文
     * 参数2:
     * @hide 内部框架使用
     */
    public static final Class<?> PLUGIN_ENTRY_EXPORT_METHOD_PARAMS[] = {
        Context.class, IPluginManager.class
    };

    /**
     * 参数1:插件上下文,可通过它获取应用上下文
     * 参数2:HOST的类加载器
     * 参数3:已废弃
     * 返回:插件 IPlugin.aidl
     * @hide 内部框架使用
     */
    public static final Class<?> PLUGIN_ENTRY_EXPORT_METHOD2_PARAMS[] = {
        Context.class, ClassLoader.class, IBinder.class
    };

    /**
     * @hide 内部框架使用
     */
    public static PluginCommImpl sPluginManager;

    /**
     * @deprecated 新插件框架不再用i接口依赖,此接口已废弃
     * @param name 插件名
     * @param c 需要查询的interface的类
     * @return
     */
    @Deprecated
    public static final IModule query(String name, Class<? extends IModule> c) {
        return sPluginManager.query(name, c);
    }

    /**
     * 调用此接口不会在当前进程加载插件
     * @param name 插件名
     * @return
     */
    public static final boolean isPluginLoaded(String name) {
        return sPluginManager.isPluginLoaded(name);
    }

    /**
     * 调用此接口会在当前进程加载插件
     * @param name 插件名
     * @param binder 需要查询的binder的名称(不要用IXXX.class.getName,因为不再建议keep IXXX类,IXXX有可能被混淆)
     * @return
     */
    public static final IBinder query(String name, String binder) {
        return sPluginManager.query(name, binder);
    }

    /**
     * 调用此接口会在指定进程加载插件
     * @param name 插件名
     * @param binder 需要查询的binder的名称(不要用IXXX.class.getName,因为不再建议keep IXXX类,IXXX有可能被混淆)
     * @param process 是否在指定进程中启动
     * @return
     */
    public static final IBinder query(String name, String binder, int process) {
        return sPluginManager.query(name, binder, process);
    }

    /**
     * 警告:低层接口
     * 当插件升级之后,通过adapter.jar标准接口,甚至invoke接口都无法完成任务时,可通过此接口反射来完成任务
     * 调用此接口会在当前进程加载插件
     * @param name 插件名
     * @return 插件的context,可通过此context得到插件的ClassLoader
     */
    public static final Context queryPluginContext(String name) {
        return sPluginManager.queryPluginContext(name);
    }

    /**
     * 警告:低层接口
     * 调用此接口会在当前进程加载插件(不加载代码,只加载资源和PackageInfo)
     * @param name 插件名
     * @return 插件的Resources
     */
    public static final Resources queryPluginResouces(String name) {
        return sPluginManager.queryPluginResouces(name);
    }

    /**
     * 警告:低层接口
     * 调用此接口会在当前进程加载插件(不加载代码和资源,只获取PackageInfo)
     * @param name 插件名
     * @return 插件的PackageInfo
     */
    public static final PackageInfo queryPluginPackageInfo(String name) {
        return sPluginManager.queryPluginPackageInfo(name);
    }

    /**
     * 警告:低层接口
     * 调用此接口会在当前进程加载插件(不加载代码和资源,只获取PackageInfo)
     *
     * @param pkgName 插件包名
     * @param flags   Flags
     * @return 插件的PackageInfo
     */
    public static final PackageInfo queryPluginPackageInfo(String pkgName, int flags) {
        return sPluginManager.queryPluginPackageInfo(pkgName, flags);
    }

    /**
     * 警告:低层接口
     * 调用此接口会在当前进程加载插件(不加载代码和资源,只获取ComponentList)
     * @param name 插件名
     * @return 插件的ComponentList
     */
    public static final ComponentList queryPluginComponentList(String name) {
        return sPluginManager.queryPluginComponentList(name);
    }

    /**
     * 警告:低层接口
     * 调用此接口会在当前进程加载插件(不启动App)
     * @param name 插件名
     * @return 插件的ComponentList
     */
    public static final ClassLoader queryPluginClassLoader(String name) {
        return sPluginManager.queryPluginClassLoader(name);
    }

    /**
     * 根据 插件名称 和 Activity 名称 查询 ActivityInfo
     *
     * @param name      插件名称
     * @param className Activity 名称
     * @return Activity 对应的 ActivityInfo
     */
    public static final ActivityInfo queryActivityInfo(String name, String className) {
        ComponentList componentList = sPluginManager.queryPluginComponentList(name);
        if (componentList != null) {
            return componentList.getActivity(className);
        } else {
            return null;
        }
    }

    /**
     * 根据 插件名称 和 Service 名称 查询 ServiceInfo
     *
     * @param name      插件名称
     * @param className Service 名称
     * @return Service 对应的 ServiceInfo
     */
    public static final ServiceInfo queryServiceInfo(String name, String className) {
        ComponentList componentList = sPluginManager.queryPluginComponentList(name);
        if (componentList != null) {
            return componentList.getService(className);
        } else {
            return null;
        }
    }

    /**
     * 根据 activity 和 intent 中的数据获取 ActivityInfo 信息
     * @param plugin 插件名
     * @param activity Activity 名称
     * @param intent 其中可能包含 action
     */
    public static ActivityInfo getActivityInfo(String plugin, String activity, Intent intent) {
        return sPluginManager.getActivityInfo(plugin, activity, intent);
    }

    /**
     * 根据 action 从插件获取 receiver 列表
     *
     * @return 符合 action 的所有 ReceiverInfo
     */
    public static List<ActivityInfo> queryPluginsReceiverList(Intent intent) {
        return sPluginManager.queryPluginsReceiverList(intent);
    }

    /**
     * 启动一个插件中的activity,如果插件不存在会触发下载界面
     * @deprecated 只为旧插件而用。请使用RePlugin.startActivity方法
     * @param context 应用上下文或者Activity上下文
     * @param intent Intent对象
     * @param plugin 插件名
     * @param activity 待启动的activity类名
     * @param process 是否在指定进程中启动
     * @return 插件机制层,是否成功,例如没有插件存在、没有合适的Activity坑
     */
    public static final boolean startActivity(Context context, Intent intent, String plugin, String activity, int process) {

        // 此方法“唯一”调用路径是从插件或主程序中调用Factory.startActivity,表示调用方是“要求”打开插件Activity的,排除了要打开宿主Activity的情况
        // 为了和旧插件Factory.startActivity方法兼容,判断当plugin和activity均有值,则自动帮其填入
        // 注意:
        // 1. 仅在此方法上生效,其余方法均不能这么做,防止出现“本想打开宿主,结果定向到了插件”的问题
        // 2. 若以Action打开,则无需(也不能)填写ComponentName
        // 3. plugin/activity会覆盖Intent.ComponentName(为兼容旧插件),毕竟在框架内部,这两个组合也是优先于CN的
        // Added by Jiongxuan Zhang
        if (!TextUtils.isEmpty(plugin) && !TextUtils.isEmpty(activity)) {
            intent.setComponent(RePlugin.createComponentName(plugin, activity));
        }
        return startActivityWithNoInjectCN(context, intent, plugin, activity, process);
    }

    /**
     * 内部接口,仅为Factory2.startActivity(context, intent) 和 RePlugin.startActivity方法而使用
     *
     * @param context  应用上下文或者Activity上下文
     * @param intent   Intent对象
     * @param plugin   插件名
     * @param activity 待启动的activity类名
     * @param process  是否在指定进程中启动
     * @return 插件机制层,是否成功,例如没有插件存在、没有合适的Activity坑
     * Added by Jiongxuan Zhang
     */
    public static final boolean startActivityWithNoInjectCN(Context context, Intent intent, String plugin, String activity, int process) {
        boolean result = sPluginManager.startActivity(context, intent, plugin, activity, process);

        RePlugin.getConfig().getEventCallbacks().onStartActivityCompleted(plugin, activity, result);
        return result;
    }

    /**
     * 加载插件Activity,在startActivity之前调用
     * @param intent
     * @param plugin 插件名
     * @param target 目标Activity名,如果传null,则取获取到的第一个
     * @param process 是否在指定进程中启动
     * @return
     */
    public static final ComponentName loadPluginActivity(Intent intent, String plugin, String target, int process) {
        return sPluginManager.loadPluginActivity(intent, plugin, target, process);
    }

    /**
     * 加载插件Service,在startService、bindService之前调用
     * @param plugin 插件名
     * @param target 目标Service名,如果传null,则取获取到的第一个
     * @param process 是否在指定进程中启动
     * @return
     */
    public static final ComponentName loadPluginService(String plugin, String target, int process) {
        return sPluginManager.loadPluginService(plugin, target, process);
    }

    /**
     * 加载插件的Provider,在使用插件的Provider之前调用
     * @param plugin 插件名
     * @param target 目标Provider名,如果传null,则取获取到的第一个
     * @param process 是否在指定进程中启动
     * @return
     *
     * @deprecated 已废弃,请使用PluginProviderClient里面的方法
     */
    @Deprecated
    public static final Uri loadPluginProvider(String plugin, String target, int process) {
        return sPluginManager.loadPluginProvider(plugin, target, process);
    }

    /**
     * 不要直接使用该方法,否则会抛出异常(Debug)
     * @deprecated 已废弃,请使用PluginProviderClient里面的方法
     */
    public static final Uri makePluginProviderUri(String plugin, Uri uri, int process) {
        // 因目前没有插件要用,所以直接抛出异常即可
        if (BuildConfig.DEBUG) {
            throw new IllegalStateException();
        }
        return uri;
    }

    /**
     * 通过ClassLoader来获取插件名
     *
     * @param cl ClassLoader对象
     * @return 插件名,若和主程序一致,则返回IModule.PLUGIN_NAME_MAIN(“main”)
     * Added by Jiongxuan Zhang
     */
    public static final String fetchPluginName(ClassLoader cl) {
        return sPluginManager.fetchPluginName(cl);
    }

    /**
     * 通过 forResult 方式启动一个插件的 Activity
     *
     * @param activity    源 Activity
     * @param intent      要打开 Activity 的 Intent,其中 ComponentName 的 Key 必须为插件名
     * @param requestCode 请求码
     * @param options     附加的数据
     * @since 2.1.3
     */
    public static boolean startActivityForResult(Activity activity, Intent intent, int requestCode, Bundle options) {
        return sPluginManager.startActivityForResult(activity, intent, requestCode, options);
    }
}


================================================
FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/i/Factory2.java
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

package com.qihoo360.i;

import android.app.Activity;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

import com.qihoo360.loader2.PluginLibraryInternalProxy;

import org.json.JSONArray;

/**
 * plugin-library中,通过“反射”调用的内部逻辑(如PluginActivity类的调用等)均在此处 <p>
 * 注意:务必要Keep住此类,否则插件调用将失败
 *
 * @author RePlugin Team
 */
public final class Factory2 {

    /**
     * @hide 内部框架使用
     */
    public static PluginLibraryInternalProxy sPLProxy;

    /**
     * @hide 内部方法,插件框架使用
     * 插件的Activity创建成功后通过此方法获取其base context
     * @param activity
     * @param newBase
     * @return 为Activity构造一个base Context
     */
    public static final Context createActivityContext(Activity activity, Context newBase) {
        return sPLProxy.createActivityContext(activity, newBase);
    }

    /**
     * @hide 内部方法,插件框架使用
     * 插件的Activity的onCreate调用前调用此方法
     * @param activity
     * @param savedInstanceState
     */
    public static final void handleActivityCreateBefore(Activity activity, Bundle savedInstanceState) {
        sPLProxy.handleActivityCreateBefore(activity, savedInstanceState);
    }

    /**
     * @hide 内部方法,插件框架使用
     * 插件的Activity的onCreate调用后调用此方法
     * @param activity
     * @param savedInstanceState
     */
    public static final void handleActivityCreate(Activity activity, Bundle savedInstanceState) {
        sPLProxy.handleActivityCreate(activity, savedInstanceState);
    }

    /**
     * @hide 内部方法,插件框架使用
     * 插件的Activity的onDestroy调用后调用此方法
     * @param activity
     */
    public static final void handleActivityDestroy(Activity activity) {
        sPLProxy.handleActivityDestroy(activity);
    }

    /**
     * @hide 内部方法,插件框架使用
     * 插件的Activity的onRestoreInstanceState调用后调用此方法
     * @param activity
     * @param savedInstanceState
     */
    public static final void handleRestoreInstanceState(Activity activity, Bundle savedInstanceState) {
        sPLProxy.handleRestoreInstanceState(activity, savedInstanceState);
    }

    /**
     * @hide 内部方法,插件框架使用
     * 插件的Service的onCreate调用后调用此方法
     * @param service
     */
    public static final void handleServiceCreate(Service service) {
        sPLProxy.handleServiceCreate(service);
    }

    /**
     * @hide 内部方法,插件框架使用
     * 插件的Service的onDestroy调用后调用此方法
     * @param service
     */
    public static final void handleServiceDestroy(Service service) {
        sPLProxy.handleServiceDestroy(service);
    }

    /**
     * @hide 内部方法,插件框架使用
     * 启动一个插件中的activity
     * 通过Extra参数IPluginManager.KEY_COMPATIBLE,IPluginManager.KEY_PLUGIN,IPluginManager.KEY_ACTIVITY,IPluginManager.KEY_PROCESS控制
     * @param context Context上下文
     * @param intent
     * @return 插件机制层是否成功,例如没有插件存在、没有合适的Activity坑
     */
    public static final boolean startActivity(Context context, Intent intent) {
        return sPLProxy.startActivity(context, intent);
    }

    /**
     * @hide 内部方法,插件框架使用
     * 启动一个插件中的activity
     * 通过Extra参数IPluginManager.KEY_COMPATIBLE,IPluginManager.KEY_PLUGIN,IPluginManager.KEY_ACTIVITY,IPluginManager.KEY_PROCESS控制
     * @param activity Activity上下文
     * @param intent
     * @return 插件机制层是否成功,例如没有插件存在、没有合适的Activity坑
     */
    public static final boolean startActivity(Activity activity, Intent intent) {
        return sPLProxy.startActivity(activity, intent);
    }

    /**
     * @hide 内部方法,插件框架使用
     * 启动一个插件中的activity,如果插件不存在会触发下载界面
     * @param context 应用上下文或者Activity上下文
     * @param intent
     * @param plugin 插件名
     * @param activity 待启动的activity类名
     * @param process 是否在指定进程中启动
     * @param download 下载
     * @return 插件机制层是否成功,例如没有插件存在、没有合适的Activity坑
     */
    public static final boolean startActivity(Context context, Intent intent, String plugin, String activity, int process, boolean download) {
        return sPLProxy.startActivity(context, intent, plugin, activity, process, download);
    }

    /**
     * 通过 forResult 方式启动一个插件的 Activity
     *
     * @param activity    源 Activity
     * @param intent      要打开 Activity 的 Intent,其中 ComponentName 的 Key 必须为插件名
     * @param requestCode 请求码
     * @param options     附加的数据
     * @see #startActivityForResult(Activity, Intent, int, Bundle)
     */
    public static final boolean startActivityForResult(Activity activity, Intent intent, int requestCode, Bundle options) {
        return sPLProxy.startActivityForResult(activity, intent, requestCode, options);
    }

    /**
     * @hide 内部方法,插件框架使用
     * 返回所有插件的json串,格式见plugins-builtin.json文件
     * @param name 插件名,传null或者空串表示获取全部
     * @return
     */
    public static final JSONArray fetchPlugins(String name) {
        return sPLProxy.fetchPlugins(name);
    }

    /**
     * @hide 内部方法,插件框架使用
     * 登记动态映射的类
     * @param className 壳类名
     * @param plugin 目标插件名
     * @param type 目标类的类型: activity, service, provider
     * @param target 目标类名
     * @return
     */
    public static final boolean registerDynamicClass(String className, String plugin, String type, String target) {
        return sPLProxy.registerDynamicClass(className, plugin, type, target);
    }

    /**
     * @hide 内部方法,插件框架使用
     * 登记动态映射的类
     * @param className 壳类名
     * @param plugin 目标插件名
     * @param target 目标类名
     * @return
     */
    public static final boolean registerDynamicClass(String className, String plugin, String target, Class defClass) {
        return sPLProxy.registerDynamicClass(className, plugin, target, defClass);
    }

    /**
     * @hide 内部方法,插件框架使用
     * 查询动态映射的类
     * @param className 壳类名
     * @param plugin 目标插件名
     * @return
     */
    public static final boolean isDynamicClass(String plugin, String className) {
        return sPLProxy.isDynamicClass(plugin, className);
    }

    public static void unregisterDynamicClass(String source) {
        sPLProxy.unregisterDynamicClass(source);
    }

    /**
     * @hide 内部方法,插件框架调用
     * 根据动态注册的类,反查此类对应的插件名称
     *
     * @param className 动态类名称
     * @return 插件名称
     */
    public static final String getPluginByDynamicClass(String className) {
        return sPLProxy.getPluginByDynamicClass(className);
    }
}


================================================
FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/i/IModule.java
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

package com.qihoo360.i;

/**
 * 所有可查询的接口都从此interface继承
 * 在插件体系中,module是一种略高于interface的概念
 * 一个插件可导出一个到多个module,这些module可输出自己业务的各种interface
 *
 * @author RePlugin Team
 *
 */
public interface IModule {

    /**
     * 万能接口:当不能升级adapter.jar的时候再考虑使用
     * @param args
     * @return
     */
    Object invoke(Object...args);
}


================================================
FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/i/IPlugin.java
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

package com.qihoo360.i;


/**
 * 此接口由插件负责导出
 * 表示一个具体的物理上的插件实体,例如barcode.jar
 * 具体导出细节可看Factory
 *
 * @author RePlugin Team
 *
 */
public interface IPlugin {

    /**
     * @param c 需要查询的interface的类
     * @return
     */
    IModule query(Class<? extends IModule> c);

}


================================================
FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/i/IPluginManager.java
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

package com.qihoo360.i;

/**
 * 注意:这里目前仅放置一些常量,大部分方法已移动至 PluginCommImpl 中
 *
 * @author RePlugin Team
 */
public interface IPluginManager {

    /**
     * 插件Activity上下文通过startActivity启动,用系统默认的启动方法
     * 如果设置该值,总是为boolean值true
     */
    String KEY_COMPATIBLE = "compatible";

    /**
     * 通过Intent的extra参数指出目标插件名
     * 插件Activity上下文通过startActivity启动其它插件Activity时用到
     * 如果不指定,则默认用当前Activity的插件
     * 如果设置了KEY_COMPATIBLE,则忽略此参数
     */
    String KEY_PLUGIN = "plugin";

    /**
     * 通过Intent的extra参数指出目标Activity名
     * 如果不指定,则默认用ComponentName参数的类名来启动
     * 如果设置了KEY_COMPATIBLE,则忽略此参数
     */
    String KEY_ACTIVITY = "activity";

    /**
     * 通过Intent的extra参数指出需要在指定进程中启动
     * 只能启动standard的Activity,不能启动singleTask、singleInstance等
     * 不指定时,自动分配插件进程,即PROCESS_AUTO
     */
    String KEY_PROCESS = "process";

    /**
     * 自动分配插件进程
     */
    int PROCESS_AUTO = Integer.MIN_VALUE;

    /**
     * UI进程
     */
    int PROCESS_UI = -1;

    /**
     * 常驻进程
     */
    int PROCESS_PERSIST = -2;
}


================================================
FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils/LocalBroadcastManager.java
================================================
package com.qihoo360.loader.utils;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;

import com.qihoo360.replugin.utils.ReflectUtils;

public class LocalBroadcastManager {

    private static String V4_MANAGER = "android.support.v4.content.LocalBroadcastManager";
    private static String ANDROIDX_MANAGER = "androidx.localbroadcastmanager.content.LocalBroadcastManager";
    private static LocalBroadcastManager instance;

    private Context context;
    private boolean init;
    private static Object managerObj;

    public static LocalBroadcastManager getInstance(Context context) {
        if (instance == null) {
            synchronized (LocalBroadcastManager.class) {
                if (instance == null) {
                    instance = new LocalBroadcastManager(context);
                }
            }
        }
        return instance;
    }

    private LocalBroadcastManager(Context context) {
        this.context = context.getApplicationContext();
        loadClass();
    }

    private void loadClass() {
        try {
            Class cls = null;
            try {
                cls = ReflectUtils.getClass(ANDROIDX_MANAGER);
            } catch (Exception e) {
                cls = ReflectUtils.getClass(V4_MANAGER);
            }
            if (cls == null) {
                return;
            }
            managerObj = ReflectUtils.getMethod(cls, "getInstance", new Class<?>[]{Context.class}).invoke(null, context);
            init = true;
        } catch (Exception e) {
        }
    }

    public boolean registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
        if (!init || managerObj == null) {
            return false;
        }
        try {
            ReflectUtils.getMethod(managerObj.getClass(), "registerReceiver",
                    BroadcastReceiver.class, IntentFilter.class).invoke(managerObj, receiver, filter);
            return true;
        } catch (Exception e) {
        }
        return false;
    }

    public boolean unregisterReceiver(BroadcastReceiver receiver) {
        if (!init || managerObj == null) {
            return false;
        }
        try {
            ReflectUtils.getMethod(managerObj.getClass(), "unregisterReceiver",
                    BroadcastReceiver.class).invoke(managerObj, receiver);
            return true;
        } catch (Exception e) {
        }
        return false;
    }

    public boolean sendBroadcast(Intent intent) {
        if (!init || managerObj == null) {
            return false;
        }
        try {
            ReflectUtils.getMethod(managerObj.getClass(), "sendBroadcast",
                    Intent.class).invoke(managerObj, intent);
            return true;
        } catch (Exception e) {
        }
        return false;
    }

    public boolean sendBroadcastSync(Intent intent) {
        if (!init || managerObj == null) {
            return false;
        }
        try {
            ReflectUtils.getMethod(managerObj.getClass(), "sendBroadcastSync",
                    Intent.class).invoke(managerObj, intent);
            return true;
        } catch (Exception e) {
        }
        return false;
    }
}


================================================
FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils/PackageUtils.java
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

package com.qihoo360.loader.utils;

import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;

import com.qihoo360.replugin.helper.LogDebug;

/**
 * @author RePlugin Team
 */
public class PackageUtils {

    /**
     * 获取PackageInfo对象
     * <p>
     * 注:getPackageArchiveInfo Android 2.x上,可能拿不到signatures,本可以通过反射去获取,但是考虑到会触发Android 的灰/黑名单,这个方法就不再继续适配2.X了
     *
     * @return
     */
    public static PackageInfo getPackageArchiveInfo(PackageManager pm, String pkgFilePath, int flags) {
        PackageInfo info = null;
        try {
            info = pm.getPackageArchiveInfo(pkgFilePath, flags);
        } catch (Throwable e) {
            if (LogDebug.LOG) {
                e.printStackTrace();
            }
        }

        return info;
    }
}

================================================
FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils/PatchClassLoaderUtils.java
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

package com.qihoo360.loader.utils;

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

import com.qihoo360.replugin.RePlugin;
import com.qihoo360.replugin.helper.LogRelease;
import com.qihoo360.replugin.utils.ReflectUtils;

import static com.qihoo360.replugin.helper.LogDebug.LOG;
import static com.qihoo360.replugin.helper.LogDebug.PLUGIN_TAG;
import static com.qihoo360.replugin.helper.LogRelease.LOGR;

/**
 * 对宿主的HostClassLoader做修改。这是RePlugin中唯一需要修改宿主私有属性的位置了
 *
 * @author RePlugin Team
 */
public class PatchClassLoaderUtils {

    private static final String TAG = "PatchClassLoaderUtils";

    public static boolean patch(Application application) {
        try {
            // 获取Application的BaseContext (来自ContextWrapper)
            Context oBase = application.getBaseContext();
            if (oBase == null) {
                if (LOGR) {
                    LogRelease.e(PLUGIN_TAG, "pclu.p: nf mb. ap cl=" + application.getClass());
                }
                return false;
            }

            // 获取mBase.mPackageInfo
            // 1. ApplicationContext - Android 2.1
            // 2. ContextImpl - Android 2.2 and higher
            // 3. AppContextImpl - Android 2.2 and higher
            Object oPackageInfo = ReflectUtils.readField(oBase, "mPackageInfo");
            if (oPackageInfo == null) {
                if (LOGR) {
                    LogRelease.e(PLUGIN_TAG, "pclu.p: nf mpi. mb cl=" + oBase.getClass());
                }
                return false;
            }

            // mPackageInfo的类型主要有两种:
            // 1. android.app.ActivityThread$PackageInfo - Android 2.1 - 2.3
            // 2. android.app.LoadedApk - Android 2.3.3 and higher
            if (LOG) {
                Log.d(TAG, "patch: mBase cl=" + oBase.getClass() + "; mPackageInfo cl=" + oPackageInfo.getClass());
            }

            // 获取mPackageInfo.mClassLoader
            ClassLoader oClassLoader = (ClassLoader) ReflectUtils.readField(oPackageInfo, "mClassLoader");
            if (oClassLoader == null) {
                if (LOGR) {
                    LogRelease.e(PLUGIN_TAG, "pclu.p: nf mpi. mb cl=" + oBase.getClass() + "; mpi cl=" + oPackageInfo.getClass());
                }
                return false;
            }

            // 外界可自定义ClassLoader的实现,但一定要基于RePluginClassLoader类
            ClassLoader cl = RePlugin.getConfig().getCallbacks().createClassLoader(oClassLoader.getParent(), oClassLoader);

            // 将新的ClassLoader写入mPackageInfo.mClassLoader
            ReflectUtils.writeField(oPackageInfo, "mClassLoader", cl);

            // 设置线程上下文中的ClassLoader为RePluginClassLoader
            // 防止在个别Java库用到了Thread.currentThread().getContextClassLoader()时,“用了原来的PathClassLoader”,或为空指针
            Thread.currentThread().setContextClassLoader(cl);

            if (LOG) {
                Log.d(TAG, "patch: patch mClassLoader ok");
            }
        } catch (Throwable e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}


================================================
FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils/ProcessLocker.java
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

package com.qihoo360.loader.utils;

import android.content.Context;

import com.qihoo360.replugin.helper.LogDebug;
import com.qihoo360.replugin.helper.LogRelease;

import com.qihoo360.replugin.utils.FileUtils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

import static com.qihoo360.replugin.helper.LogDebug.MAIN_TAG;
import static com.qihoo360.replugin.helper.LogRelease.LOGR;

/**
 * 进程锁
 *
 * @author RePlugin Team
 */
public final class ProcessLocker {

    private static final String TAG = LogDebug.PLUGIN_TAG;

    private final Context mContext;

    private FileOutputStream mFileOutputStream;

    private FileChannel mFileChannel;

    private FileLock mFileLock;

    private File mFile;

    /**
     * @param context
     * @param filename
     */
    public ProcessLocker(Context context, String filename) {
        mContext = context;
        try {
            mFile = new File(filename);
            mFileOutputStream = mContext.openFileOutput(filename, 0);
            if (mFileOutputStream != null) {
                mFileChannel = mFileOutputStream.getChannel();
            }
            if (mFileChannel == null) {
                if (LOGR) {
                    LogRelease.e(MAIN_TAG, "channel is null");
                }
            }
        } catch (Throwable e) {
            if (LOGR) {
                LogRelease.e(MAIN_TAG, e.getMessage(), e);
            }
        }
    }

    /**
     * 允许传递绝对路径
     *
     * @param context
     * @param dir
     * @param filename
     */
    public ProcessLocker(Context context, String dir, String filename) {
        mContext = context;
        try {
            mFile = new File(dir, filename);
            if (!mFile.exists()) {
                FileUtils.forceMkdirParent(mFile);
                mFile.createNewFile();
            }
            mFileOutputStream = new FileOutputStream(mFile, false);
            mFileChannel = mFileOutputStream.getChannel();
        } catch (Throwable e) {
            if (LOGR) {
                LogRelease.e(MAIN_TAG, e.getMessage(), e);
            }
        }
    }

    /**
     * 查看文件是否已经被上锁
     *
     * @return
     */
    public final synchronized boolean isLocked() {
        boolean ret = tryLock();

        // 加锁成功说明文件还未被上锁
        // 在退出之前一定要进行unlock
        if (ret) {
            unlock();
        }

        return !ret;
    }

    /**
     * 加锁
     *
     * @return
     */
    public final synchronized boolean tryLock() {
        if (mFileChannel == null) {
            return false;
        }
        try {
            mFileLock = mFileChannel.tryLock();
            if (mFileLock != null) {
                return true;
            }
        } catch (Throwable e) {
            if (LOGR) {
                LogRelease.e(MAIN_TAG, e.getMessage(), e);
            }
        }
        return false;
    }

    /**
     * 加锁
     *
     * @param ms       毫秒
     * @param interval 间隔
     * @return
     */
    public final synchronized boolean tryLockTimeWait(int ms, int interval) {
        if (mFileChannel == null) {
            return false;
        }
        // 自动修正到最小值,避免死锁
        if (ms <= 0) {
            ms = 1;
        }
        if (interval <= 0) {
            interval = 1;
        }
        try {
            for (int i = 0; i < ms; i += interval) {
                try {
                    mFileLock = mFileChannel.tryLock();
                } catch (IOException e) {
                    // 获取锁失败会抛异常,此处忽略
                    // java.io.IOException: fcntl failed: EAGAIN (Try again)
                }
                if (mFileLock != null) {
                    return true;
                }
                // 每秒钟输出一次日志,防止“刷屏”
                if (LOGR) {
                    if (i % 1000 == 0) {
                        LogRelease.i(TAG, "wait process lock: " + i + "/" + ms);
                    }
                }
                Thread.sleep(interval, 0);
            }
        } catch (Throwable e) {
            if (LOGR) {
                LogRelease.e(MAIN_TAG, e.getMessage(), e);
            }
        }
        return false;
    }

    /**
     * 加锁
     *
     * @return
     */
    public final synchronized boolean lock() {
        if (mFileChannel == null) {
            return false;
        }
        try {
            mFileLock = mFileChannel.lock();
            if (mFileLock != null) {
                return true;
            }
        } catch (Throwable e) {
            if (LOGR) {
                LogRelease.e(MAIN_TAG, e.getMessage(), e);
            }
        }
        return false;
    }

    /**
     * 释放并且删除该锁文件
     */
    public final synchronized void unlock() {
        if (mFileLock != null) {
            try {
                mFileLock.release();
            } catch (Throwable e) {
                if (LOGR) {
                    LogRelease.e(TAG, e.getMessage(), e);
                }
            }
        }
        if (mFileChannel != null) {
            try {
                mFileChannel.close();
            } catch (Throwable e) {
                if (LOGR) {
                    LogRelease.e(TAG, e.getMessage(), e);
                }
            }
        }
        if (mFileOutputStream != null) {
            try {
                mFileOutputStream.close();
            } catch (Throwable e) {
                if (LOGR) {
                    LogRelease.e(TAG, e.getMessage(), e);
                }
            }
        }

        // 删除锁文件
        if (mFile != null && mFile.exists()) {
            mFile.delete();
        }
    }
}


================================================
FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils/StringUtils.java
================================================
/*
 * Copyright (C) 2005-2017 Qihoo 360 Inc.
 *
 * 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
 *
 * http://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.
 */

package com.qihoo360.loader.utils;

import android.util.Base64;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;

/**
 * @author RePlugin Team
 */
public class StringUtils {

    private static final char[] HEX_DIGITS = {
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            'A', 'B', 'C', 'D', 'E', 'F'
    };

    public static final String toHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 2);
        for (byte b : bytes) {
            sb.append(HEX_DIGITS[(b & 0xf0) >> 4]);
            sb.append(HEX_DIGITS[b & 0x0f]);
        }
        return sb.toString();
    }

    public static final String
Download .txt
gitextract_twe1voez/

├── .github/
│   ├── ISSUE_TEMPLATE.md
│   └── PULL_REQUEST_TEMPLATE.md
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── README_CN.md
├── deploy.sh
├── replugin-host-gradle/
│   ├── README.md
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── gradlew
│   ├── gradlew.bat
│   └── src/
│       └── main/
│           ├── groovy/
│           │   └── com/
│           │       └── qihoo360/
│           │           └── replugin/
│           │               └── gradle/
│           │                   ├── compat/
│           │                   │   ├── ScopeCompat.groovy
│           │                   │   └── VariantCompat.groovy
│           │                   └── host/
│           │                       ├── AppConstant.groovy
│           │                       ├── RePlugin.groovy
│           │                       ├── creator/
│           │                       │   ├── FileCreators.groovy
│           │                       │   ├── IFileCreator.groovy
│           │                       │   └── impl/
│           │                       │       ├── java/
│           │                       │       │   └── RePluginHostConfigCreator.groovy
│           │                       │       └── json/
│           │                       │           ├── PluginBuiltinJsonCreator.groovy
│           │                       │           ├── PluginInfo.groovy
│           │                       │           └── PluginInfoParser.groovy
│           │                       └── handlemanifest/
│           │                           └── ComponentsGenerator.groovy
│           └── resources/
│               └── META-INF/
│                   └── gradle-plugins/
│                       └── replugin-host-gradle.properties
├── replugin-host-library/
│   ├── README.md
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── gradlew
│   ├── gradlew.bat
│   ├── replugin-host-lib/
│   │   ├── bintray.gradle
│   │   ├── build.gradle
│   │   ├── replugin-rules.pro
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── aidl/
│   │           │   └── com/
│   │           │       └── qihoo360/
│   │           │           ├── loader2/
│   │           │           │   ├── IPlugin.aidl
│   │           │           │   ├── IPluginClient.aidl
│   │           │           │   ├── IPluginHost.aidl
│   │           │           │   ├── PluginBinderInfo.aidl
│   │           │           │   ├── mgr/
│   │           │           │   │   └── IServiceConnection.aidl
│   │           │           │   └── sp/
│   │           │           │       └── IPref.aidl
│   │           │           ├── mobilesafe/
│   │           │           │   └── svcmanager/
│   │           │           │       └── IServiceChannel.aidl
│   │           │           └── replugin/
│   │           │               ├── IBinderGetter.aidl
│   │           │               ├── component/
│   │           │               │   └── service/
│   │           │               │       └── server/
│   │           │               │           └── IPluginServiceServer.aidl
│   │           │               ├── model/
│   │           │               │   └── PluginInfo.aidl
│   │           │               └── packages/
│   │           │                   ├── IPluginManagerServer.aidl
│   │           │                   └── PluginRunningList.aidl
│   │           └── java/
│   │               └── com/
│   │                   └── qihoo360/
│   │                       ├── i/
│   │                       │   ├── Factory.java
│   │                       │   ├── Factory2.java
│   │                       │   ├── IModule.java
│   │                       │   ├── IPlugin.java
│   │                       │   └── IPluginManager.java
│   │                       ├── loader/
│   │                       │   ├── utils/
│   │                       │   │   ├── LocalBroadcastManager.java
│   │                       │   │   ├── PackageUtils.java
│   │                       │   │   ├── PatchClassLoaderUtils.java
│   │                       │   │   ├── ProcessLocker.java
│   │                       │   │   ├── StringUtils.java
│   │                       │   │   └── SysUtils.java
│   │                       │   └── utils2/
│   │                       │       └── FilePermissionUtils.java
│   │                       ├── loader2/
│   │                       │   ├── BinderCursor.java
│   │                       │   ├── BuildCompat.java
│   │                       │   ├── Builder.java
│   │                       │   ├── CertUtils.java
│   │                       │   ├── Constant.java
│   │                       │   ├── DumpUtils.java
│   │                       │   ├── Finder.java
│   │                       │   ├── FinderBuiltin.java
│   │                       │   ├── LaunchModeStates.java
│   │                       │   ├── Loader.java
│   │                       │   ├── MP.java
│   │                       │   ├── PMF.java
│   │                       │   ├── Plugin.java
│   │                       │   ├── PluginBinderInfo.java
│   │                       │   ├── PluginCommImpl.java
│   │                       │   ├── PluginContainers.java
│   │                       │   ├── PluginContext.java
│   │                       │   ├── PluginDesc.java
│   │                       │   ├── PluginIntent.java
│   │                       │   ├── PluginLibraryInternalProxy.java
│   │                       │   ├── PluginManager.java
│   │                       │   ├── PluginNativeLibsHelper.java
│   │                       │   ├── PluginProcessMain.java
│   │                       │   ├── PluginProcessPer.java
│   │                       │   ├── PluginProviderStub.java
│   │                       │   ├── PluginStatusController.java
│   │                       │   ├── PluginTable.java
│   │                       │   ├── PmBase.java
│   │                       │   ├── PmHostSvc.java
│   │                       │   ├── ProcessStates.java
│   │                       │   ├── StubProcessManager.java
│   │                       │   ├── TaskAffinityStates.java
│   │                       │   ├── V5FileInfo.java
│   │                       │   ├── V5Finder.java
│   │                       │   ├── VMRuntimeCompat.java
│   │                       │   ├── alc/
│   │                       │   │   ├── ActivityController.java
│   │                       │   │   └── IActivityWatcher.java
│   │                       │   ├── mgr/
│   │                       │   │   ├── PluginProviderClient.java
│   │                       │   │   └── PluginServiceClient.java
│   │                       │   └── sp/
│   │                       │       └── PrefImpl.java
│   │                       ├── mobilesafe/
│   │                       │   ├── api/
│   │                       │   │   ├── AppVar.java
│   │                       │   │   ├── IPC.java
│   │                       │   │   ├── Intents.java
│   │                       │   │   ├── Pref.java
│   │                       │   │   └── Tasks.java
│   │                       │   ├── loader/
│   │                       │   │   ├── a/
│   │                       │   │   │   └── DummyActivity.java
│   │                       │   │   ├── p/
│   │                       │   │   │   └── DummyProvider.java
│   │                       │   │   └── s/
│   │                       │   │       └── DummyService.java
│   │                       │   ├── parser/
│   │                       │   │   └── manifest/
│   │                       │   │       ├── ManifestParser.java
│   │                       │   │       ├── XmlHandler.java
│   │                       │   │       └── bean/
│   │                       │   │           ├── ComponentBean.java
│   │                       │   │           └── DataBean.java
│   │                       │   └── svcmanager/
│   │                       │       ├── ParcelBinder.java
│   │                       │       ├── PluginServiceManager.java
│   │                       │       ├── PluginServiceRecord.java
│   │                       │       ├── PluginServiceReferenceManager.java
│   │                       │       ├── QihooServiceManager.java
│   │                       │       ├── ServiceChannelCursor.java
│   │                       │       ├── ServiceChannelImpl.java
│   │                       │       ├── ServiceProvider.java
│   │                       │       └── ServiceWrapper.java
│   │                       └── replugin/
│   │                           ├── ContextInjector.java
│   │                           ├── DefaultRePluginCallbacks.java
│   │                           ├── DefaultRePluginEventCallbacks.java
│   │                           ├── IHostBinderFetcher.java
│   │                           ├── PluginDexClassLoader.java
│   │                           ├── PluginDexClassLoaderPatch.java
│   │                           ├── RePlugin.java
│   │                           ├── RePluginApplication.java
│   │                           ├── RePluginCallbacks.java
│   │                           ├── RePluginClassLoader.java
│   │                           ├── RePluginConfig.java
│   │                           ├── RePluginConstants.java
│   │                           ├── RePluginEventCallbacks.java
│   │                           ├── RePluginInternal.java
│   │                           ├── base/
│   │                           │   ├── AMSUtils.java
│   │                           │   ├── IPC.java
│   │                           │   ├── LocalBroadcastHelper.java
│   │                           │   └── ThreadUtils.java
│   │                           ├── component/
│   │                           │   ├── ComponentList.java
│   │                           │   ├── activity/
│   │                           │   │   ├── ActivityInjector.java
│   │                           │   │   └── DynamicClassProxyActivity.java
│   │                           │   ├── app/
│   │                           │   │   └── PluginApplicationClient.java
│   │                           │   ├── dummy/
│   │                           │   │   ├── DummyActivity.java
│   │                           │   │   ├── DummyProvider.java
│   │                           │   │   ├── DummyReceiver.java
│   │                           │   │   ├── DummyService.java
│   │                           │   │   └── ForwardActivity.java
│   │                           │   ├── process/
│   │                           │   │   ├── PluginProcessHost.java
│   │                           │   │   ├── ProcessPitProviderBase.java
│   │                           │   │   ├── ProcessPitProviderLoader0.java
│   │                           │   │   ├── ProcessPitProviderLoader1.java
│   │                           │   │   ├── ProcessPitProviderP0.java
│   │                           │   │   ├── ProcessPitProviderP1.java
│   │                           │   │   ├── ProcessPitProviderP2.java
│   │                           │   │   ├── ProcessPitProviderPersist.java
│   │                           │   │   └── ProcessPitProviderUI.java
│   │                           │   ├── provider/
│   │                           │   │   ├── PluginPitProviderBase.java
│   │                           │   │   ├── PluginPitProviderP0.java
│   │                           │   │   ├── PluginPitProviderP1.java
│   │                           │   │   ├── PluginPitProviderP2.java
│   │                           │   │   ├── PluginPitProviderPersist.java
│   │                           │   │   ├── PluginPitProviderUI.java
│   │                           │   │   ├── PluginProviderClient.java
│   │                           │   │   ├── PluginProviderClient2.java
│   │                           │   │   └── PluginProviderHelper.java
│   │                           │   ├── receiver/
│   │                           │   │   ├── PluginReceiverHelper.java
│   │                           │   │   └── PluginReceiverProxy.java
│   │                           │   ├── service/
│   │                           │   │   ├── PluginServiceClient.java
│   │                           │   │   ├── PluginServiceDispatcherManager.java
│   │                           │   │   ├── PluginServiceServerFetcher.java
│   │                           │   │   ├── ServiceDispatcher.java
│   │                           │   │   └── server/
│   │                           │   │       ├── ConnectionBindRecord.java
│   │                           │   │       ├── IntentBindRecord.java
│   │                           │   │       ├── PluginPitService.java
│   │                           │   │       ├── PluginServiceServer.java
│   │                           │   │       ├── ProcessBindRecord.java
│   │                           │   │       ├── ProcessRecord.java
│   │                           │   │       └── ServiceRecord.java
│   │                           │   └── utils/
│   │                           │       ├── ApkCommentReader.java
│   │                           │       ├── IntentMatcherHelper.java
│   │                           │       └── PluginClientHelper.java
│   │                           ├── debugger/
│   │                           │   └── DebuggerReceivers.java
│   │                           ├── ext/
│   │                           │   └── parser/
│   │                           │       ├── AbstractApkParser.java
│   │                           │       ├── ApkParser.java
│   │                           │       ├── exception/
│   │                           │       │   └── ParserException.java
│   │                           │       ├── parser/
│   │                           │       │   ├── BinaryXmlParser.java
│   │                           │       │   ├── StringPoolEntry.java
│   │                           │       │   ├── XmlNamespaces.java
│   │                           │       │   ├── XmlStreamer.java
│   │                           │       │   └── XmlTranslator.java
│   │                           │       ├── struct/
│   │                           │       │   ├── ChunkHeader.java
│   │                           │       │   ├── ChunkType.java
│   │                           │       │   ├── ResourceValue.java
│   │                           │       │   ├── StringPool.java
│   │                           │       │   ├── StringPoolHeader.java
│   │                           │       │   └── xml/
│   │                           │       │       ├── Attribute.java
│   │                           │       │       ├── Attributes.java
│   │                           │       │       ├── NullHeader.java
│   │                           │       │       ├── XmlHeader.java
│   │                           │       │       ├── XmlNamespaceEndTag.java
│   │                           │       │       ├── XmlNamespaceStartTag.java
│   │                           │       │       ├── XmlNodeEndTag.java
│   │                           │       │       ├── XmlNodeHeader.java
│   │                           │       │       ├── XmlNodeStartTag.java
│   │                           │       │       └── XmlResourceMapHeader.java
│   │                           │       └── utils/
│   │                           │           ├── Buffers.java
│   │                           │           ├── ParseUtils.java
│   │                           │           └── xml/
│   │                           │               ├── AggregateTranslator.java
│   │                           │               ├── CharSequenceTranslator.java
│   │                           │               ├── CodePointTranslator.java
│   │                           │               ├── EntityArrays.java
│   │                           │               ├── LookupTranslator.java
│   │                           │               ├── NumericEntityEscaper.java
│   │                           │               ├── UnicodeUnpairedSurrogateRemover.java
│   │                           │               └── XmlEscaper.java
│   │                           ├── helper/
│   │                           │   ├── HostConfigHelper.java
│   │                           │   ├── JSONHelper.java
│   │                           │   ├── LogDebug.java
│   │                           │   └── LogRelease.java
│   │                           ├── model/
│   │                           │   ├── PluginInfo.java
│   │                           │   └── PluginInfoList.java
│   │                           ├── packages/
│   │                           │   ├── PluginFastInstallProvider.java
│   │                           │   ├── PluginFastInstallProviderProxy.java
│   │                           │   ├── PluginInfoUpdater.java
│   │                           │   ├── PluginManagerProxy.java
│   │                           │   ├── PluginManagerServer.java
│   │                           │   ├── PluginPublishFileGenerator.java
│   │                           │   ├── PluginRunningList.java
│   │                           │   └── RePluginInstaller.java
│   │                           └── utils/
│   │                               ├── AssetsUtils.java
│   │                               ├── Charsets.java
│   │                               ├── CloseableUtils.java
│   │                               ├── Dex2OatUtils.java
│   │                               ├── FileUtils.java
│   │                               ├── FixOTranslucentOrientation.java
│   │                               ├── IOUtils.java
│   │                               ├── InterpretDex2OatHelper.java
│   │                               ├── ReflectUtils.java
│   │                               ├── StringBuilderWriter.java
│   │                               ├── Validate.java
│   │                               ├── basic/
│   │                               │   ├── ArrayMap.java
│   │                               │   ├── ArraySet.java
│   │                               │   ├── ByteConvertor.java
│   │                               │   ├── ContainerHelpers.java
│   │                               │   ├── MapCollections.java
│   │                               │   ├── SecurityUtil.java
│   │                               │   └── SimpleArrayMap.java
│   │                               └── pkg/
│   │                                   └── PackageFilesUtil.java
│   └── settings.gradle
├── replugin-plugin-gradle/
│   ├── README.md
│   ├── bintray.gradle
│   ├── build.gradle
│   ├── config.gradle
│   ├── config.properties
│   ├── gradle/
│   │   └── wrapper/
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── gradlew
│   ├── gradlew.bat
│   └── src/
│       └── main/
│           ├── groovy/
│           │   └── com/
│           │       └── qihoo360/
│           │           └── replugin/
│           │               └── gradle/
│           │                   └── plugin/
│           │                       ├── AppConstant.groovy
│           │                       ├── ReClassPlugin.groovy
│           │                       ├── debugger/
│           │                       │   └── PluginDebugger.groovy
│           │                       ├── injector/
│           │                       │   ├── BaseInjector.groovy
│           │                       │   ├── IClassInjector.groovy
│           │                       │   ├── Injectors.groovy
│           │                       │   ├── identifier/
│           │                       │   │   ├── GetIdentifierExprEditor.groovy
│           │                       │   │   └── GetIdentifierInjector.groovy
│           │                       │   ├── loaderactivity/
│           │                       │   │   └── LoaderActivityInjector.groovy
│           │                       │   ├── localbroadcast/
│           │                       │   │   ├── LocalBroadcastExprEditor.groovy
│           │                       │   │   └── LocalBroadcastInjector.groovy
│           │                       │   └── provider/
│           │                       │       ├── ProviderExprEditor.groovy
│           │                       │       ├── ProviderExprEditor2.groovy
│           │                       │       ├── ProviderInjector.groovy
│           │                       │       └── ProviderInjector2.groovy
│           │                       ├── inner/
│           │                       │   ├── ClassFileVisitor.groovy
│           │                       │   ├── CommonData.groovy
│           │                       │   ├── ReClassTransform.groovy
│           │                       │   └── Util.groovy
│           │                       ├── manifest/
│           │                       │   ├── IManifest.groovy
│           │                       │   ├── ManifestAPI.groovy
│           │                       │   └── ManifestReader.groovy
│           │                       └── util/
│           │                           └── CmdUtil.groovy
│           └── resources/
│               └── META-INF/
│                   └── gradle-plugins/
│                       └── replugin-plugin-gradle.properties
├── replugin-plugin-library/
│   ├── README.md
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       ├── gradle-wrapper.jar
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   ├── gradlew
│   ├── gradlew.bat
│   ├── replugin-plugin-lib/
│   │   ├── bintray.gradle
│   │   ├── build.gradle
│   │   ├── proguard-rules.pro
│   │   ├── replugin-library-rules.pro
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── aidl/
│   │           │   └── com/
│   │           │       └── qihoo360/
│   │           │           ├── loader2/
│   │           │           │   └── IPlugin.aidl
│   │           │           └── replugin/
│   │           │               └── IBinderGetter.aidl
│   │           └── java/
│   │               └── com/
│   │                   └── qihoo360/
│   │                       └── replugin/
│   │                           ├── Entry.java
│   │                           ├── MethodInvoker.java
│   │                           ├── RePlugin.java
│   │                           ├── RePluginCompat.java
│   │                           ├── RePluginEnv.java
│   │                           ├── RePluginFramework.java
│   │                           ├── RePluginInternal.java
│   │                           ├── RePluginServiceManager.java
│   │                           ├── base/
│   │                           │   └── IPC.java
│   │                           ├── helper/
│   │                           │   ├── JSONHelper.java
│   │                           │   ├── LogDebug.java
│   │                           │   └── LogRelease.java
│   │                           ├── i/
│   │                           │   └── IPluginManager.java
│   │                           ├── loader/
│   │                           │   ├── PluginResource.java
│   │                           │   ├── a/
│   │                           │   │   ├── PluginActivity.java
│   │                           │   │   ├── PluginActivityGroup.java
│   │                           │   │   ├── PluginAppCompatActivity.java
│   │                           │   │   ├── PluginAppCompatXActivity.java
│   │                           │   │   ├── PluginExpandableListActivity.java
│   │                           │   │   ├── PluginFragmentActivity.java
│   │                           │   │   ├── PluginFragmentXActivity.java
│   │                           │   │   ├── PluginListActivity.java
│   │                           │   │   ├── PluginPreferenceActivity.java
│   │                           │   │   └── PluginTabActivity.java
│   │                           │   ├── b/
│   │                           │   │   └── PluginLocalBroadcastManager.java
│   │                           │   ├── p/
│   │                           │   │   └── PluginProviderClient.java
│   │                           │   └── s/
│   │                           │       └── PluginServiceClient.java
│   │                           ├── model/
│   │                           │   └── PluginInfo.java
│   │                           ├── packages/
│   │                           │   └── PluginRunningList.java
│   │                           └── utils/
│   │                               ├── ParcelUtils.java
│   │                               └── ReflectUtils.java
│   └── settings.gradle
├── replugin-sample/
│   ├── README.md
│   ├── host/
│   │   ├── app/
│   │   │   ├── build.gradle
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── AndroidManifest.xml
│   │   │           ├── assets/
│   │   │           │   ├── external/
│   │   │           │   │   └── README
│   │   │           │   └── plugins/
│   │   │           │       ├── demo1.jar
│   │   │           │       ├── demo2.jar
│   │   │           │       └── webview.jar
│   │   │           ├── java/
│   │   │           │   └── com/
│   │   │           │       └── qihoo360/
│   │   │           │           └── replugin/
│   │   │           │               └── sample/
│   │   │           │                   └── host/
│   │   │           │                       ├── FileProvider.java
│   │   │           │                       ├── MainActivity.java
│   │   │           │                       ├── PluginFragmentActivity.java
│   │   │           │                       ├── SampleApplication.java
│   │   │           │                       └── TimeUtils.java
│   │   │           └── res/
│   │   │               ├── layout/
│   │   │               │   ├── activity_main.xml
│   │   │               │   └── activity_plugin_fragment.xml
│   │   │               ├── values/
│   │   │               │   ├── colors.xml
│   │   │               │   ├── public.xml
│   │   │               │   ├── strings.xml
│   │   │               │   └── styles.xml
│   │   │               └── xml/
│   │   │                   └── fileprovider_path.xml
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   └── settings.gradle
│   └── plugin/
│       ├── plugin-demo1/
│       │   ├── README.md
│       │   ├── app/
│       │   │   ├── build.gradle
│       │   │   ├── case.gradle
│       │   │   ├── proguard-rules.pro
│       │   │   └── src/
│       │   │       └── main/
│       │   │           ├── AndroidManifest.xml
│       │   │           ├── aidl/
│       │   │           │   └── com/
│       │   │           │       └── qihoo360/
│       │   │           │           └── replugin/
│       │   │           │               └── sample/
│       │   │           │                   └── demo2/
│       │   │           │                       └── IDemo2.aidl
│       │   │           ├── java/
│       │   │           │   └── com/
│       │   │           │       └── qihoo360/
│       │   │           │           └── replugin/
│       │   │           │               └── sample/
│       │   │           │                   └── demo1/
│       │   │           │                       ├── BaseActivity.java
│       │   │           │                       ├── LibMainActivity.java
│       │   │           │                       ├── MainActivity.java
│       │   │           │                       ├── MainApp.java
│       │   │           │                       ├── TestItem.java
│       │   │           │                       ├── TimeUtils.java
│       │   │           │                       ├── activity/
│       │   │           │                       │   ├── file_provider/
│       │   │           │                       │   │   ├── BitmapUtils.java
│       │   │           │                       │   │   └── FileProviderActivity.java
│       │   │           │                       │   ├── for_result/
│       │   │           │                       │   │   └── ForResultActivity.java
│       │   │           │                       │   ├── intent_filter/
│       │   │           │                       │   │   └── IntentFilterDemoActivity1.java
│       │   │           │                       │   ├── notify_test/
│       │   │           │                       │   │   └── NotifyActivity.java
│       │   │           │                       │   ├── preference/
│       │   │           │                       │   │   ├── PrefActivity1.java
│       │   │           │                       │   │   └── PrefActivity2.java
│       │   │           │                       │   ├── single_instance/
│       │   │           │                       │   │   └── TIActivity1.java
│       │   │           │                       │   ├── single_top/
│       │   │           │                       │   │   └── SingleTopActivity1.java
│       │   │           │                       │   ├── standard/
│       │   │           │                       │   │   └── StandardActivity.java
│       │   │           │                       │   ├── task_affinity/
│       │   │           │                       │   │   ├── TAActivity1.java
│       │   │           │                       │   │   ├── TAActivity2.java
│       │   │           │                       │   │   ├── TAActivity3.java
│       │   │           │                       │   │   ├── TAActivity4.java
│       │   │           │                       │   │   └── package-info.java
│       │   │           │                       │   ├── task_affinity_2/
│       │   │           │                       │   │   ├── TA2Activity1.java
│       │   │           │                       │   │   ├── TA2Activity2.java
│       │   │           │                       │   │   ├── TA2Activity3.java
│       │   │           │                       │   │   ├── TA2Activity4.java
│       │   │           │                       │   │   └── package-info.java
│       │   │           │                       │   ├── theme/
│       │   │           │                       │   │   ├── ThemeBlackNoTitleBarActivity.java
│       │   │           │                       │   │   ├── ThemeBlackNoTitleBarFullscreenActivity.java
│       │   │           │                       │   │   └── ThemeDialogActivity.java
│       │   │           │                       │   └── webview/
│       │   │           │                       │       └── WebViewActivity.java
│       │   │           │                       ├── fragment/
│       │   │           │                       │   ├── DemoCodeFragment.java
│       │   │           │                       │   └── DemoFragment.java
│       │   │           │                       ├── provider/
│       │   │           │                       │   ├── FileProvider.java
│       │   │           │                       │   └── Provider2.java
│       │   │           │                       ├── receivers/
│       │   │           │                       │   └── PluginDemo1Receiver.java
│       │   │           │                       ├── service/
│       │   │           │                       │   ├── PluginDemoAppService.java
│       │   │           │                       │   ├── PluginDemoService1.java
│       │   │           │                       │   └── PluginDemoService2.java
│       │   │           │                       ├── support/
│       │   │           │                       │   ├── LogX.java
│       │   │           │                       │   └── NotifyUtils.java
│       │   │           │                       └── webview/
│       │   │           │                           ├── IWebPage.java
│       │   │           │                           ├── ViewProxy.java
│       │   │           │                           └── WebPageProxy.java
│       │   │           └── res/
│       │   │               ├── layout/
│       │   │               │   ├── content_lib_main.xml
│       │   │               │   ├── layout_notify.xml
│       │   │               │   ├── lib_activity_main.xml
│       │   │               │   ├── main.xml
│       │   │               │   ├── main_fragment.xml
│       │   │               │   ├── simple.xml
│       │   │               │   ├── simple_2.xml
│       │   │               │   └── simple_4.xml
│       │   │               ├── values/
│       │   │               │   └── strings.xml
│       │   │               └── xml/
│       │   │                   ├── fileprovider_path.xml
│       │   │                   └── pref_headers.xml
│       │   ├── build.gradle
│       │   ├── gradle/
│       │   │   └── wrapper/
│       │   │       ├── gradle-wrapper.jar
│       │   │       └── gradle-wrapper.properties
│       │   ├── gradle.properties
│       │   ├── gradlew
│       │   ├── gradlew.bat
│       │   └── settings.gradle
│       ├── plugin-demo2/
│       │   ├── README.md
│       │   ├── app/
│       │   │   ├── build.gradle
│       │   │   ├── case.gradle
│       │   │   ├── proguard-rules.pro
│       │   │   └── src/
│       │   │       └── main/
│       │   │           ├── AndroidManifest.xml
│       │   │           ├── aidl/
│       │   │           │   └── com/
│       │   │           │       └── qihoo360/
│       │   │           │           └── replugin/
│       │   │           │               └── sample/
│       │   │           │                   └── demo2/
│       │   │           │                       └── IDemo2.aidl
│       │   │           ├── java/
│       │   │           │   └── com/
│       │   │           │       └── qihoo360/
│       │   │           │           └── replugin/
│       │   │           │               └── sample/
│       │   │           │                   └── demo2/
│       │   │           │                       ├── Demo2Impl.java
│       │   │           │                       ├── MainActivity.java
│       │   │           │                       ├── MainApp.java
│       │   │           │                       ├── activity/
│       │   │           │                       │   ├── appcompat/
│       │   │           │                       │   │   └── AppCompatActivityDemo.java
│       │   │           │                       │   └── for_result/
│       │   │           │                       │       └── ForResultActivity.java
│       │   │           │                       ├── databinding/
│       │   │           │                       │   ├── DataBindingActivity.java
│       │   │           │                       │   └── Entry.java
│       │   │           │                       ├── receivers/
│       │   │           │                       │   └── PluginDemo2Receiver.java
│       │   │           │                       ├── service/
│       │   │           │                       │   └── PluginDemo2Service.java
│       │   │           │                       ├── support/
│       │   │           │                       │   └── LogX.java
│       │   │           │                       └── testcase/
│       │   │           │                           └── TestMultiDex.java
│       │   │           └── res/
│       │   │               ├── layout/
│       │   │               │   ├── databinding_test.xml
│       │   │               │   └── from_demo1.xml
│       │   │               └── values/
│       │   │                   └── strings.xml
│       │   ├── build.gradle
│       │   ├── gradle/
│       │   │   └── wrapper/
│       │   │       ├── gradle-wrapper.jar
│       │   │       └── gradle-wrapper.properties
│       │   ├── gradle.properties
│       │   ├── gradlew
│       │   ├── gradlew.bat
│       │   └── settings.gradle
│       ├── plugin-demo3-kotlin/
│       │   ├── README.md
│       │   ├── app/
│       │   │   ├── build.gradle
│       │   │   ├── proguard-rules.pro
│       │   │   └── src/
│       │   │       └── main/
│       │   │           ├── AndroidManifest.xml
│       │   │           ├── aidl/
│       │   │           │   └── com/
│       │   │           │       └── qihoo360/
│       │   │           │           └── replugin/
│       │   │           │               └── sample/
│       │   │           │                   └── demo2/
│       │   │           │                       └── IDemo2.aidl
│       │   │           ├── java/
│       │   │           │   └── com/
│       │   │           │       └── qihoo360/
│       │   │           │           └── replugin/
│       │   │           │               └── sample/
│       │   │           │                   └── demo3/
│       │   │           │                       ├── BaseActivity.kt
│       │   │           │                       ├── MainActivity.kt
│       │   │           │                       ├── MainApp.kt
│       │   │           │                       ├── TestItem.kt
│       │   │           │                       ├── activity/
│       │   │           │                       │   └── theme/
│       │   │           │                       │       └── ThemeBlackNoTitleBarActivity.kt
│       │   │           │                       ├── receivers/
│       │   │           │                       │   └── PluginDemo3Receiver.kt
│       │   │           │                       ├── service/
│       │   │           │                       │   └── PluginDemoService1.kt
│       │   │           │                       └── support/
│       │   │           │                           └── LogX.kt
│       │   │           └── res/
│       │   │               ├── layout/
│       │   │               │   ├── main.xml
│       │   │               │   ├── main_fragment.xml
│       │   │               │   └── simple.xml
│       │   │               └── values/
│       │   │                   └── strings.xml
│       │   ├── build.gradle
│       │   ├── gradle/
│       │   │   └── wrapper/
│       │   │       ├── gradle-wrapper.jar
│       │   │       └── gradle-wrapper.properties
│       │   ├── gradle.properties
│       │   ├── gradlew
│       │   ├── gradlew.bat
│       │   └── settings.gradle
│       └── plugin-webview/
│           ├── README.md
│           ├── app/
│           │   ├── build.gradle
│           │   ├── proguard-rules.pro
│           │   └── src/
│           │       └── main/
│           │           ├── AndroidManifest.xml
│           │           ├── java/
│           │           │   └── com/
│           │           │       └── qihoo360/
│           │           │           └── replugin/
│           │           │               └── sample/
│           │           │                   └── webview/
│           │           │                       ├── MainActivity.java
│           │           │                       ├── MainApp.java
│           │           │                       ├── common/
│           │           │                       │   ├── CommonWebChromeClient.java
│           │           │                       │   ├── CommonWebView.java
│           │           │                       │   └── CommonWebViewClient.java
│           │           │                       ├── env/
│           │           │                       │   └── Env.java
│           │           │                       ├── utils/
│           │           │                       │   ├── ReflectUtil.java
│           │           │                       │   └── WebViewResourceHelper.java
│           │           │                       └── views/
│           │           │                           ├── SimpleWebPage.java
│           │           │                           └── SimpleWebView.java
│           │           └── res/
│           │               ├── layout/
│           │               │   ├── web_page.xml
│           │               │   └── webview.xml
│           │               └── values/
│           │                   ├── colors.xml
│           │                   └── strings.xml
│           ├── build.gradle
│           ├── gradle/
│           │   └── wrapper/
│           │       ├── gradle-wrapper.jar
│           │       └── gradle-wrapper.properties
│           ├── gradle.properties
│           ├── gradlew
│           ├── gradlew.bat
│           └── settings.gradle
├── replugin-sample-extra/
│   ├── README.md
│   └── fresco/
│       ├── FrescoHost/
│       │   ├── .gitignore
│       │   ├── app/
│       │   │   ├── .gitignore
│       │   │   ├── build.gradle
│       │   │   ├── libs/
│       │   │   │   ├── drawee-modified-1.7.1.jar
│       │   │   │   ├── fbcore-1.7.1.jar
│       │   │   │   ├── fresco-1.7.1.jar
│       │   │   │   ├── imagepipeline-1.7.1.jar
│       │   │   │   └── imagepipeline-base-1.7.1.jar
│       │   │   ├── proguard-rules.pro
│       │   │   └── src/
│       │   │       └── main/
│       │   │           ├── AndroidManifest.xml
│       │   │           ├── assets/
│       │   │           │   └── plugins/
│       │   │           │       └── plugin1.jar
│       │   │           ├── java/
│       │   │           │   └── com/
│       │   │           │       ├── facebook/
│       │   │           │       │   └── fresco/
│       │   │           │       │       └── patch/
│       │   │           │       │           ├── DraweeStyleableCallbackImpl.java
│       │   │           │       │           └── FrescoPatch.java
│       │   │           │       └── qihoo360/
│       │   │           │           └── replugin/
│       │   │           │               └── fresco/
│       │   │           │                   └── host/
│       │   │           │                       ├── HostApp.java
│       │   │           │                       ├── HostFrescoActivity.java
│       │   │           │                       └── MainActivity.java
│       │   │           └── res/
│       │   │               ├── layout/
│       │   │               │   ├── activity_host_fresco.xml
│       │   │               │   └── activity_main.xml
│       │   │               └── values/
│       │   │                   ├── attrs.xml
│       │   │                   ├── colors.xml
│       │   │                   ├── strings.xml
│       │   │                   └── styles.xml
│       │   ├── build.gradle
│       │   ├── gradle/
│       │   │   └── wrapper/
│       │   │       ├── gradle-wrapper.jar
│       │   │       └── gradle-wrapper.properties
│       │   ├── gradle.properties
│       │   ├── gradlew
│       │   ├── gradlew.bat
│       │   └── settings.gradle
│       └── FrescoPlugin/
│           ├── .gitignore
│           ├── app/
│           │   ├── .gitignore
│           │   ├── build.gradle
│           │   ├── libs/
│           │   │   ├── drawee-modified-1.7.1.jar
│           │   │   ├── fbcore-1.7.1.jar
│           │   │   ├── fresco-1.7.1.jar
│           │   │   ├── imagepipeline-1.7.1.jar
│           │   │   └── imagepipeline-base-1.7.1.jar
│           │   ├── proguard-rules.pro
│           │   └── src/
│           │       └── main/
│           │           ├── AndroidManifest.xml
│           │           ├── java/
│           │           │   └── com/
│           │           │       ├── facebook/
│           │           │       │   └── fresco/
│           │           │       │       └── patch/
│           │           │       │           ├── DraweeStyleableCallbackImpl.java
│           │           │       │           └── FrescoPatch.java
│           │           │       └── qihoo360/
│           │           │           └── replugin/
│           │           │               └── fresco/
│           │           │                   └── plugin/
│           │           │                       ├── MainActivity.java
│           │           │                       └── PluginApp.java
│           │           └── res/
│           │               ├── layout/
│           │               │   └── activity_main.xml
│           │               └── values/
│           │                   ├── attrs.xml
│           │                   ├── colors.xml
│           │                   ├── strings.xml
│           │                   └── styles.xml
│           ├── build.gradle
│           ├── gradle/
│           │   └── wrapper/
│           │       ├── gradle-wrapper.jar
│           │       └── gradle-wrapper.properties
│           ├── gradle.properties
│           ├── gradlew
│           ├── gradlew.bat
│           └── settings.gradle
├── rp-config.gradle
└── rp-publish.gradle
Download .txt
Showing preview only (266K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2870 symbols across 308 files)

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/i/Factory.java
  class Factory (line 79) | public final class Factory {
    method query (line 141) | @Deprecated
    method isPluginLoaded (line 151) | public static final boolean isPluginLoaded(String name) {
    method query (line 161) | public static final IBinder query(String name, String binder) {
    method query (line 172) | public static final IBinder query(String name, String binder, int proc...
    method queryPluginContext (line 183) | public static final Context queryPluginContext(String name) {
    method queryPluginResouces (line 193) | public static final Resources queryPluginResouces(String name) {
    method queryPluginPackageInfo (line 203) | public static final PackageInfo queryPluginPackageInfo(String name) {
    method queryPluginPackageInfo (line 215) | public static final PackageInfo queryPluginPackageInfo(String pkgName,...
    method queryPluginComponentList (line 225) | public static final ComponentList queryPluginComponentList(String name) {
    method queryPluginClassLoader (line 235) | public static final ClassLoader queryPluginClassLoader(String name) {
    method queryActivityInfo (line 246) | public static final ActivityInfo queryActivityInfo(String name, String...
    method queryServiceInfo (line 262) | public static final ServiceInfo queryServiceInfo(String name, String c...
    method getActivityInfo (line 277) | public static ActivityInfo getActivityInfo(String plugin, String activ...
    method queryPluginsReceiverList (line 286) | public static List<ActivityInfo> queryPluginsReceiverList(Intent inten...
    method startActivity (line 300) | public static final boolean startActivity(Context context, Intent inte...
    method startActivityWithNoInjectCN (line 326) | public static final boolean startActivityWithNoInjectCN(Context contex...
    method loadPluginActivity (line 341) | public static final ComponentName loadPluginActivity(Intent intent, St...
    method loadPluginService (line 352) | public static final ComponentName loadPluginService(String plugin, Str...
    method loadPluginProvider (line 365) | @Deprecated
    method makePluginProviderUri (line 374) | public static final Uri makePluginProviderUri(String plugin, Uri uri, ...
    method fetchPluginName (line 389) | public static final String fetchPluginName(ClassLoader cl) {
    method startActivityForResult (line 402) | public static boolean startActivityForResult(Activity activity, Intent...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/i/Factory2.java
  class Factory2 (line 35) | public final class Factory2 {
    method createActivityContext (line 49) | public static final Context createActivityContext(Activity activity, C...
    method handleActivityCreateBefore (line 59) | public static final void handleActivityCreateBefore(Activity activity,...
    method handleActivityCreate (line 69) | public static final void handleActivityCreate(Activity activity, Bundl...
    method handleActivityDestroy (line 78) | public static final void handleActivityDestroy(Activity activity) {
    method handleRestoreInstanceState (line 88) | public static final void handleRestoreInstanceState(Activity activity,...
    method handleServiceCreate (line 97) | public static final void handleServiceCreate(Service service) {
    method handleServiceDestroy (line 106) | public static final void handleServiceDestroy(Service service) {
    method startActivity (line 118) | public static final boolean startActivity(Context context, Intent inte...
    method startActivity (line 130) | public static final boolean startActivity(Activity activity, Intent in...
    method startActivity (line 145) | public static final boolean startActivity(Context context, Intent inte...
    method startActivityForResult (line 158) | public static final boolean startActivityForResult(Activity activity, ...
    method fetchPlugins (line 168) | public static final JSONArray fetchPlugins(String name) {
    method registerDynamicClass (line 181) | public static final boolean registerDynamicClass(String className, Str...
    method registerDynamicClass (line 193) | public static final boolean registerDynamicClass(String className, Str...
    method isDynamicClass (line 204) | public static final boolean isDynamicClass(String plugin, String class...
    method unregisterDynamicClass (line 208) | public static void unregisterDynamicClass(String source) {
    method getPluginByDynamicClass (line 219) | public static final String getPluginByDynamicClass(String className) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/i/IModule.java
  type IModule (line 27) | public interface IModule {
    method invoke (line 34) | Object invoke(Object...args);

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/i/IPlugin.java
  type IPlugin (line 28) | public interface IPlugin {
    method query (line 34) | IModule query(Class<? extends IModule> c);

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/i/IPluginManager.java
  type IPluginManager (line 24) | public interface IPluginManager {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils/LocalBroadcastManager.java
  class LocalBroadcastManager (line 10) | public class LocalBroadcastManager {
    method getInstance (line 20) | public static LocalBroadcastManager getInstance(Context context) {
    method LocalBroadcastManager (line 31) | private LocalBroadcastManager(Context context) {
    method loadClass (line 36) | private void loadClass() {
    method registerReceiver (line 53) | public boolean registerReceiver(BroadcastReceiver receiver, IntentFilt...
    method unregisterReceiver (line 66) | public boolean unregisterReceiver(BroadcastReceiver receiver) {
    method sendBroadcast (line 79) | public boolean sendBroadcast(Intent intent) {
    method sendBroadcastSync (line 92) | public boolean sendBroadcastSync(Intent intent) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils/PackageUtils.java
  class PackageUtils (line 27) | public class PackageUtils {
    method getPackageArchiveInfo (line 36) | public static PackageInfo getPackageArchiveInfo(PackageManager pm, Str...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils/PatchClassLoaderUtils.java
  class PatchClassLoaderUtils (line 36) | public class PatchClassLoaderUtils {
    method patch (line 40) | public static boolean patch(Application application) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils/ProcessLocker.java
  class ProcessLocker (line 40) | public final class ProcessLocker {
    method ProcessLocker (line 58) | public ProcessLocker(Context context, String filename) {
    method ProcessLocker (line 85) | public ProcessLocker(Context context, String dir, String filename) {
    method isLocked (line 107) | public final synchronized boolean isLocked() {
    method tryLock (line 124) | public final synchronized boolean tryLock() {
    method tryLockTimeWait (line 148) | public final synchronized boolean tryLockTimeWait(int ms, int interval) {
    method lock (line 191) | public final synchronized boolean lock() {
    method unlock (line 211) | public final synchronized void unlock() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils/StringUtils.java
  class StringUtils (line 28) | public class StringUtils {
    method toHexString (line 35) | public static final String toHexString(byte[] bytes) {
    method md5base64 (line 44) | public static final String md5base64(byte buffer[]) throws NoSuchAlgor...
    method utf8md5base64 (line 51) | public static final String utf8md5base64(String str) throws NoSuchAlgo...
    method toStringWithLines (line 56) | public static String toStringWithLines(List<?> list) {
    method lastChar (line 61) | public static char lastChar(String s) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils/SysUtils.java
  class SysUtils (line 29) | public final class SysUtils {
    method getCurrentProcessName (line 38) | public static String getCurrentProcessName() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils2/FilePermissionUtils.java
  class FilePermissionUtils (line 27) | public class FilePermissionUtils {
    method setPermissions (line 56) | public static int setPermissions(String filePath, int mode, int uid, i...
    method getPermissions (line 83) | public static int getPermissions(String filePath, int[] outPermissions) {
    method initClass (line 104) | private static void initClass() throws ClassNotFoundException {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/BinderCursor.java
  class BinderCursor (line 35) | public class BinderCursor extends MatrixCursor {
    class BinderParcelable (line 41) | public static class BinderParcelable implements Parcelable {
      method createFromParcel (line 46) | @Override
      method newArray (line 51) | @Override
      method BinderParcelable (line 57) | BinderParcelable(IBinder binder) {
      method BinderParcelable (line 61) | BinderParcelable() {
      method BinderParcelable (line 65) | BinderParcelable(Parcel source) {
      method describeContents (line 69) | @Override
      method writeToParcel (line 74) | @Override
    method BinderCursor (line 80) | public BinderCursor(String[] columnNames, IBinder binder) {
    method getExtras (line 89) | @Override
    method queryBinder (line 94) | public static final Cursor queryBinder(IBinder binder) {
    method getBinder (line 101) | public static final IBinder getBinder(Cursor cursor) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/BuildCompat.java
  class BuildCompat (line 24) | public class BuildCompat {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/Builder.java
  class Builder (line 37) | public class Builder {
    class PxAll (line 43) | static final class PxAll {
      method insert (line 77) | private final boolean insert(ArrayList<PluginInfo> array, PluginInfo...
      method hasOlder (line 103) | private final boolean hasOlder(ArrayList<PluginInfo> array, PluginIn...
      method getBuiltin (line 118) | private final PluginInfo getBuiltin(String name) {
      method getV5 (line 131) | private final PluginInfo getV5(String name) {
      method getOthers (line 143) | final HashSet<PluginInfo> getOthers() {
      method getPlugins (line 150) | final ArrayList<PluginInfo> getPlugins() {
      method addBuiltin (line 157) | final void addBuiltin(PluginInfo info) {
      method addV5 (line 165) | final void addV5(PluginInfo info) {
      method addNormal (line 176) | final void addNormal(PluginInfo info) {
    method builder (line 196) | static final void builder(Context context, PxAll all) {
    method getDexDir (line 201) | private static File getDexDir(Context context) {
    method deleteUnknownDexs (line 209) | private static void deleteUnknownDexs(Context context, PxAll all) {
    method deleteUnknownLibs (line 263) | private static void deleteUnknownLibs(Context context, PxAll all) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/CertUtils.java
  class CertUtils (line 37) | public class CertUtils {
    method isPluginSignatures (line 44) | public static final boolean isPluginSignatures(PackageInfo info) {
    method md5 (line 85) | public static final byte[] md5(byte buffer[]) throws NoSuchAlgorithmEx...
    method md5NonE (line 91) | public static final byte[] md5NonE(byte buffer[]) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/Constant.java
  class Constant (line 24) | public class Constant {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/DumpUtils.java
  class DumpUtils (line 32) | public class DumpUtils {
    method dump (line 43) | public static void dump(FileDescriptor fd, PrintWriter writer, String[...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/Finder.java
  class Finder (line 34) | public class Finder {
    method search (line 39) | static final void search(Context context, PxAll all) {
    method searchLocalPlugins (line 44) | private static final void searchLocalPlugins(File dir, PxAll all, Hash...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/FinderBuiltin.java
  class FinderBuiltin (line 46) | public class FinderBuiltin {
    method loadPlugins (line 48) | static final void loadPlugins(Context context, PxAll all) {
    method readConfig (line 69) | private static final void readConfig(InputStream in, PxAll all) throws...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/LaunchModeStates.java
  class LaunchModeStates (line 36) | class LaunchModeStates {
    method addStates (line 66) | void addStates(Map<String, ActivityState> allStates, HashSet<String> c...
    method addLandStates (line 98) | void addLandStates(Map<String, ActivityState> allStates, HashSet<Strin...
    method getStates (line 128) | HashMap<String, ActivityState> getStates(int screenOrientation, int la...
    method getInfix (line 145) | private static String getInfix(int launchMode, boolean translucent) {
    method isTranslucentTheme (line 154) | public static boolean isTranslucentTheme(int theme) {
    method getLaunchModeInfix (line 164) | private static String getLaunchModeInfix(int launchMode) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/Loader.java
  class Loader (line 72) | class Loader {
    class ProxyPlugin (line 115) | static class ProxyPlugin implements IPlugin {
      method ProxyPlugin (line 119) | ProxyPlugin(IBinder plugin) {
      method query (line 123) | @Override
    method Loader (line 146) | Loader(Context context, String name, String path, Plugin p) {
    method isPackageInfoLoaded (line 153) | final boolean isPackageInfoLoaded() {
    method isResourcesLoaded (line 157) | final boolean isResourcesLoaded() {
    method isDexLoaded (line 161) | final boolean isDexLoaded() {
    method isAppLoaded (line 165) | final boolean isAppLoaded() {
    method createBaseContext (line 169) | final Context createBaseContext(Context newBase) {
    method loadDex (line 173) | final boolean loadDex(ClassLoader parent, int load) {
    method regReceivers (line 394) | private void regReceivers() throws android.os.RemoteException {
    method getPluginHost (line 415) | private IPluginHost getPluginHost() {
    method loadEntryMethod (line 427) | final boolean loadEntryMethod(boolean log) {
    method invoke (line 450) | final boolean invoke(PluginCommImpl manager) {
    method loadEntryMethod2 (line 465) | final boolean loadEntryMethod2() {
    method loadEntryMethod3 (line 487) | final boolean loadEntryMethod3() {
    method invoke2 (line 504) | final boolean invoke2(PluginCommImpl x) {
    method getHostProcessList (line 535) | private List<String> getHostProcessList() {
    method getPluginProcessList (line 548) | private List<String> getPluginProcessList() {
    method getPluginProcess (line 569) | private void getPluginProcess(Set<String> processSet, ComponentInfo[] ...
    method genDynamicProcessMap (line 582) | private HashMap<String, String> genDynamicProcessMap() {
    method getConfigProcessMap (line 610) | private HashMap<String, String> getConfigProcessMap(ApplicationInfo ap...
    method adjustPluginProcess (line 650) | private void adjustPluginProcess(ApplicationInfo appInfo) {
    method doAdjust (line 677) | private void doAdjust(HashMap<String, String> processMap, HashMap<Stri...
    method adjustPluginTaskAffinity (line 704) | private void adjustPluginTaskAffinity(String plugin, ApplicationInfo a...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/MP.java
  class MP (line 47) | public class MP {
    method installBuiltinPlugin (line 70) | public static final void installBuiltinPlugin(String name, IHostBinder...
    method installBinder (line 78) | public static final void installBinder(String name, IBinder binder) {
    method fetchBinder (line 95) | public static final IBinder fetchBinder(String name) {
    method fetchPluginBinder (line 118) | public static final PluginBinder fetchPluginBinder(String plugin, int ...
    method releasePluginBinder (line 179) | public static final void releasePluginBinder(PluginBinder binder) {
    method pluginDownloaded (line 206) | public static final PluginInfo pluginDownloaded(String path) {
    method pluginUninstall (line 272) | public static final boolean pluginUninstall(String pluginName) {
    method pluginExtracted (line 301) | public static final boolean pluginExtracted(String path) {
    method getPlugins (line 321) | public static final List<PluginInfo> getPlugins(boolean clone) {
    method getPlugin (line 351) | public static final PluginInfo getPlugin(String name, boolean clone) {
    method sumActivities (line 368) | public static final int sumActivities() {
    method sumBinders (line 382) | public static final int sumBinders() {
    method resolvePluginActivity (line 402) | public static final String[] resolvePluginActivity(String container) {
    method isMsProcessAlive (line 412) | public static final boolean isMsProcessAlive(String name) {
    method startPluginProcess (line 433) | public static final IPluginClient startPluginProcess(String plugin, in...
    method getTaskAffinityGroupIndex (line 443) | public static int getTaskAffinityGroupIndex(String taskAffinity) throw...
    class PluginBinder (line 447) | public static final class PluginBinder {
      method PluginBinder (line 457) | PluginBinder(String plugin, String name, int pid, IBinder binder) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PMF.java
  class PMF (line 43) | public class PMF {
    method setApplicationContext (line 52) | private static final void setApplicationContext(Context context) {
    method getApplicationContext (line 59) | public static final Context getApplicationContext() {
    method init (line 66) | public static final void init(Application application) {
    method callAppCreate (line 83) | public static final void callAppCreate() {
    method callAttach (line 90) | public static final void callAttach() {
    method addBuiltinModule (line 99) | public static final void addBuiltinModule(String name, Class<? extends...
    method getLocal (line 106) | public static final PluginCommImpl getLocal() {
    method getInternal (line 113) | public static final PluginLibraryInternalProxy getInternal() {
    method loadClass (line 122) | public static final Class<?> loadClass(String className, boolean resol...
    method forward (line 130) | public static final void forward(Activity activity, Intent intent) {
    method dump (line 197) | public static final void dump(FileDescriptor fd, PrintWriter writer, S...
    method stopService (line 203) | public static void stopService(Intent intent) throws RemoteException {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/Plugin.java
  class Plugin (line 62) | class Plugin {
    class UpdateInfoTask (line 170) | private static class UpdateInfoTask implements Runnable {
      method UpdateInfoTask (line 174) | UpdateInfoTask(PluginInfo info) {
      method run (line 178) | @Override
    method build (line 190) | static final Plugin build(PluginInfo info) {
    method cloneAndReattach (line 194) | static final Plugin cloneAndReattach(Context c, Plugin p, ClassLoader ...
    method queryPluginNameByPkgName (line 206) | static final String queryPluginNameByPkgName(String pkgName) {
    method queryCachedFilename (line 217) | static final String queryCachedFilename(String name) {
    method queryCachedClassLoader (line 228) | static final ClassLoader queryCachedClassLoader(String filename) {
    method queryCachedResources (line 247) | static final Resources queryCachedResources(String filename) {
    method queryCachedPackageInfo (line 266) | static final PackageInfo queryCachedPackageInfo(String filename) {
    method queryCachedComponentList (line 285) | static final ComponentList queryCachedComponentList(String filename) {
    method clearCachedPlugin (line 304) | static final void clearCachedPlugin(String filename) {
    method dump (line 359) | static final void dump(FileDescriptor fd, PrintWriter writer, String[]...
    method Plugin (line 384) | private Plugin(PluginInfo info) {
    method toString (line 388) | @Override
    method attach (line 396) | final void attach(Context context, ClassLoader parent, PluginCommImpl ...
    method getClassLoader (line 405) | final ClassLoader getClassLoader() {
    method isInitialized (line 415) | final boolean isInitialized() {
    method isLoaded (line 422) | final boolean isLoaded() {
    method isPackageInfoLoaded (line 432) | final boolean isPackageInfoLoaded() {
    method load (line 442) | final boolean load(int load, boolean useCache) {
    method replaceInfo (line 459) | final void replaceInfo(PluginInfo info) {
    method loadByCache (line 475) | private boolean loadByCache(int load) {
    method loadLocked (line 534) | private boolean loadLocked(int load, boolean useCache) {
    method query (line 737) | final IModule query(Class<? extends IModule> c) {
    method query (line 741) | final IBinder query(String binder) {
    method tryLoadAgain (line 755) | private boolean tryLoadAgain(String tag, Context context, ClassLoader ...
    method doLoad (line 760) | private final boolean doLoad(String tag, Context context, ClassLoader ...
    method loadEntryLocked (line 855) | private boolean loadEntryLocked(PluginCommImpl manager) {
    method callApp (line 896) | private void callApp() {
    method callAppLocked (line 915) | private synchronized void callAppLocked() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginBinderInfo.java
  class PluginBinderInfo (line 28) | public final class PluginBinderInfo implements Parcelable {
    method createFromParcel (line 48) | @Override
    method newArray (line 53) | @Override
    method PluginBinderInfo (line 59) | PluginBinderInfo() {
    method PluginBinderInfo (line 66) | public PluginBinderInfo(int req) {
    method PluginBinderInfo (line 72) | PluginBinderInfo(Parcel source) {
    method readFromParcel (line 76) | final void readFromParcel(Parcel source) {
    method describeContents (line 82) | @Override
    method writeToParcel (line 87) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginCommImpl.java
  class PluginCommImpl (line 58) | public class PluginCommImpl {
    method PluginCommImpl (line 73) | PluginCommImpl(Context context, PmBase pm) {
    method isPluginLoaded (line 82) | public boolean isPluginLoaded(String name) {
    method query (line 99) | public IModule query(String name, Class<? extends IModule> c) {
    method query (line 125) | public IBinder query(String name, String binder) {
    method query (line 158) | public IBinder query(String name, String binder, int process) {
    method queryPluginContext (line 195) | public Context queryPluginContext(String name) {
    method queryPluginResouces (line 214) | public Resources queryPluginResouces(String name) {
    method queryPluginPackageInfo (line 239) | public PackageInfo queryPluginPackageInfo(String name) {
    method queryPluginPackageInfo (line 266) | public PackageInfo queryPluginPackageInfo(String pkgName, int flags) {
    method queryPluginComponentList (line 281) | public ComponentList queryPluginComponentList(String name) {
    method queryPluginClassLoader (line 306) | public ClassLoader queryPluginClassLoader(String name) {
    method loadPluginClassLoader (line 333) | public ClassLoader loadPluginClassLoader(PluginInfo pi) {
    method queryPluginsReceiverList (line 352) | public List<ActivityInfo> queryPluginsReceiverList(Intent intent) {
    method startActivity (line 375) | public boolean startActivity(Context context, Intent intent, String pl...
    method startActivityForResult (line 387) | public boolean startActivityForResult(Activity activity, Intent intent...
    method loadPluginActivity (line 403) | public ComponentName loadPluginActivity(Intent intent, String plugin, ...
    method loadPluginService (line 477) | public ComponentName loadPluginService(String plugin, String target, i...
    method loadPluginProvider (line 509) | public Uri loadPluginProvider(String plugin, String target, int proces...
    method fetchPluginName (line 538) | public String fetchPluginName(ClassLoader cl) {
    method getActivityInfo (line 559) | public ActivityInfo getActivityInfo(String plugin, String activity, In...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginContainers.java
  class PluginContainers (line 59) | public class PluginContainers {
    class ActivityState (line 135) | static final class ActivityState {
      method ActivityState (line 149) | ActivityState(String container) {
      method ActivityState (line 154) | public ActivityState(ActivityState state) {
      method toString (line 163) | @Override
      method toName (line 175) | static final String toName(int state) {
      method isTarget (line 187) | private final boolean isTarget(String plugin, String activity) {
      method occupy (line 194) | private final void occupy(String plugin, String activity) {
      method restore (line 212) | private final void restore(String plugin, String activity, long time...
      method recycle (line 226) | private final void recycle() {
      method create (line 235) | private final void create(String plugin, Activity activity) {
      method hasRef (line 270) | private final boolean hasRef() {
      method cleanRefs (line 280) | private final void cleanRefs() {
      method addRef (line 291) | private final void addRef(Activity activity) {
      method removeRef (line 300) | private final void removeRef(Activity activity) {
      method finishRefs (line 310) | private final void finishRefs() {
      method forwardSelf (line 319) | final void forwardSelf(Activity activity1, Intent intent) {
    method init (line 341) | final void init(int process, HashSet<String> containers) {
    method init2 (line 412) | private void init2(String prefix, HashSet<String> containers, ProcessS...
    method loadFromPref (line 451) | private final void loadFromPref() {
    method save2Pref (line 485) | private static final void save2Pref(String plugin, String activity, St...
    method resolvePluginActivity (line 493) | static final String[] resolvePluginActivity(String container) {
    method forwardIntent (line 506) | final void forwardIntent(Activity activity, Intent intent, String orig...
    method alloc (line 582) | final String alloc(ActivityInfo ai, String plugin, String activity, in...
    method allocLocked (line 625) | private final ActivityState allocLocked(ActivityInfo ai, HashMap<Strin...
    method alloc2 (line 703) | String alloc2(ActivityInfo ai, String plugin, String activity, int pro...
    method handleCreate (line 740) | final void handleCreate(String plugin, Activity activity, String conta...
    method handleDestroy (line 757) | final void handleDestroy(Activity activity) {
    method lookupByContainer (line 785) | final ActivityState lookupByContainer(String container) {
    method dump (line 810) | final String dump() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginContext.java
  class PluginContext (line 57) | public class PluginContext extends ContextThemeWrapper {
    method onCreateView (line 81) | @Override
    method PluginContext (line 87) | public PluginContext(Context base, int themeres, ClassLoader cl, Resou...
    method getClassLoader (line 98) | @Override
    method getResources (line 106) | @Override
    method getAssets (line 114) | @Override
    method getSystemService (line 122) | @Override
    method getSharedPreferences (line 138) | @Override
    method openFileInput (line 144) | @Override
    method openFileOutput (line 150) | @Override
    method deleteFile (line 170) | @Override
    method getFilesDir (line 176) | @Override
    method getCacheDir (line 199) | @Override
    method getFileStreamPath (line 231) | @Override
    method getDir (line 236) | @Override
    method getDatabasesDir (line 247) | private File getDatabasesDir() {
    method validateFilePath (line 259) | private File validateFilePath(String name, boolean createDirectory) {
    method makeFilename (line 280) | private final File makeFilename(File base, String name) {
    method setFilePermissionsFromMode (line 300) | private final void setFilePermissionsFromMode(String name, int mode, i...
    method getDataDirFile (line 317) | private final File getDataDirFile() {
    method handleCreateView (line 353) | private final View handleCreateView(String name, Context context, Attr...
    method getPackageName (line 428) | @Override
    method getApplicationContext (line 440) | @Override
    method startActivity (line 458) | @Override
    method startActivity (line 480) | @Override
    method startService (line 497) | @Override
    method stopService (line 519) | @Override
    method bindService (line 533) | @Override
    method unbindService (line 547) | @Override
    method getPackageCodePath (line 565) | @Override
    method getApplicationInfo (line 575) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginDesc.java
  class PluginDesc (line 48) | public class PluginDesc {
    method get (line 70) | public static PluginDesc get(String pn) {
    method getCurrentMap (line 74) | private static HashMap<String, PluginDesc> getCurrentMap() {
    method PluginDesc (line 94) | public PluginDesc(String plugin) {
    method getPluginName (line 101) | public String getPluginName() {
    method getDisplayName (line 109) | public String getDisplayName() {
    method getDescription (line 120) | public String getDescription() {
    method isLarge (line 128) | public boolean isLarge() {
    method load (line 132) | private static boolean load(Context context) {
    method loadArray (line 156) | private static JSONArray loadArray(Context context) {
    method registerReceiverIfNeeded (line 178) | private static void registerReceiverIfNeeded() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginIntent.java
  class PluginIntent (line 34) | class PluginIntent {
    method PluginIntent (line 48) | PluginIntent(Intent intent) {
    method remove (line 52) | private final void remove(String prefix) {
    method getS (line 64) | private final String getS(String prefix) {
    method setS (line 76) | private final void setS(String prefix, String value) {
    method getI (line 81) | private final int getI(String prefix, int defValue) {
    method setI (line 105) | private final void setI(String prefix, int value) {
    method getOriginal (line 113) | final String getOriginal() {
    method getPlugin (line 121) | final String getPlugin() {
    method setPlugin (line 125) | final void setPlugin(String plugin) {
    method getActivity (line 129) | final String getActivity() {
    method setActivity (line 133) | final void setActivity(String activity) {
    method getProcess (line 137) | final int getProcess() {
    method setProcess (line 141) | final void setProcess(int process) {
    method getContainer (line 145) | final String getContainer() {
    method setContainer (line 149) | final void setContainer(String container) {
    method getCounter (line 153) | final int getCounter() {
    method setCounter (line 157) | final void setCounter(int counter) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginLibraryInternalProxy.java
  class PluginLibraryInternalProxy (line 58) | public class PluginLibraryInternalProxy {
    method PluginLibraryInternalProxy (line 65) | PluginLibraryInternalProxy(PmBase pm) {
    method startActivity (line 77) | public boolean startActivity(Context context, Intent intent) {
    method fetchPluginByPitActivity (line 172) | private String fetchPluginByPitActivity(Activity a) {
    method startActivity (line 197) | public boolean startActivity(Context context, Intent intent, String pl...
    method startActivityForResult (line 315) | public boolean startActivityForResult(Activity activity, Intent intent...
    method getPluginName (line 350) | private static String getPluginName(Activity activity, Intent intent) {
    method isNeedToDownload (line 363) | private boolean isNeedToDownload(Context context, String plugin) {
    method createActivityContext (line 401) | public Context createActivityContext(Activity activity, Context newBas...
    method handleActivityCreateBefore (line 429) | public void handleActivityCreateBefore(Activity activity, Bundle saved...
    method handleActivityCreate (line 464) | public void handleActivityCreate(Activity activity, Bundle savedInstan...
    method handleRestoreInstanceState (line 555) | public void handleRestoreInstanceState(Activity activity, Bundle saved...
    method handleActivityDestroy (line 581) | public void handleActivityDestroy(Activity activity) {
    method handleServiceCreate (line 623) | public void handleServiceCreate(Service service) {
    method handleServiceDestroy (line 632) | public void handleServiceDestroy(Service service) {
    method fetchPlugins (line 642) | public JSONArray fetchPlugins(String name) {
    method registerDynamicClass (line 666) | public boolean registerDynamicClass(String className, String plugin, S...
    method registerDynamicClass (line 674) | public boolean registerDynamicClass(String className, String plugin, S...
    method isDynamicClass (line 682) | public boolean isDynamicClass(String plugin, String className) {
    method unregisterDynamicClass (line 690) | public void unregisterDynamicClass(String className) {
    method getPluginByDynamicClass (line 698) | public String getPluginByDynamicClass(String className) {
    method getDynamicThemeId (line 705) | private int getDynamicThemeId(Activity activity) {
    method getThemeId (line 719) | private int getThemeId(Activity activity, Intent intent) {
    method getDefaultThemeId (line 783) | private static int getDefaultThemeId() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginManager.java
  class PluginManager (line 38) | public class PluginManager {
    method isPluginProcess (line 61) | public static final boolean isPluginProcess() {
    method isValidActivityProcess (line 65) | public static final boolean isValidActivityProcess(int process) {
    method isPluginProcess (line 75) | static final boolean isPluginProcess(int index) {
    method getPluginProcessIndex (line 79) | static final int getPluginProcessIndex() {
    method init (line 86) | @Deprecated
    method evalPluginProcess (line 97) | static final int evalPluginProcess(String name) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginNativeLibsHelper.java
  class PluginNativeLibsHelper (line 48) | public class PluginNativeLibsHelper {
    method install (line 60) | public static boolean install(String apkPath, File nativeDir) {
    method clear (line 107) | public static void clear(File nativeDir) {
    method injectEntriesAndLibsMap (line 123) | private static void injectEntriesAndLibsMap(ZipFile zipFile, Map<Strin...
    method extractFile (line 145) | private static void extractFile(ZipFile zipFile, ZipEntry ze, File out...
    method findSoPathForAbis (line 159) | private static String findSoPathForAbis(Set<String> soPaths, String so...
    method findSoPathWithAbiList (line 187) | private static String findSoPathWithAbiList(Set<String> soPaths, Strin...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginProcessMain.java
  class PluginProcessMain (line 55) | public class PluginProcessMain {
    class ProcessClientRecord (line 89) | private static final class ProcessClientRecord implements IBinder.Deat...
      method ProcessClientRecord (line 99) | public ProcessClientRecord(String process, String plugin, int pid, i...
      method binderDied (line 109) | @Override
      method toString (line 114) | @Override
      method getClient (line 122) | public IPluginClient getClient() {
    method dump (line 126) | static final String dump() {
    method dump (line 193) | static final void dump(FileDescriptor fd, PrintWriter writer, String[]...
    method installHost (line 214) | static final void installHost(IPluginHost host) {
    type DiedAction (line 231) | public interface DiedAction {
      method onDied (line 232) | void onDied();
    method connectToHostSvc (line 238) | static final void connectToHostSvc() {
    method connectToHostSvc (line 245) | static final void connectToHostSvc(final DiedAction diedAction) {
    method getPluginHost (line 322) | public static final IPluginHost getPluginHost() {
    method getPersistentCookie (line 340) | static final long getPersistentCookie() {
    method probePluginClient (line 361) | static final IPluginClient probePluginClient(final String plugin, fina...
    method getProcessStringByIndex (line 402) | private static String getProcessStringByIndex(int index) {
    method probePluginClientByPid (line 411) | static final IPluginClient probePluginClientByPid(final int pid, final...
    method sendIntent2Process (line 439) | static final void sendIntent2Process(final String target, Intent inten...
    method sendIntent2Plugin (line 465) | static final void sendIntent2Plugin(final String target, Intent intent...
    method sendIntent2Client (line 491) | private static void sendIntent2Client(Map<String, ProcessClientRecord>...
    method isProcessAlive (line 515) | static final boolean isProcessAlive(final String name) {
    method isBinderAlive (line 528) | private static boolean isBinderAlive(ProcessClientRecord r) {
    method sumActivities (line 532) | static final int sumActivities() {
    method allocProcess (line 566) | @Deprecated
    method attachProcess (line 596) | static final String attachProcess(int pid, String process, int index, ...
    method attachActivity (line 624) | static final boolean attachActivity(int pid, int index, String plugin,...
    method detachActivity (line 636) | static final boolean detachActivity(int pid, int index, String plugin,...
    method attachService (line 647) | static final boolean attachService(int pid, int index, String plugin, ...
    method detachService (line 658) | static final boolean detachService(int pid, int index, String plugin, ...
    method attachBinder (line 662) | static final void attachBinder(int pid, IBinder binder) {
    method detachBinder (line 666) | static final void detachBinder(int pid, IBinder binder) {
    method sumBinders (line 670) | static final int sumBinders(int index) {
    method getPidByProcessName (line 675) | static final int getPidByProcessName(final String processName) {
    method getProcessNameByPid (line 697) | static final String getProcessNameByPid(final int pid) {
    method handleBinderDied (line 719) | private static final void handleBinderDied(ProcessClientRecord p) {
    method getDefaultPluginName (line 735) | private static final String getDefaultPluginName(int pid, int index, I...
    method handleBinderDiedLocked (line 754) | private static final void handleBinderDiedLocked(final ProcessClientRe...
    method writeProcessClientLock (line 777) | private static <T> T writeProcessClientLock( final Action<T> action) {
    method readProcessClientLock (line 794) | private static <T> T readProcessClientLock( final Action<T> action) {
    type Action (line 811) | private interface Action<T> {
      method call (line 812) | T call();

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginProcessPer.java
  class PluginProcessPer (line 52) | class PluginProcessPer extends IPluginClient.Stub {
    method PluginProcessPer (line 69) | PluginProcessPer(Context context, PmBase pm, int process, HashSet<Stri...
    method init (line 79) | final void init(Plugin p) {
    method resolveActivityClass (line 88) | final Class<?> resolveActivityClass(String container) {
    method allocActivityContainer (line 136) | @Override
    method queryBinder (line 169) | @Override
    method releaseBinder (line 212) | @Override
    method sendIntent (line 221) | @Override
    method sendIntentSync (line 226) | @Override
    method sendIntent (line 231) | private void sendIntent(Intent intent, boolean sync) throws RemoteExce...
    method sumActivities (line 243) | @Override
    method fetchServiceServer (line 248) | @Override
    method bindActivity (line 262) | final String bindActivity(String plugin, int process, String activity,...
    method onReceive (line 330) | @Override
    method dumpServices (line 335) | @Override
    method dumpActivities (line 355) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginProviderStub.java
  class PluginProviderStub (line 44) | public class PluginProviderStub {
    method stubMain (line 72) | public static final Cursor stubMain(Uri uri, String[] projection, Stri...
    method stubPlugin (line 97) | public static final Uri stubPlugin(Uri uri, ContentValues values) {
    method proxyFetchHostBinder (line 144) | static final IBinder proxyFetchHostBinder(Context context) {
    method proxyFetchHostPref (line 152) | static final IBinder proxyFetchHostPref(Context context) {
    method proxyFetchHostBinder (line 161) | private static final IBinder proxyFetchHostBinder(Context context, Str...
    method proxyStartPluginProcess (line 191) | static final boolean proxyStartPluginProcess(Context context, int inde...
    method getPref (line 215) | public static final IPref getPref(Context context) throws RemoteExcept...
    method initPref (line 235) | static final void initPref() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginStatusController.java
  class PluginStatusController (line 38) | public class PluginStatusController {
    method setStatus (line 70) | public static void setStatus(String pn, int ver, int status) {
    method getStatus (line 93) | public static int getStatus(String pn) {
    method getStatus (line 106) | public static int getStatus(String pn, int ver) {
    method clearStatus (line 135) | public static void clearStatus() {
    method setAppContext (line 147) | public static void setAppContext(Application context) {
    method getStatusImpl (line 151) | private static PluginStatus getStatusImpl(String pn) {
    method addStatusToPref (line 171) | private static void addStatusToPref(Context context, String pn, String...
    method removeStatusToPref (line 176) | private static void removeStatusToPref(Context context, String pn) {
    method getStatusFromPref (line 181) | private static String getStatusFromPref(Context context, String pn) {
    class PluginStatus (line 186) | private static class PluginStatus {
      method PluginStatus (line 190) | PluginStatus(String pn, int ver, int status) {
      method PluginStatus (line 202) | PluginStatus(String json) throws JSONException {
      method getVersion (line 206) | public int getVersion() {
      method getChangeTime (line 210) | public long getChangeTime() {
      method getStatus (line 214) | public int getStatus() {
      method toJsonString (line 218) | String toJsonString() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginTable.java
  class PluginTable (line 37) | class PluginTable {
    method dump (line 44) | static final void dump(FileDescriptor fd, PrintWriter writer, String[]...
    method initPlugins (line 55) | static final void initPlugins(Map<String, Plugin> plugins) {
    method updatePlugin (line 63) | static final void updatePlugin(PluginInfo info) {
    method replaceInfo (line 82) | static final void replaceInfo(PluginInfo info) {
    method removeInfo (line 99) | static final void removeInfo(PluginInfo info) {
    method getPluginInfo (line 114) | static final PluginInfo getPluginInfo(String plugin) {
    method buildPlugins (line 120) | static final List<PluginInfo> buildPlugins() {
    method putPluginInfo (line 132) | private static void putPluginInfo(PluginInfo info) {
    method removePluginInfo (line 141) | private static void removePluginInfo(PluginInfo info) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PmBase.java
  class PmBase (line 74) | class PmBase {
    method onReceive (line 183) | @Override
    class DynamicClass (line 210) | private static class DynamicClass {
    method cleanIntentPluginParams (line 222) | static final void cleanIntentPluginParams(Intent intent) {
    method PmBase (line 233) | PmBase(Context context) {
    method init (line 263) | void init() {
    method initForServer (line 307) | private final void initForServer() {
    method findNewestBuiltin (line 356) | private List<PluginInfo> findNewestBuiltin(List<PluginInfo> builtin, L...
    method initForClient (line 387) | private final void initForClient() {
    method refreshPluginsFromHostSvc (line 412) | private void refreshPluginsFromHostSvc() {
    method isNeedToUpdate (line 451) | private final boolean isNeedToUpdate(List<PluginInfo> plugins) {
    method refreshPluginMap (line 467) | private final void refreshPluginMap(List<PluginInfo> plugins) {
    method putPluginObject (line 483) | private void putPluginObject(PluginInfo info, Plugin plugin) {
    method attach (line 524) | final void attach() {
    method installBuiltinPlugin (line 535) | final void installBuiltinPlugin(String name, IHostBinderFetcher p) {
    method callAttach (line 541) | final void callAttach() {
    method addBuiltinModule (line 576) | final void addBuiltinModule(String name, Class<? extends IModule> modc...
    method addDynamicClass (line 585) | final boolean addDynamicClass(String className, String plugin, String ...
    method isDynamicClass (line 608) | final boolean isDynamicClass(String plugin, String className) {
    method removeDynamicClass (line 618) | final void removeDynamicClass(String className) {
    method getPluginByDynamicClass (line 628) | final String getPluginByDynamicClass(String className) {
    method callAppCreate (line 636) | final void callAppCreate() {
    method loadClass (line 732) | final Class<?> loadClass(String className, boolean resolve) {
    method loadServiceClass (line 882) | private final Class<?> loadServiceClass(String className) {
    method loadProviderClass (line 924) | private final Class<?> loadProviderClass(String className) {
    method loadDefaultClass (line 966) | private final Class<?> loadDefaultClass(String className) {
    method dump (line 1004) | void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
    method getHostBinder (line 1123) | final IBinder getHostBinder() {
    method isActivity (line 1127) | final boolean isActivity(String name) {
    method getPlugin (line 1131) | final Plugin getPlugin(String plugin) {
    method loadPackageInfoPlugin (line 1135) | final Plugin loadPackageInfoPlugin(String plugin, PluginCommImpl pm) {
    method loadResourcePlugin (line 1140) | final Plugin loadResourcePlugin(String plugin, PluginCommImpl pm) {
    method loadDexPlugin (line 1145) | final Plugin loadDexPlugin(String plugin, PluginCommImpl pm) {
    method loadAppPlugin (line 1150) | final Plugin loadAppPlugin(String plugin) {
    method loadPlugin (line 1155) | final Plugin loadPlugin(PluginInfo pi, PluginCommImpl pm, int loadType...
    method loadPlugin (line 1162) | final Plugin loadPlugin(Plugin p, int loadType, boolean useCache) {
    method lookupPlugin (line 1175) | final Plugin lookupPlugin(ClassLoader loader) {
    method insertNewPlugin (line 1184) | final void insertNewPlugin(PluginInfo info) {
    method newPluginFound (line 1227) | final void newPluginFound(PluginInfo info, boolean persistNeedRestart) {
    method pluginUninstalled (line 1257) | final void pluginUninstalled(PluginInfo info) {
    method startPluginProcessLocked (line 1274) | final IPluginClient startPluginProcessLocked(String plugin, int proces...
    method getBuiltinPlugin (line 1349) | final IHostBinderFetcher getBuiltinPlugin(String plugin) {
    method getBuiltinModules (line 1355) | final HashMap<String, IModule> getBuiltinModules(String plugin) {
    method handleServiceCreated (line 1359) | final void handleServiceCreated(Service service) {
    method handleServiceDestroyed (line 1379) | final void handleServiceDestroyed(Service service) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PmHostSvc.java
  class PmHostSvc (line 67) | class PmHostSvc extends IPluginHost.Stub {
    class BinderDied (line 119) | private static final class BinderDied implements DeathRecipient {
      method BinderDied (line 125) | BinderDied(String name, IBinder binder) {
      method binderDied (line 130) | @Override
    method PmHostSvc (line 141) | PmHostSvc(Context context, PmBase packm) {
    method installBinder (line 148) | @Override
    method fetchBinder (line 163) | @Override
    method fetchPersistentCookie (line 175) | @Override
    method startPluginProcess (line 180) | @Override
    method attachPluginProcess (line 185) | @Override
    method listPlugins (line 202) | @Override
    method regActivity (line 207) | @Override
    method unregActivity (line 213) | @Override
    method regService (line 219) | @Override
    method unregService (line 225) | @Override
    method regPluginBinder (line 231) | @Override
    method unregPluginBinder (line 236) | @Override
    method regReceiver (line 253) | @Override
    method unregReceiver (line 296) | @Override
    method onReceive (line 307) | @Override
    method sumBinders (line 312) | @Override
    method updatePluginInfo (line 317) | @Override
    method pluginDownloaded (line 327) | @Override
    method pluginUninstalled (line 353) | @Override
    method syncInstalledPluginInfo2All (line 368) | private void syncInstalledPluginInfo2All(PluginInfo pi) {
    method syncUninstalledPluginInfo2All (line 409) | private void syncUninstalledPluginInfo2All(PluginInfo pi) {
    method pluginDownloadedForPn (line 431) | private PluginInfo pluginDownloadedForPn(String path) {
    method pluginExtracted (line 461) | @Override
    method sendIntent2Process (line 487) | @Override
    method sendIntent2ProcessSync (line 492) | @Override
    method sendIntent2Process (line 497) | private void sendIntent2Process(String target, Intent intent, boolean ...
    method sendIntent2PluginHostProcess (line 513) | private void sendIntent2PluginHostProcess(Intent intent, boolean sync) {
    method sendIntent2Plugin (line 522) | @Override
    method sendIntent2PluginSync (line 527) | @Override
    method sendIntent2Plugin (line 532) | private void sendIntent2Plugin(String target, Intent intent, boolean s...
    method isProcessAlive (line 547) | @Override
    method queryPluginBinder (line 552) | @Override
    method fetchServiceServer (line 557) | @Override
    method saveAction (line 565) | private void saveAction(String action, String plugin, String receiver) {
    method queryPluginsReceiverList (line 590) | @Override
    method fetchManagerServer (line 625) | @Override
    method getTaskAffinityGroupIndex (line 643) | public int getTaskAffinityGroupIndex(String pTaskAffinity) {
    method getValidGroup (line 665) | private int getValidGroup() {
    method getPidByProcessName (line 675) | @Override
    method getProcessNameByPid (line 680) | @Override
    method dump (line 685) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/ProcessStates.java
  class ProcessStates (line 25) | class ProcessStates {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/StubProcessManager.java
  class StubProcessManager (line 24) | public class StubProcessManager {
    method run (line 33) | @Override
    method allocProcess (line 51) | static final int allocProcess(String plugin) {
    method lookupPluginProcess (line 94) | private static final int lookupPluginProcess(List<ActivityManager.Runn...
    method waitKilled (line 107) | private static final void waitKilled(int pid) {
    method cancelPluginProcessLoop (line 131) | static final void cancelPluginProcessLoop() {
    method attachActivity (line 145) | static final boolean attachActivity(int pid, int index, String plugin,...
    method detachActivity (line 178) | static final boolean detachActivity(int pid, int index, String plugin,...
    method attachService (line 210) | static final boolean attachService(int pid, int index, String plugin, ...
    method detachService (line 242) | static final boolean detachService(int pid, int index, String plugin, ...
    method attachBinder (line 267) | static final void attachBinder(int pid, IBinder binder) {
    method detachBinder (line 287) | static final void detachBinder(int pid, IBinder binder) {
    method sumBinders (line 307) | static final int sumBinders(int index) {
    method attachStubProcess (line 327) | static final String attachStubProcess(int pid, int index, IBinder bind...
    method setProcessStop (line 350) | static final void setProcessStop(final IBinder binder) {
    method doPluginProcessLoop (line 361) | private static final void doPluginProcessLoop() {
    method schedulePluginProcessLoop (line 396) | static final void schedulePluginProcessLoop(long delayMillis) {
    method dump (line 406) | static final void dump(PrintWriter writer) {
    class StubProcessState (line 418) | public class StubProcessState {
    class ProcessRecord (line 428) | private static final class ProcessRecord {
      method ProcessRecord (line 450) | ProcessRecord(int index, int state) {
      method allocate (line 455) | void allocate(String plugin) {
      method setRunning (line 467) | void setRunning(int pid) {
      method setClient (line 472) | void setClient(IBinder binder, IPluginClient client) {
      method setStoped (line 477) | void setStoped() {
      method calculateMatchPriority (line 490) | int calculateMatchPriority(String newPluginName) {
      method resetAllocate (line 515) | void resetAllocate(String plugin, List<ActivityManager.RunningAppPro...
      method killProcess (line 520) | private void killProcess(List<ActivityManager.RunningAppProcessInfo>...
      method toString (line 532) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/TaskAffinityStates.java
  class TaskAffinityStates (line 35) | class TaskAffinityStates {
    method init (line 57) | public void init(String prefix, String suffix, HashMap<String, PluginC...
    method getStates (line 100) | HashMap<String, PluginContainers.ActivityState> getStates(ActivityInfo...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/V5FileInfo.java
  class V5FileInfo (line 52) | public class V5FileInfo {
    method getFileName (line 137) | static final String getFileName(String plugin) {
    method build (line 148) | static final V5FileInfo build(File f, int type) {
    method parseName (line 202) | public static final String parseName(String fullname, int type) {
    method getName (line 228) | public String getName() {
    method updateV5FileTo (line 232) | final PluginInfo updateV5FileTo(Context context, File dir, boolean upd...
    method updateV5FileTo (line 236) | final PluginInfo updateV5FileTo(Context context, File dir, boolean che...
    method fetchPluginInfo (line 449) | public static PluginInfo fetchPluginInfo(Context context, String pName) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/V5Finder.java
  class V5Finder (line 37) | public class V5Finder {
    method search (line 39) | static final void search(Context context, File pluginDir, PxAll all) {
    method searchV5Plugins (line 77) | private static final void searchV5Plugins(File dir, ArrayList<V5FileIn...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/VMRuntimeCompat.java
  class VMRuntimeCompat (line 30) | public class VMRuntimeCompat {
    method is64Bit (line 39) | public static boolean is64Bit() {
    method is64BitImpl (line 56) | private static boolean is64BitImpl() {
    method getArtOatCpuType (line 97) | public static String getArtOatCpuType() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/alc/ActivityController.java
  class ActivityController (line 41) | public final class ActivityController {
    method init (line 61) | public static final void init() {
    method install (line 65) | public static final void install(Application application) {
    method setListener (line 83) | public static final void setListener(IActivityUpdate listener) {
    method sumActivities (line 87) | public static final int sumActivities() {
    method install2x (line 100) | private static final void install2x() {
    method install4x (line 175) | private static final void install4x(Application application) {
    method loadVar (line 263) | private static final void loadVar() {
    type IActivityUpdate (line 353) | public interface IActivityUpdate {
      method handleActivityUpdate (line 355) | void handleActivityUpdate();

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/alc/IActivityWatcher.java
  type IActivityWatcher (line 28) | public interface IActivityWatcher extends android.os.IInterface {
    class Stub (line 31) | public abstract static class Stub extends android.os.Binder implements...
      method Stub (line 35) | public Stub() {
      method asBinder (line 39) | @Override
      method onTransact (line 44) | @Override
    method activityResuming (line 74) | public void activityResuming(int activityId) throws android.os.RemoteE...
    method closingSystemDialogs (line 76) | public void closingSystemDialogs(java.lang.String reason) throws andro...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/mgr/PluginProviderClient.java
  class PluginProviderClient (line 40) | public class PluginProviderClient {
    method acquireContentProviderClient (line 45) | public static ContentProviderClient acquireContentProviderClient(Conte...
    method query (line 52) | public static Cursor query(Context c, Uri uri, String[] projection, St...
    method query (line 59) | @TargetApi(16)
    method getType (line 67) | public static String getType(Context c, Uri uri) {
    method insert (line 74) | public static Uri insert(Context c, Uri uri, ContentValues values) {
    method bulkInsert (line 81) | public static int bulkInsert(Context c, Uri uri, ContentValues[] value...
    method delete (line 88) | public static int delete(Context c, Uri uri, String selection, String[...
    method update (line 95) | public static int update(Context c, Uri uri, ContentValues values, Str...
    method openInputStream (line 102) | public static InputStream openInputStream(Context c, Uri uri) {
    method openOutputStream (line 109) | public static OutputStream openOutputStream(Context c, Uri uri) {
    method openOutputStream (line 116) | public static OutputStream openOutputStream(Context c, Uri uri, String...
    method openFileDescriptor (line 123) | public static ParcelFileDescriptor openFileDescriptor(Context c, Uri u...
    method openFileDescriptor (line 130) | @TargetApi(Build.VERSION_CODES.KITKAT)
    method registerContentObserver (line 138) | public static void registerContentObserver(Context c, Uri uri, boolean...
    method notifyChange (line 145) | public static void notifyChange(Context c, Uri uri, ContentObserver ob...
    method notifyChange (line 152) | public static void notifyChange(Context c, Uri uri, ContentObserver ob...
    method toCalledUri (line 159) | public static Uri toCalledUri(Context c, Uri uri) {
    method toCalledUri (line 166) | public static Uri toCalledUri(Context context, String plugin, Uri uri,...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/mgr/PluginServiceClient.java
  class PluginServiceClient (line 32) | public class PluginServiceClient {
    method startService (line 37) | public static ComponentName startService(Context context, Intent inten...
    method stopService (line 44) | public static boolean stopService(Context context, Intent intent) {
    method bindService (line 51) | public static boolean bindService(Context context, Intent intent, Serv...
    method unbindService (line 58) | public static boolean unbindService(Context context, ServiceConnection...
    method stopSelf (line 65) | public static void stopSelf(Service s) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/sp/PrefImpl.java
  class PrefImpl (line 32) | public final class PrefImpl extends IPref.Stub {
    method load (line 36) | private Bundle load(String category) {
    method get (line 47) | @Override
    method set (line 59) | @Override
    method getAll (line 68) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/api/AppVar.java
  class AppVar (line 24) | public class AppVar {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/api/IPC.java
  class IPC (line 34) | public final class IPC {
    method getUIProcessPID (line 36) | public static final int getUIProcessPID(Context c) {
    method getRunningProcessPID (line 41) | public static final int getRunningProcessPID(Context c, String process...
    method isRunningProcess (line 58) | public static final boolean isRunningProcess(String packageName) {
    method getCurrentProcessName (line 73) | public static final String getCurrentProcessName() {
    method isPersistentProcess (line 78) | public static final boolean isPersistentProcess() {
    method isUIProcess (line 86) | public static final boolean isUIProcess() {
    method sendLocalBroadcast2Process (line 98) | public static final void sendLocalBroadcast2Process(Context c, String ...
    method sendLocalBroadcast2Plugin (line 110) | public static final void sendLocalBroadcast2Plugin(Context c, String t...
    method sendLocalBroadcast2All (line 121) | public static final void sendLocalBroadcast2All(Context c, Intent inte...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/api/Intents.java
  class Intents (line 22) | public class Intents {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/api/Pref.java
  class Pref (line 30) | public final class Pref {
    method getSharedPreferences (line 32) | public static SharedPreferences getSharedPreferences(String name) {
    method getDefaultSharedPreferences (line 36) | public static SharedPreferences getDefaultSharedPreferences() {
    method getTempSharedPreferences (line 40) | public static SharedPreferences getTempSharedPreferences(String name) {
    method ipcGet (line 51) | public static String ipcGet(String key, String defValue) {
    method ipcSet (line 57) | public static void ipcSet(String key, String value) {
    method ipcGetAll (line 62) | public static Map<String, ?> ipcGetAll() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/api/Tasks.java
  class Tasks (line 28) | public final class Tasks {
    method post2UI (line 40) | public static final boolean post2UI(Runnable r) {
    method postDelayed2UI (line 49) | public static final boolean postDelayed2UI(Runnable r, long delayMilli...
    method cancelTask (line 57) | public static final void cancelTask(Runnable r) {
    method post2Thread (line 66) | public static final boolean post2Thread(Runnable r) {
    method postDelayed2Thread (line 76) | public static final boolean postDelayed2Thread(Runnable r, long delayM...
    method cancelThreadTask (line 85) | public static final void cancelThreadTask(Runnable r) {
    method init (line 93) | public static final void init() {
    method init (line 97) | public static final void init(Handler handler) {
    method initThread (line 101) | private static final void initThread() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/loader/a/DummyActivity.java
  class DummyActivity (line 32) | public class DummyActivity extends Activity {
    method onCreate (line 34) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/loader/p/DummyProvider.java
  class DummyProvider (line 27) | public class DummyProvider extends ContentProvider {
    method onCreate (line 29) | @Override
    method query (line 34) | @Override
    method getType (line 39) | @Override
    method insert (line 44) | @Override
    method delete (line 49) | @Override
    method update (line 54) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/loader/s/DummyService.java
  class DummyService (line 26) | public class DummyService extends Service {
    method onBind (line 28) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/parser/manifest/ManifestParser.java
  type ManifestParser (line 46) | public enum ManifestParser {
    method parse (line 74) | public void parse(PluginInfo pli, String manifestStr) {
    method putToMap (line 95) | private void putToMap(Map<String, Map<String, List<IntentFilter>>> inf...
    method parseComponent (line 107) | private void parseComponent(String plugin,
    method doFillFilters (line 120) | private void doFillFilters(ComponentBean b, Map<String, List<IntentFil...
    method doFillActionPlugins (line 136) | private void doFillActionPlugins(String plugin, ComponentBean componen...
    method getPluginsByActionWhenStartActivity (line 162) | public Set<String> getPluginsByActionWhenStartActivity(String action) {
    method getPluginsByActionWhenStartService (line 173) | public Set<String> getPluginsByActionWhenStartService(String action) {
    method getActivityFilterMap (line 177) | public Map<String, List<IntentFilter>> getActivityFilterMap(String plu...
    method getServiceFilterMap (line 181) | public Map<String, List<IntentFilter>> getServiceFilterMap(String plug...
    method getReceiverFilterMap (line 185) | public Map<String, List<IntentFilter>> getReceiverFilterMap(String plu...
    method parseManifest (line 195) | private XmlHandler parseManifest(String manifestStr) {
    method printFilters (line 228) | private void printFilters(Map<String, List<IntentFilter>> actFilterMap,
    method intentFilterStr (line 262) | private String intentFilterStr(List<IntentFilter> filters) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/parser/manifest/XmlHandler.java
  class XmlHandler (line 35) | class XmlHandler extends DefaultHandler {
    method getActivities (line 49) | public List<ComponentBean> getActivities() {
    method getServices (line 53) | public List<ComponentBean> getServices() {
    method getReceivers (line 57) | public List<ComponentBean> getReceivers() {
    method startElement (line 61) | @Override
    method endElement (line 137) | @Override
    method repairAttrName (line 200) | private String repairAttrName(String val) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/parser/manifest/bean/ComponentBean.java
  class ComponentBean (line 26) | public class ComponentBean {
    method toString (line 31) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/parser/manifest/bean/DataBean.java
  class DataBean (line 25) | public class DataBean {
    method toString (line 35) | @Override
    method getPatternMatcherType (line 44) | public int getPatternMatcherType() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/svcmanager/ParcelBinder.java
  class ParcelBinder (line 27) | class ParcelBinder implements Parcelable {
    method ParcelBinder (line 31) | private ParcelBinder(Parcel source) {
    method ParcelBinder (line 35) | public ParcelBinder(IBinder binder) {
    method getIbinder (line 39) | public IBinder getIbinder() {
    method describeContents (line 43) | @Override
    method writeToParcel (line 48) | @Override
    method createFromParcel (line 55) | @Override
    method newArray (line 60) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/svcmanager/PluginServiceManager.java
  class PluginServiceManager (line 39) | class PluginServiceManager {
    method getPluginService (line 57) | static IBinder getPluginService(String pluginName, String serviceName,...
    method onRefReleased (line 81) | static void onRefReleased(String pluginName, String serviceName, int p...
    method onRefProcessDied (line 105) | static void onRefProcessDied(String pluginName, String serviceName, in...
    method removePluginServiceRecord (line 125) | private static void removePluginServiceRecord(PluginServiceRecord pr) {
    method generateMapKey (line 148) | private static String generateMapKey(String pluginName, String service...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/svcmanager/PluginServiceRecord.java
  class PluginServiceRecord (line 39) | class PluginServiceRecord extends ReentrantLock {
    class ProcessRecord (line 51) | class ProcessRecord implements IBinder.DeathRecipient {
      method ProcessRecord (line 58) | private ProcessRecord(int pid, IBinder deathMonitor) {
      method incrementRef (line 71) | private int incrementRef() {
      method decrementRef (line 75) | private int decrementRef() {
      method binderDied (line 79) | @Override
    method PluginServiceRecord (line 94) | PluginServiceRecord(String pluginName, String serviceName) {
    method getService (line 99) | IBinder getService(int pid, IBinder deathMonitor) {
    method decrementProcessRef (line 126) | int decrementProcessRef(int pid) {
    method refProcessDied (line 154) | int refProcessDied(int pid) {
    method isServiceAlive (line 175) | boolean isServiceAlive() {
    method addNewRecordInternal (line 181) | private void addNewRecordInternal(int pid, IBinder deathMonitor) {
    method getProcessRecordInternal (line 197) | private ProcessRecord getProcessRecordInternal(int pid) {
    method getTotalRefCountInternal (line 206) | private int getTotalRefCountInternal() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/svcmanager/PluginServiceReferenceManager.java
  class PluginServiceReferenceManager (line 35) | class PluginServiceReferenceManager {
    class ServicePhantomRef (line 41) | private static class ServicePhantomRef extends PhantomReference<IBinde...
      method ServicePhantomRef (line 47) | public ServicePhantomRef(String pluginName, String serviceName, IBin...
    method onPluginServiceObtained (line 65) | static synchronized void onPluginServiceObtained(Context context, Stri...
    method startMonitoring (line 80) | private static synchronized void startMonitoring() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/svcmanager/QihooServiceManager.java
  class QihooServiceManager (line 43) | public final class QihooServiceManager {
    method getService (line 69) | public static IBinder getService(Context context, String serviceName) {
    method addService (line 130) | public static boolean addService(Context context, String serviceName, ...
    method addService (line 153) | public static boolean addService(Context context, String serviceName, ...
    method removeService (line 176) | public static boolean removeService(Context context, String serviceNam...
    method getPluginService (line 201) | public static IBinder getPluginService(Context context, String pluginN...
    method getServerChannel (line 231) | static IServiceChannel getServerChannel(Context context) {
    method getServiceChannelUri (line 283) | static Uri getServiceChannelUri() {
    method onPluginServiceReleased (line 291) | static void onPluginServiceReleased(Context context, String pluginName...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/svcmanager/ServiceChannelCursor.java
  class ServiceChannelCursor (line 31) | class ServiceChannelCursor extends MatrixCursor {
    method makeCursor (line 39) | static final ServiceChannelCursor makeCursor(IBinder binder) {
    method getBinder (line 43) | static final IBinder getBinder(Cursor cursor) {
    method ServiceChannelCursor (line 52) | public ServiceChannelCursor(String[] columnNames, IBinder binder) {
    method getExtras (line 58) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/svcmanager/ServiceChannelImpl.java
  class ServiceChannelImpl (line 38) | class ServiceChannelImpl {
    method getService (line 55) | @Override
    method fetchFromDelayedMap (line 88) | private IBinder fetchFromDelayedMap(String serviceName) {
    method addService (line 115) | @Override
    method addServiceDelayed (line 120) | @Override
    method removeService (line 125) | @Override
    method getPluginService (line 130) | @Override
    method onPluginServiceRefReleased (line 135) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/svcmanager/ServiceProvider.java
  class ServiceProvider (line 34) | public class ServiceProvider extends ContentProvider {
    method onCreate (line 43) | @Override
    method query (line 52) | @Override
    method getType (line 61) | @Override
    method insert (line 66) | @Override
    method delete (line 71) | @Override
    method update (line 76) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/svcmanager/ServiceWrapper.java
  class ServiceWrapper (line 37) | class ServiceWrapper implements IBinder, IBinder.DeathRecipient {
    method factory (line 49) | public static IBinder factory(Context context, String name, IBinder bi...
    method ServiceWrapper (line 71) | private ServiceWrapper(Context context, String name, IBinder binder) {
    method getRemoteBinder (line 84) | private IBinder getRemoteBinder() throws RemoteException {
    method getInterfaceDescriptor (line 105) | @Override
    method pingBinder (line 110) | @Override
    method isBinderAlive (line 122) | @Override
    method queryLocalInterface (line 134) | @Override
    method dump (line 146) | @Override
    method transact (line 151) | @Override
    method linkToDeath (line 156) | @Override
    method unlinkToDeath (line 168) | @Override
    method binderDied (line 177) | @Override
    method dumpAsync (line 186) | public void dumpAsync(FileDescriptor fd, String[] args) throws RemoteE...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ContextInjector.java
  type ContextInjector (line 28) | public interface ContextInjector {
    method startActivityBefore (line 37) | void startActivityBefore(Intent intent);
    method startActivityAfter (line 46) | void startActivityAfter(Intent intent);
    method startActivityBefore (line 55) | void startActivityBefore(Intent intent, Bundle options);
    method startActivityAfter (line 64) | void startActivityAfter(Intent intent, Bundle options);
    method startServiceBefore (line 73) | void startServiceBefore(Intent service);
    method startServiceAfter (line 82) | void startServiceAfter(Intent service);

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/DefaultRePluginCallbacks.java
  class DefaultRePluginCallbacks (line 11) | public class DefaultRePluginCallbacks extends RePluginCallbacks {
    method DefaultRePluginCallbacks (line 17) | public DefaultRePluginCallbacks(Context context) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/DefaultRePluginEventCallbacks.java
  class DefaultRePluginEventCallbacks (line 11) | public class DefaultRePluginEventCallbacks extends RePluginEventCallbacks {
    method DefaultRePluginEventCallbacks (line 17) | public DefaultRePluginEventCallbacks(Context context) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/IHostBinderFetcher.java
  type IHostBinderFetcher (line 30) | public interface IHostBinderFetcher {
    method query (line 38) | IBinder query(String module);

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/PluginDexClassLoader.java
  class PluginDexClassLoader (line 49) | public class PluginDexClassLoader extends DexClassLoader {
    method PluginDexClassLoader (line 73) | public PluginDexClassLoader(PluginInfo pi, String dexPath, String opti...
    method initMethods (line 91) | private static void initMethods(ClassLoader cl) {
    method loadClass (line 101) | @Override
    method loadClassFromHost (line 155) | private Class<?> loadClassFromHost(String className, boolean resolve) ...
    method installMultiDexesBeforeLollipop (line 181) | private void installMultiDexesBeforeLollipop(PluginInfo pi, String dex...
    method combineArray (line 247) | private Object combineArray(List<Object[]> allElements) {
    method getExtraDexFiles (line 281) | private List<File> getExtraDexFiles(PluginInfo pi, String dexPath) {
    method traverseExtraDex (line 310) | private static List<File> traverseExtraDex(PluginInfo pi, ZipFile zipF...
    method extractFile (line 355) | private static void extractFile(ZipFile zipFile, ZipEntry ze, File out...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/PluginDexClassLoaderPatch.java
  class PluginDexClassLoaderPatch (line 8) | public class PluginDexClassLoaderPatch {
    method need2LoadFromHost (line 27) | public static boolean need2LoadFromHost(String className) {
    method isApacheHttpLegacy (line 42) | private static boolean isApacheHttpLegacy(String className) {
    method isOkHttp3 (line 56) | private static boolean isOkHttp3(String className) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePlugin.java
  class RePlugin (line 81) | public class RePlugin {
    method install (line 119) | public static PluginInfo install(String path) {
    method uninstall (line 162) | public static boolean uninstall(String pluginName) {
    method preload (line 178) | public static boolean preload(String pluginName) {
    method preload (line 204) | public static boolean preload(PluginInfo pi) {
    method enableDebugger (line 221) | public static boolean enableDebugger(Context context, boolean enable) {
    method startActivity (line 240) | public static boolean startActivity(Context context, Intent intent) {
    method startActivity (line 262) | public static boolean startActivity(Context context, Intent intent, St...
    method startActivityForResult (line 276) | public static boolean startActivityForResult(Activity activity, Intent...
    method startActivityForResult (line 290) | public static boolean startActivityForResult(Activity activity, Intent...
    method createIntent (line 312) | public static Intent createIntent(String pluginName, String cls) {
    method createComponentName (line 326) | public static ComponentName createComponentName(String pluginName, Str...
    method addCertSignature (line 337) | public static void addCertSignature(String sign) {
    method isForDev (line 353) | public static boolean isForDev() {
    method getVersion (line 363) | public static String getVersion() {
    method fetchComponentList (line 377) | public static ComponentList fetchComponentList(String pluginName) {
    method fetchPackageInfo (line 391) | public static PackageInfo fetchPackageInfo(String pluginName) {
    method fetchResources (line 405) | public static Resources fetchResources(String pluginName) {
    method fetchClassLoader (line 418) | public static ClassLoader fetchClassLoader(String pluginName) {
    method fetchContext (line 431) | public static Context fetchContext(String pluginName) {
    method fetchBinder (line 451) | public static IBinder fetchBinder(String pluginName, String module, St...
    method fetchBinder (line 470) | public static IBinder fetchBinder(String pluginName, String module) {
    method fetchPluginNameByClassLoader (line 483) | public static String fetchPluginNameByClassLoader(ClassLoader cl) {
    method fetchResourceIdByName (line 500) | public static int fetchResourceIdByName(String pluginName, String resT...
    method fetchViewByLayoutName (line 537) | public static <T extends View> T fetchViewByLayoutName(String pluginNa...
    method getPluginInfoList (line 569) | public static List<PluginInfo> getPluginInfoList() {
    method getPluginInfo (line 580) | public static PluginInfo getPluginInfo(String name) {
    method getPluginVersion (line 591) | public static int getPluginVersion(String name) {
    method isPluginInstalled (line 608) | public static boolean isPluginInstalled(String pluginName) {
    method isPluginUsed (line 621) | public static boolean isPluginUsed(String pluginName) {
    method isPluginDexExtracted (line 633) | public static boolean isPluginDexExtracted(String pluginName) {
    method isPluginRunning (line 645) | public static boolean isPluginRunning(String pluginName) {
    method isPluginRunningInProcess (line 665) | public static boolean isPluginRunningInProcess(String pluginName, Stri...
    method getRunningPlugins (line 684) | public static PluginRunningList getRunningPlugins() {
    method getRunningProcessesByPlugin (line 697) | public static String[] getRunningProcessesByPlugin(String pluginName) {
    method isCurrentPersistentProcess (line 707) | public static boolean isCurrentPersistentProcess() {
    method getConfig (line 719) | public static RePluginConfig getConfig() {
    method registerInstalledReceiver (line 735) | public static void registerInstalledReceiver(Context context, Broadcas...
    method registerHostBinder (line 747) | public static void registerHostBinder(IHostBinderFetcher hbf) {
    method registerGlobalBinder (line 763) | public static boolean registerGlobalBinder(String name, IBinder binder) {
    method registerGlobalBinderDelayed (line 782) | public static boolean registerGlobalBinderDelayed(String name, IBinder...
    method unregisterGlobalBinder (line 795) | public static boolean unregisterGlobalBinder(String name) {
    method getGlobalBinder (line 812) | public static IBinder getGlobalBinder(String name) {
    method registerHookingClass (line 851) | public static void registerHookingClass(String source, ComponentName t...
    method isHookingClass (line 861) | public static boolean isHookingClass(ComponentName component) {
    method unregisterHookingClass (line 873) | public static void unregisterHookingClass(String source) {
    method convertToPnFile (line 891) | public static String convertToPnFile(String path) {
    method dump (line 906) | public static void dump(FileDescriptor fd, PrintWriter writer, String[...
    class App (line 916) | public static class App {
      method attachBaseContext (line 929) | public static void attachBaseContext(Application app) {
      method attachBaseContext (line 943) | public static void attachBaseContext(Application app, RePluginCallba...
      method attachBaseContext (line 956) | public static void attachBaseContext(Application app, RePluginConfig...
      method onCreate (line 999) | public static void onCreate() {
      method onLowMemory (line 1032) | public static void onLowMemory() {
      method onTrimMemory (line 1050) | public static void onTrimMemory(int level) {
      method onConfigurationChanged (line 1068) | public static void onConfigurationChanged(Configuration newConfig) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePluginApplication.java
  class RePluginApplication (line 30) | public class RePluginApplication extends Application {
    method createConfig (line 38) | protected RePluginConfig createConfig() {
    method createCallbacks (line 49) | protected RePluginCallbacks createCallbacks() {
    method attachBaseContext (line 53) | @Override
    method onCreate (line 70) | @Override
    method onLowMemory (line 77) | @Override
    method onTrimMemory (line 85) | @Override
    method onConfigurationChanged (line 93) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePluginCallbacks.java
  class RePluginCallbacks (line 36) | public class RePluginCallbacks {
    method RePluginCallbacks (line 40) | public RePluginCallbacks(Context context) {
    method createClassLoader (line 54) | public RePluginClassLoader createClassLoader(ClassLoader parent, Class...
    method createPluginClassLoader (line 75) | public PluginDexClassLoader createPluginClassLoader(PluginInfo pi, Str...
    method onPluginNotExistsForActivity (line 90) | public boolean onPluginNotExistsForActivity(Context context, String pl...
    method onLoadLargePluginForActivity (line 105) | public boolean onLoadLargePluginForActivity(Context context, String pl...
    method getSharedPreferences (line 123) | public SharedPreferences getSharedPreferences(Context context, String ...
    method openLatestFile (line 141) | public InputStream openLatestFile(Context context, String filename) {
    method createContextInjector (line 154) | public ContextInjector createContextInjector() {
    method isPluginBlocked (line 166) | public boolean isPluginBlocked(PluginInfo pluginInfo) {
    method initPnPluginOverride (line 177) | public void initPnPluginOverride() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePluginClassLoader.java
  class RePluginClassLoader (line 48) | public class RePluginClassLoader extends PathClassLoader {
    method RePluginClassLoader (line 67) | public RePluginClassLoader(ClassLoader parent, ClassLoader orig) {
    method getOrig (line 82) | public ClassLoader getOrig(){
    method initMethods (line 86) | private void initMethods(ClassLoader cl) {
    method copyFromOriginal (line 98) | private void copyFromOriginal(ClassLoader orig) {
    method copyFieldValue (line 119) | private void copyFieldValue(String field, ClassLoader orig) {
    method loadClass (line 147) | @Override
    method findClass (line 170) | @Override
    method findResource (line 179) | @Override
    method findResources (line 193) | @SuppressWarnings("unchecked")
    method findLibrary (line 208) | @Override
    method getPackage (line 222) | @Override
    method toString (line 256) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePluginConfig.java
  class RePluginConfig (line 37) | public final class RePluginConfig {
    method getCallbacks (line 61) | public RePluginCallbacks getCallbacks() {
    method setCallbacks (line 71) | public RePluginConfig setCallbacks(RePluginCallbacks callbacks) {
    method getEventCallbacks (line 84) | public RePluginEventCallbacks getEventCallbacks() {
    method setEventCallbacks (line 94) | public RePluginConfig setEventCallbacks(RePluginEventCallbacks eventCa...
    method getPnInstallDir (line 107) | public File getPnInstallDir() {
    method setPnInstallDir (line 118) | public RePluginConfig setPnInstallDir(File pnInstallDir) {
    method getVerifySign (line 131) | public boolean getVerifySign() {
    method setVerifySign (line 143) | public RePluginConfig setVerifySign(boolean verifySign) {
    method isUseHostClassIfNotFound (line 158) | public boolean isUseHostClassIfNotFound() {
    method setUseHostClassIfNotFound (line 171) | public RePluginConfig setUseHostClassIfNotFound(boolean useHostClassIf...
    method isMoveFileWhenInstalling (line 186) | public boolean isMoveFileWhenInstalling() {
    method setMoveFileWhenInstalling (line 199) | public RePluginConfig setMoveFileWhenInstalling(boolean moveFileWhenIn...
    method getHostBuildID (line 213) | public String getHostBuildID() {
    method setHostBuild (line 225) | public RePluginConfig setHostBuild(String buildID) {
    method getHostVersionName (line 238) | public String getHostVersionName() {
    method setHostVersionName (line 249) | public RePluginConfig setHostVersionName(String versionName) {
    method getHostVersionBuild (line 262) | public String getHostVersionBuild() {
    method isPrintDetailLog (line 272) | public boolean isPrintDetailLog() {
    method setPrintDetailLog (line 284) | public RePluginConfig setPrintDetailLog(boolean printDetailLog) {
    method getDefaultFrameworkVersion (line 295) | public int getDefaultFrameworkVersion() {
    method setDefaultFrameworkVersion (line 306) | public RePluginConfig setDefaultFrameworkVersion(int defaultFrameworkV...
    method initDefaults (line 315) | void initDefaults(Context context) {
    method checkAllowModify (line 330) | private boolean checkAllowModify() {
    method isOptimizeArtLoadDex (line 347) | public boolean isOptimizeArtLoadDex() {
    method setOptimizeArtLoadDex (line 358) | public RePluginConfig setOptimizeArtLoadDex(boolean optimizeArtLoadDex) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePluginConstants.java
  class RePluginConstants (line 27) | public class RePluginConstants {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePluginEventCallbacks.java
  class RePluginEventCallbacks (line 32) | public class RePluginEventCallbacks {
    method RePluginEventCallbacks (line 36) | public RePluginEventCallbacks(Context context) {
    method onInstallPluginFailed (line 46) | public void onInstallPluginFailed(String path, InstallResult code) {
    method onInstallPluginSucceed (line 55) | public void onInstallPluginSucceed(PluginInfo info) {
    method onStartActivityCompleted (line 66) | public void onStartActivityCompleted(String plugin, String activity, b...
    method onPrepareAllocPitActivity (line 75) | public void onPrepareAllocPitActivity(Intent intent) {
    method onPrepareStartPitActivity (line 86) | public void onPrepareStartPitActivity(Context context, Intent intent, ...
    method onActivityDestroyed (line 95) | public void onActivityDestroyed(Activity activity) {
    method onBinderReleased (line 102) | public void onBinderReleased() {
    type InstallResult (line 109) | public enum InstallResult {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePluginInternal.java
  class RePluginInternal (line 31) | public class RePluginInternal {
    method init (line 38) | static void init(Application app) {
    method getAppContext (line 45) | public static Context getAppContext() {
    method getAppClassLoader (line 52) | public static ClassLoader getAppClassLoader() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/base/AMSUtils.java
  class AMSUtils (line 30) | public class AMSUtils {
    method getRunningAppProcessesNoThrows (line 37) | public static List<ActivityManager.RunningAppProcessInfo> getRunningAp...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/base/IPC.java
  class IPC (line 39) | public class IPC {
    method init (line 54) | public static void init(Context context) {
    method getCurrentProcessName (line 82) | public static String getCurrentProcessName() {
    method getCurrentProcessId (line 91) | public static int getCurrentProcessId() {
    method getPersistentProcessName (line 100) | public static String getPersistentProcessName() {
    method getPluginHostProcessName (line 110) | public static String getPluginHostProcessName() {
    method isPluginHostProcess (line 120) | public static boolean isPluginHostProcess() {
    method isUIProcess (line 130) | public static boolean isUIProcess() {
    method isPersistentProcess (line 139) | public static boolean isPersistentProcess() {
    method isPersistentEnable (line 149) | public static boolean isPersistentEnable() {
    method getPidByProcessName (line 159) | public static int getPidByProcessName(String processName) {
    method getProcessNameByPid (line 186) | public static String getProcessNameByPid(int pid) {
    method getPackageName (line 210) | public static String getPackageName() {
    method sendLocalBroadcast2Plugin (line 222) | public static boolean sendLocalBroadcast2Plugin(Context c, String targ...
    method sendLocalBroadcast2Process (line 250) | public static boolean sendLocalBroadcast2Process(Context c, String tar...
    method sendLocalBroadcast2All (line 277) | public static boolean sendLocalBroadcast2All(Context c, Intent intent) {
    method sendLocalBroadcast2PluginSync (line 304) | public static boolean sendLocalBroadcast2PluginSync(Context c, String ...
    method sendLocalBroadcast2ProcessSync (line 334) | public static boolean sendLocalBroadcast2ProcessSync(Context c, String...
    method sendLocalBroadcast2AllSync (line 363) | public static boolean sendLocalBroadcast2AllSync(Context c, Intent int...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/base/LocalBroadcastHelper.java
  class LocalBroadcastHelper (line 33) | public class LocalBroadcastHelper {
    method sendBroadcastSyncUi (line 43) | public static void sendBroadcastSyncUi(final Context context, final In...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/base/ThreadUtils.java
  class ThreadUtils (line 33) | public class ThreadUtils {
    method syncToMainThread (line 47) | public static <T> T syncToMainThread(final Callable<T> callable, int w...
    method syncToMainThreadByOthers (line 58) | private static <T> T syncToMainThreadByOthers(final Callable<T> callab...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/ComponentList.java
  class ComponentList (line 60) | public class ComponentList {
    method ComponentList (line 96) | public ComponentList(PackageInfo pi, String path, PluginInfo pli) {
    method getManifestFromApk (line 184) | private static String getManifestFromApk(String apkFile) {
    method getService (line 226) | public ServiceInfo getService(String className) {
    method getServices (line 233) | public ServiceInfo[] getServices() {
    method getActivity (line 240) | public ActivityInfo getActivity(String className) {
    method getActivities (line 247) | public ActivityInfo[] getActivities() {
    method getReveiver (line 254) | public ActivityInfo getReveiver(String className) {
    method getReceivers (line 261) | public ActivityInfo[] getReceivers() {
    method getServiceAndPluginByIntent (line 275) | public Pair<ServiceInfo, String> getServiceAndPluginByIntent(Context c...
    method getProvider (line 299) | public ProviderInfo getProvider(String className) {
    method getProviderByAuthority (line 306) | public ProviderInfo getProviderByAuthority(String authority) {
    method getProviders (line 313) | public ProviderInfo[] getProviders() {
    method getApplication (line 320) | public ApplicationInfo getApplication() {
    method getActivityMap (line 327) | public HashMap<String, ActivityInfo> getActivityMap() {
    method getServiceMap (line 334) | public HashMap<String, ServiceInfo> getServiceMap() {
    method getReceiverMap (line 341) | public HashMap<String, ActivityInfo> getReceiverMap() {
    method getProviderMap (line 348) | public HashMap<String, ProviderInfo> getProviderMap() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/activity/ActivityInjector.java
  class ActivityInjector (line 46) | public class ActivityInjector {
    method inject (line 58) | public static boolean inject(Activity activity, String plugin, String ...
    method inject (line 73) | private static boolean inject(Activity activity, ActivityInfo ai, int ...
    method injectTaskDescription (line 87) | private static void injectTaskDescription(Activity activity, ActivityI...
    method getLabel (line 130) | private static String getLabel(Activity activity, ActivityInfo ai) {
    method getLabelById (line 156) | private static String getLabelById(Resources res, int id) {
    method getIcon (line 171) | private static Bitmap getIcon(Activity activity, ActivityInfo ai) {
    method getIconById (line 202) | private static Drawable getIconById(Resources res, int id) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/activity/DynamicClassProxyActivity.java
  class DynamicClassProxyActivity (line 36) | public class DynamicClassProxyActivity extends Activity {
    method onCreate (line 38) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/app/PluginApplicationClient.java
  class PluginApplicationClient (line 47) | public class PluginApplicationClient {
    method getOrCreate (line 72) | public static PluginApplicationClient getOrCreate(String pn, ClassLoad...
    method notifyOnLowMemory (line 131) | public static void notifyOnLowMemory() {
    method notifyOnTrimMemory (line 141) | public static void notifyOnTrimMemory(int level) {
    method notifyOnConfigurationChanged (line 151) | public static void notifyOnConfigurationChanged(Configuration newConfi...
    method getRunning (line 161) | public static PluginApplicationClient getRunning(String pn) {
    method initMethods (line 169) | private static void initMethods() throws NoSuchMethodException {
    method PluginApplicationClient (line 185) | private PluginApplicationClient(ClassLoader plgCL, ComponentList cl, P...
    method callAttachBaseContext (line 206) | public void callAttachBaseContext(Context c) {
    method callOnCreate (line 220) | public void callOnCreate() {
    method callOnLowMemory (line 227) | public void callOnLowMemory() {
    method callOnTrimMemory (line 234) | public void callOnTrimMemory(int level) {
    method callOnConfigurationChanged (line 245) | public void callOnConfigurationChanged(Configuration newConfig) {
    method getObj (line 252) | public Application getObj() {
    method initCustom (line 256) | private boolean initCustom() {
    method initCustomConstructor (line 272) | private void initCustomConstructor() throws ClassNotFoundException, No...
    method initCustomObject (line 278) | private void initCustomObject() throws IllegalAccessException, Invocat...
    method isValid (line 285) | private boolean isValid() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/dummy/DummyActivity.java
  class DummyActivity (line 36) | public class DummyActivity extends Activity {
    method onCreate (line 38) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/dummy/DummyProvider.java
  class DummyProvider (line 32) | public class DummyProvider extends ContentProvider {
    method onCreate (line 34) | @Override
    method query (line 39) | @Override
    method getType (line 44) | @Override
    method insert (line 49) | @Override
    method delete (line 54) | @Override
    method update (line 59) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/dummy/DummyReceiver.java
  class DummyReceiver (line 36) | public class DummyReceiver extends BroadcastReceiver {
    method onReceive (line 38) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/dummy/DummyService.java
  class DummyService (line 31) | public class DummyService extends Service {
    method onCreate (line 33) | @Override
    method onBind (line 39) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/dummy/ForwardActivity.java
  class ForwardActivity (line 35) | public class ForwardActivity extends Activity {
    method onCreate (line 37) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/process/PluginProcessHost.java
  class PluginProcessHost (line 32) | public class PluginProcessHost {
    method processTail (line 87) | public static String processTail(String processName) {
    method isCustomPluginProcess (line 100) | public static boolean isCustomPluginProcess(int index) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/process/ProcessPitProviderBase.java
  class ProcessPitProviderBase (line 36) | public class ProcessPitProviderBase extends ContentProvider {
    method buildUri (line 42) | public static final Uri buildUri(int index) {
    method dump (line 62) | @SuppressLint("Override")
    method onCreate (line 71) | @Override
    method getType (line 76) | @Override
    method query (line 81) | @Override
    method update (line 86) | @Override
    method insert (line 91) | @Override
    method delete (line 96) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/process/ProcessPitProviderLoader0.java
  class ProcessPitProviderLoader0 (line 22) | public class ProcessPitProviderLoader0 extends ProcessPitProviderBase {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/process/ProcessPitProviderLoader1.java
  class ProcessPitProviderLoader1 (line 22) | public class ProcessPitProviderLoader1 extends ProcessPitProviderBase {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/process/ProcessPitProviderP0.java
  class ProcessPitProviderP0 (line 22) | public class ProcessPitProviderP0 extends ProcessPitProviderBase {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/process/ProcessPitProviderP1.java
  class ProcessPitProviderP1 (line 22) | public class ProcessPitProviderP1 extends ProcessPitProviderBase {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/process/ProcessPitProviderP2.java
  class ProcessPitProviderP2 (line 22) | public class ProcessPitProviderP2 extends ProcessPitProviderBase {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/process/ProcessPitProviderPersist.java
  class ProcessPitProviderPersist (line 30) | public class ProcessPitProviderPersist extends ContentProvider {
    method onCreate (line 40) | @Override
    method getType (line 45) | @Override
    method query (line 50) | @Override
    method update (line 56) | @Override
    method insert (line 61) | @Override
    method delete (line 66) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/process/ProcessPitProviderUI.java
  class ProcessPitProviderUI (line 22) | public class ProcessPitProviderUI extends ProcessPitProviderBase {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/provider/PluginPitProviderBase.java
  class PluginPitProviderBase (line 33) | public abstract class PluginPitProviderBase extends ContentProvider {
    method PluginPitProviderBase (line 39) | protected PluginPitProviderBase(String authority) {
    method onCreate (line 43) | @Override
    method query (line 49) | @Override
    method query (line 62) | @Override
    method getType (line 78) | @Override
    method insert (line 91) | @Override
    method bulkInsert (line 104) | @Override
    method delete (line 117) | @Override
    method update (line 130) | @Override
    method onLowMemory (line 143) | @Override
    method onTrimMemory (line 151) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/provider/PluginPitProviderP0.java
  class PluginPitProviderP0 (line 24) | public class PluginPitProviderP0 extends PluginPitProviderBase {
    method PluginPitProviderP0 (line 27) | public PluginPitProviderP0() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/provider/PluginPitProviderP1.java
  class PluginPitProviderP1 (line 24) | public class PluginPitProviderP1 extends PluginPitProviderBase {
    method PluginPitProviderP1 (line 27) | public PluginPitProviderP1() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/provider/PluginPitProviderP2.java
  class PluginPitProviderP2 (line 24) | public class PluginPitProviderP2 extends PluginPitProviderBase {
    method PluginPitProviderP2 (line 27) | public PluginPitProviderP2() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/provider/PluginPitProviderPersist.java
  class PluginPitProviderPersist (line 22) | public class PluginPitProviderPersist extends PluginPitProviderBase {
    method PluginPitProviderPersist (line 25) | public PluginPitProviderPersist() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/provider/PluginPitProviderUI.java
  class PluginPitProviderUI (line 22) | public class PluginPitProviderUI extends PluginPitProviderBase {
    method PluginPitProviderUI (line 25) | public PluginPitProviderUI() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/provider/PluginProviderClient.java
  class PluginProviderClient (line 55) | public class PluginProviderClient {
    method acquireContentProviderClient (line 63) | public static ContentProviderClient acquireContentProviderClient(Conte...
    method query (line 71) | public static Cursor query(Context c, Uri uri, String[] projection, St...
    method query (line 80) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    method getType (line 90) | public static String getType(Context c, Uri uri) {
    method insert (line 99) | public static Uri insert(Context c, Uri uri, ContentValues values) {
    method bulkInsert (line 108) | public static int bulkInsert(Context c, Uri uri, ContentValues[] value...
    method delete (line 117) | public static int delete(Context c, Uri uri, String selection, String[...
    method update (line 126) | public static int update(Context c, Uri uri, ContentValues values, Str...
    method openInputStream (line 136) | public static InputStream openInputStream(Context c, Uri uri) {
    method openOutputStream (line 153) | public static OutputStream openOutputStream(Context c, Uri uri) {
    method openOutputStream (line 170) | public static OutputStream openOutputStream(Context c, Uri uri, String...
    method openFileDescriptor (line 187) | public static ParcelFileDescriptor openFileDescriptor(Context c, Uri u...
    method openFileDescriptor (line 204) | @TargetApi(Build.VERSION_CODES.KITKAT)
    method registerContentObserver (line 222) | public static void registerContentObserver(Context c, Uri uri, boolean...
    method notifyChange (line 238) | public static void notifyChange(Context c, Uri uri, ContentObserver ob...
    method notifyChange (line 248) | public static void notifyChange(Context c, Uri uri, ContentObserver ob...
    method toCalledUri (line 262) | public static Uri toCalledUri(Context c, Uri uri) {
    method toCalledUri (line 281) | public static Uri toCalledUri(Context context, String plugin, Uri uri,...
    method fetchPluginByContext (line 320) | private static String fetchPluginByContext(Context c, Uri uri) {
    method getProcessByAuthority (line 345) | private static int getProcessByAuthority(String pn, String authority) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/provider/PluginProviderClient2.java
  class PluginProviderClient2 (line 38) | public class PluginProviderClient2 {
    method query (line 47) | public static Cursor query(Context c, Uri uri, String[] projection, St...
    method query (line 70) | @TargetApi(16)
    method update (line 96) | public static int update(Context c, Uri uri, ContentValues values, Str...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/provider/PluginProviderHelper.java
  class PluginProviderHelper (line 40) | public class PluginProviderHelper {
    method PluginProviderHelper (line 46) | PluginProviderHelper(String authority) {
    method toPluginUri (line 55) | public PluginUri toPluginUri(Uri uri) {
    method getProvider (line 99) | public ContentProvider getProvider(PluginUri pu) {
    method removeHostAuthorityAndInfo (line 133) | private String removeHostAuthorityAndInfo(String uri, String plugin) {
    method installProvider (line 139) | private ContentProvider installProvider(PluginUri pu, String auth) {
    class PluginUri (line 197) | static class PluginUri {
      method toString (line 201) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/receiver/PluginReceiverHelper.java
  class PluginReceiverHelper (line 36) | public class PluginReceiverHelper {
    method onPluginReceiverReceived (line 41) | public static void onPluginReceiverReceived(final String plugin,

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/receiver/PluginReceiverProxy.java
  class PluginReceiverProxy (line 47) | public class PluginReceiverProxy extends BroadcastReceiver {
    method onReceive (line 58) | @Override
    method loadClassSafety (line 110) | public static Class loadClassSafety(ClassLoader classLoader, String cl...
    method getProcessOfReceiver (line 121) | private int getProcessOfReceiver(String plugin, String receiver) {
    method setActionPluginMap (line 145) | public void setActionPluginMap(HashMap<String, HashMap<String, List<St...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/PluginServiceClient.java
  class PluginServiceClient (line 50) | public class PluginServiceClient {
    method startService (line 69) | public static ComponentName startService(Context context, Intent inten...
    method startService (line 74) | public static ComponentName startService(Context context, Intent inten...
    method stopService (line 123) | public static boolean stopService(Context context, Intent intent) {
    method stopService (line 128) | public static boolean stopService(Context context, Intent intent, bool...
    method bindService (line 178) | public static boolean bindService(Context context, Intent intent, Serv...
    method bindService (line 183) | public static boolean bindService(Context context, Intent intent, Serv...
    method unbindService (line 233) | public static boolean unbindService(Context context, ServiceConnection...
    method unbindService (line 238) | public static boolean unbindService(Context context, ServiceConnection...
    method stopSelf (line 283) | public static void stopSelf(Service s) {
    method getProcessByComponentName (line 294) | private static int getProcessByComponentName(ComponentName cn) {
    method getServiceComponentFromIntent (line 326) | private static ComponentName getServiceComponentFromIntent(Context con...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/PluginServiceDispatcherManager.java
  class PluginServiceDispatcherManager (line 33) | public class PluginServiceDispatcherManager {
    method get (line 41) | public ServiceDispatcher get(ServiceConnection c, Context context, Han...
    method forget (line 62) | public ServiceDispatcher forget(Context context, ServiceConnection c) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/PluginServiceServerFetcher.java
  class PluginServiceServerFetcher (line 41) | public class PluginServiceServerFetcher {
    method fetchByProcess (line 45) | public IPluginServiceServer fetchByProcess(int process) {
    class PSSDeathMonitor (line 91) | private final class PSSDeathMonitor implements IBinder.DeathRecipient {
      method PSSDeathMonitor (line 92) | PSSDeathMonitor(int process, IBinder service) {
      method binderDied (line 97) | public void binderDied() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/ServiceDispatcher.java
  class ServiceDispatcher (line 42) | final class ServiceDispatcher {
    class ConnectionInfo (line 59) | private static class ConnectionInfo {
    class InnerConnection (line 64) | private static class InnerConnection extends IServiceConnection.Stub {
      method InnerConnection (line 67) | InnerConnection(ServiceDispatcher sd) {
      method connected (line 71) | public void connected(ComponentName name, IBinder service) throws Re...
    method ServiceDispatcher (line 81) | ServiceDispatcher(ServiceConnection conn,
    method validate (line 93) | void validate(Context context, Handler activityThread) {
    method doForget (line 108) | void doForget() {
    method getLocation (line 119) | ServiceConnectionLeaked getLocation() {
    method getServiceConnection (line 123) | ServiceConnection getServiceConnection() {
    method getIServiceConnection (line 127) | IServiceConnection getIServiceConnection() {
    method getFlags (line 131) | int getFlags() {
    method setUnbindLocation (line 135) | void setUnbindLocation(RuntimeException ex) {
    method getUnbindLocation (line 139) | RuntimeException getUnbindLocation() {
    method getProcess (line 143) | int getProcess() {
    method connected (line 147) | public void connected(ComponentName name, IBinder service) {
    method death (line 155) | public void death(ComponentName name, IBinder service) {
    method doConnected (line 176) | public void doConnected(ComponentName name, IBinder service) {
    method doDeath (line 228) | public void doDeath(ComponentName name, IBinder service) {
    class RunConnection (line 232) | private final class RunConnection implements Runnable {
      method RunConnection (line 233) | RunConnection(ComponentName name, IBinder service, int command) {
      method run (line 239) | public void run() {
    class DeathMonitor (line 252) | private final class DeathMonitor implements IBinder.DeathRecipient {
      method DeathMonitor (line 253) | DeathMonitor(ComponentName name, IBinder service) {
      method binderDied (line 258) | public void binderDied() {
  class ServiceConnectionLeaked (line 267) | final class ServiceConnectionLeaked extends AndroidRuntimeException {
    method ServiceConnectionLeaked (line 268) | public ServiceConnectionLeaked(String msg) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/server/ConnectionBindRecord.java
  class ConnectionBindRecord (line 29) | class ConnectionBindRecord {
    method ConnectionBindRecord (line 38) | ConnectionBindRecord(ProcessBindRecord abr, IServiceConnection sc, int...
    method toString (line 44) | public String toString() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/server/IntentBindRecord.java
  class IntentBindRecord (line 32) | class IntentBindRecord {
    method IntentBindRecord (line 56) | IntentBindRecord(ServiceRecord service, Intent.FilterComparison intent) {
    method collectFlags (line 61) | int collectFlags() {
    method toString (line 72) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/server/PluginPitService.java
  class PluginPitService (line 38) | public class PluginPitService extends Service {
    method PluginPitService (line 42) | public PluginPitService() {
    method onBind (line 46) | @Override
    method get (line 51) | public static PluginPitService get() {
    method makeComponentName (line 61) | public static ComponentName makeComponentName(Context c, int process) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/server/PluginServiceServer.java
  class PluginServiceServer (line 67) | public class PluginServiceServer {
    method handleMessage (line 108) | @Override
    method handlerErrorMsg (line 166) | private String handlerErrorMsg(int what){
    method PluginServiceServer (line 178) | public PluginServiceServer(Context context) {
    method startServiceLocked (line 184) | ComponentName startServiceLocked(Intent intent, Messenger client) {
    method handleOnCreate (line 198) | private boolean handleOnCreate(Intent intent, ServiceRecord sr){
    method handleOnStartCommand (line 216) | private void handleOnStartCommand(Intent intent, ServiceRecord sr){
    method sendStartServiceMsg (line 230) | private void sendStartServiceMsg(Intent intent, ServiceRecord sr, int ...
    method stopServiceLocked (line 242) | int stopServiceLocked(Intent intent) {
    method bindServiceLocked (line 258) | int bindServiceLocked(Intent intent, IServiceConnection connection, in...
    method handleOnCreateAndBind (line 276) | private boolean handleOnCreateAndBind(OnCreateAndBindMsg msg){
    method handleOnBind (line 299) | private void handleOnBind(OnCreateAndBindMsg msg){
    method insertConnectionToRecords (line 326) | private void insertConnectionToRecords(ServiceRecord sr, ProcessBindRe...
    method unbindServiceLocked (line 354) | boolean unbindServiceLocked(IServiceConnection connection) {
    method removeConnectionLocked (line 377) | private void removeConnectionLocked(ConnectionBindRecord c) {
    method getService (line 434) | public IPluginServiceServer getService() {
    method cloneIntentLocked (line 441) | private Intent cloneIntentLocked(Intent intent) {
    method getServiceLocked (line 446) | private ServiceRecord getServiceLocked(Intent service) {
    method retrieveServiceLocked (line 452) | private ServiceRecord retrieveServiceLocked(Intent service) {
    method installServiceIfNeededLocked (line 500) | private boolean installServiceIfNeededLocked(final ServiceRecord sr) {
    method installServiceLocked (line 526) | private boolean installServiceLocked(ServiceRecord sr) {
    method callConnectedMethodLocked (line 574) | private void callConnectedMethodLocked(IServiceConnection conn, Compon...
    method recycleServiceIfNeededLocked (line 586) | private void recycleServiceIfNeededLocked(ServiceRecord sr) {
    method recycleServiceLocked (line 608) | private void recycleServiceLocked(ServiceRecord r) {
    method attachBaseContextLocked (line 640) | private void attachBaseContextLocked(ContextWrapper cw, Context c) thr...
    class Stub (line 655) | class Stub extends IPluginServiceServer.Stub {
      method startService (line 657) | @Override
      method stopService (line 664) | @Override
      method bindService (line 671) | @Override
      method unbindService (line 678) | @Override
      method dump (line 685) | @Override
    method retrieveProcessRecordLocked (line 694) | private ProcessRecord retrieveProcessRecordLocked(Messenger client) {
    method getPitComponentName (line 705) | private ComponentName getPitComponentName() {
    method startPitService (line 713) | private void startPitService(ComponentName pitCN) {
    method stopPitService (line 732) | private void stopPitService(ComponentName pitCN) {
    method dump (line 753) | private String dump() {
    class OnCreateAndBindMsg (line 779) | private static class OnCreateAndBindMsg{

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/server/ProcessBindRecord.java
  class ProcessBindRecord (line 28) | class ProcessBindRecord {
    method ProcessBindRecord (line 42) | ProcessBindRecord(ServiceRecord service, IntentBindRecord intent,
    method toString (line 49) | public String toString() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/server/ProcessRecord.java
  class ProcessRecord (line 30) | class ProcessRecord {
    method ProcessRecord (line 43) | ProcessRecord(int p, Messenger c) {
    method toString (line 48) | public String toString() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/server/ServiceRecord.java
  class ServiceRecord (line 38) | class ServiceRecord {
    method ServiceRecord (line 71) | ServiceRecord(ComponentName cn, Intent.FilterComparison fi, ServiceInf...
    method retrieveAppBindingLocked (line 80) | public ProcessBindRecord retrieveAppBindingLocked(Intent intent, Proce...
    method hasAutoCreateConnections (line 97) | public boolean hasAutoCreateConnections() {
    method toString (line 111) | @Override
    method getPlugin (line 116) | public String getPlugin() {
    method getPitComponentName (line 120) | public ComponentName getPitComponentName() {
    method getServiceInfo (line 124) | public ServiceInfo getServiceInfo() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/utils/ApkCommentReader.java
  class ApkCommentReader (line 34) | public class ApkCommentReader {
    method readComment (line 47) | public static String readComment(String path) {
    method getComment (line 69) | private static byte[] getComment(RandomAccessFile raf) {
    method decompress (line 108) | private static String decompress(byte[] str) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/utils/IntentMatcherHelper.java
  class IntentMatcherHelper (line 42) | public class IntentMatcherHelper {
    method getActivityInfo (line 55) | public static ActivityInfo getActivityInfo(Context context, String plu...
    method doMatchIntent (line 72) | public static String doMatchIntent(Context context, Intent intent, Map...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/utils/PluginClientHelper.java
  class PluginClientHelper (line 43) | public class PluginClientHelper {
    method getComponentNameByContext (line 56) | public static ComponentName getComponentNameByContext(Context c, Compo...
    method getProcessInt (line 96) | public static Integer getProcessInt(String processName) {
    method getPluginName (line 126) | public static String getPluginName(ComponentInfo ci) {
    class ShouldCallSystem (line 142) | public static class ShouldCallSystem extends RuntimeException {
      method ShouldCallSystem (line 145) | public ShouldCallSystem() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/debugger/DebuggerReceivers.java
  class DebuggerReceivers (line 36) | public class DebuggerReceivers {
    method registerReceivers (line 84) | public boolean registerReceivers(Context context) {
    class DebugerReceiver (line 119) | class DebugerReceiver extends BroadcastReceiver {
      method doActionInstall (line 129) | private boolean doActionInstall(final Context context, final Intent ...
      method doActionUninstall (line 149) | private boolean doActionUninstall(final Context context, final Inten...
      method doActionInstallWithPN (line 168) | private boolean doActionInstallWithPN(final Context context, final I...
      method doActionStartActivity (line 187) | private boolean doActionStartActivity(final Context context, final I...
      method onReceive (line 201) | @Override
      method onInstallByApk (line 225) | private boolean onInstallByApk(String path, boolean immediately) {
      method onInstallByPn (line 229) | private boolean onInstallByPn(String path, boolean imeediately) {
      method onInstall (line 240) | private boolean onInstall(String path, boolean immediately) {
      method onStartActivity (line 269) | private boolean onStartActivity(Context context, String plugin, Stri...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/AbstractApkParser.java
  class AbstractApkParser (line 44) | public abstract class AbstractApkParser implements Closeable {
    method getManifestXml (line 55) | public String getManifestXml() throws IOException {
    method parseManifestXml (line 65) | private void parseManifestXml() throws IOException {
    method getFileData (line 79) | public abstract byte[] getFileData(String path) throws IOException;
    method transBinaryXml (line 81) | private void transBinaryXml(byte[] data, XmlStreamer xmlStreamer) thro...
    method close (line 88) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/ApkParser.java
  class ApkParser (line 44) | public class ApkParser extends AbstractApkParser implements Closeable {
    method ApkParser (line 48) | public ApkParser(File apkFile) throws IOException {
    method ApkParser (line 53) | public ApkParser(String filePath) throws IOException {
    method getFileData (line 57) | @Override
    method close (line 68) | @Override
    method toByteArray (line 74) | private static byte[] toByteArray(InputStream in) throws IOException {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/exception/ParserException.java
  class ParserException (line 34) | public class ParserException extends RuntimeException {
    method ParserException (line 35) | public ParserException(String msg) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/parser/BinaryXmlParser.java
  class BinaryXmlParser (line 56) | public class BinaryXmlParser {
    method BinaryXmlParser (line 69) | public BinaryXmlParser(ByteBuffer buffer) {
    method parse (line 77) | public void parse() {
    method readXmlNodeEndTag (line 142) | private XmlNodeEndTag readXmlNodeEndTag() {
    method readXmlNodeStartTag (line 156) | private XmlNodeStartTag readXmlNodeStartTag() {
    method readAttribute (line 193) | private Attribute readAttribute() {
    method readXmlNamespaceStartTag (line 217) | private XmlNamespaceStartTag readXmlNamespaceStartTag() {
    method readXmlNamespaceEndTag (line 230) | private XmlNamespaceEndTag readXmlNamespaceEndTag() {
    method readXmlResourceMap (line 243) | private long[] readXmlResourceMap(XmlResourceMapHeader chunkHeader) {
    method readChunkHeader (line 252) | private ChunkHeader readChunkHeader() {
    method setXmlStreamer (line 295) | public void setXmlStreamer(XmlStreamer xmlStreamer) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/parser/StringPoolEntry.java
  class StringPoolEntry (line 32) | public class StringPoolEntry {
    method StringPoolEntry (line 36) | public StringPoolEntry(int idx, long offset) {
    method getIdx (line 41) | public int getIdx() {
    method setIdx (line 45) | public void setIdx(int idx) {
    method getOffset (line 49) | public long getOffset() {
    method setOffset (line 53) | public void setOffset(long offset) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/parser/XmlNamespaces.java
  class XmlNamespaces (line 41) | class XmlNamespaces {
    method XmlNamespaces (line 47) | public XmlNamespaces() {
    method addNamespace (line 52) | public void addNamespace(XmlNamespaceStartTag tag) {
    method removeNamespace (line 58) | public void removeNamespace(XmlNamespaceEndTag tag) {
    method getPrefixViaUri (line 64) | public String getPrefixViaUri(String uri) {
    method consumeNameSpaces (line 76) | public List<XmlNamespace> consumeNameSpaces() {
    class XmlNamespace (line 90) | public static class XmlNamespace {
      method XmlNamespace (line 94) | private XmlNamespace(String prefix, String uri) {
      method getPrefix (line 99) | public String getPrefix() {
      method getUri (line 103) | public String getUri() {
      method equals (line 107) | @Override
      method hashCode (line 135) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/parser/XmlStreamer.java
  type XmlStreamer (line 39) | public interface XmlStreamer {
    method onStartTag (line 41) | void onStartTag(XmlNodeStartTag xmlNodeStartTag);
    method onEndTag (line 43) | void onEndTag(XmlNodeEndTag xmlNodeEndTag);
    method onNamespaceStart (line 45) | void onNamespaceStart(XmlNamespaceStartTag tag);
    method onNamespaceEnd (line 47) | void onNamespaceEnd(XmlNamespaceEndTag tag);

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/parser/XmlTranslator.java
  class XmlTranslator (line 43) | public class XmlTranslator implements XmlStreamer {
    method XmlTranslator (line 49) | public XmlTranslator() {
    method onStartTag (line 55) | @Override
    method onAttribute (line 87) | private void onAttribute(Attribute attribute) {
    method onEndTag (line 101) | @Override
    method onNamespaceStart (line 118) | @Override
    method onNamespaceEnd (line 123) | @Override
    method appendShift (line 128) | private void appendShift(int shift) {
    method getXml (line 134) | public String getXml() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/ChunkHeader.java
  class ChunkHeader (line 43) | public class ChunkHeader {
    method ChunkHeader (line 61) | public ChunkHeader(int chunkType, int headerSize, long chunkSize) {
    method getBodySize (line 67) | public int getBodySize() {
    method getChunkType (line 71) | public int getChunkType() {
    method setChunkType (line 75) | public void setChunkType(int chunkType) {
    method getHeaderSize (line 79) | public int getHeaderSize() {
    method setHeaderSize (line 83) | public void setHeaderSize(int headerSize) {
    method getChunkSize (line 87) | public long getChunkSize() {
    method setChunkSize (line 91) | public void setChunkSize(long chunkSize) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/ChunkType.java
  class ChunkType (line 35) | public class ChunkType {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/ResourceValue.java
  class ResourceValue (line 35) | public abstract class ResourceValue {
    method ResourceValue (line 38) | protected ResourceValue(int value) {
    method string (line 42) | public static ResourceValue string(int value, StringPool stringPool) {
    method raw (line 46) | public static ResourceValue raw(int value, short type) {
    method toStringValue (line 50) | public abstract String toStringValue();
    class StringResourceValue (line 52) | private static class StringResourceValue extends ResourceValue {
      method StringResourceValue (line 55) | private StringResourceValue(int value, StringPool stringPool) {
      method toStringValue (line 60) | @Override
    class RawValue (line 70) | private static class RawValue extends ResourceValue {
      method RawValue (line 73) | private RawValue(int value, short dataType) {
      method toStringValue (line 78) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/StringPool.java
  class StringPool (line 34) | public class StringPool {
    method StringPool (line 37) | public StringPool(int poolSize) {
    method get (line 41) | public String get(int idx) {
    method set (line 45) | public void set(int idx, String value) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/StringPoolHeader.java
  class StringPoolHeader (line 34) | public class StringPoolHeader extends ChunkHeader {
    method StringPoolHeader (line 50) | public StringPoolHeader(int chunkType, int headerSize, long chunkSize) {
    method getStringCount (line 54) | public long getStringCount() {
    method setStringCount (line 58) | public void setStringCount(long stringCount) {
    method getStyleCount (line 62) | public long getStyleCount() {
    method setStyleCount (line 66) | public void setStyleCount(long styleCount) {
    method getFlags (line 70) | public long getFlags() {
    method setFlags (line 74) | public void setFlags(long flags) {
    method getStringsStart (line 78) | public long getStringsStart() {
    method setStringsStart (line 82) | public void setStringsStart(long stringsStart) {
    method getStylesStart (line 86) | public long getStylesStart() {
    method setStylesStart (line 90) | public void setStylesStart(long stylesStart) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/xml/Attribute.java
  class Attribute (line 34) | public class Attribute {
    method getNamespace (line 43) | public String getNamespace() {
    method setNamespace (line 47) | public void setNamespace(String namespace) {
    method getName (line 51) | public String getName() {
    method setName (line 55) | public void setName(String name) {
    method getRawValue (line 59) | public String getRawValue() {
    method setRawValue (line 63) | public void setRawValue(String rawValue) {
    method getValue (line 67) | public String getValue() {
    method setValue (line 71) | public void setValue(String value) {
    method toString (line 75) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/xml/Attributes.java
  class Attributes (line 34) | public class Attributes {
    method Attributes (line 38) | public Attributes(int size) {
    method set (line 42) | public void set(int i, Attribute attribute) {
    method get (line 46) | public String get(String name) {
    method size (line 55) | public int size() {
    method getBoolean (line 59) | public boolean getBoolean(String name, boolean b) {
    method getInt (line 64) | public Integer getInt(String name) {
    method getLong (line 75) | public Long getLong(String name) {
    method value (line 86) | public Attribute[] value() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/xml/NullHeader.java
  class NullHeader (line 36) | public class NullHeader extends ChunkHeader {
    method NullHeader (line 37) | public NullHeader(int chunkType, int headerSize, long chunkSize) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/xml/XmlHeader.java
  class XmlHeader (line 37) | public class XmlHeader extends ChunkHeader {
    method XmlHeader (line 38) | public XmlHeader(int chunkType, int headerSize, long chunkSize) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/xml/XmlNamespaceEndTag.java
  class XmlNamespaceEndTag (line 32) | public class XmlNamespaceEndTag {
    method getPrefix (line 36) | public String getPrefix() {
    method setPrefix (line 40) | public void setPrefix(String prefix) {
    method getUri (line 44) | public String getUri() {
    method setUri (line 48) | public void setUri(String uri) {
    method toString (line 52) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/xml/XmlNamespaceStartTag.java
  class XmlNamespaceStartTag (line 32) | public class XmlNamespaceStartTag {
    method getPrefix (line 36) | public String getPrefix() {
    method setPrefix (line 40) | public void setPrefix(String prefix) {
    method getUri (line 44) | public String getUri() {
    method setUri (line 48) | public void setUri(String uri) {
    method toString (line 52) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/xml/XmlNodeEndTag.java
  class XmlNodeEndTag (line 32) | public class XmlNodeEndTag {
    method getNamespace (line 36) | public String getNamespace() {
    method setNamespace (line 40) | public void setNamespace(String namespace) {
    method getName (line 44) | public String getName() {
    method setName (line 48) | public void setName(String name) {
    method toString (line 52) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/xml/XmlNodeHeader.java
  class XmlNodeHeader (line 34) | public class XmlNodeHeader extends ChunkHeader {
    method XmlNodeHeader (line 40) | public XmlNodeHeader(int chunkType, int headerSize, long chunkSize) {
    method getLineNum (line 44) | public int getLineNum() {
    method setLineNum (line 48) | public void setLineNum(int lineNum) {
    method getCommentRef (line 52) | public int getCommentRef() {
    method setCommentRef (line 56) | public void setCommentRef(int commentRef) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/xml/XmlNodeStartTag.java
  class XmlNodeStartTag (line 32) | public class XmlNodeStartTag {
    method getNamespace (line 50) | public String getNamespace() {
    method setNamespace (line 54) | public void setNamespace(String namespace) {
    method getName (line 58) | public String getName() {
    method setName (line 62) | public void setName(String name) {
    method getAttributes (line 66) | public Attributes getAttributes() {
    method setAttributes (line 70) | public void setAttributes(Attributes attributes) {
    method toString (line 74) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/xml/XmlResourceMapHeader.java
  class XmlResourceMapHeader (line 34) | public class XmlResourceMapHeader extends ChunkHeader {
    method XmlResourceMapHeader (line 35) | public XmlResourceMapHeader(int chunkType, int headerSize, long chunkS...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/utils/Buffers.java
  class Buffers (line 36) | public class Buffers {
    method readUByte (line 41) | public static short readUByte(ByteBuffer buffer) {
    method readUShort (line 49) | public static int readUShort(ByteBuffer buffer) {
    method readUInt (line 57) | public static long readUInt(ByteBuffer buffer) {
    method readBytes (line 65) | public static byte[] readBytes(ByteBuffer buffer, int size) {
    method readString (line 74) | public static String readString(ByteBuffer buffer, int strLen) {
    method skip (line 85) | public static void skip(ByteBuffer buffer, int count) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/utils/ParseUtils.java
  class ParseUtils (line 41) | public class ParseUtils {
    method readString (line 48) | public static String readString(ByteBuffer buffer, boolean utf8) {
    method readLen (line 73) | private static int readLen(ByteBuffer buffer) {
    method readLen16 (line 90) | private static int readLen16(ByteBuffer buffer) {
    method readStringPool (line 106) | public static StringPool readStringPool(ByteBuffer buffer, StringPoolH...
    method readResValue (line 160) | public static ResourceValue readResValue(ByteBuffer buffer, StringPool...
    method checkChunkType (line 168) | public static void checkChunkType(int expected, int real) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/utils/xml/AggregateTranslator.java
  class AggregateTranslator (line 35) | class AggregateTranslator extends CharSequenceTranslator {
    method AggregateTranslator (line 44) | public AggregateTranslator(final CharSequenceTranslator... translators) {
    method translate (line 53) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/utils/xml/CharSequenceTranslator.java
  class CharSequenceTranslator (line 38) | abstract class CharSequenceTranslator {
    method hex (line 47) | public static String hex(final int codepoint) {
    method translate (line 63) | public abstract int translate(CharSequence input, int index, Writer ou...
    method translate (line 71) | public final String translate(final CharSequence input) {
    method translate (line 93) | public final void translate(final CharSequence input, final Writer out...
    method with (line 125) | public final CharSequenceTranslator with(final CharSequenceTranslator....

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/utils/xml/CodePointTranslator.java
  class CodePointTranslator (line 35) | abstract class CodePointTranslator extends CharSequenceTranslator {
    method translate (line 41) | @Override
    method translate (line 56) | public abstract boolean translate(int codepoint, Writer out) throws IO...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/utils/xml/EntityArrays.java
  class EntityArrays (line 33) | public class EntityArrays {
    method BASIC_ESCAPE (line 51) | public static String[][] BASIC_ESCAPE() {
    method APOS_ESCAPE (line 60) | public static String[][] APOS_ESCAPE() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/utils/xml/LookupTranslator.java
  class LookupTranslator (line 35) | class LookupTranslator extends CharSequenceTranslator {
    method LookupTranslator (line 51) | public LookupTranslator(final CharSequence[]... lookup) {
    method translate (line 74) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/utils/xml/NumericEntityEscaper.java
  class NumericEntityEscaper (line 34) | class NumericEntityEscaper extends CodePointTranslator {
    method NumericEntityEscaper (line 50) | private NumericEntityEscaper(final int below, final int above, final b...
    method NumericEntityEscaper (line 59) | public NumericEntityEscaper() {
    method below (line 69) | public static NumericEntityEscaper below(final int codepoint) {
    method above (line 79) | public static NumericEntityEscaper above(final int codepoint) {
    method between (line 90) | public static NumericEntityEscaper between(final int codepointLow, fin...
    method outsideOf (line 101) | public static NumericEntityEscaper outsideOf(final int codepointLow, f...
    method translate (line 108) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/utils/xml/UnicodeUnpairedSurrogateRemover.java
  class UnicodeUnpairedSurrogateRemover (line 34) | class UnicodeUnpairedSurrogateRemover extends CodePointTranslator {
    method translate (line 39) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/utils/xml/XmlEscaper.java
  class XmlEscaper (line 34) | public class XmlEscaper {
    method escapeXml10 (line 82) | public static String escapeXml10(final String input) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/helper/HostConfigHelper.java
  class HostConfigHelper (line 28) | public class HostConfigHelper {
    method readField (line 245) | private static <T> T readField(String name) throws NoSuchFieldException {
    method init (line 260) | public static void init() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/helper/JSONHelper.java
  class JSONHelper (line 36) | public class JSONHelper {
    method putNoThrows (line 47) | public static <T> void putNoThrows(JSONObject jo, String key, T value) {
    method cloneNoThrows (line 63) | public static JSONObject cloneNoThrows(JSONObject from) {
    method remove (line 79) | public static void remove(JSONArray jsonArray, int index) {
    method removeBelowAPI19 (line 87) | private static void removeBelowAPI19(JSONArray jsonArray, int index) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/helper/LogDebug.java
  class LogDebug (line 35) | public class LogDebug {
    method v (line 64) | public static int v(String tag, String msg) {
    method v (line 79) | public static int v(String tag, String msg, Throwable tr) {
    method d (line 93) | public static int d(String tag, String msg) {
    method d (line 108) | public static int d(String tag, String msg, Throwable tr) {
    method i (line 122) | public static int i(String tag, String msg) {
    method i (line 137) | public static int i(String tag, String msg, Throwable tr) {
    method w (line 151) | public static int w(String tag, String msg) {
    method w (line 166) | public static int w(String tag, String msg, Throwable tr) {
    method w (line 180) | public static int w(String tag, Throwable tr) {
    method e (line 194) | public static int e(String tag, String msg) {
    method e (line 209) | public static int e(String tag, String msg, Throwable tr) {
    method printMemoryStatus (line 223) | public static int printMemoryStatus(String tag, String msg) {
    method printPluginInfo (line 246) | public static int printPluginInfo(PluginInfo pi, int load) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/helper/LogRelease.java
  class LogRelease (line 27) | public class LogRelease {
    method v (line 47) | public static int v(String tag, String msg) {
    method v (line 59) | public static int v(String tag, String msg, Throwable tr) {
    method d (line 70) | public static int d(String tag, String msg) {
    method d (line 82) | public static int d(String tag, String msg, Throwable tr) {
    method i (line 93) | public static int i(String tag, String msg) {
    method i (line 105) | public static int i(String tag, String msg, Throwable tr) {
    method w (line 116) | public static int w(String tag, String msg) {
    method w (line 128) | public static int w(String tag, String msg, Throwable tr) {
    method w (line 139) | public static int w(String tag, Throwable tr) {
    method e (line 150) | public static int e(String tag, String msg) {
    method e (line 162) | public static int e(String tag, String msg, Throwable tr) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/model/PluginInfo.java
  class PluginInfo (line 64) | public class PluginInfo implements Serializable, Parcelable, Cloneable {
    method PluginInfo (line 140) | private PluginInfo(JSONObject jo) {
    method PluginInfo (line 144) | private PluginInfo(String name, int low, int high, int ver) {
    method PluginInfo (line 151) | private PluginInfo(String pkgName, String alias, int low, int high, in...
    method initPluginInfo (line 171) | private void initPluginInfo(JSONObject jo) {
    method makeName (line 201) | private String makeName(String pkgName, String alias) {
    method parseFromPackageInfo (line 215) | public static PluginInfo parseFromPackageInfo(PackageInfo pi, String p...
    method parseFromJsonText (line 261) | public static PluginInfo parseFromJsonText(String joText) {
    method getName (line 284) | public String getName() {
    method getPackageName (line 291) | public String getPackageName() {
    method getAlias (line 298) | public String getAlias() {
    method getVersion (line 305) | public int getVersion() {
    method getPath (line 312) | public String getPath() {
    method setPath (line 320) | public void setPath(String path) {
    method isUsed (line 329) | public boolean isUsed() {
    method setIsUsed (line 346) | public void setIsUsed(boolean used) {
    method getVersionValue (line 353) | public long getVersionValue() {
    method isDexExtracted (line 362) | public boolean isDexExtracted() {
    method getApkFile (line 375) | public File getApkFile() {
    method getApkDir (line 384) | public String getApkDir() {
    method getDexDir (line 404) | private File getDexDir(File dexDir, String dirSuffix) {
    method getExtraDexDir (line 422) | public File getExtraDexDir() {
    method getExtraOdexDir (line 434) | public File getExtraOdexDir() {
    method getDexParentDir (line 451) | public File getDexParentDir() {
    method getDexFile (line 480) | public File getDexFile() {
    method getNativeLibsDir (line 499) | public File getNativeLibsDir() {
    method getOldNativeLibsDir (line 504) | @Deprecated
    method getType (line 520) | public int getType() {
    method setType (line 528) | public void setType(int type) {
    method isNeedUpdate (line 537) | public boolean isNeedUpdate() {
    method getPendingUpdate (line 546) | public PluginInfo getPendingUpdate() {
    method setPendingUpdate (line 556) | public void setPendingUpdate(PluginInfo info) {
    method isNeedUninstall (line 570) | public boolean isNeedUninstall() {
    method getPendingDelete (line 579) | public PluginInfo getPendingDelete() {
    method setPendingDelete (line 589) | public void setPendingDelete(PluginInfo info) {
    method isNeedCover (line 603) | public boolean isNeedCover() {
    method getPendingCover (line 612) | public PluginInfo getPendingCover() {
    method setPendingCover (line 622) | public void setPendingCover(PluginInfo info) {
    method getIsPendingCover (line 637) | public boolean getIsPendingCover() {
    method setIsPendingCover (line 645) | public void setIsPendingCover(boolean coverInfo) {
    method getLowInterfaceApi (line 657) | public int getLowInterfaceApi() {
    method getHighInterfaceApi (line 666) | public int getHighInterfaceApi() {
    method getFrameworkVersion (line 674) | public int getFrameworkVersion() {
    method setFrameworkVersion (line 686) | public void setFrameworkVersion(int version) {
    method setFrameworkVersionByMeta (line 696) | public void setFrameworkVersionByMeta(Bundle meta) {
    method getJSON (line 709) | public JSONObject getJSON() {
    method makeInstalledFileName (line 721) | public String makeInstalledFileName() {
    method update (line 738) | public void update(PluginInfo info) {
    method updateAll (line 751) | public void updateAll(PluginInfo info) {
    method getParentInfo (line 765) | public PluginInfo getParentInfo() {
    method setParentInfo (line 770) | public void setParentInfo(PluginInfo parent) {
    method createByJO (line 774) | static PluginInfo createByJO(JSONObject jo) {
    method setPackageName (line 784) | private void setPackageName(String pkgName) {
    method setAlias (line 790) | private void setAlias(String alias) {
    method setVersion (line 796) | private void setVersion(int version) {
    method createFromParcel (line 807) | @Override
    method newArray (line 812) | @Override
    method PluginInfo (line 818) | private PluginInfo(Parcel source) {
    method clone (line 833) | @Override
    method describeContents (line 844) | @Override
    method writeToParcel (line 849) | @Override
    method toString (line 854) | @Override
    method toContentString (line 863) | private void toContentString(StringBuilder b) {
    method hashCode (line 914) | @Override
    method equals (line 919) | @Override
    method compare (line 962) | @Override
    method format (line 974) | public static final String format(String name, int low, int high, int ...
    method build (line 978) | public static final PluginInfo build(File f) {
    method buildFromBuiltInJson (line 1007) | public static final PluginInfo buildFromBuiltInJson(JSONObject jo) {
    method buildV5 (line 1032) | public static final PluginInfo buildV5(String name, int low, int high,...
    method build (line 1036) | public static final PluginInfo build(Cursor cursor) {
    method build (line 1051) | public static final PluginInfo build(String name, int low, int high, i...
    method PluginInfo (line 1056) | private PluginInfo(String name, int low, int high, int ver, int type, ...
    method formatName (line 1066) | private String formatName() {
    method to (line 1070) | final void to(MatrixCursor cursor) {
    method to (line 1076) | public final void to(Intent intent) {
    method deleteObsolote (line 1090) | public final boolean deleteObsolote(Context context) {
    method canReplaceForPn (line 1114) | public final boolean canReplaceForPn(PluginInfo info) {
    method match (line 1126) | public final boolean match() {
    method buildCompareValue (line 1139) | private final long buildCompareValue() {
    method isPnPlugin (line 1155) | public boolean isPnPlugin() {
    method getV5Type (line 1165) | public int getV5Type() {
    method getV5Index (line 1174) | public int getV5Index() {
    method getV5Offset (line 1183) | public int getV5Offset() {
    method getV5Length (line 1192) | public int getV5Length() {
    method getV5MD5 (line 1201) | public String getV5MD5() {
    method get (line 1207) | private <T> T get(String name, T def) {
    method put (line 1214) | public <T> void put(String key, T value) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/model/PluginInfoList.java
  class PluginInfoList (line 46) | public class PluginInfoList implements Iterable<PluginInfo> {
    method add (line 52) | public void add(PluginInfo pi) {
    method addForce (line 60) | public void addForce(PluginInfo pi) {
    method remove (line 66) | public void remove(String pn) {
    method get (line 70) | public PluginInfo get(String pn) {
    method cloneList (line 74) | public List<PluginInfo> cloneList() {
    method load (line 78) | public boolean load(Context context) {
    method save (line 122) | public boolean save(Context context) {
    method iterator (line 140) | @Override
    method getCopyValues (line 147) | private Collection<PluginInfo> getCopyValues() {
    method addToMap (line 151) | private void addToMap(PluginInfo pi) {
    method updateMap (line 157) | private void updateMap(String name, PluginInfo info) {
    method getFile (line 178) | private File getFile(Context context) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/packages/PluginFastInstallProvider.java
  class PluginFastInstallProvider (line 38) | public class PluginFastInstallProvider extends ContentProvider {
    method makeInstallValues (line 53) | static ContentValues makeInstallValues(PluginInfo pi) {
    method onCreate (line 59) | @Override
    method update (line 65) | @Override
    method install (line 82) | private int install(ContentValues cv) {
    method query (line 102) | @Override
    method getType (line 108) | @Override
    method insert (line 115) | @Override
    method delete (line 121) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/packages/PluginFastInstallProviderProxy.java
  class PluginFastInstallProviderProxy (line 39) | public class PluginFastInstallProviderProxy {
    method install (line 54) | public static boolean install(Context context, PluginInfo pi) {
    method getProvider (line 83) | private static ContentProviderClient getProvider(Context context) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/packages/PluginInfoUpdater.java
  class PluginInfoUpdater (line 38) | public class PluginInfoUpdater {
    method register (line 45) | public static void register(Context context) {
    method updateIsUsed (line 50) | static void updateIsUsed(Context context, String pluginName, boolean u...
    class UpdateReceiver (line 60) | private static class UpdateReceiver extends BroadcastReceiver {
      method onReceive (line 62) | @Override
    method onReceiveUpdateInfo (line 70) | private static boolean onReceiveUpdateInfo(Intent intent) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/packages/PluginManagerProxy.java
  class PluginManagerProxy (line 41) | public class PluginManagerProxy {
    method connectToServer (line 59) | public static void connectToServer(IPluginHost host) throws RemoteExce...
    method disconnect (line 73) | public static void disconnect() {
    method load (line 89) | public static List<PluginInfo> load() throws RemoteException {
    method preInstallBuiltins (line 102) | public static List<PluginInfo> preInstallBuiltins(List<PluginInfo> bui...
    method updateAllPlugins (line 112) | public static List<PluginInfo> updateAllPlugins() throws RemoteExcepti...
    method updateUsedIfNeeded (line 125) | public static void updateUsedIfNeeded(String name, String path, int ty...
    method updateTP (line 160) | public static void updateTP(String plugin, int type, String path) thro...
    method isPluginRunning (line 171) | public static boolean isPluginRunning(String pluginName) throws Remote...
    method isPluginRunningInProcess (line 196) | public static boolean isPluginRunningInProcess(String pluginName, Stri...
    method syncRunningPlugins (line 220) | public static void syncRunningPlugins() throws RemoteException {
    method addToRunningPluginsNoThrows (line 239) | public static void addToRunningPluginsNoThrows(String pluginName) {
    method getRunningPluginsNoThrows (line 263) | public static PluginRunningList getRunningPluginsNoThrows() {
    method getRunningProcessesByPluginNoThrows (line 291) | public static String[] getRunningProcessesByPluginNoThrows(String plug...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/packages/PluginManagerServer.java
  class PluginManagerServer (line 59) | public class PluginManagerServer {
    method PluginManagerServer (line 76) | public PluginManagerServer(Context context) {
    method getService (line 81) | public IPluginManagerServer getService() {
    method onClientProcessKilled (line 90) | public void onClientProcessKilled(String processName) {
    method loadLocked (line 100) | private List<PluginInfo> loadLocked() {
    method installBuiltins (line 109) | private List<PluginInfo> installBuiltins(List<PluginInfo> builtins) {
    method updateAllLocked (line 122) | private List<PluginInfo> updateAllLocked() {
    method installLocked (line 130) | private PluginInfo installLocked(String path) {
    method verifySignature (line 210) | private boolean verifySignature(PackageInfo pi, String path) {
    method checkVersion (line 225) | private int checkVersion(PluginInfo instPli, PluginInfo curPli) {
    method copyOrMoveApk (line 258) | private boolean copyOrMoveApk(String path, PluginInfo instPli) {
    method updateOrLater (line 287) | private void updateOrLater(PluginInfo curPli, PluginInfo instPli) {
    method updatePendingUpdate (line 337) | private void updatePendingUpdate(PluginInfo curPli, PluginInfo instPli...
    method updateAllIfNeeded (line 366) | private void updateAllIfNeeded() {
    method updateIfNeeded (line 384) | private boolean updateIfNeeded(PluginInfo curInfo) {
    method updateNow (line 418) | private void updateNow(PluginInfo curInfo, PluginInfo newInfo) {
    method move (line 444) | private void move(PluginInfo curPi, PluginInfo newPi) {
    method delete (line 483) | private void delete(PluginInfo pi) {
    method updateUsedLocked (line 509) | private void updateUsedLocked(String name, boolean used) {
    method updateUsedLocked (line 527) | private void updateUsedLocked(String name, String path, int type, bool...
    method uninstallLocked (line 550) | private boolean uninstallLocked(PluginInfo pi) {
    method uninstallLater (line 564) | private boolean uninstallLater(PluginInfo info) {
    method uninstallNow (line 579) | private boolean uninstallNow(PluginInfo info) {
    method getRunningPluginsLocked (line 594) | private PluginRunningList getRunningPluginsLocked() {
    method isPluginRunningLocked (line 606) | private boolean isPluginRunningLocked(String pluginName, String proces...
    method syncRunningPluginsLocked (line 626) | private void syncRunningPluginsLocked(PluginRunningList list) {
    method addToRunningPluginsLocked (line 636) | private void addToRunningPluginsLocked(String processName, int pid, St...
    method getRunningProcessesByPluginLocked (line 652) | private String[] getRunningProcessesByPluginLocked(String pluginName) {
    method updateTP (line 662) | private void updateTP(String name, int type, String path) {
    class Stub (line 673) | private class Stub extends IPluginManagerServer.Stub {
      method install (line 675) | @Override
      method load (line 682) | @Override
      method preInstallBuiltins (line 689) | @Override
      method updateAll (line 696) | @Override
      method updateUsed (line 703) | @Override
      method updateUsedNew (line 710) | @Override
      method uninstall (line 717) | @Override
      method getRunningPlugins (line 724) | @Override
      method isPluginRunning (line 731) | @Override
      method syncRunningPlugins (line 738) | @Override
      method addToRunningPlugins (line 745) | @Override
      method getRunningProcessesByPlugin (line 752) | @Override
      method updateTP (line 759) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/packages/PluginPublishFileGenerator.java
  class PluginPublishFileGenerator (line 41) | class PluginPublishFileGenerator {
    method write (line 53) | static boolean write(String srcPath, String outPath, int low, int high...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/packages/PluginRunningList.java
  class PluginRunningList (line 32) | public class PluginRunningList implements Parcelable, Iterable<String>, ...
    method PluginRunningList (line 39) | PluginRunningList() {
    method PluginRunningList (line 43) | PluginRunningList(PluginRunningList list) {
    method setProcessInfo (line 50) | void setProcessInfo(String processName, int pid) {
    method add (line 55) | void add(String s) {
    method isRunning (line 63) | boolean isRunning(String pluginName) {
    method hasRunning (line 67) | boolean hasRunning() {
    method getList (line 72) | List<String> getList() {
    method iterator (line 76) | @Override
    method toString (line 81) | @Override
    method equals (line 104) | @Override
    method hashCode (line 117) | @Override
    method clone (line 125) | @Override
    method describeContents (line 130) | @Override
    method writeToParcel (line 135) | @Override
    method createFromParcel (line 144) | public PluginRunningList createFromParcel(Parcel in) {
    method newArray (line 148) | public PluginRunningList[] newArray(int size) {
    method PluginRunningList (line 153) | private PluginRunningList(Parcel in) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/packages/RePluginInstaller.java
  class RePluginInstaller (line 38) | public class RePluginInstaller {
    method covertToPnFile (line 43) | public static File covertToPnFile(Context context, String path) {
    method copyPnToInstallPathIfNeeded (line 85) | private static File copyPnToInstallPathIfNeeded(File f, File filesDir) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/AssetsUtils.java
  class AssetsUtils (line 37) | public class AssetsUtils {
    method extractTo (line 48) | public static final boolean extractTo(Context context, final String na...
    method quickExtractTo (line 80) | public static final boolean quickExtractTo(Context context, final Plug...
    method quickExtractTo (line 112) | public static final QuickExtractResult quickExtractTo(Context context,...
    type QuickExtractResult (line 155) | public enum QuickExtractResult {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/Charsets.java
  class Charsets (line 52) | public class Charsets {
    method toCharset (line 61) | public static Charset toCharset(final Charset charset) {
    method toCharset (line 74) | public static Charset toCharset(final String charset) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/CloseableUtils.java
  class CloseableUtils (line 31) | public class CloseableUtils {
    method closeQuietly (line 38) | public static void closeQuietly(Closeable c) {
    method closeQuietly (line 53) | public static void closeQuietly(final Closeable... closeables) {
    method closeQuietly (line 68) | public static void closeQuietly(Cursor c) {
    method closeQuietly (line 84) | public static void closeQuietly(ZipFile c) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/Dex2OatUtils.java
  class Dex2OatUtils (line 32) | public class Dex2OatUtils {
    method isArtMode (line 43) | public static boolean isArtMode() {
    method injectLoadDex (line 55) | public static void injectLoadDex(String dexPath, String optimizedDirec...
    method innerInjectLoadDex (line 80) | private static boolean innerInjectLoadDex(String dexPath, String optim...
    method injectLoadDexBeforeN (line 93) | private static boolean injectLoadDexBeforeN() {
    method injectLoadDex4Art (line 124) | private static boolean injectLoadDex4Art(String dexPath, String optimi...
    method injectLoadDex4More (line 150) | private static boolean injectLoadDex4More() {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/FileUtils.java
  class FileUtils (line 55) | public class FileUtils {
    method openInputStream (line 90) | public static FileInputStream openInputStream(final File file) throws ...
    method openInputStreamFromAssetsQuietly (line 110) | public static InputStream openInputStreamFromAssetsQuietly(final Conte...
    method openOutputStream (line 144) | public static FileOutputStream openOutputStream(final File file) throw...
    method openOutputStream (line 169) | public static FileOutputStream openOutputStream(final File file, final...
    method forceMkdirParent (line 196) | public static void forceMkdirParent(final File file) throws IOException {
    method forceMkdir (line 215) | public static void forceMkdir(final File directory) throws IOException {
    method forceDelete (line 253) | public static void forceDelete(final File file) throws IOException {
    method deleteDirectory (line 281) | public static void deleteDirectory(final File directory) throws IOExce...
    method cleanDirectory (line 305) | public static void cleanDirectory(final File directory) throws IOExcep...
    method verifiedListFiles (line 328) | private static File[] verifiedListFiles(File directory) throws IOExcep...
    method readFileToString (line 356) | public static String readFileToString(final File file, final Charset e...
    method writeStringToFile (line 378) | public static void writeStringToFile(final File file, final String dat...
    method writeStringToFile (line 393) | public static void writeStringToFile(final File file, final String dat...
    method deleteQuietly (line 418) | public static boolean deleteQuietly(final File file) {
    method copyDir (line 436) | public static void copyDir(final File srcFile, final File destFile) th...
    method copyDir (line 440) | public static void copyDir(final File srcFile, final File destFile,
    method copyFile (line 460) | public static void copyFile(final File srcFile, final File destFile) t...
    method copyFile (line 464) | public static void copyFile(final File srcFile, final File destFile,
    method doCopyFile (line 502) | private static void doCopyFile(final File srcFile, final File destFile...
    method checkFileRequirements (line 550) | private static void checkFileRequirements(File src, File dest) throws ...
    method copyInputStreamToFile (line 578) | public static void copyInputStreamToFile(final InputStream source, fin...
    method copyToFile (line 602) | public static void copyToFile(final InputStream source, final File des...
    method moveFile (line 624) | public static void moveFile(final File srcFile, final File destFile) t...
    method sizeOf (line 654) | public static long sizeOf(final File file) {
    method sizeOfDirectory0 (line 676) | private static long sizeOfDirectory0(final File directory) {
    method sizeOf0 (line 706) | private static long sizeOf0(File file) {
    method getFileNameWithoutExt (line 722) | public static String getFileNameWithoutExt(String filePath) {
    method getFileExt (line 746) | public static String getFileExt(String filePath) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/FixOTranslucentOrientation.java
  class FixOTranslucentOrientation (line 15) | public class FixOTranslucentOrientation {
    method fix (line 17) | public static void fix(Activity activity) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/IOUtils.java
  class IOUtils (line 51) | public class IOUtils {
    method toString (line 79) | public static String toString(final InputStream input, final Charset e...
    method copy (line 106) | public static int copy(final InputStream input, final OutputStream out...
    method copy (line 128) | public static long copy(final InputStream input, final OutputStream ou...
    method copyLarge (line 148) | public static long copyLarge(final InputStream input, final OutputStre...
    method copyLarge (line 168) | public static long copyLarge(final InputStream input, final OutputStre...
    method copy (line 194) | public static void copy(final InputStream input, final Writer output, ...
    method copy (line 220) | public static int copy(final Reader input, final Writer output) throws...
    method copyLarge (line 242) | public static long copyLarge(final Reader input, final Writer output) ...
    method copyLarge (line 260) | public static long copyLarge(final Reader input, final Writer output, ...
    method write (line 285) | public static void write(final String data, final OutputStream output,...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/InterpretDex2OatHelper.java
  class InterpretDex2OatHelper (line 21) | public class InterpretDex2OatHelper {
    method getCurrentInstructionSet (line 23) | private static String getCurrentInstructionSet() throws Exception {
    method getOdexSize (line 31) | public static long getOdexSize(String oatFilePath) {
    method interpretDex2Oat (line 36) | public static void interpretDex2Oat(String dexFilePath, String oatFile...
    class StreamConsumer (line 89) | private static class StreamConsumer {
      method consumeInputStream (line 92) | static void consumeInputStream(final InputStream is) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/ReflectUtils.java
  class ReflectUtils (line 42) | public final class ReflectUtils {
    method getClass (line 48) | public static Class<?> getClass(final String className) throws ClassNo...
    method invokeConstructor (line 52) | public static <T> T invokeConstructor(Class<T> cls, Class[] parameterT...
    method getField (line 66) | public static Field getField(Class<?> cls, String fieldName) {
    method readStaticField (line 99) | public static Object readStaticField(Class<?> c, String fieldName) thr...
    method readField (line 103) | public static Object readField(Object target, String fieldName) throws...
    method readField (line 107) | public static Object readField(Class<?> c, Object target, String field...
    method readField (line 113) | public static Object readField(final Field field, final Object target)...
    method writeField (line 117) | public static void writeField(Object target, String fName, Object valu...
    method writeField (line 121) | public static void writeField(Class<?> c, Object object, String fName,...
    method writeField (line 126) | public static void writeField(final Field field, final Object target, ...
    method getAllFieldsList (line 130) | public static List<Field> getAllFieldsList(final Class<?> cls) {
    method removeFieldFinalModifier (line 146) | public static void removeFieldFinalModifier(final Field field) {
    method getMethod (line 177) | public static Method getMethod(Class<?> cls, String methodName, Class<...
    method invokeMethod (line 209) | public static Object invokeMethod(final Object object, final String me...
    method invokeMethod (line 216) | public static Object invokeMethod(ClassLoader loader, String clzName,
    method setAccessible (line 235) | public static void setAccessible(AccessibleObject ao, boolean value) {
    method dumpObject (line 245) | public static final void dumpObject(Object object, FileDescriptor fd, ...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/StringBuilderWriter.java
  class StringBuilderWriter (line 34) | public class StringBuilderWriter extends Writer implements Serializable {
    method StringBuilderWriter (line 42) | public StringBuilderWriter() {
    method StringBuilderWriter (line 51) | public StringBuilderWriter(final int capacity) {
    method StringBuilderWriter (line 62) | public StringBuilderWriter(final StringBuilder builder) {
    method append (line 72) | @Override
    method append (line 84) | @Override
    method append (line 98) | @Override
    method close (line 107) | @Override
    method flush (line 115) | @Override
    method write (line 126) | @Override
    method write (line 140) | @Override
    method getBuilder (line 152) | public StringBuilder getBuilder() {
    method toString (line 161) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/Validate.java
  class Validate (line 46) | public class Validate {
    method Validate (line 81) | public Validate() {
    method isTrue (line 107) | public static void isTrue(final boolean expression, final String messa...
    method isTrue (line 132) | public static void isTrue(final boolean expression, final String messa...
    method isTrue (line 156) | public static void isTrue(final boolean expression, final String messa...
    method isTrue (line 181) | public static void isTrue(final boolean expression) {
    method notNull (line 205) | public static <T> T notNull(final T object) {
    method notNull (line 223) | public static <T> T notNull(final T object, final String message, fina...
    method notEmpty (line 249) | public static <T> T[] notEmpty(final T[] array, final String message, ...
    method notEmpty (line 275) | public static <T> T[] notEmpty(final T[] array) {
    method notEmpty (line 298) | public static <T extends Collection<?>> T notEmpty(final T collection,...
    method notEmpty (line 324) | public static <T extends Collection<?>> T notEmpty(final T collection) {
    method notEmpty (line 347) | public static <T extends Map<?, ?>> T notEmpty(final T map, final Stri...
    method notEmpty (line 373) | public static <T extends Map<?, ?>> T notEmpty(final T map) {
    method notEmpty (line 396) | public static <T extends CharSequence> T notEmpty(final T chars, final...
    method notEmpty (line 423) | public static <T extends CharSequence> T notEmpty(final T chars) {
    method validIndex (line 451) | public static <T> T[] validIndex(final T[] array, final int index, fin...
    method validIndex (line 482) | public static <T> T[] validIndex(final T[] array, final int index) {
    method validIndex (line 510) | public static <T extends Collection<?>> T validIndex(final T collectio...
    method validIndex (line 538) | public static <T extends Collection<?>> T validIndex(final T collectio...
    method validIndex (line 567) | public static <T extends CharSequence> T validIndex(final T chars, fin...
    method validIndex (line 599) | public static <T extends CharSequence> T validIndex(final T chars, fin...
    method validState (line 625) | public static void validState(final boolean expression) {
    method validState (line 647) | public static void validState(final boolean expression, final String m...
    method matchesPattern (line 671) | public static void matchesPattern(final CharSequence input, final Stri...
    method matchesPattern (line 695) | public static void matchesPattern(final CharSequence input, final Stri...
    method notNaN (line 720) | public static void notNaN(final double value) {
    method notNaN (line 738) | public static void notNaN(final double value, final String message, fi...
    method finite (line 761) | public static void finite(final double value) {
    method finite (line 779) | public static void finite(final double value, final String message, fi...
    method inclusiveBetween (line 803) | public static <T> void inclusiveBetween(final T start, final T end, fi...
    method inclusiveBetween (line 828) | public static <T> void inclusiveBetween(final T start, final T end, fi...
    method inclusiveBetween (line 848) | @SuppressWarnings("boxing")
    method inclusiveBetween (line 872) | public static void inclusiveBetween(final long start, final long end, ...
    method inclusiveBetween (line 892) | @SuppressWarnings("boxing")
    method inclusiveBetween (line 916) | public static void inclusiveBetween(final double start, final double e...
    method exclusiveBetween (line 941) | public static <T> void exclusiveBetween(final T start, final T end, fi...
    method exclusiveBetween (line 966) | public static <T> void exclusiveBetween(final T start, final T end, fi...
    method exclusiveBetween (line 986) | @SuppressWarnings("boxing")
    method exclusiveBetween (line 1010) | public static void exclusiveBetween(final long start, final long end, ...
    method exclusiveBetween (line 1030) | @SuppressWarnings("boxing")
    method exclusiveBetween (line 1054) | public static void exclusiveBetween(final double start, final double e...
    method isInstanceOf (line 1080) | public static void isInstanceOf(final Class<?> type, final Object obj) {
    method isInstanceOf (line 1105) | public static void isInstanceOf(final Class<?> type, final Object obj,...
    method isAssignableFrom (line 1131) | public static void isAssignableFrom(final Class<?> superType, final Cl...
    method isAssignableFrom (line 1156) | public static void isAssignableFrom(final Class<?> superType, final Cl...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/basic/ArrayMap.java
  class ArrayMap (line 50) | public class ArrayMap<K, V> extends SimpleArrayMap<K, V> implements Map<...
    method ArrayMap (line 53) | public ArrayMap() {
    method ArrayMap (line 60) | public ArrayMap(int capacity) {
    method ArrayMap (line 67) | public ArrayMap(SimpleArrayMap map) {
    method getCollection (line 71) | private MapCollections<K, V> getCollection() {
    method containsAll (line 130) | public boolean containsAll(Collection<?> collection) {
    method putAll (line 139) | @Override
    method removeAll (line 153) | public boolean removeAll(Collection<?> collection) {
    method retainAll (line 164) | public boolean retainAll(Collection<?> collection) {
    method entrySet (line 181) | @Override
    method keySet (line 193) | @Override
    method values (line 205) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/basic/ArraySet.java
  class ArraySet (line 46) | public final class ArraySet<E> implements Collection<E>, Set<E> {
    method indexOf (line 77) | private int indexOf(Object key, int hash) {
    method indexOfNull (line 115) | private int indexOfNull() {
    method allocArrays (line 153) | private void allocArrays(final int size) {
    method freeArrays (line 188) | private static void freeArrays(final int[] hashes, final Object[] arra...
    method ArraySet (line 224) | public ArraySet() {
    method ArraySet (line 233) | public ArraySet(int capacity) {
    method ArraySet (line 246) | public ArraySet(ArraySet<E> set) {
    method ArraySet (line 256) | public ArraySet(Collection<E> set) {
    method clear (line 266) | @Override
    method ensureCapacity (line 280) | public void ensureCapacity(int minimumCapacity) {
    method contains (line 299) | @Override
    method indexOf (line 310) | public int indexOf(Object key) {
    method valueAt (line 320) | public E valueAt(int index) {
    method isEmpty (line 327) | @Override
    method add (line 340) | @Override
    method addAll (line 393) | public void addAll(ArraySet<? extends E> array) {
    method remove (line 415) | @Override
    method removeAt (line 431) | public E removeAt(int index) {
    method removeAll (line 484) | public boolean removeAll(ArraySet<? extends E> array) {
    method size (line 503) | @Override
    method toArray (line 508) | @Override
    method toArray (line 515) | @Override
    method equals (line 538) | @Override
    method hashCode (line 569) | @Override
    method toString (line 586) | @Override
    method getCollection (line 614) | private MapCollections<E, E> getCollection() {
    method iterator (line 673) | @Override
    method containsAll (line 685) | @Override
    method addAll (line 701) | @Override
    method removeAll (line 717) | @Override
    method retainAll (line 733) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/basic/ByteConvertor.java
  class ByteConvertor (line 24) | public class ByteConvertor {
    method toHex (line 25) | public static String toHex(byte[] buf) {
    method appendHex (line 38) | private static void appendHex(StringBuilder sb, byte b) {
    method toInt (line 44) | public static int toInt(byte[] byteArray4) {
    method toLong (line 56) | public static long toLong(byte[] byteArray8) {
    method toBytes (line 76) | public static byte[] toBytes(int intValue) {
    method toBytes (line 85) | public static byte[] toBytes(long longValue) {
    method subBytes (line 98) | public static byte[] subBytes(byte[] buf, int from, int len) {
    method bytesToHexString (line 111) | public static String bytesToHexString(byte[] bytes) {
    method hexStringToBytes (line 142) | public static byte[] hexStringToBytes(String s) {
    method hexCharToInt (line 157) | public static int hexCharToInt(char c) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/basic/ContainerHelpers.java
  class ContainerHelpers (line 22) | class ContainerHelpers {
    method idealIntArraySize (line 27) | public static int idealIntArraySize(int need) {
    method idealLongArraySize (line 31) | public static int idealLongArraySize(int need) {
    method idealByteArraySize (line 35) | public static int idealByteArraySize(int need) {
    method equal (line 45) | public static boolean equal(Object a, Object b) {
    method binarySearch (line 50) | static int binarySearch(int[] array, int size, int value) {
    method binarySearch (line 69) | static int binarySearch(long[] array, int size, long value) {

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/basic/MapCollections.java
  class MapCollections (line 31) | abstract class MapCollections<K, V> {
    class ArrayIterator (line 36) | final class ArrayIterator<T> implements Iterator<T> {
      method ArrayIterator (line 42) | ArrayIterator(int offset) {
      method hasNext (line 47) | @Override
      method next (line 52) | @Override
      method remove (line 60) | @Override
    class MapIterator (line 72) | final class MapIterator implements Iterator<Map.Entry<K, V>>, Map.Entr...
      method MapIterator (line 77) | MapIterator() {
      method hasNext (line 82) | @Override
      method next (line 87) | @Override
      method remove (line 94) | @Override
      method getKey (line 105) | @Override
      method getValue (line 114) | @Override
      method setValue (line 123) | @Override
      method equals (line 132) | @Override
      method hashCode (line 146) | @Override
      method toString (line 158) | @Override
    class EntrySet (line 164) | final class EntrySet implements Set<Map.Entry<K, V>> {
      method add (line 165) | @Override
      method addAll (line 170) | @Override
      method clear (line 179) | @Override
      method contains (line 184) | @Override
      method containsAll (line 198) | @Override
      method isEmpty (line 209) | @Override
      method iterator (line 214) | @Override
      method remove (line 219) | @Override
      method removeAll (line 224) | @Override
      method retainAll (line 229) | @Override
      method size (line 234) | @Override
      method toArray (line 239) | @Override
      method toArray (line 244) | @Override
      method equals (line 249) | @Override
      method hashCode (line 254) | @Override
    class KeySet (line 267) | final class KeySet implements Set<K> {
      method add (line 269) | @Override
      method addAll (line 274) | @Override
      method clear (line 279) | @Override
      method contains (line 284) | @Override
      method containsAll (line 289) | @Override
      method isEmpty (line 294) | @Override
      method iterator (line 299) | @Override
      method remove (line 304) | @Override
      method removeAll (line 314) | @Override
      method retainAll (line 319) | @Override
      method size (line 324) | @Override
      method toArray (line 329) | @Override
      method toArray (line 334) | @Override
      method equals (line 339) | @Override
      method hashCode (line 344) | @Override
    class ValuesCollection (line 355) | final class ValuesCollection implements Collection<V> {
      method add (line 357) | @Override
      method addAll (line 362) | @Override
      method clear (line 367) | @Override
      method contains (line 372) | @Override
      method containsAll (line 377) | @Override
      method isEmpty (line 388) | @Override
      method iterator (line 393) | @Override
      method remove (line 398) | @Override
      method removeAll (line 408) | @Override
      method retainAll (line 424) | @Override
      method size (line 440) | @Override
      method toArray (line 445) | @Override
      method toArray (line 450) | @Override
    method containsAllHelper (line 456) | public static <K, V> boolean containsAllHelper(Map<K, V> map, Collecti...
    method removeAllHelper (line 466) | public static <K, V> boolean removeAllHelper(Map<K, V> map, Collection...
    method retainAllHelper (line 475) | public static <K, V> boolean retainAllHelper(Map<K, V> map, Collection...
    method toArrayHelper (line 487) | public Object[] toArrayHelper(int offset) {
    method toArrayHelper (line 496) | public <T> T[] toArrayHelper(T[] array, int offset) {
    method equalsSetHelper (line 512) | public static <T> boolean equalsSetHelper(Set<T> set, Object object) {
    method getEntrySet (line 530) | public Set<Map.Entry<K, V>> getEntrySet() {
    method getKeySet (line 537) | public Set<K> getKeySet() {
    method getValues (line 544) | public Collection<V> getValues() {
    method colGetSize (line 551) | protected abstract int colGetSize();
    method colGetEntry (line 553) | protected abstract Object colGetEntry(int index, int offset);
    method colIndexOfKey (line 555) | protected abstract int colIndexOfKey(Object key);
    method colIndexOfValue (line 557) | protected abstract int colIndexOfValue(Object key);
    method colGetMap (line 559) | protected abstract Map<K, V> colGetMap();
    method colPut (line 561) | protected abstract void colPut(K key, V value);
    method colSetValue (line 563) | protected abstract V colSetValue(int index, V value);
    method colRemoveAt (line 565) | protected abstract void colRemoveAt(int index);
    method colClear (line 567) | protected abstract void colClear();

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/basic/SecurityUtil.java
  class SecurityUtil (line 33) | public class SecurityUtil {
    method MD5 (line 36) | public static byte[] MD5(byte[] input) {
    method getMD5 (line 51) | public static String getMD5(byte[] input) {
    method getMD5 (line 55) | public static String getMD5(String input) {
    method getFileMD5 (line 63) | public static String getFileMD5(String filename) {
    method getMd5ByFile (line 72) | public static String getMd5ByFile(File file) {
    method getMD5 (line 99) | public static String getMD5(InputStream inputStream) {
    method MD5 (line 131) | public static byte[] MD5(String filename) {
    method MD5 (line 135) | public static byte[] MD5(File file) {
    method MD5 (line 149) | public static final byte[] MD5(InputStream in) throws NoSuchAlgorithmE...

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/basic/SimpleArrayMap.java
  class SimpleArrayMap (line 31) | public class SimpleArrayMap<K, V> {
    method indexOf (line 61) | int indexOf(Object key, int hash) {
    method indexOfNull (line 103) | int indexOfNull() {
    method allocArrays (line 141) | private void allocArrays(final int size) {
    method freeArrays (line 176) | private static void freeArrays(final int[] hashes, final Object[] arra...
    method SimpleArrayMap (line 212) | public SimpleArrayMap() {
    method SimpleArrayMap (line 221) | public SimpleArrayMap(int capacity) {
    method SimpleArrayMap (line 234) | public SimpleArrayMap(SimpleArrayMap map) {
    method clear (line 244) | public void clear() {
    method ensureCapacity (line 257) | public void ensureCapacity(int minimumCapacity) {
    method containsKey (line 276) | public boolean containsKey(Object key) {
    method indexOfKey (line 286) | public int indexOfKey(Object key) {
    method indexOfValue (line 290) | int indexOfValue(Object value) {
    method containsValue (line 316) | public boolean containsValue(Object value) {
    method get (line 326) | public V get(Object key) {
    method keyAt (line 336) | public K keyAt(int index) {
    method valueAt (line 345) | public V valueAt(int index) {
    method setValueAt (line 355) | public V setValueAt(int index, V value) {
    method isEmpty (line 365) | public boolean isEmpty() {
    method put (line 377) | public V put(K key, V value) {
    method putAll (line 432) | public void putAll(SimpleArrayMap<? extends K, ? extends V> array) {
    method remove (line 454) | public V remove(Object key) {
    method removeAt (line 468) | public V removeAt(int index) {
    method size (line 522) | public int size() {
    method equals (line 534) | @Override
    method hashCode (line 571) | @Override
    method toString (line 590) | @Override

FILE: replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/utils/pkg/PackageFilesUtil.java
  class PackageFilesUtil (line 42) | public class PackageFilesUtil {
    method openLatestInputFile (line 51) | public static InputStream openLatestInputFile(Context c, String filena...
    method getLatestFileTimestamp (line 95) | public static long getLatestFileTimestamp(Context c, String filename) {
    method isFileUpdated (line 109) | public static boolean isFileUpdated(Context c, String filename) {
    method getFileTimestamp (line 125) | public static long getFileTimestamp(Context c, String filename) {
    method getBundleTimestamp (line 141) | public static long getBundleTimestamp(Context c, String filename) {
    method getTimestampFromStream (line 156) | private static long getTimestampFromStream(InputStream fis) {
    method isExtractedFromAssetsToFiles (line 188) | public static boolean isExtractedFromAssetsToFiles(Context c, String f...
    method compareDataFileVersion (line 200) | private static boolean compareDataFileVersion(Context c, String fileNa...
    method forceDelete (line 280) | public static void forceDelete(PluginInfo info) {

FILE: replugin-plugin-library/replugin-plugin-lib/src/main/java/com/qihoo360/replugin/Entry.java
  class Entry (line 29) | public class Entry {
    method create (line 37) | public static final IBinder create(Context context, ClassLoader cl, IB...

FILE: replugin-plugin-library/replugin-plugin-lib/src/main/java/com/qihoo360/replugin/MethodInvoker.java
  class MethodInvoker (line 30) | public class MethodInvoker {
    method MethodInvoker (line 48) | public MethodInvoker(ClassLoader loader, String className, String meth...
    method call (line 58) | public Object call(Object methodReceiver, Object... methodParamValues) {
    method getClassLoader (line 84) | public ClassLoader getClassLoader() {
    method isAvailable (line 88) | public boolean isAvailable() {

FILE: replugin-plugin-library/replugin-plugin-lib/src/main/java/com/qihoo360/replugin/RePlugin.java
  class RePlugin (line 51) | public class RePlugin {
    method install (line 81) | public static PluginInfo install(String path) {
    method preload (line 110) | public static boolean preload(String pluginName) {
    method preload (line 143) | public static boolean preload(PluginInfo pi) {
    method startActivity (line 176) | public static boolean startActivity(Context context, Intent intent) {
    method startActivity (line 205) | public static boolean startActivity(Context context, Intent intent, St...
    method startActivityForResult (line 233) | public static boolean startActivityForResult(Activity activity, Intent...
    method startActivityForResult (line 262) | public static boolean startActivityForResult(Activity activity, Intent...
    method createIntent (line 299) | public static Intent createIntent(String pluginName, String cls) {
    method createComponentName (line 323) | public static ComponentName createComponentName(String pluginName, Str...
    method isForDev (line 348) | public static boolean isForDev() {
    method getVersion (line 373) | public static String getVersion() {
    method getSDKVersion (line 396) | public static String getSDKVersion() {
    method fetchPackageInfo (line 410) | public static PackageInfo fetchPackageInfo(String pluginName) {
    method fetchResources (line 436) | public static Resources fetchResources(String pluginName) {
    method fetchClassLoader (line 461) | public static ClassLoader fetchClassLoader(String pluginName) {
    method fetchContext (line 486) | public static Context fetchContext(String pluginName) {
    method fetchBinder (line 519) | public static IBinder fetchBinder(String pluginName, String module, St...
    method fetchBinder (line 550) | public static IBinder fetchBinder(String pluginName, String module) {
    method fetchPluginNameByClassLoader (line 575) | public static String fetchPluginNameByClassLoader(ClassLoader cl) {
    method fetchResourceIdByName (line 604) | public static int fetchResourceIdByName(String pluginName, String resT...
    method fetchViewByLayoutName (line 623) | public static <T extends View> T fetchViewByLayoutName(String pluginNa...
    method getPluginInfoList (line 636) | public static List<PluginInfo> getPluginInfoList() {
    method getPluginInfo (line 670) | public static PluginInfo getPluginInfo(String name) {
    method getPluginVersion (line 698) | public static int getPluginVersion(String name) {
    method isPluginInstalled (line 725) | public static boolean isPluginInstalled(String pluginName) {
    method isPluginUsed (line 752) | public static boolean isPluginUsed(String pluginName) {
    method isPluginDexExtracted (line 778) | public static boolean isPluginDexExtracted(String pluginName) {
    method isPluginRunning (line 804) | public static boolean isPluginRunning(String pluginName) {
    method isPluginRunningInProcess (line 831) | public static boolean isPluginRunningInProcess(String pluginName, Stri...
    method getRunningPlugins (line 857) | public static PluginRunningList getRunningPlugins() {
    method getRunningProcessesByPlugin (line 886) | public static String[] getRunningProcessesByPlugin(String pluginName) {
    method isCurrentPersistentProcess (line 908) | public static boolean isCurrentPersistentProcess() {
    method registerInstalledReceiver (line 939) | public static void registerInstalledReceiver(Context context, Broadcas...
    method registerGlobalBinder (line 959) | public static boolean registerGlobalBinder(String name, IBinder binder) {
    method registerGlobalBinderDelayed (line 989) | public static boolean registerGlobalBinderDelayed(String name, IBinder...
    method unregisterGlobalBinder (line 1017) | public static boolean unregisterGlobalBinder(String name) {
    method getGlobalBinder (line 1036) | public static IBinder getGlobalBinder(String name) {
    method registerHookingClass (line 1083) | public static void registerHookingClass(String source, ComponentName t...
    method isHookingClass (line 1097) | public static boolean isHookingClass(ComponentName component) {
    method unregisterHookingClass (line 1124) | public static void unregisterHookingClass(String source) {
    method registerPluginBinder (line 1138) | public static void registerPluginBinder(String name, IBinder binder) {
    method getHostContext (line 1146) | public static Context getHostContext() {
    method getHostClassLoader (line 1154) | public static ClassLoader getHostClassLoader() {
    method getPluginContext (line 1162) | public static Context getPluginContext() {
    method isHostInitialized (line 1170) | public static boolean isHostInitialized() {
    method dump (line 1182) | public static void dump(FileDescriptor fd, PrintWriter writer, String[...
    class ProxyRePluginVar (line 1196) | static class ProxyRePluginVar {
      method initLocked (line 1274) | static void initLocked(final ClassLoader classLoader) {

FILE: replugin-plugin-library/replugin-plugin-lib/src/main/java/com/qihoo360/replugin/RePluginCompat.java
  class RePluginCompat (line 43) | class RePluginCompat {
    method fetchResourceIdByName (line 48) | static int fetchResourceIdByName(String pluginName, String resTypeAndN...
    method fetchViewByLayoutName (line 76) | public static <T extends View> T fetchViewByLayoutName(String pluginNa...

FILE: replugin-plugin-library/replugin-plugin-lib/src/main/java/com/qihoo360/replugin/RePluginEnv.java
  class RePluginEnv (line 28) | public class RePluginEnv {
    method init (line 41) | static void init(Context context, ClassLoader cl, IBinder manager) {
    method getHostContext (line 60) | public static Context getHostContext() {
    method getHostCLassLoader (line 70) | public static ClassLoader getHostCLassLoader() {
    method getPluginContext (line 78) | public static Context getPluginContext() {

FILE: replugin-plugin-library/replugin-plugin-lib/src/main/java/com/qihoo360/replugin/RePluginFramework.java
  class RePluginFramework (line 31) | public class RePluginFramework {
    method init (line 50) | public static boolean init(ClassLoader cl) {
    method isHostInitialized (line 59) | public static boolean isHostInitialized() {
    method initLocked (line 63) | private static boolean initLocked(ClassLoader cl) {

FILE: replugin-plugin-library/replugin-plugin-lib/src/main/java/com/qihoo360/replugin/RePluginInternal.java
  class RePluginInternal (line 40) | public class RePluginInternal {
    method createActivityContext (line 51) | public static Context createActivityContext(Activity activity, Context...
    method handleActivityCreateBefore (line 73) | public static void handleActivityCreateBefore(Activity activity, Bundl...
    method handleActivityCreate (line 87) | public static void handleActivityCreate(Activity activity, Bundle save...
    method handleActivityDestroy (line 100) | public static void handleActivityDestroy(Activity activity) {
    method handleRestoreInstanceState (line 114) | public static void handleRestoreInstanceState(Activity activity, Bundl...
    method startActivity (line 130) | public static boolean startActivity(Activity activity, Intent intent) {
    method startActivityForResult (line 158) | public static boolean startActivityForResult(Activity activity, Intent...
    method startActivityForResult (line 171) | public static boolean startActivityForResult(Activity activity, Intent...
    method startActivityForResultCompat (line 194) | private static boolean startActivityForResultCompat(Activity activity,...
    method loadPluginActivity (line 235) | public static ComponentName loadPluginActivity(Intent intent, String p...
    method getPluginName (line 254) | private static String getPluginName(Activity activity, Intent intent) {
    class ProxyRePluginInternalVar (line 267) 
Condensed preview — 560 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,376K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "chars": 304,
    "preview": "#### 问题详细描述 Detailed description of the problem\n\n\n#### 复现问题步骤 Steps to reproduce the problem\n1. \n2. \n\n#### 其它重要信息 Other "
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 111,
    "preview": "#### 要解决的问题 Describe the problem to be solved\n1.\n2.\n\n#### 要解决的Issue编号(可多个) Associated issue number (multiple)\n#"
  },
  {
    "path": ".gitignore",
    "chars": 3624,
    "preview": "# --------\n# Git Global Ignores\n# Power By github/gitignore (License: CC0 1.0)\n# Collect by RePlugin Team\n# --------\n\n\n#"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 1329,
    "preview": "欢迎关注和使用RePlugin。为了让解决问题、贡献代码的效率更高,请务必按照下面流程来做。\n\n## 有关Issue\n\n如果遇到接入上的问题,请随时提出**【有效的】**Issue。\n\n#### 如果是问题反馈\n\n> 出于效率考虑,请**务"
  },
  {
    "path": "LICENSE",
    "chars": 11352,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README.md",
    "chars": 9399,
    "preview": "<p align=\"center\">\n  <a href=\"https://github.com/Qihoo360/RePlugin/wiki\">\n    <img alt=\"RePlugin Logo\" src=\"https://gith"
  },
  {
    "path": "README_CN.md",
    "chars": 8059,
    "preview": "<p align=\"center\">\n  <a href=\"https://github.com/Qihoo360/RePlugin/wiki\">\n    <img alt=\"RePlugin Logo\" src=\"https://gith"
  },
  {
    "path": "deploy.sh",
    "chars": 1996,
    "preview": "#!/bin/bash\n\nexport RP_BASE_DIR=$(cd \"$(dirname \"$0\")\"; pwd)\n\nexport TARGET_PROJECTS=(\nreplugin-host-gradle\nreplugin-hos"
  },
  {
    "path": "replugin-host-gradle/README.md",
    "chars": 336,
    "preview": "# RePlugin Host Gradle\n\nRePlugin Host Gradle是一个Gradle插件,由 **主程序** 负责引入。\n\n该Gradle插件主要负责在主程序的编译期中做一些事情,此外,开发者可通过修改其属性而做一些自"
  },
  {
    "path": "replugin-host-gradle/build.gradle",
    "chars": 1215,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-gradle/gradle/wrapper/gradle-wrapper.properties",
    "chars": 818,
    "preview": "#\n# Copyright (C) 2005-2017 Qihoo 360 Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may n"
  },
  {
    "path": "replugin-host-gradle/gradle.properties",
    "chars": 1318,
    "preview": "#\n# Copyright (C) 2005-2017 Qihoo 360 Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may n"
  },
  {
    "path": "replugin-host-gradle/gradlew",
    "chars": 4971,
    "preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start "
  },
  {
    "path": "replugin-host-gradle/gradlew.bat",
    "chars": 2314,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
  },
  {
    "path": "replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/compat/ScopeCompat.groovy",
    "chars": 1324,
    "preview": "package com.qihoo360.replugin.gradle.compat\n\n/**\n * @author hyongbai\n */\nclass ScopeCompat {\n    static def getAdbExecut"
  },
  {
    "path": "replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/compat/VariantCompat.groovy",
    "chars": 1138,
    "preview": "package com.qihoo360.replugin.gradle.compat\n\nimport org.gradle.api.Task\n\n/**\n * @author hyongbai\n */\nclass VariantCompat"
  },
  {
    "path": "replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/AppConstant.groovy",
    "chars": 1276,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/RePlugin.groovy",
    "chars": 13968,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/creator/FileCreators.groovy",
    "chars": 1991,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/creator/IFileCreator.groovy",
    "chars": 900,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/creator/impl/java/RePluginHostConfigCreator.groovy",
    "chars": 4738,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/creator/impl/json/PluginBuiltinJsonCreator.groovy",
    "chars": 3482,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/creator/impl/json/PluginInfo.groovy",
    "chars": 945,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/creator/impl/json/PluginInfoParser.groovy",
    "chars": 3836,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-gradle/src/main/groovy/com/qihoo360/replugin/gradle/host/handlemanifest/ComponentsGenerator.groovy",
    "chars": 33316,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-gradle/src/main/resources/META-INF/gradle-plugins/replugin-host-gradle.properties",
    "chars": 651,
    "preview": "#\n# Copyright (C) 2005-2017 Qihoo 360 Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may n"
  },
  {
    "path": "replugin-host-library/README.md",
    "chars": 202,
    "preview": "# RePlugin Host Library\n\nRePlugin Host Library是一个Java工程,由 **主程序** 负责引入。\n\n几乎所有和RePlugin相关的代码都在其中,是核心工程。\n\n开发者需要依赖此Library,"
  },
  {
    "path": "replugin-host-library/build.gradle",
    "chars": 940,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/gradle/wrapper/gradle-wrapper.properties",
    "chars": 818,
    "preview": "#\n# Copyright (C) 2005-2017 Qihoo 360 Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may n"
  },
  {
    "path": "replugin-host-library/gradle.properties",
    "chars": 1393,
    "preview": "#\n# Copyright (C) 2005-2017 Qihoo 360 Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may n"
  },
  {
    "path": "replugin-host-library/gradlew",
    "chars": 4971,
    "preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start "
  },
  {
    "path": "replugin-host-library/gradlew.bat",
    "chars": 2314,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
  },
  {
    "path": "replugin-host-library/replugin-host-lib/bintray.gradle",
    "chars": 2667,
    "preview": "apply plugin: 'maven-publish'\napply plugin: 'com.jfrog.bintray'\n\ndef siteUrl = ''\ndef gitUrl = ''\n\ngroup = 'com.qihoo360"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/build.gradle",
    "chars": 1446,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/replugin-rules.pro",
    "chars": 3838,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in ./"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/AndroidManifest.xml",
    "chars": 9948,
    "preview": "<!--\n  ~ Copyright (C) 2005-2017 Qihoo 360 Inc.\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\"); "
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/loader2/IPlugin.aidl",
    "chars": 119,
    "preview": "package com.qihoo360.loader2;\n\n/**\n * @author RePlugin Team\n */\ninterface IPlugin {\n\n    IBinder query(String name);\n}\n"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/loader2/IPluginClient.aidl",
    "chars": 956,
    "preview": "package com.qihoo360.loader2;\n\nimport com.qihoo360.replugin.component.service.server.IPluginServiceServer;\n\n/**\n * @auth"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/loader2/IPluginHost.aidl",
    "chars": 2985,
    "preview": "package com.qihoo360.loader2;\n\nimport android.content.IntentFilter;\nimport android.content.Intent;\n\nimport com.qihoo360."
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/loader2/PluginBinderInfo.aidl",
    "chars": 59,
    "preview": "package com.qihoo360.loader2;\n\nparcelable PluginBinderInfo;"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/loader2/mgr/IServiceConnection.aidl",
    "chars": 256,
    "preview": "// IServiceConnection.aidl\n// Same as android.app.IServiceConnection\npackage com.qihoo360.loader2.mgr;\n\nimport android.c"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/loader2/sp/IPref.aidl",
    "chars": 272,
    "preview": "package com.qihoo360.loader2.sp;\n\nimport android.os.Bundle;\n\n/**\n * @author RePlugin Team\n */\ninterface IPref {\n\n    Str"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/mobilesafe/svcmanager/IServiceChannel.aidl",
    "chars": 508,
    "preview": "package com.qihoo360.mobilesafe.svcmanager;\n\nimport com.qihoo360.replugin.IBinderGetter;\n\ninterface IServiceChannel {\n\n "
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/replugin/IBinderGetter.aidl",
    "chars": 249,
    "preview": "package com.qihoo360.replugin;\n\n/**\n * Binder的获取器,可用于延迟加载IBinder的情况。\n * <p>\n * 目前用于:\n * <p>\n * * RePlugin.registerGlobal"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/replugin/component/service/server/IPluginServiceServer.aidl",
    "chars": 608,
    "preview": "package com.qihoo360.replugin.component.service.server;\n\nimport android.content.ComponentName;\nimport android.os.Messeng"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/replugin/model/PluginInfo.aidl",
    "chars": 60,
    "preview": "package com.qihoo360.replugin.model;\n\nparcelable PluginInfo;"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/replugin/packages/IPluginManagerServer.aidl",
    "chars": 2413,
    "preview": "package com.qihoo360.replugin.packages;\n\nimport com.qihoo360.replugin.model.PluginInfo;\nimport com.qihoo360.replugin.pac"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/aidl/com/qihoo360/replugin/packages/PluginRunningList.aidl",
    "chars": 70,
    "preview": "package com.qihoo360.replugin.packages;\n\nparcelable PluginRunningList;"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/i/Factory.java",
    "chars": 11824,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/i/Factory2.java",
    "chars": 6733,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/i/IModule.java",
    "chars": 930,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/i/IPlugin.java",
    "chars": 877,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/i/IPluginManager.java",
    "chars": 1621,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils/LocalBroadcastManager.java",
    "chars": 3249,
    "preview": "package com.qihoo360.loader.utils;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport and"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils/PackageUtils.java",
    "chars": 1383,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils/PatchClassLoaderUtils.java",
    "chars": 3670,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils/ProcessLocker.java",
    "chars": 6245,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils/StringUtils.java",
    "chars": 2026,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils/SysUtils.java",
    "chars": 1765,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader/utils2/FilePermissionUtils.java",
    "chars": 3687,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/BinderCursor.java",
    "chars": 3156,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/BuildCompat.java",
    "chars": 2737,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/Builder.java",
    "chars": 8947,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/CertUtils.java",
    "chars": 3153,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/Constant.java",
    "chars": 3290,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/DumpUtils.java",
    "chars": 1806,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/Finder.java",
    "chars": 2509,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/FinderBuiltin.java",
    "chars": 3262,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/LaunchModeStates.java",
    "chars": 5711,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/Loader.java",
    "chars": 26523,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/MP.java",
    "chars": 13644,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PMF.java",
    "chars": 5673,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/Plugin.java",
    "chars": 31484,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginBinderInfo.java",
    "chars": 2231,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginCommImpl.java",
    "chars": 17574,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginContainers.java",
    "chars": 31817,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginContext.java",
    "chars": 20020,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginDesc.java",
    "chars": 5618,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginIntent.java",
    "chars": 4287,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginLibraryInternalProxy.java",
    "chars": 28360,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginManager.java",
    "chars": 4617,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginNativeLibsHelper.java",
    "chars": 6507,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginProcessMain.java",
    "chars": 26552,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginProcessPer.java",
    "chars": 11414,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginProviderStub.java",
    "chars": 7144,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginStatusController.java",
    "chars": 6521,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PluginTable.java",
    "chars": 4982,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PmBase.java",
    "chars": 46849,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/PmHostSvc.java",
    "chars": 23150,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/ProcessStates.java",
    "chars": 962,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/StubProcessManager.java",
    "chars": 17324,
    "preview": "package com.qihoo360.loader2;\n\nimport android.app.ActivityManager;\nimport android.os.IBinder;\nimport android.text.TextUt"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/TaskAffinityStates.java",
    "chars": 5310,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/V5FileInfo.java",
    "chars": 15925,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/V5Finder.java",
    "chars": 3254,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/VMRuntimeCompat.java",
    "chars": 2875,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/alc/ActivityController.java",
    "chars": 11204,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/alc/IActivityWatcher.java",
    "chars": 2864,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/mgr/PluginProviderClient.java",
    "chars": 5866,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/mgr/PluginServiceClient.java",
    "chars": 2115,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/loader2/sp/PrefImpl.java",
    "chars": 2371,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/api/AppVar.java",
    "chars": 811,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/api/IPC.java",
    "chars": 3761,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/api/Intents.java",
    "chars": 2700,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/api/Pref.java",
    "chars": 2336,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/api/Tasks.java",
    "chars": 2649,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/loader/a/DummyActivity.java",
    "chars": 1616,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/loader/p/DummyProvider.java",
    "chars": 1530,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/loader/s/DummyService.java",
    "chars": 899,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/parser/manifest/ManifestParser.java",
    "chars": 11301,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/parser/manifest/XmlHandler.java",
    "chars": 7074,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/parser/manifest/bean/ComponentBean.java",
    "chars": 1003,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/parser/manifest/bean/DataBean.java",
    "chars": 1618,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/svcmanager/ParcelBinder.java",
    "chars": 1657,
    "preview": "\n/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you "
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/svcmanager/PluginServiceManager.java",
    "chars": 4749,
    "preview": "\n/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you "
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/svcmanager/PluginServiceRecord.java",
    "chars": 6162,
    "preview": "\n/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you "
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/svcmanager/PluginServiceReferenceManager.java",
    "chars": 4431,
    "preview": "\n/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you "
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/svcmanager/QihooServiceManager.java",
    "chars": 9523,
    "preview": "\n/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you "
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/svcmanager/ServiceChannelCursor.java",
    "chars": 1879,
    "preview": "\n/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you "
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/svcmanager/ServiceChannelImpl.java",
    "chars": 4724,
    "preview": "\n/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you "
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/svcmanager/ServiceProvider.java",
    "chars": 2264,
    "preview": "\n/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you "
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/mobilesafe/svcmanager/ServiceWrapper.java",
    "chars": 5612,
    "preview": "\n/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you "
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ContextInjector.java",
    "chars": 1879,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/DefaultRePluginCallbacks.java",
    "chars": 446,
    "preview": "package com.qihoo360.replugin;\n\nimport android.content.Context;\n\n/**\n * @deprecated Use RePluginCallbacks instead\n * @se"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/DefaultRePluginEventCallbacks.java",
    "chars": 486,
    "preview": "package com.qihoo360.replugin;\n\nimport android.content.Context;\n\n/**\n * @deprecated Use RePluginEventCallbacks instead\n "
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/IHostBinderFetcher.java",
    "chars": 1009,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/PluginDexClassLoader.java",
    "chars": 12662,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/PluginDexClassLoaderPatch.java",
    "chars": 1769,
    "preview": "package com.qihoo360.replugin;\n\n/**\n * PluginDexClassLoader's Patch\n *\n * @author RePlugin Team\n */\npublic class PluginD"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePlugin.java",
    "chars": 34647,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePluginApplication.java",
    "chars": 2565,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePluginCallbacks.java",
    "chars": 5751,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePluginClassLoader.java",
    "chars": 8619,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePluginConfig.java",
    "chars": 9261,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePluginConstants.java",
    "chars": 2565,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePluginEventCallbacks.java",
    "chars": 2688,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/RePluginInternal.java",
    "chars": 1374,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/base/AMSUtils.java",
    "chars": 1386,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/base/IPC.java",
    "chars": 9986,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/base/LocalBroadcastHelper.java",
    "chars": 1753,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/base/ThreadUtils.java",
    "chars": 2589,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/ComponentList.java",
    "chars": 10506,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/activity/ActivityInjector.java",
    "chars": 6367,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/activity/DynamicClassProxyActivity.java",
    "chars": 2125,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/app/PluginApplicationClient.java",
    "chars": 9618,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/dummy/DummyActivity.java",
    "chars": 1762,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/dummy/DummyProvider.java",
    "chars": 1751,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/dummy/DummyReceiver.java",
    "chars": 1483,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/dummy/DummyService.java",
    "chars": 1219,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/dummy/ForwardActivity.java",
    "chars": 1622,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/process/PluginProcessHost.java",
    "chars": 2996,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/process/ProcessPitProviderBase.java",
    "chars": 2764,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/process/ProcessPitProviderLoader0.java",
    "chars": 762,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/process/ProcessPitProviderLoader1.java",
    "chars": 762,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/process/ProcessPitProviderP0.java",
    "chars": 756,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/process/ProcessPitProviderP1.java",
    "chars": 756,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/process/ProcessPitProviderP2.java",
    "chars": 756,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/process/ProcessPitProviderPersist.java",
    "chars": 2024,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/process/ProcessPitProviderUI.java",
    "chars": 757,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/provider/PluginPitProviderBase.java",
    "chars": 4849,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/provider/PluginPitProviderP0.java",
    "chars": 922,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/provider/PluginPitProviderP1.java",
    "chars": 922,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/provider/PluginPitProviderP2.java",
    "chars": 919,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/provider/PluginPitProviderPersist.java",
    "chars": 902,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/provider/PluginPitProviderUI.java",
    "chars": 892,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/provider/PluginProviderClient.java",
    "chars": 13131,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/provider/PluginProviderClient2.java",
    "chars": 3957,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/provider/PluginProviderHelper.java",
    "chars": 6561,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/receiver/PluginReceiverHelper.java",
    "chars": 3412,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/receiver/PluginReceiverProxy.java",
    "chars": 5225,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/PluginServiceClient.java",
    "chars": 12089,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/PluginServiceDispatcherManager.java",
    "chars": 4925,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/PluginServiceServerFetcher.java",
    "chars": 3788,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/ServiceDispatcher.java",
    "chars": 8410,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/server/ConnectionBindRecord.java",
    "chars": 2802,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/server/IntentBindRecord.java",
    "chars": 2707,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/server/PluginPitService.java",
    "chars": 2152,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/server/PluginServiceServer.java",
    "chars": 25709,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/server/ProcessBindRecord.java",
    "chars": 1563,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/server/ProcessRecord.java",
    "chars": 1593,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/service/server/ServiceRecord.java",
    "chars": 3712,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/utils/ApkCommentReader.java",
    "chars": 3885,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/utils/IntentMatcherHelper.java",
    "chars": 4254,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/component/utils/PluginClientHelper.java",
    "chars": 5153,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/debugger/DebuggerReceivers.java",
    "chars": 8735,
    "preview": "/*\n * Copyright (C) 2005-2017 Qihoo 360 Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you m"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/AbstractApkParser.java",
    "chars": 3234,
    "preview": "/*\n * Copyright (c) 2016, Liu Dong\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/ApkParser.java",
    "chars": 3162,
    "preview": "/*\n * Copyright (c) 2016, Liu Dong\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/exception/ParserException.java",
    "chars": 1599,
    "preview": "/*\n * Copyright (c) 2016, Liu Dong\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/parser/BinaryXmlParser.java",
    "chars": 12160,
    "preview": "/*\n * Copyright (c) 2016, Liu Dong\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/parser/StringPoolEntry.java",
    "chars": 1906,
    "preview": "/*\n * Copyright (c) 2016, Liu Dong\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/parser/XmlNamespaces.java",
    "chars": 4395,
    "preview": "/*\n * Copyright (c) 2016, Liu Dong\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/parser/XmlStreamer.java",
    "chars": 2011,
    "preview": "/*\n * Copyright (c) 2016, Liu Dong\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/parser/XmlTranslator.java",
    "chars": 4896,
    "preview": "/*\n * Copyright (c) 2016, Liu Dong\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/ChunkHeader.java",
    "chars": 3219,
    "preview": "/*\n * Copyright (c) 2016, Liu Dong\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/ChunkType.java",
    "chars": 2645,
    "preview": "/*\n * Copyright (c) 2016, Liu Dong\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/ResourceValue.java",
    "chars": 2848,
    "preview": "/*\n * Copyright (c) 2016, Liu Dong\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/StringPool.java",
    "chars": 1740,
    "preview": "/*\n * Copyright (c) 2016, Liu Dong\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/StringPoolHeader.java",
    "chars": 3132,
    "preview": "/*\n * Copyright (c) 2016, Liu Dong\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/xml/Attribute.java",
    "chars": 2498,
    "preview": "/*\n * Copyright (c) 2016, Liu Dong\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/xml/Attributes.java",
    "chars": 2832,
    "preview": "/*\n * Copyright (c) 2016, Liu Dong\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/xml/NullHeader.java",
    "chars": 1697,
    "preview": "/*\n * Copyright (c) 2016, Liu Dong\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with"
  },
  {
    "path": "replugin-host-library/replugin-host-lib/src/main/java/com/qihoo360/replugin/ext/parser/struct/xml/XmlHeader.java",
    "chars": 1783,
    "preview": "/*\n * Copyright (c) 2016, Liu Dong\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with"
  }
]

// ... and 360 more files (download for full content)

About this extraction

This page contains the full source code of the Qihoo360/RePlugin GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 560 files (2.1 MB), approximately 594.7k tokens, and a symbol index with 2870 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!