Copy disabled (too large)
Download .txt
Showing preview only (10,918K chars total). Download the full file to get everything.
Repository: didi/DoKit
Branch: master
Commit: 626827cddb2f
Files: 3038
Total size: 9.7 MB
Directory structure:
gitextract_2kvtefj7/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ └── -dokit-------------.md
│ └── issue_template.md
├── .gitignore
├── Android/
│ ├── .editorconfig
│ ├── .gitignore
│ ├── README.md
│ ├── app/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── doraemonkit.gradle
│ │ ├── keystore/
│ │ │ └── test.keystore
│ │ ├── libs/
│ │ │ └── BaiduLBS_Android.jar
│ │ ├── proguard-rules.pro
│ │ └── src/
│ │ ├── androidTest/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── didichuxing/
│ │ │ └── doraemondemo/
│ │ │ └── ExampleInstrumentedTest.java
│ │ ├── debug/
│ │ │ └── java/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── com/
│ │ │ └── didichuxing/
│ │ │ └── doraemondemo/
│ │ │ ├── AopApp.java
│ │ │ ├── App.kt
│ │ │ └── amap/
│ │ │ ├── AMapUtil.java
│ │ │ ├── ChString.java
│ │ │ ├── DrivingRouteOverLay.java
│ │ │ ├── FloatGpsMockRouteKitView.java
│ │ │ ├── FloatGpsPresetMockKit.java
│ │ │ ├── FloatGpsPresetMockKitView.java
│ │ │ ├── RouteOverlay.java
│ │ │ └── mockroute/
│ │ │ ├── BearingUtils.java
│ │ │ ├── LogUtils.java
│ │ │ ├── MockGPSTaskData.java
│ │ │ └── MockGPSTaskManager.java
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── didichuxing/
│ │ │ │ └── doraemondemo/
│ │ │ │ ├── AopTest.java
│ │ │ │ ├── BaseStatusBarActivity.java
│ │ │ │ ├── DataBaseActivity.kt
│ │ │ │ ├── EmptyActivity.kt
│ │ │ │ ├── MainDoKitActivity.kt
│ │ │ │ ├── WebViewSystemActivity.kt
│ │ │ │ ├── WebViewX5Activity.kt
│ │ │ │ ├── amap/
│ │ │ │ │ ├── AMapRouterFragment.kt
│ │ │ │ │ ├── DefaultNaviListener.kt
│ │ │ │ │ └── NaviRouteOverlay.kt
│ │ │ │ ├── comm/
│ │ │ │ │ ├── CommBaseFragment.kt
│ │ │ │ │ ├── CommFragmentActivity.kt
│ │ │ │ │ ├── CommLauncher.kt
│ │ │ │ │ └── CommViewModel.kt
│ │ │ │ ├── db/
│ │ │ │ │ ├── DatabaseHelper.kt
│ │ │ │ │ └── PersonDBHelper.java
│ │ │ │ ├── dokit/
│ │ │ │ │ ├── BorderDoKitView.java
│ │ │ │ │ ├── CustomDokitFragment.kt
│ │ │ │ │ ├── DemoDoKitView.kt
│ │ │ │ │ ├── DemoKit.kt
│ │ │ │ │ ├── SimpleDoKitView.java
│ │ │ │ │ ├── TestSimpleDoKitFloatView.kt
│ │ │ │ │ ├── TestSimpleDokitFloatViewKit.kt
│ │ │ │ │ ├── TestSimpleDokitFragmentKit.kt
│ │ │ │ │ └── ViewSetupHelper.java
│ │ │ │ ├── mc/
│ │ │ │ │ ├── DoKitButton.kt
│ │ │ │ │ ├── DoKitRecycleView.kt
│ │ │ │ │ ├── DoKitWebView.kt
│ │ │ │ │ ├── FileUtils.java
│ │ │ │ │ ├── MCActivity.kt
│ │ │ │ │ ├── MyProxyWebView.java
│ │ │ │ │ ├── MyTestWebView.java
│ │ │ │ │ ├── MyTestWebViewBuilder.java
│ │ │ │ │ ├── NetMainActivity.kt
│ │ │ │ │ ├── RVAdapter.kt
│ │ │ │ │ ├── SlideBar.java
│ │ │ │ │ ├── VPAdapter.kt
│ │ │ │ │ ├── VpFragment.kt
│ │ │ │ │ └── WebViewActivity.kt
│ │ │ │ ├── module/
│ │ │ │ │ ├── CrashTest.kt
│ │ │ │ │ ├── DoKitItemView.java
│ │ │ │ │ ├── MethodCostTest.kt
│ │ │ │ │ ├── ModuleActivity.java
│ │ │ │ │ ├── ShadowDrawable.java
│ │ │ │ │ ├── bigbitmap/
│ │ │ │ │ │ └── BigBitmapActivity.kt
│ │ │ │ │ ├── db/
│ │ │ │ │ │ └── DataBaseTest.kt
│ │ │ │ │ ├── http/
│ │ │ │ │ │ ├── CustomInterceptor.kt
│ │ │ │ │ │ ├── FileUploadTest.kt
│ │ │ │ │ │ ├── OkHttpMock.kt
│ │ │ │ │ │ ├── RetrofitMock.kt
│ │ │ │ │ │ └── URLConnectionMock.kt
│ │ │ │ │ ├── leak/
│ │ │ │ │ │ └── LeakActivity.kt
│ │ │ │ │ └── retrofit/
│ │ │ │ │ ├── GithubService.kt
│ │ │ │ │ └── GithubUserInfo.kt
│ │ │ │ ├── old/
│ │ │ │ │ ├── BaseActivity.kt
│ │ │ │ │ ├── MainAdapter.kt
│ │ │ │ │ ├── MainDebugActivityOkhttpV3.kt
│ │ │ │ │ ├── MainDebugActivityOkhttpV4.kt
│ │ │ │ │ ├── MapActivity.kt
│ │ │ │ │ └── MapShowingLocationActivity.kt
│ │ │ │ └── test/
│ │ │ │ ├── ScreenRecordingService.java
│ │ │ │ ├── ScreenRecordingTest.java
│ │ │ │ └── screen/
│ │ │ │ └── ScreenRecordingDoKitView.kt
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ ├── bg_unlock_bar_btn_normal_v5.xml
│ │ │ │ ├── bg_unlock_bar_normal_v5.xml
│ │ │ │ ├── dk_btn_background.xml
│ │ │ │ ├── dk_info_background.xml
│ │ │ │ ├── dk_line_divider.xml
│ │ │ │ ├── dk_shape_float_view_bg.xml
│ │ │ │ └── ic_launcher_background.xml
│ │ │ ├── drawable-v24/
│ │ │ │ └── ic_launcher_foreground.xml
│ │ │ ├── layout/
│ │ │ │ ├── activity_amap_path.xml
│ │ │ │ ├── activity_big_bitmap_mock.xml
│ │ │ │ ├── activity_comm.xml
│ │ │ │ ├── activity_dokit_main.xml
│ │ │ │ ├── activity_empty.xml
│ │ │ │ ├── activity_leak.xml
│ │ │ │ ├── activity_main.xml
│ │ │ │ ├── activity_map.xml
│ │ │ │ ├── activity_mc.xml
│ │ │ │ ├── activity_net_main.xml
│ │ │ │ ├── activity_normal_webview.xml
│ │ │ │ ├── activity_second.xml
│ │ │ │ ├── activity_webview.xml
│ │ │ │ ├── activity_ws.xml
│ │ │ │ ├── activity_x5_webview.xml
│ │ │ │ ├── dk_demo.xml
│ │ │ │ ├── dk_layout_simple_dokit_float_view.xml
│ │ │ │ ├── dk_screen_show_view.xml
│ │ │ │ ├── fragment_amap.xml
│ │ │ │ ├── fragment_vp.xml
│ │ │ │ ├── item_lv.xml
│ │ │ │ ├── item_main_rv.xml
│ │ │ │ ├── item_rv.xml
│ │ │ │ ├── item_sc.xml
│ │ │ │ ├── layout_demo_custom.xml
│ │ │ │ ├── layout_mock_location_preset.xml
│ │ │ │ ├── layout_mock_route.xml
│ │ │ │ ├── layout_slidebar.xml
│ │ │ │ └── view_dokit_item_view.xml
│ │ │ ├── values/
│ │ │ │ ├── atts.xml
│ │ │ │ ├── colors.xml
│ │ │ │ ├── dimens.xml
│ │ │ │ ├── strings.xml
│ │ │ │ └── styles.xml
│ │ │ ├── values-en-rUS/
│ │ │ │ └── strings.xml
│ │ │ ├── values-zh-rCN/
│ │ │ │ └── strings.xml
│ │ │ └── xml/
│ │ │ └── network_config.xml
│ │ ├── release/
│ │ │ └── java/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── com/
│ │ │ └── didichuxing/
│ │ │ └── doraemondemo/
│ │ │ └── App.kt
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── didichuxing/
│ │ └── doraemondemo/
│ │ ├── ExampleUnitTest.kt
│ │ ├── KotlinBaseUnitTest.kt
│ │ ├── KotlinCaseTest.kt
│ │ └── TestJava.java
│ ├── build.gradle
│ ├── buildSrc/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ └── src/
│ │ └── main/
│ │ ├── kotlin/
│ │ │ └── com/
│ │ │ └── didichuxing/
│ │ │ └── doraemonkit/
│ │ │ └── plugin/
│ │ │ ├── DoKitExt.kt
│ │ │ ├── DoKitExtUtil.kt
│ │ │ ├── DoKitPlugin.kt
│ │ │ ├── DoKitPluginUtil.kt
│ │ │ ├── DoKitTransformTaskExecutionListener.kt
│ │ │ ├── extension/
│ │ │ │ ├── BigImageExtension.kt
│ │ │ │ ├── DoKitExtension.kt
│ │ │ │ ├── GpsExtension.kt
│ │ │ │ ├── NetworkExtension.kt
│ │ │ │ ├── SlowMethodExtension.kt
│ │ │ │ └── WebViewExtension.kt
│ │ │ ├── processor/
│ │ │ │ ├── DoKitComponentHandler.kt
│ │ │ │ └── DoKitPluginConfigProcessor.kt
│ │ │ ├── stack_method/
│ │ │ │ ├── MethodStackNode.kt
│ │ │ │ └── MethodStackNodeUtil.kt
│ │ │ ├── thirdlib/
│ │ │ │ ├── ThirdLibInfo.kt
│ │ │ │ └── ThirdLibVariantProcessor.kt
│ │ │ └── transform/
│ │ │ ├── DoKitBaseTransform.kt
│ │ │ ├── DoKitCommonTransform.kt
│ │ │ ├── DoKitCommonTransformV34.kt
│ │ │ ├── DoKitDependTransform.kt
│ │ │ ├── DoKitDependTransformV34.kt
│ │ │ ├── DoKitTransformContext.kt
│ │ │ ├── DoKitTransformInvocation.kt
│ │ │ ├── asmtransform/
│ │ │ │ ├── BaseDoKitAsmTransformer.kt
│ │ │ │ └── DoKitAsmTransformer.kt
│ │ │ └── classtransform/
│ │ │ ├── AbsClassTransformer.kt
│ │ │ ├── BigImgClassTransformer.kt
│ │ │ ├── CommClassTransformer.kt
│ │ │ ├── EnterMSClassTransformer.kt
│ │ │ ├── GPSAMapClassTransformer.kt
│ │ │ ├── GPSBDClassTransformer.kt
│ │ │ ├── GPSClassTransformer.kt
│ │ │ ├── GPSTencentClassTransformer.kt
│ │ │ ├── GSMClassTransformer.kt
│ │ │ ├── MSDClassTransformer.kt
│ │ │ ├── Okhttp3ClassTransformer.kt
│ │ │ ├── ThirdLibsClassTransformer.kt
│ │ │ ├── UrlConnectionTransformer.kt
│ │ │ └── WebViewClassTransformer.kt
│ │ └── resources/
│ │ └── META-INF/
│ │ └── gradle-plugins/
│ │ └── com.didi.dokit.debug.properties
│ ├── config.gradle
│ ├── dokit/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── gradle.properties
│ │ ├── proguard-rules.pro
│ │ ├── src/
│ │ │ ├── androidTest/
│ │ │ │ └── java/
│ │ │ │ └── com/
│ │ │ │ └── didichuxing/
│ │ │ │ └── doraemonkit/
│ │ │ │ └── ExampleInstrumentedTest.java
│ │ │ ├── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── assets/
│ │ │ │ │ ├── dokit_system_kits.json
│ │ │ │ │ ├── h5help/
│ │ │ │ │ │ ├── dokit.js
│ │ │ │ │ │ ├── dokit_js_hook.html
│ │ │ │ │ │ └── dokit_js_vconsole_hook.html
│ │ │ │ │ └── map/
│ │ │ │ │ └── map.html
│ │ │ │ ├── cpp/
│ │ │ │ │ ├── CMakeLists.txt
│ │ │ │ │ ├── art.cpp
│ │ │ │ │ ├── art.h
│ │ │ │ │ └── main.cpp
│ │ │ │ ├── java/
│ │ │ │ │ └── com/
│ │ │ │ │ └── didichuxing/
│ │ │ │ │ └── doraemonkit/
│ │ │ │ │ ├── DebugFileProvider.java
│ │ │ │ │ ├── DoKit.kt
│ │ │ │ │ ├── DoKitActivityLifecycleCallbacks.kt
│ │ │ │ │ ├── DoKitCallBack.kt
│ │ │ │ │ ├── DoKitEnv.kt
│ │ │ │ │ ├── DoKitFragmentLifecycleCallbacks.kt
│ │ │ │ │ ├── DoKitOrientationEventListener.kt
│ │ │ │ │ ├── DoKitReal.kt
│ │ │ │ │ ├── DoraemonKit.kt
│ │ │ │ │ ├── aop/
│ │ │ │ │ │ ├── DokitPluginConfig.java
│ │ │ │ │ │ ├── DokitThirdLibInfo.java
│ │ │ │ │ │ ├── MethodCostUtil.kt
│ │ │ │ │ │ ├── OkHttpHook.java
│ │ │ │ │ │ ├── WebViewHook.java
│ │ │ │ │ │ ├── bigimg/
│ │ │ │ │ │ │ ├── coil/
│ │ │ │ │ │ │ │ ├── CoilHook.java
│ │ │ │ │ │ │ │ └── DokitCoilTransformation.java
│ │ │ │ │ │ │ ├── fresco/
│ │ │ │ │ │ │ │ ├── DokitFrescoPostprocessor.java
│ │ │ │ │ │ │ │ └── FrescoHook.java
│ │ │ │ │ │ │ ├── glide/
│ │ │ │ │ │ │ │ ├── DokitGlideRequestListener.java
│ │ │ │ │ │ │ │ ├── DokitGlideTransform.java
│ │ │ │ │ │ │ │ ├── GlideHook.java
│ │ │ │ │ │ │ │ └── GlideTransformHook.java
│ │ │ │ │ │ │ ├── imageloader/
│ │ │ │ │ │ │ │ ├── DokitImageLoadingListener.java
│ │ │ │ │ │ │ │ └── ImageLoaderHook.java
│ │ │ │ │ │ │ └── picasso/
│ │ │ │ │ │ │ ├── DokitPicassoTransformation.java
│ │ │ │ │ │ │ └── PicassoHook.java
│ │ │ │ │ │ ├── mc/
│ │ │ │ │ │ │ ├── DoKitListenerHelper.kt
│ │ │ │ │ │ │ └── DoKitProxyActivity.kt
│ │ │ │ │ │ ├── method_stack/
│ │ │ │ │ │ │ ├── MethodInvokNode.kt
│ │ │ │ │ │ │ ├── MethodStackBean.kt
│ │ │ │ │ │ │ ├── MethodStackUtil.kt
│ │ │ │ │ │ │ └── StaticMethodObject.kt
│ │ │ │ │ │ └── urlconnection/
│ │ │ │ │ │ ├── HttpUrlConnectionProxyUtil.java
│ │ │ │ │ │ ├── MyTrustManager.java
│ │ │ │ │ │ ├── ObsoleteUrlFactory.java
│ │ │ │ │ │ └── OkhttpClientUtil.kt
│ │ │ │ │ ├── config/
│ │ │ │ │ │ ├── AlignRulerConfig.java
│ │ │ │ │ │ ├── ColorPickConfig.java
│ │ │ │ │ │ ├── CrashCaptureConfig.java
│ │ │ │ │ │ ├── DokitMemoryConfig.java
│ │ │ │ │ │ ├── DokitSwitchConfig.java
│ │ │ │ │ │ ├── FloatIconConfig.java
│ │ │ │ │ │ ├── GlobalConfig.java
│ │ │ │ │ │ ├── GpsMockConfig.java
│ │ │ │ │ │ ├── LayoutBorderConfig.java
│ │ │ │ │ │ ├── LogInfoConfig.java
│ │ │ │ │ │ └── PerformanceSpInfoConfig.java
│ │ │ │ │ ├── constant/
│ │ │ │ │ │ ├── BroadcastAction.java
│ │ │ │ │ │ ├── BundleKey.java
│ │ │ │ │ │ ├── CachesKey.java
│ │ │ │ │ │ ├── DoKitModule.kt
│ │ │ │ │ │ ├── FragmentIndex.java
│ │ │ │ │ │ ├── PageTag.java
│ │ │ │ │ │ ├── RequestCode.java
│ │ │ │ │ │ ├── SharedPrefsKey.java
│ │ │ │ │ │ └── SpInputType.java
│ │ │ │ │ ├── datapick/
│ │ │ │ │ │ ├── DataPickBean.java
│ │ │ │ │ │ ├── DataPickManager.java
│ │ │ │ │ │ └── DataPickUtils.java
│ │ │ │ │ ├── extension/
│ │ │ │ │ │ └── DokitExtension.kt
│ │ │ │ │ ├── kit/
│ │ │ │ │ │ ├── AbstractKit.kt
│ │ │ │ │ │ ├── Category.java
│ │ │ │ │ │ ├── IKit.kt
│ │ │ │ │ │ ├── alignruler/
│ │ │ │ │ │ │ ├── AlignLineView.java
│ │ │ │ │ │ │ ├── AlignRulerInfoDoKitView.java
│ │ │ │ │ │ │ ├── AlignRulerKit.kt
│ │ │ │ │ │ │ ├── AlignRulerLineDoKitView.java
│ │ │ │ │ │ │ ├── AlignRulerMarkerDoKitView.java
│ │ │ │ │ │ │ └── AlignRulerSettingFragment.java
│ │ │ │ │ │ ├── blockmonitor/
│ │ │ │ │ │ │ ├── BlockListAdapter.java
│ │ │ │ │ │ │ ├── BlockListFragment.java
│ │ │ │ │ │ │ ├── BlockMonitorFragment.java
│ │ │ │ │ │ │ ├── BlockMonitorKit.kt
│ │ │ │ │ │ │ ├── bean/
│ │ │ │ │ │ │ │ └── BlockInfo.java
│ │ │ │ │ │ │ └── core/
│ │ │ │ │ │ │ ├── BlockCanaryUtils.java
│ │ │ │ │ │ │ ├── BlockMonitorManager.java
│ │ │ │ │ │ │ ├── MonitorCore.java
│ │ │ │ │ │ │ ├── OnBlockInfoUpdateListener.java
│ │ │ │ │ │ │ └── StackSampler.java
│ │ │ │ │ │ ├── colorpick/
│ │ │ │ │ │ │ ├── ColorPickConstants.java
│ │ │ │ │ │ │ ├── ColorPickManager.java
│ │ │ │ │ │ │ ├── ColorPickerDoKitView.java
│ │ │ │ │ │ │ ├── ColorPickerInfoDoKitView.java
│ │ │ │ │ │ │ ├── ColorPickerKit.kt
│ │ │ │ │ │ │ ├── ColorPickerSettingFragment.java
│ │ │ │ │ │ │ ├── ColorPickerView.java
│ │ │ │ │ │ │ ├── ImageCapture.java
│ │ │ │ │ │ │ └── ScreenRecorderService.java
│ │ │ │ │ │ ├── connect/
│ │ │ │ │ │ │ ├── ConnectAddress.kt
│ │ │ │ │ │ │ ├── ConnectAddressStore.kt
│ │ │ │ │ │ │ ├── ConnectConfig.kt
│ │ │ │ │ │ │ ├── ConnectListAdapter.kt
│ │ │ │ │ │ │ ├── DoKitConnectFragment.kt
│ │ │ │ │ │ │ ├── DoKitConnectManager.kt
│ │ │ │ │ │ │ ├── DoKitScanActivity.kt
│ │ │ │ │ │ │ ├── DoKitStudioConnectKit.kt
│ │ │ │ │ │ │ ├── data/
│ │ │ │ │ │ │ │ ├── BytePackage.kt
│ │ │ │ │ │ │ │ ├── LoginData.kt
│ │ │ │ │ │ │ │ ├── PackageType.kt
│ │ │ │ │ │ │ │ └── TextPackage.kt
│ │ │ │ │ │ │ ├── parser/
│ │ │ │ │ │ │ │ ├── ByteParser.kt
│ │ │ │ │ │ │ │ └── JsonParser.kt
│ │ │ │ │ │ │ └── ws/
│ │ │ │ │ │ │ ├── ConnectStatus.kt
│ │ │ │ │ │ │ ├── OkHttpWebSocketSession.kt
│ │ │ │ │ │ │ ├── OnWebSocketBytesMessageListener.kt
│ │ │ │ │ │ │ ├── OnWebSocketCloseListener.kt
│ │ │ │ │ │ │ ├── OnWebSocketLoginSuccessListener.kt
│ │ │ │ │ │ │ ├── OnWebSocketMessageListener.kt
│ │ │ │ │ │ │ ├── OnWebSocketQueueSizeOutListener.kt
│ │ │ │ │ │ │ ├── OnWebSocketReConnectListener.kt
│ │ │ │ │ │ │ ├── OnWebSocketStatusChangeListener.kt
│ │ │ │ │ │ │ ├── OnWebSocketTextPackageListener.kt
│ │ │ │ │ │ │ ├── WebSocketClient.kt
│ │ │ │ │ │ │ ├── WebSocketSession.kt
│ │ │ │ │ │ │ └── WsLog.kt
│ │ │ │ │ │ ├── core/
│ │ │ │ │ │ │ ├── AbsDoKitFragment.kt
│ │ │ │ │ │ │ ├── AbsDoKitView.kt
│ │ │ │ │ │ │ ├── AbsDoKitViewManager.kt
│ │ │ │ │ │ │ ├── ActivityLifecycleStatusInfo.kt
│ │ │ │ │ │ │ ├── BaseActivity.kt
│ │ │ │ │ │ │ ├── BaseFragment.kt
│ │ │ │ │ │ │ ├── DoKitFrameLayout.java
│ │ │ │ │ │ │ ├── DoKitIntent.kt
│ │ │ │ │ │ │ ├── DoKitKeyEvent.kt
│ │ │ │ │ │ │ ├── DoKitLifecycleInterface.kt
│ │ │ │ │ │ │ ├── DoKitManager.kt
│ │ │ │ │ │ │ ├── DoKitServiceEnum.kt
│ │ │ │ │ │ │ ├── DoKitServiceManager.kt
│ │ │ │ │ │ │ ├── DoKitView.java
│ │ │ │ │ │ │ ├── DoKitViewInfo.kt
│ │ │ │ │ │ │ ├── DoKitViewInterface.java
│ │ │ │ │ │ │ ├── DoKitViewLayoutParams.java
│ │ │ │ │ │ │ ├── DoKitViewManager.kt
│ │ │ │ │ │ │ ├── DoKitViewManagerInterface.kt
│ │ │ │ │ │ │ ├── DokitAbility.kt
│ │ │ │ │ │ │ ├── GlobalSingleDoKitViewInfo.kt
│ │ │ │ │ │ │ ├── LastDoKitViewPosInfo.java
│ │ │ │ │ │ │ ├── McClientProcessor.kt
│ │ │ │ │ │ │ ├── NewBaseActivity.kt
│ │ │ │ │ │ │ ├── NormalDoKitViewManager.kt
│ │ │ │ │ │ │ ├── SettingItem.java
│ │ │ │ │ │ │ ├── SettingItemAdapter.java
│ │ │ │ │ │ │ ├── SimpleDoKitLauncher.kt
│ │ │ │ │ │ │ ├── SystemDoKitViewManager.kt
│ │ │ │ │ │ │ ├── TouchProxy.java
│ │ │ │ │ │ │ ├── TranslucentActivity.java
│ │ │ │ │ │ │ └── UniversalActivity.kt
│ │ │ │ │ │ ├── crash/
│ │ │ │ │ │ │ ├── CrashCaptureKit.kt
│ │ │ │ │ │ │ ├── CrashCaptureMainFragment.java
│ │ │ │ │ │ │ ├── CrashCaptureManager.java
│ │ │ │ │ │ │ ├── CrashHistoryAdapter.java
│ │ │ │ │ │ │ └── CrashInfo.java
│ │ │ │ │ │ ├── dataclean/
│ │ │ │ │ │ │ ├── DataCleanFragment.kt
│ │ │ │ │ │ │ └── DataCleanKit.kt
│ │ │ │ │ │ ├── dbdebug/
│ │ │ │ │ │ │ ├── DbDebugFragment.java
│ │ │ │ │ │ │ └── DbDebugKit.kt
│ │ │ │ │ │ ├── dokitforweb/
│ │ │ │ │ │ │ ├── DoKitForWebJsInjectFragment.kt
│ │ │ │ │ │ │ ├── DokitForWeb.kt
│ │ │ │ │ │ │ └── DokitForWebKit.kt
│ │ │ │ │ │ ├── fileexplorer/
│ │ │ │ │ │ │ ├── DBListAdapter.java
│ │ │ │ │ │ │ ├── DatabaseDetailFragment.java
│ │ │ │ │ │ │ ├── FileExplorerChooseDialog.java
│ │ │ │ │ │ │ ├── FileExplorerFragment.java
│ │ │ │ │ │ │ ├── FileExplorerKit.kt
│ │ │ │ │ │ │ ├── FileInfo.java
│ │ │ │ │ │ │ ├── FileInfoAdapter.java
│ │ │ │ │ │ │ ├── ImageDetailFragment.java
│ │ │ │ │ │ │ ├── SpAdapter.java
│ │ │ │ │ │ │ ├── SpBean.java
│ │ │ │ │ │ │ ├── SpFragment.java
│ │ │ │ │ │ │ ├── SpInputView.java
│ │ │ │ │ │ │ ├── TextContentAdapter.java
│ │ │ │ │ │ │ ├── TextDetailFragment.java
│ │ │ │ │ │ │ └── VideoPlayFragment.java
│ │ │ │ │ │ ├── h5_help/
│ │ │ │ │ │ │ ├── DoKitJSI.kt
│ │ │ │ │ │ │ ├── DoKitWebViewClient.kt
│ │ │ │ │ │ │ ├── DoKitX5WebViewClient.kt
│ │ │ │ │ │ │ ├── H5DoKitView.kt
│ │ │ │ │ │ │ ├── H5Kit.kt
│ │ │ │ │ │ │ ├── JsHookDataManager.kt
│ │ │ │ │ │ │ ├── JsHttpUtil.kt
│ │ │ │ │ │ │ ├── LocalStorageAdapter.kt
│ │ │ │ │ │ │ ├── ProxyWebViewClient.kt
│ │ │ │ │ │ │ ├── ProxyX5WebViewClient.kt
│ │ │ │ │ │ │ ├── X5WebViewUtil.kt
│ │ │ │ │ │ │ └── bean/
│ │ │ │ │ │ │ ├── JsRequestBean.kt
│ │ │ │ │ │ │ └── StorageBean.kt
│ │ │ │ │ │ ├── health/
│ │ │ │ │ │ │ ├── AbsCountDownDoKitView.kt
│ │ │ │ │ │ │ ├── AppHealthInfoUtil.java
│ │ │ │ │ │ │ ├── CountDownDoKitView.kt
│ │ │ │ │ │ │ ├── HealthFragment.java
│ │ │ │ │ │ │ ├── HealthFragmentChild0.java
│ │ │ │ │ │ │ ├── HealthFragmentChild1.java
│ │ │ │ │ │ │ ├── HealthKit.kt
│ │ │ │ │ │ │ ├── UploadAppHealthCallback.java
│ │ │ │ │ │ │ ├── UserInfoDialogProvider.java
│ │ │ │ │ │ │ └── model/
│ │ │ │ │ │ │ └── AppHealthInfo.java
│ │ │ │ │ │ ├── largepicture/
│ │ │ │ │ │ │ ├── LargeImageInfo.java
│ │ │ │ │ │ │ ├── LargeImageListAdapter.java
│ │ │ │ │ │ │ ├── LargeImageListFragment.java
│ │ │ │ │ │ │ ├── LargePictureFragment.java
│ │ │ │ │ │ │ ├── LargePictureItemAdapter.java
│ │ │ │ │ │ │ ├── LargePictureKit.kt
│ │ │ │ │ │ │ └── LargePictureManager.java
│ │ │ │ │ │ ├── layoutborder/
│ │ │ │ │ │ │ ├── LayoutBorderKit.kt
│ │ │ │ │ │ │ ├── LayoutBorderManager.java
│ │ │ │ │ │ │ ├── LayoutBorderSettingFragment.java
│ │ │ │ │ │ │ ├── LayoutLevelDoKitView.java
│ │ │ │ │ │ │ ├── ScalpelFrameLayout.java
│ │ │ │ │ │ │ ├── ViewBorderDrawable.java
│ │ │ │ │ │ │ └── ViewBorderFrameLayout.java
│ │ │ │ │ │ ├── loginfo/
│ │ │ │ │ │ │ ├── LogExportDialog.java
│ │ │ │ │ │ │ ├── LogInfoDoKitView.java
│ │ │ │ │ │ │ ├── LogInfoKit.kt
│ │ │ │ │ │ │ ├── LogInfoManager.java
│ │ │ │ │ │ │ ├── LogInfoSettingFragment.java
│ │ │ │ │ │ │ ├── LogItemAdapter.java
│ │ │ │ │ │ │ ├── LogLine.java
│ │ │ │ │ │ │ ├── helper/
│ │ │ │ │ │ │ │ ├── LogcatHelper.java
│ │ │ │ │ │ │ │ └── RuntimeHelper.java
│ │ │ │ │ │ │ ├── reader/
│ │ │ │ │ │ │ │ ├── AbsLogcatReader.java
│ │ │ │ │ │ │ │ ├── LogcatReader.java
│ │ │ │ │ │ │ │ ├── LogcatReaderLoader.java
│ │ │ │ │ │ │ │ ├── ScrubberUtils.java
│ │ │ │ │ │ │ │ └── SingleLogcatReader.java
│ │ │ │ │ │ │ └── util/
│ │ │ │ │ │ │ ├── ArrayUtil.java
│ │ │ │ │ │ │ ├── SearchCriteria.java
│ │ │ │ │ │ │ ├── StringUtil.java
│ │ │ │ │ │ │ └── TagColorUtil.java
│ │ │ │ │ │ ├── main/
│ │ │ │ │ │ │ └── MainIconDoKitView.kt
│ │ │ │ │ │ ├── methodtrace/
│ │ │ │ │ │ │ ├── AppHealthMethodCostBean.java
│ │ │ │ │ │ │ ├── AppHealthMethodCostBeanWrap.java
│ │ │ │ │ │ │ └── MethodCostKit.kt
│ │ │ │ │ │ ├── network/
│ │ │ │ │ │ │ ├── MockKit.kt
│ │ │ │ │ │ │ ├── NetworkKit.kt
│ │ │ │ │ │ │ ├── NetworkManager.java
│ │ │ │ │ │ │ ├── OnNetworkInfoUpdateListener.java
│ │ │ │ │ │ │ ├── bean/
│ │ │ │ │ │ │ │ ├── MockApiResponseBean.java
│ │ │ │ │ │ │ │ ├── MockInterceptTitleBean.java
│ │ │ │ │ │ │ │ ├── MockTemplateTitleBean.java
│ │ │ │ │ │ │ │ ├── NetflowInfo.java
│ │ │ │ │ │ │ │ ├── NetworkRecord.java
│ │ │ │ │ │ │ │ ├── Request.java
│ │ │ │ │ │ │ │ ├── Response.java
│ │ │ │ │ │ │ │ └── WhiteHostBean.java
│ │ │ │ │ │ │ ├── common/
│ │ │ │ │ │ │ │ ├── CommonHeaders.java
│ │ │ │ │ │ │ │ ├── CommonInspectorRequest.java
│ │ │ │ │ │ │ │ ├── CommonInspectorResponse.java
│ │ │ │ │ │ │ │ └── NetworkPrinterHelper.java
│ │ │ │ │ │ │ ├── core/
│ │ │ │ │ │ │ │ ├── DefaultResponseHandler.java
│ │ │ │ │ │ │ │ ├── MimeMatcher.java
│ │ │ │ │ │ │ │ ├── NetworkInterpreter.java
│ │ │ │ │ │ │ │ ├── RequestBodyHelper.java
│ │ │ │ │ │ │ │ ├── ResourceType.java
│ │ │ │ │ │ │ │ ├── ResourceTypeHelper.java
│ │ │ │ │ │ │ │ └── ResponseHandler.java
│ │ │ │ │ │ │ ├── okhttp/
│ │ │ │ │ │ │ │ ├── ForwardingResponseBody.java
│ │ │ │ │ │ │ │ ├── InterceptorUtil.java
│ │ │ │ │ │ │ │ ├── OkHttpInspectorRequest.java
│ │ │ │ │ │ │ │ ├── OkHttpInspectorResponse.java
│ │ │ │ │ │ │ │ └── interceptor/
│ │ │ │ │ │ │ │ ├── AbsDoKitInterceptor.kt
│ │ │ │ │ │ │ │ ├── DokitCapInterceptor.java
│ │ │ │ │ │ │ │ ├── DokitExtInterceptor.kt
│ │ │ │ │ │ │ │ ├── DokitLargePicInterceptor.java
│ │ │ │ │ │ │ │ ├── DokitMockInterceptor.java
│ │ │ │ │ │ │ │ └── DokitWeakNetworkInterceptor.java
│ │ │ │ │ │ │ ├── room_db/
│ │ │ │ │ │ │ │ ├── AbsMockApiBean.java
│ │ │ │ │ │ │ │ ├── DokitDatabase.java
│ │ │ │ │ │ │ │ ├── DokitDbManager.java
│ │ │ │ │ │ │ │ ├── MockApiDao.java
│ │ │ │ │ │ │ │ ├── MockInterceptApiBean.java
│ │ │ │ │ │ │ │ └── MockTemplateApiBean.java
│ │ │ │ │ │ │ ├── stream/
│ │ │ │ │ │ │ │ ├── GunzippingOutputStream.java
│ │ │ │ │ │ │ │ ├── HttpOutputStreamProxy.java
│ │ │ │ │ │ │ │ ├── InputStreamProxy.java
│ │ │ │ │ │ │ │ └── OutputStreamProxy.java
│ │ │ │ │ │ │ ├── ui/
│ │ │ │ │ │ │ │ ├── InterceptDetailNodeProvider.java
│ │ │ │ │ │ │ │ ├── InterceptMockAdapter.java
│ │ │ │ │ │ │ │ ├── InterceptTitleNodeProvider.java
│ │ │ │ │ │ │ │ ├── ListDropDownAdapter.java
│ │ │ │ │ │ │ │ ├── MockTemplatePreviewFragment.java
│ │ │ │ │ │ │ │ ├── NetWorkMainPagerAdapter.java
│ │ │ │ │ │ │ │ ├── NetWorkMainPagerFragment.java
│ │ │ │ │ │ │ │ ├── NetWorkMockFragment.java
│ │ │ │ │ │ │ │ ├── NetWorkMonitorFragment.java
│ │ │ │ │ │ │ │ ├── NetWorkSummaryView.java
│ │ │ │ │ │ │ │ ├── NetworkDetailFragment.java
│ │ │ │ │ │ │ │ ├── NetworkDetailView.java
│ │ │ │ │ │ │ │ ├── NetworkListAdapter.java
│ │ │ │ │ │ │ │ ├── NetworkListView.java
│ │ │ │ │ │ │ │ ├── NetworkPagerAdapter.java
│ │ │ │ │ │ │ │ ├── TemplateDetailNodeProvider.java
│ │ │ │ │ │ │ │ ├── TemplateMockAdapter.java
│ │ │ │ │ │ │ │ ├── TemplateTitleNodeProvider.java
│ │ │ │ │ │ │ │ └── WhiteHostAdapter.java
│ │ │ │ │ │ │ └── utils/
│ │ │ │ │ │ │ ├── ByteUtil.java
│ │ │ │ │ │ │ ├── CostTimeUtil.java
│ │ │ │ │ │ │ ├── ExceptionUtil.java
│ │ │ │ │ │ │ ├── OkHttpResponse.kt
│ │ │ │ │ │ │ ├── StreamUtil.java
│ │ │ │ │ │ │ └── Utf8Charset.java
│ │ │ │ │ │ ├── parameter/
│ │ │ │ │ │ │ ├── AbsParameterFragment.java
│ │ │ │ │ │ │ ├── cpu/
│ │ │ │ │ │ │ │ ├── CpuKit.kt
│ │ │ │ │ │ │ │ └── CpuMainPageFragment.java
│ │ │ │ │ │ │ ├── frameInfo/
│ │ │ │ │ │ │ │ ├── FrameInfoFragment.java
│ │ │ │ │ │ │ │ └── FrameInfoKit.kt
│ │ │ │ │ │ │ └── ram/
│ │ │ │ │ │ │ ├── RamKit.kt
│ │ │ │ │ │ │ └── RamMainPageFragment.java
│ │ │ │ │ │ ├── performance/
│ │ │ │ │ │ │ ├── PerformanceCloseDoKitView.java
│ │ │ │ │ │ │ ├── PerformanceCloseListener.java
│ │ │ │ │ │ │ ├── PerformanceData.java
│ │ │ │ │ │ │ ├── PerformanceDataAdapter.java
│ │ │ │ │ │ │ ├── PerformanceDataManager.java
│ │ │ │ │ │ │ ├── PerformanceDoKitView.java
│ │ │ │ │ │ │ ├── PerformanceDokitViewManager.java
│ │ │ │ │ │ │ ├── PerformanceFragment.java
│ │ │ │ │ │ │ ├── PerformanceFragmentCloseListener.java
│ │ │ │ │ │ │ ├── PolyLineAdapter.java
│ │ │ │ │ │ │ ├── PolyLineItemView.java
│ │ │ │ │ │ │ ├── datasource/
│ │ │ │ │ │ │ │ ├── CpuDataSource.java
│ │ │ │ │ │ │ │ ├── DataSourceFactory.java
│ │ │ │ │ │ │ │ ├── DefaultDataSource.java
│ │ │ │ │ │ │ │ ├── FpsDataSource.java
│ │ │ │ │ │ │ │ ├── IDataSource.java
│ │ │ │ │ │ │ │ ├── NetworkDataSource.java
│ │ │ │ │ │ │ │ └── RamDataSource.java
│ │ │ │ │ │ │ ├── performanceViewInfo.java
│ │ │ │ │ │ │ └── widget/
│ │ │ │ │ │ │ ├── CardiogramView.java
│ │ │ │ │ │ │ ├── LineChart.java
│ │ │ │ │ │ │ ├── LineData.java
│ │ │ │ │ │ │ └── LineRender.java
│ │ │ │ │ │ ├── sysinfo/
│ │ │ │ │ │ │ ├── DevelopmentPageKit.kt
│ │ │ │ │ │ │ ├── LocalLangKit.kt
│ │ │ │ │ │ │ ├── ServiceRunningKit.kt
│ │ │ │ │ │ │ ├── SysInfoFragment.java
│ │ │ │ │ │ │ ├── SysInfoItem.java
│ │ │ │ │ │ │ ├── SysInfoItemAdapter.java
│ │ │ │ │ │ │ ├── SysInfoKit.kt
│ │ │ │ │ │ │ ├── ThirdLibInfoFragment.java
│ │ │ │ │ │ │ ├── ThirdLibInfoItemAdapter.java
│ │ │ │ │ │ │ ├── ThirdLibInfoKit.kt
│ │ │ │ │ │ │ └── TitleItem.java
│ │ │ │ │ │ ├── timecounter/
│ │ │ │ │ │ │ ├── AppStartInfoFragment.java
│ │ │ │ │ │ │ ├── TimeCounterDoKitView.java
│ │ │ │ │ │ │ ├── TimeCounterFragment.java
│ │ │ │ │ │ │ ├── TimeCounterKit.kt
│ │ │ │ │ │ │ ├── TimeCounterListAdapter.java
│ │ │ │ │ │ │ ├── TimeCounterListFragment.java
│ │ │ │ │ │ │ ├── TimeCounterManager.java
│ │ │ │ │ │ │ ├── bean/
│ │ │ │ │ │ │ │ └── CounterInfo.java
│ │ │ │ │ │ │ ├── counter/
│ │ │ │ │ │ │ │ ├── ActivityCounter.java
│ │ │ │ │ │ │ │ └── AppCounter.java
│ │ │ │ │ │ │ └── instrumentation/
│ │ │ │ │ │ │ ├── HandlerHooker.java
│ │ │ │ │ │ │ └── ProxyHandlerCallback.java
│ │ │ │ │ │ ├── toolpanel/
│ │ │ │ │ │ │ ├── ConfirmDialogProvider.kt
│ │ │ │ │ │ │ ├── DokitManagerAdapter.kt
│ │ │ │ │ │ │ ├── DokitManagerFragment.kt
│ │ │ │ │ │ │ ├── DokitMoreAdapter.kt
│ │ │ │ │ │ │ ├── DokitMoreFragment.kt
│ │ │ │ │ │ │ ├── KitBeans.kt
│ │ │ │ │ │ │ ├── KitWrapItem.kt
│ │ │ │ │ │ │ ├── TipDialogProvider.kt
│ │ │ │ │ │ │ ├── ToolPanelAdapter.kt
│ │ │ │ │ │ │ ├── ToolPanelDoKitView.kt
│ │ │ │ │ │ │ ├── ToolPanelUtil.kt
│ │ │ │ │ │ │ ├── bean/
│ │ │ │ │ │ │ │ └── MorePageGroupBean.java
│ │ │ │ │ │ │ └── decoration/
│ │ │ │ │ │ │ ├── FlexibleDividerDecoration.java
│ │ │ │ │ │ │ ├── HorizontalDividerItemDecoration.java
│ │ │ │ │ │ │ └── VerticalDividerItemDecoration.java
│ │ │ │ │ │ ├── uiperformance/
│ │ │ │ │ │ │ ├── UIPerformanceDisplayDoKitView.java
│ │ │ │ │ │ │ ├── UIPerformanceInfoDoKitView.java
│ │ │ │ │ │ │ ├── UIPerformanceKit.kt
│ │ │ │ │ │ │ ├── UIPerformanceManager.java
│ │ │ │ │ │ │ └── UIPerformanceUtil.java
│ │ │ │ │ │ ├── viewcheck/
│ │ │ │ │ │ │ ├── AimCircleView.java
│ │ │ │ │ │ │ ├── DebugAccessibilityService.java
│ │ │ │ │ │ │ ├── LayoutBorderView.java
│ │ │ │ │ │ │ ├── ViewCheckDoKitView.java
│ │ │ │ │ │ │ ├── ViewCheckDrawDoKitView.java
│ │ │ │ │ │ │ ├── ViewCheckInfoDoKitView.java
│ │ │ │ │ │ │ └── ViewCheckerKit.kt
│ │ │ │ │ │ ├── weaknetwork/
│ │ │ │ │ │ │ ├── NetWokDoKitView.java
│ │ │ │ │ │ │ ├── SpeedLimitRequestBody.java
│ │ │ │ │ │ │ ├── SpeedLimitResponseBody.java
│ │ │ │ │ │ │ ├── WeakNetworkFragment.java
│ │ │ │ │ │ │ ├── WeakNetworkKit.kt
│ │ │ │ │ │ │ └── WeakNetworkManager.java
│ │ │ │ │ │ ├── webdoor/
│ │ │ │ │ │ │ ├── WebDoorDefaultFragment.java
│ │ │ │ │ │ │ ├── WebDoorFragment.java
│ │ │ │ │ │ │ ├── WebDoorHistoryAdapter.java
│ │ │ │ │ │ │ ├── WebDoorKit.kt
│ │ │ │ │ │ │ └── WebDoorManager.java
│ │ │ │ │ │ └── webview/
│ │ │ │ │ │ ├── CommWebViewFragment.kt
│ │ │ │ │ │ ├── OnWebViewTitleChangeCallBack.java
│ │ │ │ │ │ └── WebViewManager.kt
│ │ │ │ │ ├── model/
│ │ │ │ │ │ ├── LatLng.java
│ │ │ │ │ │ └── ViewInfo.java
│ │ │ │ │ ├── picasso/
│ │ │ │ │ │ ├── Action.java
│ │ │ │ │ │ ├── AssetRequestHandler.java
│ │ │ │ │ │ ├── BitmapHunter.java
│ │ │ │ │ │ ├── Cache.java
│ │ │ │ │ │ ├── Callback.java
│ │ │ │ │ │ ├── ContactsPhotoRequestHandler.java
│ │ │ │ │ │ ├── ContentStreamRequestHandler.java
│ │ │ │ │ │ ├── DeferredRequestCreator.java
│ │ │ │ │ │ ├── Dispatcher.java
│ │ │ │ │ │ ├── DokitPicasso.java
│ │ │ │ │ │ ├── Downloader.java
│ │ │ │ │ │ ├── FetchAction.java
│ │ │ │ │ │ ├── FileRequestHandler.java
│ │ │ │ │ │ ├── GetAction.java
│ │ │ │ │ │ ├── ImageViewAction.java
│ │ │ │ │ │ ├── LruCache.java
│ │ │ │ │ │ ├── MarkableInputStream.java
│ │ │ │ │ │ ├── MediaStoreRequestHandler.java
│ │ │ │ │ │ ├── MemoryPolicy.java
│ │ │ │ │ │ ├── NetworkPolicy.java
│ │ │ │ │ │ ├── NetworkRequestHandler.java
│ │ │ │ │ │ ├── OkHttpDownloader.java
│ │ │ │ │ │ ├── PicassoDrawable.java
│ │ │ │ │ │ ├── PicassoExecutorService.java
│ │ │ │ │ │ ├── RemoteViewsAction.java
│ │ │ │ │ │ ├── Request.java
│ │ │ │ │ │ ├── RequestCreator.java
│ │ │ │ │ │ ├── RequestHandler.java
│ │ │ │ │ │ ├── ResourceRequestHandler.java
│ │ │ │ │ │ ├── Stats.java
│ │ │ │ │ │ ├── StatsSnapshot.java
│ │ │ │ │ │ ├── Target.java
│ │ │ │ │ │ ├── TargetAction.java
│ │ │ │ │ │ ├── Transformation.java
│ │ │ │ │ │ ├── UrlConnectionDownloader.java
│ │ │ │ │ │ └── Utils.java
│ │ │ │ │ ├── reflection/
│ │ │ │ │ │ ├── BootstrapClass.java
│ │ │ │ │ │ └── Reflection.java
│ │ │ │ │ ├── util/
│ │ │ │ │ │ ├── ColorUtil.java
│ │ │ │ │ │ ├── DataCleanUtil.java
│ │ │ │ │ │ ├── DatabaseUtil.java
│ │ │ │ │ │ ├── DoKitCacheUtils.java
│ │ │ │ │ │ ├── DoKitClipboardUtils.java
│ │ │ │ │ │ ├── DoKitCommUtil.java
│ │ │ │ │ │ ├── DoKitExecutorUtil.java
│ │ │ │ │ │ ├── DoKitFileUtil.java
│ │ │ │ │ │ ├── DoKitFormatUtil.java
│ │ │ │ │ │ ├── DoKitImageUtil.java
│ │ │ │ │ │ ├── DoKitJsonUtil.java
│ │ │ │ │ │ ├── DoKitMiscUtil.java
│ │ │ │ │ │ ├── DoKitNotificationUtils.java
│ │ │ │ │ │ ├── DoKitPermissionUtil.java
│ │ │ │ │ │ ├── DoKitSPUtil.java
│ │ │ │ │ │ ├── DoKitSystemUtil.java
│ │ │ │ │ │ ├── DoKitWebUtil.java
│ │ │ │ │ │ ├── DokitDeviceUtils.java
│ │ │ │ │ │ ├── DoraemonStatisticsUtil.java
│ │ │ │ │ │ ├── FileManager.java
│ │ │ │ │ │ ├── LifecycleListenerUtil.java
│ │ │ │ │ │ ├── LogHelper.java
│ │ │ │ │ │ ├── Reflector.java
│ │ │ │ │ │ ├── UIUtils.java
│ │ │ │ │ │ └── threadpool/
│ │ │ │ │ │ ├── ThreadPoolProxy.java
│ │ │ │ │ │ └── ThreadPoolProxyFactory.java
│ │ │ │ │ ├── volley/
│ │ │ │ │ │ └── VolleyManager.kt
│ │ │ │ │ ├── widget/
│ │ │ │ │ │ ├── JustifyTextView.java
│ │ │ │ │ │ ├── MultiLineRadioGroup.java
│ │ │ │ │ │ ├── bottomview/
│ │ │ │ │ │ │ ├── AssociationView.java
│ │ │ │ │ │ │ ├── BottomUpWindow.java
│ │ │ │ │ │ │ └── EditSpInputView.java
│ │ │ │ │ │ ├── brvah/
│ │ │ │ │ │ │ ├── BaseBinderAdapter.kt
│ │ │ │ │ │ │ ├── BaseDelegateMultiAdapter.kt
│ │ │ │ │ │ │ ├── BaseMultiItemQuickAdapter.kt
│ │ │ │ │ │ │ ├── BaseNodeAdapter.kt
│ │ │ │ │ │ │ ├── BaseProviderMultiAdapter.kt
│ │ │ │ │ │ │ ├── BaseQuickAdapter.kt
│ │ │ │ │ │ │ ├── BaseSectionQuickAdapter.kt
│ │ │ │ │ │ │ ├── animation/
│ │ │ │ │ │ │ │ ├── AlphaInAnimation.kt
│ │ │ │ │ │ │ │ ├── BaseAnimation.kt
│ │ │ │ │ │ │ │ ├── ScaleInAnimation.kt
│ │ │ │ │ │ │ │ ├── SlideInBottomAnimation.kt
│ │ │ │ │ │ │ │ ├── SlideInLeftAnimation.kt
│ │ │ │ │ │ │ │ └── SlideInRightAnimation.kt
│ │ │ │ │ │ │ ├── binder/
│ │ │ │ │ │ │ │ ├── BaseItemBinder.kt
│ │ │ │ │ │ │ │ ├── QuickDataBindingItemBinder.kt
│ │ │ │ │ │ │ │ ├── QuickItemBinder.kt
│ │ │ │ │ │ │ │ └── QuickViewBindingItemBinder.kt
│ │ │ │ │ │ │ ├── delegate/
│ │ │ │ │ │ │ │ └── BaseMultiTypeDelegate.kt
│ │ │ │ │ │ │ ├── diff/
│ │ │ │ │ │ │ │ ├── BrvahAsyncDiffer.kt
│ │ │ │ │ │ │ │ ├── BrvahAsyncDifferConfig.kt
│ │ │ │ │ │ │ │ ├── BrvahListUpdateCallback.kt
│ │ │ │ │ │ │ │ ├── DifferImp.java
│ │ │ │ │ │ │ │ └── ListChangeListener.java
│ │ │ │ │ │ │ ├── dragswipe/
│ │ │ │ │ │ │ │ └── DragAndSwipeCallback.java
│ │ │ │ │ │ │ ├── entity/
│ │ │ │ │ │ │ │ ├── JSectionEntity.java
│ │ │ │ │ │ │ │ ├── MultiItemEntity.kt
│ │ │ │ │ │ │ │ ├── SectionEntity.kt
│ │ │ │ │ │ │ │ └── node/
│ │ │ │ │ │ │ │ ├── BaseExpandNode.kt
│ │ │ │ │ │ │ │ ├── BaseNode.kt
│ │ │ │ │ │ │ │ └── NodeFooterImp.kt
│ │ │ │ │ │ │ ├── listener/
│ │ │ │ │ │ │ │ ├── BaseListenerImp.java
│ │ │ │ │ │ │ │ ├── DraggableListenerImp.java
│ │ │ │ │ │ │ │ ├── GridSpanSizeLookup.java
│ │ │ │ │ │ │ │ ├── LoadMoreListenerImp.java
│ │ │ │ │ │ │ │ ├── OnItemChildClickListener.java
│ │ │ │ │ │ │ │ ├── OnItemChildLongClickListener.java
│ │ │ │ │ │ │ │ ├── OnItemClickListener.java
│ │ │ │ │ │ │ │ ├── OnItemDragListener.java
│ │ │ │ │ │ │ │ ├── OnItemLongClickListener.java
│ │ │ │ │ │ │ │ ├── OnItemSwipeListener.java
│ │ │ │ │ │ │ │ ├── OnLoadMoreListener.java
│ │ │ │ │ │ │ │ ├── OnUpFetchListener.java
│ │ │ │ │ │ │ │ └── UpFetchListenerImp.java
│ │ │ │ │ │ │ ├── loadmore/
│ │ │ │ │ │ │ │ ├── BaseLoadMoreView.kt
│ │ │ │ │ │ │ │ └── SimpleLoadMoreView.kt
│ │ │ │ │ │ │ ├── module/
│ │ │ │ │ │ │ │ ├── DraggableModule.kt
│ │ │ │ │ │ │ │ ├── LoadMoreModule.kt
│ │ │ │ │ │ │ │ └── UpFetchModule.kt
│ │ │ │ │ │ │ ├── provider/
│ │ │ │ │ │ │ │ ├── BaseItemProvider.kt
│ │ │ │ │ │ │ │ └── BaseNodeProvider.kt
│ │ │ │ │ │ │ ├── util/
│ │ │ │ │ │ │ │ └── AdapterUtils.kt
│ │ │ │ │ │ │ └── viewholder/
│ │ │ │ │ │ │ ├── BaseDataBindingHolder.kt
│ │ │ │ │ │ │ └── BaseViewHolder.kt
│ │ │ │ │ │ ├── chart/
│ │ │ │ │ │ │ ├── BarChart.java
│ │ │ │ │ │ │ └── PieChart.java
│ │ │ │ │ │ ├── dialog/
│ │ │ │ │ │ │ ├── CommonDialogProvider.java
│ │ │ │ │ │ │ ├── DialogInfo.java
│ │ │ │ │ │ │ ├── DialogListener.kt
│ │ │ │ │ │ │ ├── DialogProvider.java
│ │ │ │ │ │ │ ├── SimpleDialogListener.java
│ │ │ │ │ │ │ └── UniversalDialogFragment.java
│ │ │ │ │ │ ├── dropdown/
│ │ │ │ │ │ │ ├── DkDropDownMenu.java
│ │ │ │ │ │ │ └── Orientation.java
│ │ │ │ │ │ ├── easyrefresh/
│ │ │ │ │ │ │ ├── ELog.java
│ │ │ │ │ │ │ ├── EasyRefreshLayout.java
│ │ │ │ │ │ │ ├── ILoadMoreView.java
│ │ │ │ │ │ │ ├── IRefreshHeader.java
│ │ │ │ │ │ │ ├── LoadModel.java
│ │ │ │ │ │ │ ├── State.java
│ │ │ │ │ │ │ ├── exception/
│ │ │ │ │ │ │ │ └── ERVHRuntimeException.java
│ │ │ │ │ │ │ └── view/
│ │ │ │ │ │ │ ├── SimpleLoadMoreView.java
│ │ │ │ │ │ │ └── SimpleRefreshHeaderView.java
│ │ │ │ │ │ ├── jsonviewer/
│ │ │ │ │ │ │ ├── JsonRecyclerView.java
│ │ │ │ │ │ │ ├── adapter/
│ │ │ │ │ │ │ │ ├── BaseJsonViewerAdapter.java
│ │ │ │ │ │ │ │ └── JsonViewerAdapter.java
│ │ │ │ │ │ │ ├── utils/
│ │ │ │ │ │ │ │ └── Utils.java
│ │ │ │ │ │ │ └── view/
│ │ │ │ │ │ │ └── JsonItemView.java
│ │ │ │ │ │ ├── recyclerview/
│ │ │ │ │ │ │ ├── AbsRecyclerAdapter.java
│ │ │ │ │ │ │ ├── AbsViewBinder.java
│ │ │ │ │ │ │ └── DividerItemDecoration.java
│ │ │ │ │ │ ├── tableview/
│ │ │ │ │ │ │ ├── SelectionOperation.java
│ │ │ │ │ │ │ ├── TableConfig.java
│ │ │ │ │ │ │ ├── TableMeasurer.java
│ │ │ │ │ │ │ ├── TableParser.java
│ │ │ │ │ │ │ ├── TableProvider.java
│ │ │ │ │ │ │ ├── bean/
│ │ │ │ │ │ │ │ ├── ArrayTableData.java
│ │ │ │ │ │ │ │ ├── Cell.java
│ │ │ │ │ │ │ │ ├── CellInfo.java
│ │ │ │ │ │ │ │ ├── Column.java
│ │ │ │ │ │ │ │ ├── ColumnInfo.java
│ │ │ │ │ │ │ │ ├── TableData.java
│ │ │ │ │ │ │ │ └── TableInfo.java
│ │ │ │ │ │ │ ├── component/
│ │ │ │ │ │ │ │ ├── SmartTable.java
│ │ │ │ │ │ │ │ ├── TableTitle.java
│ │ │ │ │ │ │ │ └── YSequence.java
│ │ │ │ │ │ │ ├── format/
│ │ │ │ │ │ │ │ ├── BaseSequenceFormat.java
│ │ │ │ │ │ │ │ ├── FastTextDrawFormat.java
│ │ │ │ │ │ │ │ ├── NumberSequenceFormat.java
│ │ │ │ │ │ │ │ ├── TextDrawFormat.java
│ │ │ │ │ │ │ │ └── TitleDrawFormat.java
│ │ │ │ │ │ │ ├── intface/
│ │ │ │ │ │ │ │ ├── IComponent.java
│ │ │ │ │ │ │ │ ├── IDrawFormat.java
│ │ │ │ │ │ │ │ ├── IFormat.java
│ │ │ │ │ │ │ │ ├── ISelectFormat.java
│ │ │ │ │ │ │ │ ├── ISequenceFormat.java
│ │ │ │ │ │ │ │ ├── IStyle.java
│ │ │ │ │ │ │ │ ├── ITableTitle.java
│ │ │ │ │ │ │ │ ├── ITitleDrawFormat.java
│ │ │ │ │ │ │ │ └── ITouch.java
│ │ │ │ │ │ │ ├── listener/
│ │ │ │ │ │ │ │ ├── Observable.java
│ │ │ │ │ │ │ │ ├── OnColumnClickListener.java
│ │ │ │ │ │ │ │ ├── OnColumnItemClickListener.java
│ │ │ │ │ │ │ │ ├── OnTableChangeListener.java
│ │ │ │ │ │ │ │ └── TableClickObserver.java
│ │ │ │ │ │ │ ├── style/
│ │ │ │ │ │ │ │ ├── FontStyle.java
│ │ │ │ │ │ │ │ └── LineStyle.java
│ │ │ │ │ │ │ └── utils/
│ │ │ │ │ │ │ ├── DensityUtils.java
│ │ │ │ │ │ │ ├── DrawUtils.java
│ │ │ │ │ │ │ └── MatrixHelper.java
│ │ │ │ │ │ ├── textview/
│ │ │ │ │ │ │ └── LabelTextView.java
│ │ │ │ │ │ ├── titlebar/
│ │ │ │ │ │ │ ├── HomeTitleBar.java
│ │ │ │ │ │ │ ├── LogTitleBar.java
│ │ │ │ │ │ │ └── TitleBar.java
│ │ │ │ │ │ ├── verticalviewpager/
│ │ │ │ │ │ │ ├── VerticalViewPager.java
│ │ │ │ │ │ │ └── transforms/
│ │ │ │ │ │ │ ├── DefaultTransformer.java
│ │ │ │ │ │ │ ├── StackTransformer.java
│ │ │ │ │ │ │ └── ZoomOutTransformer.java
│ │ │ │ │ │ ├── videoview/
│ │ │ │ │ │ │ ├── CustomVideoView.java
│ │ │ │ │ │ │ └── MyVideoView.java
│ │ │ │ │ │ └── webview/
│ │ │ │ │ │ ├── MyWebView.java
│ │ │ │ │ │ └── MyWebViewClient.java
│ │ │ │ │ └── zxing/
│ │ │ │ │ ├── activity/
│ │ │ │ │ │ └── CaptureActivity.java
│ │ │ │ │ ├── camera/
│ │ │ │ │ │ ├── AutoFocusCallback.java
│ │ │ │ │ │ ├── CameraConfigurationManager.java
│ │ │ │ │ │ ├── CameraManager.java
│ │ │ │ │ │ ├── FlashlightManager.java
│ │ │ │ │ │ ├── PlanarYUVLuminanceSource.java
│ │ │ │ │ │ └── PreviewCallback.java
│ │ │ │ │ ├── decoding/
│ │ │ │ │ │ ├── CaptureActivityHandler.java
│ │ │ │ │ │ ├── DecodeFormatManager.java
│ │ │ │ │ │ ├── DecodeHandler.java
│ │ │ │ │ │ ├── DecodeThread.java
│ │ │ │ │ │ ├── FinishListener.java
│ │ │ │ │ │ ├── InactivityTimer.java
│ │ │ │ │ │ └── Intents.java
│ │ │ │ │ └── view/
│ │ │ │ │ ├── ViewfinderResultPointCallback.java
│ │ │ │ │ └── ViewfinderView.java
│ │ │ │ └── res/
│ │ │ │ ├── anim/
│ │ │ │ │ ├── dk_dd_mask_in.xml
│ │ │ │ │ ├── dk_dd_mask_out.xml
│ │ │ │ │ ├── dk_dd_menu_in.xml
│ │ │ │ │ ├── dk_dd_menu_out.xml
│ │ │ │ │ ├── dk_easy_refresh_rotate_down.xml
│ │ │ │ │ ├── dk_easy_refresh_rotate_infinite.xml
│ │ │ │ │ └── dk_easy_refresh_rotate_up.xml
│ │ │ │ ├── color/
│ │ │ │ │ ├── dk_confirm_button_text_color.xml
│ │ │ │ │ ├── dk_network_pager_color.xml
│ │ │ │ │ └── dk_radio_button_text_color.xml
│ │ │ │ ├── drawable/
│ │ │ │ │ ├── dk_add_shape.xml
│ │ │ │ │ ├── dk_app_toast_shape.xml
│ │ │ │ │ ├── dk_brvah_sample_footer_loading_progress.xml
│ │ │ │ │ ├── dk_btn_dokit_for_web_bg.xml
│ │ │ │ │ ├── dk_btn_pause_style.xml
│ │ │ │ │ ├── dk_btn_play_style.xml
│ │ │ │ │ ├── dk_confirm_button_background.xml
│ │ │ │ │ ├── dk_dialog_button_background.xml
│ │ │ │ │ ├── dk_dialog_complete_bg.xml
│ │ │ │ │ ├── dk_dialog_confirm_bg.xml
│ │ │ │ │ ├── dk_divider.xml
│ │ │ │ │ ├── dk_divider_gray.xml
│ │ │ │ │ ├── dk_dokitview_studio_connect.xml
│ │ │ │ │ ├── dk_dotted_line_horizontal.xml
│ │ │ │ │ ├── dk_dotted_line_vertical.xml
│ │ │ │ │ ├── dk_edittext_shape.xml
│ │ │ │ │ ├── dk_float_ui_performance_info_bg.xml
│ │ │ │ │ ├── dk_health_edittext_style.xml
│ │ │ │ │ ├── dk_hint_bg.xml
│ │ │ │ │ ├── dk_info_background.xml
│ │ │ │ │ ├── dk_input_cursor.xml
│ │ │ │ │ ├── dk_item_btn_img.xml
│ │ │ │ │ ├── dk_item_performance_detail.xml
│ │ │ │ │ ├── dk_jsonviewer_minus.xml
│ │ │ │ │ ├── dk_jsonviewer_plus.xml
│ │ │ │ │ ├── dk_kit_group_background.xml
│ │ │ │ │ ├── dk_line_chart_selected_background.xml
│ │ │ │ │ ├── dk_log_filter_background.xml
│ │ │ │ │ ├── dk_net_work_monitor_list_selector.xml
│ │ │ │ │ ├── dk_net_work_monitor_summary_selector.xml
│ │ │ │ │ ├── dk_network_info_background.xml
│ │ │ │ │ ├── dk_network_method_bg.xml
│ │ │ │ │ ├── dk_network_platform_bg.xml
│ │ │ │ │ ├── dk_perform_data_background.xml
│ │ │ │ │ ├── dk_progressbar_style.xml
│ │ │ │ │ ├── dk_radio_button_background.xml
│ │ │ │ │ ├── dk_radio_button_background_left.xml
│ │ │ │ │ ├── dk_radio_button_background_middle.xml
│ │ │ │ │ ├── dk_radio_button_background_right.xml
│ │ │ │ │ ├── dk_radio_button_checked_background.xml
│ │ │ │ │ ├── dk_radio_button_checked_background_left.xml
│ │ │ │ │ ├── dk_radio_button_checked_background_middle.xml
│ │ │ │ │ ├── dk_radio_button_checked_background_right.xml
│ │ │ │ │ ├── dk_radio_button_normal_background.xml
│ │ │ │ │ ├── dk_radio_button_normal_background_left.xml
│ │ │ │ │ ├── dk_radio_button_normal_background_middle.xml
│ │ │ │ │ ├── dk_radio_button_normal_background_right.xml
│ │ │ │ │ ├── dk_refresh_rotate_down.xml
│ │ │ │ │ ├── dk_seekbar_style.xml
│ │ │ │ │ ├── dk_setting_item_background.xml
│ │ │ │ │ ├── dk_shape_float_view_bg.xml
│ │ │ │ │ ├── dk_switch_background.xml
│ │ │ │ │ ├── dk_time_counter_background.xml
│ │ │ │ │ ├── dk_view_dot_connect.xml
│ │ │ │ │ └── dk_web_door_history_item_background.xml
│ │ │ │ ├── layout/
│ │ │ │ │ ├── dk_app_toast.xml
│ │ │ │ │ ├── dk_brvah_quick_view_load_more.xml
│ │ │ │ │ ├── dk_dialog_common.xml
│ │ │ │ │ ├── dk_dialog_confirm.xml
│ │ │ │ │ ├── dk_dialog_file_explorer_choose.xml
│ │ │ │ │ ├── dk_dialog_tip.xml
│ │ │ │ │ ├── dk_dialog_userinfo.xml
│ │ │ │ │ ├── dk_dropdownmenu_tab_item.xml
│ │ │ │ │ ├── dk_float_align_ruler_info.xml
│ │ │ │ │ ├── dk_float_align_ruler_line.xml
│ │ │ │ │ ├── dk_float_align_ruler_marker.xml
│ │ │ │ │ ├── dk_float_color_picker.xml
│ │ │ │ │ ├── dk_float_color_picker_info.xml
│ │ │ │ │ ├── dk_float_count_down.xml
│ │ │ │ │ ├── dk_float_h5_info.xml
│ │ │ │ │ ├── dk_float_layout_level.xml
│ │ │ │ │ ├── dk_float_lbs_route.xml
│ │ │ │ │ ├── dk_float_log_info.xml
│ │ │ │ │ ├── dk_float_network.xml
│ │ │ │ │ ├── dk_float_perform_data.xml
│ │ │ │ │ ├── dk_float_time_counter.xml
│ │ │ │ │ ├── dk_float_ui_performance_display.xml
│ │ │ │ │ ├── dk_float_ui_performance_info.xml
│ │ │ │ │ ├── dk_float_view_check.xml
│ │ │ │ │ ├── dk_float_view_check_draw.xml
│ │ │ │ │ ├── dk_float_view_check_info.xml
│ │ │ │ │ ├── dk_fragment_align_ruler_setting.xml
│ │ │ │ │ ├── dk_fragment_app_start_info.xml
│ │ │ │ │ ├── dk_fragment_block_list.xml
│ │ │ │ │ ├── dk_fragment_block_monitor_index.xml
│ │ │ │ │ ├── dk_fragment_color_picker_setting.xml
│ │ │ │ │ ├── dk_fragment_comm_webview.xml
│ │ │ │ │ ├── dk_fragment_cpu_cache_log.xml
│ │ │ │ │ ├── dk_fragment_crash_capture_detail.xml
│ │ │ │ │ ├── dk_fragment_crash_capture_main.xml
│ │ │ │ │ ├── dk_fragment_crash_detail_info.xml
│ │ │ │ │ ├── dk_fragment_data_clean.xml
│ │ │ │ │ ├── dk_fragment_db_debug.xml
│ │ │ │ │ ├── dk_fragment_db_detail.xml
│ │ │ │ │ ├── dk_fragment_dokit_connect.xml
│ │ │ │ │ ├── dk_fragment_dokit_for_web.xml
│ │ │ │ │ ├── dk_fragment_file_explorer.xml
│ │ │ │ │ ├── dk_fragment_file_manager_doc.xml
│ │ │ │ │ ├── dk_fragment_health.xml
│ │ │ │ │ ├── dk_fragment_health_child0.xml
│ │ │ │ │ ├── dk_fragment_health_child1.xml
│ │ │ │ │ ├── dk_fragment_image_detail.xml
│ │ │ │ │ ├── dk_fragment_kit_manager.xml
│ │ │ │ │ ├── dk_fragment_large_img_list.xml
│ │ │ │ │ ├── dk_fragment_layout_border_setting.xml
│ │ │ │ │ ├── dk_fragment_log_info_setting.xml
│ │ │ │ │ ├── dk_fragment_method_cost.xml
│ │ │ │ │ ├── dk_fragment_mock_template_preview.xml
│ │ │ │ │ ├── dk_fragment_monitor_data_upload_page.xml
│ │ │ │ │ ├── dk_fragment_monitor_pagedata.xml
│ │ │ │ │ ├── dk_fragment_monitor_pagedata_item.xml
│ │ │ │ │ ├── dk_fragment_monitor_pagedata_item_item.xml
│ │ │ │ │ ├── dk_fragment_more.xml
│ │ │ │ │ ├── dk_fragment_net_main_pager.xml
│ │ │ │ │ ├── dk_fragment_net_mock.xml
│ │ │ │ │ ├── dk_fragment_net_monitor.xml
│ │ │ │ │ ├── dk_fragment_network_monitor_detail.xml
│ │ │ │ │ ├── dk_fragment_network_monitor_list.xml
│ │ │ │ │ ├── dk_fragment_network_summary_page.xml
│ │ │ │ │ ├── dk_fragment_parameter.xml
│ │ │ │ │ ├── dk_fragment_performance_large_picture_setting.xml
│ │ │ │ │ ├── dk_fragment_simple_dokit_page.xml
│ │ │ │ │ ├── dk_fragment_sp_show.xml
│ │ │ │ │ ├── dk_fragment_sys_info.xml
│ │ │ │ │ ├── dk_fragment_text_detail.xml
│ │ │ │ │ ├── dk_fragment_third_lib_info.xml
│ │ │ │ │ ├── dk_fragment_time_counter_index.xml
│ │ │ │ │ ├── dk_fragment_time_counter_list.xml
│ │ │ │ │ ├── dk_fragment_top_activity.xml
│ │ │ │ │ ├── dk_fragment_video_play.xml
│ │ │ │ │ ├── dk_fragment_view_check.xml
│ │ │ │ │ ├── dk_fragment_weak_network.xml
│ │ │ │ │ ├── dk_fragment_web_door.xml
│ │ │ │ │ ├── dk_fragment_web_door_default.xml
│ │ │ │ │ ├── dk_home_title_bar.xml
│ │ │ │ │ ├── dk_item_bar_chart.xml
│ │ │ │ │ ├── dk_item_block_list.xml
│ │ │ │ │ ├── dk_item_connect_address.xml
│ │ │ │ │ ├── dk_item_crash_history.xml
│ │ │ │ │ ├── dk_item_data_clean.xml
│ │ │ │ │ ├── dk_item_default_drop_down.xml
│ │ │ │ │ ├── dk_item_file_info.xml
│ │ │ │ │ ├── dk_item_group_exit.xml
│ │ │ │ │ ├── dk_item_group_kit.xml
│ │ │ │ │ ├── dk_item_group_kit_manager.xml
│ │ │ │ │ ├── dk_item_group_mode.xml
│ │ │ │ │ ├── dk_item_group_title.xml
│ │ │ │ │ ├── dk_item_group_version.xml
│ │ │ │ │ ├── dk_item_kit.xml
│ │ │ │ │ ├── dk_item_large_img_list.xml
│ │ │ │ │ ├── dk_item_layout_bottom_up_select_window.xml
│ │ │ │ │ ├── dk_item_localstorage.xml
│ │ │ │ │ ├── dk_item_log.xml
│ │ │ │ │ ├── dk_item_more_content.xml
│ │ │ │ │ ├── dk_item_more_header.xml
│ │ │ │ │ ├── dk_item_network_list.xml
│ │ │ │ │ ├── dk_item_performance_close.xml
│ │ │ │ │ ├── dk_item_performance_detail.xml
│ │ │ │ │ ├── dk_item_performance_wrap.xml
│ │ │ │ │ ├── dk_item_setting.xml
│ │ │ │ │ ├── dk_item_sp_input.xml
│ │ │ │ │ ├── dk_item_sys_info.xml
│ │ │ │ │ ├── dk_item_sys_title.xml
│ │ │ │ │ ├── dk_item_text_content.xml
│ │ │ │ │ ├── dk_item_third_lib_info.xml
│ │ │ │ │ ├── dk_item_time_counter_list.xml
│ │ │ │ │ ├── dk_item_tips_view.xml
│ │ │ │ │ ├── dk_item_web_door_history.xml
│ │ │ │ │ ├── dk_item_white_host.xml
│ │ │ │ │ ├── dk_jsonviewer_layout_item_view.xml
│ │ │ │ │ ├── dk_label_text_view.xml
│ │ │ │ │ ├── dk_layout_localstorage_empty.xml
│ │ │ │ │ ├── dk_layout_sessionstorage_empty.xml
│ │ │ │ │ ├── dk_light_hint_layout.xml
│ │ │ │ │ ├── dk_log_title_bar.xml
│ │ │ │ │ ├── dk_main_launch_icon.xml
│ │ │ │ │ ├── dk_mock_intercept_content_item.xml
│ │ │ │ │ ├── dk_mock_template_content_item.xml
│ │ │ │ │ ├── dk_mock_title_item.xml
│ │ │ │ │ ├── dk_performance_close_wrap.xml
│ │ │ │ │ ├── dk_performance_wrap.xml
│ │ │ │ │ ├── dk_radio_button.xml
│ │ │ │ │ ├── dk_radio_table_layout.xml
│ │ │ │ │ ├── dk_radio_table_row.xml
│ │ │ │ │ ├── dk_refresh_default_load_more.xml
│ │ │ │ │ ├── dk_refresh_default_refresh_header.xml
│ │ │ │ │ ├── dk_rv_empty_layout.xml
│ │ │ │ │ ├── dk_rv_empty_layout2.xml
│ │ │ │ │ ├── dk_title_bar.xml
│ │ │ │ │ ├── dk_tool_panel.xml
│ │ │ │ │ ├── dk_tool_panel_old.xml
│ │ │ │ │ ├── dk_video_layout.xml
│ │ │ │ │ ├── dk_view_line_chart.xml
│ │ │ │ │ ├── dk_view_network_detail_pager_title.xml
│ │ │ │ │ ├── dk_view_network_request.xml
│ │ │ │ │ ├── dk_view_network_tab_layout.xml
│ │ │ │ │ ├── dk_volume_hint_layout.xml
│ │ │ │ │ ├── dk_zxing_activity_scanner.xml
│ │ │ │ │ ├── kd_item_sp_input.xml
│ │ │ │ │ └── layout_mock_pos_adjust.xml
│ │ │ │ ├── values/
│ │ │ │ │ ├── attrs.xml
│ │ │ │ │ ├── colors.xml
│ │ │ │ │ ├── dimens.xml
│ │ │ │ │ ├── font_sizes.xml
│ │ │ │ │ ├── ids.xml
│ │ │ │ │ ├── strings.xml
│ │ │ │ │ └── styles.xml
│ │ │ │ ├── values-en-rUS/
│ │ │ │ │ └── strings.xml
│ │ │ │ ├── values-zh-rCN/
│ │ │ │ │ └── strings.xml
│ │ │ │ ├── values-zh-rTW/
│ │ │ │ │ └── strings.xml
│ │ │ │ └── xml/
│ │ │ │ ├── dokit_debug_provider_paths.xml
│ │ │ │ └── dokit_network_config.xml
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── didichuxing/
│ │ │ └── doraemonkit/
│ │ │ ├── DokitTest.java
│ │ │ └── kit/
│ │ │ └── connect/
│ │ │ ├── ByteParserTest.kt
│ │ │ ├── WebSocketClientTest.kt
│ │ │ └── WebSocketSessionTest.java
│ │ └── upload.sh
│ ├── dokit-autotest/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── gradle.properties
│ │ ├── proguard-rules.pro
│ │ ├── src/
│ │ │ ├── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── java/
│ │ │ │ │ └── com/
│ │ │ │ │ └── didichuxing/
│ │ │ │ │ └── doraemonkit/
│ │ │ │ │ └── kit/
│ │ │ │ │ └── autotest/
│ │ │ │ │ ├── AutoTestControlKit.kt
│ │ │ │ │ ├── AutoTestManager.kt
│ │ │ │ │ ├── AutoTestMessage.kt
│ │ │ │ │ ├── AutoTestState.kt
│ │ │ │ │ ├── DelayHandler.kt
│ │ │ │ │ └── ui/
│ │ │ │ │ ├── AutotestPage.java
│ │ │ │ │ ├── DoKitAutotestActivity.java
│ │ │ │ │ ├── DoKitAutotestConnectFragment.kt
│ │ │ │ │ ├── DoKitAutotestFragment.kt
│ │ │ │ │ └── RecordingCaseDoKitView.kt
│ │ │ │ └── res/
│ │ │ │ ├── drawable/
│ │ │ │ │ ├── dk_autotest_dialog_bg.xml
│ │ │ │ │ ├── dk_autotest_flash_blue_bg.xml
│ │ │ │ │ ├── dk_autotest_flash_green_bg.xml
│ │ │ │ │ ├── dk_autotest_flash_red_bg.xml
│ │ │ │ │ └── dk_btn_autotest_bg.xml
│ │ │ │ ├── layout/
│ │ │ │ │ ├── dk_activity_autotest.xml
│ │ │ │ │ ├── dk_autotest_view_recording_case.xml
│ │ │ │ │ ├── dk_fragment_autotest_connect.xml
│ │ │ │ │ └── dk_fragment_autotest_main.xml
│ │ │ │ ├── values/
│ │ │ │ │ └── strings.xml
│ │ │ │ ├── values-en-rCN/
│ │ │ │ │ └── strings.xml
│ │ │ │ ├── values-zh-rTW/
│ │ │ │ │ └── strings.xml
│ │ │ │ └── values-zh-rUS/
│ │ │ │ └── strings.xml
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── didichuxing/
│ │ │ └── doraemonkit/
│ │ │ └── kit/
│ │ │ └── autotest/
│ │ │ └── ExampleUnitTest.java
│ │ └── upload.sh
│ ├── dokit-ft/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── gradle.properties
│ │ ├── proguard-rules.pro
│ │ ├── src/
│ │ │ └── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── didichuxing/
│ │ │ │ └── doraemonkit/
│ │ │ │ └── kit/
│ │ │ │ └── filemanager/
│ │ │ │ ├── DokitFileRouter.kt
│ │ │ │ ├── FileManagerUtil.kt
│ │ │ │ ├── FileTransferFragment.kt
│ │ │ │ ├── FileTransferKit.kt
│ │ │ │ ├── HttpServer.kt
│ │ │ │ ├── ability/
│ │ │ │ │ ├── DokitFtAbility.kt
│ │ │ │ │ └── DokitFtModuleProcessor.kt
│ │ │ │ ├── action/
│ │ │ │ │ ├── RequestErrorAction.kt
│ │ │ │ │ ├── file/
│ │ │ │ │ │ ├── CreateFolderAction.kt
│ │ │ │ │ │ ├── DeleteFileAction.kt
│ │ │ │ │ │ ├── DeviceInfoAction.kt
│ │ │ │ │ │ ├── FileDetailAction.kt
│ │ │ │ │ │ ├── FileListAction.kt
│ │ │ │ │ │ ├── IndexAction.kt
│ │ │ │ │ │ ├── RenameFileAction.kt
│ │ │ │ │ │ ├── SaveFileAction.kt
│ │ │ │ │ │ └── UploadFileAction.kt
│ │ │ │ │ └── sql/
│ │ │ │ │ └── DatabaseAction.kt
│ │ │ │ ├── bean/
│ │ │ │ │ ├── DirInfo.kt
│ │ │ │ │ ├── RenameFileInfo.kt
│ │ │ │ │ └── SaveFileInfo.kt
│ │ │ │ ├── convert/
│ │ │ │ │ └── GsonConverter.kt
│ │ │ │ └── sqlite/
│ │ │ │ ├── DBManager.kt
│ │ │ │ ├── bean/
│ │ │ │ │ ├── RowFiledInfo.kt
│ │ │ │ │ ├── RowRequestInfo.kt
│ │ │ │ │ └── TableFieldInfo.kt
│ │ │ │ ├── dao/
│ │ │ │ │ ├── EncryptSQLiteDB.kt
│ │ │ │ │ ├── NormalSQLiteDB.kt
│ │ │ │ │ └── SQLiteDB.kt
│ │ │ │ ├── factory/
│ │ │ │ │ ├── DBFactory.kt
│ │ │ │ │ ├── EncryptDBFactory.kt
│ │ │ │ │ └── NormalDBFactory.kt
│ │ │ │ └── util/
│ │ │ │ └── DBUtil.kt
│ │ │ └── res/
│ │ │ └── layout/
│ │ │ └── dk_fragment_file_transfer.xml
│ │ └── upload.sh
│ ├── dokit-gps-mock/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── consumer-rules.pro
│ │ ├── gradle.properties
│ │ ├── libs/
│ │ │ └── BaiduLBS_Android.jar
│ │ ├── proguard-rules.pro
│ │ └── src/
│ │ ├── androidTest/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── didichuxing/
│ │ │ └── doraemonkit/
│ │ │ └── ExampleInstrumentedTest.java
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── didichuxing/
│ │ │ │ └── doraemonkit/
│ │ │ │ └── gps_mock/
│ │ │ │ ├── ability/
│ │ │ │ │ ├── DokitFtAbility.kt
│ │ │ │ │ └── DokitFtModuleProcessor.kt
│ │ │ │ ├── common/
│ │ │ │ │ ├── BdMapRouteData.java
│ │ │ │ │ └── Utils.java
│ │ │ │ ├── gpsmock/
│ │ │ │ │ ├── BaseServiceHooker.kt
│ │ │ │ │ ├── BinderHookHandler.java
│ │ │ │ │ ├── CordTransformUtil.java
│ │ │ │ │ ├── GpsMockFragment.java
│ │ │ │ │ ├── GpsMockKit.kt
│ │ │ │ │ ├── GpsMockManager.java
│ │ │ │ │ ├── GpsMockProxyManager.kt
│ │ │ │ │ ├── LocationBuilder.java
│ │ │ │ │ ├── LocationHookHandler.java
│ │ │ │ │ ├── LocationHooker.java
│ │ │ │ │ ├── MethodHandler.kt
│ │ │ │ │ ├── RouteMockThread.java
│ │ │ │ │ ├── ServiceHookManager.kt
│ │ │ │ │ ├── TelephonyHooker.java
│ │ │ │ │ ├── TencentLocationImp.java
│ │ │ │ │ └── WifiHooker.java
│ │ │ │ ├── lbs/
│ │ │ │ │ ├── common/
│ │ │ │ │ │ ├── AMapDrivingRouteOverLay.java
│ │ │ │ │ │ ├── AMapRouteOverlay.java
│ │ │ │ │ │ ├── AMapUtil.kt
│ │ │ │ │ │ ├── Constants.java
│ │ │ │ │ │ └── LocInfo.java
│ │ │ │ │ ├── manual/
│ │ │ │ │ │ ├── FloatGpsMockCache.java
│ │ │ │ │ │ ├── GPSTools.java
│ │ │ │ │ │ ├── PosAdjustKit.kt
│ │ │ │ │ │ └── PosAdjustKitView.java
│ │ │ │ │ ├── preset/
│ │ │ │ │ │ ├── FloatGpsPresetMockCache.java
│ │ │ │ │ │ └── MockLocList.java
│ │ │ │ │ └── route/
│ │ │ │ │ ├── AMapRealNavMockView.kt
│ │ │ │ │ ├── FloatGpsRouteMockCache.java
│ │ │ │ │ ├── NaviSettings.kt
│ │ │ │ │ └── RealNavMockKit.kt
│ │ │ │ ├── location/
│ │ │ │ │ └── GpsStatusUtil.java
│ │ │ │ ├── map/
│ │ │ │ │ ├── AMapLocationChangedListenerProxy.java
│ │ │ │ │ ├── AMapLocationClientProxy.java
│ │ │ │ │ ├── AMapLocationListenerProxy.java
│ │ │ │ │ ├── AMapLocationSourceProxy.java
│ │ │ │ │ ├── AMapNaviListenerProxy.java
│ │ │ │ │ ├── AMapNaviListenerProxyDelegate.java
│ │ │ │ │ ├── AMapNaviListenerProxyNoOp.java
│ │ │ │ │ ├── BDAbsLocationListenerProxy.java
│ │ │ │ │ ├── BDLocationListenerProxy.java
│ │ │ │ │ ├── BDLocationUtil.java
│ │ │ │ │ ├── DMapLocationListener.kt
│ │ │ │ │ ├── TencentLocationListenerProxy.java
│ │ │ │ │ └── ThirdMapLocationListenerUtil.java
│ │ │ │ ├── sysservicehook/
│ │ │ │ │ ├── ActivityMangerHooker.kt
│ │ │ │ │ ├── ActivityTaskMangerHooker.kt
│ │ │ │ │ ├── GetInstalledApplicationsMethodHandler.kt
│ │ │ │ │ ├── PackageManagerHooker.kt
│ │ │ │ │ └── StartActivityMethodHandler.kt
│ │ │ │ └── widget/
│ │ │ │ ├── CustomDialogFragment.java
│ │ │ │ ├── DrivingRouteOverlay.java
│ │ │ │ ├── IDialogHelper.java
│ │ │ │ ├── OverlayManager.java
│ │ │ │ ├── PositionSelectDialogHelper.java
│ │ │ │ ├── PositionSelectRecyclerAdapter.java
│ │ │ │ ├── RouteMockDokitView.kt
│ │ │ │ └── SeekRangeBar.java
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ ├── dk_bg_btn_round_rectangle.xml
│ │ │ │ ├── dk_bg_custom_spinner.xml
│ │ │ │ ├── dk_bg_dokitview_route_mock.xml
│ │ │ │ ├── dk_bg_edt_hint.xml
│ │ │ │ ├── dk_bg_gray_round_rectangle.xml
│ │ │ │ ├── dk_bg_round_edt.xml
│ │ │ │ ├── dk_icon_loc_circle_shape.xml
│ │ │ │ ├── dk_seek_bar_background_shape.xml
│ │ │ │ ├── dk_seek_bar_circle_indicator.xml
│ │ │ │ └── dk_seek_bar_foreground_shape.xml
│ │ │ ├── layout/
│ │ │ │ ├── dk_dokitview_route_mock.xml
│ │ │ │ ├── dk_fragment_gps_mock.xml
│ │ │ │ ├── dk_item_position_select.xml
│ │ │ │ └── dk_position_select_dialog_fragment.xml
│ │ │ ├── values/
│ │ │ │ ├── attrs.xml
│ │ │ │ ├── colors.xml
│ │ │ │ ├── dimens.xml
│ │ │ │ └── strings.xml
│ │ │ ├── values-en-rCN/
│ │ │ │ └── strings.xml
│ │ │ ├── values-zh-rTW/
│ │ │ │ └── strings.xml
│ │ │ ├── values-zh-rUS/
│ │ │ │ └── strings.xml
│ │ │ └── xml/
│ │ │ └── gps_mock_root_scene.xml
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── didichuxing/
│ │ └── doraemonkit/
│ │ └── ExampleUnitTest.java
│ ├── dokit-leakcanary/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── gradle.properties
│ │ ├── proguard-rules.pro
│ │ ├── src/
│ │ │ └── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── aidl/
│ │ │ │ └── com/
│ │ │ │ └── didichuxing/
│ │ │ │ └── doraemonkit/
│ │ │ │ └── aidl/
│ │ │ │ ├── IReceiverAidlInterface.aidl
│ │ │ │ └── ISenderAidlInterface.aidl
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ ├── didichuxing/
│ │ │ │ │ └── doraemonkit/
│ │ │ │ │ ├── LeakCanaryManager.java
│ │ │ │ │ ├── abridge/
│ │ │ │ │ │ ├── AbridgeCallBack.java
│ │ │ │ │ │ ├── AbridgeManager.java
│ │ │ │ │ │ ├── AbridgeMessengerCallBack.java
│ │ │ │ │ │ ├── AbridgeMessengerManager.java
│ │ │ │ │ │ ├── IBridge.java
│ │ │ │ │ │ └── service/
│ │ │ │ │ │ ├── ABridgeService.java
│ │ │ │ │ │ └── MessengerService.java
│ │ │ │ │ └── kit/
│ │ │ │ │ └── leakcanary/
│ │ │ │ │ └── LeakCanaryKit.java
│ │ │ │ └── squareup/
│ │ │ │ ├── haha/
│ │ │ │ │ └── perflib/
│ │ │ │ │ └── HahaSpy.java
│ │ │ │ └── leakcanary/
│ │ │ │ ├── AbstractAnalysisResultService.java
│ │ │ │ ├── ActivityRefWatcher.java
│ │ │ │ ├── AnalysisResult.java
│ │ │ │ ├── AnalyzedHeap.java
│ │ │ │ ├── AnalyzerProgressListener.java
│ │ │ │ ├── AndroidDebuggerControl.java
│ │ │ │ ├── AndroidExcludedRefs.java
│ │ │ │ ├── AndroidHeapDumper.java
│ │ │ │ ├── AndroidReachabilityInspectors.java
│ │ │ │ ├── AndroidRefWatcherBuilder.java
│ │ │ │ ├── AndroidWatchExecutor.java
│ │ │ │ ├── CanaryLog.java
│ │ │ │ ├── DebuggerControl.java
│ │ │ │ ├── DefaultLeakDirectoryProvider.java
│ │ │ │ ├── DisplayLeakService.java
│ │ │ │ ├── ExcludedRefs.java
│ │ │ │ ├── Exclusion.java
│ │ │ │ ├── FailTestOnLeakRunListener.java
│ │ │ │ ├── GcTrigger.java
│ │ │ │ ├── HahaHelper.java
│ │ │ │ ├── HeapAnalyzer.java
│ │ │ │ ├── HeapDump.java
│ │ │ │ ├── HeapDumper.java
│ │ │ │ ├── InstrumentationLeakDetector.java
│ │ │ │ ├── InstrumentationLeakResults.java
│ │ │ │ ├── KeyedWeakReference.java
│ │ │ │ ├── LeakCanary.java
│ │ │ │ ├── LeakDirectoryProvider.java
│ │ │ │ ├── LeakNode.java
│ │ │ │ ├── LeakReference.java
│ │ │ │ ├── LeakTrace.java
│ │ │ │ ├── LeakTraceElement.java
│ │ │ │ ├── Preconditions.java
│ │ │ │ ├── Reachability.java
│ │ │ │ ├── RefWatcher.java
│ │ │ │ ├── RefWatcherBuilder.java
│ │ │ │ ├── Retryable.java
│ │ │ │ ├── ServiceHeapDumpListener.java
│ │ │ │ ├── ShortestPathFinder.java
│ │ │ │ ├── TrackedReference.java
│ │ │ │ ├── UploadLeakService.java
│ │ │ │ ├── WatchExecutor.java
│ │ │ │ └── internal/
│ │ │ │ ├── ActivityLifecycleCallbacksAdapter.java
│ │ │ │ ├── AndroidOFragmentRefWatcher.java
│ │ │ │ ├── DisplayLeakActivity.java
│ │ │ │ ├── DisplayLeakAdapter.java
│ │ │ │ ├── DisplayLeakConnectorView.java
│ │ │ │ ├── ForegroundService.java
│ │ │ │ ├── FragmentRefWatcher.java
│ │ │ │ ├── FutureResult.java
│ │ │ │ ├── HeapAnalyzerService.java
│ │ │ │ ├── LeakCanaryFileProvider.java
│ │ │ │ ├── LeakCanaryInternals.java
│ │ │ │ ├── LeakCanarySingleThreadFactory.java
│ │ │ │ ├── MoreDetailsView.java
│ │ │ │ ├── RequestStoragePermissionActivity.java
│ │ │ │ ├── RowElementLayout.java
│ │ │ │ ├── SquigglySpan.java
│ │ │ │ └── SupportFragmentRefWatcher.java
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ ├── leak_canary_icon_foreground.xml
│ │ │ │ └── leak_canary_toast_background.xml
│ │ │ ├── layout/
│ │ │ │ ├── leak_canary_display_leak.xml
│ │ │ │ ├── leak_canary_heap_dump_toast.xml
│ │ │ │ ├── leak_canary_leak_row.xml
│ │ │ │ ├── leak_canary_ref_row.xml
│ │ │ │ └── leak_canary_ref_top_row.xml
│ │ │ ├── values/
│ │ │ │ ├── leak_canary_attrs.xml
│ │ │ │ ├── leak_canary_colors.xml
│ │ │ │ ├── leak_canary_dimens.xml
│ │ │ │ ├── leak_canary_icon_background.xml
│ │ │ │ ├── leak_canary_public.xml
│ │ │ │ ├── leak_canary_strings.xml
│ │ │ │ ├── leak_canary_themes.xml
│ │ │ │ └── strings.xml
│ │ │ └── xml/
│ │ │ └── leak_canary_file_paths.xml
│ │ └── upload.sh
│ ├── dokit-mc/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── gradle.properties
│ │ ├── proguard-rules.pro
│ │ ├── src/
│ │ │ ├── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── java/
│ │ │ │ │ └── com/
│ │ │ │ │ └── didichuxing/
│ │ │ │ │ └── doraemonkit/
│ │ │ │ │ └── kit/
│ │ │ │ │ └── mc/
│ │ │ │ │ ├── AbstractMultiController.kt
│ │ │ │ │ ├── ClientMultiController.kt
│ │ │ │ │ ├── DelayHandler.kt
│ │ │ │ │ ├── HostMultiController.kt
│ │ │ │ │ ├── MultiControlConfig.kt
│ │ │ │ │ ├── MultiControlKit.kt
│ │ │ │ │ ├── MultiControlKitTest.kt
│ │ │ │ │ ├── MultiControlManager.kt
│ │ │ │ │ ├── OnMultiControlModeChangeListener.kt
│ │ │ │ │ ├── ability/
│ │ │ │ │ │ ├── DoKitMcAbility.kt
│ │ │ │ │ │ └── DoKitMcModuleProcessor.kt
│ │ │ │ │ ├── net/
│ │ │ │ │ │ ├── ConnectMode.kt
│ │ │ │ │ │ ├── DoKitMcClient.kt
│ │ │ │ │ │ ├── DoKitMcHostServer.kt
│ │ │ │ │ │ ├── DokitMcConnectManager.kt
│ │ │ │ │ │ ├── WSEventProcessor.kt
│ │ │ │ │ │ ├── WSSRouter.kt
│ │ │ │ │ │ └── WSServerProcessor.kt
│ │ │ │ │ ├── oldui/
│ │ │ │ │ │ ├── DoKitMcManager.kt
│ │ │ │ │ │ ├── client/
│ │ │ │ │ │ │ ├── ClientDoKitView.kt
│ │ │ │ │ │ │ ├── DoKitMcClientFragment.kt
│ │ │ │ │ │ │ └── DoKitMcClientHistoryFragment.kt
│ │ │ │ │ │ ├── host/
│ │ │ │ │ │ │ ├── DoKitMcHostFragment.kt
│ │ │ │ │ │ │ └── HostDoKitView.kt
│ │ │ │ │ │ ├── main/
│ │ │ │ │ │ │ └── DoKitMcMainFragment.kt
│ │ │ │ │ │ └── record/
│ │ │ │ │ │ ├── DoKitMcDatasFragment.kt
│ │ │ │ │ │ └── RecordingDoKitView.kt
│ │ │ │ │ ├── report/
│ │ │ │ │ │ ├── MCRecordManager.kt
│ │ │ │ │ │ ├── RecordActionCase.kt
│ │ │ │ │ │ ├── RecordActionStep.kt
│ │ │ │ │ │ ├── RecordData.kt
│ │ │ │ │ │ └── ScreenShotManager.java
│ │ │ │ │ ├── ui/
│ │ │ │ │ │ ├── BorderDoKitView.java
│ │ │ │ │ │ ├── DoKitMcActivity.kt
│ │ │ │ │ │ ├── DoKitMcScanActivity.kt
│ │ │ │ │ │ ├── McDialogDoKitView.kt
│ │ │ │ │ │ ├── McPages.kt
│ │ │ │ │ │ ├── adapter/
│ │ │ │ │ │ │ ├── McCaseInfoDialogProvider.kt
│ │ │ │ │ │ │ ├── McCaseListAdapter.kt
│ │ │ │ │ │ │ └── McClientHistoryAdapter.kt
│ │ │ │ │ │ └── connect/
│ │ │ │ │ │ ├── MultiControlAllFragment.kt
│ │ │ │ │ │ └── MultiControlDoKitView.kt
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── ActivityStatusUtil.kt
│ │ │ │ │ ├── ClientHistoryUtils.kt
│ │ │ │ │ ├── CodeUtils.kt
│ │ │ │ │ ├── ConnectHistoryUtils.kt
│ │ │ │ │ ├── DensityUtils.kt
│ │ │ │ │ ├── McCaseUtils.kt
│ │ │ │ │ ├── McPageUtils.kt
│ │ │ │ │ └── WSPackageUtils.kt
│ │ │ │ └── res/
│ │ │ │ ├── drawable/
│ │ │ │ │ ├── dk_btn_mc_bg.xml
│ │ │ │ │ ├── dk_dokitview_mc.xml
│ │ │ │ │ ├── dk_dokitview_mc_connect.xml
│ │ │ │ │ └── dk_dokitview_mc_recoding.xml
│ │ │ │ ├── layout/
│ │ │ │ │ ├── dk_activity_mc.xml
│ │ │ │ │ ├── dk_dialog_mc_case_info.xml
│ │ │ │ │ ├── dk_dokitview_client.xml
│ │ │ │ │ ├── dk_dokitview_connect.xml
│ │ │ │ │ ├── dk_dokitview_dialog.xml
│ │ │ │ │ ├── dk_dokitview_host.xml
│ │ │ │ │ ├── dk_dokitview_recording.xml
│ │ │ │ │ ├── dk_fragment_mc_client.xml
│ │ │ │ │ ├── dk_fragment_mc_client_history.xml
│ │ │ │ │ ├── dk_fragment_mc_connect.xml
│ │ │ │ │ ├── dk_fragment_mc_connect_history.xml
│ │ │ │ │ ├── dk_fragment_mc_datas.xml
│ │ │ │ │ ├── dk_fragment_mc_host.xml
│ │ │ │ │ ├── dk_fragment_mc_select.xml
│ │ │ │ │ ├── dk_item_mc_case.xml
│ │ │ │ │ └── dk_item_mc_client.xml
│ │ │ │ ├── values/
│ │ │ │ │ └── strings.xml
│ │ │ │ ├── values-en-rCN/
│ │ │ │ │ └── strings.xml
│ │ │ │ ├── values-zh-rTW/
│ │ │ │ │ └── strings.xml
│ │ │ │ ├── values-zh-rUS/
│ │ │ │ │ └── strings.xml
│ │ │ │ └── xml/
│ │ │ │ └── mc_accessibity_config.xml
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── didichuxing/
│ │ │ └── doraemonkit/
│ │ │ └── ExampleUnitTest.kt
│ │ └── upload.sh
│ ├── dokit-no-op/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── gradle.properties
│ │ ├── proguard-rules.pro
│ │ ├── src/
│ │ │ └── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── didichuxing/
│ │ │ └── doraemonkit/
│ │ │ ├── DoKit.kt
│ │ │ ├── DoKitCallBack.kt
│ │ │ ├── DoKitMCHummerHelper.java
│ │ │ ├── DoraemonKit.kt
│ │ │ ├── kit/
│ │ │ │ ├── AbstractKit.kt
│ │ │ │ ├── Category.java
│ │ │ │ ├── IKit.kt
│ │ │ │ ├── core/
│ │ │ │ │ ├── AbsDokitFragment.kt
│ │ │ │ │ ├── AbsDokitView.kt
│ │ │ │ │ ├── BaseFragment.kt
│ │ │ │ │ ├── DokitFrameLayout.java
│ │ │ │ │ ├── DokitIntent.kt
│ │ │ │ │ ├── DokitView.java
│ │ │ │ │ ├── DokitViewInterface.java
│ │ │ │ │ ├── DokitViewLayoutParams.java
│ │ │ │ │ ├── DokitViewManager.kt
│ │ │ │ │ ├── DokitViewManagerInterface.kt
│ │ │ │ │ ├── McClientProcessor.kt
│ │ │ │ │ └── TouchProxy.java
│ │ │ │ ├── network/
│ │ │ │ │ ├── bean/
│ │ │ │ │ │ ├── NetworkRecord.java
│ │ │ │ │ │ ├── Request.java
│ │ │ │ │ │ └── Response.java
│ │ │ │ │ └── okhttp/
│ │ │ │ │ └── interceptor/
│ │ │ │ │ └── DokitExtInterceptor.kt
│ │ │ │ ├── performance/
│ │ │ │ │ └── PerformanceValueListener.kt
│ │ │ │ ├── test/
│ │ │ │ │ ├── DoKitTestManager.kt
│ │ │ │ │ └── TestMode.kt
│ │ │ │ └── webdoor/
│ │ │ │ └── WebDoorManager.java
│ │ │ └── tcp/
│ │ │ └── ability/
│ │ │ ├── MessageReceiverHook.java
│ │ │ ├── MessageSenderHook.java
│ │ │ └── TcpMessageHook.java
│ │ └── upload.sh
│ ├── dokit-okhttp-api/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── gradle.properties
│ │ ├── proguard-rules.pro
│ │ ├── src/
│ │ │ └── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── didichuxing/
│ │ │ └── doraemonkit/
│ │ │ └── okhttp_api/
│ │ │ └── OkHttpWrap.kt
│ │ └── upload.sh
│ ├── dokit-okhttp-v3/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── gradle.properties
│ │ ├── proguard-rules.pro
│ │ ├── src/
│ │ │ └── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── didichuxing/
│ │ │ └── doraemonkit/
│ │ │ └── okhttp_api/
│ │ │ ├── ByteCountBufferedSinkV3.java
│ │ │ └── OkHttpWrapV3.kt
│ │ └── upload.sh
│ ├── dokit-okhttp-v4/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── gradle.properties
│ │ ├── proguard-rules.pro
│ │ ├── src/
│ │ │ └── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── didichuxing/
│ │ │ └── doraemonkit/
│ │ │ └── okhttp_api/
│ │ │ ├── ByteCountBufferedSinkV4.java
│ │ │ └── OkHttpWrapV4.kt
│ │ └── upload.sh
│ ├── dokit-plugin/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── gradle.properties
│ │ ├── src/
│ │ │ └── main/
│ │ │ ├── kotlin/
│ │ │ │ └── com/
│ │ │ │ └── didichuxing/
│ │ │ │ └── doraemonkit/
│ │ │ │ └── plugin/
│ │ │ │ ├── DoKitExt.kt
│ │ │ │ ├── DoKitExtUtil.kt
│ │ │ │ ├── DoKitPlugin.kt
│ │ │ │ ├── DoKitPluginUtil.kt
│ │ │ │ ├── DoKitTransformTaskExecutionListener.kt
│ │ │ │ ├── extension/
│ │ │ │ │ ├── BigImageExtension.kt
│ │ │ │ │ ├── DoKitExtension.kt
│ │ │ │ │ ├── GpsExtension.kt
│ │ │ │ │ ├── NetworkExtension.kt
│ │ │ │ │ ├── SlowMethodExtension.kt
│ │ │ │ │ └── WebViewExtension.kt
│ │ │ │ ├── processor/
│ │ │ │ │ ├── DoKitComponentHandler.kt
│ │ │ │ │ └── DoKitPluginConfigProcessor.kt
│ │ │ │ ├── stack_method/
│ │ │ │ │ ├── MethodStackNode.kt
│ │ │ │ │ └── MethodStackNodeUtil.kt
│ │ │ │ ├── thirdlib/
│ │ │ │ │ ├── ThirdLibInfo.kt
│ │ │ │ │ └── ThirdLibVariantProcessor.kt
│ │ │ │ └── transform/
│ │ │ │ ├── DoKitBaseTransform.kt
│ │ │ │ ├── DoKitCommonTransform.kt
│ │ │ │ ├── DoKitCommonTransformV34.kt
│ │ │ │ ├── DoKitDependTransform.kt
│ │ │ │ ├── DoKitDependTransformV34.kt
│ │ │ │ ├── DoKitTransformContext.kt
│ │ │ │ ├── DoKitTransformInvocation.kt
│ │ │ │ ├── asmtransform/
│ │ │ │ │ ├── BaseDoKitAsmTransformer.kt
│ │ │ │ │ └── DoKitAsmTransformer.kt
│ │ │ │ └── classtransform/
│ │ │ │ ├── AbsClassTransformer.kt
│ │ │ │ ├── BigImgClassTransformer.kt
│ │ │ │ ├── CommClassTransformer.kt
│ │ │ │ ├── EnterMSClassTransformer.kt
│ │ │ │ ├── GPSAMapClassTransformer.kt
│ │ │ │ ├── GPSBDClassTransformer.kt
│ │ │ │ ├── GPSClassTransformer.kt
│ │ │ │ ├── GPSTencentClassTransformer.kt
│ │ │ │ ├── GSMClassTransformer.kt
│ │ │ │ ├── MSDClassTransformer.kt
│ │ │ │ ├── Okhttp3ClassTransformer.kt
│ │ │ │ ├── ThirdLibsClassTransformer.kt
│ │ │ │ ├── UrlConnectionTransformer.kt
│ │ │ │ └── WebViewClassTransformer.kt
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── gradle-plugins/
│ │ │ └── com.didi.dokit.properties
│ │ └── upload.sh
│ ├── dokit-pthread-hook/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── consumer-rules.pro
│ │ ├── gradle.properties
│ │ ├── proguard-rules.pro
│ │ └── src/
│ │ ├── androidTest/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── kronos/
│ │ │ └── dokit/
│ │ │ └── pthread/
│ │ │ └── ExampleInstrumentedTest.kt
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── kronos/
│ │ │ │ └── dokit/
│ │ │ │ └── pthread/
│ │ │ │ ├── AutoDumpListener.kt
│ │ │ │ ├── PThreadDumpHelper.kt
│ │ │ │ ├── PThreadEntity.kt
│ │ │ │ ├── PThreadKit.kt
│ │ │ │ ├── ViewExtensions.kt
│ │ │ │ └── ui/
│ │ │ │ ├── PThreadHookUiActivity.kt
│ │ │ │ └── ThreadAdapter.kt
│ │ │ └── res/
│ │ │ ├── layout/
│ │ │ │ ├── activity_pthread_hook.xml
│ │ │ │ └── recycler_view_thread_hook.xml
│ │ │ └── values/
│ │ │ └── values.xml
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── kronos/
│ │ └── dokit/
│ │ └── pthread/
│ │ └── ExampleUnitTest.kt
│ ├── dokit-test/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── consumer-rules.pro
│ │ ├── gradle.properties
│ │ ├── proguard-rules.pro
│ │ ├── src/
│ │ │ ├── main/
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── java/
│ │ │ │ └── com/
│ │ │ │ └── didichuxing/
│ │ │ │ └── doraemonkit/
│ │ │ │ └── kit/
│ │ │ │ └── test/
│ │ │ │ ├── DoKitTestManager.kt
│ │ │ │ ├── OnTestModeChangeListener.kt
│ │ │ │ ├── TestMode.kt
│ │ │ │ ├── event/
│ │ │ │ │ ├── AccessibilityEventNode.kt
│ │ │ │ │ ├── ActionType.kt
│ │ │ │ │ ├── ControlEvent.kt
│ │ │ │ │ ├── ControlEventManager.kt
│ │ │ │ │ ├── ControlEventProcessor.kt
│ │ │ │ │ ├── DoKitViewNode.kt
│ │ │ │ │ ├── DoKitViewPanelNode.kt
│ │ │ │ │ ├── EventErrorCode.kt
│ │ │ │ │ ├── EventType.kt
│ │ │ │ │ ├── OnControlEventActionListener.kt
│ │ │ │ │ ├── OnControlEventActionProcessListener.kt
│ │ │ │ │ ├── OnControlEventInterceptor.kt
│ │ │ │ │ ├── Position.kt
│ │ │ │ │ ├── SystemViewNode.kt
│ │ │ │ │ ├── ViewC12c.kt
│ │ │ │ │ ├── WindowNode.kt
│ │ │ │ │ ├── monitor/
│ │ │ │ │ │ ├── AccessibilityEventMonitor.kt
│ │ │ │ │ │ ├── CustomEventMonitor.kt
│ │ │ │ │ │ ├── LifecycleEventMonitor.kt
│ │ │ │ │ │ └── TcpMessageEventMonitor.kt
│ │ │ │ │ └── processor/
│ │ │ │ │ ├── AbstractEventProcessor.kt
│ │ │ │ │ ├── AccessibilityEventProcessor.kt
│ │ │ │ │ ├── CustomEventProcessor.kt
│ │ │ │ │ ├── LifecycleEventProcessor.kt
│ │ │ │ │ └── TcpMessageEventProcessor.kt
│ │ │ │ ├── hook/
│ │ │ │ │ ├── AccessibilityGetInstanceMethodHook.kt
│ │ │ │ │ ├── ViewOnClickListenerEventHook.kt
│ │ │ │ │ ├── ViewOnClickListenerProxy.kt
│ │ │ │ │ └── ViewOnInitializeAccessibilityEventHook.kt
│ │ │ │ ├── mock/
│ │ │ │ │ ├── HttpMockInterceptor.kt
│ │ │ │ │ ├── MockManager.kt
│ │ │ │ │ ├── OnHttpProxyMockDataListener.kt
│ │ │ │ │ ├── OnHttpProxyMockSendListener.kt
│ │ │ │ │ ├── ProxyMockCallback.kt
│ │ │ │ │ ├── data/
│ │ │ │ │ │ ├── AppInfo.kt
│ │ │ │ │ │ ├── CaseInfo.kt
│ │ │ │ │ │ ├── HostInfo.kt
│ │ │ │ │ │ ├── HttpMatchedInfo.kt
│ │ │ │ │ │ ├── HttpUploadInfo.kt
│ │ │ │ │ │ ├── McCaseInfo.kt
│ │ │ │ │ │ ├── McConfigInfo.kt
│ │ │ │ │ │ ├── McMockKey.kt
│ │ │ │ │ │ └── McResInfo.kt
│ │ │ │ │ ├── http/
│ │ │ │ │ │ ├── DoKitMockInterceptor.kt
│ │ │ │ │ │ ├── DoKitProxyMockInterceptor.kt
│ │ │ │ │ │ └── HttpMockServer.kt
│ │ │ │ │ ├── proxy/
│ │ │ │ │ │ ├── ProxyCallback.kt
│ │ │ │ │ │ ├── ProxyMockManager.kt
│ │ │ │ │ │ ├── ProxyMockUtils.kt
│ │ │ │ │ │ ├── ProxyQueryData.java
│ │ │ │ │ │ ├── ProxyRequest.kt
│ │ │ │ │ │ └── ProxyResponse.kt
│ │ │ │ │ └── tcp/
│ │ │ │ │ ├── TcpMockManager.kt
│ │ │ │ │ └── TcpMockMessageProcessor.kt
│ │ │ │ ├── report/
│ │ │ │ │ ├── AutoTestMessage.kt
│ │ │ │ │ ├── AutoTestState.kt
│ │ │ │ │ ├── FileUploadManager.kt
│ │ │ │ │ ├── MCRecordManager.kt
│ │ │ │ │ ├── MyWindowBitmap.kt
│ │ │ │ │ ├── RecordActionCase.kt
│ │ │ │ │ ├── RecordActionStep.kt
│ │ │ │ │ ├── RecordData.kt
│ │ │ │ │ └── ScreenShotManager.java
│ │ │ │ ├── utils/
│ │ │ │ │ ├── DateTime.kt
│ │ │ │ │ ├── RandomIdentityUtil.kt
│ │ │ │ │ ├── ReflectHookUtil.java
│ │ │ │ │ ├── ViewPathUtil.kt
│ │ │ │ │ ├── WindowPathUtil.java
│ │ │ │ │ └── XposedHookUtil.kt
│ │ │ │ └── widget/
│ │ │ │ ├── FlashImageView.kt
│ │ │ │ └── FlashTextView.kt
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── didichuxing/
│ │ │ └── doraemonkit/
│ │ │ └── kit/
│ │ │ └── test/
│ │ │ └── ExampleUnitTest.java
│ │ └── upload.sh
│ ├── dokit-util/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── gradle.properties
│ │ ├── proguard-rules.pro
│ │ ├── src/
│ │ │ └── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── didichuxing/
│ │ │ │ └── doraemonkit/
│ │ │ │ ├── constant/
│ │ │ │ │ ├── CacheConstants.java
│ │ │ │ │ ├── MemoryConstants.java
│ │ │ │ │ ├── PermissionConstants.java
│ │ │ │ │ ├── RegexConstants.java
│ │ │ │ │ └── TimeConstants.java
│ │ │ │ └── util/
│ │ │ │ ├── ActivityUtils.java
│ │ │ │ ├── AdaptScreenUtils.java
│ │ │ │ ├── ApiUtils.java
│ │ │ │ ├── AppStoreUtils.java
│ │ │ │ ├── AppUtils.java
│ │ │ │ ├── ArrayUtils.java
│ │ │ │ ├── BarUtils.java
│ │ │ │ ├── BatteryUtils.java
│ │ │ │ ├── BitUtils.java
│ │ │ │ ├── BrightnessUtils.java
│ │ │ │ ├── BusUtils.java
│ │ │ │ ├── CacheDiskStaticUtils.java
│ │ │ │ ├── CacheDiskUtils.java
│ │ │ │ ├── CacheDoubleStaticUtils.java
│ │ │ │ ├── CacheDoubleUtils.java
│ │ │ │ ├── CacheMemoryStaticUtils.java
│ │ │ │ ├── CacheMemoryUtils.java
│ │ │ │ ├── CameraUtils.java
│ │ │ │ ├── CleanUtils.java
│ │ │ │ ├── ClickUtils.java
│ │ │ │ ├── ClipboardUtils.java
│ │ │ │ ├── CloneUtils.java
│ │ │ │ ├── CloseUtils.java
│ │ │ │ ├── CollectionUtils.java
│ │ │ │ ├── ColorUtils.java
│ │ │ │ ├── ConvertUtils.java
│ │ │ │ ├── CoordinateUtils.java
│ │ │ │ ├── CountryUtils.java
│ │ │ │ ├── CrashUtils.java
│ │ │ │ ├── DangerousUtils.java
│ │ │ │ ├── DebouncingUtils.java
│ │ │ │ ├── DeviceUtils.java
│ │ │ │ ├── DialogUtils.java
│ │ │ │ ├── EncodeUtils.java
│ │ │ │ ├── EncryptUtils.java
│ │ │ │ ├── FileIOUtils.java
│ │ │ │ ├── FileUtils.java
│ │ │ │ ├── FlashlightUtils.java
│ │ │ │ ├── FragmentUtils.java
│ │ │ │ ├── GlideUtils.java
│ │ │ │ ├── GsonUtils.java
│ │ │ │ ├── HttpsUtil.java
│ │ │ │ ├── ImageUtils.java
│ │ │ │ ├── IntentUtils.java
│ │ │ │ ├── JsonUtils.java
│ │ │ │ ├── KeyboardUtils.java
│ │ │ │ ├── LanguageUtils.java
│ │ │ │ ├── LocationUtils.java
│ │ │ │ ├── LogUtils.java
│ │ │ │ ├── LunarUtils.java
│ │ │ │ ├── MapUtils.java
│ │ │ │ ├── MessengerUtils.java
│ │ │ │ ├── MetaDataUtils.java
│ │ │ │ ├── NetworkUtils.java
│ │ │ │ ├── NotificationUtils.java
│ │ │ │ ├── NumberUtils.java
│ │ │ │ ├── ObjectUtils.java
│ │ │ │ ├── PathUtils.java
│ │ │ │ ├── PermissionUtils.java
│ │ │ │ ├── PhoneUtils.java
│ │ │ │ ├── PinyinUtils.java
│ │ │ │ ├── ProcessUtils.java
│ │ │ │ ├── RandomUtils.java
│ │ │ │ ├── ReflectUtils.java
│ │ │ │ ├── RegexUtils.java
│ │ │ │ ├── ResourceUtils.java
│ │ │ │ ├── RetrofitUtils.java
│ │ │ │ ├── RomUtils.java
│ │ │ │ ├── SDCardUtils.java
│ │ │ │ ├── SPStaticUtils.java
│ │ │ │ ├── SPUtils.java
│ │ │ │ ├── ScreenUtils.java
│ │ │ │ ├── ServiceUtils.java
│ │ │ │ ├── ShadowUtils.java
│ │ │ │ ├── ShellUtils.java
│ │ │ │ ├── SizeUtils.java
│ │ │ │ ├── SnackbarUtils.java
│ │ │ │ ├── SpanUtils.java
│ │ │ │ ├── StringUtils.java
│ │ │ │ ├── TemperatureUtils.java
│ │ │ │ ├── ThreadUtils.java
│ │ │ │ ├── ThrowableUtils.java
│ │ │ │ ├── TimeUtils.java
│ │ │ │ ├── ToastUtils.java
│ │ │ │ ├── TouchUtils.java
│ │ │ │ ├── UiMessageUtils.java
│ │ │ │ ├── UriUtils.java
│ │ │ │ ├── Utils.java
│ │ │ │ ├── UtilsActivityLifecycleImpl.java
│ │ │ │ ├── UtilsBridge.java
│ │ │ │ ├── UtilsFileProvider.java
│ │ │ │ ├── UtilsTransActivity.java
│ │ │ │ ├── UtilsTransActivity4MainProcess.java
│ │ │ │ ├── VibrateUtils.java
│ │ │ │ ├── ViewUtils.java
│ │ │ │ ├── VolumeUtils.java
│ │ │ │ └── ZipUtils.java
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ └── utils_toast_bg.xml
│ │ │ ├── layout/
│ │ │ │ └── utils_toast_view.xml
│ │ │ ├── values/
│ │ │ │ └── styles.xml
│ │ │ ├── values-v21/
│ │ │ │ └── styles.xml
│ │ │ └── xml/
│ │ │ └── util_code_provider_paths.xml
│ │ └── upload.sh
│ ├── dokit-weex/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── gradle.properties
│ │ ├── proguard-rules.pro
│ │ ├── src/
│ │ │ └── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── didichuxing/
│ │ │ │ └── doraemonkit/
│ │ │ │ └── weex/
│ │ │ │ ├── common/
│ │ │ │ │ └── DKCommonActivity.java
│ │ │ │ ├── devtool/
│ │ │ │ │ ├── DevToolActivity.java
│ │ │ │ │ ├── DevToolScanActivity.java
│ │ │ │ │ └── WeexDevToolKit.kt
│ │ │ │ ├── info/
│ │ │ │ │ ├── WeexInfo.java
│ │ │ │ │ ├── WeexInfoAdapter.java
│ │ │ │ │ ├── WeexInfoFragment.java
│ │ │ │ │ ├── WeexInfoHacker.java
│ │ │ │ │ └── WeexInfoKit.kt
│ │ │ │ ├── log/
│ │ │ │ │ ├── WeexLogInfoDoKitView.java
│ │ │ │ │ └── WeexLogKit.kt
│ │ │ │ └── storage/
│ │ │ │ ├── StorageAdapter.java
│ │ │ │ ├── StorageDialogFragment.java
│ │ │ │ ├── StorageFragment.java
│ │ │ │ ├── StorageHacker.java
│ │ │ │ ├── StorageInfo.java
│ │ │ │ └── WeexStorageKit.kt
│ │ │ └── res/
│ │ │ ├── layout/
│ │ │ │ ├── dk_fragment_info.xml
│ │ │ │ ├── dk_fragment_info_item.xml
│ │ │ │ ├── dk_fragment_storage.xml
│ │ │ │ ├── dk_item_storage_dialog.xml
│ │ │ │ ├── dk_item_storage_watch.xml
│ │ │ │ └── dk_weex_float_log_info.xml
│ │ │ ├── values/
│ │ │ │ ├── colors.xml
│ │ │ │ ├── dimens.xml
│ │ │ │ ├── strings.xml
│ │ │ │ └── styles.xml
│ │ │ ├── values-en-rUS/
│ │ │ │ └── strings.xml
│ │ │ ├── values-zh-rCN/
│ │ │ │ └── strings.xml
│ │ │ └── values-zh-rTW/
│ │ │ └── strings.xml
│ │ └── upload.sh
│ ├── dokit_module.json
│ ├── gradle/
│ │ └── wrapper/
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
│ ├── gradle.properties
│ ├── gradlew
│ ├── gradlew.bat
│ ├── settings.gradle
│ ├── upload.gradle
│ ├── upload_didi.sh
│ ├── upload_local.sh
│ ├── upload_maven.sh
│ ├── upload_maven_central.gradle
│ └── upload_private.gradle
├── CODE_OF_CONDUCT.md
├── CODE_OF_CONDUCT.zh-cn.md
├── CONTRIBUTING.md
├── Doc/
│ ├── android-ReleaseNotes.md
│ ├── iOS-ReleaseNotes.md
│ ├── iOS_cn_guide.md
│ ├── iOS_en_guide.md
│ ├── miniapp-ReleaseNotes.md
│ └── miniapp_cn_guide.md
├── DoraemonKit.podspec
├── Flutter/
│ ├── .gitignore
│ ├── .metadata
│ ├── CHANGELOG.md
│ ├── LICENSE
│ ├── README.md
│ ├── analysis_options.yaml
│ ├── example/
│ │ ├── .gitignore
│ │ ├── .metadata
│ │ ├── LICENSE
│ │ ├── android/
│ │ │ ├── .gitignore
│ │ │ ├── app/
│ │ │ │ ├── build.gradle
│ │ │ │ └── src/
│ │ │ │ ├── debug/
│ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ ├── main/
│ │ │ │ │ ├── AndroidManifest.xml
│ │ │ │ │ ├── kotlin/
│ │ │ │ │ │ └── com/
│ │ │ │ │ │ └── linjizong/
│ │ │ │ │ │ └── flutter_app/
│ │ │ │ │ │ └── MainActivity.kt
│ │ │ │ │ └── res/
│ │ │ │ │ ├── drawable/
│ │ │ │ │ │ └── launch_background.xml
│ │ │ │ │ └── values/
│ │ │ │ │ └── styles.xml
│ │ │ │ └── profile/
│ │ │ │ └── AndroidManifest.xml
│ │ │ ├── build.gradle
│ │ │ ├── gradle/
│ │ │ │ └── wrapper/
│ │ │ │ └── gradle-wrapper.properties
│ │ │ ├── gradle.properties
│ │ │ └── settings.gradle
│ │ ├── ios/
│ │ │ ├── .gitignore
│ │ │ ├── Flutter/
│ │ │ │ ├── .last_build_id
│ │ │ │ ├── AppFrameworkInfo.plist
│ │ │ │ ├── Debug.xcconfig
│ │ │ │ └── Release.xcconfig
│ │ │ ├── Podfile
│ │ │ ├── Runner/
│ │ │ │ ├── AppDelegate.h
│ │ │ │ ├── AppDelegate.m
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── LaunchImage.imageset/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── README.md
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ ├── Runner-Bridging-Header.h
│ │ │ │ └── main.m
│ │ │ ├── Runner.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace/
│ │ │ │ │ └── xcshareddata/
│ │ │ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ │ │ └── WorkspaceSettings.xcsettings
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ └── Runner.xcscheme
│ │ │ └── Runner.xcworkspace/
│ │ │ └── xcshareddata/
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ │ ├── lib/
│ │ │ ├── main.dart
│ │ │ └── page2.dart
│ │ ├── local.properties
│ │ ├── pubspec.yaml
│ │ └── test/
│ │ └── dokit_library_test.dart
│ ├── flutterw
│ ├── lib/
│ │ ├── dokit.dart
│ │ ├── engine/
│ │ │ ├── dokit_binding.dart
│ │ │ └── dokit_http.dart
│ │ ├── kit/
│ │ │ ├── apm/
│ │ │ │ ├── apm.dart
│ │ │ │ ├── fps_kit.dart
│ │ │ │ ├── http_kit.dart
│ │ │ │ ├── launch/
│ │ │ │ │ ├── model.dart
│ │ │ │ │ ├── page_launch_kit.dart
│ │ │ │ │ └── route_observer.dart
│ │ │ │ ├── log_kit.dart
│ │ │ │ ├── memory_kit.dart
│ │ │ │ ├── method_channel_kit.dart
│ │ │ │ ├── route_kit.dart
│ │ │ │ ├── source_code_kit.dart
│ │ │ │ └── vm/
│ │ │ │ ├── version.dart
│ │ │ │ ├── vm_helper.dart
│ │ │ │ └── vm_service_wrapper.dart
│ │ │ ├── biz/
│ │ │ │ └── biz.dart
│ │ │ ├── common/
│ │ │ │ ├── basic_info.dart
│ │ │ │ └── common.dart
│ │ │ ├── kit.dart
│ │ │ ├── observer.dart
│ │ │ └── visual/
│ │ │ ├── color_pick.dart
│ │ │ ├── view_check.dart
│ │ │ └── visual.dart
│ │ ├── ui/
│ │ │ ├── dokit_app.dart
│ │ │ ├── dokit_btn.dart
│ │ │ ├── kit_page.dart
│ │ │ └── resident_page.dart
│ │ ├── util/
│ │ │ ├── byte_util.dart
│ │ │ ├── screen_util.dart
│ │ │ └── time_util.dart
│ │ └── widget/
│ │ ├── dash_decoration.dart
│ │ ├── fps_chart.dart
│ │ ├── source_code/
│ │ │ ├── source_code_view.dart
│ │ │ └── syntax_highlighter.dart
│ │ └── widget_build_chain/
│ │ ├── widget_build_chain_page.dart
│ │ └── widget_details_page.dart
│ ├── pubspec.yaml
│ └── test/
│ └── widget_test.dart
├── LICENSE
├── README.md
├── README_EN.md
├── Web/
│ ├── .gitignore
│ ├── DEVELOPMENT.md
│ ├── LICENSE
│ ├── README.md
│ ├── jest.config.js
│ ├── lerna-debug.log
│ ├── lerna.json
│ ├── package.json
│ ├── packages/
│ │ ├── core/
│ │ │ ├── README.md
│ │ │ ├── __tests__/
│ │ │ │ └── index.test.js
│ │ │ ├── package.json
│ │ │ ├── rollup.config.js
│ │ │ └── src/
│ │ │ ├── common/
│ │ │ │ ├── components/
│ │ │ │ │ ├── card.vue
│ │ │ │ │ ├── dokit-ui/
│ │ │ │ │ │ ├── index.js
│ │ │ │ │ │ └── layout/
│ │ │ │ │ │ ├── col.css
│ │ │ │ │ │ ├── col.js
│ │ │ │ │ │ ├── index.js
│ │ │ │ │ │ ├── row.css
│ │ │ │ │ │ └── row.js
│ │ │ │ │ ├── toast/
│ │ │ │ │ │ ├── index.js
│ │ │ │ │ │ └── toast.vue
│ │ │ │ │ ├── top-bar.vue
│ │ │ │ │ └── version.vue
│ │ │ │ └── js/
│ │ │ │ ├── EventPlayback.js
│ │ │ │ ├── EventRecorder.js
│ │ │ │ ├── UIController.js
│ │ │ │ ├── dom-events-to-record.js
│ │ │ │ ├── feature.js
│ │ │ │ ├── finder/
│ │ │ │ │ └── index.js
│ │ │ │ ├── icon.js
│ │ │ │ ├── lifecycle.js
│ │ │ │ ├── node.js
│ │ │ │ ├── socket.js
│ │ │ │ ├── store.js
│ │ │ │ ├── util.js
│ │ │ │ └── xpath/
│ │ │ │ └── index.js
│ │ │ ├── components/
│ │ │ │ ├── app.vue
│ │ │ │ ├── elements-highlight.vue
│ │ │ │ ├── home.vue
│ │ │ │ ├── hostSuspendedBall.vue
│ │ │ │ ├── independ-container.vue
│ │ │ │ └── router-container.vue
│ │ │ ├── index.js
│ │ │ ├── router/
│ │ │ │ ├── index.js
│ │ │ │ ├── router.js
│ │ │ │ └── routes.js
│ │ │ └── store/
│ │ │ └── index.js
│ │ ├── utils/
│ │ │ ├── README.md
│ │ │ ├── __tests__/
│ │ │ │ └── index.test.js
│ │ │ ├── package.json
│ │ │ ├── rollup.config.js
│ │ │ └── src/
│ │ │ ├── deepClone.js
│ │ │ ├── dom.js
│ │ │ ├── dragable.js
│ │ │ ├── eventEmiter.js
│ │ │ ├── index.js
│ │ │ ├── md5.js
│ │ │ ├── network.js
│ │ │ └── utils.js
│ │ ├── web/
│ │ │ ├── README.md
│ │ │ ├── __tests__/
│ │ │ │ └── index.test.js
│ │ │ ├── package.json
│ │ │ ├── playground/
│ │ │ │ └── index.html
│ │ │ ├── rollup.config.js
│ │ │ └── src/
│ │ │ ├── assets/
│ │ │ │ ├── CssStore.js
│ │ │ │ ├── deepClone.js
│ │ │ │ └── util.js
│ │ │ ├── common/
│ │ │ │ ├── Card.vue
│ │ │ │ └── info-card.vue
│ │ │ ├── components/
│ │ │ │ ├── ScanerComponent.vue
│ │ │ │ ├── ToolHelloWorld.vue
│ │ │ │ └── ToolsContainer.vue
│ │ │ ├── feature.js
│ │ │ ├── index.js
│ │ │ └── plugins/
│ │ │ ├── align-ruler/
│ │ │ │ ├── align-ruler.vue
│ │ │ │ ├── index.js
│ │ │ │ └── info-box.vue
│ │ │ ├── api-mock/
│ │ │ │ ├── index.js
│ │ │ │ ├── interface-item.vue
│ │ │ │ └── main.vue
│ │ │ ├── app-info/
│ │ │ │ ├── ToolAppInfo.vue
│ │ │ │ └── index.js
│ │ │ ├── console/
│ │ │ │ ├── console-tap.vue
│ │ │ │ ├── css/
│ │ │ │ │ └── var.less
│ │ │ │ ├── index.js
│ │ │ │ ├── js/
│ │ │ │ │ └── console.js
│ │ │ │ ├── log-container.vue
│ │ │ │ ├── log-detail.vue
│ │ │ │ ├── log-item.vue
│ │ │ │ ├── main.vue
│ │ │ │ └── op-command.vue
│ │ │ ├── demo-plugin/
│ │ │ │ ├── ToolHelloWorld.vue
│ │ │ │ └── index.js
│ │ │ ├── demo-single-plugin/
│ │ │ │ ├── FPS.vue
│ │ │ │ ├── IndependPluginDemo.vue
│ │ │ │ └── index.js
│ │ │ ├── element/
│ │ │ │ ├── components/
│ │ │ │ │ ├── ElementAttributes.vue
│ │ │ │ │ ├── ElementBoxModel.vue
│ │ │ │ │ ├── ElementBreadcrumb.vue
│ │ │ │ │ ├── ElementComputedStyle.vue
│ │ │ │ │ └── ElementStyles.vue
│ │ │ │ ├── elementContainer.vue
│ │ │ │ ├── elementDetails.vue
│ │ │ │ ├── elementSnippet.vue
│ │ │ │ ├── elementTree.vue
│ │ │ │ └── index.js
│ │ │ ├── h5-door/
│ │ │ │ ├── ToolH5Door.vue
│ │ │ │ └── index.js
│ │ │ ├── network/
│ │ │ │ ├── index.js
│ │ │ │ ├── js/
│ │ │ │ │ └── request.js
│ │ │ │ ├── main.vue
│ │ │ │ └── request-item.vue
│ │ │ ├── one-machine-with-multiple-controls/
│ │ │ │ ├── app.vue
│ │ │ │ └── index.js
│ │ │ ├── resources/
│ │ │ │ ├── css/
│ │ │ │ │ └── var.less
│ │ │ │ ├── index.js
│ │ │ │ ├── js/
│ │ │ │ │ └── resources.js
│ │ │ │ ├── main.vue
│ │ │ │ ├── resource-container.vue
│ │ │ │ ├── resource-item.vue
│ │ │ │ └── resource-tap.vue
│ │ │ ├── scan-code/
│ │ │ │ ├── app.vue
│ │ │ │ └── index.js
│ │ │ ├── storage/
│ │ │ │ ├── cookie.vue
│ │ │ │ ├── index.js
│ │ │ │ ├── info-card.vue
│ │ │ │ ├── js/
│ │ │ │ │ └── storage.js
│ │ │ │ ├── local-storage.vue
│ │ │ │ ├── main.vue
│ │ │ │ └── session-storage.vue
│ │ │ └── web-vitals-time/
│ │ │ ├── index.js
│ │ │ └── info-box.vue
│ │ └── web-independent/
│ │ ├── README.md
│ │ ├── package.json
│ │ ├── rollup.config.js
│ │ └── src/
│ │ └── index.js
│ ├── playground/
│ │ ├── independent.html
│ │ ├── index.html
│ │ ├── index2.html
│ │ ├── index3.html
│ │ └── liveReload.js
│ └── scripts/
│ └── dev-playground.js
├── iOS/
│ ├── .gitignore
│ ├── Demo/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AccentColor.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ └── ViewController.swift
│ ├── Demo.xcodeproj/
│ │ ├── project.pbxproj
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ └── Demo.xcscheme
│ ├── DoKit/
│ │ ├── Assets/
│ │ │ ├── Assets.xcassets/
│ │ │ │ ├── Contents.json
│ │ │ │ └── dokit_logo.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── DKTrayViewController.xib
│ │ └── Classes/
│ │ ├── CFoundation/
│ │ │ ├── common.h
│ │ │ ├── hook.c
│ │ │ └── hook.h
│ │ ├── Core/
│ │ │ ├── DKTrayViewController.h
│ │ │ ├── DKTrayViewController.m
│ │ │ ├── DoKit.h
│ │ │ └── DoKit.m
│ │ ├── EventSynthesize/
│ │ │ ├── UITouch+DKEventSynthesize.h
│ │ │ ├── UITouch+DKEventSynthesize.m
│ │ │ ├── UIView+EventSynthesize.h
│ │ │ └── UIView+EventSynthesize.m
│ │ └── Foundation/
│ │ ├── DKMultiControlProtocol.h
│ │ ├── DKMultiControlProtocol.m
│ │ ├── DKMultiControlStreamManager.h
│ │ ├── DKMultiControlStreamManager.m
│ │ ├── DKQRCodeScanLogic.h
│ │ ├── DKQRCodeScanLogic.m
│ │ ├── DKQRCodeScanView.h
│ │ ├── DKQRCodeScanView.m
│ │ ├── DKQRCodeScanViewController.h
│ │ ├── DKQRCodeScanViewController.m
│ │ ├── DKWebSocketSession.h
│ │ ├── DKWebSocketSession.m
│ │ ├── DTO/
│ │ │ ├── DKActionDTOModel.h
│ │ │ ├── DKActionDTOModel.m
│ │ │ ├── DKCommonDTOModel.h
│ │ │ ├── DKCommonDTOModel.m
│ │ │ ├── DKDataRequestDTOModel.h
│ │ │ ├── DKDataRequestDTOModel.m
│ │ │ ├── DKDataResponseDTOModel.h
│ │ │ ├── DKDataResponseDTOModel.m
│ │ │ ├── DKLoginDataDTOModel.h
│ │ │ └── DKLoginDataDTOModel.m
│ │ ├── NSURLSessionConfiguration+DoKit.h
│ │ └── NSURLSessionConfiguration+DoKit.m
│ ├── DoraemonKit/
│ │ ├── Framework/
│ │ │ └── DoraemonLoadAnalyze.framework/
│ │ │ ├── DoraemonLoadAnalyze
│ │ │ ├── Headers/
│ │ │ │ └── DoraemonLoadAnalyze.h
│ │ │ ├── Info.plist
│ │ │ └── Modules/
│ │ │ └── module.modulemap
│ │ ├── Resource/
│ │ │ ├── Assets.xcassets/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── dk_icon_mc.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── dk_mc_banner.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_align.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_app_info.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_app_start_time.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_arrow_down.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_back.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_back_dark.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_check_circle.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_check_circle_fill.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_close.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_close_dark.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_close_white.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_cpu.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_crash.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_database.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_default.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_dir.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_expand.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_expand_no.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_file.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_file_2.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_file_sync.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_file_sync_banner.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_fps.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_h5.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_health.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_health_bg.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_health_cell_bg.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_health_end.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_health_slide.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_health_slideTop.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_health_start.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_hierarchy_info.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_hierarchy_parent.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_hierarchy_select.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_hierarchy_subview.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_js.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_kadun.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_location.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_log.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_logo.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_logo_dark.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_max.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_memory.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_memory_leak.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_method_use_time.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_min.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_mock.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_mock_cancle.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_mock_data.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_mock_data_selected.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_mock_detail_down.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_mock_detail_up.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_mock_filter_down.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_mock_filter_up.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_mock_gps.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_mock_selected.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_mock_up.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_mock_up_selected.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_more.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_net.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_netflow_list_select.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_netflow_list_unselect.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_netflow_summary_select.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_netflow_summary_unselect.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_nslog.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_qingchu.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_scan.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_scan_line.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_search.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_search_highlight.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_self.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_setting.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_straw.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_time_profiler.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_ui.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_view_check.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_view_level.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_viewmetrics.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── doraemon_visual.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── doraemon_weaknet.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── en.lproj/
│ │ │ │ └── Doraemon.strings
│ │ │ └── zh-Hans.lproj/
│ │ │ └── Doraemon.strings
│ │ └── Src/
│ │ ├── Core/
│ │ │ ├── Base/
│ │ │ │ ├── DoraemonBaseViewController.h
│ │ │ │ ├── DoraemonBaseViewController.m
│ │ │ │ ├── DoraemonNavBarItemModel.h
│ │ │ │ ├── DoraemonNavBarItemModel.m
│ │ │ │ ├── DoraemonStatusBarViewController.h
│ │ │ │ ├── DoraemonStatusBarViewController.m
│ │ │ │ └── View/
│ │ │ │ ├── DoraemonBaseBigTitleView.h
│ │ │ │ └── DoraemonBaseBigTitleView.m
│ │ │ ├── Cache/
│ │ │ │ ├── DoraemonCacheManager.h
│ │ │ │ └── DoraemonCacheManager.m
│ │ │ ├── Category/
│ │ │ │ ├── Foundation+Doraemon.m
│ │ │ │ ├── NSObject+Doraemon.h
│ │ │ │ ├── NSObject+Doraemon.m
│ │ │ │ ├── UIColor+Doraemon.h
│ │ │ │ ├── UIColor+Doraemon.m
│ │ │ │ ├── UIImage+Doraemon.h
│ │ │ │ ├── UIImage+Doraemon.m
│ │ │ │ ├── UIView+Doraemon.h
│ │ │ │ ├── UIView+Doraemon.m
│ │ │ │ ├── UIViewController+Doraemon.h
│ │ │ │ └── UIViewController+Doraemon.m
│ │ │ ├── CommonUI/
│ │ │ │ ├── Alert/
│ │ │ │ │ ├── DoraemonAlertUtil.h
│ │ │ │ │ └── DoraemonAlertUtil.m
│ │ │ │ ├── CellBtn/
│ │ │ │ │ ├── DoraemonCellButton.h
│ │ │ │ │ └── DoraemonCellButton.m
│ │ │ │ ├── CellInput/
│ │ │ │ │ ├── DoraemonCellInput.h
│ │ │ │ │ └── DoraemonCellInput.m
│ │ │ │ ├── CellSwitch/
│ │ │ │ │ ├── DoraemonCellSwitch.h
│ │ │ │ │ └── DoraemonCellSwitch.m
│ │ │ │ ├── Charts/
│ │ │ │ │ ├── DoraemonBarChart.h
│ │ │ │ │ ├── DoraemonBarChart.m
│ │ │ │ │ ├── DoraemonChart.h
│ │ │ │ │ ├── DoraemonChart.m
│ │ │ │ │ ├── DoraemonChartAxis.h
│ │ │ │ │ ├── DoraemonChartAxis.m
│ │ │ │ │ ├── DoraemonChartDataItem.h
│ │ │ │ │ ├── DoraemonChartDataItem.m
│ │ │ │ │ ├── DoraemonPieChart.h
│ │ │ │ │ ├── DoraemonPieChart.m
│ │ │ │ │ ├── DoraemonXAxis.h
│ │ │ │ │ ├── DoraemonXAxis.m
│ │ │ │ │ ├── DoraemonYAxis.h
│ │ │ │ │ └── DoraemonYAxis.m
│ │ │ │ ├── Label/
│ │ │ │ │ ├── DoraemonCopyLabel.h
│ │ │ │ │ └── DoraemonCopyLabel.m
│ │ │ │ ├── Oscillogram/
│ │ │ │ │ ├── DoraemonOscillogramView.h
│ │ │ │ │ ├── DoraemonOscillogramView.m
│ │ │ │ │ ├── DoraemonOscillogramViewController.h
│ │ │ │ │ ├── DoraemonOscillogramViewController.m
│ │ │ │ │ ├── DoraemonOscillogramWindow.h
│ │ │ │ │ ├── DoraemonOscillogramWindow.m
│ │ │ │ │ ├── DoraemonOscillogramWindowManager.h
│ │ │ │ │ └── DoraemonOscillogramWindowManager.m
│ │ │ │ ├── Toast/
│ │ │ │ │ ├── DoraemonToastUtil.h
│ │ │ │ │ └── DoraemonToastUtil.m
│ │ │ │ └── Visual/
│ │ │ │ ├── DoraemonVisualInfoWindow.h
│ │ │ │ ├── DoraemonVisualInfoWindow.m
│ │ │ │ ├── DoraemonVisualMagnifierWindow.h
│ │ │ │ └── DoraemonVisualMagnifierWindow.m
│ │ │ ├── Define/
│ │ │ │ └── DoraemonDefine.h
│ │ │ ├── DoraemonKit.h
│ │ │ ├── Entry/
│ │ │ │ ├── Entry/
│ │ │ │ │ ├── DoraemonEntryWindow.h
│ │ │ │ │ └── DoraemonEntryWindow.m
│ │ │ │ └── Home/
│ │ │ │ ├── Cell/
│ │ │ │ │ ├── DoraemonHomeCell.h
│ │ │ │ │ ├── DoraemonHomeCell.m
│ │ │ │ │ ├── DoraemonHomeCloseCell.h
│ │ │ │ │ ├── DoraemonHomeCloseCell.m
│ │ │ │ │ ├── DoraemonHomeFootCell.h
│ │ │ │ │ ├── DoraemonHomeFootCell.m
│ │ │ │ │ ├── DoraemonHomeHeadCell.h
│ │ │ │ │ └── DoraemonHomeHeadCell.m
│ │ │ │ ├── DoraemonHomeViewController.h
│ │ │ │ ├── DoraemonHomeViewController.m
│ │ │ │ ├── DoraemonHomeWindow.h
│ │ │ │ ├── DoraemonHomeWindow.m
│ │ │ │ ├── DoraemonNavigationController.h
│ │ │ │ ├── DoraemonNavigationController.m
│ │ │ │ └── Settings/
│ │ │ │ ├── DoraemonSettingCell.h
│ │ │ │ ├── DoraemonSettingCell.m
│ │ │ │ ├── DoraemonSettingViewController.h
│ │ │ │ ├── DoraemonSettingViewController.m
│ │ │ │ └── KitManager/
│ │ │ │ ├── DoraemonKitManagerViewController.h
│ │ │ │ ├── DoraemonKitManagerViewController.m
│ │ │ │ └── View/
│ │ │ │ ├── DoraemonKitManagerCell.h
│ │ │ │ ├── DoraemonKitManagerCell.m
│ │ │ │ ├── DoraemonKitManagerHeadCell.h
│ │ │ │ ├── DoraemonKitManagerHeadCell.m
│ │ │ │ ├── DoraemonKitManagerResetCell.h
│ │ │ │ └── DoraemonKitManagerResetCell.m
│ │ │ ├── Manager/
│ │ │ │ ├── DoraemonManager.h
│ │ │ │ └── DoraemonManager.m
│ │ │ ├── Network/
│ │ │ │ └── Interceptor/
│ │ │ │ ├── DoraemonNSURLProtocol.h
│ │ │ │ ├── DoraemonNSURLProtocol.m
│ │ │ │ ├── DoraemonNetworkInterceptor.h
│ │ │ │ ├── DoraemonNetworkInterceptor.m
│ │ │ │ ├── DoraemonURLSessionDemux.h
│ │ │ │ ├── DoraemonURLSessionDemux.m
│ │ │ │ ├── NSURLSessionConfiguration+Doraemon.h
│ │ │ │ └── NSURLSessionConfiguration+Doraemon.m
│ │ │ ├── Plugin/
│ │ │ │ ├── Common/
│ │ │ │ │ ├── AppInfo/
│ │ │ │ │ │ ├── DoraemonAppInfoCell.h
│ │ │ │ │ │ ├── DoraemonAppInfoCell.m
│ │ │ │ │ │ ├── DoraemonAppInfoPlugin.h
│ │ │ │ │ │ ├── DoraemonAppInfoPlugin.m
│ │ │ │ │ │ ├── DoraemonAppInfoUtil.h
│ │ │ │ │ │ ├── DoraemonAppInfoUtil.m
│ │ │ │ │ │ ├── DoraemonAppInfoViewController.h
│ │ │ │ │ │ └── DoraemonAppInfoViewController.m
│ │ │ │ │ ├── AppSetting/
│ │ │ │ │ │ ├── DoraemonAppSettingPlugin.h
│ │ │ │ │ │ └── DoraemonAppSettingPlugin.m
│ │ │ │ │ ├── DeleteLocalData/
│ │ │ │ │ │ ├── DoraemonDeleteLocalDataPlugin.h
│ │ │ │ │ │ ├── DoraemonDeleteLocalDataPlugin.m
│ │ │ │ │ │ ├── DoraemonDeleteLocalDataViewController.h
│ │ │ │ │ │ └── DoraemonDeleteLocalDataViewController.m
│ │ │ │ │ ├── H5/
│ │ │ │ │ │ ├── DoraemonDefaultWebViewController.h
│ │ │ │ │ │ ├── DoraemonDefaultWebViewController.m
│ │ │ │ │ │ ├── DoraemonH5Plugin.h
│ │ │ │ │ │ ├── DoraemonH5Plugin.m
│ │ │ │ │ │ ├── DoraemonH5ViewController.h
│ │ │ │ │ │ ├── DoraemonH5ViewController.m
│ │ │ │ │ │ ├── DoraemonQRCodeViewController.h
│ │ │ │ │ │ ├── DoraemonQRCodeViewController.m
│ │ │ │ │ │ └── QRCode/
│ │ │ │ │ │ ├── DoraemonQRScanView.h
│ │ │ │ │ │ └── DoraemonQRScanView.m
│ │ │ │ │ ├── JavaScript/
│ │ │ │ │ │ ├── DoraemonJavaScriptDetailViewController.h
│ │ │ │ │ │ ├── DoraemonJavaScriptDetailViewController.m
│ │ │ │ │ │ ├── DoraemonJavaScriptPlugin.h
│ │ │ │ │ │ ├── DoraemonJavaScriptPlugin.m
│ │ │ │ │ │ ├── DoraemonJavaScriptViewController.h
│ │ │ │ │ │ ├── DoraemonJavaScriptViewController.m
│ │ │ │ │ │ └── Function/
│ │ │ │ │ │ ├── DoraemonJavaScriptManager.h
│ │ │ │ │ │ └── DoraemonJavaScriptManager.m
│ │ │ │ │ ├── NSLog/
│ │ │ │ │ │ ├── DoraemonNSLogPlugin.h
│ │ │ │ │ │ ├── DoraemonNSLogPlugin.m
│ │ │ │ │ │ ├── DoraemonNSLogViewController.h
│ │ │ │ │ │ ├── DoraemonNSLogViewController.m
│ │ │ │ │ │ ├── Function/
│ │ │ │ │ │ │ ├── DoraemonNSLogManager.h
│ │ │ │ │ │ │ ├── DoraemonNSLogManager.m
│ │ │ │ │ │ │ ├── DoraemonNSLogModel.h
│ │ │ │ │ │ │ └── DoraemonNSLogModel.m
│ │ │ │ │ │ └── List/
│ │ │ │ │ │ ├── DoraemonNSLogListCell.h
│ │ │ │ │ │ ├── DoraemonNSLogListCell.m
│ │ │ │ │ │ ├── DoraemonNSLogListViewController.h
│ │ │ │ │ │ ├── DoraemonNSLogListViewController.m
│ │ │ │ │ │ ├── DoraemonNSLogSearchView.h
│ │ │ │ │ │ └── DoraemonNSLogSearchView.m
│ │ │ │ │ ├── NSUserDefaults/
│ │ │ │ │ │ ├── DoraemonNSUserDefaultsPlugin.h
│ │ │ │ │ │ ├── DoraemonNSUserDefaultsPlugin.m
│ │ │ │ │ │ ├── Model/
│ │ │ │ │ │ │ ├── DoraemonNSUserDefaultsModel.h
│ │ │ │ │ │ │ └── DoraemonNSUserDefaultsModel.m
│ │ │ │ │ │ └── ViewControllers/
│ │ │ │ │ │ ├── DoraemonNSUserDefaultsEditViewController.h
│ │ │ │ │ │ ├── DoraemonNSUserDefaultsEditViewController.m
│ │ │ │ │ │ ├── DoraemonNSUserDefaultsViewController.h
│ │ │ │ │ │ └── DoraemonNSUserDefaultsViewController.m
│ │ │ │ │ └── Sanbox/
│ │ │ │ │ ├── DoraemonSandboxPlugin.h
│ │ │ │ │ ├── DoraemonSandboxPlugin.m
│ │ │ │ │ ├── Util/
│ │ │ │ │ │ ├── DoraemonDBManager.h
│ │ │ │ │ │ └── DoraemonDBManager.m
│ │ │ │ │ └── VC/
│ │ │ │ │ ├── DB/
│ │ │ │ │ │ ├── DoraemonDBCell.h
│ │ │ │ │ │ ├── DoraemonDBCell.m
│ │ │ │ │ │ ├── DoraemonDBRowView.h
│ │ │ │ │ │ ├── DoraemonDBRowView.m
│ │ │ │ │ │ ├── DoraemonDBShowView.h
│ │ │ │ │ │ ├── DoraemonDBShowView.m
│ │ │ │ │ │ ├── DoraemonDBTableViewController.h
│ │ │ │ │ │ └── DoraemonDBTableViewController.m
│ │ │ │ │ ├── DoraemonSanboxDetailViewController.h
│ │ │ │ │ ├── DoraemonSanboxDetailViewController.m
│ │ │ │ │ ├── DoraemonSandboxCell.h
│ │ │ │ │ ├── DoraemonSandboxCell.m
│ │ │ │ │ ├── DoraemonSandboxModel.h
│ │ │ │ │ ├── DoraemonSandboxModel.m
│ │ │ │ │ ├── DoraemonSandboxViewController.h
│ │ │ │ │ └── DoraemonSandboxViewController.m
│ │ │ │ ├── Performance/
│ │ │ │ │ ├── ANR/
│ │ │ │ │ │ ├── Detail/
│ │ │ │ │ │ │ ├── DoraemonANRDetailViewController.h
│ │ │ │ │ │ │ └── DoraemonANRDetailViewController.m
│ │ │ │ │ │ ├── DoraemonANRPlugin.h
│ │ │ │ │ │ ├── DoraemonANRPlugin.m
│ │ │ │ │ │ ├── DoraemonANRViewController.h
│ │ │ │ │ │ ├── DoraemonANRViewController.m
│ │ │ │ │ │ ├── Function/
│ │ │ │ │ │ │ ├── DoraemonANRManager.h
│ │ │ │ │ │ │ ├── DoraemonANRManager.m
│ │ │ │ │ │ │ ├── DoraemonANRTool.h
│ │ │ │ │ │ │ ├── DoraemonANRTool.m
│ │ │ │ │ │ │ ├── DoraemonANRTracker.h
│ │ │ │ │ │ │ ├── DoraemonANRTracker.m
│ │ │ │ │ │ │ ├── DoraemonPingThread.h
│ │ │ │ │ │ │ └── DoraemonPingThread.m
│ │ │ │ │ │ └── List/
│ │ │ │ │ │ ├── DoraemonANRListCell.h
│ │ │ │ │ │ ├── DoraemonANRListCell.m
│ │ │ │ │ │ ├── DoraemonANRListViewController.h
│ │ │ │ │ │ └── DoraemonANRListViewController.m
│ │ │ │ │ ├── CPU/
│ │ │ │ │ │ ├── DoraemonCPUPlugin.h
│ │ │ │ │ │ ├── DoraemonCPUPlugin.m
│ │ │ │ │ │ ├── DoraemonCPUViewController.h
│ │ │ │ │ │ ├── DoraemonCPUViewController.m
│ │ │ │ │ │ └── Function/
│ │ │ │ │ │ ├── DoraemonCPUOscillogramViewController.h
│ │ │ │ │ │ ├── DoraemonCPUOscillogramViewController.m
│ │ │ │ │ │ ├── DoraemonCPUOscillogramWindow.h
│ │ │ │ │ │ ├── DoraemonCPUOscillogramWindow.m
│ │ │ │ │ │ ├── DoraemonCPUUtil.h
│ │ │ │ │ │ └── DoraemonCPUUtil.m
│ │ │ │ │ ├── Crash/
│ │ │ │ │ │ ├── DoraemonCrashPlugin.h
│ │ │ │ │ │ ├── DoraemonCrashPlugin.m
│ │ │ │ │ │ ├── DoraemonCrashViewController.h
│ │ │ │ │ │ ├── DoraemonCrashViewController.m
│ │ │ │ │ │ ├── Function/
│ │ │ │ │ │ │ ├── DoraemonCrashSignalExceptionHandler.h
│ │ │ │ │ │ │ ├── DoraemonCrashSignalExceptionHandler.m
│ │ │ │ │ │ │ ├── DoraemonCrashTool.h
│ │ │ │ │ │ │ ├── DoraemonCrashTool.m
│ │ │ │ │ │ │ ├── DoraemonCrashUncaughtExceptionHandler.h
│ │ │ │ │ │ │ └── DoraemonCrashUncaughtExceptionHandler.m
│ │ │ │ │ │ └── List/
│ │ │ │ │ │ ├── DoraemonCrashListCell.h
│ │ │ │ │ │ ├── DoraemonCrashListCell.m
│ │ │ │ │ │ ├── DoraemonCrashListViewController.h
│ │ │ │ │ │ └── DoraemonCrashListViewController.m
│ │ │ │ │ ├── FPS/
│ │ │ │ │ │ ├── DoraemonFPSPlugin.h
│ │ │ │ │ │ ├── DoraemonFPSPlugin.m
│ │ │ │ │ │ ├── DoraemonFPSViewController.h
│ │ │ │ │ │ ├── DoraemonFPSViewController.m
│ │ │ │ │ │ └── Function/
│ │ │ │ │ │ ├── DoraemonFPSOscillogramViewController.h
│ │ │ │ │ │ ├── DoraemonFPSOscillogramViewController.m
│ │ │ │ │ │ ├── DoraemonFPSOscillogramWindow.h
│ │ │ │ │ │ ├── DoraemonFPSOscillogramWindow.m
│ │ │ │ │ │ ├── DoraemonFPSUtil.h
│ │ │ │ │ │ └── DoraemonFPSUtil.m
│ │ │ │ │ ├── LargeImageDetection/
│ │ │ │ │ │ ├── Detail/
│ │ │ │ │ │ │ ├── DoraemonImageDetectionCell.h
│ │ │ │ │ │ │ ├── DoraemonImageDetectionCell.m
│ │ │ │ │ │ │ ├── DoraemonLargeImageDetectionListViewController.h
│ │ │ │ │ │ │ ├── DoraemonLargeImageDetectionListViewController.m
│ │ │ │ │ │ │ ├── DoraemonResponseImageModel.h
│ │ │ │ │ │ │ └── DoraemonResponseImageModel.m
│ │ │ │ │ │ ├── DoraemonLargeImagePlugin.h
│ │ │ │ │ │ ├── DoraemonLargeImagePlugin.m
│ │ │ │ │ │ ├── DoraemonLargeImageViewController.h
│ │ │ │ │ │ ├── DoraemonLargeImageViewController.m
│ │ │ │ │ │ └── Function/
│ │ │ │ │ │ ├── DoraemonLargeImageDetectionManager.h
│ │ │ │ │ │ ├── DoraemonLargeImageDetectionManager.m
│ │ │ │ │ │ ├── UIImageView+DoraemonSDImage.h
│ │ │ │ │ │ └── UIImageView+DoraemonSDImage.m
│ │ │ │ │ ├── Memory/
│ │ │ │ │ │ ├── DoraemonMemoryPlugin.h
│ │ │ │ │ │ ├── DoraemonMemoryPlugin.m
│ │ │ │ │ │ ├── DoraemonMemoryViewController.h
│ │ │ │ │ │ ├── DoraemonMemoryViewController.m
│ │ │ │ │ │ └── Function/
│ │ │ │ │ │ ├── DoraemonMemoryOscillogramViewController.h
│ │ │ │ │ │ ├── DoraemonMemoryOscillogramViewController.m
│ │ │ │ │ │ ├── DoraemonMemoryOscillogramWindow.h
│ │ │ │ │ │ ├── DoraemonMemoryOscillogramWindow.m
│ │ │ │ │ │ ├── DoraemonMemoryUtil.h
│ │ │ │ │ │ └── DoraemonMemoryUtil.m
│ │ │ │ │ ├── NetFlow/
│ │ │ │ │ │ ├── Detail/
│ │ │ │ │ │ │ ├── DoraemonNetFlowDetailCell.h
│ │ │ │ │ │ │ ├── DoraemonNetFlowDetailCell.m
│ │ │ │ │ │ │ ├── DoraemonNetFlowDetailSegment.h
│ │ │ │ │ │ │ ├── DoraemonNetFlowDetailSegment.m
│ │ │ │ │ │ │ ├── DoraemonNetFlowDetailViewController.h
│ │ │ │ │ │ │ └── DoraemonNetFlowDetailViewController.m
│ │ │ │ │ │ ├── DoraemonNetFlowPlugin.h
│ │ │ │ │ │ ├── DoraemonNetFlowPlugin.m
│ │ │ │ │ │ ├── DoraemonNetFlowViewController.h
│ │ │ │ │ │ ├── DoraemonNetFlowViewController.m
│ │ │ │ │ │ ├── Function/
│ │ │ │ │ │ │ ├── DoraemonNetFlowDataSource.h
│ │ │ │ │ │ │ ├── DoraemonNetFlowDataSource.m
│ │ │ │ │ │ │ ├── DoraemonNetFlowHttpModel.h
│ │ │ │ │ │ │ ├── DoraemonNetFlowHttpModel.m
│ │ │ │ │ │ │ ├── DoraemonNetFlowManager.h
│ │ │ │ │ │ │ ├── DoraemonNetFlowManager.m
│ │ │ │ │ │ │ ├── Util/
│ │ │ │ │ │ │ │ ├── DoraemonUrlUtil.h
│ │ │ │ │ │ │ │ ├── DoraemonUrlUtil.m
│ │ │ │ │ │ │ │ ├── NSURLRequest+Doraemon.h
│ │ │ │ │ │ │ │ └── NSURLRequest+Doraemon.m
│ │ │ │ │ │ │ └── View/
│ │ │ │ │ │ │ ├── DoraemonNetFlowOscillogramViewController.h
│ │ │ │ │ │ │ ├── DoraemonNetFlowOscillogramViewController.m
│ │ │ │ │ │ │ ├── DoraemonNetFlowOscillogramWindow.h
│ │ │ │ │ │ │ └── DoraemonNetFlowOscillogramWindow.m
│ │ │ │ │ │ ├── List/
│ │ │ │ │ │ │ ├── DoraemonNetFlowListCell.h
│ │ │ │ │ │ │ ├── DoraemonNetFlowListCell.m
│ │ │ │ │ │ │ ├── DoraemonNetFlowListViewController.h
│ │ │ │ │ │ │ └── DoraemonNetFlowListViewController.m
│ │ │ │ │ │ └── Summary/
│ │ │ │ │ │ ├── DoraemonNetFlowSummaryViewController.h
│ │ │ │ │ │ ├── DoraemonNetFlowSummaryViewController.m
│ │ │ │ │ │ └── View/
│ │ │ │ │ │ ├── DoraemonNetFlowSummaryMethodDataView.h
│ │ │ │ │ │ ├── DoraemonNetFlowSummaryMethodDataView.m
│ │ │ │ │ │ ├── DoraemonNetFlowSummaryTotalDataView.h
│ │ │ │ │ │ ├── DoraemonNetFlowSummaryTotalDataView.m
│ │ │ │ │ │ ├── DoraemonNetFlowSummaryTypeDataView.h
│ │ │ │ │ │ └── DoraemonNetFlowSummaryTypeDataView.m
│ │ │ │ │ ├── StartTime/
│ │ │ │ │ │ ├── DoraemonStartTimePlugin.h
│ │ │ │ │ │ ├── DoraemonStartTimePlugin.m
│ │ │ │ │ │ ├── DoraemonStartTimeViewController.h
│ │ │ │ │ │ ├── DoraemonStartTimeViewController.m
│ │ │ │ │ │ └── TimeProfiler/
│ │ │ │ │ │ ├── DoraemonStartTimeProfilerViewController.h
│ │ │ │ │ │ └── DoraemonStartTimeProfilerViewController.m
│ │ │ │ │ ├── SubThreadUICheck/
│ │ │ │ │ │ ├── Detail/
│ │ │ │ │ │ │ ├── DoraemonSubThreadUICheckDetailViewController.h
│ │ │ │ │ │ │ └── DoraemonSubThreadUICheckDetailViewController.m
│ │ │ │ │ │ ├── DoraemonSubThreadUICheckPlugin.h
│ │ │ │ │ │ ├── DoraemonSubThreadUICheckPlugin.m
│ │ │ │ │ │ ├── DoraemonSubThreadUICheckViewController.h
│ │ │ │ │ │ ├── DoraemonSubThreadUICheckViewController.m
│ │ │ │ │ │ ├── Function/
│ │ │ │ │ │ │ ├── DoraemonSubThreadUICheckManager.h
│ │ │ │ │ │ │ ├── DoraemonSubThreadUICheckManager.m
│ │ │ │ │ │ │ ├── UIView+DoraemonSubThreadUICheck.h
│ │ │ │ │ │ │ └── UIView+DoraemonSubThreadUICheck.m
│ │ │ │ │ │ └── List/
│ │ │ │ │ │ ├── DoraemonSubThreadUICheckListCell.h
│ │ │ │ │ │ ├── DoraemonSubThreadUICheckListCell.m
│ │ │ │ │ │ ├── DoraemonSubThreadUICheckListViewController.h
│ │ │ │ │ │ └── DoraemonSubThreadUICheckListViewController.m
│ │ │ │ │ ├── TimeProfiler/
│ │ │ │ │ │ ├── DoraemonTimeProfilerPlugin.h
│ │ │ │ │ │ ├── DoraemonTimeProfilerPlugin.m
│ │ │ │ │ │ ├── DoraemonTimeProfilerViewController.h
│ │ │ │ │ │ ├── DoraemonTimeProfilerViewController.m
│ │ │ │ │ │ └── Function/
│ │ │ │ │ │ ├── DoraemonTimeProfiler.h
│ │ │ │ │ │ ├── DoraemonTimeProfiler.m
│ │ │ │ │ │ ├── DoraemonTimeProfilerCore.c
│ │ │ │ │ │ ├── DoraemonTimeProfilerCore.h
│ │ │ │ │ │ ├── DoraemonTimeProfilerRecord.h
│ │ │ │ │ │ └── DoraemonTimeProfilerRecord.m
│ │ │ │ │ ├── UIProfile/
│ │ │ │ │ │ ├── DoraemonUIProfilePlugin.h
│ │ │ │ │ │ ├── DoraemonUIProfilePlugin.m
│ │ │ │ │ │ ├── DoraemonUIProfileViewController.h
│ │ │ │ │ │ ├── DoraemonUIProfileViewController.m
│ │ │ │ │ │ └── Function/
│ │ │ │ │ │ ├── DoraemonUIProfileManager.h
│ │ │ │ │ │ ├── DoraemonUIProfileManager.m
│ │ │ │ │ │ ├── DoraemonUIProfileWindow.h
│ │ │ │ │ │ ├── DoraemonUIProfileWindow.m
│ │ │ │ │ │ ├── UIViewController+DoraemonUIProfile.h
│ │ │ │ │ │ └── UIViewController+DoraemonUIProfile.m
│ │ │ │ │ ├── VCProfiler/
│ │ │ │ │ │ ├── UIViewController+DoraemonVCProfiler.h
│ │ │ │ │ │ ├── UIViewController+DoraemonVCProfiler.m
│ │ │ │ │ │ ├── WKWebView+Doraemon.h
│ │ │ │ │ │ └── WKWebView+Doraemon.m
│ │ │ │ │ └── WeakNetwork/
│ │ │ │ │ ├── DoraemonWeakNetworkPlugin.h
│ │ │ │ │ ├── DoraemonWeakNetworkPlugin.m
│ │ │ │ │ ├── DoraemonWeakNetworkViewController.h
│ │ │ │ │ ├── DoraemonWeakNetworkViewController.m
│ │ │ │ │ ├── Function/
│ │ │ │ │ │ ├── DoraemonWeakNetworkHandle.h
│ │ │ │ │ │ ├── DoraemonWeakNetworkHandle.m
│ │ │ │ │ │ ├── DoraemonWeakNetworkManager.h
│ │ │ │ │ │ └── DoraemonWeakNetworkManager.m
│ │ │ │ │ └── View/
│ │ │ │ │ ├── DoraemonWeakNetworkDetailView.h
│ │ │ │ │ ├── DoraemonWeakNetworkDetailView.m
│ │ │ │ │ ├── DoraemonWeakNetworkInputView.h
│ │ │ │ │ ├── DoraemonWeakNetworkInputView.m
│ │ │ │ │ ├── DoraemonWeakNetworkLevelView.h
│ │ │ │ │ ├── DoraemonWeakNetworkLevelView.m
│ │ │ │ │ └── Window/
│ │ │ │ │ ├── DoraemonWeakNetworkWindow.h
│ │ │ │ │ └── DoraemonWeakNetworkWindow.m
│ │ │ │ ├── Platform/
│ │ │ │ │ ├── FileSync/
│ │ │ │ │ │ ├── DoraemonFileSyncPlugin.h
│ │ │ │ │ │ ├── DoraemonFileSyncPlugin.m
│ │ │ │ │ │ ├── DoraemonFileSyncViewController.h
│ │ │ │ │ │ ├── DoraemonFileSyncViewController.m
│ │ │ │ │ │ └── Function/
│ │ │ │ │ │ ├── DoraemonFileSyncManager.h
│ │ │ │ │ │ └── DoraemonFileSyncManager.m
│ │ │ │ │ ├── Health/
│ │ │ │ │ │ ├── Alert/
│ │ │ │ │ │ │ ├── DoraemonHealthAlertView.h
│ │ │ │ │ │ │ ├── DoraemonHealthAlertView.m
│ │ │ │ │ │ │ ├── DoraemonHealthEndInputView.h
│ │ │ │ │ │ │ └── DoraemonHealthEndInputView.m
│ │ │ │ │ │ ├── DoraemonHealthPlugin.h
│ │ │ │ │ │ ├── DoraemonHealthPlugin.m
│ │ │ │ │ │ ├── DoraemonHealthViewController.h
│ │ │ │ │ │ ├── DoraemonHealthViewController.m
│ │ │ │ │ │ ├── Function/
│ │ │ │ │ │ │ ├── DoraemonHealthManager.h
│ │ │ │ │ │ │ └── DoraemonHealthManager.m
│ │ │ │ │ │ └── View/
│ │ │ │ │ │ ├── DoraemonHealthFooterView.h
│ │ │ │ │ │ ├── DoraemonHealthFooterView.m
│ │ │ │ │ │ ├── Home/
│ │ │ │ │ │ │ ├── Detail/
│ │ │ │ │ │ │ │ ├── DoraemonHealthBgView.h
│ │ │ │ │ │ │ │ ├── DoraemonHealthBgView.m
│ │ │ │ │ │ │ │ ├── DoraemonHealthBtnView.h
│ │ │ │ │ │ │ │ ├── DoraemonHealthBtnView.m
│ │ │ │ │ │ │ │ ├── DoraemonHealthStartingTitle.h
│ │ │ │ │ │ │ │ └── DoraemonHealthStartingTitle.m
│ │ │ │ │ │ │ ├── DoraemonHealthHomeView.h
│ │ │ │ │ │ │ └── DoraemonHealthHomeView.m
│ │ │ │ │ │ ├── Instructions/
│ │ │ │ │ │ │ ├── DoraemonHealthInstructionsCell.h
│ │ │ │ │ │ │ ├── DoraemonHealthInstructionsCell.m
│ │ │ │ │ │ │ ├── DoraemonHealthInstructionsView.h
│ │ │ │ │ │ │ └── DoraemonHealthInstructionsView.m
│ │ │ │ │ │ └── Window/
│ │ │ │ │ │ ├── DoraemonHealthCountdownWindow.h
│ │ │ │ │ │ └── DoraemonHealthCountdownWindow.m
│ │ │ │ │ └── Mock/
│ │ │ │ │ ├── DoraemonMockPlugin.h
│ │ │ │ │ ├── DoraemonMockPlugin.m
│ │ │ │ │ ├── DoraemonMockViewController.h
│ │ │ │ │ ├── DoraemonMockViewController.m
│ │ │ │ │ ├── Function/
│ │ │ │ │ │ ├── DoraemonMockManager.h
│ │ │ │ │ │ ├── DoraemonMockManager.m
│ │ │ │ │ │ ├── DoraemonMockUtil.h
│ │ │ │ │ │ └── DoraemonMockUtil.m
│ │ │ │ │ ├── Model/
│ │ │ │ │ │ ├── DoraemonMockAPIModel.h
│ │ │ │ │ │ ├── DoraemonMockAPIModel.m
│ │ │ │ │ │ ├── DoraemonMockBaseModel.h
│ │ │ │ │ │ ├── DoraemonMockBaseModel.m
│ │ │ │ │ │ ├── DoraemonMockScene.h
│ │ │ │ │ │ ├── DoraemonMockScene.m
│ │ │ │ │ │ ├── DoraemonMockUpLoadModel.h
│ │ │ │ │ │ └── DoraemonMockUpLoadModel.m
│ │ │ │ │ ├── VC/
│ │ │ │ │ │ ├── DoraemonMockAPIViewController.h
│ │ │ │ │ │ ├── DoraemonMockAPIViewController.m
│ │ │ │ │ │ ├── DoraemonMockBaseViewController.h
│ │ │ │ │ │ ├── DoraemonMockBaseViewController.m
│ │ │ │ │ │ ├── DoraemonMockUploadViewController.h
│ │ │ │ │ │ ├── DoraemonMockUploadViewController.m
│ │ │ │ │ │ └── Preview/
│ │ │ │ │ │ ├── DoraemonMockDataPreviewViewController.h
│ │ │ │ │ │ └── DoraemonMockDataPreviewViewController.m
│ │ │ │ │ └── View/
│ │ │ │ │ ├── Filter/
│ │ │ │ │ │ ├── DoraemonMockFilterButton.h
│ │ │ │ │ │ ├── DoraemonMockFilterButton.m
│ │ │ │ │ │ ├── DoraemonMockFilterListView.h
│ │ │ │ │ │ ├── DoraemonMockFilterListView.m
│ │ │ │ │ │ ├── DoraemonMockFilterTableCell.h
│ │ │ │ │ │ └── DoraemonMockFilterTableCell.m
│ │ │ │ │ ├── List/
│ │ │ │ │ │ ├── Cell/
│ │ │ │ │ │ │ ├── DoraemonMockApiCell.h
│ │ │ │ │ │ │ ├── DoraemonMockApiCell.m
│ │ │ │ │ │ │ ├── DoraemonMockBaseCell.h
│ │ │ │ │ │ │ ├── DoraemonMockBaseCell.m
│ │ │ │ │ │ │ ├── DoraemonMockUploadCell.h
│ │ │ │ │ │ │ └── DoraemonMockUploadCell.m
│ │ │ │ │ │ ├── DoraemonMockDetailSwitch.h
│ │ │ │ │ │ ├── DoraemonMockDetailSwitch.m
│ │ │ │ │ │ ├── DoraemonMockSceneButton.h
│ │ │ │ │ │ ├── DoraemonMockSceneButton.m
│ │ │ │ │ │ └── ListView/
│ │ │ │ │ │ ├── DoraemonMockApiListView.h
│ │ │ │ │ │ ├── DoraemonMockApiListView.m
│ │ │ │ │ │ ├── DoraemonMockBaseListView.h
│ │ │ │ │ │ ├── DoraemonMockBaseListView.m
│ │ │ │ │ │ ├── DoraemonMockUploadListView.h
│ │ │ │ │ │ └── DoraemonMockUploadListView.m
│ │ │ │ │ └── Search/
│ │ │ │ │ ├── DoraemonMockSearchView.h
│ │ │ │ │ └── DoraemonMockSearchView.m
│ │ │ │ ├── Protocol/
│ │ │ │ │ ├── DoraemonPluginProtocol.h
│ │ │ │ │ └── DoraemonStartPluginProtocol.h
│ │ │ │ └── UI/
│ │ │ │ ├── ColorPick/
│ │ │ │ │ ├── DoraemonColorPickPlugin.h
│ │ │ │ │ ├── DoraemonColorPickPlugin.m
│ │ │ │ │ └── Function/
│ │ │ │ │ ├── DoraemonColorPickInfoView.h
│ │ │ │ │ ├── DoraemonColorPickInfoView.m
│ │ │ │ │ ├── DoraemonColorPickInfoWindow.h
│ │ │ │ │ ├── DoraemonColorPickInfoWindow.m
│ │ │ │ │ ├── DoraemonColorPickMagnifyLayer.h
│ │ │ │ │ ├── DoraemonColorPickMagnifyLayer.m
│ │ │ │ │ ├── DoraemonColorPickView.h
│ │ │ │ │ ├── DoraemonColorPickView.m
│ │ │ │ │ ├── DoraemonColorPickWindow.h
│ │ │ │ │ └── DoraemonColorPickWindow.m
│ │ │ │ ├── Hierarchy/
│ │ │ │ │ ├── DoraemonHierarchyPlugin.h
│ │ │ │ │ ├── DoraemonHierarchyPlugin.m
│ │ │ │ │ ├── Function/
│ │ │ │ │ │ ├── Category/
│ │ │ │ │ │ │ ├── NSObject+DoraemonHierarchy.h
│ │ │ │ │ │ │ ├── NSObject+DoraemonHierarchy.m
│ │ │ │ │ │ │ ├── UIColor+DoraemonHierarchy.h
│ │ │ │ │ │ │ ├── UIColor+DoraemonHierarchy.m
│ │ │ │ │ │ │ ├── UIViewController+DoraemonHierarchy.h
│ │ │ │ │ │ │ └── UIViewController+DoraemonHierarchy.m
│ │ │ │ │ │ ├── DoraemonEnumDescription.h
│ │ │ │ │ │ ├── DoraemonEnumDescription.m
│ │ │ │ │ │ ├── DoraemonHierarchyFormatterTool.h
│ │ │ │ │ │ ├── DoraemonHierarchyFormatterTool.m
│ │ │ │ │ │ ├── DoraemonHierarchyHelper.h
│ │ │ │ │ │ └── DoraemonHierarchyHelper.m
│ │ │ │ │ └── UserInterface/
│ │ │ │ │ ├── Cell/
│ │ │ │ │ │ ├── DoraemonHierarchyDetailTitleCell.h
│ │ │ │ │ │ ├── DoraemonHierarchyDetailTitleCell.m
│ │ │ │ │ │ ├── DoraemonHierarchySelectorCell.h
│ │ │ │ │ │ ├── DoraemonHierarchySelectorCell.m
│ │ │ │ │ │ ├── DoraemonHierarchySwitchCell.h
│ │ │ │ │ │ ├── DoraemonHierarchySwitchCell.m
│ │ │ │ │ │ ├── DoraemonHierarchyTitleCell.h
│ │ │ │ │ │ └── DoraemonHierarchyTitleCell.m
│ │ │ │ │ ├── DoraemonHierarchyDetailViewController.h
│ │ │ │ │ ├── DoraemonHierarchyDetailViewController.m
│ │ │ │ │ ├── DoraemonHierarchyTableViewController.h
│ │ │ │ │ ├── DoraemonHierarchyTableViewController.m
│ │ │ │ │ ├── DoraemonHierarchyViewController.h
│ │ │ │ │ ├── DoraemonHierarchyViewController.m
│ │ │ │ │ ├── DoraemonHierarchyWindow.h
│ │ │ │ │ ├── DoraemonHierarchyWindow.m
│ │ │ │ │ ├── Model/
│ │ │ │ │ │ ├── DoraemonHierarchyCategoryModel.h
│ │ │ │ │ │ ├── DoraemonHierarchyCategoryModel.m
│ │ │ │ │ │ ├── DoraemonHierarchyCellModel.h
│ │ │ │ │ │ └── DoraemonHierarchyCellModel.m
│ │ │ │ │ └── View/
│ │ │ │ │ ├── DKHierarchyInfoView.h
│ │ │ │ │ ├── DKHierarchyInfoView.m
│ │ │ │ │ ├── DKHierarchyPickerView.h
│ │ │ │ │ ├── DKHierarchyPickerView.m
│ │ │ │ │ ├── DKMoveView.h
│ │ │ │ │ ├── DKMoveView.m
│ │ │ │ │ ├── DKPickerView.h
│ │ │ │ │ ├── DKPickerView.m
│ │ │ │ │ ├── DoraemonHierarchyHeaderView.h
│ │ │ │ │ └── DoraemonHierarchyHeaderView.m
│ │ │ │ ├── ViewAlign/
│ │ │ │ │ ├── DoraemonViewAlignPlugin.h
│ │ │ │ │ ├── DoraemonViewAlignPlugin.m
│ │ │ │ │ └── Function/
│ │ │ │ │ ├── DoraemonViewAlignManager.h
│ │ │ │ │ ├── DoraemonViewAlignManager.m
│ │ │ │ │ ├── DoraemonViewAlignView.h
│ │ │ │ │ └── DoraemonViewAlignView.m
│ │ │ │ ├── ViewCheck/
│ │ │ │ │ ├── DoraemonViewCheckPlugin.h
│ │ │ │ │ ├── DoraemonViewCheckPlugin.m
│ │ │ │ │ └── Function/
│ │ │ │ │ ├── DoraemonViewCheckManager.h
│ │ │ │ │ ├── DoraemonViewCheckManager.m
│ │ │ │ │ ├── DoraemonViewCheckView.h
│ │ │ │ │ └── DoraemonViewCheckView.m
│ │ │ │ └── ViewMetrics/
│ │ │ │ ├── DoraemonMetricsViewController.h
│ │ │ │ ├── DoraemonMetricsViewController.m
│ │ │ │ ├── DoraemonViewMetricsPlugin.h
│ │ │ │ ├── DoraemonViewMetricsPlugin.m
│ │ │ │ └── Function/
│ │ │ │ ├── DoraemonViewMetricsConfig.h
│ │ │ │ ├── DoraemonViewMetricsConfig.m
│ │ │ │ ├── UIView+DoraemonViewMetrics.h
│ │ │ │ └── UIView+DoraemonViewMetrics.m
│ │ │ └── Util/
│ │ │ ├── BSBacktraceLogger/
│ │ │ │ ├── DoraemonBacktraceLogger.h
│ │ │ │ └── DoraemonBacktraceLogger.m
│ │ │ ├── BuriedPoint/
│ │ │ │ ├── DoraemonBuriedPointManager.h
│ │ │ │ └── DoraemonBuriedPointManager.m
│ │ │ ├── DoraemonNetworkUtil.h
│ │ │ ├── DoraemonNetworkUtil.m
│ │ │ ├── DoraemonStatisticsUtil.h
│ │ │ ├── DoraemonStatisticsUtil.m
│ │ │ ├── DoraemonThreadSafeMutableArray.h
│ │ │ ├── DoraemonThreadSafeMutableArray.m
│ │ │ ├── DoraemonThreadSafeMutableDictionary.h
│ │ │ ├── DoraemonThreadSafeMutableDictionary.m
│ │ │ ├── DoraemonUtil.h
│ │ │ ├── DoraemonUtil.m
│ │ │ ├── Doraemoni18NUtil.h
│ │ │ ├── Doraemoni18NUtil.m
│ │ │ └── fishhook/
│ │ │ ├── doraemon_fishhook.c
│ │ │ └── doraemon_fishhook.h
│ │ ├── Database/
│ │ │ ├── DoraemonDatabasePlugin.h
│ │ │ ├── DoraemonDatabasePlugin.m
│ │ │ ├── DoraemonDatabaseViewController.h
│ │ │ └── DoraemonDatabaseViewController.m
│ │ ├── GPS/
│ │ │ ├── DoraemonGPSPlugin.h
│ │ │ ├── DoraemonGPSPlugin.m
│ │ │ ├── DoraemonGPSViewController.h
│ │ │ ├── DoraemonGPSViewController.m
│ │ │ ├── Function/
│ │ │ │ ├── CLLocationManager+Doraemon.h
│ │ │ │ ├── CLLocationManager+Doraemon.m
│ │ │ │ ├── DoraemonGPSMocker.h
│ │ │ │ └── DoraemonGPSMocker.m
│ │ │ └── View/
│ │ │ ├── DoraemonMockGPSCenterView.h
│ │ │ ├── DoraemonMockGPSCenterView.m
│ │ │ ├── DoraemonMockGPSInputView.h
│ │ │ ├── DoraemonMockGPSInputView.m
│ │ │ ├── DoraemonMockGPSOperateView.h
│ │ │ └── DoraemonMockGPSOperateView.m
│ │ ├── Logger/
│ │ │ ├── DoraemonCocoaLumberjackPlugin.h
│ │ │ ├── DoraemonCocoaLumberjackPlugin.m
│ │ │ ├── DoraemonCocoaLumberjackViewController.h
│ │ │ ├── DoraemonCocoaLumberjackViewController.m
│ │ │ ├── Function/
│ │ │ │ ├── DoraemonCocoaLumberjackLogger.h
│ │ │ │ ├── DoraemonCocoaLumberjackLogger.m
│ │ │ │ ├── DoraemonDDLogMessage.h
│ │ │ │ └── DoraemonDDLogMessage.m
│ │ │ └── List/
│ │ │ ├── DoraemonCocoaLumberjackLevelView.h
│ │ │ ├── DoraemonCocoaLumberjackLevelView.m
│ │ │ ├── DoraemonCocoaLumberjackListCell.h
│ │ │ ├── DoraemonCocoaLumberjackListCell.m
│ │ │ ├── DoraemonCocoaLumberjackListViewController.h
│ │ │ └── DoraemonCocoaLumberjackListViewController.m
│ │ ├── MLeaksFinder/
│ │ │ ├── Detail/
│ │ │ │ ├── DoraemonMLeaksFinderDetailViewController.h
│ │ │ │ └── DoraemonMLeaksFinderDetailViewController.m
│ │ │ ├── DoraemonMLeaksFinderPlugin.h
│ │ │ ├── DoraemonMLeaksFinderPlugin.m
│ │ │ ├── DoraemonMLeaksFinderViewController.h
│ │ │ ├── DoraemonMLeaksFinderViewController.m
│ │ │ ├── Function/
│ │ │ │ ├── Extra/
│ │ │ │ │ ├── DoraemonMemoryLeakData.h
│ │ │ │ │ └── DoraemonMemoryLeakData.m
│ │ │ │ ├── MLeakedObjectProxy.h
│ │ │ │ ├── MLeakedObjectProxy.m
│ │ │ │ ├── MLeaksFinder.h
│ │ │ │ ├── NSObject+MemoryLeak.h
│ │ │ │ ├── NSObject+MemoryLeak.m
│ │ │ │ ├── UIApplication+MemoryLeak.h
│ │ │ │ ├── UIApplication+MemoryLeak.m
│ │ │ │ ├── UINavigationController+MemoryLeak.h
│ │ │ │ ├── UINavigationController+MemoryLeak.m
│ │ │ │ ├── UIPageViewController+MemoryLeak.h
│ │ │ │ ├── UIPageViewController+MemoryLeak.m
│ │ │ │ ├── UISplitViewController+MemoryLeak.h
│ │ │ │ ├── UISplitViewController+MemoryLeak.m
│ │ │ │ ├── UITabBarController+MemoryLeak.h
│ │ │ │ ├── UITabBarController+MemoryLeak.m
│ │ │ │ ├── UITouch+MemoryLeak.h
│ │ │ │ ├── UITouch+MemoryLeak.m
│ │ │ │ ├── UIView+MemoryLeak.h
│ │ │ │ ├── UIView+MemoryLeak.m
│ │ │ │ ├── UIViewController+MemoryLeak.h
│ │ │ │ └── UIViewController+MemoryLeak.m
│ │ │ └── List/
│ │ │ ├── DoraemonMLeaksFinderListCell.h
│ │ │ ├── DoraemonMLeaksFinderListCell.m
│ │ │ ├── DoraemonMLeaksFinderListViewController.h
│ │ │ └── DoraemonMLeaksFinderListViewController.m
│ │ ├── MethodUseTime/
│ │ │ ├── DoraemonMethodUseTimePlugin.h
│ │ │ ├── DoraemonMethodUseTimePlugin.m
│ │ │ ├── DoraemonMethodUseTimeViewController.h
│ │ │ ├── DoraemonMethodUseTimeViewController.m
│ │ │ ├── Function/
│ │ │ │ ├── DoraemonMethodUseTimeManager.h
│ │ │ │ └── DoraemonMethodUseTimeManager.m
│ │ │ └── List/
│ │ │ ├── DoraemonMethodUseTimeListCell.h
│ │ │ ├── DoraemonMethodUseTimeListCell.m
│ │ │ ├── DoraemonMethodUseTimeListViewController.h
│ │ │ └── DoraemonMethodUseTimeListViewController.m
│ │ ├── MultiControl/
│ │ │ ├── Function/
│ │ │ │ └── EventSync/
│ │ │ │ ├── Communication/
│ │ │ │ │ ├── DoraemonMCClient.h
│ │ │ │ │ ├── DoraemonMCClient.m
│ │ │ │ │ ├── DoraemonMCServer.h
│ │ │ │ │ └── DoraemonMCServer.m
│ │ │ │ ├── Dispatcher/
│ │ │ │ │ ├── DoraemonMCCommandExcutor.h
│ │ │ │ │ ├── DoraemonMCCommandExcutor.m
│ │ │ │ │ ├── DoraemonMCCommandGenerator.h
│ │ │ │ │ └── DoraemonMCCommandGenerator.m
│ │ │ │ ├── Event/
│ │ │ │ │ ├── Capture/
│ │ │ │ │ │ ├── DoraemonMCEventCapturer.h
│ │ │ │ │ │ ├── DoraemonMCEventCapturer.m
│ │ │ │ │ │ ├── DoraemonMCGestureTargetActionPair.h
│ │ │ │ │ │ ├── DoraemonMCGestureTargetActionPair.m
│ │ │ │ │ │ ├── DoraemonMCReuseViewDelegateProxy.h
│ │ │ │ │ │ └── DoraemonMCReuseViewDelegateProxy.m
│ │ │ │ │ └── Excutor/
│ │ │ │ │ ├── DoraemonMCEventHandler.h
│ │ │ │ │ └── DoraemonMCEventHandler.m
│ │ │ │ ├── MessagePackager/
│ │ │ │ │ ├── DoraemonMCMessagePackager.h
│ │ │ │ │ └── DoraemonMCMessagePackager.m
│ │ │ │ ├── Serialize/
│ │ │ │ │ ├── EventInfo/
│ │ │ │ │ │ ├── DoraemonMCGustureSerializer.h
│ │ │ │ │ │ ├── DoraemonMCGustureSerializer.m
│ │ │ │ │ │ ├── UIControl+DoraemonMCSerializer.h
│ │ │ │ │ │ ├── UIControl+DoraemonMCSerializer.m
│ │ │ │ │ │ ├── UIGestureRecognizer+DoraemonMCSerializer.h
│ │ │ │ │ │ ├── UIGestureRecognizer+DoraemonMCSerializer.m
│ │ │ │ │ │ ├── UILongPressGestureRecognizer+DoraemonMCSerializer.h
│ │ │ │ │ │ ├── UILongPressGestureRecognizer+DoraemonMCSerializer.m
│ │ │ │ │ │ ├── UIPanGestureRecognizer+DoraemonMCSerializer.h
│ │ │ │ │ │ ├── UIPanGestureRecognizer+DoraemonMCSerializer.m
│ │ │ │ │ │ ├── UIPinchGestureRecognizer+DoraemonMCSerializer.h
│ │ │ │ │ │ ├── UIPinchGestureRecognizer+DoraemonMCSerializer.m
│ │ │ │ │ │ ├── UIResponder+DoraemonMCSerializer.h
│ │ │ │ │ │ ├── UIResponder+DoraemonMCSerializer.m
│ │ │ │ │ │ ├── UIRotationGestureRecognizer+DoraemonMCSerializer.h
│ │ │ │ │ │ ├── UIRotationGestureRecognizer+DoraemonMCSerializer.m
│ │ │ │ │ │ ├── UISwipeGestureRecognizer+DoraemonMCSerializer.h
│ │ │ │ │ │ ├── UISwipeGestureRecognizer+DoraemonMCSerializer.m
│ │ │ │ │ │ ├── UITapGestureRecognizer+DoraemonMCSerializer.h
│ │ │ │ │ │ └── UITapGestureRecognizer+DoraemonMCSerializer.m
│ │ │ │ │ └── XPath/
│ │ │ │ │ ├── DoraemonMCXPathSerializer.h
│ │ │ │ │ └── DoraemonMCXPathSerializer.m
│ │ │ │ └── Utils/
│ │ │ │ ├── NSObject+DoraemonMCSupport.h
│ │ │ │ └── NSObject+DoraemonMCSupport.m
│ │ │ ├── Plugin/
│ │ │ │ ├── DoraemonMultiControlPlugin.h
│ │ │ │ └── DoraemonMultiControlPlugin.m
│ │ │ └── UserInterface/
│ │ │ └── Main/
│ │ │ ├── DoraemonMCViewController.h
│ │ │ └── DoraemonMCViewController.m
│ │ └── Weex/
│ │ ├── DevTool/
│ │ │ ├── DoraemonWeexDevToolViewController.h
│ │ │ ├── DoraemonWeexDevToolViewController.m
│ │ │ ├── DoraemonWeexDevTooloPlugin.h
│ │ │ └── DoraemonWeexDevTooloPlugin.m
│ │ ├── Info/
│ │ │ ├── DoraemonWeexInfoPlugin.h
│ │ │ ├── DoraemonWeexInfoPlugin.m
│ │ │ ├── DoraemonWeexInfoViewController.h
│ │ │ ├── DoraemonWeexInfoViewController.m
│ │ │ ├── Function/
│ │ │ │ ├── DoraemonWeexInfoAnalyzer.h
│ │ │ │ ├── DoraemonWeexInfoAnalyzer.m
│ │ │ │ ├── DoraemonWeexInfoDataManager.h
│ │ │ │ └── DoraemonWeexInfoDataManager.m
│ │ │ └── View/
│ │ │ ├── DoraemonWeexInfoCell.h
│ │ │ ├── DoraemonWeexInfoCell.m
│ │ │ ├── DoraemonWeexInfoHeaderView.h
│ │ │ └── DoraemonWeexInfoHeaderView.m
│ │ ├── Log/
│ │ │ ├── DoraemonWeexLogPlugin.h
│ │ │ ├── DoraemonWeexLogPlugin.m
│ │ │ ├── DoraemonWeexLogViewController.h
│ │ │ ├── DoraemonWeexLogViewController.m
│ │ │ ├── Function/
│ │ │ │ ├── DoraemonWeexLogDataSource.h
│ │ │ │ ├── DoraemonWeexLogDataSource.m
│ │ │ │ ├── DoraemonWeexLogger.h
│ │ │ │ └── DoraemonWeexLogger.m
│ │ │ ├── Model/
│ │ │ │ ├── DoraemonWeexLogModel.h
│ │ │ │ └── DoraemonWeexLogModel.m
│ │ │ └── View/
│ │ │ ├── DoraemonWeexLogCell.h
│ │ │ ├── DoraemonWeexLogCell.m
│ │ │ ├── DoraemonWeexLogLevelView.h
│ │ │ ├── DoraemonWeexLogLevelView.m
│ │ │ ├── DoraemonWeexLogSearchView.h
│ │ │ └── DoraemonWeexLogSearchView.m
│ │ └── Storage/
│ │ ├── DoraemonWeexStoragePlugin.h
│ │ ├── DoraemonWeexStoragePlugin.m
│ │ ├── DoraemonWeexStorageViewController.h
│ │ ├── DoraemonWeexStorageViewController.m
│ │ ├── Function/
│ │ │ ├── DoraemonWeexStorageResolver.h
│ │ │ └── DoraemonWeexStorageResolver.m
│ │ └── View/
│ │ ├── DoraemonWeexStorageCell.h
│ │ ├── DoraemonWeexStorageCell.m
│ │ ├── DoraemonWeexStorageRowView.h
│ │ ├── DoraemonWeexStorageRowView.m
│ │ ├── DoraemonWeexStorageShowView.h
│ │ └── DoraemonWeexStorageShowView.m
│ ├── DoraemonKitDemo/
│ │ ├── DoraemonKitDemo/
│ │ │ ├── Assets.xcassets/
│ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Contents.json
│ │ │ │ ├── emoji.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── zhaoliyin.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj/
│ │ │ │ └── LaunchScreen.storyboard
│ │ │ ├── DemoVC/
│ │ │ │ ├── Base/
│ │ │ │ │ ├── DoraemonDemoBaseViewController.h
│ │ │ │ │ └── DoraemonDemoBaseViewController.m
│ │ │ │ ├── Common/
│ │ │ │ │ ├── DoraemonDemoCommonViewController.h
│ │ │ │ │ └── DoraemonDemoCommonViewController.m
│ │ │ │ ├── Crash/
│ │ │ │ │ ├── DoraemonDemoCrashMRCView.h
│ │ │ │ │ ├── DoraemonDemoCrashMRCView.m
│ │ │ │ │ ├── DoraemonDemoCrashViewController.h
│ │ │ │ │ └── DoraemonDemoCrashViewController.m
│ │ │ │ ├── Home/
│ │ │ │ │ ├── DoraemonDemoHomeViewController.h
│ │ │ │ │ └── DoraemonDemoHomeViewController.m
│ │ │ │ ├── Logger/
│ │ │ │ │ ├── DoraemonDemoLoggerViewController.h
│ │ │ │ │ └── DoraemonDemoLoggerViewController.m
│ │ │ │ ├── MemoryLeak/
│ │ │ │ │ ├── DoraemonDemoMemoryLeakModel.h
│ │ │ │ │ ├── DoraemonDemoMemoryLeakModel.m
│ │ │ │ │ ├── DoraemonDemoMemoryLeakView.h
│ │ │ │ │ ├── DoraemonDemoMemoryLeakView.m
│ │ │ │ │ ├── DoraemonDemoMemoryLeakViewController.h
│ │ │ │ │ └── DoraemonDemoMemoryLeakViewController.m
│ │ │ │ ├── MockGPS/
│ │ │ │ │ ├── DoraemonDemoMockGPSAnnotation.h
│ │ │ │ │ ├── DoraemonDemoMockGPSAnnotation.m
│ │ │ │ │ ├── DoraemonDemoMockGPSViewController.h
│ │ │ │ │ └── DoraemonDemoMockGPSViewController.m
│ │ │ │ ├── MultiControl/
│ │ │ │ │ ├── DoraemonDemoMultiConLongPressGesture.h
│ │ │ │ │ ├── DoraemonDemoMultiConLongPressGesture.m
│ │ │ │ │ ├── DoraemonDemoMultiConPinchGesture.h
│ │ │ │ │ ├── DoraemonDemoMultiConPinchGesture.m
│ │ │ │ │ ├── DoraemonDemoMultiConRotationGesture.h
│ │ │ │ │ ├── DoraemonDemoMultiConRotationGesture.m
│ │ │ │ │ ├── DoraemonDemoMultiConScreenEdgePanGesture.h
│ │ │ │ │ ├── DoraemonDemoMultiConScreenEdgePanGesture.m
│ │ │ │ │ ├── DoraemonDemoMultiConSwipeGesture.h
│ │ │ │ │ ├── DoraemonDemoMultiConSwipeGesture.m
│ │ │ │ │ ├── DoraemonDemoMultiConTapGesture.h
│ │ │ │ │ ├── DoraemonDemoMultiConTapGesture.m
│ │ │ │ │ ├── DoraemonDemoMultiControlViewController.h
│ │ │ │ │ ├── DoraemonDemoMultiControlViewController.m
│ │ │ │ │ ├── DoraemonDemoMultiSlideView.h
│ │ │ │ │ └── DoraemonDemoMultiSlideView.m
│ │ │ │ ├── Net/
│ │ │ │ │ ├── NSURLProtocol/
│ │ │ │ │ │ ├── DoraemonDemoURLProtocol1.h
│ │ │ │ │ │ ├── DoraemonDemoURLProtocol1.m
│ │ │ │ │ │ ├── DoraemonDemoURLProtocol2.h
│ │ │ │ │ │ └── DoraemonDemoURLProtocol2.m
│ │ │ │ │ ├── Cell/
│ │ │ │ │ │ ├── DoraemonDemoNetTableViewCell.h
│ │ │ │ │ │ └── DoraemonDemoNetTableViewCell.m
│ │ │ │ │ ├── DoraemonDemoNetViewController.h
│ │ │ │ │ ├── DoraemonDemoNetViewController.m
│ │ │ │ │ ├── Image/
│ │ │ │ │ │ ├── DoraemonDemoImageShowViewController.h
│ │ │ │ │ │ ├── DoraemonDemoImageShowViewController.m
│ │ │ │ │ │ ├── DoraemonDemoImageViewController.h
│ │ │ │ │ │ └── DoraemonDemoImageViewController.m
│ │
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/ISSUE_TEMPLATE/-dokit-------------.md
================================================
---
name: "【DoKit生态场景】-描述出现的问题"
about: DoKit生态场景比如Android、iOS、小程序、Flutter,后面跟你需要描述的内容
title: "【DoKit生态场景】-描述出现的问题"
labels: ''
assignees: jtsky
---
It is recommended to refer to the following process before submitting issues:https://github.com/didi/DoraemonKit/issues/745
If you still cannot solve your problem, you can submit your issue according to the following template
Please complete the following informations.
> Android、iOS? OS version? Brand?
> Expected behavior and actual behavior.
> Steps to reproduce the problem.
> More informations such as error messages and stack traces are welcomed.
>
建议提issues之前可以参考一下DoKit社区答疑流程:https://github.com/didi/DoraemonKit/issues/745
假如还是无法解决你的问题,你可以按照以下模板来提交你的issue
请补充如下信息。
> Android 还是 iOS?系统版本是多少?手机品牌是什么?(如有)
> 期望的表现和实际的表现。(如有)
> 问题重现的步骤。(如有)
> 其他的错误信息和堆栈信息如果有也可以一并提供出来。(如有)
================================================
FILE: .github/issue_template.md
================================================
Please complete the following informations.
> Expected behavior and actual behavior.
> Steps to reproduce the problem.
> Android or iOS? OS version? Brand?
> More informations such as error messages and stack traces are welcomed.
请补充如下信息。
> 期望的表现和实际的表现。(如有)
> 问题重现的步骤。(如有)
> Android 还是 iOS?系统版本是多少?手机品牌是什么?(如有)
> 其他的错误信息和堆栈信息如果有也可以一并提供出来。(如有)
> 最好给我们提供可以复现问题的Demo
================================================
FILE: .gitignore
================================================
# macOS.gitignore
# 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
================================================
FILE: Android/.editorconfig
================================================
# http://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 4
end_of_line = lf
insert_final_newline = true
[*.java]
max_line_length = 140
wildcard_import_limit = 99
[*.kt]
max_line_length = 160
wildcard_import_limit = 99
================================================
FILE: Android/.gitignore
================================================
*.iml
.gradle
local.properties
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
.DS_Store
/build
/*/build
/captures
.externalNativeBuild
.idea/
.project
.classpath
.settings/
/*/*.iml
/*/*/*.iml
================================================
FILE: Android/README.md
================================================
# Android接入指南
## DoKit Android 最新版本
**由于jcenter事件的影响,我们需要将DoKit For Android迁移到mavenCentral(),但是需要更改groupId.所以大家要注意一下,具体的更新信息如下:**
**lastversion:3.5.0;kotlin编译插件为1.4.32 ;支持Gradle 6.8及以上**
**lastversion:3.5.0.1; kotlin编译插件为1.3.72; 支持Gradle 6.8及以下**
|DoKit|最新版本|描述|
|-|-|-|
|3.3.5及以后的Androidx|debugImplementation "io.github.didi.dokit:${aarName}: ${lastversion}"|(1)dokitx的library和plugin的groupId及版本号需要保持一致;(2)AGP最低版本要求3.3.0+|
|3.3.5及以前的Androidx版本|debugImplementation "com.didichuxing.doraemonkit:${aarName}:3.3.5"|(1)dokitx的library和plugin的groupId及版本号需要保持一致; (2)AGP最低版本要求3.3.0+|
|支持android support|debugImplementation "com.didichuxing.doraemonkit:${aarName}:3.3.5"|support放弃更新,请大家尽快升级和适配Androidx|
**${aarName}需要改为指定的名称,参考如下:**
```
//核心模块
debugImplementation "io.github.didi.dokit:dokitx:${lastversion}"
//文件同步模块
debugImplementation "io.github.didi.dokit:dokitx-ft:${lastversion}"
//一机多控模块
debugImplementation "io.github.didi.dokit:dokitx-mc:${lastversion}"
//weex模块
debugImplementation "io.github.didi.dokit:dokitx-weex:${lastversion}"
//no-op 模块
releaseImplementation "io.github.didi.dokit:dokitx-no-op:${lastversion}"
```
**debugImplementation 需要根据自己的构建改成对应的productFlavor**
**下面所有的例子均用dokitx举例。要使用support版本请将dokitx改为dokit即可。
v3.3.5以后的版本需要添加mavenCentral()仓库**
## 接入步骤
#### 1. Gradle 依赖
```groovy
dependencies {
debugImplementation 'io.github.didi.dokit:dokitx:${lastversion}'
releaseImplementation 'io.github.didi.dokit:dokitx-no-op:${lastversion}'
}
```
**滴滴内部业务:**
滴滴内部业务线接入请添加模块
```
//数据mock内部网络库支持
debugImplementation 'io.github.didi.dokit:dokitx-rpc:${lastversion}'
//一机多控内部网络库支持
debugImplementation 'io.github.didi.dokit:dokitx-rpc-mc:${lastversion}'
```
最新版本参见[这里](https://github.com/didi/DoraemonKit/blob/master/Doc/android-ReleaseNotes.md)。
#### 2. 初始化
在 App 启动的时候进行初始化。
```kotlin
overide fun onCreate() {
DoKit.Builder(this)
.productId("需要使用平台功能的话,需要到dokit.cn平台申请id")
.build()
}
```
#### 3. 流量监控以及其他AOP功能(可选)
AOP包括以下几个功能:
1)百度、腾讯、高德地图的经纬度模拟
2)UrlConnection、Okhttp 抓包以及后续的接口hook功能
3)App 启动耗时统计
4)慢函数
5)大图
在项目的 `build.gradle` 中添加 classpath。
```groovy
buildscript {
dependencies {
classpath 'io.github.didi.dokit:dokitx-plugin:${lastversion}'
}
}
```
在 app 的 `build.gradle` 中添加 plugin。
```groovy
apply plugin: 'com.didi.dokit'
```
**插件配置选项:**
添加到app module 的build.gradle文件下 与android {}处于同一级
```groovy
dokitExt {
//通用设置
comm {
//地图经纬度开关
gpsSwitch true
//网络开关
networkSwitch true
//大图开关
bigImgSwitch true
//webView js 抓包
webViewSwitch true
}
slowMethod {
//调用栈模式配置 对应gradle.properties中DOKIT_METHOD_STRATEGY=0
stackMethod {
//默认值为 5ms 小于该值的函数在调用栈中不显示
thresholdTime 10
//调用栈函数入口 千万不要用我默认的配置 如果有特殊需求修改成项目中自己的入口 假如不需要可以去掉该字段
enterMethods = ["com.didichuxing.doraemondemo.MainDebugActivity.test1"]
//黑名单 粒度最小到类 暂不支持到方法 千万不要用我默认的配置 如果有特殊需求修改成项目中自己的入口 假如不需要可以去掉该字段
methodBlacklist = ["com.facebook.drawee.backends.pipeline.Fresco"]
}
//普通模式配置 对应gradle.properties中DOKIT_METHOD_STRATEGY=1
normalMethod {
//默认值为 500ms 小于该值的函数在运行时不会在控制台中被打印
thresholdTime 500
//需要针对函数插装的包名 千万不要用我默认的配置 如果有特殊需求修改成项目中自己的项目包名 假如不需要可以去掉该字段
packageNames = ["com.didichuxing.doraemondemo"]
//不需要针对函数插装的包名&类名 千万不要用我默认的配置 如果有特殊需求修改成项目中自己的项目包名 假如不需要可以去掉该字段
methodBlacklist = ["com.didichuxing.doraemondemo.dokit"]
}
}
}
```
其中**strategy**和**methodSwitch**配置项已经弃用。新的配置开关位于项目根目录下的**gradle.properties**中。
具体的配置如下所示:
```
// dokit全局配置
// 插件开关
DOKIT_PLUGIN_SWITCH=true
// DOKIT读取三方库会和booster冲突 如果你的项目中也集成了booster 建议将开关改成false
DOKIT_THIRD_LIB_SWITCH=true
// 插件日志
DOKIT_LOG_SWITCH=true
// 自定义Webview的全限定名 主要是作用于h5 js抓包和数据mock
DOKIT_WEBVIEW_CLASS_NAME=com/didichuxing/doraemonkit/widget/webview/MyWebView
// dokit 慢函数开关
DOKIT_METHOD_SWITCH=true
// dokit 函数调用栈层级
DOKIT_METHOD_STACK_LEVEL=4
// 0:默认模式 打印函数调用栈 需添加指定入口 默认为application onCreate 和attachBaseContext
// 1:普通模式 运行时打印某个函数的耗时 全局业务代码函数插入
DOKIT_METHOD_STRATEGY=0
```
**理由**:
为了减少项目的编译时间,所以慢函数的默认开关为false。再加上plugin的transform注册必须早于project.afterEvaluate。所以无法通过原先的配置项拿到配置信息,只能通过在全局的gradle.properties中的配置可以拿到。
**tips:**
当修改完DoKit插件的相关配置以后一定要clean一下重新编译才能生效。这是AS的缓存增量编译导致的,暂时没有其他好的解决方案。
#### 4. 自定义功能组件(可选)
自定义组件需要实现 IKit 接口,该接口对应哆啦A梦功能面板中的组件。
以代驾乘客端为例,实现环境切换组件如下。
```kotlin
class DemoKit : AbstractKit() {
override val category: Int
get() = Category.BIZ
override val name: Int
get() = R.string.dk_kit_demo
override val icon: Int
get() = R.mipmap.dk_sys_info
override fun onClickWithReturn(activity: Activity): Boolean {
SimpleDoKitStarter.startFloating(DemoDokitView::class.java)
return true
}
override fun onAppInit(context: Context?) {
}
}
```
在初始化的时候注册自定义组件。
```kotlin
override fun onCreate() {
DoKit.Builder(this)
.productId("需要使用平台功能的话,需要到dokit.cn平台申请id")
.customKits(mapKits)
.build()
}
```
**DoKit入口api**
```kotlin
public class DoKit private constructor() {
companion object {
/**
* 主icon是否处于显示状态
*/
@JvmStatic
val isMainIconShow: Boolean
get() = false
/**
* 显示主icon
*/
@JvmStatic
fun show() {
}
/**
* 直接显示工具面板页面
*/
@JvmStatic
fun showToolPanel() {
}
/**
* 直接隐藏工具面板
*/
@JvmStatic
fun hideToolPanel() {
}
/**
* 隐藏主icon
*/
@JvmStatic
fun hide() {
}
/**
* 启动悬浮窗
* @JvmStatic:允许使用java的静态方法的方式调用
* @JvmOverloads :在有默认参数值的方法中使用@JvmOverloads注解,则Kotlin就会暴露多个重载方法。
*/
@JvmStatic
@JvmOverloads
fun launchFloating(
targetClass: Class<out AbsDokitView>,
mode: DoKitViewLaunchMode = DoKitViewLaunchMode.SINGLE_INSTANCE,
bundle: Bundle? = null
) {
}
/**
* 启动悬浮窗
* @JvmStatic:允许使用java的静态方法的方式调用
* @JvmOverloads :在有默认参数值的方法中使用@JvmOverloads注解,则Kotlin就会暴露多个重载方法。
*/
@JvmStatic
@JvmOverloads
fun launchFloating(
targetClass: KClass<out AbsDokitView>,
mode: DoKitViewLaunchMode = DoKitViewLaunchMode.SINGLE_INSTANCE,
bundle: Bundle? = null
) {
}
/**
* 移除悬浮窗
* @JvmStatic:允许使用java的静态方法的方式调用
* @JvmOverloads :在有默认参数值的方法中使用@JvmOverloads注解,则Kotlin就会暴露多个重载方法。
*/
@JvmStatic
fun removeFloating(targetClass: Class<out AbsDokitView>) {
}
/**
* 移除悬浮窗
* @JvmStatic:允许使用java的静态方法的方式调用
* @JvmOverloads :在有默认参数值的方法中使用@JvmOverloads注解,则Kotlin就会暴露多个重载方法。
*/
@JvmStatic
fun removeFloating(targetClass: KClass<out AbsDokitView>) {
}
/**
* 移除悬浮窗
* @JvmStatic:允许使用java的静态方法的方式调用
* @JvmOverloads :在有默认参数值的方法中使用@JvmOverloads注解,则Kotlin就会暴露多个重载方法。
*/
@JvmStatic
fun removeFloating(dokitView: AbsDokitView) {
}
/**
* 启动全屏页面
* @JvmStatic:允许使用java的静态方法的方式调用
* @JvmOverloads :在有默认参数值的方法中使用@JvmOverloads注解,则Kotlin就会暴露多个重载方法。
*/
@JvmStatic
@JvmOverloads
fun launchFullScreen(
targetClass: Class<out BaseFragment>,
context: Context? = null,
bundle: Bundle? = null,
isSystemFragment: Boolean = false
) {
}
/**
* 启动全屏页面
* @JvmStatic:允许使用java的静态方法的方式调用
* @JvmOverloads :在有默认参数值的方法中使用@JvmOverloads注解,则Kotlin就会暴露多个重载方法。
*/
@JvmStatic
@JvmOverloads
fun launchFullScreen(
targetClass: KClass<out BaseFragment>,
context: Context? = null,
bundle: Bundle? = null,
isSystemFragment: Boolean = false
) {
}
@JvmStatic
fun <T : AbsDokitView> getDoKitView(
activity: Activity?,
clazz: Class<out T>
): T? {
return null
}
@JvmStatic
fun <T : AbsDokitView> getDoKitView(
activity: Activity?,
clazz: KClass<out T>
): T? {
return null
}
/**
* 发送自定义一机多控事件
*/
@JvmStatic
fun sendCustomEvent(
eventType: String,
view: View? = null,
param: Map<String, String>? = null
) {
}
/**
* 获取一机多控类型
*/
@JvmStatic
fun mcMode(): WSMode {
return WSMode.UNKNOW
}
}
class Builder(private val app: Application) {
private var productId: String = ""
private var mapKits: LinkedHashMap<String, List<AbstractKit>> = linkedMapOf()
private var listKits: List<AbstractKit> = arrayListOf()
init {
}
fun productId(productId: String): Builder {
return this
}
/**
* mapKits & listKits 二选一
*/
fun customKits(mapKits: LinkedHashMap<String, List<AbstractKit>>): Builder {
return this
}
/**
* mapKits & listKits 二选一
*/
fun customKits(listKits: List<AbstractKit>): Builder {
return this
}
/**
* H5任意门全局回调
*/
fun webDoorCallback(callback: WebDoorManager.WebDoorCallback): Builder {
return this
}
/**
* 禁用app信息上传开关,该上传信息只为做DoKit接入量的统计,如果用户需要保护app隐私,可调用该方法进行禁用
*/
fun disableUpload(): Builder {
return this
}
fun debug(debug: Boolean): Builder {
return this
}
/**
* 是否显示主入口icon
*/
fun alwaysShowMainIcon(alwaysShow: Boolean): Builder {
return this
}
/**
* 设置加密数据库密码
*/
fun databasePass(map: Map<String, String>): Builder {
return this
}
/**
* 设置文件管理助手http端口号
*/
fun fileManagerHttpPort(port: Int): Builder {
return this
}
/**
* 一机多控端口号
*/
fun mcWSPort(port: Int): Builder {
return this
}
/**
* 一机多控自定义拦截器
*/
fun mcClientProcess(interceptor: McClientProcessor): Builder {
return this
}
/**
*设置dokit的性能监控全局回调
*/
fun callBack(callback: DoKitCallBack): Builder {
return this
}
/**
* 设置扩展网络拦截器的代理对象
*/
fun netExtInterceptor(extInterceptorProxy: DokitExtInterceptor.DokitExtInterceptorProxy): Builder {
return this
}
fun build() {
}
}
}
```
开启插件调试
./gradlew :app:assembleDebug -Dorg.gradle.daemon=false -Dorg.gradle.debug=true
#### 5. FAQ
参考[这里](http://xingyun.xiaojukeji.com/docs/dokit/#/SDKProblems)
================================================
FILE: Android/app/.gitignore
================================================
/build
================================================
FILE: Android/app/build.gradle
================================================
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply from: 'doraemonkit.gradle'
//apply plugin: 'com.didiglobal.booster'
android {
compileSdkVersion rootProject.ext.android["compileSdkVersion"]
defaultConfig {
applicationId rootProject.ext.android["applicationId"]
minSdkVersion rootProject.ext.android["minSdkVersion_21"]
targetSdkVersion rootProject.ext.android["targetSdkVersion"]
versionCode rootProject.ext.android["versionCode"]
versionName rootProject.ext.android["versionName"]
ndk {
abiFilters "armeabi", "arm64-v8a"
}
multiDexEnabled true
}
signingConfigs {
release {
storeFile file("keystore/test.keystore")
storePassword "test123456"
keyAlias "test"
keyPassword "test123456"
}
}
buildTypes {
debug {
resValue("string", "dokit_db_Person.db", "a_password")
debuggable true
minifyEnabled false
shrinkResources false
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
// debuggable true
minifyEnabled false
shrinkResources false
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
// flavorDimensions "default"
// productFlavors {
// product0 {
// applicationId "com.didichuxing.doraemondemo0"
//// resValue "string", "app_name", "DoKitDemo0"
//// manifestPlaceholders = [CHANNEL_VALUE: "product0"
//// , app_icon : "@mipmap/logo"]
// }
// product1 {
// applicationId "com.didichuxing.doraemondemo1"
//// resValue "string", "app_name", "DoKitDemo1"
//// manifestPlaceholders = [CHANNEL_VALUE: "product1"
//// , app_icon : "@mipmap/logo"]
// }
// }
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
//指定资源和代码目录
sourceSets {
debug {
manifest.srcFile 'src/debug/java/AndroidManifest.xml'
jniLibs.srcDir 'libs'
}
release {
manifest.srcFile 'src/release/java/AndroidManifest.xml'
jniLibs.srcDir 'libs'
}
}
kotlinOptions {
jvmTarget = "1.8"
}
lintOptions {
abortOnError false
}
/**
* 支持ViewBinding
*/
buildFeatures {
viewBinding = true
}
packagingOptions {
//dokit ktor pickFirst
// pickFirst 'META-INF/io.netty.versions.properties'
// pickFirst 'META-INF/INDEX.LIST'
pickFirst 'lib/x86_64/libc++_shared.so'
pickFirst 'lib/arm64-v8a/libc++_shared.so'
pickFirst 'lib/armeabi-v7a/libc++_shared.so'
pickFirst 'lib/x86/libc++_shared.so'
pickFirst 'lib/armeabi/libc++_shared.so'
}
}
//dokit 扩展
dokit {
gpsEnable true
bigImageEnable true
webView {
network true
dokitWeb true
vConsole true
}
gps {
didi true
baidu true
}
}
//dokit {
//
// slowMethod {
// //调用栈模式配置
// stackMethod {
// //默认值为 5ms 小于该值的函数在调用栈中不显示
// thresholdTime 5
// //调用栈函数入口
// enterMethods = ["com.didichuxing.doraemondemo.MainDebugActivity.test1"]
// //黑名单 粒度最小到类 暂不支持到方法
// methodBlacklist = ["com.facebook.drawee.backends.pipeline.Fresco"]
// }
// //普通模式配置
// normalMethod {
// //默认值为 500ms 小于该值的函数在运行时不会在控制台中被打印
// thresholdTime 100
// //需要针对函数插装的包名
// packageNames = ["com.didichuxing.doraemondemo"]
// //不需要针对函数插装的包名和类名
// methodBlacklist = ["com.didichuxing.doraemondemo.dokit"]
// }
// }
//}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(path: ':dokit-util')
implementation project(path: ':dokit-mc')
implementation project(path: ':dokit-autotest')
implementation project(path: ':dokit-test')
testImplementation rootProject.ext.dependencies["junit"]
implementation rootProject.ext.dependencies["constraintLayout"]
implementation rootProject.ext.dependencies["multidex"]
implementation rootProject.ext.dependencies["flexbox"]
implementation rootProject.ext.dependencies["lifecycle-viewmodel-savedstate"]
implementation rootProject.ext.dependencies["appcompat"]
implementation rootProject.ext.dependencies["material"]
if (needKotlinV14()) {
implementation rootProject.ext.dependencies["kotlin_v14"]
implementation rootProject.ext.dependencies["coroutines-core_v14"]
implementation rootProject.ext.dependencies["coroutines-android_v14"]
implementation rootProject.ext.dependencies["coil_v13"]
} else {
implementation rootProject.ext.dependencies["kotlin_v13"]
implementation rootProject.ext.dependencies["coroutines-core_v13"]
implementation rootProject.ext.dependencies["coroutines-android_v13"]
implementation rootProject.ext.dependencies["coil_v11"]
}
implementation rootProject.ext.dependencies["fragment"]
implementation rootProject.ext.dependencies["fragment-ktx"]
implementation rootProject.ext.dependencies["retrofit2"]
implementation rootProject.ext.dependencies["retrofit2_gson"]
implementation rootProject.ext.dependencies["retrofit2_scalars"]
implementation rootProject.ext.dependencies["retrofit2_rxjava2"]
implementation rootProject.ext.dependencies["rxAndroid"]
implementation rootProject.ext.dependencies["okhttp_v3"]
implementation rootProject.ext.dependencies["okgo"]
implementation rootProject.ext.dependencies["glide"]
// implementation rootProject.ext.dependencies["glide_okhttp3"]
kapt rootProject.ext.dependencies["glide_compiler"]
implementation rootProject.ext.dependencies["picasso"]
implementation rootProject.ext.dependencies["fresco"]
implementation rootProject.ext.dependencies["fresco-processors"]
implementation rootProject.ext.dependencies["image-loader"]
implementation rootProject.ext.dependencies["room_runtime"]
implementation rootProject.ext.dependencies["wcdb"]
implementation rootProject.ext.dependencies["jsoup"]
//weex相关
implementation rootProject.ext.dependencies["weex_inspector"]
implementation rootProject.ext.dependencies["weex_sdk"]
implementation rootProject.ext.dependencies["utilcode"]
implementation rootProject.ext.dependencies["brvah"]
implementation rootProject.ext.dependencies["easypermissions"]
releaseImplementation rootProject.ext.dependencies["okgo"]
//高德地图定位
implementation rootProject.ext.dependencies["amap_location"]
//高德搜索
implementation rootProject.ext.dependencies["amap_search"]
//高德地图
implementation rootProject.ext.dependencies["amap_navi"]
//腾讯地图定位
// implementation rootProject.ext.dependencies["tencent_location"]
// implementation rootProject.ext.dependencies["tencent_map"]
// implementation rootProject.ext.dependencies["tencent_map_util"]
// debugImplementation rootProject.ext.dependencies["leakcanary-android"]
//百度地图定位
// implementation files('libs/BaiduLBS_Android.jar')
//腾讯x5
implementation rootProject.ext.dependencies["tbs"]
debugImplementation rootProject.ext.dependencies["leakcanary_android"]
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation project(":dokit-pthread-hook")
implementation rootProject.ext.dependencies["epic"]
}
//configurations.all {
// //循环每个依赖库
// resolutionStrategy.eachDependency { DependencyResolveDetails details ->
// //获取当前循环到的依赖库
// def requested = details.requested
// //如果这个依赖库群组的名字是com.android.support
// if (requested.group == 'com.squareup.okhttp3') {
// //且其名字不是以multidex开头的
// if (requested.name == "okhttp") {
// //这里指定需要统一的依赖版本 比如我的需要配置成27.1.1
// //details.useVersion '3.14.7'
// details.useVersion rootProject.ext.android["okhttp_v4"]
// }
// }
// }
//}
================================================
FILE: Android/app/doraemonkit.gradle
================================================
def runType = rootProject.ext.publish_config["run_type"]
if (runType == 0) {
// 引用插件
apply plugin: 'com.didi.dokit.debug'
// 这里引用正常库
dependencies {
//外部平台依赖
debugImplementation project(":dokit")
debugImplementation project(":dokit-mc")
debugImplementation project(":dokit-ft")
// debugImplementation project(":dokit-weex")
// debugImplementation project(":dokit-rpc")
// debugImplementation project(":dokit-rpc-mc")
debugImplementation project(":dokit-gps-mock")
releaseImplementation project(":dokit-no-op")
}
} else if (runType == 1) {
apply plugin: 'com.didi.dokit'
// 引用no-op的库
dependencies {
//新版线上包
debugImplementation "io.github.didi.dokit:dokitx:${rootProject.ext.publish_config["version"]}"
debugImplementation "io.github.didi.dokit:dokitx-ft:${rootProject.ext.publish_config["version"]}"
debugImplementation "io.github.didi.dokit:dokitx-mc:${rootProject.ext.publish_config["version"]}"
debugImplementation "io.github.didi.dokit:dokitx-weex:${rootProject.ext.publish_config["version"]}"
debugImplementation "io.github.didi.dokit:dokit-gps-mock:${rootProject.ext.publish_config["version"]}"
releaseImplementation "io.github.didi.dokit:dokitx-no-op:${rootProject.ext.publish_config["version"]}"
}
}
================================================
FILE: Android/app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original from file name.
#-renamesourcefileattribute SourceFile
# start 腾讯地图 SDK
-keep class com.tencent.tencentmap.**{*;}
-keep class com.tencent.map.**{*;}
-keep class com.tencent.beacontmap.**{*;}
-keep class navsns.**{*;}
-dontwarn com.qq.**
-dontwarn com.tencent.**
# end 腾讯地图 SDK
================================================
FILE: Android/app/src/androidTest/java/com/didichuxing/doraemondemo/ExampleInstrumentedTest.java
================================================
//package com.didichuxing.doraemondemo;
//
//import android.content.Context;
//
//import org.junit.Test;
//import org.junit.runner.RunWith;
//
//import static org.junit.Assert.*;
//
///**
// * Instrumented test, which will execute on an Android device.
// *
// * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
// */
//@RunWith(AndroidJUnit4.class)
//public class ExampleInstrumentedTest {
// @Test
// public void useAppContext() throws Exception {
// // Context of the app under test.
// Context appContext = InstrumentationRegistry.getTargetContext();
//
// assertEquals("com.didichuxing.doraemondemo", appContext.getPackageName());
// }
//}
================================================
FILE: Android/app/src/debug/java/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.didichuxing.doraemondemo">
<!-- 腾讯地图 SDK 要求的权限(开始) -->
<!-- 访问网络获取地图服务 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- 检查网络可用性 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 访问WiFi状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 需要外部存储写权限用于保存地图缓存 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 获取 device id 辨别设备 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- tools:replace问题参考 https://developer.android.google.cn/studio/build/manifest-merge?hl=zh-cn tools:replace部分-->
<!-- android:requestLegacyExternalStorage="true" 解决sd卡没有权限的问题-->
<application
android:name=".App"
android:allowBackup="false"
android:icon="@mipmap/dk_app_icon"
android:label="@string/app_name"
android:requestLegacyExternalStorage="true"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:replace="android:allowBackup">
<activity android:name=".old.MainDebugActivityOkhttpV3">
</activity>
<!-- <activity-->
<!-- android:name=".mc.MCActivity"-->
<!-- android:configChanges="orientation|screenSize">-->
<!-- <intent-filter>-->
<!-- <action android:name="android.intent.action.MAIN" />-->
<!-- <category android:name="android.intent.category.LAUNCHER" />-->
<!-- </intent-filter>-->
<!-- </activity>-->
<activity android:name=".mc.WebViewActivity" />
<activity android:name=".comm.CommFragmentActivity" />
<!-- <activity-->
<!-- android:name=".MainDebugActivityOkhttpV3"-->
<!-- android:configChanges="orientation|screenSize">-->
<!-- <intent-filter>-->
<!-- <action android:name="android.intent.action.MAIN" />-->
<!-- <category android:name="android.intent.category.LAUNCHER" />-->
<!-- </intent-filter>-->
<!-- </activity>-->
</application>
</manifest>
================================================
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/AopApp.java
================================================
package com.didichuxing.doraemondemo;
import android.app.Application;
import android.content.Context;
import androidx.multidex.MultiDex;
import com.didichuxing.doraemondemo.dokit.DemoKit;
import com.didichuxing.doraemonkit.DoKit;
import com.didichuxing.doraemonkit.DoKitCallBack;
import com.didichuxing.doraemonkit.kit.AbstractKit;
import com.didichuxing.doraemonkit.kit.network.bean.NetworkRecord;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.imagepipeline.core.ImagePipelineConfig;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2020/4/22-17:03
* 描 述:
* 修订历史:
* ================================================
*/
public class AopApp extends Application {
@Override
public void onCreate() {
super.onCreate();
List<AbstractKit> kits = new ArrayList<>();
kits.add(new DemoKit());
//测试环境:a49842eeebeb1989b3f9565eb12c276b
//线上环境:749a0600b5e48dd77cf8ee680be7b1b7
//new AopTest().test();
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this)
.setDiskCacheEnabled(false)
.build();
Fresco.initialize(this, config);
//是否显示入口icon
// DoraemonKit.setAwaysShowMainIcon(false);
new DoKit.Builder(this)
.productId("749a0600b5e48dd77cf8ee680be7b1b7")
.disableUpload()
.fileManagerHttpPort(9001)
.mcWSPort(5555)
.alwaysShowMainIcon(true)
.callBack(new DoKitCallBack() {
@Override
public void onNetworkCallBack(@NotNull NetworkRecord record) {
}
@Override
public void onCpuCallBack(float value, @NotNull String filePath) {
}
@Override
public void onFpsCallBack(float value, @NotNull String filePath) {
}
@Override
public void onMemoryCallBack(float value, @NotNull String filePath) {
}
})
.build();
//DoraemonKit.install(this, kits, "70e78c27f9174d68668d8a66a2b66483")
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(base);
}
}
================================================
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/App.kt
================================================
package com.didichuxing.doraemondemo
import android.app.Activity
import android.app.Application
import android.content.Context
import android.view.View
import androidx.multidex.MultiDex
import com.baidu.mapapi.CoordType
import com.baidu.mapapi.SDKInitializer
import com.blankj.utilcode.util.PathUtils
import com.blankj.utilcode.util.ToastUtils
import com.didichuxing.doraemondemo.dokit.DemoKit
import com.didichuxing.doraemondemo.dokit.TestSimpleDokitFloatViewKit
import com.didichuxing.doraemondemo.dokit.TestSimpleDokitFragmentKit
import com.didichuxing.doraemondemo.mc.SlideBar
import com.didichuxing.doraemondemo.module.http.CustomInterceptor
import com.didichuxing.doraemonkit.DoKit
import com.didichuxing.doraemonkit.DoKitCallBack
import com.didichuxing.doraemonkit.kit.AbstractKit
import com.didichuxing.doraemonkit.kit.core.McClientProcessor
import com.didichuxing.doraemonkit.kit.network.bean.NetworkRecord
import com.didichuxing.doraemonkit.kit.network.okhttp.interceptor.DokitExtInterceptor
import com.didichuxing.doraemonkit.util.LogUtils
import com.facebook.drawee.backends.pipeline.Fresco
import com.facebook.imagepipeline.core.ImagePipelineConfig
import com.lzy.okgo.OkGo
import okhttp3.Cache
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Response
import java.io.File
/**
* @author jint
* @mail 704167880@qq.com
*/
class App : Application() {
override fun onCreate() {
super.onCreate()
//百度地图初始化
SDKInitializer.initialize(this)
SDKInitializer.setCoordType(CoordType.BD09LL)
//测试环境:a49842eeebeb1989b3f9565eb12c276b
//线上环境:749a0600b5e48dd77cf8ee680be7b1b7
//DoraemonKit.disableUpload()
//是否显示入口icon
// DoraemonKit.setAwaysShowMainIcon(false);
val kits: MutableList<AbstractKit> = ArrayList()
kits.add(DemoKit())
kits.add(TestSimpleDokitFloatViewKit())
kits.add(TestSimpleDokitFragmentKit())
val mapKits: LinkedHashMap<String, List<AbstractKit>> = linkedMapOf()
mapKits["业务专区1"] = mutableListOf<AbstractKit>().apply {
add(DemoKit())
add(TestSimpleDokitFloatViewKit())
add(TestSimpleDokitFragmentKit())
}
mapKits["业务专区2"] = mutableListOf<AbstractKit>(DemoKit())
DoKit.Builder(this)
.productId("749a0600b5e48dd77cf8ee680be7b1b7")
//测试环境pid
// .productId("277016abcc33bff1e6a4f1afdf14b8e1")
.disableUpload()
.customKits(mapKits)
.fileManagerHttpPort(9001)
.databasePass(mapOf("Person.db" to "a_password"))
.mcWSPort(5555)
.alwaysShowMainIcon(true)
.callBack(object : DoKitCallBack {
override fun onCpuCallBack(value: Float, filePath: String) {
super.onCpuCallBack(value, filePath)
}
override fun onFpsCallBack(value: Float, filePath: String) {
super.onFpsCallBack(value, filePath)
}
override fun onMemoryCallBack(value: Float, filePath: String) {
super.onMemoryCallBack(value, filePath)
}
override fun onNetworkCallBack(record: NetworkRecord) {
super.onNetworkCallBack(record)
}
})
.netExtInterceptor(object : DokitExtInterceptor.DokitExtInterceptorProxy {
override fun intercept(chain: Interceptor.Chain): Response {
return chain.proceed(chain.request())
}
})
.mcClientProcess(object : McClientProcessor {
override fun process(
activity: Activity?,
view: View?,
eventType: String,
params: Map<String, String>
) {
when (eventType) {
"un_lock" -> {
ToastUtils.showShort(params["unlock"])
}
"lock_process" -> {
val leftMargin = params["progress"]?.toInt()
leftMargin?.let {
if (view is SlideBar) {
view.setMarginLeftExtra(it)
}
}
}
else -> {
}
}
}
})
.build()
val client: OkHttpClient = OkHttpClient.Builder()
.addInterceptor(CustomInterceptor())
.cache(Cache(File("${PathUtils.getInternalAppCachePath()}/dokit"), 1024 * 1024 * 100))
.build()
OkGo.getInstance().init(this).okHttpClient = client
val config = ImagePipelineConfig.newBuilder(this)
.setDiskCacheEnabled(false)
.build()
Fresco.initialize(this, config)
// PaymentConfiguration.init(
// this,
// "pk_test_TYooMQauvdEDq54NiTphI7jx"
// )
//严格检查模式
//StrictMode.enableDefaults();
com.didichuxing.doraemonkit.util.LogUtils.getConfig()
.setLogSwitch(true)
// 设置是否输出到控制台开关,默认开
.setConsoleSwitch(true)
// 设置 log 全局标签,默认为空,当全局标签不为空时,我们输出的 log 全部为该 tag, 为空时,如果传入的 tag 为空那就显示类名,否则显示 tag
.setGlobalTag("Dokit")
// 设置 log 头信息开关,默认为开
.setLogHeadSwitch(true)
// 打印 log 时是否存到文件的开关,默认关
.setLog2FileSwitch(false)
// 当自定义路径为空时,写入应用的/cache/log/目录中
.setDir("")
// 当文件前缀为空时,默认为"util",即写入文件为"util-MM-dd.txt"
.setFilePrefix("djx-table-log")
// 输出日志是否带边框开关,默认开
.setBorderSwitch(true)
// 一条日志仅输出一条,默认开,为美化 AS 3.1 的 Logcat
.setSingleTagSwitch(false)
// log 的控制台过滤器,和 logcat 过滤器同理,默认 Verbose
.setConsoleFilter(LogUtils.V)
// log 文件过滤器,和 logcat 过滤器同理,默认 Verbose
.setFileFilter(LogUtils.E)
// log 栈深度,默认为 1
.setStackDeep(1)
.stackOffset = 1
}
override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
MultiDex.install(this)
}
companion object {
private const val TAG = "App"
var leakActivity: Activity? = null
}
}
================================================
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/AMapUtil.java
================================================
/**
*
*/
package com.didichuxing.doraemondemo.amap;
import android.text.Html;
import android.text.Spanned;
import android.widget.EditText;
import com.amap.api.maps.model.LatLng;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.route.BusPath;
import com.amap.api.services.route.BusStep;
import com.amap.api.services.route.RouteBusLineItem;
import com.amap.api.services.route.RouteRailwayItem;
import com.didichuxing.doraemondemo.R;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class AMapUtil {
/**
* 判断edittext是否null
*/
public static String checkEditText(EditText editText) {
if (editText != null && editText.getText() != null
&& !(editText.getText().toString().trim().equals(""))) {
return editText.getText().toString().trim();
} else {
return "";
}
}
public static Spanned stringToSpan(String src) {
return src == null ? null : Html.fromHtml(src.replace("\n", "<br />"));
}
public static String colorFont(String src, String color) {
StringBuffer strBuf = new StringBuffer();
strBuf.append("<font color=").append(color).append(">").append(src)
.append("</font>");
return strBuf.toString();
}
public static String makeHtmlNewLine() {
return "<br />";
}
public static String makeHtmlSpace(int number) {
final String space = " ";
StringBuilder result = new StringBuilder();
for (int i = 0; i < number; i++) {
result.append(space);
}
return result.toString();
}
public static String getFriendlyLength(int lenMeter) {
if (lenMeter > 10000) // 10 km
{
int dis = lenMeter / 1000;
return dis + ChString.Kilometer;
}
if (lenMeter > 1000) {
float dis = (float) lenMeter / 1000;
DecimalFormat fnum = new DecimalFormat("##0.0");
String dstr = fnum.format(dis);
return dstr + ChString.Kilometer;
}
if (lenMeter > 100) {
int dis = lenMeter / 50 * 50;
return dis + ChString.Meter;
}
int dis = lenMeter / 10 * 10;
if (dis == 0) {
dis = 10;
}
return dis + ChString.Meter;
}
public static boolean IsEmptyOrNullString(String s) {
return (s == null) || (s.trim().length() == 0);
}
/**
* 把LatLng对象转化为LatLonPoint对象
*/
public static LatLonPoint convertToLatLonPoint(LatLng latlon) {
return new LatLonPoint(latlon.latitude, latlon.longitude);
}
/**
* 把LatLonPoint对象转化为LatLon对象
*/
public static LatLng convertToLatLng(LatLonPoint latLonPoint) {
return new LatLng(latLonPoint.getLatitude(), latLonPoint.getLongitude());
}
/**
* 把集合体的LatLonPoint转化为集合体的LatLng
*/
public static ArrayList<LatLng> convertArrList(List<LatLonPoint> shapes) {
ArrayList<LatLng> lineShapes = new ArrayList<LatLng>();
for (LatLonPoint point : shapes) {
LatLng latLngTemp = convertToLatLng(point);
lineShapes.add(latLngTemp);
}
return lineShapes;
}
/**
* long类型时间格式化
*/
public static String convertToTime(long time) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(time);
return df.format(date);
}
public static final String HtmlBlack = "#000000";
public static final String HtmlGray = "#808080";
public static String getFriendlyTime(int second) {
if (second > 3600) {
int hour = second / 3600;
int miniate = (second % 3600) / 60;
return hour + "小时" + miniate + "分钟";
}
if (second >= 60) {
int miniate = second / 60;
return miniate + "分钟";
}
return second + "秒";
}
//路径规划方向指示和图片对应
public static int getDriveActionID(String actionName) {
if (actionName == null || actionName.equals("")) {
return R.mipmap.dir3;
}
if ("左转".equals(actionName)) {
return R.mipmap.dir2;
}
if ("右转".equals(actionName)) {
return R.mipmap.dir1;
}
if ("向左前方行驶".equals(actionName) || "靠左".equals(actionName)) {
return R.mipmap.dir6;
}
if ("向右前方行驶".equals(actionName) || "靠右".equals(actionName)) {
return R.mipmap.dir5;
}
if ("向左后方行驶".equals(actionName) || "左转调头".equals(actionName)) {
return R.mipmap.dir7;
}
if ("向右后方行驶".equals(actionName)) {
return R.mipmap.dir8;
}
if ("直行".equals(actionName)) {
return R.mipmap.dir3;
}
if ("减速行驶".equals(actionName)) {
return R.mipmap.dir4;
}
return R.mipmap.dir3;
}
public static int getWalkActionID(String actionName) {
if (actionName == null || actionName.equals("")) {
return R.mipmap.dir13;
}
if ("左转".equals(actionName)) {
return R.mipmap.dir2;
}
if ("右转".equals(actionName)) {
return R.mipmap.dir1;
}
if ("向左前方".equals(actionName) || "靠左".equals(actionName)) {
return R.mipmap.dir6;
}
if ("向右前方".equals(actionName) || "靠右".equals(actionName)) {
return R.mipmap.dir5;
}
if ("向左后方".equals(actionName)) {
return R.mipmap.dir7;
}
if ("向右后方".equals(actionName)) {
return R.mipmap.dir8;
}
if ("直行".equals(actionName)) {
return R.mipmap.dir3;
}
if ("通过人行横道".equals(actionName)) {
return R.mipmap.dir9;
}
if ("通过过街天桥".equals(actionName)) {
return R.mipmap.dir11;
}
if ("通过地下通道".equals(actionName)) {
return R.mipmap.dir10;
}
return R.mipmap.dir13;
}
public static String getBusPathTitle(BusPath busPath) {
if (busPath == null) {
return String.valueOf("");
}
List<BusStep> busSetps = busPath.getSteps();
if (busSetps == null) {
return String.valueOf("");
}
StringBuffer sb = new StringBuffer();
for (BusStep busStep : busSetps) {
StringBuffer title = new StringBuffer();
if (busStep.getBusLines().size() > 0) {
for (RouteBusLineItem busline : busStep.getBusLines()) {
if (busline == null) {
continue;
}
String buslineName = getSimpleBusLineName(busline.getBusLineName());
title.append(buslineName);
title.append(" / ");
}
// RouteBusLineItem busline = busStep.getBusLines().get(0);
sb.append(title.substring(0, title.length() - 3));
sb.append(" > ");
}
if (busStep.getRailway() != null) {
RouteRailwayItem railway = busStep.getRailway();
sb.append(railway.getTrip()+"("+railway.getDeparturestop().getName()
+" - "+railway.getArrivalstop().getName()+")");
sb.append(" > ");
}
}
return sb.substring(0, sb.length() - 3);
}
public static String getBusPathDes(BusPath busPath) {
if (busPath == null) {
return String.valueOf("");
}
long second = busPath.getDuration();
String time = getFriendlyTime((int) second);
float subDistance = busPath.getDistance();
String subDis = getFriendlyLength((int) subDistance);
float walkDistance = busPath.getWalkDistance();
String walkDis = getFriendlyLength((int) walkDistance);
return String.valueOf(time + " | " + subDis + " | 步行" + walkDis);
}
public static String getSimpleBusLineName(String busLineName) {
if (busLineName == null) {
return String.valueOf("");
}
return busLineName.replaceAll("\\(.*?\\)", "");
}
}
================================================
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/ChString.java
================================================
package com.didichuxing.doraemondemo.amap;
public class ChString {
public static final String Kilometer = "\u516c\u91cc";// "公里";
public static final String Meter = "\u7c73";// "米";
public static final String ByFoot = "\u6b65\u884c";// "步行";
public static final String To = "\u53bb\u5f80";// "去往";
public static final String Station = "\u8f66\u7ad9";// "车站";
public static final String TargetPlace = "\u76ee\u7684\u5730";// "目的地";
public static final String StartPlace = "\u51fa\u53d1\u5730";// "出发地";
public static final String About = "\u5927\u7ea6";// "大约";
public static final String Direction = "\u65b9\u5411";// "方向";
public static final String GetOn = "\u4e0a\u8f66";// "上车";
public static final String GetOff = "\u4e0b\u8f66";// "下车";
public static final String Zhan = "\u7ad9";// "站";
public static final String cross = "\u4ea4\u53c9\u8def\u53e3"; // 交叉路口
public static final String type = "\u7c7b\u522b"; // 类别
public static final String address = "\u5730\u5740"; // 地址
public static final String PrevStep = "\u4e0a\u4e00\u6b65";
public static final String NextStep = "\u4e0b\u4e00\u6b65";
public static final String Gong = "\u516c\u4ea4";
public static final String ByBus = "\u4e58\u8f66";
public static final String Arrive = "\u5230\u8FBE";// 到达
}
================================================
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/DrivingRouteOverLay.java
================================================
package com.didichuxing.doraemondemo.amap;
import android.content.Context;
import android.graphics.Color;
import com.amap.api.maps.AMap;
import com.amap.api.maps.model.BitmapDescriptor;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.LatLngBounds;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.maps.model.PolylineOptions;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.route.DrivePath;
import com.amap.api.services.route.DriveStep;
import com.amap.api.services.route.TMC;
import com.didichuxing.doraemondemo.R;
import java.util.ArrayList;
import java.util.List;
/**
* 导航路线图层类。
*/
public class DrivingRouteOverLay extends RouteOverlay{
private DrivePath drivePath;
private List<LatLonPoint> throughPointList;
private List<Marker> throughPointMarkerList = new ArrayList<Marker>();
private boolean throughPointMarkerVisible = true;
private List<TMC> tmcs;
private PolylineOptions mPolylineOptions;
private PolylineOptions mPolylineOptionscolor = null;
private Context mContext;
private boolean isColorfulline = true;
private float mWidth = 25;
private List<LatLng> mLatLngsOfPath;
public void setIsColorfulline(boolean iscolorfulline) {
this.isColorfulline = iscolorfulline;
}
/**
* 根据给定的参数,构造一个导航路线图层类对象。
*
* @param amap 地图对象。
* @param path 导航路线规划方案。
* @param context 当前的activity对象。
*/
public DrivingRouteOverLay(Context context, AMap amap, DrivePath path,
LatLonPoint start, LatLonPoint end, List<LatLonPoint> throughPointList) {
super(context);
mContext = context;
mAMap = amap;
this.drivePath = path;
startPoint = AMapUtil.convertToLatLng(start);
endPoint = AMapUtil.convertToLatLng(end);
this.throughPointList = throughPointList;
}
public float getRouteWidth() {
return mWidth;
}
/**
* 设置路线宽度
*
* @param mWidth 路线宽度,取值范围:大于0
*/
public void setRouteWidth(float mWidth) {
this.mWidth = mWidth;
}
/**
* 添加驾车路线添加到地图上显示。
*/
public void addToMap() {
initPolylineOptions();
try {
if (mAMap == null) {
return;
}
if (mWidth == 0 || drivePath == null) {
return;
}
mLatLngsOfPath = new ArrayList<LatLng>();
tmcs = new ArrayList<TMC>();
List<DriveStep> drivePaths = drivePath.getSteps();
mPolylineOptions.add(startPoint);
for (DriveStep step : drivePaths) {
List<LatLonPoint> latlonPoints = step.getPolyline();
List<TMC> tmclist = step.getTMCs();
tmcs.addAll(tmclist);
addDrivingStationMarkers(step, convertToLatLng(latlonPoints.get(0)));
for (LatLonPoint latlonpoint : latlonPoints) {
mPolylineOptions.add(convertToLatLng(latlonpoint));
mLatLngsOfPath.add(convertToLatLng(latlonpoint));
}
}
mPolylineOptions.add(endPoint);
if (startMarker != null) {
startMarker.remove();
startMarker = null;
}
if (endMarker != null) {
endMarker.remove();
endMarker = null;
}
addStartAndEndMarker();
addThroughPointMarker();
if (isColorfulline && tmcs.size()>0 ) {
colorWayUpdate(tmcs);
}else {
showPolyline();
}
} catch (Throwable e) {
e.printStackTrace();
}
}
/**
* 初始化线段属性
*/
private void initPolylineOptions() {
mPolylineOptions = null;
mPolylineOptions = new PolylineOptions();
mPolylineOptions.color(getDriveColor()).width(getRouteWidth());
}
private void showPolyline() {
addPolyLine(mPolylineOptions);
}
/**
* 根据不同的路段拥堵情况展示不同的颜色
*
* @param tmcSection
*/
private void colorWayUpdate(List<TMC> tmcSection) {
if (mAMap == null) {
return;
}
if (tmcSection == null || tmcSection.size() <= 0) {
return;
}
TMC segmentTrafficStatus;
addPolyLine(new PolylineOptions().add(startPoint,
AMapUtil.convertToLatLng(tmcSection.get(0).getPolyline().get(0)))
.setDottedLine(true));
String status = "";
for (int i = 0; i < tmcSection.size(); i++) {
segmentTrafficStatus = tmcSection.get(i);
List<LatLonPoint> mployline = segmentTrafficStatus.getPolyline();
if (status.equals(segmentTrafficStatus.getStatus())) {
for (int j = 1; j < mployline.size(); j++) {//第一个点和上一段最后一个点重复,这个不重复添加
mPolylineOptionscolor.add(AMapUtil.convertToLatLng(mployline.get(j)));
}
}else {
if (mPolylineOptionscolor != null) {
addPolyLine(mPolylineOptionscolor.color(getcolor(status)));
}
mPolylineOptionscolor = null;
mPolylineOptionscolor = new PolylineOptions().width(getRouteWidth());
status = segmentTrafficStatus.getStatus();
for (int j = 0; j < mployline.size(); j++) {
mPolylineOptionscolor.add(AMapUtil.convertToLatLng(mployline.get(j)));
}
}
if (i == tmcSection.size()-1 && mPolylineOptionscolor != null) {
addPolyLine(mPolylineOptionscolor.color(getcolor(status)));
addPolyLine(new PolylineOptions().add(
AMapUtil.convertToLatLng(mployline.get(mployline.size()-1)), endPoint)
.setDottedLine(true));
}
}
}
private int getcolor(String status) {
if (status.equals("畅通")) {
return Color.GREEN;
} else if (status.equals("缓行")) {
return Color.YELLOW;
} else if (status.equals("拥堵")) {
return Color.RED;
} else if (status.equals("严重拥堵")) {
return Color.parseColor("#990033");
} else {
return Color.parseColor("#537edc");
}
}
public LatLng convertToLatLng(LatLonPoint point) {
return new LatLng(point.getLatitude(),point.getLongitude());
}
/**
* @param driveStep
* @param latLng
*/
private void addDrivingStationMarkers(DriveStep driveStep, LatLng latLng) {
addStationMarker(new MarkerOptions()
.position(latLng)
.title("\u65B9\u5411:" + driveStep.getAction()
+ "\n\u9053\u8DEF:" + driveStep.getRoad())
.snippet(driveStep.getInstruction()).visible(nodeIconVisible)
.anchor(0.5f, 0.5f).icon(getDriveBitmapDescriptor()));
}
@Override
protected LatLngBounds getLatLngBounds() {
LatLngBounds.Builder b = LatLngBounds.builder();
b.include(new LatLng(startPoint.latitude, startPoint.longitude));
b.include(new LatLng(endPoint.latitude, endPoint.longitude));
if (this.throughPointList != null && this.throughPointList.size() > 0) {
for (int i = 0; i < this.throughPointList.size(); i++) {
b.include(new LatLng(
this.throughPointList.get(i).getLatitude(),
this.throughPointList.get(i).getLongitude()));
}
}
return b.build();
}
public void setThroughPointIconVisibility(boolean visible) {
try {
throughPointMarkerVisible = visible;
if (this.throughPointMarkerList != null
&& this.throughPointMarkerList.size() > 0) {
for (int i = 0; i < this.throughPointMarkerList.size(); i++) {
this.throughPointMarkerList.get(i).setVisible(visible);
}
}
} catch (Throwable e) {
e.printStackTrace();
}
}
private void addThroughPointMarker() {
if (this.throughPointList != null && this.throughPointList.size() > 0) {
LatLonPoint latLonPoint = null;
for (int i = 0; i < this.throughPointList.size(); i++) {
latLonPoint = this.throughPointList.get(i);
if (latLonPoint != null) {
throughPointMarkerList.add(mAMap
.addMarker((new MarkerOptions())
.position(
new LatLng(latLonPoint
.getLatitude(), latLonPoint
.getLongitude()))
.visible(throughPointMarkerVisible)
.icon(getThroughPointBitDes())
.title("\u9014\u7ECF\u70B9")));
}
}
}
}
private BitmapDescriptor getThroughPointBitDes() {
return BitmapDescriptorFactory.fromResource(R.mipmap.amap_through);
}
/**
* 获取两点间距离
*
* @param start
* @param end
* @return
*/
public static int calculateDistance(LatLng start, LatLng end) {
double x1 = start.longitude;
double y1 = start.latitude;
double x2 = end.longitude;
double y2 = end.latitude;
return calculateDistance(x1, y1, x2, y2);
}
public static int calculateDistance(double x1, double y1, double x2, double y2) {
final double NF_pi = 0.01745329251994329; // 弧度 PI/180
x1 *= NF_pi;
y1 *= NF_pi;
x2 *= NF_pi;
y2 *= NF_pi;
double sinx1 = Math.sin(x1);
double siny1 = Math.sin(y1);
double cosx1 = Math.cos(x1);
double cosy1 = Math.cos(y1);
double sinx2 = Math.sin(x2);
double siny2 = Math.sin(y2);
double cosx2 = Math.cos(x2);
double cosy2 = Math.cos(y2);
double[] v1 = new double[3];
v1[0] = cosy1 * cosx1 - cosy2 * cosx2;
v1[1] = cosy1 * sinx1 - cosy2 * sinx2;
v1[2] = siny1 - siny2;
double dist = Math.sqrt(v1[0] * v1[0] + v1[1] * v1[1] + v1[2] * v1[2]);
return (int) (Math.asin(dist / 2) * 12742001.5798544);
}
//获取指定两点之间固定距离点
public static LatLng getPointForDis(LatLng sPt, LatLng ePt, double dis) {
double lSegLength = calculateDistance(sPt, ePt);
double preResult = dis / lSegLength;
return new LatLng((ePt.latitude - sPt.latitude) * preResult + sPt.latitude, (ePt.longitude - sPt.longitude) * preResult + sPt.longitude);
}
/**
* 去掉DriveLineOverlay上的线段和标记。
*/
@Override
public void removeFromMap() {
try {
super.removeFromMap();
if (this.throughPointMarkerList != null
&& this.throughPointMarkerList.size() > 0) {
for (int i = 0; i < this.throughPointMarkerList.size(); i++) {
this.throughPointMarkerList.get(i).remove();
}
this.throughPointMarkerList.clear();
}
} catch (Throwable e) {
e.printStackTrace();
}
}
}
================================================
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/FloatGpsMockRouteKitView.java
================================================
package com.didichuxing.doraemondemo.amap;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import com.didichuxing.doraemondemo.R;
import com.didichuxing.doraemondemo.dokit.SimpleDoKitView;
import com.didichuxing.doraemonkit.gps_mock.lbs.route.FloatGpsRouteMockCache;
public class FloatGpsMockRouteKitView extends SimpleDoKitView {
public static final String TAG = "FloatGpsMockRoutKitView";
private View mRootView;
private static int sMockSpeed = 10;
private TextView mMockSpeedTv;
private SeekBar mSpeedSeekBar;
private SeekBar routeSeekBar;
private TextView mockRouteTv;
private Handler handler = new Handler(Looper.getMainLooper());
private Runnable updateRouteUiRunnable = new Runnable() {
@Override
public void run() {
routeSeekBar.setMax(FloatGpsRouteMockCache.getRouteCount());
routeSeekBar.setProgress(FloatGpsRouteMockCache.getMockRouteProgress());
mockRouteTv.setText("模拟路线进度:" + FloatGpsRouteMockCache.getMockRouteProgress() + " / " + FloatGpsRouteMockCache.getRouteCount());
if (FloatGpsRouteMockCache.getRouteCount() == 0) {
mockRouteTv.setText("使用 FloatGpsRouteMockCache.mockGpsRoute 设置模拟线路");
}
}
};
@Override
protected int getLayoutId() {
return R.layout.layout_mock_route;
}
@Override
public void onViewCreated(FrameLayout rootView) {
super.onViewCreated(rootView);
mRootView = rootView;
setMockLocationConfig();
}
private void setMockLocationConfig() {
// 路线模拟工具
FloatGpsRouteMockCache.setRouteChangeListener(new FloatGpsRouteMockCache.IOnRouteChange() {
@Override
public void onRouteChange() {
updateRouteUI(0);
}
public void onIndexChange(int index) {
Log.d(TAG, "⚠️ onIndexChange() called with: index = [" + index + "]");
updateRouteUI(index);
}
});
mockRouteTv = findViewById(R.id.tv_mock_route);
routeSeekBar = findViewById(R.id.dk_sb_mock_route_seekBar);
routeSeekBar.setMax(FloatGpsRouteMockCache.getRouteCount());
routeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar routeSeekBar, int progress, boolean fromUser) {
if (fromUser) {
updateRoute(getContext().getApplicationContext(), progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar routeSeekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar routeSeekBar) {
}
});
findViewById(R.id.btn_route_back).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
updateRoute(v.getContext().getApplicationContext(), FloatGpsRouteMockCache.getMockRouteProgress() - 1);
}
});
findViewById(R.id.btn_route_forward).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
updateRoute(v.getContext().getApplicationContext(), FloatGpsRouteMockCache.getMockRouteProgress() + 1);
}
});
findViewById(R.id.btn_route_pause).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FloatGpsRouteMockCache.pausePlayMockRoute();
}
});
findViewById(R.id.btn_route_resume).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FloatGpsRouteMockCache.resumePlayMockRoute(getContext());
}
});
}
private void updateRoute(Context context, int index) {
index = FloatGpsRouteMockCache.setMockRouteProgress(context, index);
updateRouteUI(index);
}
private void updateRouteUI(int index) {
handler.post(updateRouteUiRunnable);
}
}
================================================
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/FloatGpsPresetMockKit.java
================================================
package com.didichuxing.doraemondemo.amap;
import android.app.Activity;
import android.content.Context;
import com.blankj.utilcode.util.ToastUtils;
import com.didichuxing.doraemondemo.R;
import com.didichuxing.doraemonkit.DoKit;
import com.didichuxing.doraemonkit.aop.DokitPluginConfig;
import com.didichuxing.doraemonkit.kit.AbstractKit;
import com.didichuxing.doraemonkit.util.DoKitCommUtil;
import org.jetbrains.annotations.NotNull;
/**
* Created by changzuozhen on 2021年1月22日
*/
public class FloatGpsPresetMockKit extends AbstractKit {
@Override
public int getName() {
return R.string.dk_kit_gps_mock_preset;
}
@Override
public int getIcon() {
return R.mipmap.dk_mock_location_preset;
}
@Override
public boolean onClickWithReturn(@NotNull Activity activity) {
if (!DokitPluginConfig.SWITCH_DOKIT_PLUGIN) {
ToastUtils.showShort(DoKitCommUtil.getString(R.string.dk_plugin_close_tip));
return false;
}
if (!DokitPluginConfig.SWITCH_GPS) {
ToastUtils.showShort(DoKitCommUtil.getString(R.string.dk_plugin_gps_close_tip));
return false;
}
DoKit.launchFloating(FloatGpsPresetMockKitView.class);
return true;
}
@Override
public void onAppInit(Context context) {
}
@Override
public boolean isInnerKit() {
return false;
}
}
================================================
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/FloatGpsPresetMockKitView.java
================================================
package com.didichuxing.doraemondemo.amap;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.Switch;
import android.widget.TextView;
import com.didichuxing.doraemondemo.R;
import com.didichuxing.doraemondemo.dokit.SimpleDoKitView;
import com.didichuxing.doraemonkit.gps_mock.lbs.common.LocInfo;
import com.didichuxing.doraemonkit.gps_mock.lbs.manual.FloatGpsMockCache;
import com.didichuxing.doraemonkit.gps_mock.lbs.preset.FloatGpsPresetMockCache;
import com.didichuxing.doraemonkit.gps_mock.lbs.preset.MockLocList;
import com.google.android.flexbox.FlexboxLayout;
import java.util.ArrayList;
public class FloatGpsPresetMockKitView extends SimpleDoKitView {
public static final String TAG = "FloatGpsPresetMockKitView";
private View mRootView;
@Override
protected int getLayoutId() {
return R.layout.layout_mock_location_preset;
}
@Override
public void onViewCreated(FrameLayout rootView) {
super.onViewCreated(rootView);
mRootView = rootView;
setMockLocationConfig();
}
private void setMockLocationConfig() {
// 模拟位置预 单点
final MockLocList locationList = FloatGpsPresetMockCache.sMockLocationList;
ArrayList<String> configString = new ArrayList<>();
for (LocInfo locInfo : locationList) {
configString.add(locInfo.locName);
}
LocInfo config = FloatGpsPresetMockCache.getMockLocConfig();
if (config != null) {
Log.i(getTAG(), "⚠️setMockLocationConfig() setSelection called" + config.locName);
updateCurrentLocConfig(config);
}
FlexboxLayout flexboxLayout = findViewById(R.id.cl_mock_gps_flexbox_container);
for (final LocInfo locInfo : FloatGpsPresetMockCache.sMockLocationList) {
Button button = new Button(getContext());
button.setText(locInfo.locName);
button.setMinWidth(0);
button.setMinHeight(0);
button.setMinimumWidth(0);//必须同时设置这个
button.setMinimumHeight(0);//必须同时设置这个
button.setTextSize(9);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
Log.d(getTAG(), "⚠️onNewItemSelected() called with: locInfo = [" + locInfo + "]");
FloatGpsMockCache.mockToLocation(locInfo.lat, locInfo.lng);
((Switch) findViewById(R.id.env_switch3)).setChecked(true);
updateCurrentLocConfig(locInfo);
} catch (Exception e) {
}
}
});
flexboxLayout.addView(button);
}
}
private void updateCurrentLocConfig(LocInfo currentConfig) {
TextView envInfo = this.findViewById(R.id.env_info3);
updateGsonInfo(currentConfig.toString(), envInfo);
}
private void updateGsonInfo(String currentConfig, TextView envInfo) {
if (currentConfig == null) {
envInfo.setVisibility(View.GONE);
} else {
envInfo.setVisibility(View.VISIBLE);
envInfo.setText(currentConfig);
}
}
}
================================================
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/RouteOverlay.java
================================================
package com.didichuxing.doraemondemo.amap;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.model.BitmapDescriptor;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.LatLngBounds;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.maps.model.Polyline;
import com.amap.api.maps.model.PolylineOptions;
import com.didichuxing.doraemondemo.R;
import java.util.ArrayList;
import java.util.List;
public class RouteOverlay {
protected List<Marker> stationMarkers = new ArrayList<Marker>();
protected List<Polyline> allPolyLines = new ArrayList<Polyline>();
protected Marker startMarker;
protected Marker endMarker;
protected LatLng startPoint;
protected LatLng endPoint;
protected AMap mAMap;
private Context mContext;
private Bitmap startBit, endBit, busBit, walkBit, driveBit;
protected boolean nodeIconVisible = true;
public RouteOverlay(Context context) {
mContext = context;
}
/**
* 去掉BusRouteOverlay上所有的Marker。
* @since V2.1.0
*/
public void removeFromMap() {
if (startMarker != null) {
startMarker.remove();
}
if (endMarker != null) {
endMarker.remove();
}
for (Marker marker : stationMarkers) {
marker.remove();
}
for (Polyline line : allPolyLines) {
line.remove();
}
destroyBit();
}
private void destroyBit() {
if (startBit != null) {
startBit.recycle();
startBit = null;
}
if (endBit != null) {
endBit.recycle();
endBit = null;
}
if (busBit != null) {
busBit.recycle();
busBit = null;
}
if (walkBit != null) {
walkBit.recycle();
walkBit = null;
}
if (driveBit != null) {
driveBit.recycle();
driveBit = null;
}
}
/**
* 给起点Marker设置图标,并返回更换图标的图片。如不用默认图片,需要重写此方法。
* @return 更换的Marker图片。
* @since V2.1.0
*/
protected BitmapDescriptor getStartBitmapDescriptor() {
return BitmapDescriptorFactory.fromResource(R.mipmap.amap_start);
}
/**
* 给终点Marker设置图标,并返回更换图标的图片。如不用默认图片,需要重写此方法。
* @return 更换的Marker图片。
* @since V2.1.0
*/
protected BitmapDescriptor getEndBitmapDescriptor() {
return BitmapDescriptorFactory.fromResource(R.mipmap.amap_end);
}
/**
* 给公交Marker设置图标,并返回更换图标的图片。如不用默认图片,需要重写此方法。
* @return 更换的Marker图片。
* @since V2.1.0
*/
protected BitmapDescriptor getBusBitmapDescriptor() {
return BitmapDescriptorFactory.fromResource(R.mipmap.dk_lbs_bus);
}
/**
* 给步行Marker设置图标,并返回更换图标的图片。如不用默认图片,需要重写此方法。
* @return 更换的Marker图片。
* @since V2.1.0
*/
protected BitmapDescriptor getWalkBitmapDescriptor() {
return BitmapDescriptorFactory.fromResource(R.mipmap.dk_lbs_man);
}
protected BitmapDescriptor getDriveBitmapDescriptor() {
return BitmapDescriptorFactory.fromResource(R.mipmap.dk_lbs_car);
}
protected void addStartAndEndMarker() {
startMarker = mAMap.addMarker((new MarkerOptions())
.position(startPoint).icon(getStartBitmapDescriptor())
.title("\u8D77\u70B9"));
// startMarker.showInfoWindow();
endMarker = mAMap.addMarker((new MarkerOptions()).position(endPoint)
.icon(getEndBitmapDescriptor()).title("\u7EC8\u70B9"));
// mAMap.moveCamera(CameraUpdateFactory.newLatLngZoom(startPoint,
// getShowRouteZoom()));
}
/**
* 移动镜头到当前的视角。
* @since V2.1.0
*/
public void zoomToSpan() {
if (startPoint != null) {
if (mAMap == null)
return;
try {
LatLngBounds bounds = getLatLngBounds();
mAMap.animateCamera(CameraUpdateFactory
.newLatLngBounds(bounds, 50));
} catch (Throwable e) {
e.printStackTrace();
}
}
}
protected LatLngBounds getLatLngBounds() {
LatLngBounds.Builder b = LatLngBounds.builder();
b.include(new LatLng(startPoint.latitude, startPoint.longitude));
b.include(new LatLng(endPoint.latitude, endPoint.longitude));
return b.build();
}
/**
* 路段节点图标控制显示接口。
* @param visible true为显示节点图标,false为不显示。
* @since V2.3.1
*/
public void setNodeIconVisibility(boolean visible) {
try {
nodeIconVisible = visible;
if (this.stationMarkers != null && this.stationMarkers.size() > 0) {
for (int i = 0; i < this.stationMarkers.size(); i++) {
this.stationMarkers.get(i).setVisible(visible);
}
}
} catch (Throwable e) {
e.printStackTrace();
}
}
protected void addStationMarker(MarkerOptions options) {
if(options == null) {
return;
}
Marker marker = mAMap.addMarker(options);
if(marker != null) {
stationMarkers.add(marker);
}
}
protected void addPolyLine(PolylineOptions options) {
if(options == null) {
return;
}
Polyline polyline = mAMap.addPolyline(options);
if(polyline != null) {
allPolyLines.add(polyline);
}
}
protected float getRouteWidth() {
return 18f;
}
protected int getWalkColor() {
return Color.parseColor("#6db74d");
}
/**
* 自定义路线颜色。
* return 自定义路线颜色。
* @since V2.2.1
*/
protected int getBusColor() {
return Color.parseColor("#537edc");
}
protected int getDriveColor() {
return Color.parseColor("#537edc");
}
// protected int getShowRouteZoom() {
// return 15;
// }
}
================================================
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/mockroute/BearingUtils.java
================================================
package com.didichuxing.doraemondemo.amap.mockroute;
/**
* changzuozhen
* 2021年 04月 20日
*/
public final class BearingUtils {
private BearingUtils() {
}
public static double bearing(double lat1, double lon1, double lat2, double lon2) {
double longitude1 = lon1;
double longitude2 = lon2;
double latitude1 = Math.toRadians(lat1);
double latitude2 = Math.toRadians(lat2);
double longDiff = Math.toRadians(longitude2 - longitude1);
double y = Math.sin(longDiff) * Math.cos(latitude2);
double x = Math.cos(latitude1) * Math.sin(latitude2) - Math.sin(latitude1) * Math.cos(latitude2) * Math.cos(longDiff);
return (Math.toDegrees(Math.atan2(y, x)) + 360) % 360;
}
}
================================================
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/mockroute/LogUtils.java
================================================
package com.didichuxing.doraemondemo.amap.mockroute;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.Log;
/**
* 日志控制
*/
public final class LogUtils {
public static boolean S_OPEN_LOG = true;
static volatile long sCurrentForSpendTimeLog = System.currentTimeMillis();
static volatile int sSpendTimeIndex = 0;
private static final String TAG = "_AndyTest_";
private static HandlerThread mBackThread;
private static Handler sHandler;
static HandlerThread getBackThread() {
if (mBackThread == null) {
synchronized (LogUtils.class) {
if (mBackThread == null) {
mBackThread = new HandlerThread("LogUtils Thread");
mBackThread.start();
}
}
}
return mBackThread;
}
static Handler getHandler() {
if (sHandler == null) {
synchronized (LogUtils.class) {
if (sHandler == null) {
sHandler = new Handler(getBackThread().getLooper());
}
}
}
return sHandler;
}
private LogUtils() {
}
public static void d(String logKey, CharSequence msg) {
d(logKey, msg, 2);
}
public static void d(String logKey, final CharSequence msg, final Object... args) {
d(logKey, msg.toString() + args, 2);
}
/**
* @param stackIndex 1:当前位置,2:上级栈位置,0:logcat 的位置(没有意义)
*/
public static void d(String logKey, CharSequence msg, int stackIndex) {
if (S_OPEN_LOG) {
StackTraceElement ste = new Throwable().getStackTrace()[stackIndex];
String log = build(msg, ste);
Log.d(logKey, log);
}
}
public static void d(CharSequence msg) {
if (S_OPEN_LOG) {
StackTraceElement ste = new Throwable().getStackTrace()[1];
String log = build(msg, ste);
Log.d(TAG, log);
}
}
public static void i(String logKey, CharSequence msg, int stackIndex) {
if (S_OPEN_LOG) {
StackTraceElement ste = new Throwable().getStackTrace()[stackIndex];
String log = build(msg, ste);
Log.i(logKey, log);
// Log.i(TAG, "[" + logKey + "]" + log);
}
}
public static void i(String logKey, CharSequence msg) {
i(logKey, msg, 2);
}
public static void v(String logKey, CharSequence msg, int stackIndex) {
if (S_OPEN_LOG) {
StackTraceElement ste = new Throwable().getStackTrace()[stackIndex];
String log = build(msg, ste);
Log.v(logKey, log);
// Log.v(TAG, "[" + logKey + "]" + log);
}
}
public static void v(String logKey, CharSequence msg) {
v(logKey, msg, 2);
}
public static void w(String logKey, CharSequence msg) {
if (S_OPEN_LOG) {
StackTraceElement ste = new Throwable().getStackTrace()[1];
String log = build(logKey, msg, ste);
Log.w(logKey, log);
// Log.w(TAG, "[" + logKey + "]" + log);
}
}
/**
* 打印error级别的log
*
* @param tag tag标签
*/
public static void e(String tag, Throwable tr) {
if (S_OPEN_LOG) {
StackTraceElement ste = new Throwable().getStackTrace()[1];
String log = build(tag, "", ste, tr);
Log.e(tag, log, tr);
// Log.e(tag, "[" + Thread.currentThread().getId() + "]" + tr.getMessage(), tr);
}
}
public static void e(String logKey, CharSequence msg) {
if (S_OPEN_LOG) {
StackTraceElement ste = new Throwable().getStackTrace()[1];
String log = build(logKey, msg, ste);
Log.e(logKey, log);
}
}
public static void e(String logKey, CharSequence msg, Throwable e) {
if (S_OPEN_LOG) {
StackTraceElement ste = new Throwable().getStackTrace()[1];
String log = build(logKey, msg, ste);
Log.d(logKey, log, e);
// Log.e(TAG, log, e);
}
}
/**
* 打印调用栈信息
*/
public static void t(String logKey, CharSequence msg) {
if (S_OPEN_LOG) {
StackTraceElement[] stackTrace = new Throwable().getStackTrace();
StringBuilder sb = new StringBuilder();
if (stackTrace.length > 0) {
sb.append(build(msg, stackTrace[1]));
sb.append('\n');
} else {
sb.append(msg);
}
for (int i = 2; i < stackTrace.length; i++) {
sb.append(stackTrace[i]);
sb.append('\n');
}
Log.i(logKey, sb.toString());
}
}
public static void timeSinceLast() {
LogUtils.d(TAG, "⚠️" + (sSpendTimeIndex++) + "spend:" + (System.currentTimeMillis() - sCurrentForSpendTimeLog) + " ", 2);
sCurrentForSpendTimeLog = System.currentTimeMillis();
}
public static String getLineText(String msg, int stackIndex) {
if (S_OPEN_LOG) {
StackTraceElement ste = new Throwable().getStackTrace()[stackIndex];
String log = build(msg, ste);
return log;
} else {
return msg;
}
}
public static String getLineText(String msg) {
if (S_OPEN_LOG) {
int stackIndex = 1;
StackTraceElement ste = new Throwable().getStackTrace()[stackIndex];
String log = build(msg, ste);
return log;
} else {
return msg;
}
}
/**
* 制作打log位置的文件名与文件行号详细信息
*/
private static String build(CharSequence log, StackTraceElement ste) {
StringBuilder buf = new StringBuilder();
buf.append("[").append(Thread.currentThread().getId()).append("]");
if (ste.isNativeMethod()) {
buf.append("(Native Method)");
} else {
CharSequence fileName = ste.getFileName();
if (fileName == null) {
buf.append("(Unknown Source)");
} else {
int lineNum = ste.getLineNumber();
buf.append('(');
buf.append(fileName);
if (lineNum >= 0) {
buf.append(':');
buf.append(lineNum);
}
buf.append("):");
}
}
buf.append(log);
return buf.toString();
}
private static String build(String logKey, CharSequence msg, StackTraceElement ste) {
StringBuilder sb = new StringBuilder();
sb.append("[").append(logKey).append("]").append(build(msg, ste));
return sb.toString();
}
private static String build(String logKey, CharSequence msg, StackTraceElement ste, Throwable e) {
StringBuilder sb = new StringBuilder();
sb.append("[").append(logKey).append("]").append(ste.toString()).append(":").append(msg).append("\r\n").append("e:").append(e.getMessage());
return sb.toString();
}
}
================================================
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/mockroute/MockGPSTaskData.java
================================================
package com.didichuxing.doraemondemo.amap.mockroute;
import java.util.ArrayList;
/**
* changzuozhen
* 2021年 04月 20日
*/
public class MockGPSTaskData {
private static final String TAG = "TaskInfoData";
public double start_lng;
public double start_lat;
public double end_lng;
public double end_lat;
public ArrayList<MockGPSItem> mockGPSItems;
@Override
public String toString() {
return "任务 轨迹点=" + mockGPSItems.size() +
", start_lat,lng= " + start_lat + "," + start_lng +
", end_lat,lng= " + end_lat + "," + end_lng;
}
public static class MockGPSItem {
public Double lng;
public Double lat;
public Long time;
public Float accuracy;
public Double speed;
public Long bearing;
@Override
public String toString() {
return "TraceItem{" +
"lng=" + lng +
", lat=" + lat +
", time=" + time +
", accuracy=" + accuracy +
", speed=" + speed +
", bearing=" + bearing +
'}';
}
public MockGPSItem setLng(Double lng) {
this.lng = lng;
return this;
}
public MockGPSItem setLat(Double lat) {
this.lat = lat;
return this;
}
public MockGPSItem setTime(Long time) {
this.time = time;
return this;
}
public MockGPSItem setAccuracy(Float accuracy) {
this.accuracy = accuracy;
return this;
}
public MockGPSItem setSpeed(Double speed) {
this.speed = speed;
return this;
}
public MockGPSItem setBearing(Long bearing) {
this.bearing = bearing;
return this;
}
}
public static void modifyBearing(ArrayList<MockGPSItem> mockGPSItems) {
int compairStep = 5;
if (mockGPSItems != null && mockGPSItems.size() > compairStep) {
// LogUtils.d(TAG, "⚠️modifyBearing() called with: mockGPSItems = [" + mockGPSItems.size() + "]");
for (int i = 0; i < mockGPSItems.size() - compairStep; i++) {
MockGPSItem a = mockGPSItems.get(i);
MockGPSItem b = mockGPSItems.get(i + compairStep);
// LogUtils.d(TAG, "⚠️modifyBearing() called with:" +
// "bearing = [" + a.bearing + "] " +
// "bearing = [" + (long) BearingUtils.bearing(a.lat, a.lng, b.lat, b.lng) + "]");
a.bearing = (long) BearingUtils.bearing(a.lat, a.lng, b.lat, b.lng);
}
}
}
}
================================================
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/mockroute/MockGPSTaskManager.java
================================================
package com.didichuxing.doraemondemo.amap.mockroute;
import android.location.Location;
import android.location.LocationManager;
import androidx.annotation.NonNull;
import com.amap.api.maps.AMapUtils;
import com.amap.api.maps.model.LatLng;
import com.amap.api.navi.model.AMapNaviPath;
import com.amap.api.navi.model.NaviLatLng;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.functions.Predicate;
import io.reactivex.schedulers.Schedulers;
/**
* 使用Dokit位置mock
* changzuozhen
* 2021年 04月 20日
*/
public class MockGPSTaskManager {
private static final String TAG = "TaskMockManager";
public static int PERIOD_LEVEL_MIN = 1;
public static int PERIOD_LEVEL_MAX = 20;
public static int PERIOD_UNIT = 50;
private static int mPeriodLevel = PERIOD_LEVEL_MAX;
private Long mProgressIndex = 0L;
private Long mProgressIndexMax = 0L;
private boolean mPause = false;
private boolean mSkip = false;
MockGPSTaskData taskInfoData;
public static MockGPSTaskManager sMockGPSTaskManager;
public MockGPSTaskManager(MockGPSTaskData mockGPSTaskData) {
this.taskInfoData = mockGPSTaskData;
mProgressIndexMax = Long.valueOf(mockGPSTaskData.mockGPSItems.size() - 1);
}
public Observable<Location> startGpsMockTask() {
return Observable.interval(0, PERIOD_UNIT, TimeUnit.MILLISECONDS, Schedulers.io())
// Observable.interval(0, PERIOD_UNIT * getPeriodLevel(), TimeUnit.MILLISECONDS, Schedulers.io())
// Observable.timer(PERIOD_UNIT * getPeriodLevel(), TimeUnit.MICROSECONDS)
// .subscribeOn(Schedulers.io())
.filter(new Predicate<Long>() {
@Override
public boolean test(Long aLong) throws Exception {
boolean periodMatched = (aLong % getPeriodLevel()) == 0;
return checkMockLocationState() && periodMatched;
// return checkMockLocationState();
}
})
.map(new Function<Long, Long>() {
@Override
public Long apply(@NonNull Long aLong) throws Exception {
return mProgressIndex++;
}
})
.takeWhile(new Predicate<Long>() {
@Override
public boolean test(Long aLong) throws Exception {
return !mSkip && taskInfoData != null && aLong < taskInfoData.mockGPSItems.size();
}
})
.observeOn(AndroidSchedulers.mainThread())
.map(new Function<Long, Location>() {
private Location mLastLocation;
@Override
public Location apply(Long aLong) throws Exception {
MockGPSTaskData.MockGPSItem mockGPSItem = taskInfoData.mockGPSItems.get(aLong.intValue());
// 轨迹模拟
Location location = new Location(LocationManager.GPS_PROVIDER);
location.setLatitude(mockGPSItem.lat);
location.setLongitude(mockGPSItem.lng);
location.setAccuracy(mockGPSItem.accuracy.floatValue());
location.setSpeed(mockGPSItem.speed.floatValue());
location.setBearing(mockGPSItem.bearing);
LogUtils.v(TAG, "⚠️模拟定位:" + location + " index: " + aLong + " TaskInfoData: " + taskInfoData);
float calculateLineDistance = (location == null || mLastLocation == null) ? -1 : AMapUtils.calculateLineDistance(new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude()), new LatLng(location.getLatitude(), location.getLongitude()));
if (calculateLineDistance < 0) {
LogUtils.v(TAG, "⚠️模拟定位:" + location + " index: " + aLong + " TaskInfoData: " + taskInfoData);
} else if (calculateLineDistance > 100) {
LogUtils.w(TAG, "⚠️模拟定位: 跳动距离:" + calculateLineDistance + " " + location + " index: " + aLong + " TaskInfoData: " + taskInfoData);
} else {
LogUtils.v(TAG, "⚠️模拟定位: 跳动距离:" + calculateLineDistance + " " + location + " index: " + aLong + " TaskInfoData: " + taskInfoData);
}
mLastLocation = location;
//GpsMockManager.getInstance().mockLocationWithNotify(location);
return location;
}
})
.doOnError(new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
LogUtils.d(TAG, "mock 子任务异常 " + taskInfoData + " " + throwable + "]");
}
});
}
/**
* 根据高德导航的轨迹数据进行轨迹模拟
*
* @param naviRouteInfo
* @return
*/
@Nullable
public static Observable<Location> startGpsMockTask(@Nullable AMapNaviPath naviRouteInfo) {
if (naviRouteInfo != null && naviRouteInfo.getCoordList() != null) {
MockGPSTaskData mockGPSTaskData = new MockGPSTaskData();
mockGPSTaskData.mockGPSItems = new ArrayList();
Iterator cordListIt = naviRouteInfo.getCoordList().iterator();
while (cordListIt.hasNext()) {
NaviLatLng latLng = (NaviLatLng) cordListIt.next();
MockGPSTaskData.MockGPSItem mockGPSItem = new MockGPSTaskData.MockGPSItem();
mockGPSTaskData.mockGPSItems.add(mockGPSItem.setLat(latLng.getLatitude()).setLng(latLng.getLongitude()).setTime(System.currentTimeMillis()).setAccuracy(10.0F).setBearing(0L).setSpeed(15.0D));
}
MockGPSTaskData.modifyBearing(mockGPSTaskData.mockGPSItems);
MockGPSTaskManager mockGPSTaskManager = new MockGPSTaskManager(mockGPSTaskData);
if (sMockGPSTaskManager != null) {
sMockGPSTaskManager.setSkip(true);
}
sMockGPSTaskManager = mockGPSTaskManager;
return mockGPSTaskManager.startGpsMockTask();
} else {
return null;
}
}
/**
* 暂停当前任务
*/
public void pause() {
mPause = true;
}
/**
* 恢复执行当前任务
*/
public void resume() {
mPause = false;
}
/**
* 跳过当前任务
*
* @param skip
* @return
*/
public MockGPSTaskManager setSkip(boolean skip) {
this.mSkip = skip;
return this;
}
/**
* 获取时间间隔等级
*
* @return
*/
public static int getPeriodLevel() {
return mPeriodLevel;
}
/**
* 时间间隔等级
* 1 --- PERIOD_UNIT * 1 = 50
* 10 --- PERIOD_UNIT * 10 = 500
* 20 --- PERIOD_UNIT * 20 = 1000
*/
public static void setPeriodLevel(int periodLevel) {
if (periodLevel < 1) {
mPeriodLevel = 1;
} else {
mPeriodLevel = periodLevel;
}
LogUtils.v(TAG, "setPeriodLevel() called with: periodLevel = [" + mPeriodLevel + "]");
}
public boolean checkMockLocationState() {
// return !mPause && mState > 5;
return !mPause;
}
public Long getSeekProgress() {
return mProgressIndex;
}
public MockGPSTaskManager seekProgress(Long progress) {
if (progress < 0) {
mProgressIndex = 0L;
} else if (progress > mProgressIndexMax) {
this.mProgressIndex = mProgressIndexMax;
} else {
this.mProgressIndex = progress;
}
return this;
}
public boolean completed() {
return mProgressIndex >= mProgressIndexMax;
}
}
================================================
FILE: Android/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dist="http://schemas.android.com/apk/distribution"
xmlns:tools="http://schemas.android.com/tools"
package="com.didichuxing.doraemondemo">
<dist:module dist:instant="true" />
<uses-permission
android:name="android.permission.READ_FRAME_BUFFER"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.INTERNET" /> <!-- tencent Android Q新增权限,允许应用在后台发起定位,如应用target为Q,请添加此权限 -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <!-- tencent 如果设置了target >= 28 如果需要启动后台定位则必须声明这个权限 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- 用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 用于获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 用于读取手机当前的状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 用于写入缓存数据到扩展存储卡 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 用于申请调用A-GPS模块 -->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<application
android:name=".App"
android:allowBackup="false"
android:icon="@mipmap/dk_app_icon"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_config"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
<activity
android:name=".MainDoKitActivity"
android:theme="@style/NoTitleTheme"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".mc.NetMainActivity"
android:exported="false" />
<activity android:name=".WebViewSystemActivity" />
<activity android:name=".WebViewX5Activity" />
<activity android:name=".EmptyActivity" />
<activity android:name=".module.bigbitmap.BigBitmapActivity" />
<activity android:name=".module.leak.LeakActivity" />
<activity android:name=".mc.MCActivity" />
<activity android:name="com.amap.api.navi.AmapRouteActivity" />
<activity
android:name=".comm.CommFragmentActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
<!-- 高德定位服务 -->
<service android:name="com.amap.api.location.APSService" />
<!-- 百度地图定位服务 -->
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" />
<!-- Dokit targetApi为 29 Android Q时截屏的前台服务 -->
<service
android:name=".test.ScreenRecordingService"
android:enabled="true"
android:foregroundServiceType="mediaProjection" />
</application>
</manifest>
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/AopTest.java
================================================
package com.didichuxing.doraemondemo;
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2020/4/22-11:38
* 描 述:
* 修订历史:
* ================================================
*/
public class AopTest {
public void getDoKit() {
// OkHttpHook.addDoKitIntercept(this);
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/BaseStatusBarActivity.java
================================================
package com.didichuxing.doraemondemo;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
/**
* didi Create on 2022/5/25 .
* <p>
* Copyright (c) 2022/5/25 by didiglobal.com.
*
* @author <a href="realonlyone@126.com">zhangjun</a>
* @version 1.0
* @Date 2022/5/25 5:55 下午
* @Description 用一句话说明文件功能
*/
public class BaseStatusBarActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
preUpdateStatusBar(this);
}
private void preUpdateStatusBar(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
activity.getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimary));
}
}
private void setLightStatusBar() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
}
private void setNotLightStatusBar() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN );
}
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/DataBaseActivity.kt
================================================
package com.didichuxing.doraemondemo
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.blankj.utilcode.util.ToastUtils
import com.didichuxing.doraemondemo.db.PersonDBHelper
import kotlinx.coroutines.*
class DataBaseActivity : AppCompatActivity() {
companion object {
val TAG = "SecondActivity"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
findViewById<View>(R.id.tv).setOnClickListener {
// Create Person encrypted database
CoroutineScope(Dispatchers.Main).launch {
val job = async(Dispatchers.IO) { insertPersonDB() }
val success = job.await()
ToastUtils.showShort("插入数据成功")
}
ToastUtils.showShort("开始插入数据")
}
}
/**
* 只非ui编程中执行操作
*/
private fun insertPersonDB(): Boolean {
val personDBHelper = PersonDBHelper(applicationContext)
if (personDBHelper.count() == 0) {
for (i in 0..99) {
val firstName = "${PersonDBHelper.PERSON_COLUMN_FIRST_NAME}_$i"
val lastName = "${PersonDBHelper.PERSON_COLUMN_LAST_NAME}_$i"
val address = "${PersonDBHelper.PERSON_COLUMN_ADDRESS}_$i"
personDBHelper.insertPerson(firstName, lastName, address)
}
}
return true
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/EmptyActivity.kt
================================================
package com.didichuxing.doraemondemo
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.blankj.utilcode.util.ToastUtils
import com.didichuxing.doraemondemo.db.PersonDBHelper
import kotlinx.coroutines.*
class EmptyActivity : AppCompatActivity() {
companion object {
val TAG = "EmptyActivity"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_empty)
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/MainDoKitActivity.kt
================================================
package com.didichuxing.doraemondemo
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.ViewGroup
import androidx.core.view.children
import com.didichuxing.doraemondemo.mc.MCActivity
import com.didichuxing.doraemondemo.module.CrashTest
import com.didichuxing.doraemondemo.module.DoKitItemView
import com.didichuxing.doraemondemo.module.MethodCostTest
import com.didichuxing.doraemondemo.module.bigbitmap.BigBitmapActivity
import com.didichuxing.doraemondemo.module.db.DataBaseTest
import com.didichuxing.doraemondemo.module.http.FileUploadTest
import com.didichuxing.doraemondemo.module.http.OkHttpMock
import com.didichuxing.doraemondemo.module.http.RetrofitMock
import com.didichuxing.doraemondemo.module.http.URLConnectionMock
import com.didichuxing.doraemondemo.module.leak.LeakActivity
import com.didichuxing.doraemondemo.old.MainDebugActivityOkhttpV3
import com.didichuxing.doraemonkit.DoKit
import com.didichuxing.doraemonkit.util.ToastUtils
/**
* didi Create on 2022/5/25 .
*
* Copyright (c) 2022/5/25 by didiglobal.com.
*
* @author <a href="realonlyone@126.com">zhangjun</a>
* @version 1.0
* @Date 2022/5/25 6:05 下午
* @Description 用一句话说明文件功能
*/
class MainDoKitActivity : BaseStatusBarActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_dokit_main)
val all: ViewGroup = findViewById<ViewGroup>(R.id.all)
all.children.forEach {
if (it is DoKitItemView) {
val item = it as DoKitItemView
item.setOnClickListener {
onItemClick(item, item.itemText)
}
}
}
}
private fun onItemClick(itemView: DoKitItemView, text: String) {
Log.i("TEST", "onItemClick :$text")
when (text) {
//工具入口
"显示/隐藏快捷入口" -> {
showHideDoKit();
}
"打开工具窗口" -> {
DoKit.showToolPanel()
}
//平台工具
"数据Mock测试" -> {
startActivity(Intent(this, EmptyActivity::class.java))
}
"OkHttp 模拟请求" -> {
OkHttpMock.test()
}
"UrlConnection 模拟请求" -> {
URLConnectionMock.get("https://wanandroid.com/user_article/list/0/json")
}
"retrofit 模拟请求" -> {
RetrofitMock.test()
}
"一机多控测试" -> {
startActivity(Intent(this, MCActivity::class.java))
}
"自动化测试" -> {
startActivity(Intent(this, MCActivity::class.java))
}
//常用工具
"日志测试" -> {
startActivity(Intent(this, EmptyActivity::class.java))
}
"跳转其他Activity" -> {
startActivity(Intent(this, EmptyActivity::class.java))
}
"系统:WebView" -> {
startActivity(Intent(this, WebViewSystemActivity::class.java))
}
"X5:WebView" -> {
startActivity(Intent(this, WebViewX5Activity::class.java))
}
//LBS
"位置模拟" -> {
startActivity(Intent(this, EmptyActivity::class.java))
}
"路径模拟" -> {
startActivity(Intent(this, EmptyActivity::class.java))
}
//性能工具
"模拟内存泄漏" -> {
startActivity(Intent(this, LeakActivity::class.java))
}
"模拟耗时函数调用" -> {
MethodCostTest.test()
}
"崩溃模拟" -> {
CrashTest.test()
}
"创建数据库" -> {
DataBaseTest.test()
}
"文件上传模拟" -> {
FileUploadTest.requestByFile(getActivity(), filesDir, true)
}
"文件下载模拟" -> {
FileUploadTest.requestByFile(getActivity(), filesDir, false)
}
"大图检测模拟" -> {
startActivity(Intent(this, BigBitmapActivity::class.java))
}
//视觉工具
"取色器测试" -> {
startActivity(Intent(this, EmptyActivity::class.java))
}
"标尺对齐测试" -> {
startActivity(Intent(this, EmptyActivity::class.java))
}
//其他工具
"旧版页面入口" -> {
startActivity(Intent(this, MainDebugActivityOkhttpV3::class.java))
}
else -> {
ToastUtils.showShort("$text")
}
}
}
private fun getActivity(): Activity {
return this
}
private fun showHideDoKit() {
if (DoKit.isMainIconShow) {
DoKit.hide()
} else {
DoKit.show()
}
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/WebViewSystemActivity.kt
================================================
package com.didichuxing.doraemondemo
import android.annotation.SuppressLint
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.webkit.*
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
/**
* Created by jintai on 2018/11/13.
*/
class WebViewSystemActivity : AppCompatActivity() {
val TAG = "WebViewActivity"
lateinit var mWebView: WebView
val url = "https://xingyun.xiaojukeji.com/docs/dokit"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_normal_webview)
mWebView = findViewById<WebView>(R.id.normal_web_view)
initWebView(mWebView)
mWebView.loadUrl(url)
}
@SuppressLint("JavascriptInterface")
private fun initWebView(webView: WebView) {
val webSettings: WebSettings = webView.settings
webSettings.pluginState = WebSettings.PluginState.ON
webSettings.javaScriptEnabled = true
webSettings.allowFileAccess = false
webSettings.loadsImagesAutomatically = true
webSettings.useWideViewPort = true
webSettings.builtInZoomControls = false
webSettings.defaultTextEncodingName = "UTF-8"
webSettings.domStorageEnabled = true
webSettings.cacheMode = WebSettings.LOAD_DEFAULT
webSettings.javaScriptCanOpenWindowsAutomatically = false
webSettings.allowFileAccessFromFileURLs = true
webSettings.allowUniversalAccessFromFileURLs = true
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {
webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webSettings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1 && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
webView.removeJavascriptInterface("searchBoxJavaBridge_")
webView.removeJavascriptInterface("accessibilityTraversal")
webView.removeJavascriptInterface("accessibility")
}
webView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
view.loadUrl(url)
return true
}
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
override fun shouldInterceptRequest(
view: WebView?,
request: WebResourceRequest?
): WebResourceResponse? {
return super.shouldInterceptRequest(view, request)
}
}
webView.webChromeClient = object : WebChromeClient() {
override fun onConsoleMessage(consoleMessage: ConsoleMessage?): Boolean {
val message = consoleMessage!!.message()
val lineNumber = consoleMessage.lineNumber()
val sourceID = consoleMessage.sourceId()
val messageLevel = consoleMessage.message()
Log.i(
TAG, String.format(
"[%s] sourceID: %s lineNumber: %n message: %s",
messageLevel, sourceID, lineNumber, message
)
)
//Log.i(TAG, "consoleMessage===>${consoleMessage?.message()}")
return super.onConsoleMessage(consoleMessage)
}
}
}
override fun onBackPressed() {
if (mWebView.canGoBack()) {
mWebView.goBack()
} else {
super.onBackPressed()
}
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/WebViewX5Activity.kt
================================================
package com.didichuxing.doraemondemo
import android.annotation.SuppressLint
import android.os.Build
import android.os.Bundle
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import com.didichuxing.doraemonkit.util.LogHelper
import com.tencent.smtt.export.external.interfaces.ConsoleMessage
import com.tencent.smtt.export.external.interfaces.WebResourceRequest
import com.tencent.smtt.export.external.interfaces.WebResourceResponse
import com.tencent.smtt.sdk.WebChromeClient
import com.tencent.smtt.sdk.WebSettings
import com.tencent.smtt.sdk.WebView
import com.tencent.smtt.sdk.WebViewClient
/**
* Created by jintai on 2018/11/13.
*/
class WebViewX5Activity : AppCompatActivity() {
val TAG = "WebViewActivity"
lateinit var mWebView: WebView
val url = "https://xingyun.xiaojukeji.com/docs/dokit"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_x5_webview)
mWebView = findViewById<WebView>(R.id.x5_web_view)
initWebView(mWebView)
mWebView.loadUrl(url)
}
@SuppressLint("JavascriptInterface")
private fun initWebView(webView: WebView) {
val webSettings: WebSettings = webView.settings
webSettings.pluginState = WebSettings.PluginState.ON
webSettings.javaScriptEnabled = true
webSettings.allowFileAccess = false
webSettings.loadsImagesAutomatically = true
webSettings.useWideViewPort = true
webSettings.builtInZoomControls = false
webSettings.defaultTextEncodingName = "UTF-8"
webSettings.domStorageEnabled = true
webSettings.cacheMode = WebSettings.LOAD_DEFAULT
webSettings.javaScriptCanOpenWindowsAutomatically = false
webSettings.setAllowFileAccessFromFileURLs(true)
webSettings.setAllowUniversalAccessFromFileURLs(true)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {
webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true)
}
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1 && Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
webView.removeJavascriptInterface("searchBoxJavaBridge_")
webView.removeJavascriptInterface("accessibilityTraversal")
webView.removeJavascriptInterface("accessibility")
}
webView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
view.loadUrl(url)
return true
}
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
override fun shouldInterceptRequest(
view: WebView?,
request: WebResourceRequest?
): WebResourceResponse? {
return super.shouldInterceptRequest(view, request)
}
}
webView.webChromeClient = object : WebChromeClient() {
override fun onConsoleMessage(consoleMessage: ConsoleMessage?): Boolean {
LogHelper.i(TAG, "consoleMessage===>${consoleMessage?.message()}")
return super.onConsoleMessage(consoleMessage)
}
}
}
override fun onBackPressed() {
if (mWebView.canGoBack()) {
mWebView.goBack()
} else {
super.onBackPressed()
}
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/amap/AMapRouterFragment.kt
================================================
package com.didichuxing.doraemondemo.amap
import android.os.Bundle
import android.view.View
import android.widget.TextView
import com.amap.api.maps.AMap
import com.amap.api.maps.MapView
import com.amap.api.maps.model.LatLng
import com.amap.api.maps.model.MyLocationStyle
import com.amap.api.maps.model.Poi
import com.amap.api.navi.*
import com.amap.api.navi.enums.PathPlanningStrategy
import com.amap.api.navi.model.AMapNaviLocation
import com.amap.api.navi.model.NaviLatLng
import com.didichuxing.doraemondemo.R
import com.didichuxing.doraemondemo.comm.CommBaseFragment
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:3/11/21-14:51
* 描 述:
* 修订历史:
* ================================================
*/
class AMapRouterFragment : CommBaseFragment() {
private var mDefaultNaviListener: DefaultNaviListener? = null
private lateinit var mAmap: AMap
private lateinit var mapView: MapView
private lateinit var mAMapNavi: AMapNavi
private val mStartPoint = NaviLatLng(30.29659, 120.081127)
private val mEndPoint = NaviLatLng(30.296793, 121.07527)
override fun initActivityTitle(): String {
return "高德路径规划"
}
override fun getLayoutId(): Int {
return R.layout.fragment_amap
}
override fun initView(savedInstanceState: Bundle?) {
mapView = findViewById(R.id.amap_view)
mapView.onCreate(savedInstanceState)
mAmap = mapView.map
val startNavi = findViewById<TextView>(R.id.tv_start)
startNavi.setOnClickListener {
val params =
AmapNaviParams(
Poi("西溪谷", LatLng(mStartPoint.latitude, mStartPoint.longitude), ""),
null,
Poi("管理学院创新大楼", LatLng(mEndPoint.latitude, mEndPoint.longitude), ""),
AmapNaviType.DRIVER
)
params.setUseInnerVoice(true)
AmapNaviPage.getInstance().showRouteActivity(activity, params, object :
INaviInfoCallback {
override fun onInitNaviFailure() {
}
override fun onGetNavigationText(p0: String?) {
}
override fun onLocationChange(p0: AMapNaviLocation?) {
}
override fun onArriveDestination(p0: Boolean) {
}
override fun onStartNavi(p0: Int) {
}
override fun onCalculateRouteSuccess(p0: IntArray?) {
}
override fun onCalculateRouteFailure(p0: Int) {
}
override fun onStopSpeaking() {
}
override fun onReCalculateRoute(p0: Int) {
}
override fun onExitPage(p0: Int) {
}
override fun onStrategyChanged(p0: Int) {
}
override fun onArrivedWayPoint(p0: Int) {
}
override fun onMapTypeChanged(p0: Int) {
}
override fun onNaviDirectionChanged(p0: Int) {
}
override fun onDayAndNightModeChanged(p0: Int) {
}
override fun onBroadcastModeChanged(p0: Int) {
}
override fun onScaleAutoChanged(p0: Boolean) {
}
override fun getCustomMiddleView(): View? {
return null
}
override fun getCustomNaviView(): View? {
return null
}
override fun getCustomNaviBottomView(): View? {
return null
}
})
}
initAMapLocation()
}
/**
* 初始化高德地图的定位
*/
private fun initAMapLocation() {
mAmap.minZoomLevel = 10.0f
//初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
val myLocationStyle = MyLocationStyle()
//设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒
myLocationStyle.interval(1000L)
// myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER)
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW)
myLocationStyle.myLocationIcon(
com.amap.api.maps.model.BitmapDescriptorFactory.fromResource(
R.mipmap.ic_navi_map_gps_locked
)
)
////设置是否显示定位小蓝点,用于满足只想使用定位,不想使用定位小蓝点的场景,设置false以后图面上不再有定位蓝点的概念,但是会持续回调位置信息。
myLocationStyle.showMyLocation(true)
mAmap.myLocationStyle = myLocationStyle //设置定位蓝点的Style
//aMap.getUiSettings().setMyLocationButtonEnabled(true);设置默认定位按钮是否显示,非必需设置。
// 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。
mAmap.isMyLocationEnabled = true
//规划路径
mAMapNavi = AMapNavi.getInstance(activity?.application)
val startList = mutableListOf<NaviLatLng>()
startList.add(mStartPoint)
val endList = mutableListOf<NaviLatLng>()
endList.add(mEndPoint)
mAMapNavi.calculateDriveRoute(
startList,
endList,
null,
PathPlanningStrategy.DRIVING_MULTIPLE_ROUTES_DEFAULT
)
mAMapNavi.addAMapNaviListener(activity?.application?.let {
mDefaultNaviListener = DefaultNaviListener(mAmap, mAMapNavi, it)
mDefaultNaviListener
})
}
override fun onResume() {
super.onResume()
mapView.onResume()
}
override fun onPause() {
super.onPause()
mapView.onPause()
}
override fun onDestroy() {
super.onDestroy()
mDefaultNaviListener?.onDestroy()
mapView.onDestroy()
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
mapView.onSaveInstanceState(outState)
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/amap/DefaultNaviListener.kt
================================================
package com.didichuxing.doraemondemo.amap
import android.content.Context
import android.util.Log
import com.amap.api.maps.AMap
import com.amap.api.maps.AMapUtils
import com.amap.api.maps.model.LatLng
import com.amap.api.navi.AMapNavi
import com.amap.api.navi.AMapNaviListener
import com.amap.api.navi.enums.NaviType
import com.amap.api.navi.model.*
import io.reactivex.disposables.Disposable
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2/25/21-20:00
* 描 述:
* 修订历史:
* ================================================
*/
class DefaultNaviListener(val mAMap: AMap, val mAMapNavi: AMapNavi, val context: Context) :
AMapNaviListener {
// private var mNaviRouteOverlay: NaviRouteOverlay? = null
//
// init {
// mNaviRouteOverlay = NaviRouteOverlay(mAMap, null)
// }
private var disp: Disposable? = null
private var mNaviLocation: AMapNaviLocation? = null
companion object {
const val TAG = "DefaultNaviListener"
}
override fun onInitNaviFailure() {
}
override fun onInitNaviSuccess() {
}
override fun onStartNavi(p0: Int) {
}
override fun onTrafficStatusUpdate() {
}
/**
* 改变位置时自动回调
*/
override fun onLocationChange(location: AMapNaviLocation?) {
val calculateLineDistance: Float = if (mNaviLocation == null || location == null) -1f else
AMapUtils.calculateLineDistance(
LatLng(mNaviLocation!!.coord.latitude, mNaviLocation!!.coord.longitude),
LatLng(location.coord.latitude, location.coord.longitude)
)
if (calculateLineDistance < 0) {
Log.v(TAG, "⚠️高德定位:" + location.getString())
} else if (calculateLineDistance > 50) {
Log.w(TAG, "⚠️高德定位:跳动距离:" + calculateLineDistance + " " + location.getString())
} else {
Log.v(TAG, "⚠️高德定位:跳动距离:" + calculateLineDistance + " " + location.getString())
}
mNaviLocation = location
}
private fun AMapNaviLocation?.getString(): String {
return if (this != null) "lat,lng:${coord?.latitude},:${coord?.longitude}, 精度:$accuracy, 速度:$speed, 方向:$bearing, 海拔:$altitude, 时间:$time"
else "null"
}
override fun onGetNavigationText(p0: Int, p1: String?) {
}
override fun onGetNavigationText(p0: String?) {
}
override fun onEndEmulatorNavi() {
}
override fun onArriveDestination() {
}
override fun onCalculateRouteFailure(p0: Int) {
}
override fun onCalculateRouteFailure(p0: AMapCalcRouteResult?) {
}
override fun onReCalculateRouteForYaw() {
}
override fun onReCalculateRouteForTrafficJam() {
}
override fun onArrivedWayPoint(p0: Int) {
}
override fun onGpsOpenStatus(p0: Boolean) {
}
override fun onNaviInfoUpdate(p0: NaviInfo?) {
}
override fun updateCameraInfo(p0: Array<out AMapNaviCameraInfo>?) {
}
override fun updateIntervalCameraInfo(
p0: AMapNaviCameraInfo?,
p1: AMapNaviCameraInfo?,
p2: Int
) {
}
override fun onServiceAreaUpdate(p0: Array<out AMapServiceAreaInfo>?) {
}
override fun showCross(p0: AMapNaviCross?) {
}
override fun hideCross() {
}
override fun showModeCross(p0: AMapModelCross?) {
}
override fun hideModeCross() {
}
override fun showLaneInfo(p0: Array<out AMapLaneInfo>?, p1: ByteArray?, p2: ByteArray?) {
}
override fun showLaneInfo(p0: AMapLaneInfo?) {
}
override fun hideLaneInfo() {
}
override fun onCalculateRouteSuccess(p0: IntArray?) {
}
/**
* 线路规划成功
*/
override fun onCalculateRouteSuccess(result: AMapCalcRouteResult?) {
// LogHelper.i(TAG, "mAMapNavi.naviPath.coordList===>${mAMapNavi.naviPath.coordList.size}")
// RouterManager.mCoordList = mAMapNavi.naviPath.coordList
val naviRouteOverlay = NaviRouteOverlay(mAMap, mAMapNavi.naviPath, context)
naviRouteOverlay.setShowDefaultLineArrow(true)
naviRouteOverlay.addToMap()
// naviRouteOverlay.removeFromMap()
mAMapNavi.setEmulatorNaviSpeed(10)
/**
* CRUISE
巡航模式(数值:3)
EMULATOR
模拟导航(数值:2)
GPS
实时导航(数值:1)
NONE
未开始导航(数值:-1)
*/
mAMapNavi.startNavi(NaviType.GPS)
// disp = MockGPSTaskManager.startGpsMockTask(mAMapNavi.naviPath)?.subscribe()
}
override fun notifyParallelRoad(p0: Int) {
}
override fun OnUpdateTrafficFacility(p0: Array<out AMapNaviTrafficFacilityInfo>?) {
}
override fun OnUpdateTrafficFacility(p0: AMapNaviTrafficFacilityInfo?) {
}
override fun updateAimlessModeStatistics(p0: AimLessModeStat?) {
}
override fun updateAimlessModeCongestionInfo(p0: AimLessModeCongestionInfo?) {
}
override fun onPlayRing(p0: Int) {
}
override fun onNaviRouteNotify(p0: AMapNaviRouteNotifyData?) {
}
override fun onGpsSignalWeak(p0: Boolean) {
}
fun onDestroy() {
if (disp != null && !disp!!.isDisposed()) {
disp!!.dispose()
}
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/amap/NaviRouteOverlay.kt
================================================
package com.didichuxing.doraemondemo.amap
import android.content.Context
import android.graphics.BitmapFactory
import com.amap.api.maps.AMap
import com.amap.api.maps.model.BitmapDescriptorFactory
import com.amap.api.maps.model.LatLng
import com.amap.api.maps.model.Polyline
import com.amap.api.maps.model.PolylineOptions
import com.amap.api.navi.model.AMapNaviPath
import com.amap.api.navi.model.RouteOverlayOptions
import com.amap.api.navi.view.RouteOverLay
import com.blankj.utilcode.util.ConvertUtils
import com.blankj.utilcode.util.ReflectUtils
/**
* 地图上的导航路径
*
* @author vinda
* @since 2017/12/27
*/
class NaviRouteOverlay(
private val aMap: AMap,
aMapNaviPath: AMapNaviPath?,
val mContext: Context
) : RouteOverLay(
aMap, aMapNaviPath, mContext
) {
var routeId = 0
//显示默认路线箭头
private var showDefaultLineArrow = false
/**
* 非选中状态,使用比较浅的颜色,需要重新调用addToMap生效
*
* @param shadow
*/
private fun setupOptions(shadow: Boolean) {
val options: RouteOverlayOptions
if (shadow) {
options = customShadowRouteTexture()
//setZindex(ROUTE_SHADOW_Z_INDEX)
} else {
options = customRouteTexture()
//setZindex(ROUTE_NORMAL_Z_INDEX)
}
options.setOnRouteCameShow(false)
routeOverlayOptions = options
}
/**
* 设置是否显示默认路线(非路况)上的箭头,在调用addToMap之前调用
*/
fun setShowDefaultLineArrow(visible: Boolean) {
showDefaultLineArrow = visible
}
/**
* 复写父类方法
*/
override fun addToMap() {
super.addToMap()
//支持默认路线时显示箭头
if (showDefaultLineArrow) {
//显示箭头
addDefaultArrowLine()
}
}
/**
* 默认路线加入箭头
*/
private fun addDefaultArrowLine() {
//通过反射的方式向父类加入箭头路线
val path = ReflectUtils.reflect(this).field("mPathPoints").get<List<Any>>()
val lines = ReflectUtils.reflect(this).field("mCustomPolyLines").get<List<Any>>()
if (path != null && path is List<*> && lines != null && lines is List<*>) {
val mLatLngsOfPath = path as List<LatLng>
val mCustomPolylines = lines as MutableList<Polyline>
if (mLatLngsOfPath.isNotEmpty()) {
val arrowOnRoute = BitmapDescriptorFactory.fromBitmap(
routeOverlayOptions.arrowOnTrafficRoute
)
val mDefaultArrowline = this.aMap.addPolyline(
PolylineOptions().addAll(mLatLngsOfPath).setCustomTexture(arrowOnRoute).width(
width / 1.5f
)
)
mCustomPolylines.add(mDefaultArrowline)
}
}
}
private fun customShadowRouteTexture(): RouteOverlayOptions {
val routeOverlayOptions = RouteOverlayOptions()
var fis =
BitmapDescriptorFactory::class.java.getResourceAsStream("/assets/img/dk_custtexture_aolr.png")
val custtexture_aolr = BitmapFactory.decodeStream(fis)
fis =
BitmapDescriptorFactory::class.java.getResourceAsStream("/assets/img/dk_custtexture_b.png")
val custtexture = BitmapFactory.decodeStream(fis)
fis =
BitmapDescriptorFactory::class.java.getResourceAsStream("/assets/img/dk_custtexture_no_b.png")
val custtexture_no = BitmapFactory.decodeStream(fis)
fis =
BitmapDescriptorFactory::class.java.getResourceAsStream("/assets/img/dk_custtexture_green_b.png")
val custtexture_green = BitmapFactory.decodeStream(fis)
fis =
BitmapDescriptorFactory::class.java.getResourceAsStream("/assets/img/dk_custtexture_slow_b.png")
val custtexture_slow = BitmapFactory.decodeStream(fis)
fis =
BitmapDescriptorFactory::class.java.getResourceAsStream("/assets/img/dk_custtexture_bad_b.png")
val custtexture_bad = BitmapFactory.decodeStream(fis)
fis =
BitmapDescriptorFactory::class.java.getResourceAsStream("/assets/img/dk_custtexture_grayred_b.png")
val custtexture_grayred = BitmapFactory.decodeStream(fis)
routeOverlayOptions.arrowOnTrafficRoute = custtexture_aolr
routeOverlayOptions.normalRoute = custtexture
routeOverlayOptions.unknownTraffic = custtexture_no
routeOverlayOptions.smoothTraffic = custtexture_green
routeOverlayOptions.slowTraffic = custtexture_slow
routeOverlayOptions.jamTraffic = custtexture_bad
routeOverlayOptions.veryJamTraffic = custtexture_grayred
//设置导航线路的宽度, 单位:像素
routeOverlayOptions.lineWidth =
ConvertUtils.dp2px(LINE_WIDTH_DP.toFloat()).toFloat()
return routeOverlayOptions
}
companion object {
private const val LINE_WIDTH_DP = 14
fun customRouteTexture(): RouteOverlayOptions {
val routeOverlayOptions = RouteOverlayOptions()
var fis =
BitmapDescriptorFactory::class.java.getResourceAsStream("/assets/img/dk_custtexture_aolr.png")
val custtexture_aolr = BitmapFactory.decodeStream(fis)
fis =
BitmapDescriptorFactory::class.java.getResourceAsStream("/assets/img/dk_custtexture.png")
val custtexture = BitmapFactory.decodeStream(fis)
fis =
BitmapDescriptorFactory::class.java.getResourceAsStream("/assets/img/dk_custtexture_no.png")
val custtexture_no = BitmapFactory.decodeStream(fis)
fis =
BitmapDescriptorFactory::class.java.getResourceAsStream("/assets/img/dk_custtexture_green.png")
val custtexture_green = BitmapFactory.decodeStream(fis)
fis =
BitmapDescriptorFactory::class.java.getResourceAsStream("/assets/img/dk_custtexture_slow.png")
val custtexture_slow = BitmapFactory.decodeStream(fis)
fis =
BitmapDescriptorFactory::class.java.getResourceAsStream("/assets/img/dk_custtexture_bad.png")
val custtexture_bad = BitmapFactory.decodeStream(fis)
fis =
BitmapDescriptorFactory::class.java.getResourceAsStream("/assets/img/dk_custtexture_grayred.png")
val custtexture_grayred = BitmapFactory.decodeStream(fis)
routeOverlayOptions.arrowOnTrafficRoute = custtexture_aolr
routeOverlayOptions.normalRoute = custtexture
routeOverlayOptions.unknownTraffic = custtexture_no
routeOverlayOptions.smoothTraffic = custtexture_green
routeOverlayOptions.slowTraffic = custtexture_slow
routeOverlayOptions.jamTraffic = custtexture_bad
routeOverlayOptions.veryJamTraffic = custtexture_grayred
//设置导航线路的宽度, 单位:像素
routeOverlayOptions.lineWidth = ConvertUtils.dp2px(LINE_WIDTH_DP.toFloat()).toFloat()
return routeOverlayOptions
}
}
init {
setupOptions(false)
//不显示起点、终点
// setStartPointBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8))
// setEndPointBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8))
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/comm/CommBaseFragment.kt
================================================
package com.didichuxing.doraemondemo.comm
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.IdRes
import androidx.annotation.LayoutRes
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:3/11/21-16:14
* 描 述:
* 修订历史:
* ================================================
*/
abstract class CommBaseFragment : Fragment() {
private val viewModel: CommViewModel by activityViewModels()
private lateinit var mRootView: ViewGroup
abstract fun initActivityTitle(): String
@LayoutRes
abstract fun getLayoutId(): Int
private fun bindViewModel() {
viewModel.title = initActivityTitle()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
bindViewModel()
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
mRootView = inflater.inflate(getLayoutId(), container, false) as ViewGroup
return mRootView
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initView(savedInstanceState)
}
abstract fun initView(savedInstanceState: Bundle?)
fun <T : View> findViewById(@IdRes id: Int): T {
return mRootView.findViewById(id)
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/comm/CommFragmentActivity.kt
================================================
package com.didichuxing.doraemondemo.comm
import android.os.Bundle
import android.view.View
import android.view.Window
import android.widget.TextView
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.lifecycle.SavedStateViewModelFactory
import com.didichuxing.doraemondemo.R
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:3/11/21-15:14
* 描 述:
* 修订历史:
* ================================================
*/
class CommFragmentActivity : AppCompatActivity() {
var fragmentClass: Class<out CommBaseFragment>? = null
private val viewModel: CommViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_comm)
initTitleBar()
initFragment()
}
private fun initFragment() {
val bundle = intent.extras
bundle?.let {
if (bundle.get(CommLauncher.FRAGMENT_CLASS) != null) {
fragmentClass = bundle[CommLauncher.FRAGMENT_CLASS] as Class<out CommBaseFragment>?
fragmentClass?.let {
supportFragmentManager
.beginTransaction()
.add(R.id.container_view, it.newInstance())
.commit()
}
}
}
}
private fun initTitleBar() {
findViewById<View>(R.id.iv_back).setOnClickListener {
finish()
}
viewModel.getTitle().observe(this,
Observer<String> {
findViewById<TextView>(R.id.tv_title).text = it
})
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/comm/CommLauncher.kt
================================================
package com.didichuxing.doraemondemo.comm
import android.content.Context
import android.content.Intent
import android.os.Bundle
import com.didichuxing.doraemonkit.DoKit
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:3/11/21-17:40
* 描 述:
* 修订历史:
* ================================================
*/
object CommLauncher {
const val FRAGMENT_CLASS: String = "FRAGMENT_CLASS"
fun startActivity(
targetClass: Class<out CommBaseFragment?>,
context: Context,
bundle: Bundle? = null
) {
context?.startActivity(Intent(context, CommFragmentActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK
putExtra(FRAGMENT_CLASS, targetClass)
if (bundle != null) {
putExtras(bundle)
}
})
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/comm/CommViewModel.kt
================================================
package com.didichuxing.doraemondemo.comm
import androidx.lifecycle.*
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:3/11/21-16:12
* 描 述:
* 修订历史:
* ================================================
*/
class CommViewModel(private val state: SavedStateHandle) : ViewModel() {
companion object {
const val KEY_TITLE = "title"
}
var title: String?
get() {
return state.get(KEY_TITLE)
}
set(value) {
state.set(KEY_TITLE, value)
}
fun getTitle(): LiveData<String> {
return state.getLiveData<String>(KEY_TITLE, "DoKit")
}
fun saveTitle(title: String) {
state.set(KEY_TITLE, title)
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/db/DatabaseHelper.kt
================================================
package com.didichuxing.doraemondemo.db
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteDatabase.CursorFactory
import android.database.sqlite.SQLiteOpenHelper
import android.widget.Toast
/**
* Created by wanglikun on 2019/5/4
*/
class DatabaseHelper(private val mContext: Context, name: String?, factory: CursorFactory?, version: Int) : SQLiteOpenHelper(mContext, name, factory, version) {
override fun onCreate(db: SQLiteDatabase) {
db.execSQL(CREATE_BOOK)
db.execSQL(INSERT_BOOK)
Toast.makeText(mContext, "创建成功", Toast.LENGTH_SHORT).show()
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {}
companion object {
const val CREATE_BOOK = "create table Book (" +
"id integer primary key autoincrement, " +
"author text, " +
"price real, " +
"page integer, " +
"name text)"
const val INSERT_BOOK = "insert into Book (" +
"author," +
"price," +
"page," +
"name" + ")" +
"values (" +
"'jint'," +
"100," +
"1000," +
"'从入门到放弃')"
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/db/PersonDBHelper.java
================================================
/*
*
* * Copyright (C) 2019 Amit Shekhar
* * Copyright (C) 2011 Android Open Source Project
* *
* * 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.didichuxing.doraemondemo.db;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import com.tencent.wcdb.DatabaseUtils;
import com.tencent.wcdb.database.SQLiteDatabase;
import com.tencent.wcdb.database.SQLiteOpenHelper;
import java.util.ArrayList;
public class PersonDBHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "Person.db";
public static final String PERSON_TABLE_NAME = "person";
public static final String PERSON_COLUMN_ID = "id";
public static final String PERSON_COLUMN_FIRST_NAME = "first_name";
public static final String PERSON_COLUMN_LAST_NAME = "last_name";
public static final String PERSON_COLUMN_ADDRESS = "address";
private static final String DB_PASSWORD = "a_password";
public PersonDBHelper(Context context) {
super(context, DATABASE_NAME, DB_PASSWORD.getBytes(), null, 3, null);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(
"create table person " +
"(id integer primary key, first_name text, last_name text, address text)"
);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS person");
onCreate(db);
}
public boolean insertPerson(String firstName, String lastName, String address) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("first_name", firstName);
contentValues.put("last_name", lastName);
contentValues.put("address", address);
db.insert("person", null, contentValues);
db.close();
return true;
}
public Cursor getData(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor res = db.rawQuery("select * from person where id=" + id + "", null);
return res;
}
public int numberOfRows() {
SQLiteDatabase db = this.getReadableDatabase();
int numRows = (int) DatabaseUtils.queryNumEntries(db, PERSON_TABLE_NAME);
return numRows;
}
public boolean updatePerson(Integer id, String firstName, String lastName, String address, float mileage) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("first_name", firstName);
contentValues.put("last_name", lastName);
contentValues.put("address", address);
db.update("person", contentValues, "id = ? ", new String[]{Integer.toString(id)});
db.close();
return true;
}
public Integer deletePerson(Integer id) {
SQLiteDatabase db = this.getWritableDatabase();
return db.delete("person",
"id = ? ",
new String[]{Integer.toString(id)});
}
public ArrayList<String> getAllPerson() {
ArrayList<String> arrayList = new ArrayList<>();
SQLiteDatabase db = this.getReadableDatabase();
Cursor res = db.rawQuery("select * from person", null);
res.moveToFirst();
while (!res.isAfterLast()) {
arrayList.add(
res.getString(res.getColumnIndex(PERSON_COLUMN_FIRST_NAME)) + " " +
res.getString(res.getColumnIndex(PERSON_COLUMN_LAST_NAME)));
res.moveToNext();
}
res.close();
db.close();
return arrayList;
}
public int count() {
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery("select * from person", null);
try {
if (cursor != null && cursor.getCount() > 0) {
cursor.moveToFirst();
return cursor.getInt(0);
} else {
return 0;
}
} finally {
cursor.close();
db.close();
}
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/BorderDoKitView.java
================================================
//package com.didichuxing.doraemondemo.dokit;
//
//import android.content.Context;
//import android.view.LayoutInflater;
//import android.view.View;
//import android.widget.FrameLayout;
//
//import com.didichuxing.doraemonkit.R;
//import com.didichuxing.doraemonkit.kit.core.AbsDokitView;
//import com.didichuxing.doraemonkit.kit.core.DokitViewLayoutParams;
//import com.didichuxing.doraemonkit.kit.viewcheck.LayoutBorderView;
//import com.didichuxing.doraemonkit.model.ViewInfo;
//
///**
// * Created by jintai on 2019/09/26.
// * 在改布局上绘制相应的View
// */
//public class BorderDoKitView extends AbsDokitView {
// private LayoutBorderView mLayoutBorderView = null;
//
// @Override
// public void onCreate(Context context) {
//
// }
//
// @Override
// public void onDestroy() {
// super.onDestroy();
//
// }
//
// @Override
// public View onCreateView(Context context, FrameLayout view) {
// return LayoutInflater.from(context).inflate(R.layout.dk_float_view_check_draw, null);
// }
//
//
// @Override
// public void initDokitViewLayoutParams(DokitViewLayoutParams params) {
// params.flags = DokitViewLayoutParams.FLAG_NOT_FOCUSABLE_AND_NOT_TOUCHABLE;
// params.width = DokitViewLayoutParams.MATCH_PARENT;
// params.height = DokitViewLayoutParams.MATCH_PARENT;
// }
//
//
// @Override
// public void onViewCreated(FrameLayout view) {
// mLayoutBorderView = findViewById(R.id.rect_view);
// setDoKitViewNotResponseTouchEvent(getDoKitView());
// }
//
//
// /**
// * 解决ViewCheckDrawDokitView的margin被改变的bug
// */
// @Override
// public void onResume() {
// super.onResume();
// if (getNormalLayoutParams() != null) {
// FrameLayout.LayoutParams params = getNormalLayoutParams();
// params.setMargins(0, 0, 0, 0);
// params.width = FrameLayout.LayoutParams.MATCH_PARENT;
// params.height = FrameLayout.LayoutParams.MATCH_PARENT;
// immInvalidate();
// }
// }
//
// @Override
// public boolean canDrag() {
// return false;
// }
//
// public void showBorder(View target) {
// if (target == null) {
// mLayoutBorderView.showViewLayoutBorder((ViewInfo) null);
// } else {
// mLayoutBorderView.showViewLayoutBorder(new ViewInfo(target));
// }
// }
//
//}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/CustomDokitFragment.kt
================================================
package com.didichuxing.doraemondemo.dokit
import android.os.Bundle
import android.view.View
import android.widget.CompoundButton
import com.didichuxing.doraemondemo.R
import com.didichuxing.doraemonkit.DoKit
import com.didichuxing.doraemonkit.kit.core.AbsDoKitFragment
/**
* @Author: changzuozhen
* @Date: 2020-12-22
* 切换全屏与否只需要调整继承关系即可
* @see CustomDokitFragment
*
* @see TestSimpleDoKitFloatView
*
*
* 悬浮窗,支持折叠
*
* 启动工具函数
*
*
*
* 全屏页面
*
* @see com.didichuxing.doraemonkit.kit.core.AbsDoKitFragment
* 启动工具函数
*
*/
class CustomDokitFragment : AbsDoKitFragment() {
override fun onViewCreated(rootView: View?) {
super.onViewCreated(view)
ViewSetupHelper.setupButton(rootView, R.id.test1, "TestSimpleDokitFragment") { v: View? ->
val bundle = Bundle()
bundle.putString("test", "test")
DoKit.launchFullScreen(CustomDokitFragment::class.java, context, isSystemFragment = false)
}
// 隐藏
ViewSetupHelper.setupButton(rootView, R.id.test2, "") { v: View? -> }
ViewSetupHelper.setupToggleButton(
rootView,
R.id.tb_test1,
"TB",
false
) { buttonView: CompoundButton?, isChecked: Boolean -> }
// 隐藏
ViewSetupHelper.setupToggleButton(
rootView,
R.id.tb_test2,
"",
false
) { buttonView: CompoundButton?, isChecked: Boolean -> }
}
override fun layoutId(): Int {
return R.layout.layout_demo_custom
}
override fun initTitle(): String {
return "我是自定义页面"
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/DemoDoKitView.kt
================================================
package com.didichuxing.doraemondemo.dokit
import android.content.Context
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.widget.FrameLayout
import android.widget.TextView
import com.didichuxing.doraemondemo.R
import com.didichuxing.doraemonkit.DoKit
import com.didichuxing.doraemonkit.kit.core.AbsDoKitView
import com.didichuxing.doraemonkit.kit.core.DoKitViewLayoutParams
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2019-09-23-21:02
* 描 述:
* 修订历史:
* ================================================
*/
class DemoDoKitView : AbsDoKitView() {
override fun onCreate(context: Context) {}
override fun onCreateView(context: Context, rootView: FrameLayout): View {
return LayoutInflater.from(context).inflate(R.layout.dk_demo, rootView, false)
}
override fun onViewCreated(rootView: FrameLayout) {
val tvClose = findViewById<TextView>(R.id.tv_close)
tvClose?.setOnClickListener {
DoKit.removeFloating(DemoDoKitView::class)
}
}
override fun initDokitViewLayoutParams(params: DoKitViewLayoutParams) {
params.width = DoKitViewLayoutParams.WRAP_CONTENT
params.height = DoKitViewLayoutParams.WRAP_CONTENT
params.gravity = Gravity.TOP or Gravity.LEFT
params.x = 200
params.y = 200
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/DemoKit.kt
================================================
package com.didichuxing.doraemondemo.dokit
import android.app.Activity
import android.content.Context
import com.didichuxing.doraemondemo.R
import com.didichuxing.doraemonkit.DoKit
import com.didichuxing.doraemonkit.kit.AbstractKit
import com.didichuxing.doraemonkit.kit.Category
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2019-09-24-15:48
* 描 述:kit demo
* 修订历史:
* ================================================
*/
class DemoKit : AbstractKit() {
override val category: Int
get() = Category.BIZ
override val name: Int
get() = R.string.dk_kit_demo
override val icon: Int
get() = R.mipmap.dk_sys_info
override fun onClickWithReturn(activity: Activity): Boolean {
DoKit.launchFloating(DemoDoKitView::class.java)
return true
}
override fun onAppInit(context: Context?) {
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/SimpleDoKitView.java
================================================
package com.didichuxing.doraemondemo.dokit;
import android.content.Context;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.CompoundButton;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.Switch;
import android.widget.TextView;
import com.blankj.utilcode.util.ConvertUtils;
import com.didichuxing.doraemondemo.R;
import com.didichuxing.doraemonkit.DoKit;
import com.didichuxing.doraemonkit.kit.core.AbsDoKitView;
import com.didichuxing.doraemonkit.kit.core.DoKitViewLayoutParams;
/**
* @Author: changzuozhen
* @Date: 2020-12-22
* <p>
* 悬浮窗,支持折叠
* @see SimpleDoKitView
* 启动工具函数
*/
public abstract class SimpleDoKitView extends AbsDoKitView {
private static final String TAG = "SimpleBaseFloatPage";
int mWidth;
int mHeight;
int mDp50InPx;
private WindowManager mWindowManager;
private FrameLayout mFloatContainer;
private Switch mShowSwitch;
private Context mContext;
@Override
public void onEnterForeground() {
super.onEnterForeground();
getParentView().setVisibility(View.VISIBLE);
}
@Override
public void onEnterBackground() {
super.onEnterBackground();
getParentView().setVisibility(View.GONE);
}
public void showContainer(boolean isChecked) {
mFloatContainer.setVisibility(isChecked ? View.VISIBLE : View.GONE);
immInvalidate();
}
@Override
public void onCreate(Context context) {
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
mWindowManager.getDefaultDisplay().getMetrics(outMetrics);
mDp50InPx = ConvertUtils.dp2px(50);
mWidth = outMetrics.widthPixels - mDp50InPx;
mHeight = outMetrics.heightPixels - mDp50InPx;
}
@Override
public View onCreateView(Context context, FrameLayout rootView) {
mContext = context;
return LayoutInflater.from(context).inflate(R.layout.dk_layout_simple_dokit_float_view, rootView, false);
}
@Override
public void onViewCreated(FrameLayout rootView) {
mFloatContainer = findViewById(R.id.floatContainer);
LayoutInflater.from(mContext).inflate(getLayoutId(), mFloatContainer);
mShowSwitch = findViewById(R.id.showHideSwitch);
TextView title = findViewById(R.id.floatPageTitle);
ImageView close = findViewById(R.id.floatClose);
close.setOnClickListener(v -> DoKit.removeFloating(this));
title.setText(getTag());
mShowSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
showContainer(isChecked);
}
});
initView();
}
protected abstract int getLayoutId();
@Override
public void initDokitViewLayoutParams(DoKitViewLayoutParams params) {
params.width = DoKitViewLayoutParams.WRAP_CONTENT;
params.height = DoKitViewLayoutParams.WRAP_CONTENT;
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 200;
params.y = 200;
}
@Override
public boolean onBackPressed() {
mShowSwitch.setChecked(false);
return false;
}
@Override
public boolean shouldDealBackKey() {
return true;
}
protected void initView() {
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/TestSimpleDoKitFloatView.kt
================================================
package com.didichuxing.doraemondemo.dokit
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.CompoundButton
import android.widget.FrameLayout
import com.didichuxing.doraemondemo.R
import com.didichuxing.doraemonkit.DoKit
/**
* @Author: changzuozhen
* @Date: 2020-12-22
* 切换全屏与否只需要调整继承关系即可
* @see CustomDokitFragment
* @see TestSimpleDoKitFloatView
*
* 悬浮窗,支持折叠
* @see com.didichuxing.doraemonkit.kit.core.SimpleDokitView
* 启动工具函数
*
* 全屏页面
* @see com.didichuxing.doraemonkit.kit.core.AbsDoKitFragment
* 启动工具函数
*
*/
class TestSimpleDoKitFloatView : SimpleDoKitView() {
override fun getLayoutId(): Int {
return R.layout.layout_demo_custom
}
override fun onViewCreated(rootView: FrameLayout?) {
super.onViewCreated(rootView)
ViewSetupHelper.setupButton(rootView, R.id.test1, "TestSimpleDokitFragment", View.OnClickListener {
val bundle = Bundle()
bundle.putString("test", "test")
DoKit.launchFullScreen(CustomDokitFragment::class.java, context)
})
// 隐藏
ViewSetupHelper.setupButton(rootView, R.id.test2, "", null)
ViewSetupHelper.setupToggleButton(rootView, R.id.tb_test1, "TB", false, CompoundButton.OnCheckedChangeListener { buttonView, isChecked -> Log.d("TEST", "TB $isChecked") })
// 隐藏
ViewSetupHelper.setupToggleButton(rootView, R.id.tb_test2, "", false, null)
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/TestSimpleDokitFloatViewKit.kt
================================================
package com.didichuxing.doraemondemo.dokit
import android.app.Activity
import android.content.Context
import com.didichuxing.doraemondemo.R
import com.didichuxing.doraemonkit.DoKit
import com.didichuxing.doraemonkit.kit.AbstractKit
import com.didichuxing.doraemonkit.kit.Category
/**
* @Author: changzuozhen
* @Date: 2020-12-22
*/
class TestSimpleDokitFloatViewKit : AbstractKit() {
override val category: Int
get() = Category.BIZ
override val name: Int
get() = R.string.dk_kit_simple_float
override val icon: Int
get() = R.mipmap.dk_sys_info
override fun onClick(context: Context?) {
}
override fun onClickWithReturn(activity: Activity): Boolean {
DoKit.launchFloating(TestSimpleDoKitFloatView::class.java)
return true
}
override fun onAppInit(context: Context?) {
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/TestSimpleDokitFragmentKit.kt
================================================
package com.didichuxing.doraemondemo.dokit
import android.app.Activity
import android.content.Context
import android.os.Bundle
import com.didichuxing.doraemondemo.R
import com.didichuxing.doraemonkit.DoKit
import com.didichuxing.doraemonkit.kit.AbstractKit
import com.didichuxing.doraemonkit.kit.Category
/**
* @Author: changzuozhen
* @Date: 2020-12-22
*/
class TestSimpleDokitFragmentKit : AbstractKit() {
override val category: Int
get() = Category.BIZ
override val name: Int
get() = R.string.dk_kit_fullscreen
override val icon: Int
get() = R.mipmap.dk_sys_info
override fun onClickWithReturn(activity: Activity): Boolean {
val bundle = Bundle()
bundle.putString("test", "test")
DoKit.launchFullScreen(CustomDokitFragment::class, activity, bundle)
return true
}
override fun onAppInit(context: Context?) {
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/ViewSetupHelper.java
================================================
package com.didichuxing.doraemondemo.dokit;
import android.text.TextUtils;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.ToggleButton;
public final class ViewSetupHelper {
private ViewSetupHelper() {
}
public static void setupButton(View container, int viewId, String title, View.OnClickListener onBtnClick) {
TextView button = (TextView) container.findViewById(viewId);
if (TextUtils.isEmpty(title)) {
button.setVisibility(View.GONE);
} else {
button.setText(title);
button.setVisibility(View.VISIBLE);
button.setOnClickListener(onBtnClick);
}
}
public static void setVisible(View container, int viewId, boolean visible) {
container.findViewById(viewId).setVisibility(visible ? View.VISIBLE : View.GONE);
}
public static void setupToggleButton(View container, int viewId, String title, boolean checked, CompoundButton.OnCheckedChangeListener onCheckedChangeListener) {
ToggleButton toggleButton = (ToggleButton) container.findViewById(viewId);
if (TextUtils.isEmpty(title)) {
toggleButton.setVisibility(View.GONE);
} else {
toggleButton.setVisibility(View.VISIBLE);
toggleButton.setTextOn(title + " ON");
toggleButton.setTextOff(title + " OFF");
toggleButton.setChecked(checked);
toggleButton.setOnCheckedChangeListener(onCheckedChangeListener);
onCheckedChangeListener.onCheckedChanged(toggleButton, checked);
}
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/DoKitButton.kt
================================================
package com.didichuxing.doraemondemo.mc
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.appcompat.widget.AppCompatButton
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2020/12/7-19:27
* 描 述:
* 修订历史:
* ================================================
*/
class DoKitButton : AppCompatButton {
companion object {
const val TAG = "DoKitButton"
}
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
)
// private val POPULATING_ACCESSIBILITY_EVENT_TYPES = (AccessibilityEvent.TYPE_VIEW_CLICKED
// or AccessibilityEvent.TYPE_VIEW_LONG_CLICKED
// or AccessibilityEvent.TYPE_VIEW_SELECTED
// or AccessibilityEvent.TYPE_VIEW_FOCUSED
// or AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
// or AccessibilityEvent.TYPE_VIEW_HOVER_ENTER
// or AccessibilityEvent.TYPE_VIEW_HOVER_EXIT
// or AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED
// or AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED
// or AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED
// or AccessibilityEvent.TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY)
//
//
// override fun sendAccessibilityEvent(eventType: Int) {
// super.sendAccessibilityEvent(eventType)
// }
//
// override fun sendAccessibilityEventUnchecked(event: AccessibilityEvent?) {
//
//
// // Do not send scroll events since first they are not interesting for
// // accessibility and second such events a generated too frequently.
// // For details see the implementation of bringTextIntoView().
// if (event!!.eventType == AccessibilityEvent.TYPE_VIEW_SCROLLED) {
// return
// }
//
// if (!isShown) {
// return
// }
// onInitializeAccessibilityEvent(event)
// LogHelper.i(TAG, "event1===>$event")
// // Only a subset of accessibility events populates text content.
// // Only a subset of accessibility events populates text content.
// if (event!!.eventType and POPULATING_ACCESSIBILITY_EVENT_TYPES != 0) {
// dispatchPopulateAccessibilityEvent(event)
// }
// LogHelper.i(TAG, "event2===>$event")
//
// // Android 9.0以下的系统会在requestSendAccessibilityEvent 方法中对于event做一定的处理 导致event 中的有些字段会被置空
// this.parent?.requestSendAccessibilityEvent(this, event)
// LogHelper.i(TAG, "event3===>$event")
// }
override fun onTouchEvent(event: MotionEvent?): Boolean {
return super.onTouchEvent(event)
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/DoKitRecycleView.kt
================================================
package com.didichuxing.doraemondemo.mc
import android.content.Context
import android.util.AttributeSet
import androidx.recyclerview.widget.RecyclerView
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2020/12/7-19:17
* 描 述:
* 修订历史:
* ================================================
*/
class DoKitRecycleView : RecyclerView {
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
)
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/DoKitWebView.kt
================================================
package com.didichuxing.doraemondemo.mc
import android.content.Context
import android.util.AttributeSet
import android.webkit.WebView
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2020/12/7-19:27
* 描 述:
* 修订历史:
* ================================================
*/
class DoKitWebView : WebView {
companion object {
const val TAG = "DoKitWebView"
}
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
)
override fun getAccessibilityClassName(): CharSequence {
return super.getAccessibilityClassName()
}
override fun getAccessibilityTraversalBefore(): Int {
return super.getAccessibilityTraversalBefore()
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/FileUtils.java
================================================
package com.didichuxing.doraemondemo.mc;
import java.io.File;
import java.io.InputStream;
/**
* didi Create on 2022/3/17 .
* <p>
* Copyright (c) 2022/3/17 by didiglobal.com.
*
* @author <a href="realonlyone@126.com">zhangjun</a>
* @version 1.0
* @Date 2022/3/17 4:54 下午
* @Description 用一句话说明文件功能
*/
public class FileUtils {
/**
* 获取assets目录下的单个文件
* 这种方式只能用于webview加载
* 读取文件夹,直接取路径是不行的
*
* @param fileName 文件夹名
* @return File
*/
public static File getFileFromAssetsFile(String fileName) {
String path = "file:///android_asset/" + fileName;
File file = new File(path);
return file;
}
public static String readString(InputStream inputStream) throws Exception {
int size = inputStream.available();
byte[] buffer = new byte[size];
inputStream.read(buffer, 0, size);
return new String(buffer);
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/MCActivity.kt
================================================
package com.didichuxing.doraemondemo.mc
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.*
import android.widget.AdapterView.OnItemSelectedListener
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager.widget.ViewPager
import com.blankj.utilcode.util.ToastUtils
import com.didichuxing.doraemondemo.R
import com.didichuxing.doraemondemo.test.ScreenRecordingTest
import com.didichuxing.doraemonkit.DoKit
import com.didichuxing.doraemonkit.constant.BundleKey
import com.didichuxing.doraemonkit.kit.fileexplorer.ImageDetailFragment
import com.didichuxing.doraemonkit.kit.test.report.ScreenShotManager
import java.io.File
/**
* 一机多控Demo Activity
*/
class MCActivity : AppCompatActivity() {
companion object {
private const val TAG = "MCActivity"
}
lateinit var mAdapter: RVAdapter
private val screenShotManager = ScreenShotManager("test/kk")
private val screenRecordingTest = ScreenRecordingTest()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_mc)
findViewById<Button>(R.id.nextPage).setOnClickListener {
startActivity(Intent(this, NetMainActivity::class.java))
}
findViewById<Button>(R.id.webPage).setOnClickListener {
startActivity(Intent(this, WebViewActivity::class.java))
}
findViewById<Button>(R.id.testPage).setOnClickListener {
startScreenShot()
}
findViewById<Button>(R.id.screenPage).setOnClickListener {
screenRecordingTest.start(this)
}
findViewById<SlideBar>(R.id.unlock_bar).setOnUnlockListener(object :
SlideBar.OnUnlockListener {
override fun onUnlock(view: View?) {
DoKit.sendCustomEvent(
"un_lock",
view,
mapOf(
"unlock" to "custom unlock",
"testRecording" to "true"
)
)
}
override fun progress(view: View?, leftMargin: Int) {
DoKit.sendCustomEvent(
"lock_process",
view,
mapOf(
"progress" to "$leftMargin",
"testRecording" to "false"
)
)
}
})
val spinner = findViewById<Spinner>(R.id.spinner)
val citis = resources.getStringArray(R.array.city);
val adapter = ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, citis)
//第三步:设置下拉列表下拉时的菜单样式
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner.setAdapter(adapter)
spinner.prompt = "测试"
spinner.setOnItemSelectedListener(object : OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, view: View, position: Int, id: Long) {
ToastUtils.showShort("选择:" + citis[position])
}
override fun onNothingSelected(parent: AdapterView<*>?) {
ToastUtils.showShort("没有选择")
}
})
findViewById<View>(R.id.btn1).setOnClickListener {
ToastUtils.showShort("正常点击")
}
findViewById<View>(R.id.btn2).setOnClickListener {
AlertDialog.Builder(this)
.setMessage("我是弹框")
.setPositiveButton(
"确定"
) { dialog, _ ->
run {
ToastUtils.showShort("确定")
dialog.dismiss()
}
}.setNegativeButton("取消") { dialog, _ ->
run {
ToastUtils.showShort("取消")
dialog.dismiss()
}
}.show()
}
findViewById<RadioGroup>(R.id.radio_group).setOnCheckedChangeListener { _, checkedId ->
ToastUtils.showLong("checkedId===>${checkedId}")
}
initData()
}
private fun startScreenShot() {
val map = screenShotManager.screenshotBitmap()
val fileName = screenShotManager.createNextFileName()
screenShotManager.saveBitmap(map, fileName)
val bundle = Bundle()
bundle.putSerializable(BundleKey.FILE_KEY, File(screenShotManager.getScreenFile(fileName)))
DoKit.launchFullScreen(ImageDetailFragment::class.java, this, bundle, false)
}
private fun initData() {
val rvDatas = mutableListOf<String>()
val lvDatas = mutableListOf<String>()
for (index in 0..100) {
val item = layoutInflater.inflate(R.layout.item_sc, null)
val tv = item.findViewById<TextView>(R.id.tv)
tv.setOnClickListener {
ToastUtils.showShort("${(it as TextView).text}")
}
tv.text = "sc item $index"
findViewById<LinearLayout>(R.id.ll).addView(item)
rvDatas.add("rv item $index")
lvDatas.add("lv item $index")
}
findViewById<ListView>(R.id.lv)
.apply {
adapter = ArrayAdapter<String>(
this@MCActivity,
android.R.layout.simple_list_item_1,
lvDatas
)
onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ ->
ToastUtils.showShort(lvDatas[position])
}
}
mAdapter = RVAdapter(R.layout.item_rv, rvDatas)
mAdapter.setOnItemClickListener { adapter, _, position ->
ToastUtils.showShort("rv item click ==>$position")
}
findViewById<RecyclerView>(R.id.rv).apply {
layoutManager = LinearLayoutManager(this@MCActivity)
adapter = mAdapter
}
val fragments = mutableListOf<Fragment>()
fragments.add(VpFragment(0))
fragments.add(VpFragment(1))
fragments.add(VpFragment(2))
fragments.add(VpFragment(3))
findViewById<ViewPager>(R.id.vp).adapter = VPAdapter(fragments, supportFragmentManager)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
screenRecordingTest.onActivityResult(requestCode, resultCode, data)
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/MyProxyWebView.java
================================================
package com.didichuxing.doraemondemo.mc;
import android.webkit.WebView;
/**
* didi Create on 2022/3/22 .
* <p>
* Copyright (c) 2022/3/22 by didiglobal.com.
*
* @author <a href="realonlyone@126.com">zhangjun</a>
* @version 1.0
* @Date 2022/3/22 7:15 下午
* @Description 用一句话说明文件功能
*/
public class MyProxyWebView {
private WebView webView;
public MyProxyWebView(WebView webView) {
this.webView = webView;
}
public WebView getWebView() {
return webView;
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/MyTestWebView.java
================================================
package com.didichuxing.doraemondemo.mc;
import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebView;
import java.util.Map;
/**
* didi Create on 2022/3/22 .
* <p>
* Copyright (c) 2022/3/22 by didiglobal.com.
*
* @author <a href="realonlyone@126.com">zhangjun</a>
* @version 1.0
* @Date 2022/3/22 3:56 下午
* @Description 用一句话说明文件功能
*/
public class MyTestWebView extends WebView {
public MyTestWebView(Context context) {
super(context);
}
public MyTestWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyTestWebView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public MyTestWebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public void loadUrl(String url) {
super.loadUrl(url);
}
@Override
public void loadUrl(String url, Map<String, String> additionalHttpHeaders) {
super.loadUrl(url, additionalHttpHeaders);
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/MyTestWebViewBuilder.java
================================================
package com.didichuxing.doraemondemo.mc;
import android.text.TextUtils;
import com.didichuxing.doraemonkit.util.LogHelper;
import java.util.HashMap;
import java.util.Map;
/**
* didi Create on 2022/3/22 .
* <p>
* Copyright (c) 2022/3/22 by didiglobal.com.
*
* @author <a href="realonlyone@126.com">zhangjun</a>
* @version 1.0
* @Date 2022/3/22 7:14 下午
* @Description 用一句话说明文件功能
*/
public class MyTestWebViewBuilder {
public final String TAG = "WebViewBuilder";
private MyProxyWebView mKDWebView;
private String initUrl;
private final Map<String, String> additionalHttpHeaders = new HashMap<String, String>();
public MyTestWebViewBuilder(MyProxyWebView mKDWebView, String initUrl) {
this.mKDWebView = mKDWebView;
this.initUrl = initUrl;
}
public void load(String url, Map<String, String> headers) {
mKDWebView.getWebView().loadUrl(url, headers);
}
/**
* 返回WebView
*/
public MyProxyWebView create() {
if (!TextUtils.isEmpty(initUrl)) {
LogHelper.d(TAG, "load initurl:" + initUrl);
mKDWebView.getWebView().loadUrl(initUrl, additionalHttpHeaders);
}
return mKDWebView;
}
/**
* 返回WebView
*/
public MyProxyWebView create2(String a, String b, String c, String d, String e, String f) {
if (!TextUtils.isEmpty(initUrl)) {
LogHelper.d(TAG, "load initurl:" + initUrl);
String dx = initUrl;
mKDWebView.getWebView().loadUrl(f, additionalHttpHeaders);
}
return mKDWebView;
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/NetMainActivity.kt
================================================
package com.didichuxing.doraemondemo.mc
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import com.didichuxing.doraemondemo.R
import kotlinx.coroutines.*
import okhttp3.*
import java.io.IOException
class NetMainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_net_main)
}
override fun onResume() {
super.onResume()
request()
}
fun request() {
val httpRequest = Request.Builder()
.header("User-Agent", "mc-test")
.url("https://www.tianqiapi.com/free/week?appid=68852321&appsecret=BgGLDVc7")
.build()
val client = OkHttpClient.Builder().build()
client.newCall(httpRequest).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
GlobalScope.launch(Dispatchers.Main) {
val view = findViewById<TextView>(R.id.text)
view.text = e.message
}
}
override fun onResponse(call: Call, response: Response) {
GlobalScope.launch(Dispatchers.Main) {
val text: String? = response.body()?.string()
val view = findViewById<TextView>(R.id.text)
view.text = text
}
}
})
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/RVAdapter.kt
================================================
package com.didichuxing.doraemondemo.mc
import android.widget.Button
import android.widget.TextView
import com.blankj.utilcode.util.ToastUtils
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.viewholder.BaseViewHolder
import com.didichuxing.doraemondemo.R
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2020/12/7-14:48
* 描 述:
* 修订历史:
* ================================================
*/
class RVAdapter(layoutResId: Int, data: MutableList<String>? = null) :
BaseQuickAdapter<String, BaseViewHolder>(layoutResId, data) {
companion object {
const val TAG = "DemoAdapter"
}
override fun convert(holder: BaseViewHolder, item: String) {
holder.getView<TextView>(R.id.tv).text = item
holder.getView<Button>(R.id.btn).setOnClickListener {
val position = holder.adapterPosition
ToastUtils.showShort("rv item inner btn click==$position")
}
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/SlideBar.java
================================================
package com.didichuxing.doraemondemo.mc;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import com.didichuxing.doraemondemo.R;
/**
* 拖动解锁按钮
*
* @author jint
*/
public class SlideBar extends FrameLayout {
private View backgroundView;
private View floatView;
private View floatBackground;
private TextView mText = null;
private int thumbWidth = 0;
private boolean sliding = false;
private int sliderPosition = 0;
private int initialSliderPosition = 0;
private float initialSlidingX = 0;
private static final int TEXT_ALIGN_CENTER = 0;
private static final int TEXT_ALIGN_CENTER_EXCEPT_THUMB = 1;
private int textAlign = TEXT_ALIGN_CENTER;
private OnUnlockListener listener = null;
public void setOnUnlockListener(OnUnlockListener listener) {
this.listener = listener;
}
public SlideBar(Context context) {
this(context, null);
}
public SlideBar(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SlideBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.layout_slidebar, this, true);
backgroundView = findViewById(R.id.slidebar_root_bg);
mText = findViewById(R.id.slidebar_text_label);
floatBackground = findViewById(R.id.slidebar_float_background);
floatView = findViewById(R.id.slidebar_float_view);
if (attrs != null) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.UnlockBar);
String label = a.getString(R.styleable.UnlockBar_label);
mText.setText(label);
textAlign = a.getInt(R.styleable.UnlockBar_textAlign, TEXT_ALIGN_CENTER);
a.recycle();
} else {
textAlign = TEXT_ALIGN_CENTER_EXCEPT_THUMB;
}
// if (textAlign == TEXT_ALIGN_CENTER_EXCEPT_THUMB) {
// FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mText.getLayoutParams();
// params.setMargins(context.getResources().getDimensionPixelSize(R.dimen.slidebar_thumb_width) / 2, 0, 0, 0);
// mText.setLayoutParams(params);
// }
LayoutParams params = (LayoutParams) floatView.getLayoutParams();
ViewGroup p = (ViewGroup) floatBackground.getParent();
thumbWidth = p.getPaddingLeft() + p.getPaddingRight()
+ params.leftMargin + params.rightMargin
+ context.getResources().getDimensionPixelSize(R.dimen.slidebar_thumb_width);
}
public void reset() {
sliderPosition = 0;
final LayoutParams bgParams = (LayoutParams) floatBackground.getLayoutParams();
ValueAnimator animator = ValueAnimator.ofInt(bgParams.leftMargin, 0);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int value = (Integer) valueAnimator.getAnimatedValue();
setMarginLeftExtra(value);
if (value <= 1 && !isPressed()) {
mText.setAlpha(1f);
}
floatBackground.requestLayout();
}
});
animator.setDuration(300);
animator.start();
}
/**
* 设置按钮文字
*/
public void setLabel(CharSequence s) {
mText.setText(s);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
if (!mDragAble) {
return true;
}
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (event.getX() > sliderPosition && event.getX() < (sliderPosition + thumbWidth)) {
sliding = true;
initialSlidingX = event.getX();
initialSliderPosition = sliderPosition;
mText.setAlpha(0);
setPressed(true);
}
event.setAction(MotionEvent.ACTION_DOWN);
} else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_OUTSIDE) {
if (sliderPosition >= (getMeasuredWidth() - thumbWidth) * 0.7) {
//到70%就行
if (listener != null) listener.onUnlock(this);
} else if (sliding) {
reset();
}
sliding = false;
setPressed(false);
event.setAction(MotionEvent.ACTION_UP);
} else if (event.getAction() == MotionEvent.ACTION_MOVE && sliding) {
sliderPosition = (int) (initialSliderPosition + (event.getX() - initialSlidingX));
if (sliderPosition <= 0) sliderPosition = 0;
if (sliderPosition >= (getMeasuredWidth() - thumbWidth)) {
sliderPosition = getMeasuredWidth() - thumbWidth;
} else {
// int max = getMeasuredWidth() - thumbWidth;
// int progress = (int) (sliderPosition * 100 / (max * 1.0f));
mText.setAlpha(0);
}
setMarginLeftExtra(sliderPosition);
event.setAction(MotionEvent.ACTION_MOVE);
}
return true;
}
public void setMarginLeftExtra(int leftMargin) {
if (floatBackground == null) return;
if (listener != null) listener.progress(this, leftMargin);
LayoutParams params = (LayoutParams) floatBackground.getLayoutParams();
params.setMargins(leftMargin, params.topMargin, params.rightMargin, params.bottomMargin);
floatBackground.setLayoutParams(params);
}
public interface OnUnlockListener {
void onUnlock(View view);
void progress(View view, int leftMargin);
}
/**
* 设置后台背景
*
* @param color
*/
public void setBackgroundColor(int color) {
if (backgroundView != null) {
backgroundView.setBackgroundColor(color);
}
}
/**
* 设置前台背景
*
* @param color
*/
public void setForegroundColor(int color) {
if (floatBackground != null) {
floatBackground.setBackgroundColor(color);
}
}
/**
* 设置圆角
*
* @param radius
*/
public void setBorderRadius(float radius) {
// TODO: 在这里添加设置圆角代码
}
/**
* 设置是否可以拖动
*/
private boolean mDragAble = true;
public void setDragAble(boolean able) {
if (able) {
floatView.setVisibility(View.VISIBLE);
mDragAble = true;
} else {
floatView.setVisibility(View.GONE);
mDragAble = false;
}
}
@Override
public boolean performClick() {
return super.performClick();
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/VPAdapter.kt
================================================
package com.didichuxing.doraemondemo.mc
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2020/12/18-11:14
* 描 述:
* 修订历史:
* ================================================
*/
class VPAdapter(private val fragments: List<Fragment>, fm: FragmentManager) : FragmentPagerAdapter(
fm,
BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
) {
override fun getCount(): Int {
return fragments.size
}
override fun getItem(position: Int): Fragment {
return fragments[position]
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/VpFragment.kt
================================================
package com.didichuxing.doraemondemo.mc
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import androidx.fragment.app.Fragment
import com.blankj.utilcode.util.ToastUtils
import com.didichuxing.doraemondemo.R
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2020/12/29-11:24
* 描 述:
* 修订历史:
* ================================================
*/
class VpFragment(index: Int) : Fragment() {
val mIndex: Int = index
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_vp, container, false)
val btn = view.findViewById<Button>(R.id.btn)
btn.text = "Fragment_$mIndex"
btn.setOnClickListener {
ToastUtils.showShort((it as Button).text.toString())
}
return view
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/WebViewActivity.kt
================================================
package com.didichuxing.doraemondemo.mc
import android.graphics.Bitmap
import android.os.Build
import android.os.Bundle
import android.webkit.*
import androidx.appcompat.app.AppCompatActivity
import com.didichuxing.doraemondemo.R
import com.didichuxing.doraemonkit.util.LogHelper
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2020/12/29-21:58
* 描 述:
* 修订历史:
* ================================================
*/
class WebViewActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_webview)
val webview = findViewById<WebView>(R.id.webview)
webview.settings.allowFileAccess = true
webview.settings.allowContentAccess = true
webview.settings.allowFileAccessFromFileURLs = true
webview.settings.javaScriptEnabled = true
webview.settings.domStorageEnabled = true
webview.settings.databaseEnabled = true
webview.settings.setAppCacheEnabled(true)
webview.settings.mixedContentMode =WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE
webview.settings.allowUniversalAccessFromFileURLs = true
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
CookieManager.getInstance().setAcceptThirdPartyCookies(webview, true);
}
webview.webChromeClient = object : WebChromeClient() {
override fun onConsoleMessage(consoleMessage: ConsoleMessage?): Boolean {
return super.onConsoleMessage(consoleMessage)
}
override fun onProgressChanged(view: WebView?, newProgress: Int) {
super.onProgressChanged(view, newProgress)
}
}
webview.webViewClient = object : WebViewClient() {
override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse? {
return super.shouldInterceptRequest(view, request)
}
override fun onLoadResource(view: WebView?, url: String?) {
super.onLoadResource(view, url)
}
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
super.onPageStarted(view, url, favicon)
}
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
LogHelper.e("WEB", "dokit onPageFinished()")
}
}
// val url = "https://www.dokit.cn/#/index/home"
val url = "https://page.xiaojukeji.com/m/ddPage_0sMxiuk7.html"
val webViewBuilder = MyTestWebViewBuilder(MyProxyWebView(webview), url)
webViewBuilder.create()
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/module/CrashTest.kt
================================================
package com.didichuxing.doraemondemo.module
object CrashTest {
fun test() {
checkNotNull(testCrash())
}
private fun testCrash(): String? {
return null
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/module/DoKitItemView.java
================================================
package com.didichuxing.doraemondemo.module;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.didichuxing.doraemondemo.R;
/**
* didi Create on 2022/5/26 .
* <p>
* Copyright (c) 2022/5/26 by didiglobal.com.
*
* @author <a href="realonlyone@126.com">zhangjun</a>
* @version 1.0
* @Date 2022/5/26 11:18 上午
* @Description 用一句话说明文件功能
*/
public class DoKitItemView extends FrameLayout {
private int itemLayoutId;
private int itemIcon;
private int itemTextSize;
private boolean itemIconShow;
private boolean itemTextShow;
private String itemText = "";
private TextView textView;
private ImageView imageView;
public DoKitItemView(@NonNull Context context) {
super(context);
}
public DoKitItemView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public DoKitItemView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
private void init(Context context, @Nullable AttributeSet attrs) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DoKitItemView);
int layout = a.getInt(R.styleable.DoKitItemView_itemLayout, R.layout.view_dokit_item_view);
int icon = a.getResourceId(R.styleable.DoKitItemView_itemIcon, R.mipmap.dk_arrow_normal);
String text = a.getString(R.styleable.DoKitItemView_itemText);
int textSize = a.getDimensionPixelSize(R.styleable.DoKitItemView_itemTextSize, -1);
boolean iconShow = a.getBoolean(R.styleable.DoKitItemView_itemIconShow, true);
boolean textShow = a.getBoolean(R.styleable.DoKitItemView_itemTextShow, true);
itemLayoutId = layout;
itemIcon = icon;
itemText = text == null ? "" : text;
itemTextSize = textSize;
itemIconShow = iconShow;
itemTextShow = textShow;
a.recycle();
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
inflate(getContext(), itemLayoutId, this);
textView = findViewById(R.id.itemText);
imageView = findViewById(R.id.itemIcon);
View root = findViewById(R.id.rootView);
ShadowDrawable.setShadowDrawable(root, Color.parseColor("#FFFFFF"), dpToPx(8),
Color.parseColor("#26777777"), dpToPx(4), 0, 0);
textView.setText(itemText);
imageView.setBackgroundResource(itemIcon);
if (!itemIconShow) {
imageView.setVisibility(GONE);
}
if (!itemTextShow) {
textView.setVisibility(GONE);
}
if (itemTextSize >= 0) {
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, itemTextSize);
}
}
private int dpToPx(int dp) {
return (int) getResources().getDisplayMetrics().density * dp;
}
public String getItemText() {
return itemText;
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/module/MethodCostTest.kt
================================================
package com.didichuxing.doraemondemo.module
object MethodCostTest {
fun test() {
test1()
}
private fun test1() {
try {
Thread.sleep(1000)
} catch (e: InterruptedException) {
e.printStackTrace()
}
test2()
}
private fun test2() {
try {
Thread.sleep(200)
} catch (e: InterruptedException) {
e.printStackTrace()
}
test3()
}
private fun test3() {
try {
Thread.sleep(200)
} catch (e: InterruptedException) {
e.printStackTrace()
}
test4()
}
private fun test4() {
try {
Thread.sleep(200)
} catch (e: InterruptedException) {
e.printStackTrace()
}
}
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/module/ModuleActivity.java
================================================
package com.didichuxing.doraemondemo.module;
/**
* didi Create on 2022/5/25 .
* <p>
* Copyright (c) 2022/5/25 by didiglobal.com.
*
* @author <a href="realonlyone@126.com">zhangjun</a>
* @version 1.0
* @Date 2022/5/25 6:23 下午
* @Description 用一句话说明文件功能
*/
public class ModuleActivity {
}
================================================
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/module/ShadowDrawable.java
================================================
package com.didichuxing.doraemondemo.module;
/**
* didi Create on 2022/5/27 .
* <p>
* Copyright (c) 2022/5/27 by didiglobal.com.
*
* @author <a href="realonlyone@126.com">zhangjun</a>
* @versio
Showing preview only (208K chars total). Download the full file or copy to clipboard to get everything.
gitextract_2kvtefj7/ ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ └── -dokit-------------.md │ └── issue_template.md ├── .gitignore ├── Android/ │ ├── .editorconfig │ ├── .gitignore │ ├── README.md │ ├── app/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── doraemonkit.gradle │ │ ├── keystore/ │ │ │ └── test.keystore │ │ ├── libs/ │ │ │ └── BaiduLBS_Android.jar │ │ ├── proguard-rules.pro │ │ └── src/ │ │ ├── androidTest/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── didichuxing/ │ │ │ └── doraemondemo/ │ │ │ └── ExampleInstrumentedTest.java │ │ ├── debug/ │ │ │ └── java/ │ │ │ ├── AndroidManifest.xml │ │ │ └── com/ │ │ │ └── didichuxing/ │ │ │ └── doraemondemo/ │ │ │ ├── AopApp.java │ │ │ ├── App.kt │ │ │ └── amap/ │ │ │ ├── AMapUtil.java │ │ │ ├── ChString.java │ │ │ ├── DrivingRouteOverLay.java │ │ │ ├── FloatGpsMockRouteKitView.java │ │ │ ├── FloatGpsPresetMockKit.java │ │ │ ├── FloatGpsPresetMockKitView.java │ │ │ ├── RouteOverlay.java │ │ │ └── mockroute/ │ │ │ ├── BearingUtils.java │ │ │ ├── LogUtils.java │ │ │ ├── MockGPSTaskData.java │ │ │ └── MockGPSTaskManager.java │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── didichuxing/ │ │ │ │ └── doraemondemo/ │ │ │ │ ├── AopTest.java │ │ │ │ ├── BaseStatusBarActivity.java │ │ │ │ ├── DataBaseActivity.kt │ │ │ │ ├── EmptyActivity.kt │ │ │ │ ├── MainDoKitActivity.kt │ │ │ │ ├── WebViewSystemActivity.kt │ │ │ │ ├── WebViewX5Activity.kt │ │ │ │ ├── amap/ │ │ │ │ │ ├── AMapRouterFragment.kt │ │ │ │ │ ├── DefaultNaviListener.kt │ │ │ │ │ └── NaviRouteOverlay.kt │ │ │ │ ├── comm/ │ │ │ │ │ ├── CommBaseFragment.kt │ │ │ │ │ ├── CommFragmentActivity.kt │ │ │ │ │ ├── CommLauncher.kt │ │ │ │ │ └── CommViewModel.kt │ │ │ │ ├── db/ │ │ │ │ │ ├── DatabaseHelper.kt │ │ │ │ │ └── PersonDBHelper.java │ │ │ │ ├── dokit/ │ │ │ │ │ ├── BorderDoKitView.java │ │ │ │ │ ├── CustomDokitFragment.kt │ │ │ │ │ ├── DemoDoKitView.kt │ │ │ │ │ ├── DemoKit.kt │ │ │ │ │ ├── SimpleDoKitView.java │ │ │ │ │ ├── TestSimpleDoKitFloatView.kt │ │ │ │ │ ├── TestSimpleDokitFloatViewKit.kt │ │ │ │ │ ├── TestSimpleDokitFragmentKit.kt │ │ │ │ │ └── ViewSetupHelper.java │ │ │ │ ├── mc/ │ │ │ │ │ ├── DoKitButton.kt │ │ │ │ │ ├── DoKitRecycleView.kt │ │ │ │ │ ├── DoKitWebView.kt │ │ │ │ │ ├── FileUtils.java │ │ │ │ │ ├── MCActivity.kt │ │ │ │ │ ├── MyProxyWebView.java │ │ │ │ │ ├── MyTestWebView.java │ │ │ │ │ ├── MyTestWebViewBuilder.java │ │ │ │ │ ├── NetMainActivity.kt │ │ │ │ │ ├── RVAdapter.kt │ │ │ │ │ ├── SlideBar.java │ │ │ │ │ ├── VPAdapter.kt │ │ │ │ │ ├── VpFragment.kt │ │ │ │ │ └── WebViewActivity.kt │ │ │ │ ├── module/ │ │ │ │ │ ├── CrashTest.kt │ │ │ │ │ ├── DoKitItemView.java │ │ │ │ │ ├── MethodCostTest.kt │ │ │ │ │ ├── ModuleActivity.java │ │ │ │ │ ├── ShadowDrawable.java │ │ │ │ │ ├── bigbitmap/ │ │ │ │ │ │ └── BigBitmapActivity.kt │ │ │ │ │ ├── db/ │ │ │ │ │ │ └── DataBaseTest.kt │ │ │ │ │ ├── http/ │ │ │ │ │ │ ├── CustomInterceptor.kt │ │ │ │ │ │ ├── FileUploadTest.kt │ │ │ │ │ │ ├── OkHttpMock.kt │ │ │ │ │ │ ├── RetrofitMock.kt │ │ │ │ │ │ └── URLConnectionMock.kt │ │ │ │ │ ├── leak/ │ │ │ │ │ │ └── LeakActivity.kt │ │ │ │ │ └── retrofit/ │ │ │ │ │ ├── GithubService.kt │ │ │ │ │ └── GithubUserInfo.kt │ │ │ │ ├── old/ │ │ │ │ │ ├── BaseActivity.kt │ │ │ │ │ ├── MainAdapter.kt │ │ │ │ │ ├── MainDebugActivityOkhttpV3.kt │ │ │ │ │ ├── MainDebugActivityOkhttpV4.kt │ │ │ │ │ ├── MapActivity.kt │ │ │ │ │ └── MapShowingLocationActivity.kt │ │ │ │ └── test/ │ │ │ │ ├── ScreenRecordingService.java │ │ │ │ ├── ScreenRecordingTest.java │ │ │ │ └── screen/ │ │ │ │ └── ScreenRecordingDoKitView.kt │ │ │ └── res/ │ │ │ ├── drawable/ │ │ │ │ ├── bg_unlock_bar_btn_normal_v5.xml │ │ │ │ ├── bg_unlock_bar_normal_v5.xml │ │ │ │ ├── dk_btn_background.xml │ │ │ │ ├── dk_info_background.xml │ │ │ │ ├── dk_line_divider.xml │ │ │ │ ├── dk_shape_float_view_bg.xml │ │ │ │ └── ic_launcher_background.xml │ │ │ ├── drawable-v24/ │ │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── layout/ │ │ │ │ ├── activity_amap_path.xml │ │ │ │ ├── activity_big_bitmap_mock.xml │ │ │ │ ├── activity_comm.xml │ │ │ │ ├── activity_dokit_main.xml │ │ │ │ ├── activity_empty.xml │ │ │ │ ├── activity_leak.xml │ │ │ │ ├── activity_main.xml │ │ │ │ ├── activity_map.xml │ │ │ │ ├── activity_mc.xml │ │ │ │ ├── activity_net_main.xml │ │ │ │ ├── activity_normal_webview.xml │ │ │ │ ├── activity_second.xml │ │ │ │ ├── activity_webview.xml │ │ │ │ ├── activity_ws.xml │ │ │ │ ├── activity_x5_webview.xml │ │ │ │ ├── dk_demo.xml │ │ │ │ ├── dk_layout_simple_dokit_float_view.xml │ │ │ │ ├── dk_screen_show_view.xml │ │ │ │ ├── fragment_amap.xml │ │ │ │ ├── fragment_vp.xml │ │ │ │ ├── item_lv.xml │ │ │ │ ├── item_main_rv.xml │ │ │ │ ├── item_rv.xml │ │ │ │ ├── item_sc.xml │ │ │ │ ├── layout_demo_custom.xml │ │ │ │ ├── layout_mock_location_preset.xml │ │ │ │ ├── layout_mock_route.xml │ │ │ │ ├── layout_slidebar.xml │ │ │ │ └── view_dokit_item_view.xml │ │ │ ├── values/ │ │ │ │ ├── atts.xml │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ ├── values-en-rUS/ │ │ │ │ └── strings.xml │ │ │ ├── values-zh-rCN/ │ │ │ │ └── strings.xml │ │ │ └── xml/ │ │ │ └── network_config.xml │ │ ├── release/ │ │ │ └── java/ │ │ │ ├── AndroidManifest.xml │ │ │ └── com/ │ │ │ └── didichuxing/ │ │ │ └── doraemondemo/ │ │ │ └── App.kt │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── didichuxing/ │ │ └── doraemondemo/ │ │ ├── ExampleUnitTest.kt │ │ ├── KotlinBaseUnitTest.kt │ │ ├── KotlinCaseTest.kt │ │ └── TestJava.java │ ├── build.gradle │ ├── buildSrc/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ └── src/ │ │ └── main/ │ │ ├── kotlin/ │ │ │ └── com/ │ │ │ └── didichuxing/ │ │ │ └── doraemonkit/ │ │ │ └── plugin/ │ │ │ ├── DoKitExt.kt │ │ │ ├── DoKitExtUtil.kt │ │ │ ├── DoKitPlugin.kt │ │ │ ├── DoKitPluginUtil.kt │ │ │ ├── DoKitTransformTaskExecutionListener.kt │ │ │ ├── extension/ │ │ │ │ ├── BigImageExtension.kt │ │ │ │ ├── DoKitExtension.kt │ │ │ │ ├── GpsExtension.kt │ │ │ │ ├── NetworkExtension.kt │ │ │ │ ├── SlowMethodExtension.kt │ │ │ │ └── WebViewExtension.kt │ │ │ ├── processor/ │ │ │ │ ├── DoKitComponentHandler.kt │ │ │ │ └── DoKitPluginConfigProcessor.kt │ │ │ ├── stack_method/ │ │ │ │ ├── MethodStackNode.kt │ │ │ │ └── MethodStackNodeUtil.kt │ │ │ ├── thirdlib/ │ │ │ │ ├── ThirdLibInfo.kt │ │ │ │ └── ThirdLibVariantProcessor.kt │ │ │ └── transform/ │ │ │ ├── DoKitBaseTransform.kt │ │ │ ├── DoKitCommonTransform.kt │ │ │ ├── DoKitCommonTransformV34.kt │ │ │ ├── DoKitDependTransform.kt │ │ │ ├── DoKitDependTransformV34.kt │ │ │ ├── DoKitTransformContext.kt │ │ │ ├── DoKitTransformInvocation.kt │ │ │ ├── asmtransform/ │ │ │ │ ├── BaseDoKitAsmTransformer.kt │ │ │ │ └── DoKitAsmTransformer.kt │ │ │ └── classtransform/ │ │ │ ├── AbsClassTransformer.kt │ │ │ ├── BigImgClassTransformer.kt │ │ │ ├── CommClassTransformer.kt │ │ │ ├── EnterMSClassTransformer.kt │ │ │ ├── GPSAMapClassTransformer.kt │ │ │ ├── GPSBDClassTransformer.kt │ │ │ ├── GPSClassTransformer.kt │ │ │ ├── GPSTencentClassTransformer.kt │ │ │ ├── GSMClassTransformer.kt │ │ │ ├── MSDClassTransformer.kt │ │ │ ├── Okhttp3ClassTransformer.kt │ │ │ ├── ThirdLibsClassTransformer.kt │ │ │ ├── UrlConnectionTransformer.kt │ │ │ └── WebViewClassTransformer.kt │ │ └── resources/ │ │ └── META-INF/ │ │ └── gradle-plugins/ │ │ └── com.didi.dokit.debug.properties │ ├── config.gradle │ ├── dokit/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── proguard-rules.pro │ │ ├── src/ │ │ │ ├── androidTest/ │ │ │ │ └── java/ │ │ │ │ └── com/ │ │ │ │ └── didichuxing/ │ │ │ │ └── doraemonkit/ │ │ │ │ └── ExampleInstrumentedTest.java │ │ │ ├── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ ├── assets/ │ │ │ │ │ ├── dokit_system_kits.json │ │ │ │ │ ├── h5help/ │ │ │ │ │ │ ├── dokit.js │ │ │ │ │ │ ├── dokit_js_hook.html │ │ │ │ │ │ └── dokit_js_vconsole_hook.html │ │ │ │ │ └── map/ │ │ │ │ │ └── map.html │ │ │ │ ├── cpp/ │ │ │ │ │ ├── CMakeLists.txt │ │ │ │ │ ├── art.cpp │ │ │ │ │ ├── art.h │ │ │ │ │ └── main.cpp │ │ │ │ ├── java/ │ │ │ │ │ └── com/ │ │ │ │ │ └── didichuxing/ │ │ │ │ │ └── doraemonkit/ │ │ │ │ │ ├── DebugFileProvider.java │ │ │ │ │ ├── DoKit.kt │ │ │ │ │ ├── DoKitActivityLifecycleCallbacks.kt │ │ │ │ │ ├── DoKitCallBack.kt │ │ │ │ │ ├── DoKitEnv.kt │ │ │ │ │ ├── DoKitFragmentLifecycleCallbacks.kt │ │ │ │ │ ├── DoKitOrientationEventListener.kt │ │ │ │ │ ├── DoKitReal.kt │ │ │ │ │ ├── DoraemonKit.kt │ │ │ │ │ ├── aop/ │ │ │ │ │ │ ├── DokitPluginConfig.java │ │ │ │ │ │ ├── DokitThirdLibInfo.java │ │ │ │ │ │ ├── MethodCostUtil.kt │ │ │ │ │ │ ├── OkHttpHook.java │ │ │ │ │ │ ├── WebViewHook.java │ │ │ │ │ │ ├── bigimg/ │ │ │ │ │ │ │ ├── coil/ │ │ │ │ │ │ │ │ ├── CoilHook.java │ │ │ │ │ │ │ │ └── DokitCoilTransformation.java │ │ │ │ │ │ │ ├── fresco/ │ │ │ │ │ │ │ │ ├── DokitFrescoPostprocessor.java │ │ │ │ │ │ │ │ └── FrescoHook.java │ │ │ │ │ │ │ ├── glide/ │ │ │ │ │ │ │ │ ├── DokitGlideRequestListener.java │ │ │ │ │ │ │ │ ├── DokitGlideTransform.java │ │ │ │ │ │ │ │ ├── GlideHook.java │ │ │ │ │ │ │ │ └── GlideTransformHook.java │ │ │ │ │ │ │ ├── imageloader/ │ │ │ │ │ │ │ │ ├── DokitImageLoadingListener.java │ │ │ │ │ │ │ │ └── ImageLoaderHook.java │ │ │ │ │ │ │ └── picasso/ │ │ │ │ │ │ │ ├── DokitPicassoTransformation.java │ │ │ │ │ │ │ └── PicassoHook.java │ │ │ │ │ │ ├── mc/ │ │ │ │ │ │ │ ├── DoKitListenerHelper.kt │ │ │ │ │ │ │ └── DoKitProxyActivity.kt │ │ │ │ │ │ ├── method_stack/ │ │ │ │ │ │ │ ├── MethodInvokNode.kt │ │ │ │ │ │ │ ├── MethodStackBean.kt │ │ │ │ │ │ │ ├── MethodStackUtil.kt │ │ │ │ │ │ │ └── StaticMethodObject.kt │ │ │ │ │ │ └── urlconnection/ │ │ │ │ │ │ ├── HttpUrlConnectionProxyUtil.java │ │ │ │ │ │ ├── MyTrustManager.java │ │ │ │ │ │ ├── ObsoleteUrlFactory.java │ │ │ │ │ │ └── OkhttpClientUtil.kt │ │ │ │ │ ├── config/ │ │ │ │ │ │ ├── AlignRulerConfig.java │ │ │ │ │ │ ├── ColorPickConfig.java │ │ │ │ │ │ ├── CrashCaptureConfig.java │ │ │ │ │ │ ├── DokitMemoryConfig.java │ │ │ │ │ │ ├── DokitSwitchConfig.java │ │ │ │ │ │ ├── FloatIconConfig.java │ │ │ │ │ │ ├── GlobalConfig.java │ │ │ │ │ │ ├── GpsMockConfig.java │ │ │ │ │ │ ├── LayoutBorderConfig.java │ │ │ │ │ │ ├── LogInfoConfig.java │ │ │ │ │ │ └── PerformanceSpInfoConfig.java │ │ │ │ │ ├── constant/ │ │ │ │ │ │ ├── BroadcastAction.java │ │ │ │ │ │ ├── BundleKey.java │ │ │ │ │ │ ├── CachesKey.java │ │ │ │ │ │ ├── DoKitModule.kt │ │ │ │ │ │ ├── FragmentIndex.java │ │ │ │ │ │ ├── PageTag.java │ │ │ │ │ │ ├── RequestCode.java │ │ │ │ │ │ ├── SharedPrefsKey.java │ │ │ │ │ │ └── SpInputType.java │ │ │ │ │ ├── datapick/ │ │ │ │ │ │ ├── DataPickBean.java │ │ │ │ │ │ ├── DataPickManager.java │ │ │ │ │ │ └── DataPickUtils.java │ │ │ │ │ ├── extension/ │ │ │ │ │ │ └── DokitExtension.kt │ │ │ │ │ ├── kit/ │ │ │ │ │ │ ├── AbstractKit.kt │ │ │ │ │ │ ├── Category.java │ │ │ │ │ │ ├── IKit.kt │ │ │ │ │ │ ├── alignruler/ │ │ │ │ │ │ │ ├── AlignLineView.java │ │ │ │ │ │ │ ├── AlignRulerInfoDoKitView.java │ │ │ │ │ │ │ ├── AlignRulerKit.kt │ │ │ │ │ │ │ ├── AlignRulerLineDoKitView.java │ │ │ │ │ │ │ ├── AlignRulerMarkerDoKitView.java │ │ │ │ │ │ │ └── AlignRulerSettingFragment.java │ │ │ │ │ │ ├── blockmonitor/ │ │ │ │ │ │ │ ├── BlockListAdapter.java │ │ │ │ │ │ │ ├── BlockListFragment.java │ │ │ │ │ │ │ ├── BlockMonitorFragment.java │ │ │ │ │ │ │ ├── BlockMonitorKit.kt │ │ │ │ │ │ │ ├── bean/ │ │ │ │ │ │ │ │ └── BlockInfo.java │ │ │ │ │ │ │ └── core/ │ │ │ │ │ │ │ ├── BlockCanaryUtils.java │ │ │ │ │ │ │ ├── BlockMonitorManager.java │ │ │ │ │ │ │ ├── MonitorCore.java │ │ │ │ │ │ │ ├── OnBlockInfoUpdateListener.java │ │ │ │ │ │ │ └── StackSampler.java │ │ │ │ │ │ ├── colorpick/ │ │ │ │ │ │ │ ├── ColorPickConstants.java │ │ │ │ │ │ │ ├── ColorPickManager.java │ │ │ │ │ │ │ ├── ColorPickerDoKitView.java │ │ │ │ │ │ │ ├── ColorPickerInfoDoKitView.java │ │ │ │ │ │ │ ├── ColorPickerKit.kt │ │ │ │ │ │ │ ├── ColorPickerSettingFragment.java │ │ │ │ │ │ │ ├── ColorPickerView.java │ │ │ │ │ │ │ ├── ImageCapture.java │ │ │ │ │ │ │ └── ScreenRecorderService.java │ │ │ │ │ │ ├── connect/ │ │ │ │ │ │ │ ├── ConnectAddress.kt │ │ │ │ │ │ │ ├── ConnectAddressStore.kt │ │ │ │ │ │ │ ├── ConnectConfig.kt │ │ │ │ │ │ │ ├── ConnectListAdapter.kt │ │ │ │ │ │ │ ├── DoKitConnectFragment.kt │ │ │ │ │ │ │ ├── DoKitConnectManager.kt │ │ │ │ │ │ │ ├── DoKitScanActivity.kt │ │ │ │ │ │ │ ├── DoKitStudioConnectKit.kt │ │ │ │ │ │ │ ├── data/ │ │ │ │ │ │ │ │ ├── BytePackage.kt │ │ │ │ │ │ │ │ ├── LoginData.kt │ │ │ │ │ │ │ │ ├── PackageType.kt │ │ │ │ │ │ │ │ └── TextPackage.kt │ │ │ │ │ │ │ ├── parser/ │ │ │ │ │ │ │ │ ├── ByteParser.kt │ │ │ │ │ │ │ │ └── JsonParser.kt │ │ │ │ │ │ │ └── ws/ │ │ │ │ │ │ │ ├── ConnectStatus.kt │ │ │ │ │ │ │ ├── OkHttpWebSocketSession.kt │ │ │ │ │ │ │ ├── OnWebSocketBytesMessageListener.kt │ │ │ │ │ │ │ ├── OnWebSocketCloseListener.kt │ │ │ │ │ │ │ ├── OnWebSocketLoginSuccessListener.kt │ │ │ │ │ │ │ ├── OnWebSocketMessageListener.kt │ │ │ │ │ │ │ ├── OnWebSocketQueueSizeOutListener.kt │ │ │ │ │ │ │ ├── OnWebSocketReConnectListener.kt │ │ │ │ │ │ │ ├── OnWebSocketStatusChangeListener.kt │ │ │ │ │ │ │ ├── OnWebSocketTextPackageListener.kt │ │ │ │ │ │ │ ├── WebSocketClient.kt │ │ │ │ │ │ │ ├── WebSocketSession.kt │ │ │ │ │ │ │ └── WsLog.kt │ │ │ │ │ │ ├── core/ │ │ │ │ │ │ │ ├── AbsDoKitFragment.kt │ │ │ │ │ │ │ ├── AbsDoKitView.kt │ │ │ │ │ │ │ ├── AbsDoKitViewManager.kt │ │ │ │ │ │ │ ├── ActivityLifecycleStatusInfo.kt │ │ │ │ │ │ │ ├── BaseActivity.kt │ │ │ │ │ │ │ ├── BaseFragment.kt │ │ │ │ │ │ │ ├── DoKitFrameLayout.java │ │ │ │ │ │ │ ├── DoKitIntent.kt │ │ │ │ │ │ │ ├── DoKitKeyEvent.kt │ │ │ │ │ │ │ ├── DoKitLifecycleInterface.kt │ │ │ │ │ │ │ ├── DoKitManager.kt │ │ │ │ │ │ │ ├── DoKitServiceEnum.kt │ │ │ │ │ │ │ ├── DoKitServiceManager.kt │ │ │ │ │ │ │ ├── DoKitView.java │ │ │ │ │ │ │ ├── DoKitViewInfo.kt │ │ │ │ │ │ │ ├── DoKitViewInterface.java │ │ │ │ │ │ │ ├── DoKitViewLayoutParams.java │ │ │ │ │ │ │ ├── DoKitViewManager.kt │ │ │ │ │ │ │ ├── DoKitViewManagerInterface.kt │ │ │ │ │ │ │ ├── DokitAbility.kt │ │ │ │ │ │ │ ├── GlobalSingleDoKitViewInfo.kt │ │ │ │ │ │ │ ├── LastDoKitViewPosInfo.java │ │ │ │ │ │ │ ├── McClientProcessor.kt │ │ │ │ │ │ │ ├── NewBaseActivity.kt │ │ │ │ │ │ │ ├── NormalDoKitViewManager.kt │ │ │ │ │ │ │ ├── SettingItem.java │ │ │ │ │ │ │ ├── SettingItemAdapter.java │ │ │ │ │ │ │ ├── SimpleDoKitLauncher.kt │ │ │ │ │ │ │ ├── SystemDoKitViewManager.kt │ │ │ │ │ │ │ ├── TouchProxy.java │ │ │ │ │ │ │ ├── TranslucentActivity.java │ │ │ │ │ │ │ └── UniversalActivity.kt │ │ │ │ │ │ ├── crash/ │ │ │ │ │ │ │ ├── CrashCaptureKit.kt │ │ │ │ │ │ │ ├── CrashCaptureMainFragment.java │ │ │ │ │ │ │ ├── CrashCaptureManager.java │ │ │ │ │ │ │ ├── CrashHistoryAdapter.java │ │ │ │ │ │ │ └── CrashInfo.java │ │ │ │ │ │ ├── dataclean/ │ │ │ │ │ │ │ ├── DataCleanFragment.kt │ │ │ │ │ │ │ └── DataCleanKit.kt │ │ │ │ │ │ ├── dbdebug/ │ │ │ │ │ │ │ ├── DbDebugFragment.java │ │ │ │ │ │ │ └── DbDebugKit.kt │ │ │ │ │ │ ├── dokitforweb/ │ │ │ │ │ │ │ ├── DoKitForWebJsInjectFragment.kt │ │ │ │ │ │ │ ├── DokitForWeb.kt │ │ │ │ │ │ │ └── DokitForWebKit.kt │ │ │ │ │ │ ├── fileexplorer/ │ │ │ │ │ │ │ ├── DBListAdapter.java │ │ │ │ │ │ │ ├── DatabaseDetailFragment.java │ │ │ │ │ │ │ ├── FileExplorerChooseDialog.java │ │ │ │ │ │ │ ├── FileExplorerFragment.java │ │ │ │ │ │ │ ├── FileExplorerKit.kt │ │ │ │ │ │ │ ├── FileInfo.java │ │ │ │ │ │ │ ├── FileInfoAdapter.java │ │ │ │ │ │ │ ├── ImageDetailFragment.java │ │ │ │ │ │ │ ├── SpAdapter.java │ │ │ │ │ │ │ ├── SpBean.java │ │ │ │ │ │ │ ├── SpFragment.java │ │ │ │ │ │ │ ├── SpInputView.java │ │ │ │ │ │ │ ├── TextContentAdapter.java │ │ │ │ │ │ │ ├── TextDetailFragment.java │ │ │ │ │ │ │ └── VideoPlayFragment.java │ │ │ │ │ │ ├── h5_help/ │ │ │ │ │ │ │ ├── DoKitJSI.kt │ │ │ │ │ │ │ ├── DoKitWebViewClient.kt │ │ │ │ │ │ │ ├── DoKitX5WebViewClient.kt │ │ │ │ │ │ │ ├── H5DoKitView.kt │ │ │ │ │ │ │ ├── H5Kit.kt │ │ │ │ │ │ │ ├── JsHookDataManager.kt │ │ │ │ │ │ │ ├── JsHttpUtil.kt │ │ │ │ │ │ │ ├── LocalStorageAdapter.kt │ │ │ │ │ │ │ ├── ProxyWebViewClient.kt │ │ │ │ │ │ │ ├── ProxyX5WebViewClient.kt │ │ │ │ │ │ │ ├── X5WebViewUtil.kt │ │ │ │ │ │ │ └── bean/ │ │ │ │ │ │ │ ├── JsRequestBean.kt │ │ │ │ │ │ │ └── StorageBean.kt │ │ │ │ │ │ ├── health/ │ │ │ │ │ │ │ ├── AbsCountDownDoKitView.kt │ │ │ │ │ │ │ ├── AppHealthInfoUtil.java │ │ │ │ │ │ │ ├── CountDownDoKitView.kt │ │ │ │ │ │ │ ├── HealthFragment.java │ │ │ │ │ │ │ ├── HealthFragmentChild0.java │ │ │ │ │ │ │ ├── HealthFragmentChild1.java │ │ │ │ │ │ │ ├── HealthKit.kt │ │ │ │ │ │ │ ├── UploadAppHealthCallback.java │ │ │ │ │ │ │ ├── UserInfoDialogProvider.java │ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ │ └── AppHealthInfo.java │ │ │ │ │ │ ├── largepicture/ │ │ │ │ │ │ │ ├── LargeImageInfo.java │ │ │ │ │ │ │ ├── LargeImageListAdapter.java │ │ │ │ │ │ │ ├── LargeImageListFragment.java │ │ │ │ │ │ │ ├── LargePictureFragment.java │ │ │ │ │ │ │ ├── LargePictureItemAdapter.java │ │ │ │ │ │ │ ├── LargePictureKit.kt │ │ │ │ │ │ │ └── LargePictureManager.java │ │ │ │ │ │ ├── layoutborder/ │ │ │ │ │ │ │ ├── LayoutBorderKit.kt │ │ │ │ │ │ │ ├── LayoutBorderManager.java │ │ │ │ │ │ │ ├── LayoutBorderSettingFragment.java │ │ │ │ │ │ │ ├── LayoutLevelDoKitView.java │ │ │ │ │ │ │ ├── ScalpelFrameLayout.java │ │ │ │ │ │ │ ├── ViewBorderDrawable.java │ │ │ │ │ │ │ └── ViewBorderFrameLayout.java │ │ │ │ │ │ ├── loginfo/ │ │ │ │ │ │ │ ├── LogExportDialog.java │ │ │ │ │ │ │ ├── LogInfoDoKitView.java │ │ │ │ │ │ │ ├── LogInfoKit.kt │ │ │ │ │ │ │ ├── LogInfoManager.java │ │ │ │ │ │ │ ├── LogInfoSettingFragment.java │ │ │ │ │ │ │ ├── LogItemAdapter.java │ │ │ │ │ │ │ ├── LogLine.java │ │ │ │ │ │ │ ├── helper/ │ │ │ │ │ │ │ │ ├── LogcatHelper.java │ │ │ │ │ │ │ │ └── RuntimeHelper.java │ │ │ │ │ │ │ ├── reader/ │ │ │ │ │ │ │ │ ├── AbsLogcatReader.java │ │ │ │ │ │ │ │ ├── LogcatReader.java │ │ │ │ │ │ │ │ ├── LogcatReaderLoader.java │ │ │ │ │ │ │ │ ├── ScrubberUtils.java │ │ │ │ │ │ │ │ └── SingleLogcatReader.java │ │ │ │ │ │ │ └── util/ │ │ │ │ │ │ │ ├── ArrayUtil.java │ │ │ │ │ │ │ ├── SearchCriteria.java │ │ │ │ │ │ │ ├── StringUtil.java │ │ │ │ │ │ │ └── TagColorUtil.java │ │ │ │ │ │ ├── main/ │ │ │ │ │ │ │ └── MainIconDoKitView.kt │ │ │ │ │ │ ├── methodtrace/ │ │ │ │ │ │ │ ├── AppHealthMethodCostBean.java │ │ │ │ │ │ │ ├── AppHealthMethodCostBeanWrap.java │ │ │ │ │ │ │ └── MethodCostKit.kt │ │ │ │ │ │ ├── network/ │ │ │ │ │ │ │ ├── MockKit.kt │ │ │ │ │ │ │ ├── NetworkKit.kt │ │ │ │ │ │ │ ├── NetworkManager.java │ │ │ │ │ │ │ ├── OnNetworkInfoUpdateListener.java │ │ │ │ │ │ │ ├── bean/ │ │ │ │ │ │ │ │ ├── MockApiResponseBean.java │ │ │ │ │ │ │ │ ├── MockInterceptTitleBean.java │ │ │ │ │ │ │ │ ├── MockTemplateTitleBean.java │ │ │ │ │ │ │ │ ├── NetflowInfo.java │ │ │ │ │ │ │ │ ├── NetworkRecord.java │ │ │ │ │ │ │ │ ├── Request.java │ │ │ │ │ │ │ │ ├── Response.java │ │ │ │ │ │ │ │ └── WhiteHostBean.java │ │ │ │ │ │ │ ├── common/ │ │ │ │ │ │ │ │ ├── CommonHeaders.java │ │ │ │ │ │ │ │ ├── CommonInspectorRequest.java │ │ │ │ │ │ │ │ ├── CommonInspectorResponse.java │ │ │ │ │ │ │ │ └── NetworkPrinterHelper.java │ │ │ │ │ │ │ ├── core/ │ │ │ │ │ │ │ │ ├── DefaultResponseHandler.java │ │ │ │ │ │ │ │ ├── MimeMatcher.java │ │ │ │ │ │ │ │ ├── NetworkInterpreter.java │ │ │ │ │ │ │ │ ├── RequestBodyHelper.java │ │ │ │ │ │ │ │ ├── ResourceType.java │ │ │ │ │ │ │ │ ├── ResourceTypeHelper.java │ │ │ │ │ │ │ │ └── ResponseHandler.java │ │ │ │ │ │ │ ├── okhttp/ │ │ │ │ │ │ │ │ ├── ForwardingResponseBody.java │ │ │ │ │ │ │ │ ├── InterceptorUtil.java │ │ │ │ │ │ │ │ ├── OkHttpInspectorRequest.java │ │ │ │ │ │ │ │ ├── OkHttpInspectorResponse.java │ │ │ │ │ │ │ │ └── interceptor/ │ │ │ │ │ │ │ │ ├── AbsDoKitInterceptor.kt │ │ │ │ │ │ │ │ ├── DokitCapInterceptor.java │ │ │ │ │ │ │ │ ├── DokitExtInterceptor.kt │ │ │ │ │ │ │ │ ├── DokitLargePicInterceptor.java │ │ │ │ │ │ │ │ ├── DokitMockInterceptor.java │ │ │ │ │ │ │ │ └── DokitWeakNetworkInterceptor.java │ │ │ │ │ │ │ ├── room_db/ │ │ │ │ │ │ │ │ ├── AbsMockApiBean.java │ │ │ │ │ │ │ │ ├── DokitDatabase.java │ │ │ │ │ │ │ │ ├── DokitDbManager.java │ │ │ │ │ │ │ │ ├── MockApiDao.java │ │ │ │ │ │ │ │ ├── MockInterceptApiBean.java │ │ │ │ │ │ │ │ └── MockTemplateApiBean.java │ │ │ │ │ │ │ ├── stream/ │ │ │ │ │ │ │ │ ├── GunzippingOutputStream.java │ │ │ │ │ │ │ │ ├── HttpOutputStreamProxy.java │ │ │ │ │ │ │ │ ├── InputStreamProxy.java │ │ │ │ │ │ │ │ └── OutputStreamProxy.java │ │ │ │ │ │ │ ├── ui/ │ │ │ │ │ │ │ │ ├── InterceptDetailNodeProvider.java │ │ │ │ │ │ │ │ ├── InterceptMockAdapter.java │ │ │ │ │ │ │ │ ├── InterceptTitleNodeProvider.java │ │ │ │ │ │ │ │ ├── ListDropDownAdapter.java │ │ │ │ │ │ │ │ ├── MockTemplatePreviewFragment.java │ │ │ │ │ │ │ │ ├── NetWorkMainPagerAdapter.java │ │ │ │ │ │ │ │ ├── NetWorkMainPagerFragment.java │ │ │ │ │ │ │ │ ├── NetWorkMockFragment.java │ │ │ │ │ │ │ │ ├── NetWorkMonitorFragment.java │ │ │ │ │ │ │ │ ├── NetWorkSummaryView.java │ │ │ │ │ │ │ │ ├── NetworkDetailFragment.java │ │ │ │ │ │ │ │ ├── NetworkDetailView.java │ │ │ │ │ │ │ │ ├── NetworkListAdapter.java │ │ │ │ │ │ │ │ ├── NetworkListView.java │ │ │ │ │ │ │ │ ├── NetworkPagerAdapter.java │ │ │ │ │ │ │ │ ├── TemplateDetailNodeProvider.java │ │ │ │ │ │ │ │ ├── TemplateMockAdapter.java │ │ │ │ │ │ │ │ ├── TemplateTitleNodeProvider.java │ │ │ │ │ │ │ │ └── WhiteHostAdapter.java │ │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ │ ├── ByteUtil.java │ │ │ │ │ │ │ ├── CostTimeUtil.java │ │ │ │ │ │ │ ├── ExceptionUtil.java │ │ │ │ │ │ │ ├── OkHttpResponse.kt │ │ │ │ │ │ │ ├── StreamUtil.java │ │ │ │ │ │ │ └── Utf8Charset.java │ │ │ │ │ │ ├── parameter/ │ │ │ │ │ │ │ ├── AbsParameterFragment.java │ │ │ │ │ │ │ ├── cpu/ │ │ │ │ │ │ │ │ ├── CpuKit.kt │ │ │ │ │ │ │ │ └── CpuMainPageFragment.java │ │ │ │ │ │ │ ├── frameInfo/ │ │ │ │ │ │ │ │ ├── FrameInfoFragment.java │ │ │ │ │ │ │ │ └── FrameInfoKit.kt │ │ │ │ │ │ │ └── ram/ │ │ │ │ │ │ │ ├── RamKit.kt │ │ │ │ │ │ │ └── RamMainPageFragment.java │ │ │ │ │ │ ├── performance/ │ │ │ │ │ │ │ ├── PerformanceCloseDoKitView.java │ │ │ │ │ │ │ ├── PerformanceCloseListener.java │ │ │ │ │ │ │ ├── PerformanceData.java │ │ │ │ │ │ │ ├── PerformanceDataAdapter.java │ │ │ │ │ │ │ ├── PerformanceDataManager.java │ │ │ │ │ │ │ ├── PerformanceDoKitView.java │ │ │ │ │ │ │ ├── PerformanceDokitViewManager.java │ │ │ │ │ │ │ ├── PerformanceFragment.java │ │ │ │ │ │ │ ├── PerformanceFragmentCloseListener.java │ │ │ │ │ │ │ ├── PolyLineAdapter.java │ │ │ │ │ │ │ ├── PolyLineItemView.java │ │ │ │ │ │ │ ├── datasource/ │ │ │ │ │ │ │ │ ├── CpuDataSource.java │ │ │ │ │ │ │ │ ├── DataSourceFactory.java │ │ │ │ │ │ │ │ ├── DefaultDataSource.java │ │ │ │ │ │ │ │ ├── FpsDataSource.java │ │ │ │ │ │ │ │ ├── IDataSource.java │ │ │ │ │ │ │ │ ├── NetworkDataSource.java │ │ │ │ │ │ │ │ └── RamDataSource.java │ │ │ │ │ │ │ ├── performanceViewInfo.java │ │ │ │ │ │ │ └── widget/ │ │ │ │ │ │ │ ├── CardiogramView.java │ │ │ │ │ │ │ ├── LineChart.java │ │ │ │ │ │ │ ├── LineData.java │ │ │ │ │ │ │ └── LineRender.java │ │ │ │ │ │ ├── sysinfo/ │ │ │ │ │ │ │ ├── DevelopmentPageKit.kt │ │ │ │ │ │ │ ├── LocalLangKit.kt │ │ │ │ │ │ │ ├── ServiceRunningKit.kt │ │ │ │ │ │ │ ├── SysInfoFragment.java │ │ │ │ │ │ │ ├── SysInfoItem.java │ │ │ │ │ │ │ ├── SysInfoItemAdapter.java │ │ │ │ │ │ │ ├── SysInfoKit.kt │ │ │ │ │ │ │ ├── ThirdLibInfoFragment.java │ │ │ │ │ │ │ ├── ThirdLibInfoItemAdapter.java │ │ │ │ │ │ │ ├── ThirdLibInfoKit.kt │ │ │ │ │ │ │ └── TitleItem.java │ │ │ │ │ │ ├── timecounter/ │ │ │ │ │ │ │ ├── AppStartInfoFragment.java │ │ │ │ │ │ │ ├── TimeCounterDoKitView.java │ │ │ │ │ │ │ ├── TimeCounterFragment.java │ │ │ │ │ │ │ ├── TimeCounterKit.kt │ │ │ │ │ │ │ ├── TimeCounterListAdapter.java │ │ │ │ │ │ │ ├── TimeCounterListFragment.java │ │ │ │ │ │ │ ├── TimeCounterManager.java │ │ │ │ │ │ │ ├── bean/ │ │ │ │ │ │ │ │ └── CounterInfo.java │ │ │ │ │ │ │ ├── counter/ │ │ │ │ │ │ │ │ ├── ActivityCounter.java │ │ │ │ │ │ │ │ └── AppCounter.java │ │ │ │ │ │ │ └── instrumentation/ │ │ │ │ │ │ │ ├── HandlerHooker.java │ │ │ │ │ │ │ └── ProxyHandlerCallback.java │ │ │ │ │ │ ├── toolpanel/ │ │ │ │ │ │ │ ├── ConfirmDialogProvider.kt │ │ │ │ │ │ │ ├── DokitManagerAdapter.kt │ │ │ │ │ │ │ ├── DokitManagerFragment.kt │ │ │ │ │ │ │ ├── DokitMoreAdapter.kt │ │ │ │ │ │ │ ├── DokitMoreFragment.kt │ │ │ │ │ │ │ ├── KitBeans.kt │ │ │ │ │ │ │ ├── KitWrapItem.kt │ │ │ │ │ │ │ ├── TipDialogProvider.kt │ │ │ │ │ │ │ ├── ToolPanelAdapter.kt │ │ │ │ │ │ │ ├── ToolPanelDoKitView.kt │ │ │ │ │ │ │ ├── ToolPanelUtil.kt │ │ │ │ │ │ │ ├── bean/ │ │ │ │ │ │ │ │ └── MorePageGroupBean.java │ │ │ │ │ │ │ └── decoration/ │ │ │ │ │ │ │ ├── FlexibleDividerDecoration.java │ │ │ │ │ │ │ ├── HorizontalDividerItemDecoration.java │ │ │ │ │ │ │ └── VerticalDividerItemDecoration.java │ │ │ │ │ │ ├── uiperformance/ │ │ │ │ │ │ │ ├── UIPerformanceDisplayDoKitView.java │ │ │ │ │ │ │ ├── UIPerformanceInfoDoKitView.java │ │ │ │ │ │ │ ├── UIPerformanceKit.kt │ │ │ │ │ │ │ ├── UIPerformanceManager.java │ │ │ │ │ │ │ └── UIPerformanceUtil.java │ │ │ │ │ │ ├── viewcheck/ │ │ │ │ │ │ │ ├── AimCircleView.java │ │ │ │ │ │ │ ├── DebugAccessibilityService.java │ │ │ │ │ │ │ ├── LayoutBorderView.java │ │ │ │ │ │ │ ├── ViewCheckDoKitView.java │ │ │ │ │ │ │ ├── ViewCheckDrawDoKitView.java │ │ │ │ │ │ │ ├── ViewCheckInfoDoKitView.java │ │ │ │ │ │ │ └── ViewCheckerKit.kt │ │ │ │ │ │ ├── weaknetwork/ │ │ │ │ │ │ │ ├── NetWokDoKitView.java │ │ │ │ │ │ │ ├── SpeedLimitRequestBody.java │ │ │ │ │ │ │ ├── SpeedLimitResponseBody.java │ │ │ │ │ │ │ ├── WeakNetworkFragment.java │ │ │ │ │ │ │ ├── WeakNetworkKit.kt │ │ │ │ │ │ │ └── WeakNetworkManager.java │ │ │ │ │ │ ├── webdoor/ │ │ │ │ │ │ │ ├── WebDoorDefaultFragment.java │ │ │ │ │ │ │ ├── WebDoorFragment.java │ │ │ │ │ │ │ ├── WebDoorHistoryAdapter.java │ │ │ │ │ │ │ ├── WebDoorKit.kt │ │ │ │ │ │ │ └── WebDoorManager.java │ │ │ │ │ │ └── webview/ │ │ │ │ │ │ ├── CommWebViewFragment.kt │ │ │ │ │ │ ├── OnWebViewTitleChangeCallBack.java │ │ │ │ │ │ └── WebViewManager.kt │ │ │ │ │ ├── model/ │ │ │ │ │ │ ├── LatLng.java │ │ │ │ │ │ └── ViewInfo.java │ │ │ │ │ ├── picasso/ │ │ │ │ │ │ ├── Action.java │ │ │ │ │ │ ├── AssetRequestHandler.java │ │ │ │ │ │ ├── BitmapHunter.java │ │ │ │ │ │ ├── Cache.java │ │ │ │ │ │ ├── Callback.java │ │ │ │ │ │ ├── ContactsPhotoRequestHandler.java │ │ │ │ │ │ ├── ContentStreamRequestHandler.java │ │ │ │ │ │ ├── DeferredRequestCreator.java │ │ │ │ │ │ ├── Dispatcher.java │ │ │ │ │ │ ├── DokitPicasso.java │ │ │ │ │ │ ├── Downloader.java │ │ │ │ │ │ ├── FetchAction.java │ │ │ │ │ │ ├── FileRequestHandler.java │ │ │ │ │ │ ├── GetAction.java │ │ │ │ │ │ ├── ImageViewAction.java │ │ │ │ │ │ ├── LruCache.java │ │ │ │ │ │ ├── MarkableInputStream.java │ │ │ │ │ │ ├── MediaStoreRequestHandler.java │ │ │ │ │ │ ├── MemoryPolicy.java │ │ │ │ │ │ ├── NetworkPolicy.java │ │ │ │ │ │ ├── NetworkRequestHandler.java │ │ │ │ │ │ ├── OkHttpDownloader.java │ │ │ │ │ │ ├── PicassoDrawable.java │ │ │ │ │ │ ├── PicassoExecutorService.java │ │ │ │ │ │ ├── RemoteViewsAction.java │ │ │ │ │ │ ├── Request.java │ │ │ │ │ │ ├── RequestCreator.java │ │ │ │ │ │ ├── RequestHandler.java │ │ │ │ │ │ ├── ResourceRequestHandler.java │ │ │ │ │ │ ├── Stats.java │ │ │ │ │ │ ├── StatsSnapshot.java │ │ │ │ │ │ ├── Target.java │ │ │ │ │ │ ├── TargetAction.java │ │ │ │ │ │ ├── Transformation.java │ │ │ │ │ │ ├── UrlConnectionDownloader.java │ │ │ │ │ │ └── Utils.java │ │ │ │ │ ├── reflection/ │ │ │ │ │ │ ├── BootstrapClass.java │ │ │ │ │ │ └── Reflection.java │ │ │ │ │ ├── util/ │ │ │ │ │ │ ├── ColorUtil.java │ │ │ │ │ │ ├── DataCleanUtil.java │ │ │ │ │ │ ├── DatabaseUtil.java │ │ │ │ │ │ ├── DoKitCacheUtils.java │ │ │ │ │ │ ├── DoKitClipboardUtils.java │ │ │ │ │ │ ├── DoKitCommUtil.java │ │ │ │ │ │ ├── DoKitExecutorUtil.java │ │ │ │ │ │ ├── DoKitFileUtil.java │ │ │ │ │ │ ├── DoKitFormatUtil.java │ │ │ │ │ │ ├── DoKitImageUtil.java │ │ │ │ │ │ ├── DoKitJsonUtil.java │ │ │ │ │ │ ├── DoKitMiscUtil.java │ │ │ │ │ │ ├── DoKitNotificationUtils.java │ │ │ │ │ │ ├── DoKitPermissionUtil.java │ │ │ │ │ │ ├── DoKitSPUtil.java │ │ │ │ │ │ ├── DoKitSystemUtil.java │ │ │ │ │ │ ├── DoKitWebUtil.java │ │ │ │ │ │ ├── DokitDeviceUtils.java │ │ │ │ │ │ ├── DoraemonStatisticsUtil.java │ │ │ │ │ │ ├── FileManager.java │ │ │ │ │ │ ├── LifecycleListenerUtil.java │ │ │ │ │ │ ├── LogHelper.java │ │ │ │ │ │ ├── Reflector.java │ │ │ │ │ │ ├── UIUtils.java │ │ │ │ │ │ └── threadpool/ │ │ │ │ │ │ ├── ThreadPoolProxy.java │ │ │ │ │ │ └── ThreadPoolProxyFactory.java │ │ │ │ │ ├── volley/ │ │ │ │ │ │ └── VolleyManager.kt │ │ │ │ │ ├── widget/ │ │ │ │ │ │ ├── JustifyTextView.java │ │ │ │ │ │ ├── MultiLineRadioGroup.java │ │ │ │ │ │ ├── bottomview/ │ │ │ │ │ │ │ ├── AssociationView.java │ │ │ │ │ │ │ ├── BottomUpWindow.java │ │ │ │ │ │ │ └── EditSpInputView.java │ │ │ │ │ │ ├── brvah/ │ │ │ │ │ │ │ ├── BaseBinderAdapter.kt │ │ │ │ │ │ │ ├── BaseDelegateMultiAdapter.kt │ │ │ │ │ │ │ ├── BaseMultiItemQuickAdapter.kt │ │ │ │ │ │ │ ├── BaseNodeAdapter.kt │ │ │ │ │ │ │ ├── BaseProviderMultiAdapter.kt │ │ │ │ │ │ │ ├── BaseQuickAdapter.kt │ │ │ │ │ │ │ ├── BaseSectionQuickAdapter.kt │ │ │ │ │ │ │ ├── animation/ │ │ │ │ │ │ │ │ ├── AlphaInAnimation.kt │ │ │ │ │ │ │ │ ├── BaseAnimation.kt │ │ │ │ │ │ │ │ ├── ScaleInAnimation.kt │ │ │ │ │ │ │ │ ├── SlideInBottomAnimation.kt │ │ │ │ │ │ │ │ ├── SlideInLeftAnimation.kt │ │ │ │ │ │ │ │ └── SlideInRightAnimation.kt │ │ │ │ │ │ │ ├── binder/ │ │ │ │ │ │ │ │ ├── BaseItemBinder.kt │ │ │ │ │ │ │ │ ├── QuickDataBindingItemBinder.kt │ │ │ │ │ │ │ │ ├── QuickItemBinder.kt │ │ │ │ │ │ │ │ └── QuickViewBindingItemBinder.kt │ │ │ │ │ │ │ ├── delegate/ │ │ │ │ │ │ │ │ └── BaseMultiTypeDelegate.kt │ │ │ │ │ │ │ ├── diff/ │ │ │ │ │ │ │ │ ├── BrvahAsyncDiffer.kt │ │ │ │ │ │ │ │ ├── BrvahAsyncDifferConfig.kt │ │ │ │ │ │ │ │ ├── BrvahListUpdateCallback.kt │ │ │ │ │ │ │ │ ├── DifferImp.java │ │ │ │ │ │ │ │ └── ListChangeListener.java │ │ │ │ │ │ │ ├── dragswipe/ │ │ │ │ │ │ │ │ └── DragAndSwipeCallback.java │ │ │ │ │ │ │ ├── entity/ │ │ │ │ │ │ │ │ ├── JSectionEntity.java │ │ │ │ │ │ │ │ ├── MultiItemEntity.kt │ │ │ │ │ │ │ │ ├── SectionEntity.kt │ │ │ │ │ │ │ │ └── node/ │ │ │ │ │ │ │ │ ├── BaseExpandNode.kt │ │ │ │ │ │ │ │ ├── BaseNode.kt │ │ │ │ │ │ │ │ └── NodeFooterImp.kt │ │ │ │ │ │ │ ├── listener/ │ │ │ │ │ │ │ │ ├── BaseListenerImp.java │ │ │ │ │ │ │ │ ├── DraggableListenerImp.java │ │ │ │ │ │ │ │ ├── GridSpanSizeLookup.java │ │ │ │ │ │ │ │ ├── LoadMoreListenerImp.java │ │ │ │ │ │ │ │ ├── OnItemChildClickListener.java │ │ │ │ │ │ │ │ ├── OnItemChildLongClickListener.java │ │ │ │ │ │ │ │ ├── OnItemClickListener.java │ │ │ │ │ │ │ │ ├── OnItemDragListener.java │ │ │ │ │ │ │ │ ├── OnItemLongClickListener.java │ │ │ │ │ │ │ │ ├── OnItemSwipeListener.java │ │ │ │ │ │ │ │ ├── OnLoadMoreListener.java │ │ │ │ │ │ │ │ ├── OnUpFetchListener.java │ │ │ │ │ │ │ │ └── UpFetchListenerImp.java │ │ │ │ │ │ │ ├── loadmore/ │ │ │ │ │ │ │ │ ├── BaseLoadMoreView.kt │ │ │ │ │ │ │ │ └── SimpleLoadMoreView.kt │ │ │ │ │ │ │ ├── module/ │ │ │ │ │ │ │ │ ├── DraggableModule.kt │ │ │ │ │ │ │ │ ├── LoadMoreModule.kt │ │ │ │ │ │ │ │ └── UpFetchModule.kt │ │ │ │ │ │ │ ├── provider/ │ │ │ │ │ │ │ │ ├── BaseItemProvider.kt │ │ │ │ │ │ │ │ └── BaseNodeProvider.kt │ │ │ │ │ │ │ ├── util/ │ │ │ │ │ │ │ │ └── AdapterUtils.kt │ │ │ │ │ │ │ └── viewholder/ │ │ │ │ │ │ │ ├── BaseDataBindingHolder.kt │ │ │ │ │ │ │ └── BaseViewHolder.kt │ │ │ │ │ │ ├── chart/ │ │ │ │ │ │ │ ├── BarChart.java │ │ │ │ │ │ │ └── PieChart.java │ │ │ │ │ │ ├── dialog/ │ │ │ │ │ │ │ ├── CommonDialogProvider.java │ │ │ │ │ │ │ ├── DialogInfo.java │ │ │ │ │ │ │ ├── DialogListener.kt │ │ │ │ │ │ │ ├── DialogProvider.java │ │ │ │ │ │ │ ├── SimpleDialogListener.java │ │ │ │ │ │ │ └── UniversalDialogFragment.java │ │ │ │ │ │ ├── dropdown/ │ │ │ │ │ │ │ ├── DkDropDownMenu.java │ │ │ │ │ │ │ └── Orientation.java │ │ │ │ │ │ ├── easyrefresh/ │ │ │ │ │ │ │ ├── ELog.java │ │ │ │ │ │ │ ├── EasyRefreshLayout.java │ │ │ │ │ │ │ ├── ILoadMoreView.java │ │ │ │ │ │ │ ├── IRefreshHeader.java │ │ │ │ │ │ │ ├── LoadModel.java │ │ │ │ │ │ │ ├── State.java │ │ │ │ │ │ │ ├── exception/ │ │ │ │ │ │ │ │ └── ERVHRuntimeException.java │ │ │ │ │ │ │ └── view/ │ │ │ │ │ │ │ ├── SimpleLoadMoreView.java │ │ │ │ │ │ │ └── SimpleRefreshHeaderView.java │ │ │ │ │ │ ├── jsonviewer/ │ │ │ │ │ │ │ ├── JsonRecyclerView.java │ │ │ │ │ │ │ ├── adapter/ │ │ │ │ │ │ │ │ ├── BaseJsonViewerAdapter.java │ │ │ │ │ │ │ │ └── JsonViewerAdapter.java │ │ │ │ │ │ │ ├── utils/ │ │ │ │ │ │ │ │ └── Utils.java │ │ │ │ │ │ │ └── view/ │ │ │ │ │ │ │ └── JsonItemView.java │ │ │ │ │ │ ├── recyclerview/ │ │ │ │ │ │ │ ├── AbsRecyclerAdapter.java │ │ │ │ │ │ │ ├── AbsViewBinder.java │ │ │ │ │ │ │ └── DividerItemDecoration.java │ │ │ │ │ │ ├── tableview/ │ │ │ │ │ │ │ ├── SelectionOperation.java │ │ │ │ │ │ │ ├── TableConfig.java │ │ │ │ │ │ │ ├── TableMeasurer.java │ │ │ │ │ │ │ ├── TableParser.java │ │ │ │ │ │ │ ├── TableProvider.java │ │ │ │ │ │ │ ├── bean/ │ │ │ │ │ │ │ │ ├── ArrayTableData.java │ │ │ │ │ │ │ │ ├── Cell.java │ │ │ │ │ │ │ │ ├── CellInfo.java │ │ │ │ │ │ │ │ ├── Column.java │ │ │ │ │ │ │ │ ├── ColumnInfo.java │ │ │ │ │ │ │ │ ├── TableData.java │ │ │ │ │ │ │ │ └── TableInfo.java │ │ │ │ │ │ │ ├── component/ │ │ │ │ │ │ │ │ ├── SmartTable.java │ │ │ │ │ │ │ │ ├── TableTitle.java │ │ │ │ │ │ │ │ └── YSequence.java │ │ │ │ │ │ │ ├── format/ │ │ │ │ │ │ │ │ ├── BaseSequenceFormat.java │ │ │ │ │ │ │ │ ├── FastTextDrawFormat.java │ │ │ │ │ │ │ │ ├── NumberSequenceFormat.java │ │ │ │ │ │ │ │ ├── TextDrawFormat.java │ │ │ │ │ │ │ │ └── TitleDrawFormat.java │ │ │ │ │ │ │ ├── intface/ │ │ │ │ │ │ │ │ ├── IComponent.java │ │ │ │ │ │ │ │ ├── IDrawFormat.java │ │ │ │ │ │ │ │ ├── IFormat.java │ │ │ │ │ │ │ │ ├── ISelectFormat.java │ │ │ │ │ │ │ │ ├── ISequenceFormat.java │ │ │ │ │ │ │ │ ├── IStyle.java │ │ │ │ │ │ │ │ ├── ITableTitle.java │ │ │ │ │ │ │ │ ├── ITitleDrawFormat.java │ │ │ │ │ │ │ │ └── ITouch.java │ │ │ │ │ │ │ ├── listener/ │ │ │ │ │ │ │ │ ├── Observable.java │ │ │ │ │ │ │ │ ├── OnColumnClickListener.java │ │ │ │ │ │ │ │ ├── OnColumnItemClickListener.java │ │ │ │ │ │ │ │ ├── OnTableChangeListener.java │ │ │ │ │ │ │ │ └── TableClickObserver.java │ │ │ │ │ │ │ ├── style/ │ │ │ │ │ │ │ │ ├── FontStyle.java │ │ │ │ │ │ │ │ └── LineStyle.java │ │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ │ ├── DensityUtils.java │ │ │ │ │ │ │ ├── DrawUtils.java │ │ │ │ │ │ │ └── MatrixHelper.java │ │ │ │ │ │ ├── textview/ │ │ │ │ │ │ │ └── LabelTextView.java │ │ │ │ │ │ ├── titlebar/ │ │ │ │ │ │ │ ├── HomeTitleBar.java │ │ │ │ │ │ │ ├── LogTitleBar.java │ │ │ │ │ │ │ └── TitleBar.java │ │ │ │ │ │ ├── verticalviewpager/ │ │ │ │ │ │ │ ├── VerticalViewPager.java │ │ │ │ │ │ │ └── transforms/ │ │ │ │ │ │ │ ├── DefaultTransformer.java │ │ │ │ │ │ │ ├── StackTransformer.java │ │ │ │ │ │ │ └── ZoomOutTransformer.java │ │ │ │ │ │ ├── videoview/ │ │ │ │ │ │ │ ├── CustomVideoView.java │ │ │ │ │ │ │ └── MyVideoView.java │ │ │ │ │ │ └── webview/ │ │ │ │ │ │ ├── MyWebView.java │ │ │ │ │ │ └── MyWebViewClient.java │ │ │ │ │ └── zxing/ │ │ │ │ │ ├── activity/ │ │ │ │ │ │ └── CaptureActivity.java │ │ │ │ │ ├── camera/ │ │ │ │ │ │ ├── AutoFocusCallback.java │ │ │ │ │ │ ├── CameraConfigurationManager.java │ │ │ │ │ │ ├── CameraManager.java │ │ │ │ │ │ ├── FlashlightManager.java │ │ │ │ │ │ ├── PlanarYUVLuminanceSource.java │ │ │ │ │ │ └── PreviewCallback.java │ │ │ │ │ ├── decoding/ │ │ │ │ │ │ ├── CaptureActivityHandler.java │ │ │ │ │ │ ├── DecodeFormatManager.java │ │ │ │ │ │ ├── DecodeHandler.java │ │ │ │ │ │ ├── DecodeThread.java │ │ │ │ │ │ ├── FinishListener.java │ │ │ │ │ │ ├── InactivityTimer.java │ │ │ │ │ │ └── Intents.java │ │ │ │ │ └── view/ │ │ │ │ │ ├── ViewfinderResultPointCallback.java │ │ │ │ │ └── ViewfinderView.java │ │ │ │ └── res/ │ │ │ │ ├── anim/ │ │ │ │ │ ├── dk_dd_mask_in.xml │ │ │ │ │ ├── dk_dd_mask_out.xml │ │ │ │ │ ├── dk_dd_menu_in.xml │ │ │ │ │ ├── dk_dd_menu_out.xml │ │ │ │ │ ├── dk_easy_refresh_rotate_down.xml │ │ │ │ │ ├── dk_easy_refresh_rotate_infinite.xml │ │ │ │ │ └── dk_easy_refresh_rotate_up.xml │ │ │ │ ├── color/ │ │ │ │ │ ├── dk_confirm_button_text_color.xml │ │ │ │ │ ├── dk_network_pager_color.xml │ │ │ │ │ └── dk_radio_button_text_color.xml │ │ │ │ ├── drawable/ │ │ │ │ │ ├── dk_add_shape.xml │ │ │ │ │ ├── dk_app_toast_shape.xml │ │ │ │ │ ├── dk_brvah_sample_footer_loading_progress.xml │ │ │ │ │ ├── dk_btn_dokit_for_web_bg.xml │ │ │ │ │ ├── dk_btn_pause_style.xml │ │ │ │ │ ├── dk_btn_play_style.xml │ │ │ │ │ ├── dk_confirm_button_background.xml │ │ │ │ │ ├── dk_dialog_button_background.xml │ │ │ │ │ ├── dk_dialog_complete_bg.xml │ │ │ │ │ ├── dk_dialog_confirm_bg.xml │ │ │ │ │ ├── dk_divider.xml │ │ │ │ │ ├── dk_divider_gray.xml │ │ │ │ │ ├── dk_dokitview_studio_connect.xml │ │ │ │ │ ├── dk_dotted_line_horizontal.xml │ │ │ │ │ ├── dk_dotted_line_vertical.xml │ │ │ │ │ ├── dk_edittext_shape.xml │ │ │ │ │ ├── dk_float_ui_performance_info_bg.xml │ │ │ │ │ ├── dk_health_edittext_style.xml │ │ │ │ │ ├── dk_hint_bg.xml │ │ │ │ │ ├── dk_info_background.xml │ │ │ │ │ ├── dk_input_cursor.xml │ │ │ │ │ ├── dk_item_btn_img.xml │ │ │ │ │ ├── dk_item_performance_detail.xml │ │ │ │ │ ├── dk_jsonviewer_minus.xml │ │ │ │ │ ├── dk_jsonviewer_plus.xml │ │ │ │ │ ├── dk_kit_group_background.xml │ │ │ │ │ ├── dk_line_chart_selected_background.xml │ │ │ │ │ ├── dk_log_filter_background.xml │ │ │ │ │ ├── dk_net_work_monitor_list_selector.xml │ │ │ │ │ ├── dk_net_work_monitor_summary_selector.xml │ │ │ │ │ ├── dk_network_info_background.xml │ │ │ │ │ ├── dk_network_method_bg.xml │ │ │ │ │ ├── dk_network_platform_bg.xml │ │ │ │ │ ├── dk_perform_data_background.xml │ │ │ │ │ ├── dk_progressbar_style.xml │ │ │ │ │ ├── dk_radio_button_background.xml │ │ │ │ │ ├── dk_radio_button_background_left.xml │ │ │ │ │ ├── dk_radio_button_background_middle.xml │ │ │ │ │ ├── dk_radio_button_background_right.xml │ │ │ │ │ ├── dk_radio_button_checked_background.xml │ │ │ │ │ ├── dk_radio_button_checked_background_left.xml │ │ │ │ │ ├── dk_radio_button_checked_background_middle.xml │ │ │ │ │ ├── dk_radio_button_checked_background_right.xml │ │ │ │ │ ├── dk_radio_button_normal_background.xml │ │ │ │ │ ├── dk_radio_button_normal_background_left.xml │ │ │ │ │ ├── dk_radio_button_normal_background_middle.xml │ │ │ │ │ ├── dk_radio_button_normal_background_right.xml │ │ │ │ │ ├── dk_refresh_rotate_down.xml │ │ │ │ │ ├── dk_seekbar_style.xml │ │ │ │ │ ├── dk_setting_item_background.xml │ │ │ │ │ ├── dk_shape_float_view_bg.xml │ │ │ │ │ ├── dk_switch_background.xml │ │ │ │ │ ├── dk_time_counter_background.xml │ │ │ │ │ ├── dk_view_dot_connect.xml │ │ │ │ │ └── dk_web_door_history_item_background.xml │ │ │ │ ├── layout/ │ │ │ │ │ ├── dk_app_toast.xml │ │ │ │ │ ├── dk_brvah_quick_view_load_more.xml │ │ │ │ │ ├── dk_dialog_common.xml │ │ │ │ │ ├── dk_dialog_confirm.xml │ │ │ │ │ ├── dk_dialog_file_explorer_choose.xml │ │ │ │ │ ├── dk_dialog_tip.xml │ │ │ │ │ ├── dk_dialog_userinfo.xml │ │ │ │ │ ├── dk_dropdownmenu_tab_item.xml │ │ │ │ │ ├── dk_float_align_ruler_info.xml │ │ │ │ │ ├── dk_float_align_ruler_line.xml │ │ │ │ │ ├── dk_float_align_ruler_marker.xml │ │ │ │ │ ├── dk_float_color_picker.xml │ │ │ │ │ ├── dk_float_color_picker_info.xml │ │ │ │ │ ├── dk_float_count_down.xml │ │ │ │ │ ├── dk_float_h5_info.xml │ │ │ │ │ ├── dk_float_layout_level.xml │ │ │ │ │ ├── dk_float_lbs_route.xml │ │ │ │ │ ├── dk_float_log_info.xml │ │ │ │ │ ├── dk_float_network.xml │ │ │ │ │ ├── dk_float_perform_data.xml │ │ │ │ │ ├── dk_float_time_counter.xml │ │ │ │ │ ├── dk_float_ui_performance_display.xml │ │ │ │ │ ├── dk_float_ui_performance_info.xml │ │ │ │ │ ├── dk_float_view_check.xml │ │ │ │ │ ├── dk_float_view_check_draw.xml │ │ │ │ │ ├── dk_float_view_check_info.xml │ │ │ │ │ ├── dk_fragment_align_ruler_setting.xml │ │ │ │ │ ├── dk_fragment_app_start_info.xml │ │ │ │ │ ├── dk_fragment_block_list.xml │ │ │ │ │ ├── dk_fragment_block_monitor_index.xml │ │ │ │ │ ├── dk_fragment_color_picker_setting.xml │ │ │ │ │ ├── dk_fragment_comm_webview.xml │ │ │ │ │ ├── dk_fragment_cpu_cache_log.xml │ │ │ │ │ ├── dk_fragment_crash_capture_detail.xml │ │ │ │ │ ├── dk_fragment_crash_capture_main.xml │ │ │ │ │ ├── dk_fragment_crash_detail_info.xml │ │ │ │ │ ├── dk_fragment_data_clean.xml │ │ │ │ │ ├── dk_fragment_db_debug.xml │ │ │ │ │ ├── dk_fragment_db_detail.xml │ │ │ │ │ ├── dk_fragment_dokit_connect.xml │ │ │ │ │ ├── dk_fragment_dokit_for_web.xml │ │ │ │ │ ├── dk_fragment_file_explorer.xml │ │ │ │ │ ├── dk_fragment_file_manager_doc.xml │ │ │ │ │ ├── dk_fragment_health.xml │ │ │ │ │ ├── dk_fragment_health_child0.xml │ │ │ │ │ ├── dk_fragment_health_child1.xml │ │ │ │ │ ├── dk_fragment_image_detail.xml │ │ │ │ │ ├── dk_fragment_kit_manager.xml │ │ │ │ │ ├── dk_fragment_large_img_list.xml │ │ │ │ │ ├── dk_fragment_layout_border_setting.xml │ │ │ │ │ ├── dk_fragment_log_info_setting.xml │ │ │ │ │ ├── dk_fragment_method_cost.xml │ │ │ │ │ ├── dk_fragment_mock_template_preview.xml │ │ │ │ │ ├── dk_fragment_monitor_data_upload_page.xml │ │ │ │ │ ├── dk_fragment_monitor_pagedata.xml │ │ │ │ │ ├── dk_fragment_monitor_pagedata_item.xml │ │ │ │ │ ├── dk_fragment_monitor_pagedata_item_item.xml │ │ │ │ │ ├── dk_fragment_more.xml │ │ │ │ │ ├── dk_fragment_net_main_pager.xml │ │ │ │ │ ├── dk_fragment_net_mock.xml │ │ │ │ │ ├── dk_fragment_net_monitor.xml │ │ │ │ │ ├── dk_fragment_network_monitor_detail.xml │ │ │ │ │ ├── dk_fragment_network_monitor_list.xml │ │ │ │ │ ├── dk_fragment_network_summary_page.xml │ │ │ │ │ ├── dk_fragment_parameter.xml │ │ │ │ │ ├── dk_fragment_performance_large_picture_setting.xml │ │ │ │ │ ├── dk_fragment_simple_dokit_page.xml │ │ │ │ │ ├── dk_fragment_sp_show.xml │ │ │ │ │ ├── dk_fragment_sys_info.xml │ │ │ │ │ ├── dk_fragment_text_detail.xml │ │ │ │ │ ├── dk_fragment_third_lib_info.xml │ │ │ │ │ ├── dk_fragment_time_counter_index.xml │ │ │ │ │ ├── dk_fragment_time_counter_list.xml │ │ │ │ │ ├── dk_fragment_top_activity.xml │ │ │ │ │ ├── dk_fragment_video_play.xml │ │ │ │ │ ├── dk_fragment_view_check.xml │ │ │ │ │ ├── dk_fragment_weak_network.xml │ │ │ │ │ ├── dk_fragment_web_door.xml │ │ │ │ │ ├── dk_fragment_web_door_default.xml │ │ │ │ │ ├── dk_home_title_bar.xml │ │ │ │ │ ├── dk_item_bar_chart.xml │ │ │ │ │ ├── dk_item_block_list.xml │ │ │ │ │ ├── dk_item_connect_address.xml │ │ │ │ │ ├── dk_item_crash_history.xml │ │ │ │ │ ├── dk_item_data_clean.xml │ │ │ │ │ ├── dk_item_default_drop_down.xml │ │ │ │ │ ├── dk_item_file_info.xml │ │ │ │ │ ├── dk_item_group_exit.xml │ │ │ │ │ ├── dk_item_group_kit.xml │ │ │ │ │ ├── dk_item_group_kit_manager.xml │ │ │ │ │ ├── dk_item_group_mode.xml │ │ │ │ │ ├── dk_item_group_title.xml │ │ │ │ │ ├── dk_item_group_version.xml │ │ │ │ │ ├── dk_item_kit.xml │ │ │ │ │ ├── dk_item_large_img_list.xml │ │ │ │ │ ├── dk_item_layout_bottom_up_select_window.xml │ │ │ │ │ ├── dk_item_localstorage.xml │ │ │ │ │ ├── dk_item_log.xml │ │ │ │ │ ├── dk_item_more_content.xml │ │ │ │ │ ├── dk_item_more_header.xml │ │ │ │ │ ├── dk_item_network_list.xml │ │ │ │ │ ├── dk_item_performance_close.xml │ │ │ │ │ ├── dk_item_performance_detail.xml │ │ │ │ │ ├── dk_item_performance_wrap.xml │ │ │ │ │ ├── dk_item_setting.xml │ │ │ │ │ ├── dk_item_sp_input.xml │ │ │ │ │ ├── dk_item_sys_info.xml │ │ │ │ │ ├── dk_item_sys_title.xml │ │ │ │ │ ├── dk_item_text_content.xml │ │ │ │ │ ├── dk_item_third_lib_info.xml │ │ │ │ │ ├── dk_item_time_counter_list.xml │ │ │ │ │ ├── dk_item_tips_view.xml │ │ │ │ │ ├── dk_item_web_door_history.xml │ │ │ │ │ ├── dk_item_white_host.xml │ │ │ │ │ ├── dk_jsonviewer_layout_item_view.xml │ │ │ │ │ ├── dk_label_text_view.xml │ │ │ │ │ ├── dk_layout_localstorage_empty.xml │ │ │ │ │ ├── dk_layout_sessionstorage_empty.xml │ │ │ │ │ ├── dk_light_hint_layout.xml │ │ │ │ │ ├── dk_log_title_bar.xml │ │ │ │ │ ├── dk_main_launch_icon.xml │ │ │ │ │ ├── dk_mock_intercept_content_item.xml │ │ │ │ │ ├── dk_mock_template_content_item.xml │ │ │ │ │ ├── dk_mock_title_item.xml │ │ │ │ │ ├── dk_performance_close_wrap.xml │ │ │ │ │ ├── dk_performance_wrap.xml │ │ │ │ │ ├── dk_radio_button.xml │ │ │ │ │ ├── dk_radio_table_layout.xml │ │ │ │ │ ├── dk_radio_table_row.xml │ │ │ │ │ ├── dk_refresh_default_load_more.xml │ │ │ │ │ ├── dk_refresh_default_refresh_header.xml │ │ │ │ │ ├── dk_rv_empty_layout.xml │ │ │ │ │ ├── dk_rv_empty_layout2.xml │ │ │ │ │ ├── dk_title_bar.xml │ │ │ │ │ ├── dk_tool_panel.xml │ │ │ │ │ ├── dk_tool_panel_old.xml │ │ │ │ │ ├── dk_video_layout.xml │ │ │ │ │ ├── dk_view_line_chart.xml │ │ │ │ │ ├── dk_view_network_detail_pager_title.xml │ │ │ │ │ ├── dk_view_network_request.xml │ │ │ │ │ ├── dk_view_network_tab_layout.xml │ │ │ │ │ ├── dk_volume_hint_layout.xml │ │ │ │ │ ├── dk_zxing_activity_scanner.xml │ │ │ │ │ ├── kd_item_sp_input.xml │ │ │ │ │ └── layout_mock_pos_adjust.xml │ │ │ │ ├── values/ │ │ │ │ │ ├── attrs.xml │ │ │ │ │ ├── colors.xml │ │ │ │ │ ├── dimens.xml │ │ │ │ │ ├── font_sizes.xml │ │ │ │ │ ├── ids.xml │ │ │ │ │ ├── strings.xml │ │ │ │ │ └── styles.xml │ │ │ │ ├── values-en-rUS/ │ │ │ │ │ └── strings.xml │ │ │ │ ├── values-zh-rCN/ │ │ │ │ │ └── strings.xml │ │ │ │ ├── values-zh-rTW/ │ │ │ │ │ └── strings.xml │ │ │ │ └── xml/ │ │ │ │ ├── dokit_debug_provider_paths.xml │ │ │ │ └── dokit_network_config.xml │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── didichuxing/ │ │ │ └── doraemonkit/ │ │ │ ├── DokitTest.java │ │ │ └── kit/ │ │ │ └── connect/ │ │ │ ├── ByteParserTest.kt │ │ │ ├── WebSocketClientTest.kt │ │ │ └── WebSocketSessionTest.java │ │ └── upload.sh │ ├── dokit-autotest/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── proguard-rules.pro │ │ ├── src/ │ │ │ ├── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ ├── java/ │ │ │ │ │ └── com/ │ │ │ │ │ └── didichuxing/ │ │ │ │ │ └── doraemonkit/ │ │ │ │ │ └── kit/ │ │ │ │ │ └── autotest/ │ │ │ │ │ ├── AutoTestControlKit.kt │ │ │ │ │ ├── AutoTestManager.kt │ │ │ │ │ ├── AutoTestMessage.kt │ │ │ │ │ ├── AutoTestState.kt │ │ │ │ │ ├── DelayHandler.kt │ │ │ │ │ └── ui/ │ │ │ │ │ ├── AutotestPage.java │ │ │ │ │ ├── DoKitAutotestActivity.java │ │ │ │ │ ├── DoKitAutotestConnectFragment.kt │ │ │ │ │ ├── DoKitAutotestFragment.kt │ │ │ │ │ └── RecordingCaseDoKitView.kt │ │ │ │ └── res/ │ │ │ │ ├── drawable/ │ │ │ │ │ ├── dk_autotest_dialog_bg.xml │ │ │ │ │ ├── dk_autotest_flash_blue_bg.xml │ │ │ │ │ ├── dk_autotest_flash_green_bg.xml │ │ │ │ │ ├── dk_autotest_flash_red_bg.xml │ │ │ │ │ └── dk_btn_autotest_bg.xml │ │ │ │ ├── layout/ │ │ │ │ │ ├── dk_activity_autotest.xml │ │ │ │ │ ├── dk_autotest_view_recording_case.xml │ │ │ │ │ ├── dk_fragment_autotest_connect.xml │ │ │ │ │ └── dk_fragment_autotest_main.xml │ │ │ │ ├── values/ │ │ │ │ │ └── strings.xml │ │ │ │ ├── values-en-rCN/ │ │ │ │ │ └── strings.xml │ │ │ │ ├── values-zh-rTW/ │ │ │ │ │ └── strings.xml │ │ │ │ └── values-zh-rUS/ │ │ │ │ └── strings.xml │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── didichuxing/ │ │ │ └── doraemonkit/ │ │ │ └── kit/ │ │ │ └── autotest/ │ │ │ └── ExampleUnitTest.java │ │ └── upload.sh │ ├── dokit-ft/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── proguard-rules.pro │ │ ├── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── didichuxing/ │ │ │ │ └── doraemonkit/ │ │ │ │ └── kit/ │ │ │ │ └── filemanager/ │ │ │ │ ├── DokitFileRouter.kt │ │ │ │ ├── FileManagerUtil.kt │ │ │ │ ├── FileTransferFragment.kt │ │ │ │ ├── FileTransferKit.kt │ │ │ │ ├── HttpServer.kt │ │ │ │ ├── ability/ │ │ │ │ │ ├── DokitFtAbility.kt │ │ │ │ │ └── DokitFtModuleProcessor.kt │ │ │ │ ├── action/ │ │ │ │ │ ├── RequestErrorAction.kt │ │ │ │ │ ├── file/ │ │ │ │ │ │ ├── CreateFolderAction.kt │ │ │ │ │ │ ├── DeleteFileAction.kt │ │ │ │ │ │ ├── DeviceInfoAction.kt │ │ │ │ │ │ ├── FileDetailAction.kt │ │ │ │ │ │ ├── FileListAction.kt │ │ │ │ │ │ ├── IndexAction.kt │ │ │ │ │ │ ├── RenameFileAction.kt │ │ │ │ │ │ ├── SaveFileAction.kt │ │ │ │ │ │ └── UploadFileAction.kt │ │ │ │ │ └── sql/ │ │ │ │ │ └── DatabaseAction.kt │ │ │ │ ├── bean/ │ │ │ │ │ ├── DirInfo.kt │ │ │ │ │ ├── RenameFileInfo.kt │ │ │ │ │ └── SaveFileInfo.kt │ │ │ │ ├── convert/ │ │ │ │ │ └── GsonConverter.kt │ │ │ │ └── sqlite/ │ │ │ │ ├── DBManager.kt │ │ │ │ ├── bean/ │ │ │ │ │ ├── RowFiledInfo.kt │ │ │ │ │ ├── RowRequestInfo.kt │ │ │ │ │ └── TableFieldInfo.kt │ │ │ │ ├── dao/ │ │ │ │ │ ├── EncryptSQLiteDB.kt │ │ │ │ │ ├── NormalSQLiteDB.kt │ │ │ │ │ └── SQLiteDB.kt │ │ │ │ ├── factory/ │ │ │ │ │ ├── DBFactory.kt │ │ │ │ │ ├── EncryptDBFactory.kt │ │ │ │ │ └── NormalDBFactory.kt │ │ │ │ └── util/ │ │ │ │ └── DBUtil.kt │ │ │ └── res/ │ │ │ └── layout/ │ │ │ └── dk_fragment_file_transfer.xml │ │ └── upload.sh │ ├── dokit-gps-mock/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── consumer-rules.pro │ │ ├── gradle.properties │ │ ├── libs/ │ │ │ └── BaiduLBS_Android.jar │ │ ├── proguard-rules.pro │ │ └── src/ │ │ ├── androidTest/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── didichuxing/ │ │ │ └── doraemonkit/ │ │ │ └── ExampleInstrumentedTest.java │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── didichuxing/ │ │ │ │ └── doraemonkit/ │ │ │ │ └── gps_mock/ │ │ │ │ ├── ability/ │ │ │ │ │ ├── DokitFtAbility.kt │ │ │ │ │ └── DokitFtModuleProcessor.kt │ │ │ │ ├── common/ │ │ │ │ │ ├── BdMapRouteData.java │ │ │ │ │ └── Utils.java │ │ │ │ ├── gpsmock/ │ │ │ │ │ ├── BaseServiceHooker.kt │ │ │ │ │ ├── BinderHookHandler.java │ │ │ │ │ ├── CordTransformUtil.java │ │ │ │ │ ├── GpsMockFragment.java │ │ │ │ │ ├── GpsMockKit.kt │ │ │ │ │ ├── GpsMockManager.java │ │ │ │ │ ├── GpsMockProxyManager.kt │ │ │ │ │ ├── LocationBuilder.java │ │ │ │ │ ├── LocationHookHandler.java │ │ │ │ │ ├── LocationHooker.java │ │ │ │ │ ├── MethodHandler.kt │ │ │ │ │ ├── RouteMockThread.java │ │ │ │ │ ├── ServiceHookManager.kt │ │ │ │ │ ├── TelephonyHooker.java │ │ │ │ │ ├── TencentLocationImp.java │ │ │ │ │ └── WifiHooker.java │ │ │ │ ├── lbs/ │ │ │ │ │ ├── common/ │ │ │ │ │ │ ├── AMapDrivingRouteOverLay.java │ │ │ │ │ │ ├── AMapRouteOverlay.java │ │ │ │ │ │ ├── AMapUtil.kt │ │ │ │ │ │ ├── Constants.java │ │ │ │ │ │ └── LocInfo.java │ │ │ │ │ ├── manual/ │ │ │ │ │ │ ├── FloatGpsMockCache.java │ │ │ │ │ │ ├── GPSTools.java │ │ │ │ │ │ ├── PosAdjustKit.kt │ │ │ │ │ │ └── PosAdjustKitView.java │ │ │ │ │ ├── preset/ │ │ │ │ │ │ ├── FloatGpsPresetMockCache.java │ │ │ │ │ │ └── MockLocList.java │ │ │ │ │ └── route/ │ │ │ │ │ ├── AMapRealNavMockView.kt │ │ │ │ │ ├── FloatGpsRouteMockCache.java │ │ │ │ │ ├── NaviSettings.kt │ │ │ │ │ └── RealNavMockKit.kt │ │ │ │ ├── location/ │ │ │ │ │ └── GpsStatusUtil.java │ │ │ │ ├── map/ │ │ │ │ │ ├── AMapLocationChangedListenerProxy.java │ │ │ │ │ ├── AMapLocationClientProxy.java │ │ │ │ │ ├── AMapLocationListenerProxy.java │ │ │ │ │ ├── AMapLocationSourceProxy.java │ │ │ │ │ ├── AMapNaviListenerProxy.java │ │ │ │ │ ├── AMapNaviListenerProxyDelegate.java │ │ │ │ │ ├── AMapNaviListenerProxyNoOp.java │ │ │ │ │ ├── BDAbsLocationListenerProxy.java │ │ │ │ │ ├── BDLocationListenerProxy.java │ │ │ │ │ ├── BDLocationUtil.java │ │ │ │ │ ├── DMapLocationListener.kt │ │ │ │ │ ├── TencentLocationListenerProxy.java │ │ │ │ │ └── ThirdMapLocationListenerUtil.java │ │ │ │ ├── sysservicehook/ │ │ │ │ │ ├── ActivityMangerHooker.kt │ │ │ │ │ ├── ActivityTaskMangerHooker.kt │ │ │ │ │ ├── GetInstalledApplicationsMethodHandler.kt │ │ │ │ │ ├── PackageManagerHooker.kt │ │ │ │ │ └── StartActivityMethodHandler.kt │ │ │ │ └── widget/ │ │ │ │ ├── CustomDialogFragment.java │ │ │ │ ├── DrivingRouteOverlay.java │ │ │ │ ├── IDialogHelper.java │ │ │ │ ├── OverlayManager.java │ │ │ │ ├── PositionSelectDialogHelper.java │ │ │ │ ├── PositionSelectRecyclerAdapter.java │ │ │ │ ├── RouteMockDokitView.kt │ │ │ │ └── SeekRangeBar.java │ │ │ └── res/ │ │ │ ├── drawable/ │ │ │ │ ├── dk_bg_btn_round_rectangle.xml │ │ │ │ ├── dk_bg_custom_spinner.xml │ │ │ │ ├── dk_bg_dokitview_route_mock.xml │ │ │ │ ├── dk_bg_edt_hint.xml │ │ │ │ ├── dk_bg_gray_round_rectangle.xml │ │ │ │ ├── dk_bg_round_edt.xml │ │ │ │ ├── dk_icon_loc_circle_shape.xml │ │ │ │ ├── dk_seek_bar_background_shape.xml │ │ │ │ ├── dk_seek_bar_circle_indicator.xml │ │ │ │ └── dk_seek_bar_foreground_shape.xml │ │ │ ├── layout/ │ │ │ │ ├── dk_dokitview_route_mock.xml │ │ │ │ ├── dk_fragment_gps_mock.xml │ │ │ │ ├── dk_item_position_select.xml │ │ │ │ └── dk_position_select_dialog_fragment.xml │ │ │ ├── values/ │ │ │ │ ├── attrs.xml │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ └── strings.xml │ │ │ ├── values-en-rCN/ │ │ │ │ └── strings.xml │ │ │ ├── values-zh-rTW/ │ │ │ │ └── strings.xml │ │ │ ├── values-zh-rUS/ │ │ │ │ └── strings.xml │ │ │ └── xml/ │ │ │ └── gps_mock_root_scene.xml │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── didichuxing/ │ │ └── doraemonkit/ │ │ └── ExampleUnitTest.java │ ├── dokit-leakcanary/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── proguard-rules.pro │ │ ├── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── aidl/ │ │ │ │ └── com/ │ │ │ │ └── didichuxing/ │ │ │ │ └── doraemonkit/ │ │ │ │ └── aidl/ │ │ │ │ ├── IReceiverAidlInterface.aidl │ │ │ │ └── ISenderAidlInterface.aidl │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ ├── didichuxing/ │ │ │ │ │ └── doraemonkit/ │ │ │ │ │ ├── LeakCanaryManager.java │ │ │ │ │ ├── abridge/ │ │ │ │ │ │ ├── AbridgeCallBack.java │ │ │ │ │ │ ├── AbridgeManager.java │ │ │ │ │ │ ├── AbridgeMessengerCallBack.java │ │ │ │ │ │ ├── AbridgeMessengerManager.java │ │ │ │ │ │ ├── IBridge.java │ │ │ │ │ │ └── service/ │ │ │ │ │ │ ├── ABridgeService.java │ │ │ │ │ │ └── MessengerService.java │ │ │ │ │ └── kit/ │ │ │ │ │ └── leakcanary/ │ │ │ │ │ └── LeakCanaryKit.java │ │ │ │ └── squareup/ │ │ │ │ ├── haha/ │ │ │ │ │ └── perflib/ │ │ │ │ │ └── HahaSpy.java │ │ │ │ └── leakcanary/ │ │ │ │ ├── AbstractAnalysisResultService.java │ │ │ │ ├── ActivityRefWatcher.java │ │ │ │ ├── AnalysisResult.java │ │ │ │ ├── AnalyzedHeap.java │ │ │ │ ├── AnalyzerProgressListener.java │ │ │ │ ├── AndroidDebuggerControl.java │ │ │ │ ├── AndroidExcludedRefs.java │ │ │ │ ├── AndroidHeapDumper.java │ │ │ │ ├── AndroidReachabilityInspectors.java │ │ │ │ ├── AndroidRefWatcherBuilder.java │ │ │ │ ├── AndroidWatchExecutor.java │ │ │ │ ├── CanaryLog.java │ │ │ │ ├── DebuggerControl.java │ │ │ │ ├── DefaultLeakDirectoryProvider.java │ │ │ │ ├── DisplayLeakService.java │ │ │ │ ├── ExcludedRefs.java │ │ │ │ ├── Exclusion.java │ │ │ │ ├── FailTestOnLeakRunListener.java │ │ │ │ ├── GcTrigger.java │ │ │ │ ├── HahaHelper.java │ │ │ │ ├── HeapAnalyzer.java │ │ │ │ ├── HeapDump.java │ │ │ │ ├── HeapDumper.java │ │ │ │ ├── InstrumentationLeakDetector.java │ │ │ │ ├── InstrumentationLeakResults.java │ │ │ │ ├── KeyedWeakReference.java │ │ │ │ ├── LeakCanary.java │ │ │ │ ├── LeakDirectoryProvider.java │ │ │ │ ├── LeakNode.java │ │ │ │ ├── LeakReference.java │ │ │ │ ├── LeakTrace.java │ │ │ │ ├── LeakTraceElement.java │ │ │ │ ├── Preconditions.java │ │ │ │ ├── Reachability.java │ │ │ │ ├── RefWatcher.java │ │ │ │ ├── RefWatcherBuilder.java │ │ │ │ ├── Retryable.java │ │ │ │ ├── ServiceHeapDumpListener.java │ │ │ │ ├── ShortestPathFinder.java │ │ │ │ ├── TrackedReference.java │ │ │ │ ├── UploadLeakService.java │ │ │ │ ├── WatchExecutor.java │ │ │ │ └── internal/ │ │ │ │ ├── ActivityLifecycleCallbacksAdapter.java │ │ │ │ ├── AndroidOFragmentRefWatcher.java │ │ │ │ ├── DisplayLeakActivity.java │ │ │ │ ├── DisplayLeakAdapter.java │ │ │ │ ├── DisplayLeakConnectorView.java │ │ │ │ ├── ForegroundService.java │ │ │ │ ├── FragmentRefWatcher.java │ │ │ │ ├── FutureResult.java │ │ │ │ ├── HeapAnalyzerService.java │ │ │ │ ├── LeakCanaryFileProvider.java │ │ │ │ ├── LeakCanaryInternals.java │ │ │ │ ├── LeakCanarySingleThreadFactory.java │ │ │ │ ├── MoreDetailsView.java │ │ │ │ ├── RequestStoragePermissionActivity.java │ │ │ │ ├── RowElementLayout.java │ │ │ │ ├── SquigglySpan.java │ │ │ │ └── SupportFragmentRefWatcher.java │ │ │ └── res/ │ │ │ ├── drawable/ │ │ │ │ ├── leak_canary_icon_foreground.xml │ │ │ │ └── leak_canary_toast_background.xml │ │ │ ├── layout/ │ │ │ │ ├── leak_canary_display_leak.xml │ │ │ │ ├── leak_canary_heap_dump_toast.xml │ │ │ │ ├── leak_canary_leak_row.xml │ │ │ │ ├── leak_canary_ref_row.xml │ │ │ │ └── leak_canary_ref_top_row.xml │ │ │ ├── values/ │ │ │ │ ├── leak_canary_attrs.xml │ │ │ │ ├── leak_canary_colors.xml │ │ │ │ ├── leak_canary_dimens.xml │ │ │ │ ├── leak_canary_icon_background.xml │ │ │ │ ├── leak_canary_public.xml │ │ │ │ ├── leak_canary_strings.xml │ │ │ │ ├── leak_canary_themes.xml │ │ │ │ └── strings.xml │ │ │ └── xml/ │ │ │ └── leak_canary_file_paths.xml │ │ └── upload.sh │ ├── dokit-mc/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── proguard-rules.pro │ │ ├── src/ │ │ │ ├── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ ├── java/ │ │ │ │ │ └── com/ │ │ │ │ │ └── didichuxing/ │ │ │ │ │ └── doraemonkit/ │ │ │ │ │ └── kit/ │ │ │ │ │ └── mc/ │ │ │ │ │ ├── AbstractMultiController.kt │ │ │ │ │ ├── ClientMultiController.kt │ │ │ │ │ ├── DelayHandler.kt │ │ │ │ │ ├── HostMultiController.kt │ │ │ │ │ ├── MultiControlConfig.kt │ │ │ │ │ ├── MultiControlKit.kt │ │ │ │ │ ├── MultiControlKitTest.kt │ │ │ │ │ ├── MultiControlManager.kt │ │ │ │ │ ├── OnMultiControlModeChangeListener.kt │ │ │ │ │ ├── ability/ │ │ │ │ │ │ ├── DoKitMcAbility.kt │ │ │ │ │ │ └── DoKitMcModuleProcessor.kt │ │ │ │ │ ├── net/ │ │ │ │ │ │ ├── ConnectMode.kt │ │ │ │ │ │ ├── DoKitMcClient.kt │ │ │ │ │ │ ├── DoKitMcHostServer.kt │ │ │ │ │ │ ├── DokitMcConnectManager.kt │ │ │ │ │ │ ├── WSEventProcessor.kt │ │ │ │ │ │ ├── WSSRouter.kt │ │ │ │ │ │ └── WSServerProcessor.kt │ │ │ │ │ ├── oldui/ │ │ │ │ │ │ ├── DoKitMcManager.kt │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ ├── ClientDoKitView.kt │ │ │ │ │ │ │ ├── DoKitMcClientFragment.kt │ │ │ │ │ │ │ └── DoKitMcClientHistoryFragment.kt │ │ │ │ │ │ ├── host/ │ │ │ │ │ │ │ ├── DoKitMcHostFragment.kt │ │ │ │ │ │ │ └── HostDoKitView.kt │ │ │ │ │ │ ├── main/ │ │ │ │ │ │ │ └── DoKitMcMainFragment.kt │ │ │ │ │ │ └── record/ │ │ │ │ │ │ ├── DoKitMcDatasFragment.kt │ │ │ │ │ │ └── RecordingDoKitView.kt │ │ │ │ │ ├── report/ │ │ │ │ │ │ ├── MCRecordManager.kt │ │ │ │ │ │ ├── RecordActionCase.kt │ │ │ │ │ │ ├── RecordActionStep.kt │ │ │ │ │ │ ├── RecordData.kt │ │ │ │ │ │ └── ScreenShotManager.java │ │ │ │ │ ├── ui/ │ │ │ │ │ │ ├── BorderDoKitView.java │ │ │ │ │ │ ├── DoKitMcActivity.kt │ │ │ │ │ │ ├── DoKitMcScanActivity.kt │ │ │ │ │ │ ├── McDialogDoKitView.kt │ │ │ │ │ │ ├── McPages.kt │ │ │ │ │ │ ├── adapter/ │ │ │ │ │ │ │ ├── McCaseInfoDialogProvider.kt │ │ │ │ │ │ │ ├── McCaseListAdapter.kt │ │ │ │ │ │ │ └── McClientHistoryAdapter.kt │ │ │ │ │ │ └── connect/ │ │ │ │ │ │ ├── MultiControlAllFragment.kt │ │ │ │ │ │ └── MultiControlDoKitView.kt │ │ │ │ │ └── utils/ │ │ │ │ │ ├── ActivityStatusUtil.kt │ │ │ │ │ ├── ClientHistoryUtils.kt │ │ │ │ │ ├── CodeUtils.kt │ │ │ │ │ ├── ConnectHistoryUtils.kt │ │ │ │ │ ├── DensityUtils.kt │ │ │ │ │ ├── McCaseUtils.kt │ │ │ │ │ ├── McPageUtils.kt │ │ │ │ │ └── WSPackageUtils.kt │ │ │ │ └── res/ │ │ │ │ ├── drawable/ │ │ │ │ │ ├── dk_btn_mc_bg.xml │ │ │ │ │ ├── dk_dokitview_mc.xml │ │ │ │ │ ├── dk_dokitview_mc_connect.xml │ │ │ │ │ └── dk_dokitview_mc_recoding.xml │ │ │ │ ├── layout/ │ │ │ │ │ ├── dk_activity_mc.xml │ │ │ │ │ ├── dk_dialog_mc_case_info.xml │ │ │ │ │ ├── dk_dokitview_client.xml │ │ │ │ │ ├── dk_dokitview_connect.xml │ │ │ │ │ ├── dk_dokitview_dialog.xml │ │ │ │ │ ├── dk_dokitview_host.xml │ │ │ │ │ ├── dk_dokitview_recording.xml │ │ │ │ │ ├── dk_fragment_mc_client.xml │ │ │ │ │ ├── dk_fragment_mc_client_history.xml │ │ │ │ │ ├── dk_fragment_mc_connect.xml │ │ │ │ │ ├── dk_fragment_mc_connect_history.xml │ │ │ │ │ ├── dk_fragment_mc_datas.xml │ │ │ │ │ ├── dk_fragment_mc_host.xml │ │ │ │ │ ├── dk_fragment_mc_select.xml │ │ │ │ │ ├── dk_item_mc_case.xml │ │ │ │ │ └── dk_item_mc_client.xml │ │ │ │ ├── values/ │ │ │ │ │ └── strings.xml │ │ │ │ ├── values-en-rCN/ │ │ │ │ │ └── strings.xml │ │ │ │ ├── values-zh-rTW/ │ │ │ │ │ └── strings.xml │ │ │ │ ├── values-zh-rUS/ │ │ │ │ │ └── strings.xml │ │ │ │ └── xml/ │ │ │ │ └── mc_accessibity_config.xml │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── didichuxing/ │ │ │ └── doraemonkit/ │ │ │ └── ExampleUnitTest.kt │ │ └── upload.sh │ ├── dokit-no-op/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── proguard-rules.pro │ │ ├── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── didichuxing/ │ │ │ └── doraemonkit/ │ │ │ ├── DoKit.kt │ │ │ ├── DoKitCallBack.kt │ │ │ ├── DoKitMCHummerHelper.java │ │ │ ├── DoraemonKit.kt │ │ │ ├── kit/ │ │ │ │ ├── AbstractKit.kt │ │ │ │ ├── Category.java │ │ │ │ ├── IKit.kt │ │ │ │ ├── core/ │ │ │ │ │ ├── AbsDokitFragment.kt │ │ │ │ │ ├── AbsDokitView.kt │ │ │ │ │ ├── BaseFragment.kt │ │ │ │ │ ├── DokitFrameLayout.java │ │ │ │ │ ├── DokitIntent.kt │ │ │ │ │ ├── DokitView.java │ │ │ │ │ ├── DokitViewInterface.java │ │ │ │ │ ├── DokitViewLayoutParams.java │ │ │ │ │ ├── DokitViewManager.kt │ │ │ │ │ ├── DokitViewManagerInterface.kt │ │ │ │ │ ├── McClientProcessor.kt │ │ │ │ │ └── TouchProxy.java │ │ │ │ ├── network/ │ │ │ │ │ ├── bean/ │ │ │ │ │ │ ├── NetworkRecord.java │ │ │ │ │ │ ├── Request.java │ │ │ │ │ │ └── Response.java │ │ │ │ │ └── okhttp/ │ │ │ │ │ └── interceptor/ │ │ │ │ │ └── DokitExtInterceptor.kt │ │ │ │ ├── performance/ │ │ │ │ │ └── PerformanceValueListener.kt │ │ │ │ ├── test/ │ │ │ │ │ ├── DoKitTestManager.kt │ │ │ │ │ └── TestMode.kt │ │ │ │ └── webdoor/ │ │ │ │ └── WebDoorManager.java │ │ │ └── tcp/ │ │ │ └── ability/ │ │ │ ├── MessageReceiverHook.java │ │ │ ├── MessageSenderHook.java │ │ │ └── TcpMessageHook.java │ │ └── upload.sh │ ├── dokit-okhttp-api/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── proguard-rules.pro │ │ ├── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── didichuxing/ │ │ │ └── doraemonkit/ │ │ │ └── okhttp_api/ │ │ │ └── OkHttpWrap.kt │ │ └── upload.sh │ ├── dokit-okhttp-v3/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── proguard-rules.pro │ │ ├── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── didichuxing/ │ │ │ └── doraemonkit/ │ │ │ └── okhttp_api/ │ │ │ ├── ByteCountBufferedSinkV3.java │ │ │ └── OkHttpWrapV3.kt │ │ └── upload.sh │ ├── dokit-okhttp-v4/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── proguard-rules.pro │ │ ├── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── didichuxing/ │ │ │ └── doraemonkit/ │ │ │ └── okhttp_api/ │ │ │ ├── ByteCountBufferedSinkV4.java │ │ │ └── OkHttpWrapV4.kt │ │ └── upload.sh │ ├── dokit-plugin/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── src/ │ │ │ └── main/ │ │ │ ├── kotlin/ │ │ │ │ └── com/ │ │ │ │ └── didichuxing/ │ │ │ │ └── doraemonkit/ │ │ │ │ └── plugin/ │ │ │ │ ├── DoKitExt.kt │ │ │ │ ├── DoKitExtUtil.kt │ │ │ │ ├── DoKitPlugin.kt │ │ │ │ ├── DoKitPluginUtil.kt │ │ │ │ ├── DoKitTransformTaskExecutionListener.kt │ │ │ │ ├── extension/ │ │ │ │ │ ├── BigImageExtension.kt │ │ │ │ │ ├── DoKitExtension.kt │ │ │ │ │ ├── GpsExtension.kt │ │ │ │ │ ├── NetworkExtension.kt │ │ │ │ │ ├── SlowMethodExtension.kt │ │ │ │ │ └── WebViewExtension.kt │ │ │ │ ├── processor/ │ │ │ │ │ ├── DoKitComponentHandler.kt │ │ │ │ │ └── DoKitPluginConfigProcessor.kt │ │ │ │ ├── stack_method/ │ │ │ │ │ ├── MethodStackNode.kt │ │ │ │ │ └── MethodStackNodeUtil.kt │ │ │ │ ├── thirdlib/ │ │ │ │ │ ├── ThirdLibInfo.kt │ │ │ │ │ └── ThirdLibVariantProcessor.kt │ │ │ │ └── transform/ │ │ │ │ ├── DoKitBaseTransform.kt │ │ │ │ ├── DoKitCommonTransform.kt │ │ │ │ ├── DoKitCommonTransformV34.kt │ │ │ │ ├── DoKitDependTransform.kt │ │ │ │ ├── DoKitDependTransformV34.kt │ │ │ │ ├── DoKitTransformContext.kt │ │ │ │ ├── DoKitTransformInvocation.kt │ │ │ │ ├── asmtransform/ │ │ │ │ │ ├── BaseDoKitAsmTransformer.kt │ │ │ │ │ └── DoKitAsmTransformer.kt │ │ │ │ └── classtransform/ │ │ │ │ ├── AbsClassTransformer.kt │ │ │ │ ├── BigImgClassTransformer.kt │ │ │ │ ├── CommClassTransformer.kt │ │ │ │ ├── EnterMSClassTransformer.kt │ │ │ │ ├── GPSAMapClassTransformer.kt │ │ │ │ ├── GPSBDClassTransformer.kt │ │ │ │ ├── GPSClassTransformer.kt │ │ │ │ ├── GPSTencentClassTransformer.kt │ │ │ │ ├── GSMClassTransformer.kt │ │ │ │ ├── MSDClassTransformer.kt │ │ │ │ ├── Okhttp3ClassTransformer.kt │ │ │ │ ├── ThirdLibsClassTransformer.kt │ │ │ │ ├── UrlConnectionTransformer.kt │ │ │ │ └── WebViewClassTransformer.kt │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── gradle-plugins/ │ │ │ └── com.didi.dokit.properties │ │ └── upload.sh │ ├── dokit-pthread-hook/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── consumer-rules.pro │ │ ├── gradle.properties │ │ ├── proguard-rules.pro │ │ └── src/ │ │ ├── androidTest/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── kronos/ │ │ │ └── dokit/ │ │ │ └── pthread/ │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── kronos/ │ │ │ │ └── dokit/ │ │ │ │ └── pthread/ │ │ │ │ ├── AutoDumpListener.kt │ │ │ │ ├── PThreadDumpHelper.kt │ │ │ │ ├── PThreadEntity.kt │ │ │ │ ├── PThreadKit.kt │ │ │ │ ├── ViewExtensions.kt │ │ │ │ └── ui/ │ │ │ │ ├── PThreadHookUiActivity.kt │ │ │ │ └── ThreadAdapter.kt │ │ │ └── res/ │ │ │ ├── layout/ │ │ │ │ ├── activity_pthread_hook.xml │ │ │ │ └── recycler_view_thread_hook.xml │ │ │ └── values/ │ │ │ └── values.xml │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── kronos/ │ │ └── dokit/ │ │ └── pthread/ │ │ └── ExampleUnitTest.kt │ ├── dokit-test/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── consumer-rules.pro │ │ ├── gradle.properties │ │ ├── proguard-rules.pro │ │ ├── src/ │ │ │ ├── main/ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java/ │ │ │ │ └── com/ │ │ │ │ └── didichuxing/ │ │ │ │ └── doraemonkit/ │ │ │ │ └── kit/ │ │ │ │ └── test/ │ │ │ │ ├── DoKitTestManager.kt │ │ │ │ ├── OnTestModeChangeListener.kt │ │ │ │ ├── TestMode.kt │ │ │ │ ├── event/ │ │ │ │ │ ├── AccessibilityEventNode.kt │ │ │ │ │ ├── ActionType.kt │ │ │ │ │ ├── ControlEvent.kt │ │ │ │ │ ├── ControlEventManager.kt │ │ │ │ │ ├── ControlEventProcessor.kt │ │ │ │ │ ├── DoKitViewNode.kt │ │ │ │ │ ├── DoKitViewPanelNode.kt │ │ │ │ │ ├── EventErrorCode.kt │ │ │ │ │ ├── EventType.kt │ │ │ │ │ ├── OnControlEventActionListener.kt │ │ │ │ │ ├── OnControlEventActionProcessListener.kt │ │ │ │ │ ├── OnControlEventInterceptor.kt │ │ │ │ │ ├── Position.kt │ │ │ │ │ ├── SystemViewNode.kt │ │ │ │ │ ├── ViewC12c.kt │ │ │ │ │ ├── WindowNode.kt │ │ │ │ │ ├── monitor/ │ │ │ │ │ │ ├── AccessibilityEventMonitor.kt │ │ │ │ │ │ ├── CustomEventMonitor.kt │ │ │ │ │ │ ├── LifecycleEventMonitor.kt │ │ │ │ │ │ └── TcpMessageEventMonitor.kt │ │ │ │ │ └── processor/ │ │ │ │ │ ├── AbstractEventProcessor.kt │ │ │ │ │ ├── AccessibilityEventProcessor.kt │ │ │ │ │ ├── CustomEventProcessor.kt │ │ │ │ │ ├── LifecycleEventProcessor.kt │ │ │ │ │ └── TcpMessageEventProcessor.kt │ │ │ │ ├── hook/ │ │ │ │ │ ├── AccessibilityGetInstanceMethodHook.kt │ │ │ │ │ ├── ViewOnClickListenerEventHook.kt │ │ │ │ │ ├── ViewOnClickListenerProxy.kt │ │ │ │ │ └── ViewOnInitializeAccessibilityEventHook.kt │ │ │ │ ├── mock/ │ │ │ │ │ ├── HttpMockInterceptor.kt │ │ │ │ │ ├── MockManager.kt │ │ │ │ │ ├── OnHttpProxyMockDataListener.kt │ │ │ │ │ ├── OnHttpProxyMockSendListener.kt │ │ │ │ │ ├── ProxyMockCallback.kt │ │ │ │ │ ├── data/ │ │ │ │ │ │ ├── AppInfo.kt │ │ │ │ │ │ ├── CaseInfo.kt │ │ │ │ │ │ ├── HostInfo.kt │ │ │ │ │ │ ├── HttpMatchedInfo.kt │ │ │ │ │ │ ├── HttpUploadInfo.kt │ │ │ │ │ │ ├── McCaseInfo.kt │ │ │ │ │ │ ├── McConfigInfo.kt │ │ │ │ │ │ ├── McMockKey.kt │ │ │ │ │ │ └── McResInfo.kt │ │ │ │ │ ├── http/ │ │ │ │ │ │ ├── DoKitMockInterceptor.kt │ │ │ │ │ │ ├── DoKitProxyMockInterceptor.kt │ │ │ │ │ │ └── HttpMockServer.kt │ │ │ │ │ ├── proxy/ │ │ │ │ │ │ ├── ProxyCallback.kt │ │ │ │ │ │ ├── ProxyMockManager.kt │ │ │ │ │ │ ├── ProxyMockUtils.kt │ │ │ │ │ │ ├── ProxyQueryData.java │ │ │ │ │ │ ├── ProxyRequest.kt │ │ │ │ │ │ └── ProxyResponse.kt │ │ │ │ │ └── tcp/ │ │ │ │ │ ├── TcpMockManager.kt │ │ │ │ │ └── TcpMockMessageProcessor.kt │ │ │ │ ├── report/ │ │ │ │ │ ├── AutoTestMessage.kt │ │ │ │ │ ├── AutoTestState.kt │ │ │ │ │ ├── FileUploadManager.kt │ │ │ │ │ ├── MCRecordManager.kt │ │ │ │ │ ├── MyWindowBitmap.kt │ │ │ │ │ ├── RecordActionCase.kt │ │ │ │ │ ├── RecordActionStep.kt │ │ │ │ │ ├── RecordData.kt │ │ │ │ │ └── ScreenShotManager.java │ │ │ │ ├── utils/ │ │ │ │ │ ├── DateTime.kt │ │ │ │ │ ├── RandomIdentityUtil.kt │ │ │ │ │ ├── ReflectHookUtil.java │ │ │ │ │ ├── ViewPathUtil.kt │ │ │ │ │ ├── WindowPathUtil.java │ │ │ │ │ └── XposedHookUtil.kt │ │ │ │ └── widget/ │ │ │ │ ├── FlashImageView.kt │ │ │ │ └── FlashTextView.kt │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── didichuxing/ │ │ │ └── doraemonkit/ │ │ │ └── kit/ │ │ │ └── test/ │ │ │ └── ExampleUnitTest.java │ │ └── upload.sh │ ├── dokit-util/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── proguard-rules.pro │ │ ├── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── didichuxing/ │ │ │ │ └── doraemonkit/ │ │ │ │ ├── constant/ │ │ │ │ │ ├── CacheConstants.java │ │ │ │ │ ├── MemoryConstants.java │ │ │ │ │ ├── PermissionConstants.java │ │ │ │ │ ├── RegexConstants.java │ │ │ │ │ └── TimeConstants.java │ │ │ │ └── util/ │ │ │ │ ├── ActivityUtils.java │ │ │ │ ├── AdaptScreenUtils.java │ │ │ │ ├── ApiUtils.java │ │ │ │ ├── AppStoreUtils.java │ │ │ │ ├── AppUtils.java │ │ │ │ ├── ArrayUtils.java │ │ │ │ ├── BarUtils.java │ │ │ │ ├── BatteryUtils.java │ │ │ │ ├── BitUtils.java │ │ │ │ ├── BrightnessUtils.java │ │ │ │ ├── BusUtils.java │ │ │ │ ├── CacheDiskStaticUtils.java │ │ │ │ ├── CacheDiskUtils.java │ │ │ │ ├── CacheDoubleStaticUtils.java │ │ │ │ ├── CacheDoubleUtils.java │ │ │ │ ├── CacheMemoryStaticUtils.java │ │ │ │ ├── CacheMemoryUtils.java │ │ │ │ ├── CameraUtils.java │ │ │ │ ├── CleanUtils.java │ │ │ │ ├── ClickUtils.java │ │ │ │ ├── ClipboardUtils.java │ │ │ │ ├── CloneUtils.java │ │ │ │ ├── CloseUtils.java │ │ │ │ ├── CollectionUtils.java │ │ │ │ ├── ColorUtils.java │ │ │ │ ├── ConvertUtils.java │ │ │ │ ├── CoordinateUtils.java │ │ │ │ ├── CountryUtils.java │ │ │ │ ├── CrashUtils.java │ │ │ │ ├── DangerousUtils.java │ │ │ │ ├── DebouncingUtils.java │ │ │ │ ├── DeviceUtils.java │ │ │ │ ├── DialogUtils.java │ │ │ │ ├── EncodeUtils.java │ │ │ │ ├── EncryptUtils.java │ │ │ │ ├── FileIOUtils.java │ │ │ │ ├── FileUtils.java │ │ │ │ ├── FlashlightUtils.java │ │ │ │ ├── FragmentUtils.java │ │ │ │ ├── GlideUtils.java │ │ │ │ ├── GsonUtils.java │ │ │ │ ├── HttpsUtil.java │ │ │ │ ├── ImageUtils.java │ │ │ │ ├── IntentUtils.java │ │ │ │ ├── JsonUtils.java │ │ │ │ ├── KeyboardUtils.java │ │ │ │ ├── LanguageUtils.java │ │ │ │ ├── LocationUtils.java │ │ │ │ ├── LogUtils.java │ │ │ │ ├── LunarUtils.java │ │ │ │ ├── MapUtils.java │ │ │ │ ├── MessengerUtils.java │ │ │ │ ├── MetaDataUtils.java │ │ │ │ ├── NetworkUtils.java │ │ │ │ ├── NotificationUtils.java │ │ │ │ ├── NumberUtils.java │ │ │ │ ├── ObjectUtils.java │ │ │ │ ├── PathUtils.java │ │ │ │ ├── PermissionUtils.java │ │ │ │ ├── PhoneUtils.java │ │ │ │ ├── PinyinUtils.java │ │ │ │ ├── ProcessUtils.java │ │ │ │ ├── RandomUtils.java │ │ │ │ ├── ReflectUtils.java │ │ │ │ ├── RegexUtils.java │ │ │ │ ├── ResourceUtils.java │ │ │ │ ├── RetrofitUtils.java │ │ │ │ ├── RomUtils.java │ │ │ │ ├── SDCardUtils.java │ │ │ │ ├── SPStaticUtils.java │ │ │ │ ├── SPUtils.java │ │ │ │ ├── ScreenUtils.java │ │ │ │ ├── ServiceUtils.java │ │ │ │ ├── ShadowUtils.java │ │ │ │ ├── ShellUtils.java │ │ │ │ ├── SizeUtils.java │ │ │ │ ├── SnackbarUtils.java │ │ │ │ ├── SpanUtils.java │ │ │ │ ├── StringUtils.java │ │ │ │ ├── TemperatureUtils.java │ │ │ │ ├── ThreadUtils.java │ │ │ │ ├── ThrowableUtils.java │ │ │ │ ├── TimeUtils.java │ │ │ │ ├── ToastUtils.java │ │ │ │ ├── TouchUtils.java │ │ │ │ ├── UiMessageUtils.java │ │ │ │ ├── UriUtils.java │ │ │ │ ├── Utils.java │ │ │ │ ├── UtilsActivityLifecycleImpl.java │ │ │ │ ├── UtilsBridge.java │ │ │ │ ├── UtilsFileProvider.java │ │ │ │ ├── UtilsTransActivity.java │ │ │ │ ├── UtilsTransActivity4MainProcess.java │ │ │ │ ├── VibrateUtils.java │ │ │ │ ├── ViewUtils.java │ │ │ │ ├── VolumeUtils.java │ │ │ │ └── ZipUtils.java │ │ │ └── res/ │ │ │ ├── drawable/ │ │ │ │ └── utils_toast_bg.xml │ │ │ ├── layout/ │ │ │ │ └── utils_toast_view.xml │ │ │ ├── values/ │ │ │ │ └── styles.xml │ │ │ ├── values-v21/ │ │ │ │ └── styles.xml │ │ │ └── xml/ │ │ │ └── util_code_provider_paths.xml │ │ └── upload.sh │ ├── dokit-weex/ │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── proguard-rules.pro │ │ ├── src/ │ │ │ └── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── didichuxing/ │ │ │ │ └── doraemonkit/ │ │ │ │ └── weex/ │ │ │ │ ├── common/ │ │ │ │ │ └── DKCommonActivity.java │ │ │ │ ├── devtool/ │ │ │ │ │ ├── DevToolActivity.java │ │ │ │ │ ├── DevToolScanActivity.java │ │ │ │ │ └── WeexDevToolKit.kt │ │ │ │ ├── info/ │ │ │ │ │ ├── WeexInfo.java │ │ │ │ │ ├── WeexInfoAdapter.java │ │ │ │ │ ├── WeexInfoFragment.java │ │ │ │ │ ├── WeexInfoHacker.java │ │ │ │ │ └── WeexInfoKit.kt │ │ │ │ ├── log/ │ │ │ │ │ ├── WeexLogInfoDoKitView.java │ │ │ │ │ └── WeexLogKit.kt │ │ │ │ └── storage/ │ │ │ │ ├── StorageAdapter.java │ │ │ │ ├── StorageDialogFragment.java │ │ │ │ ├── StorageFragment.java │ │ │ │ ├── StorageHacker.java │ │ │ │ ├── StorageInfo.java │ │ │ │ └── WeexStorageKit.kt │ │ │ └── res/ │ │ │ ├── layout/ │ │ │ │ ├── dk_fragment_info.xml │ │ │ │ ├── dk_fragment_info_item.xml │ │ │ │ ├── dk_fragment_storage.xml │ │ │ │ ├── dk_item_storage_dialog.xml │ │ │ │ ├── dk_item_storage_watch.xml │ │ │ │ └── dk_weex_float_log_info.xml │ │ │ ├── values/ │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ ├── values-en-rUS/ │ │ │ │ └── strings.xml │ │ │ ├── values-zh-rCN/ │ │ │ │ └── strings.xml │ │ │ └── values-zh-rTW/ │ │ │ └── strings.xml │ │ └── upload.sh │ ├── dokit_module.json │ ├── gradle/ │ │ └── wrapper/ │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradle.properties │ ├── gradlew │ ├── gradlew.bat │ ├── settings.gradle │ ├── upload.gradle │ ├── upload_didi.sh │ ├── upload_local.sh │ ├── upload_maven.sh │ ├── upload_maven_central.gradle │ └── upload_private.gradle ├── CODE_OF_CONDUCT.md ├── CODE_OF_CONDUCT.zh-cn.md ├── CONTRIBUTING.md ├── Doc/ │ ├── android-ReleaseNotes.md │ ├── iOS-ReleaseNotes.md │ ├── iOS_cn_guide.md │ ├── iOS_en_guide.md │ ├── miniapp-ReleaseNotes.md │ └── miniapp_cn_guide.md ├── DoraemonKit.podspec ├── Flutter/ │ ├── .gitignore │ ├── .metadata │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── analysis_options.yaml │ ├── example/ │ │ ├── .gitignore │ │ ├── .metadata │ │ ├── LICENSE │ │ ├── android/ │ │ │ ├── .gitignore │ │ │ ├── app/ │ │ │ │ ├── build.gradle │ │ │ │ └── src/ │ │ │ │ ├── debug/ │ │ │ │ │ └── AndroidManifest.xml │ │ │ │ ├── main/ │ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ │ ├── kotlin/ │ │ │ │ │ │ └── com/ │ │ │ │ │ │ └── linjizong/ │ │ │ │ │ │ └── flutter_app/ │ │ │ │ │ │ └── MainActivity.kt │ │ │ │ │ └── res/ │ │ │ │ │ ├── drawable/ │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ └── values/ │ │ │ │ │ └── styles.xml │ │ │ │ └── profile/ │ │ │ │ └── AndroidManifest.xml │ │ │ ├── build.gradle │ │ │ ├── gradle/ │ │ │ │ └── wrapper/ │ │ │ │ └── gradle-wrapper.properties │ │ │ ├── gradle.properties │ │ │ └── settings.gradle │ │ ├── ios/ │ │ │ ├── .gitignore │ │ │ ├── Flutter/ │ │ │ │ ├── .last_build_id │ │ │ │ ├── AppFrameworkInfo.plist │ │ │ │ ├── Debug.xcconfig │ │ │ │ └── Release.xcconfig │ │ │ ├── Podfile │ │ │ ├── Runner/ │ │ │ │ ├── AppDelegate.h │ │ │ │ ├── AppDelegate.m │ │ │ │ ├── Assets.xcassets/ │ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── LaunchImage.imageset/ │ │ │ │ │ ├── Contents.json │ │ │ │ │ └── README.md │ │ │ │ ├── Base.lproj/ │ │ │ │ │ ├── LaunchScreen.storyboard │ │ │ │ │ └── Main.storyboard │ │ │ │ ├── Info.plist │ │ │ │ ├── Runner-Bridging-Header.h │ │ │ │ └── main.m │ │ │ ├── Runner.xcodeproj/ │ │ │ │ ├── project.pbxproj │ │ │ │ ├── project.xcworkspace/ │ │ │ │ │ └── xcshareddata/ │ │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ │ └── xcshareddata/ │ │ │ │ └── xcschemes/ │ │ │ │ └── Runner.xcscheme │ │ │ └── Runner.xcworkspace/ │ │ │ └── xcshareddata/ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ │ ├── lib/ │ │ │ ├── main.dart │ │ │ └── page2.dart │ │ ├── local.properties │ │ ├── pubspec.yaml │ │ └── test/ │ │ └── dokit_library_test.dart │ ├── flutterw │ ├── lib/ │ │ ├── dokit.dart │ │ ├── engine/ │ │ │ ├── dokit_binding.dart │ │ │ └── dokit_http.dart │ │ ├── kit/ │ │ │ ├── apm/ │ │ │ │ ├── apm.dart │ │ │ │ ├── fps_kit.dart │ │ │ │ ├── http_kit.dart │ │ │ │ ├── launch/ │ │ │ │ │ ├── model.dart │ │ │ │ │ ├── page_launch_kit.dart │ │ │ │ │ └── route_observer.dart │ │ │ │ ├── log_kit.dart │ │ │ │ ├── memory_kit.dart │ │ │ │ ├── method_channel_kit.dart │ │ │ │ ├── route_kit.dart │ │ │ │ ├── source_code_kit.dart │ │ │ │ └── vm/ │ │ │ │ ├── version.dart │ │ │ │ ├── vm_helper.dart │ │ │ │ └── vm_service_wrapper.dart │ │ │ ├── biz/ │ │ │ │ └── biz.dart │ │ │ ├── common/ │ │ │ │ ├── basic_info.dart │ │ │ │ └── common.dart │ │ │ ├── kit.dart │ │ │ ├── observer.dart │ │ │ └── visual/ │ │ │ ├── color_pick.dart │ │ │ ├── view_check.dart │ │ │ └── visual.dart │ │ ├── ui/ │ │ │ ├── dokit_app.dart │ │ │ ├── dokit_btn.dart │ │ │ ├── kit_page.dart │ │ │ └── resident_page.dart │ │ ├── util/ │ │ │ ├── byte_util.dart │ │ │ ├── screen_util.dart │ │ │ └── time_util.dart │ │ └── widget/ │ │ ├── dash_decoration.dart │ │ ├── fps_chart.dart │ │ ├── source_code/ │ │ │ ├── source_code_view.dart │ │ │ └── syntax_highlighter.dart │ │ └── widget_build_chain/ │ │ ├── widget_build_chain_page.dart │ │ └── widget_details_page.dart │ ├── pubspec.yaml │ └── test/ │ └── widget_test.dart ├── LICENSE ├── README.md ├── README_EN.md ├── Web/ │ ├── .gitignore │ ├── DEVELOPMENT.md │ ├── LICENSE │ ├── README.md │ ├── jest.config.js │ ├── lerna-debug.log │ ├── lerna.json │ ├── package.json │ ├── packages/ │ │ ├── core/ │ │ │ ├── README.md │ │ │ ├── __tests__/ │ │ │ │ └── index.test.js │ │ │ ├── package.json │ │ │ ├── rollup.config.js │ │ │ └── src/ │ │ │ ├── common/ │ │ │ │ ├── components/ │ │ │ │ │ ├── card.vue │ │ │ │ │ ├── dokit-ui/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── layout/ │ │ │ │ │ │ ├── col.css │ │ │ │ │ │ ├── col.js │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ ├── row.css │ │ │ │ │ │ └── row.js │ │ │ │ │ ├── toast/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── toast.vue │ │ │ │ │ ├── top-bar.vue │ │ │ │ │ └── version.vue │ │ │ │ └── js/ │ │ │ │ ├── EventPlayback.js │ │ │ │ ├── EventRecorder.js │ │ │ │ ├── UIController.js │ │ │ │ ├── dom-events-to-record.js │ │ │ │ ├── feature.js │ │ │ │ ├── finder/ │ │ │ │ │ └── index.js │ │ │ │ ├── icon.js │ │ │ │ ├── lifecycle.js │ │ │ │ ├── node.js │ │ │ │ ├── socket.js │ │ │ │ ├── store.js │ │ │ │ ├── util.js │ │ │ │ └── xpath/ │ │ │ │ └── index.js │ │ │ ├── components/ │ │ │ │ ├── app.vue │ │ │ │ ├── elements-highlight.vue │ │ │ │ ├── home.vue │ │ │ │ ├── hostSuspendedBall.vue │ │ │ │ ├── independ-container.vue │ │ │ │ └── router-container.vue │ │ │ ├── index.js │ │ │ ├── router/ │ │ │ │ ├── index.js │ │ │ │ ├── router.js │ │ │ │ └── routes.js │ │ │ └── store/ │ │ │ └── index.js │ │ ├── utils/ │ │ │ ├── README.md │ │ │ ├── __tests__/ │ │ │ │ └── index.test.js │ │ │ ├── package.json │ │ │ ├── rollup.config.js │ │ │ └── src/ │ │ │ ├── deepClone.js │ │ │ ├── dom.js │ │ │ ├── dragable.js │ │ │ ├── eventEmiter.js │ │ │ ├── index.js │ │ │ ├── md5.js │ │ │ ├── network.js │ │ │ └── utils.js │ │ ├── web/ │ │ │ ├── README.md │ │ │ ├── __tests__/ │ │ │ │ └── index.test.js │ │ │ ├── package.json │ │ │ ├── playground/ │ │ │ │ └── index.html │ │ │ ├── rollup.config.js │ │ │ └── src/ │ │ │ ├── assets/ │ │ │ │ ├── CssStore.js │ │ │ │ ├── deepClone.js │ │ │ │ └── util.js │ │ │ ├── common/ │ │ │ │ ├── Card.vue │ │ │ │ └── info-card.vue │ │ │ ├── components/ │ │ │ │ ├── ScanerComponent.vue │ │ │ │ ├── ToolHelloWorld.vue │ │ │ │ └── ToolsContainer.vue │ │ │ ├── feature.js │ │ │ ├── index.js │ │ │ └── plugins/ │ │ │ ├── align-ruler/ │ │ │ │ ├── align-ruler.vue │ │ │ │ ├── index.js │ │ │ │ └── info-box.vue │ │ │ ├── api-mock/ │ │ │ │ ├── index.js │ │ │ │ ├── interface-item.vue │ │ │ │ └── main.vue │ │ │ ├── app-info/ │ │ │ │ ├── ToolAppInfo.vue │ │ │ │ └── index.js │ │ │ ├── console/ │ │ │ │ ├── console-tap.vue │ │ │ │ ├── css/ │ │ │ │ │ └── var.less │ │ │ │ ├── index.js │ │ │ │ ├── js/ │ │ │ │ │ └── console.js │ │ │ │ ├── log-container.vue │ │ │ │ ├── log-detail.vue │ │ │ │ ├── log-item.vue │ │ │ │ ├── main.vue │ │ │ │ └── op-command.vue │ │ │ ├── demo-plugin/ │ │ │ │ ├── ToolHelloWorld.vue │ │ │ │ └── index.js │ │ │ ├── demo-single-plugin/ │ │ │ │ ├── FPS.vue │ │ │ │ ├── IndependPluginDemo.vue │ │ │ │ └── index.js │ │ │ ├── element/ │ │ │ │ ├── components/ │ │ │ │ │ ├── ElementAttributes.vue │ │ │ │ │ ├── ElementBoxModel.vue │ │ │ │ │ ├── ElementBreadcrumb.vue │ │ │ │ │ ├── ElementComputedStyle.vue │ │ │ │ │ └── ElementStyles.vue │ │ │ │ ├── elementContainer.vue │ │ │ │ ├── elementDetails.vue │ │ │ │ ├── elementSnippet.vue │ │ │ │ ├── elementTree.vue │ │ │ │ └── index.js │ │ │ ├── h5-door/ │ │ │ │ ├── ToolH5Door.vue │ │ │ │ └── index.js │ │ │ ├── network/ │ │ │ │ ├── index.js │ │ │ │ ├── js/ │ │ │ │ │ └── request.js │ │ │ │ ├── main.vue │ │ │ │ └── request-item.vue │ │ │ ├── one-machine-with-multiple-controls/ │ │ │ │ ├── app.vue │ │ │ │ └── index.js │ │ │ ├── resources/ │ │ │ │ ├── css/ │ │ │ │ │ └── var.less │ │ │ │ ├── index.js │ │ │ │ ├── js/ │ │ │ │ │ └── resources.js │ │ │ │ ├── main.vue │ │ │ │ ├── resource-container.vue │ │ │ │ ├── resource-item.vue │ │ │ │ └── resource-tap.vue │ │ │ ├── scan-code/ │ │ │ │ ├── app.vue │ │ │ │ └── index.js │ │ │ ├── storage/ │ │ │ │ ├── cookie.vue │ │ │ │ ├── index.js │ │ │ │ ├── info-card.vue │ │ │ │ ├── js/ │ │ │ │ │ └── storage.js │ │ │ │ ├── local-storage.vue │ │ │ │ ├── main.vue │ │ │ │ └── session-storage.vue │ │ │ └── web-vitals-time/ │ │ │ ├── index.js │ │ │ └── info-box.vue │ │ └── web-independent/ │ │ ├── README.md │ │ ├── package.json │ │ ├── rollup.config.js │ │ └── src/ │ │ └── index.js │ ├── playground/ │ │ ├── independent.html │ │ ├── index.html │ │ ├── index2.html │ │ ├── index3.html │ │ └── liveReload.js │ └── scripts/ │ └── dev-playground.js ├── iOS/ │ ├── .gitignore │ ├── Demo/ │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets/ │ │ │ ├── AccentColor.colorset/ │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ └── Contents.json │ │ ├── Base.lproj/ │ │ │ ├── LaunchScreen.storyboard │ │ │ └── Main.storyboard │ │ ├── Info.plist │ │ └── ViewController.swift │ ├── Demo.xcodeproj/ │ │ ├── project.pbxproj │ │ └── xcshareddata/ │ │ └── xcschemes/ │ │ └── Demo.xcscheme │ ├── DoKit/ │ │ ├── Assets/ │ │ │ ├── Assets.xcassets/ │ │ │ │ ├── Contents.json │ │ │ │ └── dokit_logo.imageset/ │ │ │ │ └── Contents.json │ │ │ └── DKTrayViewController.xib │ │ └── Classes/ │ │ ├── CFoundation/ │ │ │ ├── common.h │ │ │ ├── hook.c │ │ │ └── hook.h │ │ ├── Core/ │ │ │ ├── DKTrayViewController.h │ │ │ ├── DKTrayViewController.m │ │ │ ├── DoKit.h │ │ │ └── DoKit.m │ │ ├── EventSynthesize/ │ │ │ ├── UITouch+DKEventSynthesize.h │ │ │ ├── UITouch+DKEventSynthesize.m │ │ │ ├── UIView+EventSynthesize.h │ │ │ └── UIView+EventSynthesize.m │ │ └── Foundation/ │ │ ├── DKMultiControlProtocol.h │ │ ├── DKMultiControlProtocol.m │ │ ├── DKMultiControlStreamManager.h │ │ ├── DKMultiControlStreamManager.m │ │ ├── DKQRCodeScanLogic.h │ │ ├── DKQRCodeScanLogic.m │ │ ├── DKQRCodeScanView.h │ │ ├── DKQRCodeScanView.m │ │ ├── DKQRCodeScanViewController.h │ │ ├── DKQRCodeScanViewController.m │ │ ├── DKWebSocketSession.h │ │ ├── DKWebSocketSession.m │ │ ├── DTO/ │ │ │ ├── DKActionDTOModel.h │ │ │ ├── DKActionDTOModel.m │ │ │ ├── DKCommonDTOModel.h │ │ │ ├── DKCommonDTOModel.m │ │ │ ├── DKDataRequestDTOModel.h │ │ │ ├── DKDataRequestDTOModel.m │ │ │ ├── DKDataResponseDTOModel.h │ │ │ ├── DKDataResponseDTOModel.m │ │ │ ├── DKLoginDataDTOModel.h │ │ │ └── DKLoginDataDTOModel.m │ │ ├── NSURLSessionConfiguration+DoKit.h │ │ └── NSURLSessionConfiguration+DoKit.m │ ├── DoraemonKit/ │ │ ├── Framework/ │ │ │ └── DoraemonLoadAnalyze.framework/ │ │ │ ├── DoraemonLoadAnalyze │ │ │ ├── Headers/ │ │ │ │ └── DoraemonLoadAnalyze.h │ │ │ ├── Info.plist │ │ │ └── Modules/ │ │ │ └── module.modulemap │ │ ├── Resource/ │ │ │ ├── Assets.xcassets/ │ │ │ │ ├── Contents.json │ │ │ │ ├── dk_icon_mc.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── dk_mc_banner.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_align.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_app_info.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_app_start_time.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_arrow_down.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_back.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_back_dark.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_check_circle.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_check_circle_fill.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_close.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_close_dark.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_close_white.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_cpu.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_crash.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_database.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_default.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_dir.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_expand.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_expand_no.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_file.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_file_2.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_file_sync.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_file_sync_banner.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_fps.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_h5.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_health.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_health_bg.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_health_cell_bg.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_health_end.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_health_slide.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_health_slideTop.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_health_start.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_hierarchy_info.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_hierarchy_parent.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_hierarchy_select.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_hierarchy_subview.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_js.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_kadun.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_location.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_log.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_logo.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_logo_dark.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_max.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_memory.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_memory_leak.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_method_use_time.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_min.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_mock.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_mock_cancle.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_mock_data.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_mock_data_selected.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_mock_detail_down.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_mock_detail_up.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_mock_filter_down.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_mock_filter_up.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_mock_gps.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_mock_selected.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_mock_up.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_mock_up_selected.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_more.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_net.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_netflow_list_select.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_netflow_list_unselect.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_netflow_summary_select.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_netflow_summary_unselect.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_nslog.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_qingchu.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_scan.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_scan_line.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_search.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_search_highlight.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_self.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_setting.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_straw.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_time_profiler.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_ui.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_view_check.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_view_level.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_viewmetrics.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── doraemon_visual.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── doraemon_weaknet.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── en.lproj/ │ │ │ │ └── Doraemon.strings │ │ │ └── zh-Hans.lproj/ │ │ │ └── Doraemon.strings │ │ └── Src/ │ │ ├── Core/ │ │ │ ├── Base/ │ │ │ │ ├── DoraemonBaseViewController.h │ │ │ │ ├── DoraemonBaseViewController.m │ │ │ │ ├── DoraemonNavBarItemModel.h │ │ │ │ ├── DoraemonNavBarItemModel.m │ │ │ │ ├── DoraemonStatusBarViewController.h │ │ │ │ ├── DoraemonStatusBarViewController.m │ │ │ │ └── View/ │ │ │ │ ├── DoraemonBaseBigTitleView.h │ │ │ │ └── DoraemonBaseBigTitleView.m │ │ │ ├── Cache/ │ │ │ │ ├── DoraemonCacheManager.h │ │ │ │ └── DoraemonCacheManager.m │ │ │ ├── Category/ │ │ │ │ ├── Foundation+Doraemon.m │ │ │ │ ├── NSObject+Doraemon.h │ │ │ │ ├── NSObject+Doraemon.m │ │ │ │ ├── UIColor+Doraemon.h │ │ │ │ ├── UIColor+Doraemon.m │ │ │ │ ├── UIImage+Doraemon.h │ │ │ │ ├── UIImage+Doraemon.m │ │ │ │ ├── UIView+Doraemon.h │ │ │ │ ├── UIView+Doraemon.m │ │ │ │ ├── UIViewController+Doraemon.h │ │ │ │ └── UIViewController+Doraemon.m │ │ │ ├── CommonUI/ │ │ │ │ ├── Alert/ │ │ │ │ │ ├── DoraemonAlertUtil.h │ │ │ │ │ └── DoraemonAlertUtil.m │ │ │ │ ├── CellBtn/ │ │ │ │ │ ├── DoraemonCellButton.h │ │ │ │ │ └── DoraemonCellButton.m │ │ │ │ ├── CellInput/ │ │ │ │ │ ├── DoraemonCellInput.h │ │ │ │ │ └── DoraemonCellInput.m │ │ │ │ ├── CellSwitch/ │ │ │ │ │ ├── DoraemonCellSwitch.h │ │ │ │ │ └── DoraemonCellSwitch.m │ │ │ │ ├── Charts/ │ │ │ │ │ ├── DoraemonBarChart.h │ │ │ │ │ ├── DoraemonBarChart.m │ │ │ │ │ ├── DoraemonChart.h │ │ │ │ │ ├── DoraemonChart.m │ │ │ │ │ ├── DoraemonChartAxis.h │ │ │ │ │ ├── DoraemonChartAxis.m │ │ │ │ │ ├── DoraemonChartDataItem.h │ │ │ │ │ ├── DoraemonChartDataItem.m │ │ │ │ │ ├── DoraemonPieChart.h │ │ │ │ │ ├── DoraemonPieChart.m │ │ │ │ │ ├── DoraemonXAxis.h │ │ │ │ │ ├── DoraemonXAxis.m │ │ │ │ │ ├── DoraemonYAxis.h │ │ │ │ │ └── DoraemonYAxis.m │ │ │ │ ├── Label/ │ │ │ │ │ ├── DoraemonCopyLabel.h │ │ │ │ │ └── DoraemonCopyLabel.m │ │ │ │ ├── Oscillogram/ │ │ │ │ │ ├── DoraemonOscillogramView.h │ │ │ │ │ ├── DoraemonOscillogramView.m │ │ │ │ │ ├── DoraemonOscillogramViewController.h │ │ │ │ │ ├── DoraemonOscillogramViewController.m │ │ │ │ │ ├── DoraemonOscillogramWindow.h │ │ │ │ │ ├── DoraemonOscillogramWindow.m │ │ │ │ │ ├── DoraemonOscillogramWindowManager.h │ │ │ │ │ └── DoraemonOscillogramWindowManager.m │ │ │ │ ├── Toast/ │ │ │ │ │ ├── DoraemonToastUtil.h │ │ │ │ │ └── DoraemonToastUtil.m │ │ │ │ └── Visual/ │ │ │ │ ├── DoraemonVisualInfoWindow.h │ │ │ │ ├── DoraemonVisualInfoWindow.m │ │ │ │ ├── DoraemonVisualMagnifierWindow.h │ │ │ │ └── DoraemonVisualMagnifierWindow.m │ │ │ ├── Define/ │ │ │ │ └── DoraemonDefine.h │ │ │ ├── DoraemonKit.h │ │ │ ├── Entry/ │ │ │ │ ├── Entry/ │ │ │ │ │ ├── DoraemonEntryWindow.h │ │ │ │ │ └── DoraemonEntryWindow.m │ │ │ │ └── Home/ │ │ │ │ ├── Cell/ │ │ │ │ │ ├── DoraemonHomeCell.h │ │ │ │ │ ├── DoraemonHomeCell.m │ │ │ │ │ ├── DoraemonHomeCloseCell.h │ │ │ │ │ ├── DoraemonHomeCloseCell.m │ │ │ │ │ ├── DoraemonHomeFootCell.h │ │ │ │ │ ├── DoraemonHomeFootCell.m │ │ │ │ │ ├── DoraemonHomeHeadCell.h │ │ │ │ │ └── DoraemonHomeHeadCell.m │ │ │ │ ├── DoraemonHomeViewController.h │ │ │ │ ├── DoraemonHomeViewController.m │ │ │ │ ├── DoraemonHomeWindow.h │ │ │ │ ├── DoraemonHomeWindow.m │ │ │ │ ├── DoraemonNavigationController.h │ │ │ │ ├── DoraemonNavigationController.m │ │ │ │ └── Settings/ │ │ │ │ ├── DoraemonSettingCell.h │ │ │ │ ├── DoraemonSettingCell.m │ │ │ │ ├── DoraemonSettingViewController.h │ │ │ │ ├── DoraemonSettingViewController.m │ │ │ │ └── KitManager/ │ │ │ │ ├── DoraemonKitManagerViewController.h │ │ │ │ ├── DoraemonKitManagerViewController.m │ │ │ │ └── View/ │ │ │ │ ├── DoraemonKitManagerCell.h │ │ │ │ ├── DoraemonKitManagerCell.m │ │ │ │ ├── DoraemonKitManagerHeadCell.h │ │ │ │ ├── DoraemonKitManagerHeadCell.m │ │ │ │ ├── DoraemonKitManagerResetCell.h │ │ │ │ └── DoraemonKitManagerResetCell.m │ │ │ ├── Manager/ │ │ │ │ ├── DoraemonManager.h │ │ │ │ └── DoraemonManager.m │ │ │ ├── Network/ │ │ │ │ └── Interceptor/ │ │ │ │ ├── DoraemonNSURLProtocol.h │ │ │ │ ├── DoraemonNSURLProtocol.m │ │ │ │ ├── DoraemonNetworkInterceptor.h │ │ │ │ ├── DoraemonNetworkInterceptor.m │ │ │ │ ├── DoraemonURLSessionDemux.h │ │ │ │ ├── DoraemonURLSessionDemux.m │ │ │ │ ├── NSURLSessionConfiguration+Doraemon.h │ │ │ │ └── NSURLSessionConfiguration+Doraemon.m │ │ │ ├── Plugin/ │ │ │ │ ├── Common/ │ │ │ │ │ ├── AppInfo/ │ │ │ │ │ │ ├── DoraemonAppInfoCell.h │ │ │ │ │ │ ├── DoraemonAppInfoCell.m │ │ │ │ │ │ ├── DoraemonAppInfoPlugin.h │ │ │ │ │ │ ├── DoraemonAppInfoPlugin.m │ │ │ │ │ │ ├── DoraemonAppInfoUtil.h │ │ │ │ │ │ ├── DoraemonAppInfoUtil.m │ │ │ │ │ │ ├── DoraemonAppInfoViewController.h │ │ │ │ │ │ └── DoraemonAppInfoViewController.m │ │ │ │ │ ├── AppSetting/ │ │ │ │ │ │ ├── DoraemonAppSettingPlugin.h │ │ │ │ │ │ └── DoraemonAppSettingPlugin.m │ │ │ │ │ ├── DeleteLocalData/ │ │ │ │ │ │ ├── DoraemonDeleteLocalDataPlugin.h │ │ │ │ │ │ ├── DoraemonDeleteLocalDataPlugin.m │ │ │ │ │ │ ├── DoraemonDeleteLocalDataViewController.h │ │ │ │ │ │ └── DoraemonDeleteLocalDataViewController.m │ │ │ │ │ ├── H5/ │ │ │ │ │ │ ├── DoraemonDefaultWebViewController.h │ │ │ │ │ │ ├── DoraemonDefaultWebViewController.m │ │ │ │ │ │ ├── DoraemonH5Plugin.h │ │ │ │ │ │ ├── DoraemonH5Plugin.m │ │ │ │ │ │ ├── DoraemonH5ViewController.h │ │ │ │ │ │ ├── DoraemonH5ViewController.m │ │ │ │ │ │ ├── DoraemonQRCodeViewController.h │ │ │ │ │ │ ├── DoraemonQRCodeViewController.m │ │ │ │ │ │ └── QRCode/ │ │ │ │ │ │ ├── DoraemonQRScanView.h │ │ │ │ │ │ └── DoraemonQRScanView.m │ │ │ │ │ ├── JavaScript/ │ │ │ │ │ │ ├── DoraemonJavaScriptDetailViewController.h │ │ │ │ │ │ ├── DoraemonJavaScriptDetailViewController.m │ │ │ │ │ │ ├── DoraemonJavaScriptPlugin.h │ │ │ │ │ │ ├── DoraemonJavaScriptPlugin.m │ │ │ │ │ │ ├── DoraemonJavaScriptViewController.h │ │ │ │ │ │ ├── DoraemonJavaScriptViewController.m │ │ │ │ │ │ └── Function/ │ │ │ │ │ │ ├── DoraemonJavaScriptManager.h │ │ │ │ │ │ └── DoraemonJavaScriptManager.m │ │ │ │ │ ├── NSLog/ │ │ │ │ │ │ ├── DoraemonNSLogPlugin.h │ │ │ │ │ │ ├── DoraemonNSLogPlugin.m │ │ │ │ │ │ ├── DoraemonNSLogViewController.h │ │ │ │ │ │ ├── DoraemonNSLogViewController.m │ │ │ │ │ │ ├── Function/ │ │ │ │ │ │ │ ├── DoraemonNSLogManager.h │ │ │ │ │ │ │ ├── DoraemonNSLogManager.m │ │ │ │ │ │ │ ├── DoraemonNSLogModel.h │ │ │ │ │ │ │ └── DoraemonNSLogModel.m │ │ │ │ │ │ └── List/ │ │ │ │ │ │ ├── DoraemonNSLogListCell.h │ │ │ │ │ │ ├── DoraemonNSLogListCell.m │ │ │ │ │ │ ├── DoraemonNSLogListViewController.h │ │ │ │ │ │ ├── DoraemonNSLogListViewController.m │ │ │ │ │ │ ├── DoraemonNSLogSearchView.h │ │ │ │ │ │ └── DoraemonNSLogSearchView.m │ │ │ │ │ ├── NSUserDefaults/ │ │ │ │ │ │ ├── DoraemonNSUserDefaultsPlugin.h │ │ │ │ │ │ ├── DoraemonNSUserDefaultsPlugin.m │ │ │ │ │ │ ├── Model/ │ │ │ │ │ │ │ ├── DoraemonNSUserDefaultsModel.h │ │ │ │ │ │ │ └── DoraemonNSUserDefaultsModel.m │ │ │ │ │ │ └── ViewControllers/ │ │ │ │ │ │ ├── DoraemonNSUserDefaultsEditViewController.h │ │ │ │ │ │ ├── DoraemonNSUserDefaultsEditViewController.m │ │ │ │ │ │ ├── DoraemonNSUserDefaultsViewController.h │ │ │ │ │ │ └── DoraemonNSUserDefaultsViewController.m │ │ │ │ │ └── Sanbox/ │ │ │ │ │ ├── DoraemonSandboxPlugin.h │ │ │ │ │ ├── DoraemonSandboxPlugin.m │ │ │ │ │ ├── Util/ │ │ │ │ │ │ ├── DoraemonDBManager.h │ │ │ │ │ │ └── DoraemonDBManager.m │ │ │ │ │ └── VC/ │ │ │ │ │ ├── DB/ │ │ │ │ │ │ ├── DoraemonDBCell.h │ │ │ │ │ │ ├── DoraemonDBCell.m │ │ │ │ │ │ ├── DoraemonDBRowView.h │ │ │ │ │ │ ├── DoraemonDBRowView.m │ │ │ │ │ │ ├── DoraemonDBShowView.h │ │ │ │ │ │ ├── DoraemonDBShowView.m │ │ │ │ │ │ ├── DoraemonDBTableViewController.h │ │ │ │ │ │ └── DoraemonDBTableViewController.m │ │ │ │ │ ├── DoraemonSanboxDetailViewController.h │ │ │ │ │ ├── DoraemonSanboxDetailViewController.m │ │ │ │ │ ├── DoraemonSandboxCell.h │ │ │ │ │ ├── DoraemonSandboxCell.m │ │ │ │ │ ├── DoraemonSandboxModel.h │ │ │ │ │ ├── DoraemonSandboxModel.m │ │ │ │ │ ├── DoraemonSandboxViewController.h │ │ │ │ │ └── DoraemonSandboxViewController.m │ │ │ │ ├── Performance/ │ │ │ │ │ ├── ANR/ │ │ │ │ │ │ ├── Detail/ │ │ │ │ │ │ │ ├── DoraemonANRDetailViewController.h │ │ │ │ │ │ │ └── DoraemonANRDetailViewController.m │ │ │ │ │ │ ├── DoraemonANRPlugin.h │ │ │ │ │ │ ├── DoraemonANRPlugin.m │ │ │ │ │ │ ├── DoraemonANRViewController.h │ │ │ │ │ │ ├── DoraemonANRViewController.m │ │ │ │ │ │ ├── Function/ │ │ │ │ │ │ │ ├── DoraemonANRManager.h │ │ │ │ │ │ │ ├── DoraemonANRManager.m │ │ │ │ │ │ │ ├── DoraemonANRTool.h │ │ │ │ │ │ │ ├── DoraemonANRTool.m │ │ │ │ │ │ │ ├── DoraemonANRTracker.h │ │ │ │ │ │ │ ├── DoraemonANRTracker.m │ │ │ │ │ │ │ ├── DoraemonPingThread.h │ │ │ │ │ │ │ └── DoraemonPingThread.m │ │ │ │ │ │ └── List/ │ │ │ │ │ │ ├── DoraemonANRListCell.h │ │ │ │ │ │ ├── DoraemonANRListCell.m │ │ │ │ │ │ ├── DoraemonANRListViewController.h │ │ │ │ │ │ └── DoraemonANRListViewController.m │ │ │ │ │ ├── CPU/ │ │ │ │ │ │ ├── DoraemonCPUPlugin.h │ │ │ │ │ │ ├── DoraemonCPUPlugin.m │ │ │ │ │ │ ├── DoraemonCPUViewController.h │ │ │ │ │ │ ├── DoraemonCPUViewController.m │ │ │ │ │ │ └── Function/ │ │ │ │ │ │ ├── DoraemonCPUOscillogramViewController.h │ │ │ │ │ │ ├── DoraemonCPUOscillogramViewController.m │ │ │ │ │ │ ├── DoraemonCPUOscillogramWindow.h │ │ │ │ │ │ ├── DoraemonCPUOscillogramWindow.m │ │ │ │ │ │ ├── DoraemonCPUUtil.h │ │ │ │ │ │ └── DoraemonCPUUtil.m │ │ │ │ │ ├── Crash/ │ │ │ │ │ │ ├── DoraemonCrashPlugin.h │ │ │ │ │ │ ├── DoraemonCrashPlugin.m │ │ │ │ │ │ ├── DoraemonCrashViewController.h │ │ │ │ │ │ ├── DoraemonCrashViewController.m │ │ │ │ │ │ ├── Function/ │ │ │ │ │ │ │ ├── DoraemonCrashSignalExceptionHandler.h │ │ │ │ │ │ │ ├── DoraemonCrashSignalExceptionHandler.m │ │ │ │ │ │ │ ├── DoraemonCrashTool.h │ │ │ │ │ │ │ ├── DoraemonCrashTool.m │ │ │ │ │ │ │ ├── DoraemonCrashUncaughtExceptionHandler.h │ │ │ │ │ │ │ └── DoraemonCrashUncaughtExceptionHandler.m │ │ │ │ │ │ └── List/ │ │ │ │ │ │ ├── DoraemonCrashListCell.h │ │ │ │ │ │ ├── DoraemonCrashListCell.m │ │ │ │ │ │ ├── DoraemonCrashListViewController.h │ │ │ │ │ │ └── DoraemonCrashListViewController.m │ │ │ │ │ ├── FPS/ │ │ │ │ │ │ ├── DoraemonFPSPlugin.h │ │ │ │ │ │ ├── DoraemonFPSPlugin.m │ │ │ │ │ │ ├── DoraemonFPSViewController.h │ │ │ │ │ │ ├── DoraemonFPSViewController.m │ │ │ │ │ │ └── Function/ │ │ │ │ │ │ ├── DoraemonFPSOscillogramViewController.h │ │ │ │ │ │ ├── DoraemonFPSOscillogramViewController.m │ │ │ │ │ │ ├── DoraemonFPSOscillogramWindow.h │ │ │ │ │ │ ├── DoraemonFPSOscillogramWindow.m │ │ │ │ │ │ ├── DoraemonFPSUtil.h │ │ │ │ │ │ └── DoraemonFPSUtil.m │ │ │ │ │ ├── LargeImageDetection/ │ │ │ │ │ │ ├── Detail/ │ │ │ │ │ │ │ ├── DoraemonImageDetectionCell.h │ │ │ │ │ │ │ ├── DoraemonImageDetectionCell.m │ │ │ │ │ │ │ ├── DoraemonLargeImageDetectionListViewController.h │ │ │ │ │ │ │ ├── DoraemonLargeImageDetectionListViewController.m │ │ │ │ │ │ │ ├── DoraemonResponseImageModel.h │ │ │ │ │ │ │ └── DoraemonResponseImageModel.m │ │ │ │ │ │ ├── DoraemonLargeImagePlugin.h │ │ │ │ │ │ ├── DoraemonLargeImagePlugin.m │ │ │ │ │ │ ├── DoraemonLargeImageViewController.h │ │ │ │ │ │ ├── DoraemonLargeImageViewController.m │ │ │ │ │ │ └── Function/ │ │ │ │ │ │ ├── DoraemonLargeImageDetectionManager.h │ │ │ │ │ │ ├── DoraemonLargeImageDetectionManager.m │ │ │ │ │ │ ├── UIImageView+DoraemonSDImage.h │ │ │ │ │ │ └── UIImageView+DoraemonSDImage.m │ │ │ │ │ ├── Memory/ │ │ │ │ │ │ ├── DoraemonMemoryPlugin.h │ │ │ │ │ │ ├── DoraemonMemoryPlugin.m │ │ │ │ │ │ ├── DoraemonMemoryViewController.h │ │ │ │ │ │ ├── DoraemonMemoryViewController.m │ │ │ │ │ │ └── Function/ │ │ │ │ │ │ ├── DoraemonMemoryOscillogramViewController.h │ │ │ │ │ │ ├── DoraemonMemoryOscillogramViewController.m │ │ │ │ │ │ ├── DoraemonMemoryOscillogramWindow.h │ │ │ │ │ │ ├── DoraemonMemoryOscillogramWindow.m │ │ │ │ │ │ ├── DoraemonMemoryUtil.h │ │ │ │ │ │ └── DoraemonMemoryUtil.m │ │ │ │ │ ├── NetFlow/ │ │ │ │ │ │ ├── Detail/ │ │ │ │ │ │ │ ├── DoraemonNetFlowDetailCell.h │ │ │ │ │ │ │ ├── DoraemonNetFlowDetailCell.m │ │ │ │ │ │ │ ├── DoraemonNetFlowDetailSegment.h │ │ │ │ │ │ │ ├── DoraemonNetFlowDetailSegment.m │ │ │ │ │ │ │ ├── DoraemonNetFlowDetailViewController.h │ │ │ │ │ │ │ └── DoraemonNetFlowDetailViewController.m │ │ │ │ │ │ ├── DoraemonNetFlowPlugin.h │ │ │ │ │ │ ├── DoraemonNetFlowPlugin.m │ │ │ │ │ │ ├── DoraemonNetFlowViewController.h │ │ │ │ │ │ ├── DoraemonNetFlowViewController.m │ │ │ │ │ │ ├── Function/ │ │ │ │ │ │ │ ├── DoraemonNetFlowDataSource.h │ │ │ │ │ │ │ ├── DoraemonNetFlowDataSource.m │ │ │ │ │ │ │ ├── DoraemonNetFlowHttpModel.h │ │ │ │ │ │ │ ├── DoraemonNetFlowHttpModel.m │ │ │ │ │ │ │ ├── DoraemonNetFlowManager.h │ │ │ │ │ │ │ ├── DoraemonNetFlowManager.m │ │ │ │ │ │ │ ├── Util/ │ │ │ │ │ │ │ │ ├── DoraemonUrlUtil.h │ │ │ │ │ │ │ │ ├── DoraemonUrlUtil.m │ │ │ │ │ │ │ │ ├── NSURLRequest+Doraemon.h │ │ │ │ │ │ │ │ └── NSURLRequest+Doraemon.m │ │ │ │ │ │ │ └── View/ │ │ │ │ │ │ │ ├── DoraemonNetFlowOscillogramViewController.h │ │ │ │ │ │ │ ├── DoraemonNetFlowOscillogramViewController.m │ │ │ │ │ │ │ ├── DoraemonNetFlowOscillogramWindow.h │ │ │ │ │ │ │ └── DoraemonNetFlowOscillogramWindow.m │ │ │ │ │ │ ├── List/ │ │ │ │ │ │ │ ├── DoraemonNetFlowListCell.h │ │ │ │ │ │ │ ├── DoraemonNetFlowListCell.m │ │ │ │ │ │ │ ├── DoraemonNetFlowListViewController.h │ │ │ │ │ │ │ └── DoraemonNetFlowListViewController.m │ │ │ │ │ │ └── Summary/ │ │ │ │ │ │ ├── DoraemonNetFlowSummaryViewController.h │ │ │ │ │ │ ├── DoraemonNetFlowSummaryViewController.m │ │ │ │ │ │ └── View/ │ │ │ │ │ │ ├── DoraemonNetFlowSummaryMethodDataView.h │ │ │ │ │ │ ├── DoraemonNetFlowSummaryMethodDataView.m │ │ │ │ │ │ ├── DoraemonNetFlowSummaryTotalDataView.h │ │ │ │ │ │ ├── DoraemonNetFlowSummaryTotalDataView.m │ │ │ │ │ │ ├── DoraemonNetFlowSummaryTypeDataView.h │ │ │ │ │ │ └── DoraemonNetFlowSummaryTypeDataView.m │ │ │ │ │ ├── StartTime/ │ │ │ │ │ │ ├── DoraemonStartTimePlugin.h │ │ │ │ │ │ ├── DoraemonStartTimePlugin.m │ │ │ │ │ │ ├── DoraemonStartTimeViewController.h │ │ │ │ │ │ ├── DoraemonStartTimeViewController.m │ │ │ │ │ │ └── TimeProfiler/ │ │ │ │ │ │ ├── DoraemonStartTimeProfilerViewController.h │ │ │ │ │ │ └── DoraemonStartTimeProfilerViewController.m │ │ │ │ │ ├── SubThreadUICheck/ │ │ │ │ │ │ ├── Detail/ │ │ │ │ │ │ │ ├── DoraemonSubThreadUICheckDetailViewController.h │ │ │ │ │ │ │ └── DoraemonSubThreadUICheckDetailViewController.m │ │ │ │ │ │ ├── DoraemonSubThreadUICheckPlugin.h │ │ │ │ │ │ ├── DoraemonSubThreadUICheckPlugin.m │ │ │ │ │ │ ├── DoraemonSubThreadUICheckViewController.h │ │ │ │ │ │ ├── DoraemonSubThreadUICheckViewController.m │ │ │ │ │ │ ├── Function/ │ │ │ │ │ │ │ ├── DoraemonSubThreadUICheckManager.h │ │ │ │ │ │ │ ├── DoraemonSubThreadUICheckManager.m │ │ │ │ │ │ │ ├── UIView+DoraemonSubThreadUICheck.h │ │ │ │ │ │ │ └── UIView+DoraemonSubThreadUICheck.m │ │ │ │ │ │ └── List/ │ │ │ │ │ │ ├── DoraemonSubThreadUICheckListCell.h │ │ │ │ │ │ ├── DoraemonSubThreadUICheckListCell.m │ │ │ │ │ │ ├── DoraemonSubThreadUICheckListViewController.h │ │ │ │ │ │ └── DoraemonSubThreadUICheckListViewController.m │ │ │ │ │ ├── TimeProfiler/ │ │ │ │ │ │ ├── DoraemonTimeProfilerPlugin.h │ │ │ │ │ │ ├── DoraemonTimeProfilerPlugin.m │ │ │ │ │ │ ├── DoraemonTimeProfilerViewController.h │ │ │ │ │ │ ├── DoraemonTimeProfilerViewController.m │ │ │ │ │ │ └── Function/ │ │ │ │ │ │ ├── DoraemonTimeProfiler.h │ │ │ │ │ │ ├── DoraemonTimeProfiler.m │ │ │ │ │ │ ├── DoraemonTimeProfilerCore.c │ │ │ │ │ │ ├── DoraemonTimeProfilerCore.h │ │ │ │ │ │ ├── DoraemonTimeProfilerRecord.h │ │ │ │ │ │ └── DoraemonTimeProfilerRecord.m │ │ │ │ │ ├── UIProfile/ │ │ │ │ │ │ ├── DoraemonUIProfilePlugin.h │ │ │ │ │ │ ├── DoraemonUIProfilePlugin.m │ │ │ │ │ │ ├── DoraemonUIProfileViewController.h │ │ │ │ │ │ ├── DoraemonUIProfileViewController.m │ │ │ │ │ │ └── Function/ │ │ │ │ │ │ ├── DoraemonUIProfileManager.h │ │ │ │ │ │ ├── DoraemonUIProfileManager.m │ │ │ │ │ │ ├── DoraemonUIProfileWindow.h │ │ │ │ │ │ ├── DoraemonUIProfileWindow.m │ │ │ │ │ │ ├── UIViewController+DoraemonUIProfile.h │ │ │ │ │ │ └── UIViewController+DoraemonUIProfile.m │ │ │ │ │ ├── VCProfiler/ │ │ │ │ │ │ ├── UIViewController+DoraemonVCProfiler.h │ │ │ │ │ │ ├── UIViewController+DoraemonVCProfiler.m │ │ │ │ │ │ ├── WKWebView+Doraemon.h │ │ │ │ │ │ └── WKWebView+Doraemon.m │ │ │ │ │ └── WeakNetwork/ │ │ │ │ │ ├── DoraemonWeakNetworkPlugin.h │ │ │ │ │ ├── DoraemonWeakNetworkPlugin.m │ │ │ │ │ ├── DoraemonWeakNetworkViewController.h │ │ │ │ │ ├── DoraemonWeakNetworkViewController.m │ │ │ │ │ ├── Function/ │ │ │ │ │ │ ├── DoraemonWeakNetworkHandle.h │ │ │ │ │ │ ├── DoraemonWeakNetworkHandle.m │ │ │ │ │ │ ├── DoraemonWeakNetworkManager.h │ │ │ │ │ │ └── DoraemonWeakNetworkManager.m │ │ │ │ │ └── View/ │ │ │ │ │ ├── DoraemonWeakNetworkDetailView.h │ │ │ │ │ ├── DoraemonWeakNetworkDetailView.m │ │ │ │ │ ├── DoraemonWeakNetworkInputView.h │ │ │ │ │ ├── DoraemonWeakNetworkInputView.m │ │ │ │ │ ├── DoraemonWeakNetworkLevelView.h │ │ │ │ │ ├── DoraemonWeakNetworkLevelView.m │ │ │ │ │ └── Window/ │ │ │ │ │ ├── DoraemonWeakNetworkWindow.h │ │ │ │ │ └── DoraemonWeakNetworkWindow.m │ │ │ │ ├── Platform/ │ │ │ │ │ ├── FileSync/ │ │ │ │ │ │ ├── DoraemonFileSyncPlugin.h │ │ │ │ │ │ ├── DoraemonFileSyncPlugin.m │ │ │ │ │ │ ├── DoraemonFileSyncViewController.h │ │ │ │ │ │ ├── DoraemonFileSyncViewController.m │ │ │ │ │ │ └── Function/ │ │ │ │ │ │ ├── DoraemonFileSyncManager.h │ │ │ │ │ │ └── DoraemonFileSyncManager.m │ │ │ │ │ ├── Health/ │ │ │ │ │ │ ├── Alert/ │ │ │ │ │ │ │ ├── DoraemonHealthAlertView.h │ │ │ │ │ │ │ ├── DoraemonHealthAlertView.m │ │ │ │ │ │ │ ├── DoraemonHealthEndInputView.h │ │ │ │ │ │ │ └── DoraemonHealthEndInputView.m │ │ │ │ │ │ ├── DoraemonHealthPlugin.h │ │ │ │ │ │ ├── DoraemonHealthPlugin.m │ │ │ │ │ │ ├── DoraemonHealthViewController.h │ │ │ │ │ │ ├── DoraemonHealthViewController.m │ │ │ │ │ │ ├── Function/ │ │ │ │ │ │ │ ├── DoraemonHealthManager.h │ │ │ │ │ │ │ └── DoraemonHealthManager.m │ │ │ │ │ │ └── View/ │ │ │ │ │ │ ├── DoraemonHealthFooterView.h │ │ │ │ │ │ ├── DoraemonHealthFooterView.m │ │ │ │ │ │ ├── Home/ │ │ │ │ │ │ │ ├── Detail/ │ │ │ │ │ │ │ │ ├── DoraemonHealthBgView.h │ │ │ │ │ │ │ │ ├── DoraemonHealthBgView.m │ │ │ │ │ │ │ │ ├── DoraemonHealthBtnView.h │ │ │ │ │ │ │ │ ├── DoraemonHealthBtnView.m │ │ │ │ │ │ │ │ ├── DoraemonHealthStartingTitle.h │ │ │ │ │ │ │ │ └── DoraemonHealthStartingTitle.m │ │ │ │ │ │ │ ├── DoraemonHealthHomeView.h │ │ │ │ │ │ │ └── DoraemonHealthHomeView.m │ │ │ │ │ │ ├── Instructions/ │ │ │ │ │ │ │ ├── DoraemonHealthInstructionsCell.h │ │ │ │ │ │ │ ├── DoraemonHealthInstructionsCell.m │ │ │ │ │ │ │ ├── DoraemonHealthInstructionsView.h │ │ │ │ │ │ │ └── DoraemonHealthInstructionsView.m │ │ │ │ │ │ └── Window/ │ │ │ │ │ │ ├── DoraemonHealthCountdownWindow.h │ │ │ │ │ │ └── DoraemonHealthCountdownWindow.m │ │ │ │ │ └── Mock/ │ │ │ │ │ ├── DoraemonMockPlugin.h │ │ │ │ │ ├── DoraemonMockPlugin.m │ │ │ │ │ ├── DoraemonMockViewController.h │ │ │ │ │ ├── DoraemonMockViewController.m │ │ │ │ │ ├── Function/ │ │ │ │ │ │ ├── DoraemonMockManager.h │ │ │ │ │ │ ├── DoraemonMockManager.m │ │ │ │ │ │ ├── DoraemonMockUtil.h │ │ │ │ │ │ └── DoraemonMockUtil.m │ │ │ │ │ ├── Model/ │ │ │ │ │ │ ├── DoraemonMockAPIModel.h │ │ │ │ │ │ ├── DoraemonMockAPIModel.m │ │ │ │ │ │ ├── DoraemonMockBaseModel.h │ │ │ │ │ │ ├── DoraemonMockBaseModel.m │ │ │ │ │ │ ├── DoraemonMockScene.h │ │ │ │ │ │ ├── DoraemonMockScene.m │ │ │ │ │ │ ├── DoraemonMockUpLoadModel.h │ │ │ │ │ │ └── DoraemonMockUpLoadModel.m │ │ │ │ │ ├── VC/ │ │ │ │ │ │ ├── DoraemonMockAPIViewController.h │ │ │ │ │ │ ├── DoraemonMockAPIViewController.m │ │ │ │ │ │ ├── DoraemonMockBaseViewController.h │ │ │ │ │ │ ├── DoraemonMockBaseViewController.m │ │ │ │ │ │ ├── DoraemonMockUploadViewController.h │ │ │ │ │ │ ├── DoraemonMockUploadViewController.m │ │ │ │ │ │ └── Preview/ │ │ │ │ │ │ ├── DoraemonMockDataPreviewViewController.h │ │ │ │ │ │ └── DoraemonMockDataPreviewViewController.m │ │ │ │ │ └── View/ │ │ │ │ │ ├── Filter/ │ │ │ │ │ │ ├── DoraemonMockFilterButton.h │ │ │ │ │ │ ├── DoraemonMockFilterButton.m │ │ │ │ │ │ ├── DoraemonMockFilterListView.h │ │ │ │ │ │ ├── DoraemonMockFilterListView.m │ │ │ │ │ │ ├── DoraemonMockFilterTableCell.h │ │ │ │ │ │ └── DoraemonMockFilterTableCell.m │ │ │ │ │ ├── List/ │ │ │ │ │ │ ├── Cell/ │ │ │ │ │ │ │ ├── DoraemonMockApiCell.h │ │ │ │ │ │ │ ├── DoraemonMockApiCell.m │ │ │ │ │ │ │ ├── DoraemonMockBaseCell.h │ │ │ │ │ │ │ ├── DoraemonMockBaseCell.m │ │ │ │ │ │ │ ├── DoraemonMockUploadCell.h │ │ │ │ │ │ │ └── DoraemonMockUploadCell.m │ │ │ │ │ │ ├── DoraemonMockDetailSwitch.h │ │ │ │ │ │ ├── DoraemonMockDetailSwitch.m │ │ │ │ │ │ ├── DoraemonMockSceneButton.h │ │ │ │ │ │ ├── DoraemonMockSceneButton.m │ │ │ │ │ │ └── ListView/ │ │ │ │ │ │ ├── DoraemonMockApiListView.h │ │ │ │ │ │ ├── DoraemonMockApiListView.m │ │ │ │ │ │ ├── DoraemonMockBaseListView.h │ │ │ │ │ │ ├── DoraemonMockBaseListView.m │ │ │ │ │ │ ├── DoraemonMockUploadListView.h │ │ │ │ │ │ └── DoraemonMockUploadListView.m │ │ │ │ │ └── Search/ │ │ │ │ │ ├── DoraemonMockSearchView.h │ │ │ │ │ └── DoraemonMockSearchView.m │ │ │ │ ├── Protocol/ │ │ │ │ │ ├── DoraemonPluginProtocol.h │ │ │ │ │ └── DoraemonStartPluginProtocol.h │ │ │ │ └── UI/ │ │ │ │ ├── ColorPick/ │ │ │ │ │ ├── DoraemonColorPickPlugin.h │ │ │ │ │ ├── DoraemonColorPickPlugin.m │ │ │ │ │ └── Function/ │ │ │ │ │ ├── DoraemonColorPickInfoView.h │ │ │ │ │ ├── DoraemonColorPickInfoView.m │ │ │ │ │ ├── DoraemonColorPickInfoWindow.h │ │ │ │ │ ├── DoraemonColorPickInfoWindow.m │ │ │ │ │ ├── DoraemonColorPickMagnifyLayer.h │ │ │ │ │ ├── DoraemonColorPickMagnifyLayer.m │ │ │ │ │ ├── DoraemonColorPickView.h │ │ │ │ │ ├── DoraemonColorPickView.m │ │ │ │ │ ├── DoraemonColorPickWindow.h │ │ │ │ │ └── DoraemonColorPickWindow.m │ │ │ │ ├── Hierarchy/ │ │ │ │ │ ├── DoraemonHierarchyPlugin.h │ │ │ │ │ ├── DoraemonHierarchyPlugin.m │ │ │ │ │ ├── Function/ │ │ │ │ │ │ ├── Category/ │ │ │ │ │ │ │ ├── NSObject+DoraemonHierarchy.h │ │ │ │ │ │ │ ├── NSObject+DoraemonHierarchy.m │ │ │ │ │ │ │ ├── UIColor+DoraemonHierarchy.h │ │ │ │ │ │ │ ├── UIColor+DoraemonHierarchy.m │ │ │ │ │ │ │ ├── UIViewController+DoraemonHierarchy.h │ │ │ │ │ │ │ └── UIViewController+DoraemonHierarchy.m │ │ │ │ │ │ ├── DoraemonEnumDescription.h │ │ │ │ │ │ ├── DoraemonEnumDescription.m │ │ │ │ │ │ ├── DoraemonHierarchyFormatterTool.h │ │ │ │ │ │ ├── DoraemonHierarchyFormatterTool.m │ │ │ │ │ │ ├── DoraemonHierarchyHelper.h │ │ │ │ │ │ └── DoraemonHierarchyHelper.m │ │ │ │ │ └── UserInterface/ │ │ │ │ │ ├── Cell/ │ │ │ │ │ │ ├── DoraemonHierarchyDetailTitleCell.h │ │ │ │ │ │ ├── DoraemonHierarchyDetailTitleCell.m │ │ │ │ │ │ ├── DoraemonHierarchySelectorCell.h │ │ │ │ │ │ ├── DoraemonHierarchySelectorCell.m │ │ │ │ │ │ ├── DoraemonHierarchySwitchCell.h │ │ │ │ │ │ ├── DoraemonHierarchySwitchCell.m │ │ │ │ │ │ ├── DoraemonHierarchyTitleCell.h │ │ │ │ │ │ └── DoraemonHierarchyTitleCell.m │ │ │ │ │ ├── DoraemonHierarchyDetailViewController.h │ │ │ │ │ ├── DoraemonHierarchyDetailViewController.m │ │ │ │ │ ├── DoraemonHierarchyTableViewController.h │ │ │ │ │ ├── DoraemonHierarchyTableViewController.m │ │ │ │ │ ├── DoraemonHierarchyViewController.h │ │ │ │ │ ├── DoraemonHierarchyViewController.m │ │ │ │ │ ├── DoraemonHierarchyWindow.h │ │ │ │ │ ├── DoraemonHierarchyWindow.m │ │ │ │ │ ├── Model/ │ │ │ │ │ │ ├── DoraemonHierarchyCategoryModel.h │ │ │ │ │ │ ├── DoraemonHierarchyCategoryModel.m │ │ │ │ │ │ ├── DoraemonHierarchyCellModel.h │ │ │ │ │ │ └── DoraemonHierarchyCellModel.m │ │ │ │ │ └── View/ │ │ │ │ │ ├── DKHierarchyInfoView.h │ │ │ │ │ ├── DKHierarchyInfoView.m │ │ │ │ │ ├── DKHierarchyPickerView.h │ │ │ │ │ ├── DKHierarchyPickerView.m │ │ │ │ │ ├── DKMoveView.h │ │ │ │ │ ├── DKMoveView.m │ │ │ │ │ ├── DKPickerView.h │ │ │ │ │ ├── DKPickerView.m │ │ │ │ │ ├── DoraemonHierarchyHeaderView.h │ │ │ │ │ └── DoraemonHierarchyHeaderView.m │ │ │ │ ├── ViewAlign/ │ │ │ │ │ ├── DoraemonViewAlignPlugin.h │ │ │ │ │ ├── DoraemonViewAlignPlugin.m │ │ │ │ │ └── Function/ │ │ │ │ │ ├── DoraemonViewAlignManager.h │ │ │ │ │ ├── DoraemonViewAlignManager.m │ │ │ │ │ ├── DoraemonViewAlignView.h │ │ │ │ │ └── DoraemonViewAlignView.m │ │ │ │ ├── ViewCheck/ │ │ │ │ │ ├── DoraemonViewCheckPlugin.h │ │ │ │ │ ├── DoraemonViewCheckPlugin.m │ │ │ │ │ └── Function/ │ │ │ │ │ ├── DoraemonViewCheckManager.h │ │ │ │ │ ├── DoraemonViewCheckManager.m │ │ │ │ │ ├── DoraemonViewCheckView.h │ │ │ │ │ └── DoraemonViewCheckView.m │ │ │ │ └── ViewMetrics/ │ │ │ │ ├── DoraemonMetricsViewController.h │ │ │ │ ├── DoraemonMetricsViewController.m │ │ │ │ ├── DoraemonViewMetricsPlugin.h │ │ │ │ ├── DoraemonViewMetricsPlugin.m │ │ │ │ └── Function/ │ │ │ │ ├── DoraemonViewMetricsConfig.h │ │ │ │ ├── DoraemonViewMetricsConfig.m │ │ │ │ ├── UIView+DoraemonViewMetrics.h │ │ │ │ └── UIView+DoraemonViewMetrics.m │ │ │ └── Util/ │ │ │ ├── BSBacktraceLogger/ │ │ │ │ ├── DoraemonBacktraceLogger.h │ │ │ │ └── DoraemonBacktraceLogger.m │ │ │ ├── BuriedPoint/ │ │ │ │ ├── DoraemonBuriedPointManager.h │ │ │ │ └── DoraemonBuriedPointManager.m │ │ │ ├── DoraemonNetworkUtil.h │ │ │ ├── DoraemonNetworkUtil.m │ │ │ ├── DoraemonStatisticsUtil.h │ │ │ ├── DoraemonStatisticsUtil.m │ │ │ ├── DoraemonThreadSafeMutableArray.h │ │ │ ├── DoraemonThreadSafeMutableArray.m │ │ │ ├── DoraemonThreadSafeMutableDictionary.h │ │ │ ├── DoraemonThreadSafeMutableDictionary.m │ │ │ ├── DoraemonUtil.h │ │ │ ├── DoraemonUtil.m │ │ │ ├── Doraemoni18NUtil.h │ │ │ ├── Doraemoni18NUtil.m │ │ │ └── fishhook/ │ │ │ ├── doraemon_fishhook.c │ │ │ └── doraemon_fishhook.h │ │ ├── Database/ │ │ │ ├── DoraemonDatabasePlugin.h │ │ │ ├── DoraemonDatabasePlugin.m │ │ │ ├── DoraemonDatabaseViewController.h │ │ │ └── DoraemonDatabaseViewController.m │ │ ├── GPS/ │ │ │ ├── DoraemonGPSPlugin.h │ │ │ ├── DoraemonGPSPlugin.m │ │ │ ├── DoraemonGPSViewController.h │ │ │ ├── DoraemonGPSViewController.m │ │ │ ├── Function/ │ │ │ │ ├── CLLocationManager+Doraemon.h │ │ │ │ ├── CLLocationManager+Doraemon.m │ │ │ │ ├── DoraemonGPSMocker.h │ │ │ │ └── DoraemonGPSMocker.m │ │ │ └── View/ │ │ │ ├── DoraemonMockGPSCenterView.h │ │ │ ├── DoraemonMockGPSCenterView.m │ │ │ ├── DoraemonMockGPSInputView.h │ │ │ ├── DoraemonMockGPSInputView.m │ │ │ ├── DoraemonMockGPSOperateView.h │ │ │ └── DoraemonMockGPSOperateView.m │ │ ├── Logger/ │ │ │ ├── DoraemonCocoaLumberjackPlugin.h │ │ │ ├── DoraemonCocoaLumberjackPlugin.m │ │ │ ├── DoraemonCocoaLumberjackViewController.h │ │ │ ├── DoraemonCocoaLumberjackViewController.m │ │ │ ├── Function/ │ │ │ │ ├── DoraemonCocoaLumberjackLogger.h │ │ │ │ ├── DoraemonCocoaLumberjackLogger.m │ │ │ │ ├── DoraemonDDLogMessage.h │ │ │ │ └── DoraemonDDLogMessage.m │ │ │ └── List/ │ │ │ ├── DoraemonCocoaLumberjackLevelView.h │ │ │ ├── DoraemonCocoaLumberjackLevelView.m │ │ │ ├── DoraemonCocoaLumberjackListCell.h │ │ │ ├── DoraemonCocoaLumberjackListCell.m │ │ │ ├── DoraemonCocoaLumberjackListViewController.h │ │ │ └── DoraemonCocoaLumberjackListViewController.m │ │ ├── MLeaksFinder/ │ │ │ ├── Detail/ │ │ │ │ ├── DoraemonMLeaksFinderDetailViewController.h │ │ │ │ └── DoraemonMLeaksFinderDetailViewController.m │ │ │ ├── DoraemonMLeaksFinderPlugin.h │ │ │ ├── DoraemonMLeaksFinderPlugin.m │ │ │ ├── DoraemonMLeaksFinderViewController.h │ │ │ ├── DoraemonMLeaksFinderViewController.m │ │ │ ├── Function/ │ │ │ │ ├── Extra/ │ │ │ │ │ ├── DoraemonMemoryLeakData.h │ │ │ │ │ └── DoraemonMemoryLeakData.m │ │ │ │ ├── MLeakedObjectProxy.h │ │ │ │ ├── MLeakedObjectProxy.m │ │ │ │ ├── MLeaksFinder.h │ │ │ │ ├── NSObject+MemoryLeak.h │ │ │ │ ├── NSObject+MemoryLeak.m │ │ │ │ ├── UIApplication+MemoryLeak.h │ │ │ │ ├── UIApplication+MemoryLeak.m │ │ │ │ ├── UINavigationController+MemoryLeak.h │ │ │ │ ├── UINavigationController+MemoryLeak.m │ │ │ │ ├── UIPageViewController+MemoryLeak.h │ │ │ │ ├── UIPageViewController+MemoryLeak.m │ │ │ │ ├── UISplitViewController+MemoryLeak.h │ │ │ │ ├── UISplitViewController+MemoryLeak.m │ │ │ │ ├── UITabBarController+MemoryLeak.h │ │ │ │ ├── UITabBarController+MemoryLeak.m │ │ │ │ ├── UITouch+MemoryLeak.h │ │ │ │ ├── UITouch+MemoryLeak.m │ │ │ │ ├── UIView+MemoryLeak.h │ │ │ │ ├── UIView+MemoryLeak.m │ │ │ │ ├── UIViewController+MemoryLeak.h │ │ │ │ └── UIViewController+MemoryLeak.m │ │ │ └── List/ │ │ │ ├── DoraemonMLeaksFinderListCell.h │ │ │ ├── DoraemonMLeaksFinderListCell.m │ │ │ ├── DoraemonMLeaksFinderListViewController.h │ │ │ └── DoraemonMLeaksFinderListViewController.m │ │ ├── MethodUseTime/ │ │ │ ├── DoraemonMethodUseTimePlugin.h │ │ │ ├── DoraemonMethodUseTimePlugin.m │ │ │ ├── DoraemonMethodUseTimeViewController.h │ │ │ ├── DoraemonMethodUseTimeViewController.m │ │ │ ├── Function/ │ │ │ │ ├── DoraemonMethodUseTimeManager.h │ │ │ │ └── DoraemonMethodUseTimeManager.m │ │ │ └── List/ │ │ │ ├── DoraemonMethodUseTimeListCell.h │ │ │ ├── DoraemonMethodUseTimeListCell.m │ │ │ ├── DoraemonMethodUseTimeListViewController.h │ │ │ └── DoraemonMethodUseTimeListViewController.m │ │ ├── MultiControl/ │ │ │ ├── Function/ │ │ │ │ └── EventSync/ │ │ │ │ ├── Communication/ │ │ │ │ │ ├── DoraemonMCClient.h │ │ │ │ │ ├── DoraemonMCClient.m │ │ │ │ │ ├── DoraemonMCServer.h │ │ │ │ │ └── DoraemonMCServer.m │ │ │ │ ├── Dispatcher/ │ │ │ │ │ ├── DoraemonMCCommandExcutor.h │ │ │ │ │ ├── DoraemonMCCommandExcutor.m │ │ │ │ │ ├── DoraemonMCCommandGenerator.h │ │ │ │ │ └── DoraemonMCCommandGenerator.m │ │ │ │ ├── Event/ │ │ │ │ │ ├── Capture/ │ │ │ │ │ │ ├── DoraemonMCEventCapturer.h │ │ │ │ │ │ ├── DoraemonMCEventCapturer.m │ │ │ │ │ │ ├── DoraemonMCGestureTargetActionPair.h │ │ │ │ │ │ ├── DoraemonMCGestureTargetActionPair.m │ │ │ │ │ │ ├── DoraemonMCReuseViewDelegateProxy.h │ │ │ │ │ │ └── DoraemonMCReuseViewDelegateProxy.m │ │ │ │ │ └── Excutor/ │ │ │ │ │ ├── DoraemonMCEventHandler.h │ │ │ │ │ └── DoraemonMCEventHandler.m │ │ │ │ ├── MessagePackager/ │ │ │ │ │ ├── DoraemonMCMessagePackager.h │ │ │ │ │ └── DoraemonMCMessagePackager.m │ │ │ │ ├── Serialize/ │ │ │ │ │ ├── EventInfo/ │ │ │ │ │ │ ├── DoraemonMCGustureSerializer.h │ │ │ │ │ │ ├── DoraemonMCGustureSerializer.m │ │ │ │ │ │ ├── UIControl+DoraemonMCSerializer.h │ │ │ │ │ │ ├── UIControl+DoraemonMCSerializer.m │ │ │ │ │ │ ├── UIGestureRecognizer+DoraemonMCSerializer.h │ │ │ │ │ │ ├── UIGestureRecognizer+DoraemonMCSerializer.m │ │ │ │ │ │ ├── UILongPressGestureRecognizer+DoraemonMCSerializer.h │ │ │ │ │ │ ├── UILongPressGestureRecognizer+DoraemonMCSerializer.m │ │ │ │ │ │ ├── UIPanGestureRecognizer+DoraemonMCSerializer.h │ │ │ │ │ │ ├── UIPanGestureRecognizer+DoraemonMCSerializer.m │ │ │ │ │ │ ├── UIPinchGestureRecognizer+DoraemonMCSerializer.h │ │ │ │ │ │ ├── UIPinchGestureRecognizer+DoraemonMCSerializer.m │ │ │ │ │ │ ├── UIResponder+DoraemonMCSerializer.h │ │ │ │ │ │ ├── UIResponder+DoraemonMCSerializer.m │ │ │ │ │ │ ├── UIRotationGestureRecognizer+DoraemonMCSerializer.h │ │ │ │ │ │ ├── UIRotationGestureRecognizer+DoraemonMCSerializer.m │ │ │ │ │ │ ├── UISwipeGestureRecognizer+DoraemonMCSerializer.h │ │ │ │ │ │ ├── UISwipeGestureRecognizer+DoraemonMCSerializer.m │ │ │ │ │ │ ├── UITapGestureRecognizer+DoraemonMCSerializer.h │ │ │ │ │ │ └── UITapGestureRecognizer+DoraemonMCSerializer.m │ │ │ │ │ └── XPath/ │ │ │ │ │ ├── DoraemonMCXPathSerializer.h │ │ │ │ │ └── DoraemonMCXPathSerializer.m │ │ │ │ └── Utils/ │ │ │ │ ├── NSObject+DoraemonMCSupport.h │ │ │ │ └── NSObject+DoraemonMCSupport.m │ │ │ ├── Plugin/ │ │ │ │ ├── DoraemonMultiControlPlugin.h │ │ │ │ └── DoraemonMultiControlPlugin.m │ │ │ └── UserInterface/ │ │ │ └── Main/ │ │ │ ├── DoraemonMCViewController.h │ │ │ └── DoraemonMCViewController.m │ │ └── Weex/ │ │ ├── DevTool/ │ │ │ ├── DoraemonWeexDevToolViewController.h │ │ │ ├── DoraemonWeexDevToolViewController.m │ │ │ ├── DoraemonWeexDevTooloPlugin.h │ │ │ └── DoraemonWeexDevTooloPlugin.m │ │ ├── Info/ │ │ │ ├── DoraemonWeexInfoPlugin.h │ │ │ ├── DoraemonWeexInfoPlugin.m │ │ │ ├── DoraemonWeexInfoViewController.h │ │ │ ├── DoraemonWeexInfoViewController.m │ │ │ ├── Function/ │ │ │ │ ├── DoraemonWeexInfoAnalyzer.h │ │ │ │ ├── DoraemonWeexInfoAnalyzer.m │ │ │ │ ├── DoraemonWeexInfoDataManager.h │ │ │ │ └── DoraemonWeexInfoDataManager.m │ │ │ └── View/ │ │ │ ├── DoraemonWeexInfoCell.h │ │ │ ├── DoraemonWeexInfoCell.m │ │ │ ├── DoraemonWeexInfoHeaderView.h │ │ │ └── DoraemonWeexInfoHeaderView.m │ │ ├── Log/ │ │ │ ├── DoraemonWeexLogPlugin.h │ │ │ ├── DoraemonWeexLogPlugin.m │ │ │ ├── DoraemonWeexLogViewController.h │ │ │ ├── DoraemonWeexLogViewController.m │ │ │ ├── Function/ │ │ │ │ ├── DoraemonWeexLogDataSource.h │ │ │ │ ├── DoraemonWeexLogDataSource.m │ │ │ │ ├── DoraemonWeexLogger.h │ │ │ │ └── DoraemonWeexLogger.m │ │ │ ├── Model/ │ │ │ │ ├── DoraemonWeexLogModel.h │ │ │ │ └── DoraemonWeexLogModel.m │ │ │ └── View/ │ │ │ ├── DoraemonWeexLogCell.h │ │ │ ├── DoraemonWeexLogCell.m │ │ │ ├── DoraemonWeexLogLevelView.h │ │ │ ├── DoraemonWeexLogLevelView.m │ │ │ ├── DoraemonWeexLogSearchView.h │ │ │ └── DoraemonWeexLogSearchView.m │ │ └── Storage/ │ │ ├── DoraemonWeexStoragePlugin.h │ │ ├── DoraemonWeexStoragePlugin.m │ │ ├── DoraemonWeexStorageViewController.h │ │ ├── DoraemonWeexStorageViewController.m │ │ ├── Function/ │ │ │ ├── DoraemonWeexStorageResolver.h │ │ │ └── DoraemonWeexStorageResolver.m │ │ └── View/ │ │ ├── DoraemonWeexStorageCell.h │ │ ├── DoraemonWeexStorageCell.m │ │ ├── DoraemonWeexStorageRowView.h │ │ ├── DoraemonWeexStorageRowView.m │ │ ├── DoraemonWeexStorageShowView.h │ │ └── DoraemonWeexStorageShowView.m │ ├── DoraemonKitDemo/ │ │ ├── DoraemonKitDemo/ │ │ │ ├── Assets.xcassets/ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Contents.json │ │ │ │ ├── emoji.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── zhaoliyin.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Base.lproj/ │ │ │ │ └── LaunchScreen.storyboard │ │ │ ├── DemoVC/ │ │ │ │ ├── Base/ │ │ │ │ │ ├── DoraemonDemoBaseViewController.h │ │ │ │ │ └── DoraemonDemoBaseViewController.m │ │ │ │ ├── Common/ │ │ │ │ │ ├── DoraemonDemoCommonViewController.h │ │ │ │ │ └── DoraemonDemoCommonViewController.m │ │ │ │ ├── Crash/ │ │ │ │ │ ├── DoraemonDemoCrashMRCView.h │ │ │ │ │ ├── DoraemonDemoCrashMRCView.m │ │ │ │ │ ├── DoraemonDemoCrashViewController.h │ │ │ │ │ └── DoraemonDemoCrashViewController.m │ │ │ │ ├── Home/ │ │ │ │ │ ├── DoraemonDemoHomeViewController.h │ │ │ │ │ └── DoraemonDemoHomeViewController.m │ │ │ │ ├── Logger/ │ │ │ │ │ ├── DoraemonDemoLoggerViewController.h │ │ │ │ │ └── DoraemonDemoLoggerViewController.m │ │ │ │ ├── MemoryLeak/ │ │ │ │ │ ├── DoraemonDemoMemoryLeakModel.h │ │ │ │ │ ├── DoraemonDemoMemoryLeakModel.m │ │ │ │ │ ├── DoraemonDemoMemoryLeakView.h │ │ │ │ │ ├── DoraemonDemoMemoryLeakView.m │ │ │ │ │ ├── DoraemonDemoMemoryLeakViewController.h │ │ │ │ │ └── DoraemonDemoMemoryLeakViewController.m │ │ │ │ ├── MockGPS/ │ │ │ │ │ ├── DoraemonDemoMockGPSAnnotation.h │ │ │ │ │ ├── DoraemonDemoMockGPSAnnotation.m │ │ │ │ │ ├── DoraemonDemoMockGPSViewController.h │ │ │ │ │ └── DoraemonDemoMockGPSViewController.m │ │ │ │ ├── MultiControl/ │ │ │ │ │ ├── DoraemonDemoMultiConLongPressGesture.h │ │ │ │ │ ├── DoraemonDemoMultiConLongPressGesture.m │ │ │ │ │ ├── DoraemonDemoMultiConPinchGesture.h │ │ │ │ │ ├── DoraemonDemoMultiConPinchGesture.m │ │ │ │ │ ├── DoraemonDemoMultiConRotationGesture.h │ │ │ │ │ ├── DoraemonDemoMultiConRotationGesture.m │ │ │ │ │ ├── DoraemonDemoMultiConScreenEdgePanGesture.h │ │ │ │ │ ├── DoraemonDemoMultiConScreenEdgePanGesture.m │ │ │ │ │ ├── DoraemonDemoMultiConSwipeGesture.h │ │ │ │ │ ├── DoraemonDemoMultiConSwipeGesture.m │ │ │ │ │ ├── DoraemonDemoMultiConTapGesture.h │ │ │ │ │ ├── DoraemonDemoMultiConTapGesture.m │ │ │ │ │ ├── DoraemonDemoMultiControlViewController.h │ │ │ │ │ ├── DoraemonDemoMultiControlViewController.m │ │ │ │ │ ├── DoraemonDemoMultiSlideView.h │ │ │ │ │ └── DoraemonDemoMultiSlideView.m │ │ │ │ ├── Net/ │ │ │ │ │ ├── NSURLProtocol/ │ │ │ │ │ │ ├── DoraemonDemoURLProtocol1.h │ │ │ │ │ │ ├── DoraemonDemoURLProtocol1.m │ │ │ │ │ │ ├── DoraemonDemoURLProtocol2.h │ │ │ │ │ │ └── DoraemonDemoURLProtocol2.m │ │ │ │ │ ├── Cell/ │ │ │ │ │ │ ├── DoraemonDemoNetTableViewCell.h │ │ │ │ │ │ └── DoraemonDemoNetTableViewCell.m │ │ │ │ │ ├── DoraemonDemoNetViewController.h │ │ │ │ │ ├── DoraemonDemoNetViewController.m │ │ │ │ │ ├── Image/ │ │ │ │ │ │ ├── DoraemonDemoImageShowViewController.h │ │ │ │ │ │ ├── DoraemonDemoImageShowViewController.m │ │ │ │ │ │ ├── DoraemonDemoImageViewController.h │ │ │ │ │ │ └── DoraemonDemoImageViewController.m │ │ │ │ │ └── WebView/ │ │ │ │ │ ├── DoraemonUIWebViewViewController.h │ │ │ │ │
Showing preview only (1,022K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (11524 symbols across 822 files)
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/AopApp.java
class AopApp (line 30) | public class AopApp extends Application {
method onCreate (line 31) | @Override
method attachBaseContext (line 82) | @Override
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/AMapUtil.java
class AMapUtil (line 24) | public class AMapUtil {
method checkEditText (line 28) | public static String checkEditText(EditText editText) {
method stringToSpan (line 37) | public static Spanned stringToSpan(String src) {
method colorFont (line 41) | public static String colorFont(String src, String color) {
method makeHtmlNewLine (line 49) | public static String makeHtmlNewLine() {
method makeHtmlSpace (line 53) | public static String makeHtmlSpace(int number) {
method getFriendlyLength (line 62) | public static String getFriendlyLength(int lenMeter) {
method IsEmptyOrNullString (line 89) | public static boolean IsEmptyOrNullString(String s) {
method convertToLatLonPoint (line 96) | public static LatLonPoint convertToLatLonPoint(LatLng latlon) {
method convertToLatLng (line 103) | public static LatLng convertToLatLng(LatLonPoint latLonPoint) {
method convertArrList (line 110) | public static ArrayList<LatLng> convertArrList(List<LatLonPoint> shape...
method convertToTime (line 122) | public static String convertToTime(long time) {
method getFriendlyTime (line 131) | public static String getFriendlyTime(int second) {
method getDriveActionID (line 145) | public static int getDriveActionID(String actionName) {
method getWalkActionID (line 176) | public static int getWalkActionID(String actionName) {
method getBusPathTitle (line 214) | public static String getBusPathTitle(BusPath busPath) {
method getBusPathDes (line 250) | public static String getBusPathDes(BusPath busPath) {
method getSimpleBusLineName (line 263) | public static String getSimpleBusLineName(String busLineName) {
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/ChString.java
class ChString (line 3) | public class ChString {
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/DrivingRouteOverLay.java
class DrivingRouteOverLay (line 27) | public class DrivingRouteOverLay extends RouteOverlay{
method setIsColorfulline (line 41) | public void setIsColorfulline(boolean iscolorfulline) {
method DrivingRouteOverLay (line 52) | public DrivingRouteOverLay(Context context, AMap amap, DrivePath path,
method getRouteWidth (line 63) | public float getRouteWidth() {
method setRouteWidth (line 72) | public void setRouteWidth(float mWidth) {
method addToMap (line 79) | public void addToMap() {
method initPolylineOptions (line 128) | private void initPolylineOptions() {
method showPolyline (line 136) | private void showPolyline() {
method colorWayUpdate (line 146) | private void colorWayUpdate(List<TMC> tmcSection) {
method getcolor (line 185) | private int getcolor(String status) {
method convertToLatLng (line 200) | public LatLng convertToLatLng(LatLonPoint point) {
method addDrivingStationMarkers (line 208) | private void addDrivingStationMarkers(DriveStep driveStep, LatLng latL...
method getLatLngBounds (line 217) | @Override
method setThroughPointIconVisibility (line 232) | public void setThroughPointIconVisibility(boolean visible) {
method addThroughPointMarker (line 246) | private void addThroughPointMarker() {
method getThroughPointBitDes (line 266) | private BitmapDescriptor getThroughPointBitDes() {
method calculateDistance (line 278) | public static int calculateDistance(LatLng start, LatLng end) {
method calculateDistance (line 286) | public static int calculateDistance(double x1, double y1, double x2, d...
method getPointForDis (line 311) | public static LatLng getPointForDis(LatLng sPt, LatLng ePt, double dis) {
method removeFromMap (line 319) | @Override
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/FloatGpsMockRouteKitView.java
class FloatGpsMockRouteKitView (line 16) | public class FloatGpsMockRouteKitView extends SimpleDoKitView {
method run (line 26) | @Override
method getLayoutId (line 37) | @Override
method onViewCreated (line 43) | @Override
method setMockLocationConfig (line 50) | private void setMockLocationConfig() {
method updateRoute (line 112) | private void updateRoute(Context context, int index) {
method updateRouteUI (line 117) | private void updateRouteUI(int index) {
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/FloatGpsPresetMockKit.java
class FloatGpsPresetMockKit (line 18) | public class FloatGpsPresetMockKit extends AbstractKit {
method getName (line 21) | @Override
method getIcon (line 26) | @Override
method onClickWithReturn (line 31) | @Override
method onAppInit (line 47) | @Override
method isInnerKit (line 52) | @Override
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/FloatGpsPresetMockKitView.java
class FloatGpsPresetMockKitView (line 20) | public class FloatGpsPresetMockKitView extends SimpleDoKitView {
method getLayoutId (line 24) | @Override
method onViewCreated (line 30) | @Override
method setMockLocationConfig (line 37) | private void setMockLocationConfig() {
method updateCurrentLocConfig (line 77) | private void updateCurrentLocConfig(LocInfo currentConfig) {
method updateGsonInfo (line 82) | private void updateGsonInfo(String currentConfig, TextView envInfo) {
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/RouteOverlay.java
class RouteOverlay (line 23) | public class RouteOverlay {
method RouteOverlay (line 35) | public RouteOverlay(Context context) {
method removeFromMap (line 43) | public void removeFromMap() {
method destroyBit (line 60) | private void destroyBit() {
method getStartBitmapDescriptor (line 87) | protected BitmapDescriptor getStartBitmapDescriptor() {
method getEndBitmapDescriptor (line 95) | protected BitmapDescriptor getEndBitmapDescriptor() {
method getBusBitmapDescriptor (line 103) | protected BitmapDescriptor getBusBitmapDescriptor() {
method getWalkBitmapDescriptor (line 111) | protected BitmapDescriptor getWalkBitmapDescriptor() {
method getDriveBitmapDescriptor (line 115) | protected BitmapDescriptor getDriveBitmapDescriptor() {
method addStartAndEndMarker (line 119) | protected void addStartAndEndMarker() {
method zoomToSpan (line 134) | public void zoomToSpan() {
method getLatLngBounds (line 148) | protected LatLngBounds getLatLngBounds() {
method setNodeIconVisibility (line 159) | public void setNodeIconVisibility(boolean visible) {
method addStationMarker (line 172) | protected void addStationMarker(MarkerOptions options) {
method addPolyLine (line 183) | protected void addPolyLine(PolylineOptions options) {
method getRouteWidth (line 193) | protected float getRouteWidth() {
method getWalkColor (line 197) | protected int getWalkColor() {
method getBusColor (line 206) | protected int getBusColor() {
method getDriveColor (line 210) | protected int getDriveColor() {
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/mockroute/BearingUtils.java
class BearingUtils (line 7) | public final class BearingUtils {
method BearingUtils (line 8) | private BearingUtils() {
method bearing (line 11) | public static double bearing(double lat1, double lon1, double lat2, do...
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/mockroute/LogUtils.java
class LogUtils (line 10) | public final class LogUtils {
method getBackThread (line 20) | static HandlerThread getBackThread() {
method getHandler (line 32) | static Handler getHandler() {
method LogUtils (line 43) | private LogUtils() {
method d (line 46) | public static void d(String logKey, CharSequence msg) {
method d (line 50) | public static void d(String logKey, final CharSequence msg, final Obje...
method d (line 57) | public static void d(String logKey, CharSequence msg, int stackIndex) {
method d (line 65) | public static void d(CharSequence msg) {
method i (line 74) | public static void i(String logKey, CharSequence msg, int stackIndex) {
method i (line 83) | public static void i(String logKey, CharSequence msg) {
method v (line 87) | public static void v(String logKey, CharSequence msg, int stackIndex) {
method v (line 96) | public static void v(String logKey, CharSequence msg) {
method w (line 100) | public static void w(String logKey, CharSequence msg) {
method e (line 114) | public static void e(String tag, Throwable tr) {
method e (line 123) | public static void e(String logKey, CharSequence msg) {
method e (line 132) | public static void e(String logKey, CharSequence msg, Throwable e) {
method t (line 144) | public static void t(String logKey, CharSequence msg) {
method timeSinceLast (line 162) | public static void timeSinceLast() {
method getLineText (line 168) | public static String getLineText(String msg, int stackIndex) {
method getLineText (line 178) | public static String getLineText(String msg) {
method build (line 192) | private static String build(CharSequence log, StackTraceElement ste) {
method build (line 219) | private static String build(String logKey, CharSequence msg, StackTrac...
method build (line 225) | private static String build(String logKey, CharSequence msg, StackTrac...
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/mockroute/MockGPSTaskData.java
class MockGPSTaskData (line 9) | public class MockGPSTaskData {
method toString (line 17) | @Override
class MockGPSItem (line 24) | public static class MockGPSItem {
method toString (line 34) | @Override
method setLng (line 46) | public MockGPSItem setLng(Double lng) {
method setLat (line 51) | public MockGPSItem setLat(Double lat) {
method setTime (line 56) | public MockGPSItem setTime(Long time) {
method setAccuracy (line 61) | public MockGPSItem setAccuracy(Float accuracy) {
method setSpeed (line 66) | public MockGPSItem setSpeed(Double speed) {
method setBearing (line 71) | public MockGPSItem setBearing(Long bearing) {
method modifyBearing (line 78) | public static void modifyBearing(ArrayList<MockGPSItem> mockGPSItems) {
FILE: Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/mockroute/MockGPSTaskManager.java
class MockGPSTaskManager (line 32) | public class MockGPSTaskManager {
method MockGPSTaskManager (line 49) | public MockGPSTaskManager(MockGPSTaskData mockGPSTaskData) {
method startGpsMockTask (line 55) | public Observable<Location> startGpsMockTask() {
method startGpsMockTask (line 123) | @Nullable
method pause (line 149) | public void pause() {
method resume (line 156) | public void resume() {
method setSkip (line 166) | public MockGPSTaskManager setSkip(boolean skip) {
method getPeriodLevel (line 176) | public static int getPeriodLevel() {
method setPeriodLevel (line 186) | public static void setPeriodLevel(int periodLevel) {
method checkMockLocationState (line 195) | public boolean checkMockLocationState() {
method getSeekProgress (line 200) | public Long getSeekProgress() {
method seekProgress (line 204) | public MockGPSTaskManager seekProgress(Long progress) {
method completed (line 215) | public boolean completed() {
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/AopTest.java
class AopTest (line 12) | public class AopTest {
method getDoKit (line 15) | public void getDoKit() {
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/BaseStatusBarActivity.java
class BaseStatusBarActivity (line 23) | public class BaseStatusBarActivity extends AppCompatActivity {
method onCreate (line 25) | @Override
method preUpdateStatusBar (line 32) | private void preUpdateStatusBar(Activity activity) {
method setLightStatusBar (line 40) | private void setLightStatusBar() {
method setNotLightStatusBar (line 47) | private void setNotLightStatusBar() {
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/db/PersonDBHelper.java
class PersonDBHelper (line 33) | public class PersonDBHelper extends SQLiteOpenHelper {
method PersonDBHelper (line 43) | public PersonDBHelper(Context context) {
method onCreate (line 47) | @Override
method onUpgrade (line 55) | @Override
method insertPerson (line 61) | public boolean insertPerson(String firstName, String lastName, String ...
method getData (line 72) | public Cursor getData(int id) {
method numberOfRows (line 78) | public int numberOfRows() {
method updatePerson (line 84) | public boolean updatePerson(Integer id, String firstName, String lastN...
method deletePerson (line 95) | public Integer deletePerson(Integer id) {
method getAllPerson (line 102) | public ArrayList<String> getAllPerson() {
method count (line 120) | public int count() {
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/SimpleDoKitView.java
class SimpleDoKitView (line 29) | public abstract class SimpleDoKitView extends AbsDoKitView {
method onEnterForeground (line 39) | @Override
method onEnterBackground (line 45) | @Override
method showContainer (line 51) | public void showContainer(boolean isChecked) {
method onCreate (line 56) | @Override
method onCreateView (line 67) | @Override
method onViewCreated (line 73) | @Override
method getLayoutId (line 91) | protected abstract int getLayoutId();
method initDokitViewLayoutParams (line 94) | @Override
method onBackPressed (line 103) | @Override
method shouldDealBackKey (line 109) | @Override
method initView (line 114) | protected void initView() {
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/ViewSetupHelper.java
class ViewSetupHelper (line 9) | public final class ViewSetupHelper {
method ViewSetupHelper (line 10) | private ViewSetupHelper() {
method setupButton (line 13) | public static void setupButton(View container, int viewId, String titl...
method setVisible (line 24) | public static void setVisible(View container, int viewId, boolean visi...
method setupToggleButton (line 28) | public static void setupToggleButton(View container, int viewId, Strin...
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/FileUtils.java
class FileUtils (line 17) | public class FileUtils {
method getFileFromAssetsFile (line 27) | public static File getFileFromAssetsFile(String fileName) {
method readString (line 33) | public static String readString(InputStream inputStream) throws Except...
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/MyProxyWebView.java
class MyProxyWebView (line 16) | public class MyProxyWebView {
method MyProxyWebView (line 21) | public MyProxyWebView(WebView webView) {
method getWebView (line 25) | public WebView getWebView() {
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/MyTestWebView.java
class MyTestWebView (line 20) | public class MyTestWebView extends WebView {
method MyTestWebView (line 22) | public MyTestWebView(Context context) {
method MyTestWebView (line 26) | public MyTestWebView(Context context, AttributeSet attrs) {
method MyTestWebView (line 30) | public MyTestWebView(Context context, AttributeSet attrs, int defStyle...
method MyTestWebView (line 34) | public MyTestWebView(Context context, AttributeSet attrs, int defStyle...
method loadUrl (line 38) | @Override
method loadUrl (line 43) | @Override
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/MyTestWebViewBuilder.java
class MyTestWebViewBuilder (line 21) | public class MyTestWebViewBuilder {
method MyTestWebViewBuilder (line 30) | public MyTestWebViewBuilder(MyProxyWebView mKDWebView, String initUrl) {
method load (line 35) | public void load(String url, Map<String, String> headers) {
method create (line 43) | public MyProxyWebView create() {
method create2 (line 54) | public MyProxyWebView create2(String a, String b, String c, String d, ...
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/mc/SlideBar.java
class SlideBar (line 23) | public class SlideBar extends FrameLayout {
method setOnUnlockListener (line 43) | public void setOnUnlockListener(OnUnlockListener listener) {
method SlideBar (line 47) | public SlideBar(Context context) {
method SlideBar (line 51) | public SlideBar(Context context, AttributeSet attrs) {
method SlideBar (line 55) | public SlideBar(Context context, AttributeSet attrs, int defStyle) {
method init (line 61) | private void init(Context context, AttributeSet attrs) {
method reset (line 91) | public void reset() {
method setLabel (line 114) | public void setLabel(CharSequence s) {
method onTouchEvent (line 118) | @Override
method setMarginLeftExtra (line 162) | public void setMarginLeftExtra(int leftMargin) {
type OnUnlockListener (line 170) | public interface OnUnlockListener {
method onUnlock (line 171) | void onUnlock(View view);
method progress (line 173) | void progress(View view, int leftMargin);
method setBackgroundColor (line 182) | public void setBackgroundColor(int color) {
method setForegroundColor (line 193) | public void setForegroundColor(int color) {
method setBorderRadius (line 204) | public void setBorderRadius(float radius) {
method setDragAble (line 213) | public void setDragAble(boolean able) {
method performClick (line 223) | @Override
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/module/DoKitItemView.java
class DoKitItemView (line 29) | public class DoKitItemView extends FrameLayout {
method DoKitItemView (line 42) | public DoKitItemView(@NonNull Context context) {
method DoKitItemView (line 46) | public DoKitItemView(@NonNull Context context, @Nullable AttributeSet ...
method DoKitItemView (line 51) | public DoKitItemView(@NonNull Context context, @Nullable AttributeSet ...
method init (line 56) | private void init(Context context, @Nullable AttributeSet attrs) {
method onFinishInflate (line 75) | @Override
method dpToPx (line 99) | private int dpToPx(int dp) {
method getItemText (line 103) | public String getItemText() {
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/module/ModuleActivity.java
class ModuleActivity (line 15) | public class ModuleActivity {
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/module/ShadowDrawable.java
class ShadowDrawable (line 32) | public class ShadowDrawable extends Drawable {
method ShadowDrawable (line 44) | private ShadowDrawable(int shape, int[] bgColor, int shapeRadius, int ...
method setBounds (line 58) | public void setBounds(int left, int top, int right, int bottom) {
method draw (line 63) | public void draw(@NonNull Canvas canvas) {
method setAlpha (line 84) | public void setAlpha(int alpha) {
method setColorFilter (line 88) | public void setColorFilter(@Nullable ColorFilter colorFilter) {
method getOpacity (line 92) | public int getOpacity() {
method setShadowDrawable (line 97) | public static void setShadowDrawable(View view, Drawable drawable) {
method setShadowDrawable (line 102) | public static void setShadowDrawable(View view, int shapeRadius, int s...
method setShadowDrawable (line 108) | public static void setShadowDrawable(View view, int bgColor, int shape...
method setShadowDrawable (line 114) | public static void setShadowDrawable(View view, int shape, int bgColor...
method setShadowDrawable (line 120) | public static void setShadowDrawable(View view, int[] bgColor, int sha...
class Builder (line 126) | public static class Builder {
method Builder (line 135) | public Builder() {
method setShape (line 142) | public ShadowDrawable.Builder setShape(int mShape) {
method setShapeRadius (line 147) | public ShadowDrawable.Builder setShapeRadius(int ShapeRadius) {
method setShadowColor (line 152) | public ShadowDrawable.Builder setShadowColor(int shadowColor) {
method setShadowRadius (line 157) | public ShadowDrawable.Builder setShadowRadius(int shadowRadius) {
method setOffsetX (line 162) | public ShadowDrawable.Builder setOffsetX(int OffsetX) {
method setOffsetY (line 167) | public ShadowDrawable.Builder setOffsetY(int OffsetY) {
method setBgColor (line 172) | public ShadowDrawable.Builder setBgColor(int BgColor) {
method setBgColor (line 177) | public ShadowDrawable.Builder setBgColor(int[] BgColor) {
method builder (line 182) | public ShadowDrawable builder() {
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/test/ScreenRecordingService.java
class ScreenRecordingService (line 50) | public class ScreenRecordingService extends Service {
method stopService (line 67) | public static void stopService() {
method onCreate (line 73) | @Override
method onDestroy (line 82) | @Override
method onStartCommand (line 90) | @SuppressLint("WrongConstant")
method run (line 150) | @Override
method acquireLatestImage (line 164) | public void acquireLatestImage() {
method onBind (line 185) | @Nullable
FILE: Android/app/src/main/java/com/didichuxing/doraemondemo/test/ScreenRecordingTest.java
class ScreenRecordingTest (line 24) | public class ScreenRecordingTest {
method start (line 30) | public void start(Activity activity) {
method startService (line 37) | public void startService() {
method onActivityResult (line 42) | public void onActivityResult(int requestCode, int resultCode, @Nullabl...
FILE: Android/app/src/test/java/com/didichuxing/doraemondemo/TestJava.java
class TestJava (line 16) | public class TestJava {
method test (line 18) | @Test
FILE: Android/dokit-autotest/src/main/java/com/didichuxing/doraemonkit/kit/autotest/ui/AutotestPage.java
type AutotestPage (line 14) | public enum AutotestPage {
FILE: Android/dokit-autotest/src/main/java/com/didichuxing/doraemonkit/kit/autotest/ui/DoKitAutotestActivity.java
class DoKitAutotestActivity (line 24) | public class DoKitAutotestActivity extends NewBaseActivity {
method onCreate (line 28) | @Override
method newHomeFragment (line 50) | public void newHomeFragment() {
method changeFragment (line 54) | public void changeFragment(AutotestPage page) {
method pushFragment (line 58) | public void pushFragment(AutotestPage page) {
method changeFragment (line 62) | public void changeFragment(AutotestPage page, boolean push) {
FILE: Android/dokit-autotest/src/test/java/com/didichuxing/doraemonkit/kit/autotest/ExampleUnitTest.java
class ExampleUnitTest (line 12) | public class ExampleUnitTest {
method addition_isCorrect (line 13) | @Test
FILE: Android/dokit-gps-mock/src/androidTest/java/com/didichuxing/doraemonkit/ExampleInstrumentedTest.java
class ExampleInstrumentedTest (line 18) | @RunWith(AndroidJUnit4.class)
method useAppContext (line 20) | @Test
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/common/BdMapRouteData.java
class BdMapRouteData (line 9) | public class BdMapRouteData {
method getAllPoints (line 33) | public List<LatLng> getAllPoints() {
method setAllPoints (line 37) | public void setAllPoints(List<LatLng> allPoints) {
method getTotalDistance (line 42) | public int getTotalDistance() {
method setTotalDistance (line 46) | public void setTotalDistance(int totalDistance) {
method getStartNode (line 50) | public RouteNode getStartNode() {
method setStartNode (line 54) | public void setStartNode(RouteNode startNode) {
method getTerminalNode (line 58) | public RouteNode getTerminalNode() {
method setTerminalNode (line 62) | public void setTerminalNode(RouteNode terminalNode) {
method getRandomDriftPoints (line 66) | public List<LatLng> getRandomDriftPoints() {
method setRandomDriftPoints (line 70) | public void setRandomDriftPoints(List<LatLng> randomDriftPoints) {
method getRouteDriftPoints (line 75) | public List<LatLng> getRouteDriftPoints() {
method setRouteDriftPoints (line 79) | public void setRouteDriftPoints(List<LatLng> routeDriftPoints) {
method getOriginRouteLostLocPoints (line 85) | public List<LatLng> getOriginRouteLostLocPoints() {
method setOriginRouteLostLocPoints (line 89) | public void setOriginRouteLostLocPoints(List<LatLng> routeLostLocPoint...
method isRouteDataFromBiz (line 94) | public boolean isRouteDataFromBiz() {
method setRouteDataFromBiz (line 98) | public void setRouteDataFromBiz(boolean routeDataFromBiz) {
method getRandomDriftDistance (line 102) | public int getRandomDriftDistance() {
method setRandomDriftDistance (line 106) | public void setRandomDriftDistance(int randomDriftDistance) {
method getRouteDriftDistance (line 110) | public int getRouteDriftDistance() {
method setRouteDriftDistance (line 114) | public void setRouteDriftDistance(int routeDriftDistance) {
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/common/Utils.java
class Utils (line 18) | public class Utils {
method createDropAnimator (line 21) | public static ValueAnimator createDropAnimator(final View v, int start...
method createAlphaAnimator (line 32) | public static Animator createAlphaAnimator(View view, float start, flo...
method createRotateAnimator (line 37) | public static Animator createRotateAnimator(View view, float start, fl...
method set (line 51) | public static void set(Object obj, String propertyName, Object propert...
method getAround (line 68) | public static double[] getAround(double centerLat, double centerLng, d...
method getDistance (line 85) | public static double getDistance(LatLng startLagLng, LatLng desLagLng) {
method getRouteDistance (line 94) | public static double getRouteDistance(List<LatLng> points) {
method getRandomLatLng (line 106) | public static double[] getRandomLatLng(double latitude, double longitu...
method getOrientLatDiffer (line 126) | public static double getOrientLatDiffer(double[] rangeAround) {
method getOrientationLatLng (line 133) | public static double[] getOrientationLatLng(double centerLat, double c...
method randomSet (line 148) | public static void randomSet(int min, int max, int n, HashSet<Integer>...
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/BinderHookHandler.java
class BinderHookHandler (line 17) | public class BinderHookHandler implements InvocationHandler {
method BinderHookHandler (line 22) | public BinderHookHandler(IBinder binder, BaseServiceHooker hooker) {
method invoke (line 27) | @Override
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/CordTransformUtil.java
class CordTransformUtil (line 3) | public class CordTransformUtil {
method gcj02tobd09 (line 12) | public static Point gcj02tobd09(double lat, double lng) {
method wgs84togcj02 (line 23) | public static Point wgs84togcj02(double lat, double lng) {
method gcj02towgs84 (line 40) | public static Point gcj02towgs84(double lat, double lng) {
method wgs84tobd09 (line 59) | public static Point wgs84tobd09(double lat, double lng) {
method bd09togcj02 (line 84) | public Point bd09togcj02(double bd_lat, double bd_lon) {
method transformlat (line 94) | private static double transformlat(double lat, double lng) {
method transformlng (line 104) | private static double transformlng(double lat, double lng) {
method main (line 112) | public static void main(String[] args) { //两次谷歌转换为百度坐标 //第一次 W...
class Point (line 122) | public static class Point {
method toString (line 125) | @Override
method Point (line 130) | public Point(double lat, double lng) {
method getLatitude (line 135) | public double getLatitude() {
method setLatitude (line 139) | public Point setLatitude(double lat) {
method getLongitude (line 144) | public double getLongitude() {
method setLongitude (line 148) | public Point setLongitude(double lng) {
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/GpsMockFragment.java
class GpsMockFragment (line 83) | public class GpsMockFragment extends BaseFragment implements View.OnClic...
method onReceiveLocation (line 150) | @Override
method onCreate (line 165) | @Override
method onViewCreated (line 171) | @Override
method initView (line 181) | private void initView() {
method initBdLocAndMap (line 254) | private void initBdLocAndMap() {
method initSpinner (line 316) | private void initSpinner() {
method initData (line 361) | private void initData() {
method drawRoute (line 404) | private void drawRoute() {
method onResume (line 433) | @Override
method onClick (line 439) | @Override
method drawAndMockRoute (line 481) | private void drawAndMockRoute() {
method onRouteMockFinish (line 523) | @Override
method onCheckedChanged (line 529) | @Override
method onItemSelect (line 547) | @Override
method selectPosition (line 562) | private void selectPosition() {
method checkPosMockToggle (line 570) | private boolean checkPosMockToggle() {
method onPosMockCbChange (line 574) | private void onPosMockCbChange(boolean isChecked) {
method checkRouteMockToggle (line 594) | private boolean checkRouteMockToggle() {
method onRouteMockCbChange (line 599) | private void onRouteMockCbChange(boolean isChecked) {
method saveMockToggle (line 627) | private void saveMockToggle() {
method checkDriftToggle (line 638) | private boolean checkDriftToggle() {
method onRouteDriftMockCbChange (line 642) | private void onRouteDriftMockCbChange(boolean isChecked) {
method onLostLocMockCbChange (line 654) | private void onLostLocMockCbChange(boolean isChecked){
method getInputSpeed (line 658) | private float getInputSpeed() {
method getInputDriftAccuracy (line 668) | private int getInputDriftAccuracy() {
method showDriftLayout (line 679) | private void showDriftLayout(boolean isChecked) {
method getPosMockInput (line 694) | private LatLng getPosMockInput() {
method moveToLoc (line 715) | private void moveToLoc(double latitude, double longitude, float zoomLe...
method checkInput (line 729) | private boolean checkInput() {
method onRequestLayout (line 767) | @Override
method onMapStatusChangeStart (line 772) | @Override
method onMapStatusChangeStart (line 777) | @Override
method onMapStatusChange (line 786) | @Override
method onMapStatusChangeFinish (line 791) | @Override
method searchPoi (line 806) | private void searchPoi(com.baidu.mapapi.model.LatLng center) {
method setPosEdtText (line 815) | private void setPosEdtText(double lnt, double lat) {
method onGetGeoCodeResult (line 822) | @Override
method onGetReverseGeoCodeResult (line 827) | @Override
method getPoiInfo (line 852) | private String getPoiInfo(ReverseGeoCodeResult reverseGeoCodeResult) {
method onGetWalkingRouteResult (line 872) | @Override
method onGetTransitRouteResult (line 877) | @Override
method onGetMassTransitRouteResult (line 882) | @Override
method onGetDrivingRouteResult (line 887) | @Override
method transform2MockDataAndPerformMock (line 916) | private void transform2MockDataAndPerformMock(DrivingRouteLine driving...
method onGetIndoorRouteResult (line 943) | @Override
method onGetBikingRouteResult (line 948) | @Override
method hideDriftSettingAnim (line 953) | private AnimatorSet hideDriftSettingAnim() {
method showDriftSettingAnim (line 972) | private AnimatorSet showDriftSettingAnim() {
method onTransitionStarted (line 1006) | @Override
method onTransitionChange (line 1018) | @Override
method onTransitionCompleted (line 1023) | @Override
method onTransitionTrigger (line 1028) | @Override
method onPause (line 1034) | @Override
method onDestroy (line 1040) | @Override
type DriftMode (line 1077) | public static enum DriftMode {
method DriftMode (line 1081) | private DriftMode() {
type DriftType (line 1085) | public static enum DriftType {
method DriftType (line 1089) | private DriftType() {
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/GpsMockManager.java
class GpsMockManager (line 25) | public class GpsMockManager {
method GpsMockManager (line 56) | private GpsMockManager() {
method getInstance (line 59) | public static GpsMockManager getInstance() {
method startMock (line 63) | public void startMock() {
method stopMock (line 67) | public void stopMock() {
method mockLocation (line 71) | private void mockLocation(double latitude, double longitude) {
method mockLocationWithNotify (line 76) | public void mockLocationWithNotify(double latitude, double longitude) {
method mockLocationWithNotify (line 84) | public void mockLocationWithNotify(Location location) {
method isMocking (line 115) | public boolean isMocking() {
method getLatitude (line 119) | public double getLatitude() {
method getLongitude (line 123) | public double getLongitude() {
method isMockEnable (line 127) | public boolean isMockEnable() {
class Holder (line 131) | private static class Holder {
method mockAMapNavLocation (line 137) | public static boolean mockAMapNavLocation() {
method setMockAMapNavLocation (line 141) | public static void setMockAMapNavLocation(boolean mockAMapNavLocation) {
method isFromMockProvider (line 145) | public static boolean isFromMockProvider() {
method setIsFromMockProvider (line 149) | public static void setIsFromMockProvider(boolean isFromMockProvider) {
method isMockingRoute (line 153) | public boolean isMockingRoute() {
method getBdMockDrivingRouteLine (line 157) | public BdMapRouteData getBdMockDrivingRouteLine() {
method setBdMockDrivingRouteLine (line 161) | public void setBdMockDrivingRouteLine(BdMapRouteData bdMockDrivingRout...
method performMock (line 165) | public void performMock(LatLng latLng) {
method startMockRouteLine (line 172) | public void startMockRouteLine(List<com.baidu.mapapi.model.LatLng> poi...
method setStatusCallback (line 192) | public void setStatusCallback(RouteMockThread.RouteMockStatusCallback ...
method removeStatusCallback (line 198) | public void removeStatusCallback() {
method interruptRouteMockThread (line 207) | public void interruptRouteMockThread() {
method suspendRouteMock (line 216) | public void suspendRouteMock(boolean suspend) {
method calculateOriginRouteWithLocLost (line 222) | public void calculateOriginRouteWithLocLost(double progressLow, double...
method calculateDriftRouteWithLocLost (line 250) | public void calculateDriftRouteWithLocLost(double progressLow, double ...
method calculateDriftRoute (line 287) | public void calculateDriftRoute(double radius, double progressLow, dou...
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/LocationBuilder.java
class LocationBuilder (line 10) | public class LocationBuilder {
method LocationBuilder (line 18) | public LocationBuilder() {
method toAMapLocation (line 21) | public static AMapLocation toAMapLocation(Location location) {
method toAMapNaviLocation (line 30) | public static AMapNaviLocation toAMapNaviLocation(Location location) {
method toTencentLocation (line 42) | public static TencentLocationImp toTencentLocation(Location location) {
method toBdLocation (line 54) | public static BDLocation toBdLocation(Location location) {
method fromLocation (line 67) | public LocationBuilder fromLocation(Location location) {
method setLatitude (line 77) | public LocationBuilder setLatitude(double latitude) {
method setLongitude (line 82) | public LocationBuilder setLongitude(double longitude) {
method setSpeed (line 87) | public LocationBuilder setSpeed(float speed) {
method setBearing (line 92) | public LocationBuilder setBearing(float bearing) {
method setTime (line 97) | public LocationBuilder setTime(long time) {
method setHorizontalAccuracyMeters (line 102) | public LocationBuilder setHorizontalAccuracyMeters(float horizontalAcc...
method build (line 107) | public Location build() {
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/LocationHookHandler.java
class LocationHookHandler (line 19) | public class LocationHookHandler implements InvocationHandler {
method LocationHookHandler (line 24) | @SuppressWarnings("unchecked")
method invoke (line 37) | @Override
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/LocationHooker.java
class LocationHooker (line 30) | public class LocationHooker extends BaseServiceHooker {
method serviceName (line 35) | @Override
method stubName (line 45) | @Override
method registerMethodHandlers (line 50) | @NonNull
method replaceBinderProxy (line 63) | @Override
class GetLastKnownLocationMethodHandler (line 77) | static class GetLastKnownLocationMethodHandler extends MethodHandler {
method onInvoke (line 87) | @Override
class GetLastLocationMethodHandler (line 108) | static class GetLastLocationMethodHandler extends MethodHandler {
method onInvoke (line 110) | @Override
class RegisterGnssStatusCallbackMethodHandler (line 132) | static class RegisterGnssStatusCallbackMethodHandler extends MethodHan...
method onInvoke (line 134) | @Override
class LocationListenerProxy (line 155) | public static class LocationListenerProxy implements LocationListener {
method LocationListenerProxy (line 161) | private LocationListenerProxy(LocationListener locationListener) {
method onLocationChanged (line 166) | @Override
method onStatusChanged (line 180) | @Override
method onProviderEnabled (line 187) | @Override
method onProviderDisabled (line 194) | @Override
class RequestLocationUpdatesMethodHandler (line 205) | static class RequestLocationUpdatesMethodHandler extends MethodHandler {
method onInvoke (line 215) | @Override
method buildValidLocation (line 241) | private static Location buildValidLocation(String provider) {
class GnssStatusCallbackProxy (line 265) | @RequiresApi(api = Build.VERSION_CODES.N)
method GnssStatusCallbackProxy (line 269) | public GnssStatusCallbackProxy(GnssStatus.Callback mCallback) {
method onStarted (line 273) | @Override
method onStopped (line 281) | @Override
method onFirstFix (line 289) | @Override
method onSatelliteStatusChanged (line 297) | @Override
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/RouteMockThread.java
class RouteMockThread (line 11) | public class RouteMockThread extends Thread {
method run (line 24) | @Override
method reset (line 56) | private void reset() {
method notifyThread (line 69) | public void notifyThread(boolean suspend) {
method isSuspend (line 78) | public boolean isSuspend() {
method isMocking (line 82) | public boolean isMocking() {
method setMocking (line 86) | public void setMocking(boolean mocking) {
method getPoints (line 90) | public List<LatLng> getPoints() {
method setPoints (line 94) | public void setPoints(List<LatLng> points) {
method setIntervalTime (line 99) | public void setIntervalTime(long intervalTime) {
method getIntervalTime (line 103) | public long getIntervalTime() {
method setRouteMockStatusCallback (line 107) | public void setRouteMockStatusCallback(RouteMockStatusCallback routeMo...
method clearRouteMockStatusCallback (line 111) | public void clearRouteMockStatusCallback(){
type RouteMockStatusCallback (line 115) | public interface RouteMockStatusCallback{
method onRouteMockFinish (line 116) | void onRouteMockFinish();
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/TelephonyHooker.java
class TelephonyHooker (line 17) | public class TelephonyHooker extends BaseServiceHooker {
method serviceName (line 18) | @Override
method stubName (line 23) | @Override
method registerMethodHandlers (line 28) | @Override
method replaceBinderProxy (line 37) | @Override
class GetAllCellInfoMethodHandler (line 42) | static class GetAllCellInfoMethodHandler extends MethodHandler {
method onInvoke (line 44) | @Override
class GetCellLocationMethodHandler (line 53) | static class GetCellLocationMethodHandler extends MethodHandler {
method onInvoke (line 55) | @Override
class ListenMethodHandler (line 65) | static class ListenMethodHandler extends MethodHandler {
method onInvoke (line 66) | @Override
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/TencentLocationImp.java
class TencentLocationImp (line 10) | class TencentLocationImp implements TencentLocation {
method TencentLocationImp (line 43) | public TencentLocationImp() {
method setIsMockGps (line 46) | public TencentLocationImp setIsMockGps(int isMockGps) {
method getProvider (line 51) | @Override
method setProvider (line 56) | public TencentLocationImp setProvider(String provider) {
method getLatitude (line 61) | @Override
method setLatitude (line 66) | public TencentLocationImp setLatitude(double latitude) {
method getLongitude (line 71) | @Override
method setLongitude (line 76) | public TencentLocationImp setLongitude(double longitude) {
method getAltitude (line 81) | @Override
method setAltitude (line 86) | public TencentLocationImp setAltitude(double altitude) {
method getAccuracy (line 91) | @Override
method setAccuracy (line 96) | public TencentLocationImp setAccuracy(float accuracy) {
method getName (line 101) | @Override
method setName (line 106) | public TencentLocationImp setName(String name) {
method getAddress (line 111) | @Override
method setAddress (line 116) | public TencentLocationImp setAddress(String address) {
method getNation (line 121) | @Override
method setNation (line 126) | public TencentLocationImp setNation(String nation) {
method getProvince (line 131) | @Override
method setProvince (line 136) | public TencentLocationImp setProvince(String province) {
method getCity (line 141) | @Override
method setCity (line 146) | public TencentLocationImp setCity(String city) {
method getDistrict (line 151) | @Override
method setDistrict (line 156) | public TencentLocationImp setDistrict(String district) {
method getTown (line 161) | @Override
method setTown (line 166) | public TencentLocationImp setTown(String town) {
method getVillage (line 171) | @Override
method setVillage (line 176) | public TencentLocationImp setVillage(String village) {
method getStreet (line 181) | @Override
method setStreet (line 186) | public TencentLocationImp setStreet(String street) {
method getStreetNo (line 191) | @Override
method setStreetNo (line 196) | public TencentLocationImp setStreetNo(String streetNo) {
method getAreaStat (line 201) | @Override
method setAreaStat (line 206) | public TencentLocationImp setAreaStat(Integer areaStat) {
method getPoiList (line 211) | @Override
method setPoiList (line 216) | public TencentLocationImp setPoiList(List<TencentPoi> poiList) {
method getBearing (line 221) | @Override
method setBearing (line 226) | public TencentLocationImp setBearing(float bearing) {
method getSpeed (line 231) | @Override
method setSpeed (line 236) | public TencentLocationImp setSpeed(float speed) {
method getTime (line 241) | @Override
method setTime (line 246) | public TencentLocationImp setTime(long time) {
method getElapsedRealtime (line 251) | @Override
method setElapsedRealtime (line 256) | public TencentLocationImp setElapsedRealtime(long elapsedRealtime) {
method getGPSRssi (line 261) | @Override
method setGPSRssi (line 266) | public TencentLocationImp setGPSRssi(int gPSRssi) {
method getIndoorBuildingId (line 271) | @Override
method setIndoorBuildingId (line 276) | public TencentLocationImp setIndoorBuildingId(String indoorBuildingId) {
method getIndoorBuildingFloor (line 281) | @Override
method setIndoorBuildingFloor (line 286) | public TencentLocationImp setIndoorBuildingFloor(String indoorBuilding...
method getIndoorLocationType (line 291) | @Override
method setIndoorLocationType (line 296) | public TencentLocationImp setIndoorLocationType(int indoorLocationType) {
method getDirection (line 301) | @Override
method setDirection (line 306) | public TencentLocationImp setDirection(double direction) {
method getCityCode (line 311) | @Override
method setCityCode (line 316) | public TencentLocationImp setCityCode(String cityCode) {
method getCityPhoneCode (line 321) | @Override
method setCityPhoneCode (line 326) | public TencentLocationImp setCityPhoneCode(String cityPhoneCode) {
method getCoordinateType (line 331) | @Override
method setCoordinateType (line 336) | public TencentLocationImp setCoordinateType(int coordinateType) {
method isMockGps (line 341) | @Override
method getExtra (line 346) | @Override
method setExtra (line 351) | public TencentLocationImp setExtra(Bundle extra) {
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/gpsmock/WifiHooker.java
class WifiHooker (line 18) | public class WifiHooker extends BaseServiceHooker {
method serviceName (line 19) | @Override
method stubName (line 24) | @Override
method registerMethodHandlers (line 29) | @Override
method replaceBinderProxy (line 37) | @Override
class GetScanResultsMethodHandler (line 52) | static class GetScanResultsMethodHandler extends MethodHandler {
method onInvoke (line 54) | @Override
class GetConnectionInfoMethodHandler (line 65) | static class GetConnectionInfoMethodHandler extends MethodHandler {
method onInvoke (line 67) | @Override
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/lbs/common/AMapRouteOverlay.java
class AMapRouteOverlay (line 22) | public class AMapRouteOverlay {
method AMapRouteOverlay (line 34) | public AMapRouteOverlay(Context context) {
method removeFromMap (line 43) | public void removeFromMap() {
method destroyBit (line 60) | private void destroyBit() {
method getStartBitmapDescriptor (line 89) | protected BitmapDescriptor getStartBitmapDescriptor() {
method getEndBitmapDescriptor (line 99) | protected BitmapDescriptor getEndBitmapDescriptor() {
method getBusBitmapDescriptor (line 109) | protected BitmapDescriptor getBusBitmapDescriptor() {
method getWalkBitmapDescriptor (line 119) | protected BitmapDescriptor getWalkBitmapDescriptor() {
method getDriveBitmapDescriptor (line 123) | protected BitmapDescriptor getDriveBitmapDescriptor() {
method addStartAndEndMarker (line 127) | protected void addStartAndEndMarker() {
method zoomToSpan (line 144) | public void zoomToSpan() {
method getLatLngBounds (line 159) | protected LatLngBounds getLatLngBounds() {
method setNodeIconVisibility (line 172) | public void setNodeIconVisibility(boolean visible) {
method addStationMarker (line 185) | protected void addStationMarker(MarkerOptions options) {
method addPolyLine (line 196) | protected void addPolyLine(PolylineOptions options) {
method getRouteWidth (line 206) | protected float getRouteWidth() {
method getWalkColor (line 210) | protected int getWalkColor() {
method getBusColor (line 220) | protected int getBusColor() {
method getDriveColor (line 224) | protected int getDriveColor() {
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/lbs/common/Constants.java
class Constants (line 12) | public final class Constants {
method Constants (line 18) | private Constants() {
method getContext (line 21) | public static Context getContext() {
method setContext (line 25) | public static void setContext(Context context) {
method loadLocationConfigJson (line 29) | public static String loadLocationConfigJson() {
method saveLocationConfigJson (line 33) | public static void saveLocationConfigJson(String locLocalConfigJson) {
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/lbs/common/LocInfo.java
class LocInfo (line 7) | public class LocInfo {
method LocInfo (line 13) | public LocInfo(String locName, double lat, double lng) {
method fromGson (line 20) | public static LocInfo fromGson(String gsonStr) {
method getExtra (line 24) | public ArrayMap<String, Object> getExtra() {
method setExtra (line 28) | public LocInfo setExtra(ArrayMap extra) {
method putExtra (line 33) | public LocInfo putExtra(String key, Object value) {
method getExtra (line 41) | public Object getExtra(String key) {
method equals (line 48) | @Override
method isEquals (line 58) | public static boolean isEquals(Object a, Object b) {
method hashCode (line 62) | @Override
method toString (line 67) | @Override
method toGson (line 72) | public String toGson() {
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/lbs/manual/FloatGpsMockCache.java
class FloatGpsMockCache (line 9) | public class FloatGpsMockCache {
method mockToLocation (line 14) | public static void mockToLocation(double latitude, double longitude) {
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/lbs/manual/GPSTools.java
class GPSTools (line 3) | public final class GPSTools {
method GPSTools (line 4) | private GPSTools() {
method getLngDiff (line 7) | public static double getLngDiff(double lat, double distance) {
method getLatDiff (line 13) | public static double getLatDiff(double distance) {
method rad (line 17) | private static double rad(double d) {
method angle (line 21) | private static double angle(double rad) {
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/lbs/manual/PosAdjustKitView.java
class PosAdjustKitView (line 28) | public class PosAdjustKitView extends AbsDoKitView {
method onCreate (line 39) | @Override
method onCreateView (line 44) | @Override
method onViewCreated (line 49) | @Override
method initDokitViewLayoutParams (line 55) | @Override
method setMockLocationConfig (line 64) | private void setMockLocationConfig() {
method updateSpeedView (line 172) | private void updateSpeedView(TextView mockSpeed, SeekBar seekBar) {
method updateCurrentLocConfig (line 177) | private void updateCurrentLocConfig(LocInfo currentConfig) {
method updateGsonInfo (line 182) | private void updateGsonInfo(String currentConfig, TextView envInfo) {
method moveMockLocation (line 191) | private void moveMockLocation(int latDistance, int lngDistance) {
method copyToClipboard (line 203) | private void copyToClipboard(String s) {
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/lbs/preset/FloatGpsPresetMockCache.java
class FloatGpsPresetMockCache (line 11) | public class FloatGpsPresetMockCache {
method FloatGpsPresetMockCache (line 15) | public FloatGpsPresetMockCache() {
method addMockLocConfig (line 24) | public static void addMockLocConfig(@NonNull LocInfo... locInfos) {
method updateCustomMockLocation (line 32) | public static void updateCustomMockLocation(double latitude, double lo...
method addMockLocationConfigWithJson (line 43) | public static void addMockLocationConfigWithJson(String jsonStr) {
method getMockLocConfig (line 53) | @Nullable
method setMockLocConfig (line 65) | public static void setMockLocConfig(LocInfo locInfo) {
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/lbs/preset/MockLocList.java
class MockLocList (line 7) | public class MockLocList extends ArrayList<LocInfo> {
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/lbs/route/FloatGpsRouteMockCache.java
class FloatGpsRouteMockCache (line 21) | public class FloatGpsRouteMockCache {
method FloatGpsRouteMockCache (line 28) | public FloatGpsRouteMockCache() {
method getCurrentLocConfig (line 31) | public static LocInfo getCurrentLocConfig() {
method mockGpsRoute (line 35) | public static void mockGpsRoute(Context context, List<Pair<Double, Dou...
method restartPlayMockRoute (line 43) | public static void restartPlayMockRoute(Context context) {
method resumePlayMockRoute (line 49) | public static void resumePlayMockRoute(Context context) {
method pausePlayMockRoute (line 68) | public static void pausePlayMockRoute() {
method clearMockRoute (line 74) | public static void clearMockRoute() {
method getMockRouteProgress (line 84) | public static int getMockRouteProgress() {
method getRouteCount (line 88) | public static int getRouteCount() {
method setMockRouteProgress (line 92) | public static int setMockRouteProgress(Context context, int index) {
type IOnRouteChange (line 104) | public interface IOnRouteChange {
method onRouteChange (line 105) | void onRouteChange();
method onIndexChange (line 107) | void onIndexChange(int index);
method setRouteChangeListener (line 112) | public static void setRouteChangeListener(IOnRouteChange onRouteChange) {
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/location/GpsStatusUtil.java
class GpsStatusUtil (line 19) | public class GpsStatusUtil {
method wrap (line 27) | public static GpsStatus wrap(GpsStatus status) {
method modifyGpsStatus (line 36) | private static void modifyGpsStatus(GpsStatus gpsStatus) {
method checkSatellite (line 49) | private static void checkSatellite() {
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/map/AMapLocationChangedListenerProxy.java
class AMapLocationChangedListenerProxy (line 22) | public class AMapLocationChangedListenerProxy implements LocationSource....
method AMapLocationChangedListenerProxy (line 26) | public AMapLocationChangedListenerProxy(LocationSource.OnLocationChang...
method onLocationChanged (line 31) | @Override
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/map/AMapLocationClientProxy.java
class AMapLocationClientProxy (line 24) | public class AMapLocationClientProxy {
method getLastKnownLocation (line 27) | public static AMapLocation getLastKnownLocation(AMapLocationClient cli...
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/map/AMapLocationListenerProxy.java
class AMapLocationListenerProxy (line 25) | public class AMapLocationListenerProxy implements AMapLocationListener {
method AMapLocationListenerProxy (line 29) | public AMapLocationListenerProxy(AMapLocationListener aMapLocationList...
method onLocationChanged (line 34) | @Override
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/map/AMapLocationSourceProxy.java
class AMapLocationSourceProxy (line 15) | public class AMapLocationSourceProxy implements LocationSource {
method AMapLocationSourceProxy (line 18) | public AMapLocationSourceProxy(LocationSource mLocationSource) {
method activate (line 23) | @Override
method deactivate (line 32) | @Override
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/map/AMapNaviListenerProxy.java
class AMapNaviListenerProxy (line 21) | public class AMapNaviListenerProxy extends AMapNaviListenerProxyNoOp {
method AMapNaviListenerProxy (line 26) | public AMapNaviListenerProxy(@NonNull AMapNaviListener naviListener) {
method onLocationChange (line 33) | @Override
method onCalculateRouteSuccess (line 39) | @Override
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/map/AMapNaviListenerProxyDelegate.java
class AMapNaviListenerProxyDelegate (line 33) | public class AMapNaviListenerProxyDelegate {
method AMapNaviListenerProxyDelegate (line 36) | public AMapNaviListenerProxyDelegate() {
method onLocationChange (line 40) | public void onLocationChange(AMapNaviLocation aMapNaviLocation) {
method onCalculateRouteSuccess (line 50) | public void onCalculateRouteSuccess(AMapCalcRouteResult aMapCalcRouteR...
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/map/AMapNaviListenerProxyNoOp.java
class AMapNaviListenerProxyNoOp (line 34) | public class AMapNaviListenerProxyNoOp implements MyNaviListener {
method AMapNaviListenerProxyNoOp (line 40) | public AMapNaviListenerProxyNoOp(@NonNull AMapNaviListener naviListene...
method getNaviListener (line 44) | public AMapNaviListener getNaviListener() {
method onInitNaviFailure (line 49) | @Override
method onInitNaviSuccess (line 54) | @Override
method onStartNavi (line 59) | @Override
method onTrafficStatusUpdate (line 64) | @Override
method onLocationChange (line 69) | @Override
method onGetNavigationText (line 74) | @Override
method onGetNavigationText (line 79) | @Override
method onEndEmulatorNavi (line 84) | @Override
method onArriveDestination (line 89) | @Override
method onCalculateRouteFailure (line 94) | @Override
method onReCalculateRouteForYaw (line 99) | @Override
method onReCalculateRouteForTrafficJam (line 104) | @Override
method onArrivedWayPoint (line 109) | @Override
method onGpsOpenStatus (line 114) | @Override
method onNaviInfoUpdate (line 119) | @Override
method updateCameraInfo (line 124) | @Override
method updateIntervalCameraInfo (line 129) | @Override
method onServiceAreaUpdate (line 134) | @Override
method showCross (line 139) | @Override
method hideCross (line 144) | @Override
method showModeCross (line 149) | @Override
method hideModeCross (line 154) | @Override
method showLaneInfo (line 159) | @Override
method showLaneInfo (line 164) | @Override
method hideLaneInfo (line 169) | @Override
method onCalculateRouteSuccess (line 174) | @Override
method notifyParallelRoad (line 179) | @Override
method OnUpdateTrafficFacility (line 184) | @Override
method OnUpdateTrafficFacility (line 189) | @Override
method updateAimlessModeStatistics (line 194) | @Override
method updateAimlessModeCongestionInfo (line 199) | @Override
method onPlayRing (line 204) | @Override
method onCalculateRouteSuccess (line 209) | @Override
method onCalculateRouteFailure (line 214) | @Override
method onNaviRouteNotify (line 219) | @Override
method onGpsSignalWeak (line 224) | @Override
method onInnerNaviInfoUpdate (line 232) | @Override
method onInnerNaviInfoUpdate (line 239) | @Override
method onUpdateTmcStatus (line 246) | @Override
method onStopNavi (line 253) | @Override
method onSelectRouteId (line 260) | @Override
method updateBackupPath (line 267) | @Override
method onSuggestChangePath (line 274) | @Override
method onUpdateNaviPath (line 281) | @Override
method onUpdateGpsSignalStrength (line 288) | @Override
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/map/BDAbsLocationListenerProxy.java
class BDAbsLocationListenerProxy (line 19) | public class BDAbsLocationListenerProxy extends BDAbstractLocationListen...
method BDAbsLocationListenerProxy (line 22) | public BDAbsLocationListenerProxy(BDAbstractLocationListener bdLocatio...
method onReceiveLocation (line 28) | @Override
method onConnectHotSpotMessage (line 45) | @Override
method onLocDiagnosticMessage (line 53) | @Override
method onReceiveVdrLocation (line 62) | @Override
method onReceiveLocString (line 71) | @Override
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/map/BDLocationListenerProxy.java
class BDLocationListenerProxy (line 18) | public class BDLocationListenerProxy implements BDLocationListener {
method BDLocationListenerProxy (line 21) | public BDLocationListenerProxy(BDLocationListener bdLocationListener) {
method onReceiveLocation (line 27) | @Override
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/map/TencentLocationListenerProxy.java
class TencentLocationListenerProxy (line 18) | public class TencentLocationListenerProxy implements TencentLocationList...
method TencentLocationListenerProxy (line 22) | public TencentLocationListenerProxy(TencentLocationListener tencentLoc...
method onLocationChanged (line 32) | @Override
method onStatusUpdate (line 55) | @Override
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/map/ThirdMapLocationListenerUtil.java
class ThirdMapLocationListenerUtil (line 21) | public class ThirdMapLocationListenerUtil {
method unRegisterAmapLocationListener (line 22) | public static AMapLocationListenerProxy unRegisterAmapLocationListener...
method unRegisterAmapNaviListener (line 26) | public static AMapNaviListenerProxy unRegisterAmapNaviListener(AMapNav...
method unRegisterTencentLocationListener (line 30) | public static TencentLocationListenerProxy unRegisterTencentLocationLi...
method unRegisterBDLocationListener (line 34) | public static BDLocationListenerProxy unRegisterBDLocationListener(BDL...
method unRegisterBDLocationListener (line 38) | public static BDAbsLocationListenerProxy unRegisterBDLocationListener(...
method unRegisterDMapLocationListener (line 42) | public static void unRegisterDMapLocationListener(DMapLocationListener...
method unRegisterLocationListener (line 46) | public static void unRegisterLocationListener(LocationListener locatio...
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/widget/CustomDialogFragment.java
class CustomDialogFragment (line 15) | public class CustomDialogFragment extends DialogFragment {
method CustomDialogFragment (line 19) | public CustomDialogFragment(int contentLayoutId, IDialogHelper dialogH...
method onCreate (line 24) | @Override
method onCreateView (line 30) | @Nullable
method onViewCreated (line 37) | @Override
method onActivityCreated (line 43) | @Override
method onDestroy (line 48) | @Override
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/widget/DrivingRouteOverlay.java
class DrivingRouteOverlay (line 24) | public class DrivingRouteOverlay extends OverlayManager {
method DrivingRouteOverlay (line 34) | public DrivingRouteOverlay(BaiduMap baiduMap) {
method getOverlayOptions (line 146) | @Override
method getPolylineOptions (line 253) | @Override
method setData (line 266) | public void setData(DrivingRouteLine routeLine) {
method setBdMapRouteData (line 270) | public void setBdMapRouteData(BdMapRouteData bdMapRouteData){
method getStartMarker (line 279) | public BitmapDescriptor getStartMarker() {
method getLineColor (line 288) | public int getLineColor() {
method getCustomTextureList (line 292) | public List<BitmapDescriptor> getCustomTextureList() {
method getTerminalMarker (line 307) | public BitmapDescriptor getTerminalMarker() {
method onRouteNodeClick (line 317) | public boolean onRouteNodeClick(int i) {
method onMarkerClick (line 325) | @Override
method onPolylineClick (line 337) | @Override
method setFocus (line 351) | public void setFocus(boolean flag) {
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/widget/IDialogHelper.java
type IDialogHelper (line 5) | public interface IDialogHelper {
method init (line 6) | void init(View root);
method onDestroy (line 8) | void onDestroy();
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/widget/OverlayManager.java
class OverlayManager (line 46) | public abstract class OverlayManager implements OnMarkerClickListener, O...
method OverlayManager (line 74) | public OverlayManager(BaiduMap baiduMap) {
method getOverlayOptions (line 90) | public abstract List<OverlayOptions> getOverlayOptions();
method getPolylineOptions (line 92) | public abstract OverlayOptions getPolylineOptions(List<LatLng> points,...
method addToMap (line 97) | public final void addToMap(boolean lostLocChecked) {
method addDriftRouteToMap (line 126) | public final void addDriftRouteToMap(BdMapRouteData bdMapRouteData, in...
method addDotToMap (line 149) | public final Overlay addDotToMap(LatLng point, int radiusPx, int color) {
method addDriftRandomDotToMap (line 155) | public final void addDriftRandomDotToMap(List<LatLng> points, int colo...
method addDriftRandomRouteToMap (line 170) | public final void addDriftRandomRouteToMap(BdMapRouteData bdMapRouteDa...
method getBitmap (line 193) | private Bitmap getBitmap(int vectorDrawableId) {
method addLocMark (line 210) | public final void addLocMark(LatLng latLng) {
method addCircleOptions (line 229) | public final void addCircleOptions(LatLng latLng, int radius) {
method addPointMark (line 241) | public final Overlay addPointMark(LatLng latLng, int radiusPx, int col...
method removeAllRouteFromMap (line 248) | public final void removeAllRouteFromMap() {
method removeDriftRouteFromMap (line 253) | public final void removeDriftRouteFromMap() {
method removeOriginRouteFromMap (line 279) | public final void removeOriginRouteFromMap() {
method zoomToSpan (line 297) | public void zoomToSpan() {
method zoomToSpanPaddingBounds (line 323) | public void zoomToSpanPaddingBounds(int paddingLeft, int paddingTop, i...
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/widget/PositionSelectDialogHelper.java
class PositionSelectDialogHelper (line 23) | public class PositionSelectDialogHelper implements IDialogHelper, TextWa...
method PositionSelectDialogHelper (line 36) | public PositionSelectDialogHelper(Context context, PositionSelectRecyc...
method init (line 41) | @Override
method initRecyclerView (line 55) | private void initRecyclerView() {
method searchSuggestPos (line 69) | private void searchSuggestPos(String keyWord){
method onClick (line 75) | @Override
method beforeTextChanged (line 82) | @Override
method onTextChanged (line 87) | @Override
method afterTextChanged (line 98) | @Override
method onGetSuggestionResult (line 103) | @Override
method onDestroy (line 116) | @Override
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/widget/PositionSelectRecyclerAdapter.java
class PositionSelectRecyclerAdapter (line 17) | public class PositionSelectRecyclerAdapter extends RecyclerView.Adapter<...
method PositionSelectRecyclerAdapter (line 22) | public PositionSelectRecyclerAdapter(List<SuggestionResult.SuggestionI...
method onCreateViewHolder (line 26) | @NonNull
method onBindViewHolder (line 34) | @Override
method getItemCount (line 47) | @Override
class PositionItemHolder (line 52) | public static class PositionItemHolder extends RecyclerView.ViewHolder {
method PositionItemHolder (line 58) | public PositionItemHolder(View itemView) {
method bindView (line 65) | public void bindView(SuggestionResult.SuggestionInfo suggestionInfo) {
method setItemSelectedCallback (line 74) | public void setItemSelectedCallback(IPositionItemSelectedCallback mIte...
type IPositionItemSelectedCallback (line 78) | public interface IPositionItemSelectedCallback {
method onItemSelect (line 79) | void onItemSelect(SuggestionResult.SuggestionInfo suggestionInfo);
FILE: Android/dokit-gps-mock/src/main/java/com/didichuxing/doraemonkit/gps_mock/widget/SeekRangeBar.java
class SeekRangeBar (line 24) | public class SeekRangeBar extends View {
method SeekRangeBar (line 58) | public SeekRangeBar(Context context) {
method SeekRangeBar (line 62) | public SeekRangeBar(Context context, AttributeSet attrs) {
method SeekRangeBar (line 66) | public SeekRangeBar(Context context, AttributeSet attrs, int defStyle) {
method onMeasure (line 110) | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
method onLayout (line 125) | protected void onLayout(boolean changed, int l, int t, int r, int b) {
method onDraw (line 132) | protected void onDraw(Canvas canvas) {
method onTouchEvent (line 170) | @Override
method setEditable (line 260) | public void setEditable(boolean _b) {
method getAreaFlag (line 268) | public int getAreaFlag(MotionEvent e) {
method setProgressLow (line 294) | public void setProgressLow(double progressLow) {
method getProgressLow (line 300) | public double getProgressLow(){
method setProgressHigh (line 309) | public void setProgressHigh(double progressHigh) {
method getProgressHigh (line 315) | public double getProgressHigh(){
method setOnSeekBarChangeListener (line 324) | public void setOnSeekBarChangeListener(OnSeekBarChangeListener mListen...
type OnSeekBarChangeListener (line 331) | public interface OnSeekBarChangeListener {
method onProgressChanged (line 333) | public void onProgressChanged(SeekRangeBar seekBar, double progressL...
method formatInt (line 339) | private int formatInt(double value) {
FILE: Android/dokit-gps-mock/src/test/java/com/didichuxing/doraemonkit/ExampleUnitTest.java
class ExampleUnitTest (line 12) | public class ExampleUnitTest {
method addition_isCorrect (line 13) | @Test
FILE: Android/dokit-leakcanary/src/main/java/com/didichuxing/doraemonkit/LeakCanaryManager.java
class LeakCanaryManager (line 23) | class LeakCanaryManager {
method install (line 26) | public static void install(Application app) {
method initAidlBridge (line 39) | public static void initAidlBridge(Application application) {
FILE: Android/dokit-leakcanary/src/main/java/com/didichuxing/doraemonkit/abridge/AbridgeCallBack.java
type AbridgeCallBack (line 11) | public interface AbridgeCallBack {
method receiveMessage (line 12) | void receiveMessage(String message);
FILE: Android/dokit-leakcanary/src/main/java/com/didichuxing/doraemonkit/abridge/AbridgeManager.java
class AbridgeManager (line 31) | final class AbridgeManager {
method AbridgeManager (line 42) | private AbridgeManager() {
method getInstance (line 46) | public static AbridgeManager getInstance() {
method init (line 63) | public void init(Application sApplication, String sServicePkgName) {
method registerRemoteCallBack (line 69) | public void registerRemoteCallBack(AbridgeCallBack callBack) {
method uRegisterRemoteCallBack (line 75) | public void uRegisterRemoteCallBack(AbridgeCallBack callBack) {
method callRemote (line 81) | public void callRemote(String message) {
method receiveMessage (line 100) | @Override
method onServiceConnected (line 114) | @Override
method onServiceDisconnected (line 129) | @Override
method startAndBindService (line 138) | public void startAndBindService() {
method unBindService (line 149) | public void unBindService() {
FILE: Android/dokit-leakcanary/src/main/java/com/didichuxing/doraemonkit/abridge/AbridgeMessengerCallBack.java
type AbridgeMessengerCallBack (line 10) | public interface AbridgeMessengerCallBack {
method receiveMessage (line 11) | void receiveMessage(Message message);
FILE: Android/dokit-leakcanary/src/main/java/com/didichuxing/doraemonkit/abridge/AbridgeMessengerManager.java
class AbridgeMessengerManager (line 26) | final class AbridgeMessengerManager {
method AbridgeMessengerManager (line 36) | private AbridgeMessengerManager() {
method getInstance (line 40) | public static AbridgeMessengerManager getInstance() {
method init (line 57) | public void init(Application sApplication, String sServicePkgName) {
method registerRemoteCallBack (line 62) | public void registerRemoteCallBack(AbridgeMessengerCallBack callBack) {
method uRegisterRemoteCallBack (line 68) | public void uRegisterRemoteCallBack(AbridgeMessengerCallBack callBack) {
method callRemote (line 74) | public void callRemote(Message message) {
method handleMessage (line 88) | @Override
method onServiceConnected (line 99) | @Override
method onServiceDisconnected (line 104) | @Override
method startAndBindService (line 110) | public void startAndBindService() {
method unBindService (line 118) | public void unBindService() {
FILE: Android/dokit-leakcanary/src/main/java/com/didichuxing/doraemonkit/abridge/IBridge.java
class IBridge (line 17) | public final class IBridge {
type AbridgeType (line 19) | public enum AbridgeType {
method IBridge (line 23) | private IBridge() {
method init (line 27) | public static void init(@NonNull final Application app, String service...
method recycle (line 37) | public static void recycle() {
method sendAIDLMessage (line 42) | public static void sendAIDLMessage(String message) {
method registerAIDLCallBack (line 46) | public static void registerAIDLCallBack(AbridgeCallBack callBack) {
method uRegisterAIDLCallBack (line 50) | public static void uRegisterAIDLCallBack(AbridgeCallBack callBack) {
method sendMessengerMessage (line 54) | public static void sendMessengerMessage(Message message) {
method registerMessengerCallBack (line 58) | public static void registerMessengerCallBack(AbridgeMessengerCallBack ...
method uRegisterMessengerCallBack (line 62) | public static void uRegisterMessengerCallBack(AbridgeMessengerCallBack...
FILE: Android/dokit-leakcanary/src/main/java/com/didichuxing/doraemonkit/abridge/service/ABridgeService.java
class ABridgeService (line 17) | public class ABridgeService extends Service {
method ABridgeService (line 23) | public ABridgeService() {
method onStartCommand (line 27) | @Override
method onBind (line 33) | @Override
method onDestroy (line 39) | @Override
method join (line 47) | @Override
method leave (line 61) | @Override
method sendMessage (line 79) | @Override
method registerCallback (line 85) | @Override
method unregisterCallback (line 91) | @Override
method findClient (line 98) | private int findClient(IBinder token) {
method onSuccessCallBack (line 107) | private void onSuccessCallBack(String message) {
class Client (line 120) | private final class Client implements IBinder.DeathRecipient {
method Client (line 123) | private Client(IBinder token) {
method binderDied (line 127) | @Override
FILE: Android/dokit-leakcanary/src/main/java/com/didichuxing/doraemonkit/abridge/service/MessengerService.java
class MessengerService (line 16) | public class MessengerService extends Service {
method handleMessage (line 23) | @Override
method MessengerService (line 46) | public MessengerService() {
method onBind (line 49) | @Override
FILE: Android/dokit-leakcanary/src/main/java/com/didichuxing/doraemonkit/kit/leakcanary/LeakCanaryKit.java
class LeakCanaryKit (line 20) | public class LeakCanaryKit extends AbstractKit {
method getName (line 22) | @Override
method getIcon (line 27) | @Override
method onClick (line 32) | @Override
method onAppInit (line 39) | @Override
method isInnerKit (line 44) | @Override
method innerKitId (line 49) | @Override
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/haha/perflib/HahaSpy.java
class HahaSpy (line 23) | public final class HahaSpy {
method allocatingThread (line 25) | public static @NonNull Instance allocatingThread(@NonNull Instance ins...
method allGcRoots (line 41) | public static Set<RootObj> allGcRoots(Snapshot snapshot) {
method HahaSpy (line 49) | private HahaSpy() {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/AbstractAnalysisResultService.java
class AbstractAnalysisResultService (line 29) | public abstract class AbstractAnalysisResultService extends ForegroundSe...
method sendResultToListener (line 33) | public static void sendResultToListener(@NonNull Context context,
method AbstractAnalysisResultService (line 54) | public AbstractAnalysisResultService() {
method onHandleIntentInForeground (line 59) | @Override
method onHeapAnalyzed (line 97) | protected void onHeapAnalyzed(@NonNull AnalyzedHeap analyzedHeap) {
method onHeapAnalyzed (line 105) | @SuppressWarnings("DeprecatedIsStillUsed")
method onAnalysisResultFailure (line 114) | protected void onAnalysisResultFailure(String failureMessage) {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/ActivityRefWatcher.java
class ActivityRefWatcher (line 31) | @SuppressWarnings("DeprecatedIsStillUsed")
method installOnIcsPlus (line 36) | public static void installOnIcsPlus(@NonNull Application application,
method install (line 41) | public static void install(@NonNull Context context, @NonNull RefWatch...
method onActivityDestroyed (line 50) | @Override
method ActivityRefWatcher (line 62) | private ActivityRefWatcher(Application application, RefWatcher refWatc...
method watchActivities (line 67) | public void watchActivities() {
method stopWatchingActivities (line 73) | public void stopWatchingActivities() {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/AnalysisResult.java
class AnalysisResult (line 23) | public final class AnalysisResult implements Serializable {
method noLeak (line 27) | public static @NonNull
method leakDetected (line 32) | public static @NonNull
method failure (line 40) | public static @NonNull
method leakTraceAsFakeException (line 108) | public @NonNull RuntimeException leakTraceAsFakeException() {
method AnalysisResult (line 139) | private AnalysisResult(boolean leakFound, boolean excludedLeak, String...
method classSimpleName (line 150) | private String classSimpleName(String className) {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/AnalyzedHeap.java
class AnalyzedHeap (line 16) | public final class AnalyzedHeap {
method save (line 18) | @Nullable public static File save(@NonNull HeapDump heapDump, @NonNull...
method load (line 41) | @Nullable public static AnalyzedHeap load(@NonNull File resultFile) {
method AnalyzedHeap (line 76) | public AnalyzedHeap(@NonNull HeapDump heapDump, @NonNull AnalysisResul...
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/AnalyzerProgressListener.java
type AnalyzerProgressListener (line 6) | public interface AnalyzerProgressListener {
method onProgressUpdate (line 10) | @Override public void onProgressUpdate(@NonNull Step step) {
type Step (line 15) | enum Step {
method onProgressUpdate (line 26) | void onProgressUpdate(@NonNull Step step);
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/AndroidDebuggerControl.java
class AndroidDebuggerControl (line 20) | public final class AndroidDebuggerControl implements DebuggerControl {
method isDebuggerAttached (line 21) | @Override
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/AndroidExcludedRefs.java
type AndroidExcludedRefs (line 54) | @SuppressWarnings({ "unused", "WeakerAccess" }) // Public API.
method add (line 60) | @Override
method add (line 70) | @Override
method add (line 92) | @Override
method add (line 108) | @Override
method add (line 125) | @Override
method add (line 151) | @Override
method add (line 167) | @Override
method add (line 179) | @Override
method add (line 190) | @Override
method add (line 200) | @Override
method add (line 211) | @Override
method add (line 225) | @Override
method add (line 236) | @Override
method add (line 252) | @Override
method add (line 264) | @Override
method add (line 279) | @Override
method add (line 291) | @Override
method add (line 306) | @Override
method add (line 322) | @Override
method add (line 341) | @Override
method add (line 355) | @Override
method add (line 369) | @Override
method add (line 380) | @Override
method add (line 393) | @Override
method add (line 402) | @Override
method add (line 412) | @Override
method add (line 423) | @Override
method add (line 436) | @Override
method add (line 447) | @Override
method add (line 457) | @Override
method add (line 466) | @Override
method add (line 474) | @Override
method add (line 484) | @Override
method add (line 495) | @Override
method add (line 504) | @Override
method add (line 514) | @Override
method add (line 525) | @Override
method add (line 538) | @Override
method add (line 548) | @Override
method add (line 558) | @Override
method add (line 571) | @Override
method add (line 582) | @Override
method add (line 591) | @Override
method add (line 601) | @Override
method add (line 608) | @Override
method add (line 621) | @Override
method createAndroidDefaults (line 635) | public static @NonNull ExcludedRefs.Builder createAndroidDefaults() {
method createAppDefaults (line 647) | public static @NonNull ExcludedRefs.Builder createAppDefaults() {
method createBuilder (line 651) | public static @NonNull ExcludedRefs.Builder createBuilder(EnumSet<Andr...
method AndroidExcludedRefs (line 664) | AndroidExcludedRefs() {
method AndroidExcludedRefs (line 668) | AndroidExcludedRefs(boolean applies) {
method add (line 672) | abstract void add(ExcludedRefs.Builder excluded);
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/AndroidHeapDumper.java
class AndroidHeapDumper (line 43) | public final class AndroidHeapDumper implements HeapDumper {
method AndroidHeapDumper (line 51) | public AndroidHeapDumper(@NonNull Context context,
method dumpHeap (line 73) | @SuppressWarnings("ReferenceEquality") // Explicitly checking for name...
method showToast (line 112) | private void showToast(final FutureResult<Toast> waitingForToast) {
method cancelToast (line 138) | private void cancelToast(final Toast toast) {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/AndroidReachabilityInspectors.java
type AndroidReachabilityInspectors (line 40) | public enum AndroidReachabilityInspectors {
method AndroidReachabilityInspectors (line 69) | AndroidReachabilityInspectors(Class<? extends Reachability.Inspector> ...
method defaultAndroidInspectors (line 73) | public static @NonNull
class ViewInspector (line 82) | public static class ViewInspector implements Reachability.Inspector {
method expectedReachability (line 83) | @Override
class ActivityInspector (line 97) | public static class ActivityInspector implements Reachability.Inspector {
method expectedReachability (line 98) | @Override
class DialogInspector (line 112) | public static class DialogInspector implements Reachability.Inspector {
method expectedReachability (line 113) | @Override
class ApplicationInspector (line 127) | public static class ApplicationInspector implements Reachability.Inspe...
method expectedReachability (line 128) | @Override
class FragmentInspector (line 138) | public static class FragmentInspector implements Reachability.Inspector {
method expectedReachability (line 139) | @Override
class SupportFragmentInspector (line 153) | public static class SupportFragmentInspector implements Reachability.I...
method expectedReachability (line 154) | @Override
class MessageQueueInspector (line 168) | public static class MessageQueueInspector implements Reachability.Insp...
method expectedReachability (line 169) | @Override
class MortarPresenterInspector (line 185) | public static class MortarPresenterInspector implements Reachability.I...
method expectedReachability (line 186) | @Override
class ViewImplInspector (line 204) | public static class ViewImplInspector implements Reachability.Inspector {
method expectedReachability (line 205) | @Override
class MainThreadInspector (line 219) | public static class MainThreadInspector implements Reachability.Inspec...
method expectedReachability (line 220) | @Override
class WindowInspector (line 234) | public static class WindowInspector implements Reachability.Inspector {
method expectedReachability (line 235) | @Override
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/AndroidRefWatcherBuilder.java
class AndroidRefWatcherBuilder (line 16) | public final class AndroidRefWatcherBuilder extends RefWatcherBuilder<An...
method AndroidRefWatcherBuilder (line 25) | AndroidRefWatcherBuilder(@NonNull Context context) {
method listenerServiceClass (line 33) | public @NonNull
method watchDelay (line 45) | public @NonNull
method watchActivities (line 54) | public @NonNull
method watchFragments (line 65) | public @NonNull
method maxStoredHeapDumps (line 77) | public @NonNull
method buildAndInstall (line 93) | public @NonNull
method isDisabled (line 114) | @Override
method defaultHeapDumper (line 119) | @Override
method defaultDebuggerControl (line 127) | @Override
method defaultHeapDumpListener (line 133) | @Override
method defaultExcludedRefs (line 138) | @Override
method defaultWatchExecutor (line 144) | @Override
method defaultReachabilityInspectorClasses (line 150) | @Override
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/AndroidWatchExecutor.java
class AndroidWatchExecutor (line 32) | public final class AndroidWatchExecutor implements WatchExecutor {
method AndroidWatchExecutor (line 40) | public AndroidWatchExecutor(long initialDelayMillis) {
method execute (line 49) | @Override
method postWaitForIdle (line 60) | private void postWaitForIdle(final Retryable retryable, final int fail...
method waitForIdle (line 69) | private void waitForIdle(final Retryable retryable, final int failedAt...
method postToBackgroundWithDelay (line 80) | private void postToBackgroundWithDelay(final Retryable retryable, fina...
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/CanaryLog.java
class CanaryLog (line 8) | public final class CanaryLog {
type Logger (line 12) | public interface Logger {
method d (line 13) | void d(@NonNull String message, @NonNull Object... args);
method d (line 15) | void d(@Nullable Throwable throwable, @NonNull String message, @NonN...
class DefaultLogger (line 18) | private static class DefaultLogger implements Logger {
method DefaultLogger (line 19) | DefaultLogger() {
method d (line 22) | @Override
method d (line 35) | @Override
method setLogger (line 43) | public static void setLogger(@Nullable Logger logger) {
method d (line 47) | public static void d(@NonNull String message, @NonNull Object... args) {
method d (line 56) | public static void d(@Nullable Throwable throwable,
method CanaryLog (line 67) | private CanaryLog() {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/DebuggerControl.java
type DebuggerControl (line 22) | public interface DebuggerControl {
method isDebuggerAttached (line 24) | @Override public boolean isDebuggerAttached() {
method isDebuggerAttached (line 29) | boolean isDebuggerAttached();
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/DefaultLeakDirectoryProvider.java
class DefaultLeakDirectoryProvider (line 45) | public final class DefaultLeakDirectoryProvider implements LeakDirectory...
method DefaultLeakDirectoryProvider (line 61) | public DefaultLeakDirectoryProvider(@NonNull Context context) {
method DefaultLeakDirectoryProvider (line 65) | public DefaultLeakDirectoryProvider(@NonNull Context context, int maxS...
method listFiles (line 73) | @Override
method newHeapDumpFile (line 93) | @Override
method clearLeakDirectory (line 142) | @Override
method hasStoragePermission (line 158) | @TargetApi(M) private boolean hasStoragePermission() {
method requestWritePermissionNotification (line 171) | private void requestWritePermissionNotification() {
method externalStorageDirectory (line 185) | private File externalStorageDirectory() {
method appStorageDirectory (line 190) | private File appStorageDirectory() {
method directoryWritableAfterMkdirs (line 195) | private boolean directoryWritableAfterMkdirs(File directory) {
method cleanupOldHeapDumps (line 200) | private void cleanupOldHeapDumps() {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/DisplayLeakService.java
class DisplayLeakService (line 41) | public class DisplayLeakService extends AbstractAnalysisResultService {
method onHeapAnalyzed (line 44) | @Override
method onAnalysisResultFailure (line 96) | @Override
method showNotification (line 103) | private void showNotification(PendingIntent pendingIntent, String cont...
method saveResult (line 111) | private boolean saveResult(HeapDump heapDump, AnalysisResult result) {
method renameHeapdump (line 116) | private HeapDump renameHeapdump(HeapDump heapDump) {
method afterDefaultHandling (line 134) | protected void afterDefaultHandling(@NonNull HeapDump heapDump, @NonNu...
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/ExcludedRefs.java
class ExcludedRefs (line 33) | public final class ExcludedRefs implements Serializable {
method builder (line 35) | public static Builder builder() {
method ExcludedRefs (line 44) | ExcludedRefs(BuilderWithParams builder) {
method unmodifiableRefStringMap (line 51) | private Map<String, Map<String, Exclusion>> unmodifiableRefStringMap(
method unmodifiableRefMap (line 60) | private Map<String, Exclusion> unmodifiableRefMap(Map<String, ParamsBu...
method toString (line 68) | @Override public String toString() {
class ParamsBuilder (line 95) | static final class ParamsBuilder {
method ParamsBuilder (line 101) | ParamsBuilder(String matching) {
type Builder (line 106) | public interface Builder {
method instanceField (line 107) | BuilderWithParams instanceField(String className, String fieldName);
method staticField (line 109) | BuilderWithParams staticField(String className, String fieldName);
method thread (line 111) | BuilderWithParams thread(String threadName);
method clazz (line 113) | BuilderWithParams clazz(String className);
method build (line 115) | ExcludedRefs build();
class BuilderWithParams (line 118) | public static final class BuilderWithParams implements Builder {
method BuilderWithParams (line 129) | BuilderWithParams() {
method instanceField (line 132) | @Override public BuilderWithParams instanceField(String className, S...
method staticField (line 145) | @Override public BuilderWithParams staticField(String className, Str...
method thread (line 158) | @Override public BuilderWithParams thread(String threadName) {
method clazz (line 166) | @Override public BuilderWithParams clazz(String className) {
method named (line 173) | public BuilderWithParams named(String name) {
method reason (line 178) | public BuilderWithParams reason(String reason) {
method alwaysExclude (line 183) | public BuilderWithParams alwaysExclude() {
method build (line 188) | @Override public ExcludedRefs build() {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/Exclusion.java
class Exclusion (line 5) | public final class Exclusion implements Serializable {
method Exclusion (line 11) | Exclusion(ExcludedRefs.ParamsBuilder builder) {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/FailTestOnLeakRunListener.java
class FailTestOnLeakRunListener (line 45) | public class FailTestOnLeakRunListener extends RunListener {
method testStarted (line 52) | @Override
method skipLeakDetectionReason (line 73) | protected @Nullable
method testFailure (line 78) | @Override
method testIgnored (line 83) | @Override
method testAssumptionFailure (line 88) | @Override
method testFinished (line 93) | @Override
method testRunStarted (line 99) | @Override
method testRunFinished (line 103) | @Override
method detectLeaks (line 107) | private void detectLeaks() {
method reportLeaks (line 123) | protected void reportLeaks(@NonNull InstrumentationLeakResults results) {
method buildLeakDetectedMessage (line 137) | protected @NonNull
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/GcTrigger.java
type GcTrigger (line 23) | public interface GcTrigger {
method runGc (line 25) | @Override public void runGc() {
method enqueueReferences (line 36) | private void enqueueReferences() {
method runGc (line 47) | void runGc();
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/HahaHelper.java
class HahaHelper (line 34) | public final class HahaHelper {
method threadName (line 41) | static String threadName(Instance holder) {
method extendsThread (line 52) | static boolean extendsThread(ClassObj clazz) {
method valueAsString (line 68) | static String valueAsString(Object value) {
method asString (line 86) | static String asString(Object stringObject) {
method isPrimitiveWrapper (line 140) | public static boolean isPrimitiveWrapper(Object value) {
method isPrimitiveOrWrapperArray (line 147) | public static boolean isPrimitiveOrWrapperArray(Object value) {
method isCharArray (line 158) | private static boolean isCharArray(Object value) {
method isByteArray (line 162) | private static boolean isByteArray(Object value) {
method classInstanceValues (line 166) | static List<ClassInstance.FieldValue> classInstanceValues(Instance ins...
method fieldValue (line 171) | @SuppressWarnings({ "unchecked", "TypeParameterUnusedInFormals" })
method hasField (line 181) | static boolean hasField(List<ClassInstance.FieldValue> values, String ...
method HahaHelper (line 191) | private HahaHelper() {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/HeapAnalyzer.java
class HeapAnalyzer (line 51) | public final class HeapAnalyzer {
method HeapAnalyzer (line 62) | @Deprecated
method HeapAnalyzer (line 68) | public HeapAnalyzer(@NonNull ExcludedRefs excludedRefs,
method findTrackedReferences (line 87) | public @NonNull
method checkForLeak (line 123) | @Deprecated
method checkForLeak (line 134) | public @NonNull
method preCheckForLeak (line 174) | public Instance preCheckForLeak(@NonNull File heapDumpFile,
method deduplicateGcRoots (line 198) | void deduplicateGcRoots(Snapshot snapshot) {
method generateRootKey (line 220) | private String generateRootKey(RootObj root) {
method findLeakingReference (line 224) | private Instance findLeakingReference(String key, Snapshot snapshot) {
method findLeakTrace (line 248) | private AnalysisResult findLeakTrace(long analysisStartNanoTime, Snaps...
method computeIgnoredBitmapRetainedSize (line 297) | private long computeIgnoredBitmapRetainedSize(Snapshot snapshot, Insta...
method isIgnoredDominator (line 321) | private boolean isIgnoredDominator(Instance dominator, Instance instan...
method buildLeakTrace (line 342) | private LeakTrace buildLeakTrace(LeakNode leakingNode) {
method computeExpectedReachability (line 360) | private List<Reachability> computeExpectedReachability(
method buildLeakElement (line 398) | private LeakTraceElement buildLeakElement(LeakNode node) {
method describeFields (line 466) | private List<LeakReference> describeFields(Instance instance) {
method getClassName (line 502) | private String getClassName(Instance instance) {
method since (line 517) | private long since(long analysisStartNanoTime) {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/HeapDump.java
class HeapDump (line 26) | public final class HeapDump implements Serializable {
method builder (line 28) | public static Builder builder() {
type Listener (line 33) | public interface Listener {
method analyze (line 35) | @Override public void analyze(HeapDump heapDump) {
method analyze (line 39) | void analyze(HeapDump heapDump);
method HeapDump (line 74) | @Deprecated
method HeapDump (line 87) | HeapDump(Builder builder) {
method buildUpon (line 99) | public Builder buildUpon() {
class Builder (line 103) | public static final class Builder {
method Builder (line 114) | Builder() {
method Builder (line 126) | Builder(HeapDump heapDump) {
method heapDumpFile (line 138) | public Builder heapDumpFile(File heapDumpFile) {
method referenceKey (line 143) | public Builder referenceKey(String referenceKey) {
method referenceName (line 148) | public Builder referenceName(String referenceName) {
method excludedRefs (line 153) | public Builder excludedRefs(ExcludedRefs excludedRefs) {
method watchDurationMs (line 158) | public Builder watchDurationMs(long watchDurationMs) {
method gcDurationMs (line 163) | public Builder gcDurationMs(long gcDurationMs) {
method heapDumpDurationMs (line 168) | public Builder heapDumpDurationMs(long heapDumpDurationMs) {
method computeRetainedHeapSize (line 173) | public Builder computeRetainedHeapSize(boolean computeRetainedHeapSi...
method reachabilityInspectorClasses (line 178) | public Builder reachabilityInspectorClasses(
method build (line 186) | public HeapDump build() {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/HeapDumper.java
type HeapDumper (line 21) | public interface HeapDumper {
method dumpHeap (line 23) | @Override public File dumpHeap() {
method dumpHeap (line 34) | File dumpHeap();
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/InstrumentationLeakDetector.java
class InstrumentationLeakDetector (line 106) | public final class InstrumentationLeakDetector {
method instrumentationRefWatcher (line 115) | public static @NonNull
method detectLeaks (line 130) | public @NonNull InstrumentationLeakResults detectLeaks() {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/InstrumentationLeakResults.java
class InstrumentationLeakResults (line 27) | public final class InstrumentationLeakResults {
method InstrumentationLeakResults (line 47) | public InstrumentationLeakResults(@NonNull List<Result> detectedLeaks,
class Result (line 54) | public static final class Result {
method Result (line 59) | public Result(@NonNull HeapDump heapDump, @NonNull AnalysisResult an...
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/KeyedWeakReference.java
class KeyedWeakReference (line 22) | final class KeyedWeakReference extends WeakReference<Object> {
method KeyedWeakReference (line 26) | KeyedWeakReference(Object referent, String key, String name,
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/LeakCanary.java
class LeakCanary (line 32) | public final class LeakCanary {
method install (line 38) | public static @NonNull
method installedRefWatcher (line 52) | public static @NonNull
method refWatcher (line 61) | public static @NonNull
method enableDisplayLeakActivity (line 72) | public static void enableDisplayLeakActivity(@NonNull Context context) {
method setDisplayLeakActivityDirectoryProvider (line 79) | @Deprecated
method setLeakDirectoryProvider (line 92) | public static void setLeakDirectoryProvider(
method leakInfo (line 100) | public static @NonNull
method isInAnalyzerProcess (line 184) | public static boolean isInAnalyzerProcess(@NonNull Context context) {
method LeakCanary (line 194) | private LeakCanary() {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/LeakDirectoryProvider.java
type LeakDirectoryProvider (line 32) | public interface LeakDirectoryProvider {
method listFiles (line 34) | @NonNull
method newHeapDumpFile (line 40) | @Nullable
method clearLeakDirectory (line 47) | void clearLeakDirectory();
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/LeakNode.java
class LeakNode (line 20) | final class LeakNode {
method LeakNode (line 27) | LeakNode(Exclusion exclusion, Instance instance, LeakNode parent, Leak...
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/LeakReference.java
class LeakReference (line 23) | public final class LeakReference implements Serializable {
method LeakReference (line 29) | public LeakReference(LeakTraceElement.Type type, String name, String v...
method getDisplayName (line 35) | public String getDisplayName() {
method toString (line 50) | @Override public String toString() {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/LeakTrace.java
class LeakTrace (line 28) | public final class LeakTrace implements Serializable {
method LeakTrace (line 34) | LeakTrace(List<LeakTraceElement> elements, List<Reachability> expected...
method toString (line 39) | @Override public String toString() {
method toDetailedString (line 66) | public @NonNull String toDetailedString() {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/LeakTraceElement.java
class LeakTraceElement (line 31) | public final class LeakTraceElement implements Serializable {
type Type (line 33) | public enum Type {
type Holder (line 37) | public enum Holder {
method LeakTraceElement (line 86) | LeakTraceElement(LeakReference reference, Holder holder, List<String> ...
method getFieldReferenceValue (line 108) | public String getFieldReferenceValue(String referenceName) {
method isInstanceOf (line 118) | public boolean isInstanceOf(Class<?> expectedClass) {
method isInstanceOf (line 125) | public boolean isInstanceOf(String expectedClassName) {
method getSimpleClassName (line 137) | public String getSimpleClassName() {
method toString (line 146) | @Override public String toString() {
method toString (line 150) | public String toString(boolean maybeLeakCause) {
method toDetailedString (line 182) | public String toDetailedString() {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/Preconditions.java
class Preconditions (line 18) | final class Preconditions {
method checkNotNull (line 25) | static <T> T checkNotNull(T instance, String name) {
method Preconditions (line 32) | private Preconditions() {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/Reachability.java
type Reachability (line 19) | public enum Reachability {
type Inspector (line 35) | public interface Inspector {
method expectedReachability (line 37) | Reachability expectedReachability(LeakTraceElement element);
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/RefWatcher.java
class RefWatcher (line 35) | public final class RefWatcher {
method RefWatcher (line 48) | RefWatcher(WatchExecutor watchExecutor, DebuggerControl debuggerContro...
method watch (line 66) | public void watch(Object watchedReference) {
method watch (line 78) | public void watch(Object watchedReference, String referenceName) {
method clearWatchedReferences (line 98) | public void clearWatchedReferences() {
method isEmpty (line 102) | boolean isEmpty() {
method getHeapDumpBuilder (line 107) | HeapDump.Builder getHeapDumpBuilder() {
method getRetainedKeys (line 111) | Set<String> getRetainedKeys() {
method ensureGoneAsync (line 115) | private void ensureGoneAsync(final long watchStartNanoTime, final Keye...
method ensureGone (line 125) | @SuppressWarnings("ReferenceEquality")
method gone (line 169) | private boolean gone(KeyedWeakReference reference) {
method removeWeaklyReachableReferences (line 173) | private void removeWeaklyReachableReferences() {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/RefWatcherBuilder.java
class RefWatcherBuilder (line 10) | public class RefWatcherBuilder<T extends RefWatcherBuilder<T>> {
method RefWatcherBuilder (line 19) | public RefWatcherBuilder() {
method heapDumpListener (line 24) | public final T heapDumpListener(HeapDump.Listener heapDumpListener) {
method excludedRefs (line 30) | public final T excludedRefs(ExcludedRefs excludedRefs) {
method heapDumper (line 36) | public final T heapDumper(HeapDumper heapDumper) {
method debuggerControl (line 42) | public final T debuggerControl(DebuggerControl debuggerControl) {
method watchExecutor (line 48) | public final T watchExecutor(WatchExecutor watchExecutor) {
method gcTrigger (line 54) | public final T gcTrigger(GcTrigger gcTrigger) {
method stethoscopeClasses (line 60) | public final T stethoscopeClasses(
method computeRetainedHeapSize (line 70) | public final T computeRetainedHeapSize(boolean computeRetainedHeapSize) {
method build (line 76) | public final RefWatcher build() {
method isDisabled (line 118) | protected boolean isDisabled() {
method defaultGcTrigger (line 122) | protected GcTrigger defaultGcTrigger() {
method defaultDebuggerControl (line 126) | protected DebuggerControl defaultDebuggerControl() {
method defaultExcludedRefs (line 130) | protected ExcludedRefs defaultExcludedRefs() {
method defaultHeapDumper (line 134) | protected HeapDumper defaultHeapDumper() {
method defaultHeapDumpListener (line 138) | protected HeapDump.Listener defaultHeapDumpListener() {
method defaultWatchExecutor (line 142) | protected WatchExecutor defaultWatchExecutor() {
method defaultReachabilityInspectorClasses (line 146) | protected List<Class<? extends Reachability.Inspector>> defaultReachab...
method self (line 150) | @SuppressWarnings("unchecked")
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/Retryable.java
type Retryable (line 4) | public interface Retryable {
type Result (line 6) | enum Result {
method run (line 10) | Result run();
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/ServiceHeapDumpListener.java
class ServiceHeapDumpListener (line 23) | public final class ServiceHeapDumpListener implements HeapDump.Listener {
method ServiceHeapDumpListener (line 28) | public ServiceHeapDumpListener(@NonNull final Context context,
method analyze (line 34) | @Override
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/ShortestPathFinder.java
class ShortestPathFinder (line 42) | final class ShortestPathFinder {
method ShortestPathFinder (line 52) | ShortestPathFinder(ExcludedRefs excludedRefs) {
class Result (line 61) | static final class Result {
method Result (line 65) | Result(LeakNode leakingNode, boolean excludingKnownLeaks) {
method findPath (line 71) | Result findPath(Snapshot snapshot, Instance leakingRef) {
method clearState (line 116) | private void clearState() {
method enqueueGcRoots (line 124) | private void enqueueGcRoots(Snapshot snapshot) {
method checkSeen (line 167) | private boolean checkSeen(LeakNode node) {
method visitRootObj (line 171) | private void visitRootObj(LeakNode node) {
method visitClassObj (line 190) | private void visitClassObj(LeakNode node) {
method visitClassInstance (line 222) | private void visitClassInstance(LeakNode node) {
method visitArrayInstance (line 266) | private void visitArrayInstance(LeakNode node) {
method enqueue (line 280) | private void enqueue(Exclusion exclusion, LeakNode parent, Instance ch...
method isString (line 312) | private boolean isString(Instance instance) {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/TrackedReference.java
class TrackedReference (line 13) | public class TrackedReference {
method TrackedReference (line 27) | public TrackedReference(@NonNull String key, @NonNull String name, @No...
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/UploadLeakService.java
class UploadLeakService (line 33) | public class UploadLeakService extends DisplayLeakService {
method afterDefaultHandling (line 44) | @Override
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/WatchExecutor.java
type WatchExecutor (line 7) | public interface WatchExecutor {
method execute (line 9) | @Override public void execute(Retryable retryable) {
method execute (line 13) | void execute(Retryable retryable);
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/internal/ActivityLifecycleCallbacksAdapter.java
class ActivityLifecycleCallbacksAdapter (line 22) | public abstract class ActivityLifecycleCallbacksAdapter
method onActivityCreated (line 24) | @Override
method onActivityStarted (line 28) | @Override
method onActivityResumed (line 32) | @Override
method onActivityPaused (line 36) | @Override
method onActivityStopped (line 40) | @Override
method onActivitySaveInstanceState (line 44) | @Override
method onActivityDestroyed (line 48) | @Override
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/internal/AndroidOFragmentRefWatcher.java
class AndroidOFragmentRefWatcher (line 27) | @RequiresApi(Build.VERSION_CODES.O) //
method AndroidOFragmentRefWatcher (line 32) | AndroidOFragmentRefWatcher(RefWatcher refWatcher) {
method onFragmentViewDestroyed (line 39) | @Override
method onFragmentDestroyed (line 47) | @Override
method watchFragments (line 53) | @Override
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/internal/DisplayLeakActivity.java
class DisplayLeakActivity (line 72) | @SuppressWarnings("ConstantConditions")
method createPendingIntent (line 78) | @SuppressWarnings("unused")
method createPendingIntent (line 83) | public static PendingIntent createPendingIntent(Context context, Strin...
method onCreate (line 103) | @SuppressWarnings("unchecked")
method onRetainNonConfigurationInstance (line 128) | @Override
method onSaveInstanceState (line 133) | @Override
method onResume (line 139) | @Override
method setTheme (line 145) | @Override
method onDestroy (line 156) | @Override
method onCreateOptionsMenu (line 162) | @Override
method onOptionsItemSelected (line 189) | @Override
method onBackPressed (line 198) | @Override
method shareLeak (line 208) | void shareLeak() {
method shareHeapDump (line 217) | @SuppressLint("SetWorldReadable")
method startShareIntentChooser (line 239) | private void startShareIntentChooser(Uri heapDumpUri) {
method deleteVisibleLeak (line 246) | void deleteVisibleLeak() {
method deleteAllLeaks (line 268) | void deleteAllLeaks() {
method updateUi (line 280) | void updateUi() {
method setDisplayHomeAsUpEnabled (line 393) | private void setDisplayHomeAsUpEnabled(boolean enabled) {
method getVisibleLeak (line 402) | AnalyzedHeap getVisibleLeak() {
class LeakListAdapter (line 414) | class LeakListAdapter extends BaseAdapter {
method getCount (line 416) | @Override
method getItem (line 421) | @Override
method getItemId (line 426) | @Override
method getView (line 431) | @Override
class LoadLeaks (line 476) | static class LoadLeaks implements Runnable {
method load (line 482) | static void load(DisplayLeakActivity activity, LeakDirectoryProvider...
method forgetActivity (line 488) | static void forgetActivity() {
method LoadLeaks (line 499) | LoadLeaks(DisplayLeakActivity activity, LeakDirectoryProvider leakDi...
method run (line 505) | @Override
method classSimpleName (line 540) | static String classSimpleName(String className) {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/internal/DisplayLeakAdapter.java
class DisplayLeakAdapter (line 38) | final class DisplayLeakAdapter extends BaseAdapter {
method DisplayLeakAdapter (line 55) | DisplayLeakAdapter(Resources resources) {
method hexStringColor (line 64) | private static String hexStringColor(Resources resources, @ColorRes in...
method getView (line 68) | @Override
method htmlTitle (line 139) | private Spanned htmlTitle(LeakTraceElement element, boolean maybeLeakC...
method htmlDetails (line 187) | private Spanned htmlDetails(boolean isLeakingInstance, LeakTraceElemen...
method getConnectorType (line 216) | private DisplayLeakConnectorView.Type getConnectorType(int position) {
method update (line 266) | public void update(LeakTrace leakTrace, String referenceKey, String re...
method toggleRow (line 282) | public void toggleRow(int position) {
method getCount (line 287) | @Override
method getItem (line 295) | @Override
method elementIndex (line 306) | private int elementIndex(int position) {
method getViewTypeCount (line 310) | @Override
method getItemViewType (line 315) | @Override
method getItemId (line 323) | @Override
method findById (line 328) | @SuppressWarnings({"unchecked", "TypeParameterUnusedInFormals"})
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/internal/DisplayLeakConnectorView.java
class DisplayLeakConnectorView (line 34) | public final class DisplayLeakConnectorView extends View {
type Type (line 39) | public enum Type {
method DisplayLeakConnectorView (line 62) | public DisplayLeakConnectorView(Context context, AttributeSet attrs) {
method onDraw (line 92) | @SuppressWarnings("SuspiciousNameCombination") @Override
method drawStartLine (line 146) | private void drawStartLine(Canvas cacheCanvas) {
method drawRoot (line 152) | private void drawRoot(Canvas cacheCanvas) {
method drawItems (line 163) | private void drawItems(Canvas cacheCanvas, Paint arrowHeadPaint, Paint...
method drawArrowHead (line 173) | private void drawArrowHead(Canvas cacheCanvas, Paint paint) {
method drawNextArrowLine (line 197) | private void drawNextArrowLine(Canvas cacheCanvas, Paint paint) {
method drawInstanceCircle (line 204) | private void drawInstanceCircle(Canvas cacheCanvas) {
method setType (line 211) | public void setType(Type type) {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/internal/ForegroundService.java
class ForegroundService (line 27) | public abstract class ForegroundService extends IntentService {
method ForegroundService (line 32) | public ForegroundService(String name, int notificationContentTitleResI...
method onCreate (line 38) | @Override
method showForegroundNotification (line 45) | protected void showForegroundNotification(int max, int progress, boole...
method onHandleIntent (line 59) | @Override
method onHandleIntentInForeground (line 64) | protected abstract void onHandleIntentInForeground(@Nullable Intent in...
method onDestroy (line 66) | @Override
method onBind (line 72) | @Override
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/internal/FragmentRefWatcher.java
type FragmentRefWatcher (line 35) | public interface FragmentRefWatcher {
method watchFragments (line 37) | void watchFragments(Activity activity);
class Helper (line 39) | final class Helper {
method install (line 44) | public static void install(Context context, RefWatcher refWatcher) {
method onActivityCreated (line 73) | @Override
method Helper (line 83) | private Helper(List<FragmentRefWatcher> fragmentRefWatchers) {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/internal/FutureResult.java
class FutureResult (line 22) | public final class FutureResult<T> {
method FutureResult (line 27) | public FutureResult() {
method wait (line 32) | public boolean wait(long timeout, TimeUnit unit) {
method get (line 40) | public T get() {
method set (line 47) | public void set(T result) {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/internal/HeapAnalyzerService.java
class HeapAnalyzerService (line 38) | public final class HeapAnalyzerService extends ForegroundService
method runAnalysis (line 56) | public static void runAnalysis(Context context, HeapDump heapDump,
method HeapAnalyzerService (line 66) | public HeapAnalyzerService() {
method onHandleIntentInForeground (line 76) | @Override
method onProgressUpdate (line 107) | @Override
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/internal/LeakCanaryFileProvider.java
class LeakCanaryFileProvider (line 9) | public class LeakCanaryFileProvider extends FileProvider {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/internal/LeakCanaryInternals.java
class LeakCanaryInternals (line 49) | public final class LeakCanaryInternals {
method classSimpleName (line 68) | public static String classSimpleName(String className) {
method setEnabledAsync (line 77) | public static void setEnabledAsync(Context context, final Class<?> com...
method setEnabledBlocking (line 88) | public static void setEnabledBlocking(Context appContext, Class<?> com...
method isInServiceProcess (line 97) | public static boolean isInServiceProcess(Context context, Class<? exte...
method showNotification (line 151) | public static void showNotification(Context context, CharSequence cont...
method buildNotification (line 165) | public static Notification buildNotification(Context context,
method newSingleThreadExecutor (line 192) | public static Executor newSingleThreadExecutor(String threadName) {
method setLeakDirectoryProvider (line 196) | public static void setLeakDirectoryProvider(LeakDirectoryProvider leak...
method getLeakDirectoryProvider (line 204) | public static LeakDirectoryProvider getLeakDirectoryProvider(Context c...
method LeakCanaryInternals (line 212) | private LeakCanaryInternals() {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/internal/LeakCanarySingleThreadFactory.java
class LeakCanarySingleThreadFactory (line 23) | final class LeakCanarySingleThreadFactory implements ThreadFactory {
method LeakCanarySingleThreadFactory (line 27) | LeakCanarySingleThreadFactory(String threadName) {
method newThread (line 31) | @Override
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/internal/MoreDetailsView.java
class MoreDetailsView (line 30) | public final class MoreDetailsView extends View {
method MoreDetailsView (line 34) | public MoreDetailsView(Context context, AttributeSet attrs) {
method onDraw (line 54) | @Override
method setOpened (line 69) | public void setOpened(boolean opened) {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/internal/RequestStoragePermissionActivity.java
class RequestStoragePermissionActivity (line 37) | @TargetApi(M) //
method createPendingIntent (line 40) | public static PendingIntent createPendingIntent(Context context) {
method onCreate (line 47) | @Override
method onRequestPermissionsResult (line 63) | @Override
method finish (line 73) | @Override
method hasStoragePermission (line 80) | private boolean hasStoragePermission() {
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/internal/RowElementLayout.java
class RowElementLayout (line 27) | public class RowElementLayout extends ViewGroup {
method RowElementLayout (line 41) | public RowElementLayout(Context context, AttributeSet attrs) {
method onFinishInflate (line 52) | @Override
method onMeasure (line 61) | @Override
method onLayout (line 90) | @Override
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/internal/SquigglySpan.java
class SquigglySpan (line 35) | class SquigglySpan extends ReplacementSpan {
method replaceUnderlineSpans (line 38) | public static void replaceUnderlineSpans(SpannableStringBuilder builde...
method SquigglySpan (line 58) | SquigglySpan(Resources resources) {
method getSize (line 76) | @Override
method draw (line 83) | @Override
method squigglyHorizontalPath (line 97) | private static void squigglyHorizontalPath(Path path, float left, floa...
FILE: Android/dokit-leakcanary/src/main/java/com/squareup/leakcanary/internal/SupportFragmentRefWatcher.java
class SupportFragmentRefWatcher (line 27) | class SupportFragmentRefWatcher implements FragmentRefWatcher {
method SupportFragmentRefWatcher (line 30) | SupportFragmentRefWatcher(RefWatcher refWatcher) {
method onFragmentViewDestroyed (line 37) | @Override
method onFragmentDestroyed (line 45) | @Override
method watchFragments (line 51) | @Override
FILE: Android/dokit-mc/src/main/java/com/didichuxing/doraemonkit/kit/mc/report/ScreenShotManager.java
class ScreenShotManager (line 25) | public class ScreenShotManager {
method ScreenShotManager (line 31) | public ScreenShotManager(String screenFileDir) {
method screenshot (line 35) | public String screenshot(Activity activity) {
method createNextFileName (line 54) | private String createNextFileName() {
FILE: Android/dokit-mc/src/main/java/com/didichuxing/doraemonkit/kit/mc/ui/BorderDoKitView.java
class BorderDoKitView (line 18) | public class BorderDoKitView extends AbsDoKitView {
method onCreate (line 21) | @Override
method onDestroy (line 26) | @Override
method onCreateView (line 32) | @Override
method initDokitViewLayoutParams (line 38) | @Override
method onViewCreated (line 46) | @Override
method onResume (line 56) | @Override
method canDrag (line 68) | @Override
method showBorder (line 73) | public void showBorder(View target) {
FILE: Android/dokit-no-op/src/main/java/com/didichuxing/doraemonkit/DoKitMCHummerHelper.java
class DoKitMCHummerHelper (line 12) | public class DoKitMCHummerHelper {
method registerHummerMCEventListener (line 13) | public static void registerHummerMCEventListener(HummerContext context) {
method processHummerMCClientEvent (line 17) | public static void processHummerMCClientEvent(HummerContext context, V...
FILE: Android/dokit-no-op/src/main/java/com/didichuxing/doraemonkit/kit/Category.java
type Category (line 8) | @Deprecated
FILE: Android/dokit-no-op/src/main/java/com/didichuxing/doraemonkit/kit/core/DokitFrameLayout.java
class DokitFrameLayout (line 19) | public class DokitFrameLayout extends FrameLayout implements DokitViewIn...
method DokitFrameLayout (line 23) | public DokitFrameLayout(@NonNull Context context, int flag) {
method DokitFrameLayout (line 27) | public DokitFrameLayout(@NonNull Context context, @Nullable AttributeS...
method DokitFrameLayout (line 31) | public DokitFrameLayout(@NonNull Context context, @Nullable AttributeS...
FILE: Android/dokit-no-op/src/main/java/com/didichuxing/doraemonkit/kit/core/DokitView.java
type DokitView (line 16) | interface DokitView {
method onCreate (line 24) | void onCreate(Context context);
method onCreateView (line 33) | View onCreateView(Context context, FrameLayout rootView);
method onViewCreated (line 41) | void onViewCreated(FrameLayout rootView);
method onResume (line 46) | void onResume();
method onPause (line 51) | void onPause();
method initDokitViewLayoutParams (line 78) | void initDokitViewLayoutParams(DokitViewLayoutParams params);
method onEnterBackground (line 83) | void onEnterBackground();
method onEnterForeground (line 88) | void onEnterForeground();
method canDrag (line 95) | boolean canDrag();
method shouldDealBackKey (line 102) | boolean shouldDealBackKey();
method onBackPressed (line 107) | boolean onBackPressed();
method onDestroy (line 112) | void onDestroy();
FILE: Android/dokit-no-op/src/main/java/com/didichuxing/doraemonkit/kit/core/DokitViewInterface.java
type DokitViewInterface (line 12) | public interface DokitViewInterface {
FILE: Android/dokit-no-op/src/main/java/com/didichuxing/doraemonkit/kit/core/DokitViewLayoutParams.java
class DokitViewLayoutParams (line 15) | public class DokitViewLayoutParams {
method toString (line 49) | @Override
FILE: Android/dokit-no-op/src/main/java/com/didichuxing/doraemonkit/kit/core/TouchProxy.java
class TouchProxy (line 11) | public class TouchProxy {
method TouchProxy (line 13) | public TouchProxy(OnTouchEventListener eventListener) {
method setEventListener (line 16) | public void setEventListener(OnTouchEventListener eventListener) {
method onTouchEvent (line 20) | public boolean onTouchEvent(View v, MotionEvent event) {
type OnTouchEventListener (line 26) | public interface OnTouchEventListener {
method onMove (line 27) | void onMove(int x, int y, int dx, int dy);
method onUp (line 29) | void onUp(int x, int y);
method onDown (line 31) | void onDown(int x, int y);
FILE: Android/dokit-no-op/src/main/java/com/didichuxing/doraemonkit/kit/network/bean/NetworkRecord.java
class NetworkRecord (line 10) | public class NetworkRecord implements Serializable {
method filter (line 24) | public boolean filter(String text) {
method isGetRecord (line 30) | public boolean isGetRecord() {
method isPostRecord (line 34) | public boolean isPostRecord() {
FILE: Android/dokit-no-op/src/main/java/com/didichuxing/doraemonkit/kit/network/bean/Request.java
class Request (line 10) | public class Request implements Serializable {
method toString (line 22) | @Override
method filter (line 27) | public boolean filter(String text) {
FILE: Android/dokit-no-op/src/main/java/com/didichuxing/doraemonkit/kit/network/bean/Response.java
class Response (line 8) | public class Response implements Serializable {
method toString (line 18) | @Override
FILE: Android/dokit-no-op/src/main/java/com/didichuxing/doraemonkit/kit/webdoor/WebDoorManager.java
class WebDoorManager (line 9) | public class WebDoorManager {
type WebDoorCallback (line 10) | public interface WebDoorCallback {
method overrideUrlLoading (line 11) | void overrideUrlLoading(Context context, String url);
FILE: Android/dokit-no-op/src/main/java/com/didichuxing/doraemonkit/tcp/ability/MessageReceiverHook.java
class MessageReceiverHook (line 14) | public class MessageReceiverHook {
method dispatchMessage (line 16) | public static void dispatchMessage(Object message) {
FILE: Android/dokit-no-op/src/main/java/com/didichuxing/doraemonkit/tcp/ability/MessageSenderHook.java
class MessageSenderHook (line 14) | public class MessageSenderHook {
method sendMessage (line 16) | public static void sendMessage(String message) {
FILE: Android/dokit-no-op/src/main/java/com/didichuxing/doraemonkit/tcp/ability/TcpMessageHook.java
class TcpMessageHook (line 14) | public class TcpMessageHook {
method init (line 16) | public static void init() {
FILE: Android/dokit-okhttp-v3/src/main/java/com/didichuxing/doraemonkit/okhttp_api/ByteCountBufferedSinkV3.java
class ByteCountBufferedSinkV3 (line 22) | public class ByteCountBufferedSinkV3 implements BufferedSink {
method ByteCountBufferedSinkV3 (line 27) | public ByteCountBufferedSinkV3(Sink sink, long byteCount) {
method writeAll (line 33) | @Override
method write (line 44) | @Override
method emitCompleteSegments (line 59) | @Override
method buffer (line 66) | @Override
method write (line 71) | @Override
method write (line 76) | @Override
method write (line 81) | @Override
method writeUtf8 (line 86) | @Override
method writeUtf8 (line 91) | @Override
method writeUtf8CodePoint (line 96) | @Override
method writeString (line 101) | @Override
method writeString (line 106) | @Override
method writeByte (line 111) | @Override
method writeShort (line 116) | @Override
method writeShortLe (line 121) | @Override
method writeInt (line 126) | @Override
method writeIntLe (line 131) | @Override
method writeLong (line 136) | @Override
method writeLongLe (line 141) | @Override
method writeDecimalLong (line 146) | @Override
method writeHexadecimalUnsignedLong (line 151) | @Override
method flush (line 156) | @Override
method emit (line 161) | @Override
method outputStream (line 166) | @Override
method write (line 171) | @Override
method isOpen (line 176) | @Override
method write (line 181) | @Override
method timeout (line 186) | @Override
method close (line 191) | @Override
FILE: Android/dokit-okhttp-v4/src/main/java/com/didichuxing/doraemonkit/okhttp_api/ByteCountBufferedSinkV4.java
class ByteCountBufferedSinkV4 (line 26) | public class ByteCountBufferedSinkV4 implements BufferedSink {
method ByteCountBufferedSinkV4 (line 32) | public ByteCountBufferedSinkV4(Sink sink, long byteCount) {
method writeAll (line 38) | @Override
method write (line 49) | @Override
method emitCompleteSegments (line 64) | @Override
method buffer (line 71) | @Override
method write (line 76) | @Override
method write (line 81) | @Override
method write (line 86) | @Override
method writeUtf8 (line 91) | @Override
method writeUtf8 (line 96) | @Override
method writeUtf8CodePoint (line 101) | @Override
method writeString (line 106) | @Override
method writeString (line 111) | @Override
method writeByte (line 116) | @Override
method writeShort (line 121) | @Override
method writeShortLe (line 126) | @Override
method writeInt (line 131) | @Override
method writeIntLe (line 136) | @Override
method writeLong (line 141) | @Override
method writeLongLe (line 146) | @Override
method writeDecimalLong (line 151) | @Override
method writeHexadecimalUnsignedLong (line 156) | @Override
method flush (line 161) | @Override
method emit (line 166) | @Override
method outputStream (line 171) | @Override
method write (line 176) | @Override
method isOpen (line 181) | @Override
method write (line 186) | @Override
method timeout (line 191) | @Override
method close (line 196) | @Override
method getBuffer (line 201) | @NonNull
method write (line 207) | @NonNull
FILE: Android/dokit-test/src/main/java/com/didichuxing/doraemonkit/kit/test/mock/proxy/ProxyQueryData.java
class ProxyQueryData (line 14) | public class ProxyQueryData {
method ProxyQueryData (line 20) | public ProxyQueryData(String pid, ProxyRequest proxyRequest, ProxyCall...
method getPid (line 26) | public String getPid() {
method getProxyRequest (line 30) | public ProxyRequest getProxyRequest() {
method getProxyCallback (line 34) | public ProxyCallback getProxyCallback() {
FILE: Android/dokit-test/src/main/java/com/didichuxing/doraemonkit/kit/test/report/ScreenShotManager.java
class ScreenShotManager (line 34) | public class ScreenShotManager {
method ScreenShotManager (line 40) | public ScreenShotManager(String screenFileDir) {
method screenshotBitmap (line 45) | public Bitmap screenshotBitmap(Activity activity) {
method createMyWindowBitmap (line 63) | public List<MyWindowBitmap> createMyWindowBitmap(List<ViewParent> pare...
method screenshotBitmap (line 98) | public Bitmap screenshotBitmap() {
method getViewBitmap (line 124) | private Bitmap getViewBitmap(ViewParent viewParent) {
method getScreenFile (line 131) | public String getScreenFile(String fileName) {
method saveBitmap (line 136) | public String saveBitmap(Bitmap bitmap, String fileName) {
method screenshot (line 163) | public String screenshot(Activity activity) {
method createNextFileName (line 169) | public String createNextFileName() {
FILE: Android/dokit-test/src/main/java/com/didichuxing/doraemonkit/kit/test/utils/ReflectHookUtil.java
class ReflectHookUtil (line 21) | public class ReflectHookUtil {
method getRootViewsFromWindowManageGlobal (line 39) | public static List<ViewParent> getRootViewsFromWindowManageGlobal() {
method hookAccessibilityManager (line 58) | public static void hookAccessibilityManager(Context context, boolean e...
FILE: Android/dokit-test/src/main/java/com/didichuxing/doraemonkit/kit/test/utils/WindowPathUtil.java
class WindowPathUtil (line 30) | public class WindowPathUtil {
method findViewRoot (line 42) | @Nullable
method filterViewRoot (line 64) | public static List<ViewParent> filterViewRoot(List<ViewParent> viewPar...
method filterWindowViewRoot (line 77) | public static List<ViewParent> filterWindowViewRoot(List<ViewParent> v...
method createWindowNode (line 93) | public static WindowNode createWindowNode(ViewParent parent) {
method createWindowNode (line 100) | public static WindowNode createWindowNode(View rootView) {
method filterDoKitViewRoot (line 123) | public static List<ViewParent> filterDoKitViewRoot(List<ViewParent> vi...
method filterShowViewRoot (line 138) | public static List<ViewParent> filterShowViewRoot(List<ViewParent> vie...
method isPageViewRoot (line 152) | public static boolean isPageViewRoot(ViewParent viewParent) {
method isDoKitViewRoot (line 162) | public static boolean isDoKitViewRoot(ViewParent viewParent) {
method getsDoKitViewRootTitle (line 172) | public static String getsDoKitViewRootTitle(ViewParent viewParent) {
method isClass (line 183) | private static boolean isClass(Object o, String name) {
FILE: Android/dokit-test/src/test/java/com/didichuxing/doraemonkit/kit/test/ExampleUnitTest.java
class ExampleUnitTest (line 12) | public class ExampleUnitTest {
method addition_isCorrect (line 13) | @Test
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/constant/CacheConstants.java
type CacheConstants (line 11) | public interface CacheConstants {
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/constant/MemoryConstants.java
class MemoryConstants (line 17) | public final class MemoryConstants {
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/constant/PermissionConstants.java
class PermissionConstants (line 21) | @SuppressLint("InlinedApi")
method getPermissions (line 79) | public static String[] getPermissions(@PermissionGroup final String pe...
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/constant/RegexConstants.java
class RegexConstants (line 11) | public final class RegexConstants {
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/constant/TimeConstants.java
class TimeConstants (line 16) | public final class TimeConstants {
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/util/ActivityUtils.java
class ActivityUtils (line 42) | public final class ActivityUtils {
method ActivityUtils (line 44) | private ActivityUtils() {
method addActivityLifecycleCallbacks (line 53) | public static void addActivityLifecycleCallbacks(@Nullable final Utils...
method addActivityLifecycleCallbacks (line 63) | public static void addActivityLifecycleCallbacks(@Nullable final Activ...
method removeActivityLifecycleCallbacks (line 73) | public static void removeActivityLifecycleCallbacks(@Nullable final Ut...
method removeActivityLifecycleCallbacks (line 82) | public static void removeActivityLifecycleCallbacks(@Nullable final Ac...
method removeActivityLifecycleCallbacks (line 92) | public static void removeActivityLifecycleCallbacks(@Nullable final Ac...
method getActivityByContext (line 103) | @Nullable
method getActivityByContextInner (line 110) | @Nullable
method getActivityFromDecorContext (line 133) | @Nullable
method isActivityExists (line 155) | public static boolean isActivityExists(@NonNull final String pkg,
method startActivity (line 170) | public static void startActivity(@NonNull final Class<? extends Activi...
method startActivity (line 181) | public static void startActivity(@NonNull final Class<? extends Activi...
method startActivity (line 196) | public static void startActivity(@NonNull final Class<? extends Activi...
method startActivity (line 213) | public static void startActivity(@NonNull final Activity activity,
method startActivity (line 225) | public static void startActivity(@NonNull final Activity activity,
method startActivity (line 239) | public static void startActivity(@NonNull final Activity activity,
method startActivity (line 256) | public static void startActivity(@NonNull final Activity activity,
method startActivity (line 273) | public static void startActivity(@NonNull final Bundle extras,
method startActivity (line 286) | public static void startActivity(@NonNull final Bundle extras,
method startActivity (line 303) | public static void startActivity(@NonNull final Bundle extras,
method startActivity (line 322) | public static void startActivity(@NonNull final Bundle extras,
method startActivity (line 336) | public static void startActivity(@NonNull final Bundle extras,
method startActivity (line 352) | public static void startActivity(@NonNull final Bundle extras,
method startActivity (line 371) | public static void startActivity(@NonNull final Bundle extras,
method startActivity (line 389) | public static void startActivity(@NonNull final String pkg,
method startActivity (line 401) | public static void startActivity(@NonNull final String pkg,
method startActivity (line 417) | public static void startActivity(@NonNull final String pkg,
method startActivity (line 435) | public static void startActivity(@NonNull final Activity activity,
method startActivity (line 449) | public static void startActivity(@NonNull final Activity activity,
method startActivity (line 465) | public static void startActivity(@NonNull final Activity activity,
method startActivity (line 483) | public static void startActivity(@NonNull final Activity activity,
method startActivity (line 501) | public static void startActivity(@NonNull final Bundle extras,
method startActivity (line 515) | public static void startActivity(@NonNull final Bundle extras,
method startActivity (line 533) | public static void startActivity(@NonNull final Bundle extras,
method startActivity (line 553) | public static void startActivity(@NonNull final Bundle extras,
method startActivity (line 569) | public static void startActivity(@NonNull final Bundle extras,
method startActivity (line 587) | public static void startActivity(@NonNull final Bundle extras,
method startActivity (line 606) | public static void startActivity(@NonNull final Bundle extras,
method startActivity (line 624) | public static boolean startActivity(@NonNull final Intent intent) {
method startActivity (line 635) | public static boolean startActivity(@NonNull final Intent intent,
method startActivity (line 650) | public static boolean startActivity(@NonNull final Intent intent,
method startActivity (line 669) | public static void startActivity(@NonNull final Activity activity,
method startActivity (line 681) | public static void startActivity(@NonNull final Activity activity,
method startActivity (line 695) | public static void startActivity(@NonNull final Activity activity,
method startActivity (line 711) | public static void startActivity(@NonNull final Activity activity,
method startActivityForResult (line 729) | public static void startActivityForResult(@NonNull final Activity acti...
method startActivityForResult (line 745) | public static void startActivityForResult(@NonNull final Activity acti...
method startActivityForResult (line 763) | public static void startActivityForResult(@NonNull final Activity acti...
method startActivityForResult (line 783) | public static void startActivityForResult(@NonNull final Activity acti...
method startActivityForResult (line 804) | public static void startActivityForResult(@NonNull final Bundle extras,
method startActivityForResult (line 822) | public static void startActivityForResult(@NonNull final Bundle extras,
method startActivityForResult (line 842) | public static void startActivityForResult(@NonNull final Bundle extras,
method startActivityForResult (line 864) | public static void startActivityForResult(@NonNull final Bundle extras,
method startActivityForResult (line 887) | public static void startActivityForResult(@NonNull final Bundle extras,
method startActivityForResult (line 906) | public static void startActivityForResult(@NonNull final Bundle extras,
method startActivityForResult (line 927) | public static void startActivityForResult(@NonNull final Bundle extras,
method startActivityForResult (line 950) | public static void startActivityForResult(@NonNull final Bundle extras,
method startActivityForResult (line 972) | public static void startActivityForResult(@NonNull final Activity acti...
method startActivityForResult (line 987) | public static void startActivityForResult(@NonNull final Activity acti...
method startActivityForResult (line 1004) | public static void startActivityForResult(@NonNull final Activity acti...
method startActivityForResult (line 1024) | public static void startActivityForResult(@NonNull final Activity acti...
method startActivityForResult (line 1044) | public static void startActivityForResult(@NonNull final Fragment frag...
method startActivityForResult (line 1060) | public static void startActivityForResult(@NonNull final Fragment frag...
method startActivityForResult (line 1078) | public static void startActivityForResult(@NonNull final Fragment frag...
method startActivityForResult (line 1098) | public static void startActivityForResult(@NonNull final Fragment frag...
method startActivityForResult (line 1116) | public static void startActivityForResult(@NonNull final Bundle extras,
method startActivityForResult (line 1134) | public static void startActivityForResult(@NonNull final Bundle extras,
method startActivityForResult (line 1154) | public static void startActivityForResult(@NonNull final Bundle extras,
method startActivityForResult (line 1176) | public static void startActivityForResult(@NonNull final Bundle extras,
method startActivityForResult (line 1196) | public static void startActivityForResult(@NonNull final Bundle extras,
method startActivityForResult (line 1215) | public static void startActivityForResult(@NonNull final Bundle extras,
method startActivityForResult (line 1236) | public static void startActivityForResult(@NonNull final Bundle extras,
method startActivityForResult (line 1259) | public static void startActivityForResult(@NonNull final Bundle extras,
method startActivityForResult (line 1278) | public static void startActivityForResult(@NonNull final Fragment frag...
method startActivityForResult (line 1293) | public static void startActivityForResult(@NonNull final Fragment frag...
method startActivityForResult (line 1310) | public static void startActivityForResult(@NonNull final Fragment frag...
method startActivityForResult (line 1330) | public static void startActivityForResult(@NonNull final Fragment frag...
method startActivities (line 1344) | public static void startActivities(@NonNull final Intent[] intents) {
method startActivities (line 1354) | public static void startActivities(@NonNull final Intent[] intents,
method startActivities (line 1368) | public static void startActivities(@NonNull final Intent[] intents,
method startActivities (line 1384) | public static void startActivities(@NonNull final Activity activity,
method startActivities (line 1396) | public static void startActivities(@NonNull final Activity activity,
method startActivities (line 1412) | public static void startActivities(@NonNull final Activity activity,
method startHomeActivity (line 1425) | public static void startHomeActivity() {
method startLauncherActivity (line 1435) | public static void startLauncherActivity() {
method startLauncherActivity (line 1444) | public static void startLauncherActivity(@NonNull final String pkg) {
method getActivityList (line 1455) | public static List<Activity> getActivityList() {
method getLauncherActivity (line 1464) | public static String getLauncherActivity() {
method getLauncherActivity (line 1474) | public static String getLauncherActivity(@NonNull final String pkg) {
method getMainActivities (line 1492) | public static List<String> getMainActivities() {
method getMainActivities (line 1502) | public static List<String> getMainActivities(@NonNull final String pkg) {
method getTopActivity (line 1524) | public static Activity getTopActivity() {
method isActivityAlive (line 1534) | public static boolean isActivityAlive(final Context context) {
method isActivityAlive (line 1544) | public static boolean isActivityAlive(final Activity activity) {
method isActivityExistsInStack (line 1555) | public static boolean isActivityExistsInStack(@NonNull final Activity ...
method isActivityExistsInStack (line 1571) | public static boolean isActivityExistsInStack(@NonNull final Class<? e...
method finishActivity (line 1586) | public static void finishActivity(@NonNull final Activity activity) {
method finishActivity (line 1596) | public static void finishActivity(@NonNull final Activity activity, fi...
method finishActivity (line 1612) | public static void finishActivity(@NonNull final Activity activity,
method finishActivity (line 1624) | public static void finishActivity(@NonNull final Class<? extends Activ...
method finishActivity (line 1634) | public static void finishActivity(@NonNull final Class<? extends Activ...
method finishActivity (line 1656) | public static void finishActivity(@NonNull final Class<? extends Activ...
method finishToActivity (line 1674) | public static boolean finishToActivity(@NonNull final Activity activity,
method finishToActivity (line 1686) | public static boolean finishToActivity(@NonNull final Activity activity,
method finishToActivity (line 1712) | public static boolean finishToActivity(@NonNull final Activity activity,
method finishToActivity (line 1735) | public static boolean finishToActivity(@NonNull final Class<? extends ...
method finishToActivity (line 1747) | public static boolean finishToActivity(@NonNull final Class<? extends ...
method finishToActivity (line 1773) | public static boolean finishToActivity(@NonNull final Class<? extends ...
method finishOtherActivities (line 1795) | public static void finishOtherActivities(@NonNull final Class<? extend...
method finishOtherActivities (line 1806) | public static void finishOtherActivities(@NonNull final Class<? extend...
method finishOtherActivities (line 1825) | public static void finishOtherActivities(@NonNull final Class<? extend...
method finishAllActivities (line 1839) | public static void finishAllActivities() {
method finishAllActivities (line 1848) | public static void finishAllActivities(final boolean isLoadAnim) {
method finishAllActivities (line 1867) | public static void finishAllActivities(@AnimRes final int enterAnim,
method finishAllActivitiesExceptNewest (line 1880) | public static void finishAllActivitiesExceptNewest() {
method finishAllActivitiesExceptNewest (line 1889) | public static void finishAllActivitiesExceptNewest(final boolean isLoa...
method finishAllActivitiesExceptNewest (line 1904) | public static void finishAllActivitiesExceptNewest(@AnimRes final int ...
method getActivityIcon (line 1918) | @Nullable
method getActivityIcon (line 1929) | @Nullable
method getActivityIcon (line 1940) | @Nullable
method getActivityLogo (line 1957) | @Nullable
method getActivityLogo (line 1968) | @Nullable
method getActivityLogo (line 1979) | @Nullable
method startActivity (line 1990) | private static void startActivity(final Context context,
method startActivity (line 2001) | private static boolean startActivity(final Intent intent,
method isIntentAvailable (line 2019) | private static boolean isIntentAvailable(final Intent intent) {
method startActivityForResult (line 2026) | private static boolean startActivityForResult(final Activity activity,
method startActivityForResult (line 2038) | private static boolean startActivityForResult(final Intent intent,
method startActivities (line 2054) | private static void startActivities(final Intent[] intents,
method startActivityForResult (line 2069) | private static boolean startActivityForResult(final Fragment fragment,
method startActivityForResult (line 2081) | private static boolean startActivityForResult(final Intent intent,
method getOptionsBundle (line 2101) | private static Bundle getOptionsBundle(final Fragment fragment,
method getOptionsBundle (line 2109) | private static Bundle getOptionsBundle(final Context context,
method getOptionsBundle (line 2115) | private static Bundle getOptionsBundle(final Fragment fragment,
method getOptionsBundle (line 2122) | private static Bundle getOptionsBundle(final Activity activity,
method getTopActivityOrApp (line 2136) | private static Context getTopActivityOrApp() {
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/util/AdaptScreenUtils.java
class AdaptScreenUtils (line 21) | public final class AdaptScreenUtils {
method AdaptScreenUtils (line 25) | private AdaptScreenUtils() {
method adaptWidth (line 32) | @NonNull
method adaptHeight (line 42) | @NonNull
method adaptHeight (line 50) | @NonNull
method getNavBarHeight (line 59) | private static int getNavBarHeight(@NonNull final Resources resources) {
method closeAdapt (line 72) | @NonNull
method pt2Px (line 85) | public static int pt2Px(final float ptValue) {
method px2Pt (line 96) | public static int px2Pt(final float pxValue) {
method applyDisplayMetrics (line 101) | private static void applyDisplayMetrics(@NonNull final Resources resou...
method getPreLoadRunnable (line 107) | static Runnable getPreLoadRunnable() {
method preLoad (line 116) | private static void preLoad() {
method applyOtherDisplayMetrics (line 120) | private static void applyOtherDisplayMetrics(final Resources resources...
method applyMetricsFields (line 148) | private static void applyMetricsFields(final Resources resources, fina...
method getMetricsFromField (line 159) | private static DisplayMetrics getMetricsFromField(final Resources reso...
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/util/ApiUtils.java
class ApiUtils (line 24) | public final class ApiUtils {
method ApiUtils (line 31) | private ApiUtils() {
method init (line 39) | private void init() {/*inject*/}
method registerImpl (line 41) | private void registerImpl(Class implClass) {
method getApi (line 52) | @Nullable
method register (line 57) | public static void register(@Nullable Class<? extends BaseApi> implCla...
method toString_ (line 62) | @NonNull
method toString (line 67) | @Override
method getInstance (line 72) | private static ApiUtils getInstance() {
method getApiInner (line 76) | private <Result> Result getApiInner(Class apiClass) {
class LazyHolder (line 103) | private static class LazyHolder {
class BaseApi (line 113) | public static class BaseApi {
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/util/AppStoreUtils.java
class AppStoreUtils (line 19) | public final class AppStoreUtils {
method getAppStoreIntent (line 30) | public static Intent getAppStoreIntent() {
method getAppStoreIntent (line 40) | public static Intent getAppStoreIntent(boolean isIncludeGooglePlayStor...
method getAppStoreIntent (line 50) | public static Intent getAppStoreIntent(final String packageName) {
method getAppStoreIntent (line 62) | public static Intent getAppStoreIntent(final String packageName, boole...
method getSamsungAppStoreIntent (line 103) | private static Intent getSamsungAppStoreIntent(final String packageNam...
method getLeecoAppStoreIntent (line 114) | private static Intent getLeecoAppStoreIntent(final String packageName) {
method getAvailableIntentSize (line 126) | private static int getAvailableIntentSize(final Intent intent) {
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/util/AppUtils.java
class AppUtils (line 32) | public final class AppUtils {
method AppUtils (line 34) | private AppUtils() {
method registerAppStatusChangedListener (line 43) | public static void registerAppStatusChangedListener(@NonNull final Uti...
method unregisterAppStatusChangedListener (line 52) | public static void unregisterAppStatusChangedListener(@NonNull final U...
method installApp (line 63) | public static void installApp(final String filePath) {
method installApp (line 74) | public static void installApp(final File file) {
method installApp (line 87) | public static void installApp(final Uri uri) {
method uninstallApp (line 100) | public static void uninstallApp(final String packageName) {
method isAppInstalled (line 111) | public static boolean isAppInstalled(final String pkgName) {
method isAppRoot (line 126) | public static boolean isAppRoot() {
method isAppDebug (line 136) | public static boolean isAppDebug() {
method isAppDebug (line 146) | public static boolean isAppDebug(final String packageName) {
method isAppSystem (line 163) | public static boolean isAppSystem() {
method isAppSystem (line 173) | public static boolean isAppSystem(final String packageName) {
method isAppForeground (line 190) | public static boolean isAppForeground() {
method isAppForeground (line 202) | public static boolean isAppForeground(@NonNull final String pkgName) {
method isAppRunning (line 212) | public static boolean isAppRunning(final String pkgName) {
method launchApp (line 243) | public static void launchApp(final String packageName) {
method relaunchApp (line 256) | public static void relaunchApp() {
method relaunchApp (line 265) | public static void relaunchApp(final boolean isKillProcess) {
method launchAppDetailsSettings (line 284) | public static void launchAppDetailsSettings() {
method launchAppDetailsSettings (line 293) | public static void launchAppDetailsSettings(final String pkgName) {
method launchAppDetailsSettings (line 306) | public static void launchAppDetailsSettings(final Activity activity, f...
method launchAppDetailsSettings (line 317) | public static void launchAppDetailsSettings(final Activity activity, f...
method exitApp (line 327) | public static void exitApp() {
method getAppIcon (line 337) | @Nullable
method getAppIcon (line 348) | @Nullable
method getAppIconId (line 366) | public static int getAppIconId() {
method getAppIconId (line 376) | public static int getAppIconId(final String packageName) {
method getAppPackageName (line 393) | @NonNull
method getAppName (line 403) | @NonNull
method getAppName (line 414) | @NonNull
method getAppPath (line 432) | @NonNull
method getAppPath (line 443) | @NonNull
method getAppVersionName (line 461) | @NonNull
method getAppVersionName (line 472) | @NonNull
method getAppVersionCode (line 490) | public static int getAppVersionCode() {
method getAppVersionCode (line 500) | public static int getAppVersionCode(final String packageName) {
method getAppSignatures (line 517) | @Nullable
method getAppSignatures (line 528) | @Nullable
method getAppSignatures (line 561) | @Nullable
method getAppSignaturesSHA1 (line 588) | @NonNull
method getAppSignaturesSHA1 (line 599) | @NonNull
method getAppSignaturesSHA256 (line 609) | @NonNull
method getAppSignaturesSHA256 (line 620) | @NonNull
method getAppSignaturesMD5 (line 630) | @NonNull
method getAppSignaturesMD5 (line 641) | @NonNull
method getAppUid (line 651) | public static int getAppUid() {
method getAppUid (line 661) | public static int getAppUid(String pkgName) {
method getAppSignaturesHash (line 670) | private static List<String> getAppSignaturesHash(final String packageN...
method getAppInfo (line 697) | @Nullable
method getAppInfo (line 717) | @Nullable
method getAppsInfo (line 734) | @NonNull
method getApkInfo (line 753) | @Nullable
method getApkInfo (line 764) | @Nullable
method getBean (line 777) | private static AppInfo getBean(final PackageManager pm, final PackageI...
class AppInfo (line 796) | public static class AppInfo {
method getIcon (line 806) | public Drawable getIcon() {
method setIcon (line 810) | public void setIcon(final Drawable icon) {
method isSystem (line 814) | public boolean isSystem() {
method setSystem (line 818) | public void setSystem(final boolean isSystem) {
method getPackageName (line 822) | public String getPackageName() {
method setPackageName (line 826) | public void setPackageName(final String packageName) {
method getName (line 830) | public String getName() {
method setName (line 834) | public void setName(final String name) {
method getPackagePath (line 838) | public String getPackagePath() {
method setPackagePath (line 842) | public void setPackagePath(final String packagePath) {
method getVersionCode (line 846) | public int getVersionCode() {
method setVersionCode (line 850) | public void setVersionCode(final int versionCode) {
method getVersionName (line 854) | public String getVersionName() {
method setVersionName (line 858) | public void setVersionName(final String versionName) {
method AppInfo (line 862) | public AppInfo(String packageName, String name, Drawable icon, Strin...
method toString (line 873) | @Override
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/util/ArrayUtils.java
class ArrayUtils (line 23) | public class ArrayUtils {
method ArrayUtils (line 27) | private ArrayUtils() {
method newArray (line 37) | @NonNull
method newLongArray (line 42) | @NonNull
method newIntArray (line 47) | @NonNull
method newShortArray (line 52) | @NonNull
method newCharArray (line 57) | @NonNull
method newByteArray (line 62) | @NonNull
method newDoubleArray (line 67) | @NonNull
method newFloatArray (line 72) | @NonNull
method newBooleanArray (line 77) | @NonNull
method isEmpty (line 88) | public static boolean isEmpty(@Nullable Object array) {
method getLength (line 98) | public static int getLength(@Nullable Object array) {
method isSameLength (line 103) | public static boolean isSameLength(@Nullable Object array1, @Nullable ...
method get (line 114) | @Nullable
method get (line 127) | @Nullable
method set (line 144) | public static void set(@Nullable Object array, int index, @Nullable Ob...
method equals (line 156) | public static boolean equals(@Nullable Object[] a, @Nullable Object[] ...
method equals (line 160) | public static boolean equals(boolean[] a, boolean[] a2) {
method equals (line 164) | public static boolean equals(byte[] a, byte[] a2) {
method equals (line 168) | public static boolean equals(char[] a, char[] a2) {
method equals (line 172) | public static boolean equals(double[] a, double[] a2) {
method equals (line 176) | public static boolean equals(float[] a, float[] a2) {
method equals (line 180) | public static boolean equals(int[] a, int[] a2) {
method equals (line 184) | public static boolean equals(short[] a, short[] a2) {
method reverse (line 201) | public static <T> void reverse(T[] array) {
method reverse (line 217) | public static void reverse(long[] array) {
method reverse (line 233) | public static void reverse(int[] array) {
method reverse (line 249) | public static void reverse(short[] array) {
method reverse (line 265) | public static void reverse(char[] array) {
method reverse (line 281) | public static void reverse(byte[] array) {
method reverse (line 297) | public static void reverse(double[] array) {
method reverse (line 313) | public static void reverse(float[] array) {
method reverse (line 329) | public static void reverse(boolean[] array) {
method copy (line 361) | @Nullable
method copy (line 367) | @Nullable
method copy (line 373) | @Nullable
method copy (line 379) | @Nullable
method copy (line 385) | @Nullable
method copy (line 391) | @Nullable
method copy (line 397) | @Nullable
method copy (line 403) | @Nullable
method copy (line 409) | @Nullable
method realCopy (line 415) | @Nullable
method subArray (line 425) | @Nullable
method subArray (line 431) | @Nullable
method subArray (line 436) | @Nullable
method subArray (line 441) | @Nullable
method subArray (line 446) | @Nullable
method subArray (line 451) | @Nullable
method subArray (line 456) | @Nullable
method subArray (line 461) | @Nullable
method subArray (line 466) | @Nullable
method realSubArray (line 471) | @Nullable
method add (line 519) | @NonNull
method add (line 525) | @NonNull
method add (line 530) | @NonNull
method add (line 535) | @NonNull
method add (line 540) | @NonNull
method add (line 545) | @NonNull
method add (line 550) | @NonNull
method add (line 555) | @NonNull
method add (line 560) | @NonNull
method realAddOne (line 565) | @NonNull
method add (line 600) | @Nullable
method add (line 605) | @Nullable
method add (line 610) | @Nullable
method add (line 615) | @Nullable
method add (line 620) | @Nullable
method add (line 625) | @Nullable
method add (line 630) | @Nullable
method add (line 635) | @Nullable
method add (line 640) | @Nullable
method realAddArr (line 645) | private static Object realAddArr(@Nullable Object array1, @Nullable Ob...
method add (line 689) | @Nullable
method add (line 702) | @Nullable
method add (line 709) | public static char[] add(@Nullable char[] array1, int index, @Nullable...
method add (line 715) | @Nullable
method add (line 722) | @Nullable
method add (line 729) | @Nullable
method add (line 736) | @Nullable
method add (line 743) | @Nullable
method add (line 750) | @Nullable
method realAddArr (line 757) | @Nullable
method add (line 817) | @NonNull
method add (line 830) | @NonNull
method add (line 835) | @NonNull
method add (line 840) | @NonNull
method add (line 845) | @NonNull
method add (line 850) | @NonNull
method add (line 855) | @NonNull
method add (line 860) | @NonNull
method add (line 865) | @NonNull
method realAdd (line 870) | @NonNull
method remove (line 924) | @Nullable
method removeElement (line 954) | @Nullable
method remove (line 963) | @Nullable
method removeElement (line 969) | @Nullable
method remove (line 978) | @Nullable
method removeElement (line 984) | @Nullable
method remove (line 993) | @Nullable
method removeElement (line 999) | @Nullable
method remove (line 1008) | @Nullable
method removeElement (line 1014) | @Nullable
method remove (line 1024) | @Nullable
method removeElement (line 1030) | @Nullable
method remove (line 1039) | @Nullable
method removeElement (line 1045) | @Nullable
method remove (line 1054) | @Nullable
method removeElement (line 1060) | @Nullable
method remove (line 1069) | @Nullable
method removeElement (line 1075) | @Nullable
method remove (line 1084) | @NonNull
method indexOf (line 1104) | public static int indexOf(@Nullable Object[] array, @Nullable Object o...
method indexOf (line 1108) | public static int indexOf(@Nullable Object[] array, @Nullable final Ob...
method lastIndexOf (line 1131) | public static int lastIndexOf(@Nullable Object[] array, @Nullable Obje...
method lastIndexOf (line 1135) | public static int lastIndexOf(@Nullable Object[] array, @Nullable Obje...
method contains (line 1160) | public static boolean contains(@Nullable Object[] array, @Nullable Obj...
method indexOf (line 1168) | public static int indexOf(@Nullable long[] array, long valueToFind) {
method indexOf (line 1172) | public static int indexOf(@Nullable long[] array, long valueToFind, in...
method lastIndexOf (line 1187) | public static int lastIndexOf(@Nullable long[] array, long valueToFind) {
method lastIndexOf (line 1191) | public static int lastIndexOf(@Nullable long[] array, long valueToFind...
method contains (line 1208) | public static boolean contains(@Nullable long[] array, long valueToFin...
method indexOf (line 1216) | public static int indexOf(@Nullable int[] array, int valueToFind) {
method indexOf (line 1220) | public static int indexOf(@Nullable int[] array, int valueToFind, int ...
method lastIndexOf (line 1235) | public static int lastIndexOf(@Nullable int[] array, int valueToFind) {
method lastIndexOf (line 1239) | public static int lastIndexOf(@Nullable int[] array, int valueToFind, ...
method contains (line 1256) | public static boolean contains(@Nullable int[] array, int valueToFind) {
method indexOf (line 1264) | public static int indexOf(@Nullable short[] array, short valueToFind) {
method indexOf (line 1268) | public static int indexOf(@Nullable short[] array, short valueToFind, ...
method lastIndexOf (line 1283) | public static int lastIndexOf(@Nullable short[] array, short valueToFi...
method lastIndexOf (line 1287) | public static int lastIndexOf(@Nullable short[] array, short valueToFi...
method contains (line 1304) | public static boolean contains(@Nullable short[] array, short valueToF...
method indexOf (line 1312) | public static int indexOf(@Nullable char[] array, char valueToFind) {
method indexOf (line 1316) | public static int indexOf(@Nullable char[] array, char valueToFind, in...
method lastIndexOf (line 1331) | public static int lastIndexOf(@Nullable char[] array, char valueToFind) {
method lastIndexOf (line 1335) | public static int lastIndexOf(@Nullable char[] array, char valueToFind...
method contains (line 1352) | public static boolean contains(@Nullable char[] array, char valueToFin...
method indexOf (line 1360) | public static int indexOf(@Nullable byte[] array, byte valueToFind) {
method indexOf (line 1364) | public static int indexOf(@Nullable byte[] array, byte valueToFind, in...
method lastIndexOf (line 1379) | public static int lastIndexOf(@Nullable byte[] array, byte valueToFind) {
method lastIndexOf (line 1383) | public static int lastIndexOf(@Nullable byte[] array, byte valueToFind...
method contains (line 1400) | public static boolean contains(@Nullable byte[] array, byte valueToFin...
method indexOf (line 1408) | public static int indexOf(@Nullable double[] array, double valueToFind) {
method indexOf (line 1412) | public static int indexOf(@Nullable double[] array, double valueToFind...
method indexOf (line 1416) | public static int indexOf(@Nullable double[] array, double valueToFind...
method indexOf (line 1431) | public static int indexOf(@Nullable double[] array, double valueToFind...
method lastIndexOf (line 1448) | public static int lastIndexOf(@Nullable double[] array, double valueTo...
method lastIndexOf (line 1452) | public static int lastIndexOf(@Nullable double[] array, double valueTo...
method lastIndexOf (line 1456) | public static int lastIndexOf(@Nullable double[] array, double valueTo...
method lastIndexOf (line 1473) | public static int lastIndexOf(@Nullable double[] array, double valueTo...
method contains (line 1492) | public static boolean contains(@Nullable double[] array, double valueT...
method contains (line 1496) | public static boolean contains(@Nullable double[] array, double valueT...
method indexOf (line 1504) | public static int indexOf(@Nullable float[] array, float valueToFind) {
method indexOf (line 1508) | public static int indexOf(@Nullable float[] array, float valueToFind, ...
method lastIndexOf (line 1523) | public static int lastIndexOf(@Nullable float[] array, float valueToFi...
method lastIndexOf (line 1527) | public static int lastIndexOf(@Nullable float[] array, float valueToFi...
method contains (line 1544) | public static boolean contains(@Nullable float[] array, float valueToF...
method indexOf (line 1552) | public static int indexOf(@Nullable boolean[] array, boolean valueToFi...
method indexOf (line 1556) | public static int indexOf(@Nullable boolean[] array, boolean valueToFi...
method lastIndexOf (line 1571) | public static int lastIndexOf(@Nullable boolean[] array, boolean value...
method lastIndexOf (line 1575) | public static int lastIndexOf(@Nullable boolean[] array, boolean value...
method contains (line 1592) | public static boolean contains(@Nullable boolean[] array, boolean valu...
method toPrimitive (line 1600) | @Nullable
method toPrimitive (line 1614) | @Nullable
method toObject (line 1629) | @Nullable
method toPrimitive (line 1647) | @Nullable
method toPrimitive (line 1661) | @Nullable
method toObject (line 1676) | @Nullable
method toPrimitive (line 1694) | @Nullable
method toPrimitive (line 1708) | @Nullable
method toObject (line 1723) | @Nullable
method toPrimitive (line 1741) | @Nullable
method toPrimitive (line 1755) | @Nullable
method toObject (line 1770) | @Nullable
method toPrimitive (line 1788) | @Nullable
method toPrimitive (line 1802) | @Nullable
method toObject (line 1817) | @Nullable
method toPrimitive (line 1835) | @Nullable
method toPrimitive (line 1849) | @Nullable
method toObject (line 1864) | @Nullable
method toPrimitive (line 1882) | @Nullable
method toPrimitive (line 1896) | @Nullable
method toObject (line 1911) | @Nullable
method toPrimitive (line 1929) | @Nullable
method toPrimitive (line 1943) | @Nullable
method toObject (line 1958) | @Nullable
method asList (line 1972) | @NonNull
method asUnmodifiableList (line 1980) | @NonNull
method asArrayList (line 1985) | @NonNull
method asLinkedList (line 1993) | @NonNull
method sort (line 2001) | public static <T> void sort(@Nullable T[] array, Comparator<? super T>...
method sort (line 2006) | public static void sort(@Nullable byte[] array) {
method sort (line 2011) | public static void sort(@Nullable char[] array) {
method sort (line 2016) | public static void sort(@Nullable double[] array) {
method sort (line 2021) | public static void sort(@Nullable float[] array) {
method sort (line 2026) | public static void sort(@Nullable int[] array) {
method sort (line 2031) | public static void sort(@Nullable long[] array) {
method sort (line 2036) | public static void sort(@Nullable short[] array) {
method forAllDo (line 2049) | public static <E> void forAllDo(@Nullable Object array, @Nullable Clos...
method toString (line 2116) | @NonNull
type Closure (line 2141) | public interface Closure<E> {
method execute (line 2142) | void execute(int index, E item);
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/util/BarUtils.java
class BarUtils (line 39) | public final class BarUtils {
method BarUtils (line 49) | private BarUtils() {
method getStatusBarHeight (line 58) | public static int getStatusBarHeight() {
method setStatusBarVisibility (line 70) | public static void setStatusBarVisibility(@NonNull final Activity acti...
method setStatusBarVisibility (line 81) | public static void setStatusBarVisibility(@NonNull final Window window,
method isStatusBarVisible (line 100) | public static boolean isStatusBarVisible(@NonNull final Activity activ...
method setStatusBarLightMode (line 111) | public static void setStatusBarLightMode(@NonNull final Activity activ...
method setStatusBarLightMode (line 122) | public static void setStatusBarLightMode(@NonNull final Window window,
method isStatusBarLightMode (line 142) | public static boolean isStatusBarLightMode(@NonNull final Activity act...
method isStatusBarLightMode (line 152) | public static boolean isStatusBarLightMode(@NonNull final Window windo...
method addMarginTopEqualStatusBarHeight (line 166) | public static void addMarginTopEqualStatusBarHeight(@NonNull View view) {
method subtractMarginTopEqualStatusBarHeight (line 184) | public static void subtractMarginTopEqualStatusBarHeight(@NonNull View...
method addMarginTopEqualStatusBarHeight (line 196) | private static void addMarginTopEqualStatusBarHeight(@NonNull final Wi...
method subtractMarginTopEqualStatusBarHeight (line 203) | private static void subtractMarginTopEqualStatusBarHeight(@NonNull fin...
method setStatusBarColor (line 216) | public static View setStatusBarColor(@NonNull final Activity activity,
method setStatusBarColor (line 229) | public static View setStatusBarColor(@NonNull final Activity activity,
method setStatusBarColor (line 244) | public static View setStatusBarColor(@NonNull final Window window,
method setStatusBarColor (line 257) | public static View setStatusBarColor(@NonNull final Window window,
method setStatusBarColor (line 271) | public static void setStatusBarColor(@NonNull final View fakeStatusBar,
method setStatusBarCustom (line 289) | public static void setStatusBarCustom(@NonNull final View fakeStatusBa...
method setStatusBarColor4Drawer (line 316) | public static void setStatusBarColor4Drawer(@NonNull final DrawerLayou...
method setStatusBarColor4Drawer (line 331) | public static void setStatusBarColor4Drawer(@NonNull final DrawerLayou...
method applyStatusBarColor (line 351) | private static View applyStatusBarColor(@NonNull final Activity activity,
method applyStatusBarColor (line 357) | private static View applyStatusBarColor(@NonNull final Window window,
method hideStatusBarView (line 376) | private static void hideStatusBarView(@NonNull final Activity activity) {
method hideStatusBarView (line 380) | private static void hideStatusBarView(@NonNull final Window window) {
method showStatusBarView (line 387) | private static void showStatusBarView(@NonNull final Window window) {
method createStatusBarView (line 394) | private static View createStatusBarView(@NonNull final Context context,
method transparentStatusBar (line 404) | public static void transparentStatusBar(@NonNull final Activity activi...
method transparentStatusBar (line 408) | public static void transparentStatusBar(@NonNull final Window window) {
method getActionBarHeight (line 431) | public static int getActionBarHeight() {
method setNotificationBarVisibility (line 451) | @RequiresPermission(EXPAND_STATUS_BAR)
method invokePanels (line 462) | private static void invokePanels(final String methodName) {
method getNavBarHeight (line 484) | public static int getNavBarHeight() {
method setNavBarVisibility (line 500) | public static void setNavBarVisibility(@NonNull final Activity activit...
method setNavBarVisibility (line 512) | public static void setNavBarVisibility(@NonNull final Window window, b...
method isNavBarVisible (line 542) | public static boolean isNavBarVisible(@NonNull final Activity activity) {
method isNavBarVisible (line 553) | public static boolean isNavBarVisible(@NonNull final Window window) {
method getResNameById (line 588) | private static String getResNameById(int id) {
method setNavBarColor (line 602) | @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
method setNavBarColor (line 613) | @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
method getNavBarColor (line 625) | @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
method getNavBarColor (line 636) | @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
method isSupportNavBar (line 646) | public static boolean isSupportNavBar() {
method setNavBarLightMode (line 668) | public static void setNavBarLightMode(@NonNull final Activity activity,
method setNavBarLightMode (line 679) | public static void setNavBarLightMode(@NonNull final Window window,
method isNavBarLightMode (line 699) | public static boolean isNavBarLightMode(@NonNull final Activity activi...
method isNavBarLightMode (line 709) | public static boolean isNavBarLightMode(@NonNull final Window window) {
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/util/BatteryUtils.java
class BatteryUtils (line 27) | public final class BatteryUtils {
method isIgnoringBatteryOptimizations (line 45) | @RequiresApi(api = Build.VERSION_CODES.M)
method isIgnoringBatteryOptimizations (line 55) | @RequiresApi(api = Build.VERSION_CODES.M)
method registerBatteryStatusChangedListener (line 71) | public static void registerBatteryStatusChangedListener(final OnBatter...
method isRegistered (line 81) | public static boolean isRegistered(final OnBatteryStatusChangedListene...
method unregisterBatteryStatusChangedListener (line 90) | public static void unregisterBatteryStatusChangedListener(final OnBatt...
class BatteryChangedReceiver (line 94) | public static final class BatteryChangedReceiver extends BroadcastRece...
method getInstance (line 96) | private static BatteryChangedReceiver getInstance() {
method registerListener (line 102) | void registerListener(final OnBatteryStatusChangedListener listener) {
method isRegistered (line 118) | boolean isRegistered(final OnBatteryStatusChangedListener listener) {
method unregisterListener (line 123) | void unregisterListener(final OnBatteryStatusChangedListener listene...
method onReceive (line 137) | @Override
class LazyHolder (line 153) | private static class LazyHolder {
type OnBatteryStatusChangedListener (line 158) | public interface OnBatteryStatusChangedListener {
method onBatteryStatusChanged (line 159) | void onBatteryStatusChanged(Status status);
class Status (line 162) | public static final class Status {
method Status (line 167) | Status(int level, int status) {
method getLevel (line 172) | public int getLevel() {
method setLevel (line 176) | public void setLevel(int level) {
method getStatus (line 180) | @BatteryStatus
method setStatus (line 185) | public void setStatus(int status) {
method toString (line 189) | @Override
method batteryStatus2String (line 194) | public static String batteryStatus2String(@BatteryStatus int status) {
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/util/BitUtils.java
class BitUtils (line 13) | public final class BitUtils {
method BitUtils (line 15) | private BitUtils() {
method getBitValue (line 27) | public static byte getBitValue(byte source, int pos) {
method setBitValue (line 42) | public static byte setBitValue(byte source, int pos, byte value) {
method reverseBitValue (line 64) | public static byte reverseBitValue(byte source, int pos) {
method checkBitValue (line 78) | public static boolean checkBitValue(byte source, int pos) {
method main (line 91) | public static void main(String[] args) {
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/util/BrightnessUtils.java
class BrightnessUtils (line 19) | public final class BrightnessUtils {
method BrightnessUtils (line 21) | private BrightnessUtils() {
method isAutoBrightnessEnabled (line 30) | public static boolean isAutoBrightnessEnabled() {
method setAutoBrightnessEnabled (line 50) | public static boolean setAutoBrightnessEnabled(final boolean enabled) {
method getBrightness (line 64) | public static int getBrightness() {
method setBrightness (line 83) | public static boolean setBrightness(@IntRange(from = 0, to = 255) fina...
method setWindowBrightness (line 96) | public static void setWindowBrightness(@NonNull final Window window,
method getWindowBrightness (line 109) | public static int getWindowBrightness(@NonNull final Window window) {
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/util/BusUtils.java
class BusUtils (line 30) | public final class BusUtils {
method BusUtils (line 40) | private BusUtils() {
method init (line 48) | private void init() {/*inject*/}
method registerBus (line 50) | private void registerBus(String tag,
method registerBus (line 56) | private void registerBus(String tag,
method register (line 67) | public static void register(@Nullable final Object bus) {
method unregister (line 71) | public static void unregister(@Nullable final Object bus) {
method post (line 75) | public static void post(@NonNull final String tag) {
method post (line 79) | public static void post(@NonNull final String tag, @NonNull final Obje...
method postSticky (line 83) | public static void postSticky(@NonNull final String tag) {
method postSticky (line 87) | public static void postSticky(@NonNull final String tag, final Object ...
method removeSticky (line 91) | public static void removeSticky(final String tag) {
method toString_ (line 95) | public static String toString_() {
method toString (line 99) | @Override
method getInstance (line 104) | private static BusUtils getInstance() {
method registerInner (line 108) | private void registerInner(@Nullable final Object bus) {
method recordTags (line 133) | private void recordTags(Class<?> aClass, String className) {
method consumeStickyIfExist (line 158) | private void consumeStickyIfExist(final Object bus) {
method consumeSticky (line 168) | private void consumeSticky(final Object bus, final String tag, final O...
method unregisterInner (line 192) | private void unregisterInner(final Object bus) {
method postInner (line 205) | private void postInner(final String tag, final Object arg) {
method postInner (line 209) | private void postInner(final String tag, final Object arg, final boole...
method invokeBus (line 223) | private void invokeBus(Object arg, BusInfo busInfo, boolean sticky) {
method invokeBus (line 227) | private void invokeBus(Object bus, Object arg, BusInfo busInfo, boolea...
method getMethodByBusInfo (line 238) | private Method getMethodByBusInfo(BusInfo busInfo) {
method getClassName (line 253) | private Class getClassName(String paramType) throws ClassNotFoundExcep...
method invokeMethod (line 276) | private void invokeMethod(final Object arg, final BusInfo busInfo, fin...
method invokeMethod (line 280) | private void invokeMethod(final Object bus, final Object arg, final Bu...
method realInvokeMethod (line 308) | private void realInvokeMethod(Object bus, Object arg, BusInfo busInfo,...
method invokeBuses (line 329) | private void invokeBuses(Object arg, BusInfo busInfo, Set<Object> buse...
method postStickyInner (line 347) | private void postStickyInner(final String tag, final Object arg) {
method removeStickyInner (line 371) | private void removeStickyInner(final String tag) {
method registerBus4Test (line 391) | static void registerBus4Test(String tag,
class BusInfo (line 397) | private static final class BusInfo {
method BusInfo (line 410) | BusInfo(String tag, String className, String funName, String paramTy...
method toString (line 423) | @Override
method getDesc (line 434) | private String getDesc() {
type ThreadMode (line 440) | public enum ThreadMode {
class LazyHolder (line 456) | private static class LazyHolder {
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/util/CacheDiskStaticUtils.java
class CacheDiskStaticUtils (line 24) | public final class CacheDiskStaticUtils {
method setDefaultCacheDiskUtils (line 33) | public static void setDefaultCacheDiskUtils(@Nullable final CacheDiskU...
method put (line 43) | public static void put(@NonNull final String key, @Nullable final byte...
method put (line 54) | public static void put(@NonNull final String key, @Nullable final byte...
method getBytes (line 64) | public static byte[] getBytes(@NonNull final String key) {
method getBytes (line 75) | public static byte[] getBytes(@NonNull final String key, @Nullable fin...
method put (line 89) | public static void put(@NonNull final String key, @Nullable final Stri...
method put (line 100) | public static void put(@NonNull final String key, @Nullable final Stri...
method getString (line 110) | public static String getString(@NonNull final String key) {
method getString (line 121) | public static String getString(@NonNull final String key, @Nullable fi...
method put (line 135) | public static void put(@NonNull final String key, @Nullable final JSON...
method put (line 146) | public static void put(@NonNull final String key,
method getJSONObject (line 158) | public static JSONObject getJSONObject(@NonNull final String key) {
method getJSONObject (line 169) | public static JSONObject getJSONObject(@NonNull final String key, @Nul...
method put (line 184) | public static void put(@NonNull final String key, @Nullable final JSON...
method put (line 195) | public static void put(@NonNull final String key, @Nullable final JSON...
method getJSONArray (line 205) | public static JSONArray getJSONArray(@NonNull final String key) {
method getJSONArray (line 216) | public static JSONArray getJSONArray(@NonNull final String key, @Nulla...
method put (line 231) | public static void put(@NonNull final String key, @Nullable final Bitm...
method put (line 242) | public static void put(@NonNull final String key, @Nullable final Bitm...
method getBitmap (line 252) | public static Bitmap getBitmap(@NonNull final String key) {
method getBitmap (line 263) | public static Bitmap getBitmap(@NonNull final String key, @Nullable fi...
method put (line 277) | public static void put(@NonNull final String key, @Nullable final Draw...
method put (line 288) | public static void put(@NonNull final String key, @Nullable final Draw...
method getDrawable (line 298) | public static Drawable getDrawable(@NonNull final String key) {
method getDrawable (line 309) | public static Drawable getDrawable(@NonNull final String key, final @N...
method put (line 323) | public static void put(@NonNull final String key, @Nullable final Parc...
method put (line 334) | public static void put(@NonNull final String key, @Nullable final Parc...
method getParcelable (line 346) | public static <T> T getParcelable(@NonNull final String key,
method getParcelable (line 360) | public static <T> T getParcelable(@NonNull final String key,
method put (line 376) | public static void put(@NonNull final String key, @Nullable final Seri...
method put (line 387) | public static void put(@NonNull final String key, @Nullable final Seri...
method getSerializable (line 397) | public static Object getSerializable(@NonNull final String key) {
method getSerializable (line 408) | public static Object getSerializable(@NonNull final String key, @Nulla...
method getCacheSize (line 417) | public static long getCacheSize() {
method getCacheCount (line 426) | public static int getCacheCount() {
method remove (line 436) | public static boolean remove(@NonNull final String key) {
method clear (line 445) | public static boolean clear() {
method put (line 460) | public static void put(@NonNull final String key,
method put (line 474) | public static void put(@NonNull final String key,
method getBytes (line 488) | public static byte[] getBytes(@NonNull final String key, @NonNull fina...
method getBytes (line 500) | public static byte[] getBytes(@NonNull final String key,
method put (line 517) | public static void put(@NonNull final String key,
method put (line 531) | public static void put(@NonNull final String key,
method getString (line 545) | public static String getString(@NonNull final String key, @NonNull fin...
method getString (line 557) | public static String getString(@NonNull final String key,
method put (line 574) | public static void put(@NonNull final String key,
method put (line 588) | public static void put(@NonNull final String key,
method getJSONObject (line 602) | public static JSONObject getJSONObject(@NonNull final String key, @Non...
method getJSONObject (line 614) | public static JSONObject getJSONObject(@NonNull final String key,
method put (line 632) | public static void put(@NonNull final String key,
method put (line 646) | public static void put(@NonNull final String key,
method getJSONArray (line 660) | public static JSONArray getJSONArray(@NonNull final String key, @NonNu...
method getJSONArray (line 672) | public static JSONArray getJSONArray(@NonNull final String key,
method put (line 690) | public static void put(@NonNull final String key,
method put (line 704) | public static void put(@NonNull final String key,
method getBitmap (line 718) | public static Bitmap getBitmap(@NonNull final String key, @NonNull fin...
method getBitmap (line 730) | public static Bitmap getBitmap(@NonNull final String key,
method put (line 747) | public static void put(@NonNull final String key,
method put (line 761) | public static void put(@NonNull final String key,
method getDrawable (line 775) | public static Drawable getDrawable(@NonNull final String key, @NonNull...
method getDrawable (line 787) | public static Drawable getDrawable(@NonNull final String key,
method put (line 804) | public static void put(@NonNull final String key,
method put (line 818) | public static void put(@NonNull final String key,
method getParcelable (line 834) | public static <T> T getParcelable(@NonNull final String key,
method getParcelable (line 850) | public static <T> T getParcelable(@NonNull final String key,
method put (line 868) | public static void put(@NonNull final String key,
method put (line 882) | public static void put(@NonNull final String key,
method getSerializable (line 896) | public static Object getSerializable(@NonNull final String key, @NonNu...
method getSerializable (line 908) | public static Object getSerializable(@NonNull final String key,
method getCacheSize (line 920) | public static long getCacheSize(@NonNull final CacheDiskUtils cacheDis...
method getCacheCount (line 930) | public static int getCacheCount(@NonNull final CacheDiskUtils cacheDis...
method remove (line 941) | public static boolean remove(@NonNull final String key, @NonNull final...
method clear (line 951) | public static boolean clear(@NonNull final CacheDiskUtils cacheDiskUti...
method getDefaultCacheDiskUtils (line 955) | @NonNull
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/util/CacheDiskUtils.java
class CacheDiskUtils (line 35) | public final class CacheDiskUtils implements CacheConstants {
method getInstance (line 65) | public static CacheDiskUtils getInstance() {
method getInstance (line 78) | public static CacheDiskUtils getInstance(final String cacheName) {
method getInstance (line 90) | public static CacheDiskUtils getInstance(final long maxSize, final int...
method getInstance (line 103) | public static CacheDiskUtils getInstance(String cacheName, final long ...
method getInstance (line 117) | public static CacheDiskUtils getInstance(@NonNull final File cacheDir) {
method getInstance (line 129) | public static CacheDiskUtils getInstance(@NonNull final File cacheDir,
method CacheDiskUtils (line 146) | private CacheDiskUtils(final String cacheKey,
method getDiskCacheManager (line 156) | private DiskCacheManager getDiskCacheManager() {
method toString (line 171) | @Override
method put (line 186) | public void put(@NonNull final String key, final byte[] value) {
method put (line 197) | public void put(@NonNull final String key, final byte[] value, final i...
method realPutBytes (line 201) | private void realPutBytes(final String key, byte[] value, int saveTime) {
method getBytes (line 219) | public byte[] getBytes(@NonNull final String key) {
method getBytes (line 230) | public byte[] getBytes(@NonNull final String key, final byte[] default...
method realGetBytes (line 234) | private byte[] realGetBytes(@NonNull final String key) {
method realGetBytes (line 238) | private byte[] realGetBytes(@NonNull final String key, final byte[] de...
method put (line 262) | public void put(@NonNull final String key, final String value) {
method put (line 273) | public void put(@NonNull final String key, final String value, final i...
method getString (line 283) | public String getString(@NonNull final String key) {
method getString (line 294) | public String getString(@NonNull final String key, final String defaul...
method put (line 310) | public void put(@NonNull final String key, final JSONObject value) {
method put (line 321) | public void put(@NonNull final String key,
method getJSONObject (line 333) | public JSONObject getJSONObject(@NonNull final String key) {
method getJSONObject (line 344) | public JSONObject getJSONObject(@NonNull final String key, final JSONO...
method put (line 361) | public void put(@NonNull final String key, final JSONArray value) {
method put (line 372) | public void put(@NonNull final String key, final JSONArray value, fina...
method getJSONArray (line 382) | public JSONArray getJSONArray(@NonNull final String key) {
method getJSONArray (line 393) | public JSONArray getJSONArray(@NonNull final String key, final JSONArr...
method put (line 410) | public void put(@NonNull final String key, final Bitmap value) {
method put (line 421) | public void put(@NonNull final String key, final Bitmap value, final i...
method getBitmap (line 431) | public Bitmap getBitmap(@NonNull final String key) {
method getBitmap (line 442) | public Bitmap getBitmap(@NonNull final String key, final Bitmap defaul...
method put (line 458) | public void put(@NonNull final String key, final Drawable value) {
method put (line 469) | public void put(@NonNull final String key, final Drawable value, final...
method getDrawable (line 479) | public Drawable getDrawable(@NonNull final String key) {
method getDrawable (line 490) | public Drawable getDrawable(@NonNull final String key, final Drawable ...
method put (line 506) | public void put(@NonNull final String key, final Parcelable value) {
method put (line 517) | public void put(@NonNull final String key, final Parcelable value, fin...
method getParcelable (line 529) | public <T> T getParcelable(@NonNull final String key,
method getParcelable (line 543) | public <T> T getParcelable(@NonNull final String key,
method put (line 561) | public void put(@NonNull final String key, final Serializable value) {
method put (line 572) | public void put(@NonNull final String key, final Serializable value, f...
method getSerializable (line 582) | public Object getSerializable(@NonNull final String key) {
method getSerializable (line 593) | public Object getSerializable(@NonNull final String key, final Object ...
method getCacheSize (line 604) | public long getCacheSize() {
method getCacheCount (line 615) | public int getCacheCount() {
method remove (line 627) | public boolean remove(@NonNull final String key) {
method clear (line 645) | public boolean clear() {
class DiskCacheManager (line 651) | private static final class DiskCacheManager {
method DiskCacheManager (line 661) | private DiskCacheManager(final File cacheDir, final long sizeLimit, ...
method getCacheSize (line 692) | private long getCacheSize() {
method getCacheCount (line 697) | private int getCacheCount() {
method getFileBeforePut (line 702) | private File getFileBeforePut(final String key) {
method wait2InitOk (line 712) | private void wait2InitOk() {
method getFileIfExists (line 720) | private File getFileIfExists(final String key) {
method getCacheNameByKey (line 726) | private String getCacheNameByKey(final String key) {
method put (line 730) | private void put(final File file) {
method updateModify (line 739) | private void updateModify(final File file) {
method removeByKey (line 745) | private boolean removeByKey(final String key) {
method clear (line 755) | private boolean clear() {
method removeOldest (line 786) | private long removeOldest() {
class DiskCacheHelper (line 810) | private static final class DiskCacheHelper {
method newByteArrayWithTime (line 814) | private static byte[] newByteArrayWithTime(final int second, final b...
method createDueTime (line 828) | private static String createDueTime(final int seconds) {
method isDue (line 835) | private static boolean isDue(final byte[] data) {
method getDueTime (line 840) | private static long getDueTime(final byte[] data) {
method getDataWithoutDueTime (line 852) | private static byte[] getDataWithoutDueTime(final byte[] data) {
method copyOfRange (line 859) | private static byte[] copyOfRange(final byte[] original, final int f...
method hasTimeInfo (line 867) | private static boolean hasTimeInfo(final byte[] data) {
FILE: Android/dokit-util/src/main/java/com/didichuxing/doraemonkit/util/CacheDoubleStaticUtils.java
class CacheDoubleStaticUtils (line 23) | public final class CacheDoubleStaticUtils {
method setDefaultCacheDoubleUtils (line 32) | public static void setDefaultCacheDoubleUtils(final CacheDoubleUtils c...
method put (line 42) | public static void put(@NonNull final String key, final byte[] value) {
method put (line 53) | public static void put(@NonNull final String key, byte[] value, final ...
method getBytes (line 63) | public static byte[] getBytes(@NonNull final String key) {
method getBytes (line 74) | public static byte[] getBytes(@NonNull final String key, final byte[] ...
method put (line 88) | public static void put(@NonNull final String key, final String value) {
method put (line 99) | public static void put(@NonNull final String key, final String value, ...
method getString (line 109) | public static String getString(@NonNull final String key) {
method getString (line 120) | public static String getString(@NonNull final String key, final String...
method put (line 134) | public static void put(@NonNull final String key, final JSONObject val...
method put (line 145) | public static void put(@NonNull final String key,
method getJSONObject (line 157) | public static JSONObject getJSONObject(@NonNull final String key) {
method getJSONObject (line 168) | public static JSONObject getJSONObject(@NonNull final String key, fina...
method put (line 183) | public static void put(@NonNull final String key, final JSONArray valu...
method put (line 194) | public static void pu
Copy disabled (too large)
Download .json
Condensed preview — 3038 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (10,846K chars).
[
{
"path": ".github/ISSUE_TEMPLATE/-dokit-------------.md",
"chars": 830,
"preview": "---\nname: \"【DoKit生态场景】-描述出现的问题\"\nabout: DoKit生态场景比如Android、iOS、小程序、Flutter,后面跟你需要描述的内容\ntitle: \"【DoKit生态场景】-描述出现的问题\"\nlabel"
},
{
"path": ".github/issue_template.md",
"chars": 366,
"preview": "Please complete the following informations.\n> Expected behavior and actual behavior.\n> Steps to reproduce the problem.\n>"
},
{
"path": ".gitignore",
"chars": 418,
"preview": "# macOS.gitignore\n# General\n.DS_Store\n.AppleDouble\n.LSOverride\n\n# Icon must end with two \\r\nIcon\n\n# Thumbnails\n._*\n\n# Fi"
},
{
"path": "Android/.editorconfig",
"chars": 257,
"preview": "# http://editorconfig.org\nroot = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 4\nend_of_line = lf\ninsert_"
},
{
"path": "Android/.gitignore",
"chars": 203,
"preview": "*.iml\n.gradle\nlocal.properties\n/.idea/libraries\n/.idea/modules.xml\n/.idea/workspace.xml\n.DS_Store\n/build\n/*/build\n/captu"
},
{
"path": "Android/README.md",
"chars": 11210,
"preview": "# Android接入指南\n\n## DoKit Android 最新版本\n**由于jcenter事件的影响,我们需要将DoKit For Android迁移到mavenCentral(),但是需要更改groupId.所以大家要注意一下,具体"
},
{
"path": "Android/app/.gitignore",
"chars": 7,
"preview": "/build\n"
},
{
"path": "Android/app/build.gradle",
"chars": 8525,
"preview": "apply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-kapt'\napply from: 'doraemon"
},
{
"path": "Android/app/doraemonkit.gradle",
"chars": 1367,
"preview": "def runType = rootProject.ext.publish_config[\"run_type\"]\nif (runType == 0) {\n // 引用插件\n apply plugin: 'com.didi.dok"
},
{
"path": "Android/app/proguard-rules.pro",
"chars": 973,
"preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
},
{
"path": "Android/app/src/androidTest/java/com/didichuxing/doraemondemo/ExampleInstrumentedTest.java",
"chars": 702,
"preview": "//package com.didichuxing.doraemondemo;\n//\n//import android.content.Context;\n//\n//import org.junit.Test;\n//import org.ju"
},
{
"path": "Android/app/src/debug/java/AndroidManifest.xml",
"chars": 2666,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:to"
},
{
"path": "Android/app/src/debug/java/com/didichuxing/doraemondemo/AopApp.java",
"chars": 2519,
"preview": "package com.didichuxing.doraemondemo;\n\nimport android.app.Application;\nimport android.content.Context;\n\nimport androidx."
},
{
"path": "Android/app/src/debug/java/com/didichuxing/doraemondemo/App.kt",
"chars": 6479,
"preview": "package com.didichuxing.doraemondemo\n\nimport android.app.Activity\nimport android.app.Application\nimport android.content."
},
{
"path": "Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/AMapUtil.java",
"chars": 7051,
"preview": "/**\n * \n */\npackage com.didichuxing.doraemondemo.amap;\n\nimport android.text.Html;\nimport android.text.Spanned;\nimport an"
},
{
"path": "Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/ChString.java",
"chars": 1283,
"preview": "package com.didichuxing.doraemondemo.amap;\n\npublic class ChString {\n\tpublic static final String Kilometer = \"\\u516c\\u91c"
},
{
"path": "Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/DrivingRouteOverLay.java",
"chars": 11170,
"preview": "package com.didichuxing.doraemondemo.amap;\n\nimport android.content.Context;\nimport android.graphics.Color;\n\nimport com.a"
},
{
"path": "Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/FloatGpsMockRouteKitView.java",
"chars": 4349,
"preview": "package com.didichuxing.doraemondemo.amap;\n\nimport android.content.Context;\nimport android.os.Handler;\nimport android.os"
},
{
"path": "Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/FloatGpsPresetMockKit.java",
"chars": 1414,
"preview": "package com.didichuxing.doraemondemo.amap;\n\nimport android.app.Activity;\nimport android.content.Context;\n\nimport com.bla"
},
{
"path": "Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/FloatGpsPresetMockKitView.java",
"chars": 3304,
"preview": "package com.didichuxing.doraemondemo.amap;\n\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.But"
},
{
"path": "Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/RouteOverlay.java",
"chars": 5217,
"preview": "package com.didichuxing.doraemondemo.amap;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport andro"
},
{
"path": "Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/mockroute/BearingUtils.java",
"chars": 745,
"preview": "package com.didichuxing.doraemondemo.amap.mockroute;\n\n/**\n * changzuozhen\n * 2021年 04月 20日\n */\npublic final class Bearin"
},
{
"path": "Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/mockroute/LogUtils.java",
"chars": 7086,
"preview": "package com.didichuxing.doraemondemo.amap.mockroute;\n\nimport android.os.Handler;\nimport android.os.HandlerThread;\nimport"
},
{
"path": "Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/mockroute/MockGPSTaskData.java",
"chars": 2734,
"preview": "package com.didichuxing.doraemondemo.amap.mockroute;\n\nimport java.util.ArrayList;\n\n/**\n * changzuozhen\n * 2021年 04月 20日\n"
},
{
"path": "Android/app/src/debug/java/com/didichuxing/doraemondemo/amap/mockroute/MockGPSTaskManager.java",
"chars": 8156,
"preview": "package com.didichuxing.doraemondemo.amap.mockroute;\n\nimport android.location.Location;\nimport android.location.Location"
},
{
"path": "Android/app/src/main/AndroidManifest.xml",
"chars": 3552,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:di"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/AopTest.java",
"chars": 337,
"preview": "package com.didichuxing.doraemondemo;\n\n/**\n * ================================================\n * 作 者:jint(金台)\n * 版 "
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/BaseStatusBarActivity.java",
"chars": 1678,
"preview": "package com.didichuxing.doraemondemo;\n\nimport android.app.Activity;\nimport android.os.Build;\nimport android.os.Bundle;\ni"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/DataBaseActivity.kt",
"chars": 1495,
"preview": "package com.didichuxing.doraemondemo\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.appcompat.app.Ap"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/EmptyActivity.kt",
"chars": 527,
"preview": "package com.didichuxing.doraemondemo\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.appcompat.app.Ap"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/MainDoKitActivity.kt",
"chars": 4876,
"preview": "package com.didichuxing.doraemondemo\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.os.Bundle"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/WebViewSystemActivity.kt",
"chars": 3869,
"preview": "package com.didichuxing.doraemondemo\n\nimport android.annotation.SuppressLint\nimport android.os.Build\nimport android.os.B"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/WebViewX5Activity.kt",
"chars": 3590,
"preview": "package com.didichuxing.doraemondemo\n\nimport android.annotation.SuppressLint\nimport android.os.Build\nimport android.os.B"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/amap/AMapRouterFragment.kt",
"chars": 6031,
"preview": "package com.didichuxing.doraemondemo.amap\n\nimport android.os.Bundle\nimport android.view.View\nimport android.widget.TextV"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/amap/DefaultNaviListener.kt",
"chars": 5175,
"preview": "package com.didichuxing.doraemondemo.amap\n\nimport android.content.Context\nimport android.util.Log\nimport com.amap.api.ma"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/amap/NaviRouteOverlay.kt",
"chars": 7150,
"preview": "package com.didichuxing.doraemondemo.amap\n\nimport android.content.Context\nimport android.graphics.BitmapFactory\nimport c"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/comm/CommBaseFragment.kt",
"chars": 1656,
"preview": "package com.didichuxing.doraemondemo.comm\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.vi"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/comm/CommFragmentActivity.kt",
"chars": 1781,
"preview": "package com.didichuxing.doraemondemo.comm\n\nimport android.os.Bundle\nimport android.view.View\nimport android.view.Window\n"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/comm/CommLauncher.kt",
"chars": 865,
"preview": "package com.didichuxing.doraemondemo.comm\n\nimport android.content.Context\nimport android.content.Intent\nimport android.o"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/comm/CommViewModel.kt",
"chars": 748,
"preview": "package com.didichuxing.doraemondemo.comm\n\nimport androidx.lifecycle.*\n\n/**\n * ========================================="
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/db/DatabaseHelper.kt",
"chars": 1313,
"preview": "package com.didichuxing.doraemondemo.db\n\nimport android.content.Context\nimport android.database.sqlite.SQLiteDatabase\nim"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/db/PersonDBHelper.java",
"chars": 4732,
"preview": "/*\n *\n * * Copyright (C) 2019 Amit Shekhar\n * * Copyright (C) 2011 Android Open Source Project\n * *\n * * Li"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/BorderDoKitView.java",
"chars": 2399,
"preview": "//package com.didichuxing.doraemondemo.dokit;\n//\n//import android.content.Context;\n//import android.view.LayoutInflater;"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/CustomDokitFragment.kt",
"chars": 1618,
"preview": "package com.didichuxing.doraemondemo.dokit\n\nimport android.os.Bundle\nimport android.view.View\nimport android.widget.Comp"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/DemoDoKitView.kt",
"chars": 1410,
"preview": "package com.didichuxing.doraemondemo.dokit\n\nimport android.content.Context\nimport android.view.Gravity\nimport android.vi"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/DemoKit.kt",
"chars": 907,
"preview": "package com.didichuxing.doraemondemo.dokit\n\nimport android.app.Activity\nimport android.content.Context\nimport com.didich"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/SimpleDoKitView.java",
"chars": 3591,
"preview": "package com.didichuxing.doraemondemo.dokit;\n\nimport android.content.Context;\nimport android.util.DisplayMetrics;\nimport "
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/TestSimpleDoKitFloatView.kt",
"chars": 1462,
"preview": "package com.didichuxing.doraemondemo.dokit\n\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.View\nim"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/TestSimpleDokitFloatViewKit.kt",
"chars": 854,
"preview": "package com.didichuxing.doraemondemo.dokit\n\nimport android.app.Activity\nimport android.content.Context\nimport com.didich"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/TestSimpleDokitFragmentKit.kt",
"chars": 903,
"preview": "package com.didichuxing.doraemondemo.dokit\n\nimport android.app.Activity\nimport android.content.Context\nimport android.os"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/dokit/ViewSetupHelper.java",
"chars": 1631,
"preview": "package com.didichuxing.doraemondemo.dokit;\n\nimport android.text.TextUtils;\nimport android.view.View;\nimport android.wid"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/mc/DoKitButton.kt",
"chars": 2869,
"preview": "package com.didichuxing.doraemondemo.mc\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android."
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/mc/DoKitRecycleView.kt",
"chars": 663,
"preview": "package com.didichuxing.doraemondemo.mc\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport androidx"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/mc/DoKitWebView.kt",
"chars": 939,
"preview": "package com.didichuxing.doraemondemo.mc\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android."
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/mc/FileUtils.java",
"chars": 917,
"preview": "package com.didichuxing.doraemondemo.mc;\n\nimport java.io.File;\nimport java.io.InputStream;\n\n/**\n * didi Create on 2022/3"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/mc/MCActivity.kt",
"chars": 6722,
"preview": "package com.didichuxing.doraemondemo.mc\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.View"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/mc/MyProxyWebView.java",
"chars": 505,
"preview": "package com.didichuxing.doraemondemo.mc;\n\nimport android.webkit.WebView;\n\n/**\n * didi Create on 2022/3/22 .\n * <p>\n * Co"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/mc/MyTestWebView.java",
"chars": 1144,
"preview": "package com.didichuxing.doraemondemo.mc;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport andro"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/mc/MyTestWebViewBuilder.java",
"chars": 1593,
"preview": "package com.didichuxing.doraemondemo.mc;\n\nimport android.text.TextUtils;\n\nimport com.didichuxing.doraemonkit.util.LogHel"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/mc/NetMainActivity.kt",
"chars": 1483,
"preview": "package com.didichuxing.doraemondemo.mc\n\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/mc/RVAdapter.kt",
"chars": 1014,
"preview": "package com.didichuxing.doraemondemo.mc\n\nimport android.widget.Button\nimport android.widget.TextView\nimport com.blankj.u"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/mc/SlideBar.java",
"chars": 7279,
"preview": "package com.didichuxing.doraemondemo.mc;\n\nimport android.animation.ValueAnimator;\nimport android.annotation.SuppressLint"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/mc/VPAdapter.kt",
"chars": 685,
"preview": "package com.didichuxing.doraemondemo.mc\n\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentMana"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/mc/VpFragment.kt",
"chars": 1021,
"preview": "package com.didichuxing.doraemondemo.mc\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/mc/WebViewActivity.kt",
"chars": 2799,
"preview": "package com.didichuxing.doraemondemo.mc\n\nimport android.graphics.Bitmap\nimport android.os.Build\nimport android.os.Bundle"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/module/CrashTest.kt",
"chars": 191,
"preview": "package com.didichuxing.doraemondemo.module\n\nobject CrashTest {\n\n fun test() {\n checkNotNull(testCrash())\n "
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/module/DoKitItemView.java",
"chars": 3309,
"preview": "package com.didichuxing.doraemondemo.module;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimp"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/module/MethodCostTest.kt",
"chars": 813,
"preview": "package com.didichuxing.doraemondemo.module\n\nobject MethodCostTest {\n\n\n fun test() {\n test1()\n }\n\n priva"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/module/ModuleActivity.java",
"chars": 300,
"preview": "package com.didichuxing.doraemondemo.module;\n\n\n/**\n * didi Create on 2022/5/25 .\n * <p>\n * Copyright (c) 2022/5/25 by di"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/module/ShadowDrawable.java",
"chars": 7546,
"preview": "package com.didichuxing.doraemondemo.module;\n\n/**\n * didi Create on 2022/5/27 .\n * <p>\n * Copyright (c) 2022/5/27 by did"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/module/bigbitmap/BigBitmapActivity.kt",
"chars": 6576,
"preview": "package com.didichuxing.doraemondemo.module.bigbitmap\n\nimport android.graphics.BitmapFactory\nimport android.net.Uri\nimpo"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/module/db/DataBaseTest.kt",
"chars": 335,
"preview": "package com.didichuxing.doraemondemo.module.db\n\nimport com.didichuxing.doraemondemo.db.DatabaseHelper\nimport com.didichu"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/module/http/CustomInterceptor.kt",
"chars": 533,
"preview": "package com.didichuxing.doraemondemo.module.http\n\nimport android.util.Log\nimport okhttp3.Interceptor\nimport okhttp3.Resp"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/module/http/FileUploadTest.kt",
"chars": 4724,
"preview": "package com.didichuxing.doraemondemo.module.http\n\nimport android.app.ProgressDialog\nimport android.content.Context\nimpor"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/module/http/OkHttpMock.kt",
"chars": 2144,
"preview": "package com.didichuxing.doraemondemo.module.http\n\nimport android.util.Log\nimport com.didichuxing.doraemondemo.old.MainDe"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/module/http/RetrofitMock.kt",
"chars": 1178,
"preview": "package com.didichuxing.doraemondemo.module.http\n\nimport android.util.Log\nimport com.didichuxing.doraemondemo.old.MainDe"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/module/http/URLConnectionMock.kt",
"chars": 1440,
"preview": "package com.didichuxing.doraemondemo.module.http\n\nimport android.util.Log\nimport com.blankj.utilcode.util.ConvertUtils\ni"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/module/leak/LeakActivity.kt",
"chars": 459,
"preview": "package com.didichuxing.doraemondemo.module.leak\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivi"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/module/retrofit/GithubService.kt",
"chars": 426,
"preview": "package com.didichuxing.doraemondemo.module.retrofit\n\nimport retrofit2.http.GET\nimport retrofit2.http.Path\n\n/**\n * ====="
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/module/retrofit/GithubUserInfo.kt",
"chars": 1237,
"preview": "package com.didichuxing.doraemondemo.module.retrofit\n\n/**\n * ================================================\n * 作 者:"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/old/BaseActivity.kt",
"chars": 464,
"preview": "package com.didichuxing.doraemondemo.old\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\n\n/**\n"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/old/MainAdapter.kt",
"chars": 715,
"preview": "package com.didichuxing.doraemondemo.old\n\nimport android.widget.Button\nimport androidx.annotation.LayoutRes\nimport com.c"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/old/MainDebugActivityOkhttpV3.kt",
"chars": 19574,
"preview": "package com.didichuxing.doraemondemo.old\n\nimport android.Manifest\nimport android.annotation.SuppressLint\nimport android."
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/old/MainDebugActivityOkhttpV4.kt",
"chars": 21284,
"preview": "package com.didichuxing.doraemondemo.old//package com.didichuxing.doraemondemo\n//\n//import android.Manifest\n//import and"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/old/MapActivity.kt",
"chars": 11077,
"preview": "//package com.didichuxing.doraemondemo\n//\n//import android.location.Location\n//import android.os.Bundle\n//import android"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/old/MapShowingLocationActivity.kt",
"chars": 6283,
"preview": "//package com.didichuxing.doraemondemo\n//\n//import android.Manifest\n//import android.annotation.SuppressLint\n//import an"
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/test/ScreenRecordingService.java",
"chars": 6570,
"preview": "package com.didichuxing.doraemondemo.test;\n\nimport android.annotation.SuppressLint;\nimport android.app.Activity;\nimport "
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/test/ScreenRecordingTest.java",
"chars": 1686,
"preview": "package com.didichuxing.doraemondemo.test;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android."
},
{
"path": "Android/app/src/main/java/com/didichuxing/doraemondemo/test/screen/ScreenRecordingDoKitView.kt",
"chars": 2907,
"preview": "package com.didichuxing.doraemondemo.test.screen\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport a"
},
{
"path": "Android/app/src/main/res/drawable/bg_unlock_bar_btn_normal_v5.xml",
"chars": 231,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:sha"
},
{
"path": "Android/app/src/main/res/drawable/bg_unlock_bar_normal_v5.xml",
"chars": 231,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:sha"
},
{
"path": "Android/app/src/main/res/drawable/dk_btn_background.xml",
"chars": 294,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <solid and"
},
{
"path": "Android/app/src/main/res/drawable/dk_info_background.xml",
"chars": 248,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <solid and"
},
{
"path": "Android/app/src/main/res/drawable/dk_line_divider.xml",
"chars": 186,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <size andr"
},
{
"path": "Android/app/src/main/res/drawable/dk_shape_float_view_bg.xml",
"chars": 346,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:sha"
},
{
"path": "Android/app/src/main/res/drawable/ic_launcher_background.xml",
"chars": 5606,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:wi"
},
{
"path": "Android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
"chars": 1880,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:aapt=\"http://schemas.android.com/aapt\"\n "
},
{
"path": "Android/app/src/main/res/layout/activity_amap_path.xml",
"chars": 366,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "Android/app/src/main/res/layout/activity_big_bitmap_mock.xml",
"chars": 6148,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmln"
},
{
"path": "Android/app/src/main/res/layout/activity_comm.xml",
"chars": 1329,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "Android/app/src/main/res/layout/activity_dokit_main.xml",
"chars": 13711,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
},
{
"path": "Android/app/src/main/res/layout/activity_empty.xml",
"chars": 617,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "Android/app/src/main/res/layout/activity_leak.xml",
"chars": 603,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "Android/app/src/main/res/layout/activity_main.xml",
"chars": 1051,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.core.widget.NestedScrollView xmlns:android=\"http://schemas.android.com/"
},
{
"path": "Android/app/src/main/res/layout/activity_map.xml",
"chars": 1192,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "Android/app/src/main/res/layout/activity_mc.xml",
"chars": 6190,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xml"
},
{
"path": "Android/app/src/main/res/layout/activity_net_main.xml",
"chars": 867,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
},
{
"path": "Android/app/src/main/res/layout/activity_normal_webview.xml",
"chars": 572,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmln"
},
{
"path": "Android/app/src/main/res/layout/activity_second.xml",
"chars": 618,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "Android/app/src/main/res/layout/activity_webview.xml",
"chars": 548,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmln"
},
{
"path": "Android/app/src/main/res/layout/activity_ws.xml",
"chars": 1979,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmln"
},
{
"path": "Android/app/src/main/res/layout/activity_x5_webview.xml",
"chars": 584,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmln"
},
{
"path": "Android/app/src/main/res/layout/dk_demo.xml",
"chars": 1068,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n an"
},
{
"path": "Android/app/src/main/res/layout/dk_layout_simple_dokit_float_view.xml",
"chars": 2526,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
},
{
"path": "Android/app/src/main/res/layout/dk_screen_show_view.xml",
"chars": 1494,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns"
},
{
"path": "Android/app/src/main/res/layout/fragment_amap.xml",
"chars": 851,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "Android/app/src/main/res/layout/fragment_vp.xml",
"chars": 587,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "Android/app/src/main/res/layout/item_lv.xml",
"chars": 605,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "Android/app/src/main/res/layout/item_main_rv.xml",
"chars": 699,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "Android/app/src/main/res/layout/item_rv.xml",
"chars": 913,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "Android/app/src/main/res/layout/item_sc.xml",
"chars": 605,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "Android/app/src/main/res/layout/layout_demo_custom.xml",
"chars": 1819,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n andro"
},
{
"path": "Android/app/src/main/res/layout/layout_mock_location_preset.xml",
"chars": 1533,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
},
{
"path": "Android/app/src/main/res/layout/layout_mock_route.xml",
"chars": 3896,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas."
},
{
"path": "Android/app/src/main/res/layout/layout_slidebar.xml",
"chars": 1429,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:id="
},
{
"path": "Android/app/src/main/res/layout/view_dokit_item_view.xml",
"chars": 1419,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns"
},
{
"path": "Android/app/src/main/res/values/atts.xml",
"chars": 455,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <declare-styleable name=\"DoKitItemView\">\n <attr name=\"ite"
},
{
"path": "Android/app/src/main/res/values/colors.xml",
"chars": 420,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"color_00A39E\">#00A39E</color>\n <color name=\"color"
},
{
"path": "Android/app/src/main/res/values/dimens.xml",
"chars": 117,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <dimen name=\"slidebar_thumb_width\">60dp</dimen>\n\n</resources>"
},
{
"path": "Android/app/src/main/res/values/strings.xml",
"chars": 1800,
"preview": "<resources>\n <string name=\"app_name\">DoKit</string>\n <string name=\"dk_kit_demo\">demo</string>\n <string name=\"dk"
},
{
"path": "Android/app/src/main/res/values/styles.xml",
"chars": 958,
"preview": "<resources>\n\n <!-- Base application theme. -->\n <style name=\"AppTheme\" parent=\"Theme.MaterialComponents.DayNight\">"
},
{
"path": "Android/app/src/main/res/values-en-rUS/strings.xml",
"chars": 1352,
"preview": "<resources>\n <string name=\"app_name\">DoKit</string>\n <string name=\"app_build_types\">BuildType</string>\n <string"
},
{
"path": "Android/app/src/main/res/values-zh-rCN/strings.xml",
"chars": 1236,
"preview": "<resources>\n <string name=\"app_name\">DoKit</string>\n <string name=\"app_build_types\">当前编译环境</string>\n <string na"
},
{
"path": "Android/app/src/main/res/xml/network_config.xml",
"chars": 252,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<network-security-config>\n <base-config cleartextTrafficPermitted=\"true\">\n "
},
{
"path": "Android/app/src/release/java/AndroidManifest.xml",
"chars": 935,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:to"
},
{
"path": "Android/app/src/release/java/com/didichuxing/doraemondemo/App.kt",
"chars": 4561,
"preview": "package com.didichuxing.doraemondemo\n\nimport android.app.Activity\nimport android.app.Application\nimport android.content."
},
{
"path": "Android/app/src/test/java/com/didichuxing/doraemondemo/ExampleUnitTest.kt",
"chars": 14920,
"preview": "package com.didichuxing.doraemondemo\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.launch\nimport o"
},
{
"path": "Android/app/src/test/java/com/didichuxing/doraemondemo/KotlinBaseUnitTest.kt",
"chars": 937,
"preview": "package com.didichuxing.doraemondemo\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.launch\nimport o"
},
{
"path": "Android/app/src/test/java/com/didichuxing/doraemondemo/KotlinCaseTest.kt",
"chars": 402,
"preview": "package com.didichuxing.doraemondemo\n\nimport org.junit.Test\n\nclass KotlinCaseTest {\n\n\n @Test\n @Throws(Exception::c"
},
{
"path": "Android/app/src/test/java/com/didichuxing/doraemondemo/TestJava.java",
"chars": 403,
"preview": "package com.didichuxing.doraemondemo;\n\nimport org.junit.Test;\n\n/**\n * didi Create on 2022/3/22 .\n * <p>\n * Copyright (c)"
},
{
"path": "Android/build.gradle",
"chars": 6734,
"preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n a"
},
{
"path": "Android/buildSrc/.gitignore",
"chars": 7,
"preview": "/build\n"
},
{
"path": "Android/buildSrc/build.gradle",
"chars": 1641,
"preview": "buildscript {\n apply from: \"../config.gradle\"\n\n repositories {\n mavenLocal()\n mavenCentral()\n "
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitExt.kt",
"chars": 7916,
"preview": "package com.didichuxing.doraemonkit.plugin\n\nimport com.android.build.gradle.api.BaseVariant\nimport com.android.dex.DexFo"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitExtUtil.kt",
"chars": 5593,
"preview": "package com.didichuxing.doraemonkit.plugin\n\nimport com.didichuxing.doraemonkit.plugin.extension.DoKitExtension\nimport co"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitPlugin.kt",
"chars": 7326,
"preview": "package com.didichuxing.doraemonkit.plugin\n\nimport com.android.build.gradle.AppExtension\nimport com.android.build.gradle"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitPluginUtil.kt",
"chars": 2786,
"preview": "package com.didichuxing.doraemonkit.plugin\n\nimport java.io.File\n\n/**\n * ================================================"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/DoKitTransformTaskExecutionListener.kt",
"chars": 682,
"preview": "package com.didichuxing.doraemonkit.plugin\n\nimport com.android.build.gradle.internal.pipeline.TransformTask\nimport com.d"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/BigImageExtension.kt",
"chars": 977,
"preview": "package com.didichuxing.doraemonkit.plugin.extension\n\n\n/**\n * didi Create on 2023/3/21 .\n *\n * Copyright (c) 2023/3/21 b"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/DoKitExtension.kt",
"chars": 1961,
"preview": "package com.didichuxing.doraemonkit.plugin.extension\n\nimport org.gradle.api.Action\n\n/**\n * Created by jint on 07/10/2018"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/GpsExtension.kt",
"chars": 937,
"preview": "package com.didichuxing.doraemonkit.plugin.extension\n\n\n/**\n * didi Create on 2023/3/21 .\n *\n * Copyright (c) 2023/3/21 b"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/NetworkExtension.kt",
"chars": 1039,
"preview": "package com.didichuxing.doraemonkit.plugin.extension\n\n\n/**\n * didi Create on 2023/3/21 .\n *\n * Copyright (c) 2023/3/21 b"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/SlowMethodExtension.kt",
"chars": 3416,
"preview": "package com.didichuxing.doraemonkit.plugin.extension\n\nimport groovy.lang.Closure\nimport org.gradle.util.ConfigureUtil\n\n/"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/extension/WebViewExtension.kt",
"chars": 757,
"preview": "package com.didichuxing.doraemonkit.plugin.extension\n\n\n/**\n * didi Create on 2023/3/21 .\n *\n * Copyright (c) 2023/3/21 b"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitComponentHandler.kt",
"chars": 1509,
"preview": "package com.didichuxing.doraemonkit.plugin.processor\n\nimport org.xml.sax.Attributes\nimport org.xml.sax.helpers.DefaultHa"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/processor/DoKitPluginConfigProcessor.kt",
"chars": 4211,
"preview": "package com.didichuxing.doraemonkit.plugin.processor\n\nimport com.android.build.gradle.AppExtension\nimport com.android.bu"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/stack_method/MethodStackNode.kt",
"chars": 598,
"preview": "package com.didichuxing.doraemonkit.plugin.stack_method\n\n/**\n * ================================================\n * 作 "
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/stack_method/MethodStackNodeUtil.kt",
"chars": 679,
"preview": "package com.didichuxing.doraemonkit.plugin.stack_method\n\nimport java.util.*\n\n/**\n * ===================================="
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/thirdlib/ThirdLibInfo.kt",
"chars": 310,
"preview": "package com.didichuxing.doraemonkit.plugin.thirdlib\n\n/**\n * ================================================\n * 作 者:j"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/thirdlib/ThirdLibVariantProcessor.kt",
"chars": 1925,
"preview": "package com.didichuxing.doraemonkit.plugin.thirdlib\n\nimport com.android.build.gradle.api.BaseVariant\nimport com.didichux"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitBaseTransform.kt",
"chars": 3104,
"preview": "package com.didichuxing.doraemonkit.plugin.transform\n\nimport com.android.build.api.transform.QualifiedContent\nimport com"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitCommonTransform.kt",
"chars": 1346,
"preview": "package com.didichuxing.doraemonkit.plugin.transform\n\nimport com.didichuxing.doraemonkit.plugin.transform.asmtransform.D"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitCommonTransformV34.kt",
"chars": 1810,
"preview": "package com.didichuxing.doraemonkit.plugin.transform\n\nimport com.android.build.api.variant.VariantInfo\nimport com.didich"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitDependTransform.kt",
"chars": 818,
"preview": "package com.didichuxing.doraemonkit.plugin.transform\n\nimport com.didichuxing.doraemonkit.plugin.transform.asmtransform.D"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitDependTransformV34.kt",
"chars": 1526,
"preview": "package com.didichuxing.doraemonkit.plugin.transform\n\nimport com.android.build.api.variant.VariantInfo\nimport com.didich"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitTransformContext.kt",
"chars": 474,
"preview": "package com.didichuxing.doraemonkit.plugin.transform\n\nimport com.didichuxing.doraemonkit.plugin.extension.DoKitExtension"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/DoKitTransformInvocation.kt",
"chars": 8579,
"preview": "package com.didichuxing.doraemonkit.plugin.transform\n\nimport com.android.build.api.transform.*\nimport com.android.build."
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/asmtransform/BaseDoKitAsmTransformer.kt",
"chars": 3176,
"preview": "package com.didichuxing.doraemonkit.plugin.transform.asmtransform\n\nimport com.didiglobal.booster.annotations.Priority\nim"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/asmtransform/DoKitAsmTransformer.kt",
"chars": 430,
"preview": "package com.didichuxing.doraemonkit.plugin.transform.asmtransform\n\nimport com.didiglobal.booster.transform.asm.ClassTran"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/classtransform/AbsClassTransformer.kt",
"chars": 1834,
"preview": "package com.didichuxing.doraemonkit.plugin.transform.classtransform\n\nimport com.didichuxing.doraemonkit.plugin.DoKitExtU"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/classtransform/BigImgClassTransformer.kt",
"chars": 8163,
"preview": "package com.didichuxing.doraemonkit.plugin.transform.classtransform\n\nimport com.didichuxing.doraemonkit.plugin.extension"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/classtransform/CommClassTransformer.kt",
"chars": 8266,
"preview": "package com.didichuxing.doraemonkit.plugin.transform.classtransform\n\nimport com.didichuxing.doraemonkit.plugin.DoKitExtU"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/classtransform/EnterMSClassTransformer.kt",
"chars": 8974,
"preview": "package com.didichuxing.doraemonkit.plugin.transform.classtransform\n\nimport com.didichuxing.doraemonkit.plugin.*\nimport "
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/classtransform/GPSAMapClassTransformer.kt",
"chars": 8967,
"preview": "package com.didichuxing.doraemonkit.plugin.transform.classtransform\n\nimport com.didichuxing.doraemonkit.plugin.DoKitExtU"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/classtransform/GPSBDClassTransformer.kt",
"chars": 7207,
"preview": "package com.didichuxing.doraemonkit.plugin.transform.classtransform\n\nimport com.didichuxing.doraemonkit.plugin.DoKitExtU"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/classtransform/GPSClassTransformer.kt",
"chars": 2441,
"preview": "package com.didichuxing.doraemonkit.plugin.transform.classtransform\n\nimport com.didichuxing.doraemonkit.plugin.DoKitExtU"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/classtransform/GPSTencentClassTransformer.kt",
"chars": 3845,
"preview": "package com.didichuxing.doraemonkit.plugin.transform.classtransform\n\nimport com.didichuxing.doraemonkit.plugin.DoKitExtU"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/classtransform/GSMClassTransformer.kt",
"chars": 7884,
"preview": "package com.didichuxing.doraemonkit.plugin.transform.classtransform\n\nimport com.didichuxing.doraemonkit.plugin.*\nimport "
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/classtransform/MSDClassTransformer.kt",
"chars": 9500,
"preview": "package com.didichuxing.doraemonkit.plugin.transform.classtransform\n\nimport com.didichuxing.doraemonkit.plugin.*\nimport "
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/classtransform/Okhttp3ClassTransformer.kt",
"chars": 2676,
"preview": "package com.didichuxing.doraemonkit.plugin.transform.classtransform\n\nimport com.didichuxing.doraemonkit.plugin.extension"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/classtransform/ThirdLibsClassTransformer.kt",
"chars": 3053,
"preview": "package com.didichuxing.doraemonkit.plugin.transform.classtransform\n\nimport com.didichuxing.doraemonkit.plugin.DoKitExtU"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/classtransform/UrlConnectionTransformer.kt",
"chars": 2196,
"preview": "package com.didichuxing.doraemonkit.plugin.transform.classtransform\n\nimport com.didichuxing.doraemonkit.plugin.extension"
},
{
"path": "Android/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/transform/classtransform/WebViewClassTransformer.kt",
"chars": 5163,
"preview": "package com.didichuxing.doraemonkit.plugin.transform.classtransform\n\nimport com.didichuxing.doraemonkit.plugin.DoKitExtU"
},
{
"path": "Android/buildSrc/src/main/resources/META-INF/gradle-plugins/com.didi.dokit.debug.properties",
"chars": 103,
"preview": "#入口文件\n#文件名为插件名 即 apply plugin \"xxx\"\nimplementation-class=com.didichuxing.doraemonkit.plugin.DoKitPlugin"
},
{
"path": "Android/config.gradle",
"chars": 13168,
"preview": "ext {\n publish_config = [\n //0:发布到到本地localRepoURL仓库\n //1:发布到滴滴内部仓库 一般不建议使用 如果需要发布到滴滴内网仓库需要将版本号改得比较大 假如版"
},
{
"path": "Android/dokit/.gitignore",
"chars": 13,
"preview": "/build\n/.cxx\n"
},
{
"path": "Android/dokit/build.gradle",
"chars": 5861,
"preview": "apply plugin: 'com.android.library'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-kapt'\napply from: '../upload.gr"
},
{
"path": "Android/dokit/gradle.properties",
"chars": 18,
"preview": "ARTIFACT_ID=dokitx"
},
{
"path": "Android/dokit/proguard-rules.pro",
"chars": 749,
"preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
},
{
"path": "Android/dokit/src/androidTest/java/com/didichuxing/doraemonkit/ExampleInstrumentedTest.java",
"chars": 606,
"preview": "//package com.didichuxing.doraemonkit;\n//\n//import android.content.Context;\n//\n//\n///**\n// * Instrumented test, which wi"
},
{
"path": "Android/dokit/src/main/AndroidManifest.xml",
"chars": 3771,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:to"
},
{
"path": "Android/dokit/src/main/assets/dokit_system_kits.json",
"chars": 7858,
"preview": "[\n {\n \"groupId\": \"dk_category_platform\",\n \"kits\": [\n {\n \"allClassName\": \"com.didichuxing."
},
{
"path": "Android/dokit/src/main/assets/h5help/dokit.js",
"chars": 632556,
"preview": "(function(){\"use strict\";function makeMap(e,t){const o=Object.create(null),n=e.split(\",\");for(let e=0;e<n.length;e++)o[n"
},
{
"path": "Android/dokit/src/main/assets/h5help/dokit_js_hook.html",
"chars": 5234,
"preview": "<script type=\"text/javascript\">\n /**\n * generate an unique id string (32)\n * @private\n * @return string\n */\n fun"
},
{
"path": "Android/dokit/src/main/assets/h5help/dokit_js_vconsole_hook.html",
"chars": 170,
"preview": "<script src=\"https://cdn.bootcdn.net/ajax/libs/vConsole/3.3.4/vconsole.min.js\"></script>\n<script type=\"text/javascript\">"
},
{
"path": "Android/dokit/src/main/assets/map/map.html",
"chars": 2518,
"preview": "<!DOCTYPE html>\n<html>\n\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n <meta name=\""
},
{
"path": "Android/dokit/src/main/cpp/CMakeLists.txt",
"chars": 1598,
"preview": "# For more information about using CMake with Android Studio, read the\n# documentation: https://d.android.com/studio/pro"
},
{
"path": "Android/dokit/src/main/cpp/art.cpp",
"chars": 4060,
"preview": "//\n// Created by weishu on 2018/6/7.\n//\n#include \"art.h\"\n#include <android/log.h>\n#include <vector>\n#include <string>\n#i"
},
{
"path": "Android/dokit/src/main/cpp/art.h",
"chars": 7485,
"preview": "//\n// Created by weishu on 2018/6/7.\n//\n\n#ifndef FREEREFLECTION_ART_H\n#define FREEREFLECTION_ART_H\n\n#include <jni.h>\n#in"
},
{
"path": "Android/dokit/src/main/cpp/main.cpp",
"chars": 214,
"preview": "#include <jni.h>\n#include \"art.h\"\n\nextern \"C\"\nJNIEXPORT jint JNICALL\nJava_me_weishu_reflection_Reflection_unsealNative(J"
}
]
// ... and 2838 more files (download for full content)
About this extraction
This page contains the full source code of the didi/DoKit GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 3038 files (9.7 MB), approximately 2.7M tokens, and a symbol index with 11524 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.