├── .gitattributes
├── .gitignore
├── README.md
├── app
├── .gitignore
├── build.gradle
├── libs
│ ├── TencentLocationSDK_v6.1.2_r1df4baaa_170627_1056.jar
│ ├── TencentMapSDK_Raster_v_1.2.8_e45bcd0.jar
│ ├── TencentMapSearch_v1.1.7.3207904.jar
│ ├── armeabi-v7a
│ │ └── libtencentloc.so
│ ├── armeabi
│ │ └── libtencentloc.so
│ └── x86
│ │ └── libtencentloc.so
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── assets
│ └── OaceOaT8w5Xda6wa
│ ├── java
│ ├── androidTool
│ │ ├── DeviceUtils.java
│ │ └── LogUtils.java
│ └── io
│ │ └── virtualapp
│ │ ├── VApp.java
│ │ ├── VCommends.java
│ │ ├── abs
│ │ ├── BasePresenter.java
│ │ ├── BaseView.java
│ │ ├── Callback.java
│ │ ├── Value.java
│ │ ├── nestedadapter
│ │ │ ├── RecyclerViewAdapterWrapper.java
│ │ │ └── SmartRecyclerAdapter.java
│ │ ├── percent
│ │ │ └── PercentLinearLayout.java
│ │ ├── reflect
│ │ │ └── ReflectException.java
│ │ └── ui
│ │ │ ├── BaseAdapterPlus.java
│ │ │ ├── VActivity.java
│ │ │ ├── VFragment.java
│ │ │ └── VUiKit.java
│ │ ├── delegate
│ │ ├── MyAppRequestListener.java
│ │ ├── MyComponentDelegate.java
│ │ ├── MyPhoneInfoDelegate.java
│ │ └── MyTaskDescriptionDelegate.java
│ │ ├── effects
│ │ ├── ExplosionAnimator.java
│ │ └── ExplosionField.java
│ │ ├── home
│ │ ├── FlurryROMCollector.java
│ │ ├── HomeActivity.java
│ │ ├── HomeContract.java
│ │ ├── HomePresenterImpl.java
│ │ ├── ListAppActivity.java
│ │ ├── ListAppContract.java
│ │ ├── ListAppFragment.java
│ │ ├── ListAppPresenterImpl.java
│ │ ├── LoadingActivity.java
│ │ ├── adapters
│ │ │ ├── AppLocationAdapter.java
│ │ │ ├── AppPagerAdapter.java
│ │ │ ├── CloneAppListAdapter.java
│ │ │ ├── LaunchpadAdapter.java
│ │ │ └── decorations
│ │ │ │ └── ItemOffsetDecoration.java
│ │ ├── location
│ │ │ ├── MarkerActivity.java
│ │ │ └── VirtualLocationSettings.java
│ │ ├── models
│ │ │ ├── AddAppButton.java
│ │ │ ├── AppData.java
│ │ │ ├── AppInfo.java
│ │ │ ├── AppInfoLite.java
│ │ │ ├── EmptyAppData.java
│ │ │ ├── LocationData.java
│ │ │ ├── MultiplePackageAppData.java
│ │ │ └── PackageAppData.java
│ │ ├── platform
│ │ │ ├── PlatformInfo.java
│ │ │ └── WechatPlatformInfo.java
│ │ └── repo
│ │ │ ├── AppDataSource.java
│ │ │ ├── AppRepository.java
│ │ │ └── PackageAppDataStorage.java
│ │ ├── splash
│ │ └── SplashActivity.java
│ │ ├── vs
│ │ └── VSManagerActivity.java
│ │ └── widgets
│ │ ├── BallGridBeatIndicator.java
│ │ ├── BallPulseIndicator.java
│ │ ├── BaseView.java
│ │ ├── CardStackAdapter.java
│ │ ├── CardStackLayout.java
│ │ ├── CircularAnim.java
│ │ ├── DragSelectRecyclerView.java
│ │ ├── DragSelectRecyclerViewAdapter.java
│ │ ├── EatBeansView.java
│ │ ├── Indicator.java
│ │ ├── LabelView.java
│ │ ├── LauncherIconView.java
│ │ ├── LoadingIndicatorView.java
│ │ ├── MarqueeTextView.java
│ │ ├── MaterialRippleLayout.java
│ │ ├── RippleButton.java
│ │ ├── ShadowProperty.java
│ │ ├── ShadowViewDrawable.java
│ │ ├── Shimmer.java
│ │ ├── ShimmerViewBase.java
│ │ ├── ShimmerViewHelper.java
│ │ ├── TwoGearsView.java
│ │ ├── ViewHelper.java
│ │ └── fittext
│ │ ├── BaseTextView.java
│ │ ├── FitTextHelper.java
│ │ └── FitTextView.java
│ └── res
│ ├── drawable-hdpi
│ ├── ic_add.png
│ ├── ic_add_circle.png
│ ├── ic_check.png
│ ├── ic_crash.png
│ ├── ic_menu.png
│ ├── ic_no_check.png
│ └── ic_shortcut.png
│ ├── drawable-xxhdpi
│ ├── ic_about.png
│ ├── ic_account.png
│ ├── ic_device.png
│ ├── ic_notification.png
│ ├── ic_settings.png
│ ├── ic_vs.png
│ └── ic_wifi.png
│ ├── drawable
│ ├── blue_circle.xml
│ ├── fab_bg.xml
│ ├── home_bg.xml
│ ├── icon_bg.xml
│ ├── sel_clone_app_btn.xml
│ ├── sel_guide_btn.xml
│ ├── shape_clone_app_btn.xml
│ └── shape_clone_app_btn_pressed.xml
│ ├── layout
│ ├── activity_clone_app.xml
│ ├── activity_home.xml
│ ├── activity_install.xml
│ ├── activity_loading.xml
│ ├── activity_location_settings.xml
│ ├── activity_marker.xml
│ ├── activity_splash.xml
│ ├── activity_users.xml
│ ├── content_toolbar.xml
│ ├── fragment_list_app.xml
│ ├── item_app.xml
│ ├── item_clone_app.xml
│ ├── item_launcher_app.xml
│ ├── item_location_app.xml
│ └── item_user.xml
│ ├── menu
│ ├── marktet_map.xml
│ └── user_menu.xml
│ ├── mipmap-hdpi
│ └── ic_launcher.png
│ ├── mipmap-mdpi
│ └── ic_launcher.png
│ ├── mipmap-xhdpi
│ └── ic_launcher.png
│ ├── mipmap-xxhdpi
│ └── ic_launcher.png
│ ├── mipmap-xxxhdpi
│ └── ic_launcher.png
│ ├── values-en
│ └── strings.xml
│ ├── values-zh-rCN
│ └── strings.xml
│ ├── values-zh-rTW
│ └── strings.xml
│ └── values
│ ├── attrs.xml
│ ├── colors.xml
│ ├── dimens.xml
│ ├── fitTextView.xml
│ ├── ids.xml
│ ├── integers.xml
│ ├── strings.xml
│ └── styles.xml
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── lib
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── aidl
│ ├── android
│ │ ├── accounts
│ │ │ ├── IAccountAuthenticator.aidl
│ │ │ ├── IAccountAuthenticatorResponse.aidl
│ │ │ └── IAccountManagerResponse.aidl
│ │ ├── app
│ │ │ ├── IActivityManager
│ │ │ │ └── ContentProviderHolder.aidl
│ │ │ ├── IServiceConnection.aidl
│ │ │ ├── IStopUserCallback.aidl
│ │ │ └── job
│ │ │ │ ├── IJobCallback.aidl
│ │ │ │ └── IJobService.aidl
│ │ ├── content
│ │ │ ├── IIntentReceiver.aidl
│ │ │ ├── ISyncAdapter.aidl
│ │ │ ├── ISyncContext.aidl
│ │ │ ├── ISyncStatusObserver.aidl
│ │ │ └── pm
│ │ │ │ ├── IPackageDataObserver.aidl
│ │ │ │ ├── IPackageDeleteObserver2.aidl
│ │ │ │ ├── IPackageInstallObserver.aidl
│ │ │ │ ├── IPackageInstallObserver2.aidl
│ │ │ │ ├── IPackageInstallerCallback.aidl
│ │ │ │ └── IPackageInstallerSession.aidl
│ │ ├── location
│ │ │ └── ILocationListener.aidl
│ │ └── net
│ │ │ ├── IConnectivityManager.aidl
│ │ │ └── wifi
│ │ │ └── IWifiScanner.aidl
│ └── com
│ │ └── lody
│ │ └── virtual
│ │ ├── client
│ │ └── IVClient.aidl
│ │ ├── os
│ │ └── VUserInfo.aidl
│ │ ├── remote
│ │ ├── AppTaskInfo.aidl
│ │ ├── BadgerInfo.aidl
│ │ ├── InstallResult.aidl
│ │ ├── InstalledAppInfo.aidl
│ │ ├── PendingIntentData.aidl
│ │ ├── PendingResultData.aidl
│ │ ├── Problem.aidl
│ │ ├── ReceiverInfo.aidl
│ │ ├── VDeviceInfo.aidl
│ │ ├── VParceledListSlice.aidl
│ │ └── vloc
│ │ │ ├── VCell.aidl
│ │ │ ├── VLocation.aidl
│ │ │ └── VWifi.aidl
│ │ └── server
│ │ ├── IBinderDelegateService.aidl
│ │ ├── IPackageInstaller.aidl
│ │ ├── IPackageInstallerSession.aidl
│ │ ├── interfaces
│ │ ├── IAppRequestListener.aidl
│ │ ├── IIntentFilterObserver.aidl
│ │ ├── IPackageObserver.aidl
│ │ ├── IProcessObserver.aidl
│ │ ├── IServiceFetcher.aidl
│ │ └── IUiCallback.aidl
│ │ └── pm
│ │ └── installer
│ │ ├── SessionInfo.aidl
│ │ └── SessionParams.aidl
│ ├── java
│ ├── android
│ │ ├── content
│ │ │ ├── SyncStatusInfo.java
│ │ │ └── pm
│ │ │ │ └── PackageParser.java
│ │ └── location
│ │ │ └── LocationRequest.java
│ ├── com
│ │ └── lody
│ │ │ └── virtual
│ │ │ ├── Build.java
│ │ │ ├── DelegateApplication64Bit.java
│ │ │ ├── GmsSupport.java
│ │ │ ├── client
│ │ │ ├── NativeEngine.java
│ │ │ ├── VClientImpl.java
│ │ │ ├── badger
│ │ │ │ ├── BadgerManager.java
│ │ │ │ ├── BroadcastBadger1.java
│ │ │ │ ├── BroadcastBadger2.java
│ │ │ │ └── IBadger.java
│ │ │ ├── core
│ │ │ │ ├── CrashHandler.java
│ │ │ │ ├── InstallStrategy.java
│ │ │ │ ├── InvocationStubManager.java
│ │ │ │ └── VirtualCore.java
│ │ │ ├── env
│ │ │ │ ├── Constants.java
│ │ │ │ ├── DeadServerException.java
│ │ │ │ ├── GPSStateline.java
│ │ │ │ ├── SpecialComponentList.java
│ │ │ │ ├── VirtualGPSSatalines.java
│ │ │ │ └── VirtualRuntime.java
│ │ │ ├── fixer
│ │ │ │ ├── ActivityFixer.java
│ │ │ │ ├── ComponentFixer.java
│ │ │ │ └── ContextFixer.java
│ │ │ ├── hook
│ │ │ │ ├── base
│ │ │ │ │ ├── BinderInvocationProxy.java
│ │ │ │ │ ├── BinderInvocationStub.java
│ │ │ │ │ ├── Inject.java
│ │ │ │ │ ├── LogInvocation.java
│ │ │ │ │ ├── MethodBox.java
│ │ │ │ │ ├── MethodInvocationProxy.java
│ │ │ │ │ ├── MethodInvocationStub.java
│ │ │ │ │ ├── MethodProxy.java
│ │ │ │ │ ├── ReplaceCallingPkgMethodProxy.java
│ │ │ │ │ ├── ReplaceLastPkgMethodProxy.java
│ │ │ │ │ ├── ReplaceLastUidMethodProxy.java
│ │ │ │ │ ├── ReplaceSequencePkgMethodProxy.java
│ │ │ │ │ ├── ReplaceSpecPkgMethodProxy.java
│ │ │ │ │ ├── ReplaceUidMethodProxy.java
│ │ │ │ │ ├── ResultStaticMethodProxy.java
│ │ │ │ │ ├── SkipInject.java
│ │ │ │ │ └── StaticMethodProxy.java
│ │ │ │ ├── delegate
│ │ │ │ │ ├── AppInstrumentation.java
│ │ │ │ │ ├── ComponentDelegate.java
│ │ │ │ │ ├── InstrumentationDelegate.java
│ │ │ │ │ ├── PhoneInfoDelegate.java
│ │ │ │ │ └── TaskDescriptionDelegate.java
│ │ │ │ ├── providers
│ │ │ │ │ ├── DownloadProviderHook.java
│ │ │ │ │ ├── ExternalProviderHook.java
│ │ │ │ │ ├── InternalProviderHook.java
│ │ │ │ │ ├── ProviderHook.java
│ │ │ │ │ └── SettingsProviderHook.java
│ │ │ │ ├── proxies
│ │ │ │ │ ├── account
│ │ │ │ │ │ └── AccountManagerStub.java
│ │ │ │ │ ├── alarm
│ │ │ │ │ │ └── AlarmManagerStub.java
│ │ │ │ │ ├── am
│ │ │ │ │ │ ├── ActivityManagerStub.java
│ │ │ │ │ │ ├── HCallbackStub.java
│ │ │ │ │ │ └── MethodProxies.java
│ │ │ │ │ ├── appops
│ │ │ │ │ │ └── AppOpsManagerStub.java
│ │ │ │ │ ├── appwidget
│ │ │ │ │ │ └── AppWidgetManagerStub.java
│ │ │ │ │ ├── audio
│ │ │ │ │ │ └── AudioManagerStub.java
│ │ │ │ │ ├── backup
│ │ │ │ │ │ └── BackupManagerStub.java
│ │ │ │ │ ├── bluetooth
│ │ │ │ │ │ └── BluetoothStub.java
│ │ │ │ │ ├── clipboard
│ │ │ │ │ │ └── ClipBoardStub.java
│ │ │ │ │ ├── connectivity
│ │ │ │ │ │ └── ConnectivityStub.java
│ │ │ │ │ ├── content
│ │ │ │ │ │ └── ContentServiceStub.java
│ │ │ │ │ ├── context_hub
│ │ │ │ │ │ └── ContextHubServiceStub.java
│ │ │ │ │ ├── devicepolicy
│ │ │ │ │ │ └── DevicePolicyManagerStub.java
│ │ │ │ │ ├── display
│ │ │ │ │ │ └── DisplayStub.java
│ │ │ │ │ ├── dropbox
│ │ │ │ │ │ └── DropBoxManagerStub.java
│ │ │ │ │ ├── fingerprint
│ │ │ │ │ │ └── FingerprintManagerStub.java
│ │ │ │ │ ├── graphics
│ │ │ │ │ │ └── GraphicsStatsStub.java
│ │ │ │ │ ├── imms
│ │ │ │ │ │ └── MmsStub.java
│ │ │ │ │ ├── input
│ │ │ │ │ │ ├── InputMethodManagerStub.java
│ │ │ │ │ │ └── MethodProxies.java
│ │ │ │ │ ├── isms
│ │ │ │ │ │ └── ISmsStub.java
│ │ │ │ │ ├── isub
│ │ │ │ │ │ └── ISubStub.java
│ │ │ │ │ ├── job
│ │ │ │ │ │ └── JobServiceStub.java
│ │ │ │ │ ├── libcore
│ │ │ │ │ │ ├── LibCoreStub.java
│ │ │ │ │ │ └── MethodProxies.java
│ │ │ │ │ ├── location
│ │ │ │ │ │ ├── GPSListenerThread.java
│ │ │ │ │ │ ├── GPSStatusListenerThread.java
│ │ │ │ │ │ ├── LocationManagerStub.java
│ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ └── MockLocationHelper.java
│ │ │ │ │ ├── media
│ │ │ │ │ │ ├── router
│ │ │ │ │ │ │ └── MediaRouterServiceStub.java
│ │ │ │ │ │ └── session
│ │ │ │ │ │ │ └── SessionManagerStub.java
│ │ │ │ │ ├── mount
│ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ └── MountServiceStub.java
│ │ │ │ │ ├── network
│ │ │ │ │ │ └── NetworkManagementStub.java
│ │ │ │ │ ├── notification
│ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ └── NotificationManagerStub.java
│ │ │ │ │ ├── persistent_data_block
│ │ │ │ │ │ └── PersistentDataBlockServiceStub.java
│ │ │ │ │ ├── phonesubinfo
│ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ └── PhoneSubInfoStub.java
│ │ │ │ │ ├── pm
│ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ └── PackageManagerStub.java
│ │ │ │ │ ├── power
│ │ │ │ │ │ └── PowerManagerStub.java
│ │ │ │ │ ├── restriction
│ │ │ │ │ │ └── RestrictionStub.java
│ │ │ │ │ ├── search
│ │ │ │ │ │ └── SearchManagerStub.java
│ │ │ │ │ ├── shortcut
│ │ │ │ │ │ └── ShortcutServiceStub.java
│ │ │ │ │ ├── telephony
│ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ ├── TelephonyRegistryStub.java
│ │ │ │ │ │ └── TelephonyStub.java
│ │ │ │ │ ├── usage
│ │ │ │ │ │ └── UsageStatsManagerStub.java
│ │ │ │ │ ├── user
│ │ │ │ │ │ └── UserManagerStub.java
│ │ │ │ │ ├── vibrator
│ │ │ │ │ │ └── VibratorStub.java
│ │ │ │ │ ├── view
│ │ │ │ │ │ └── AutoFillManagerStub.java
│ │ │ │ │ ├── wifi
│ │ │ │ │ │ └── WifiManagerStub.java
│ │ │ │ │ ├── wifi_scanner
│ │ │ │ │ │ ├── GhostWifiScannerImpl.java
│ │ │ │ │ │ └── WifiScannerStub.java
│ │ │ │ │ └── window
│ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ ├── WindowManagerStub.java
│ │ │ │ │ │ └── session
│ │ │ │ │ │ ├── BaseMethodProxy.java
│ │ │ │ │ │ └── WindowSessionPatch.java
│ │ │ │ ├── secondary
│ │ │ │ │ ├── HackAppUtils.java
│ │ │ │ │ ├── ProxyServiceFactory.java
│ │ │ │ │ ├── ServiceConnectionDelegate.java
│ │ │ │ │ └── StubBinder.java
│ │ │ │ └── utils
│ │ │ │ │ └── MethodParameterUtils.java
│ │ │ ├── interfaces
│ │ │ │ └── IInjector.java
│ │ │ ├── ipc
│ │ │ │ ├── ActivityClientRecord.java
│ │ │ │ ├── LocalProxyUtils.java
│ │ │ │ ├── ProviderCall.java
│ │ │ │ ├── ServiceManagerNative.java
│ │ │ │ ├── VAccountManager.java
│ │ │ │ ├── VActivityManager.java
│ │ │ │ ├── VDeviceManager.java
│ │ │ │ ├── VJobScheduler.java
│ │ │ │ ├── VNotificationManager.java
│ │ │ │ ├── VPackageManager.java
│ │ │ │ ├── VirtualLocationManager.java
│ │ │ │ └── VirtualStorageManager.java
│ │ │ ├── natives
│ │ │ │ └── NativeMethods.java
│ │ │ └── stub
│ │ │ │ ├── AmsTask.java
│ │ │ │ ├── ChooseAccountTypeActivity.java
│ │ │ │ ├── ChooseTypeAndAccountActivity.java
│ │ │ │ ├── ChooserActivity.java
│ │ │ │ ├── DaemonService.java
│ │ │ │ ├── ResolverActivity.java
│ │ │ │ ├── ShortcutHandleActivity.java
│ │ │ │ ├── StubActivity.java
│ │ │ │ ├── StubContentProvider.java
│ │ │ │ ├── StubDialog.java
│ │ │ │ ├── StubJob.java
│ │ │ │ ├── StubPendingActivity.java
│ │ │ │ ├── StubPendingReceiver.java
│ │ │ │ ├── StubPendingService.java
│ │ │ │ └── VASettings.java
│ │ │ ├── helper
│ │ │ ├── ArtDexOptimizer.java
│ │ │ ├── ParcelHelper.java
│ │ │ ├── PersistenceLayer.java
│ │ │ ├── collection
│ │ │ │ ├── ArrayMap.java
│ │ │ │ ├── ArraySet.java
│ │ │ │ ├── ContainerHelpers.java
│ │ │ │ ├── IntArray.java
│ │ │ │ ├── MapCollections.java
│ │ │ │ ├── SimpleArrayMap.java
│ │ │ │ └── SparseArray.java
│ │ │ ├── compat
│ │ │ │ ├── AccountManagerCompat.java
│ │ │ │ ├── ActivityManagerCompat.java
│ │ │ │ ├── ApplicationThreadCompat.java
│ │ │ │ ├── BuildCompat.java
│ │ │ │ ├── BundleCompat.java
│ │ │ │ ├── ContentProviderCompat.java
│ │ │ │ ├── ContentResolverCompat.java
│ │ │ │ ├── IApplicationThreadCompat.java
│ │ │ │ ├── NativeLibraryHelperCompat.java
│ │ │ │ ├── ObjectsCompat.java
│ │ │ │ ├── PackageParserCompat.java
│ │ │ │ ├── ParceledListSliceCompat.java
│ │ │ │ ├── StorageManagerCompat.java
│ │ │ │ └── SystemPropertiesCompat.java
│ │ │ ├── ipcbus
│ │ │ │ ├── IPCBus.java
│ │ │ │ ├── IPCInvocationBridge.java
│ │ │ │ ├── IPCMethod.java
│ │ │ │ ├── IPCSingleton.java
│ │ │ │ ├── IServerCache.java
│ │ │ │ ├── ServerInterface.java
│ │ │ │ └── TransformBinder.java
│ │ │ └── utils
│ │ │ │ ├── ArrayUtils.java
│ │ │ │ ├── AtomicFile.java
│ │ │ │ ├── BitmapUtils.java
│ │ │ │ ├── ClassUtils.java
│ │ │ │ ├── ComponentUtils.java
│ │ │ │ ├── DrawableUtils.java
│ │ │ │ ├── FastXmlSerializer.java
│ │ │ │ ├── FileUtils.java
│ │ │ │ ├── MD5Utils.java
│ │ │ │ ├── OSUtils.java
│ │ │ │ ├── Reflect.java
│ │ │ │ ├── ReflectException.java
│ │ │ │ ├── SchedulerTask.java
│ │ │ │ ├── Singleton.java
│ │ │ │ ├── VLog.java
│ │ │ │ ├── XmlSerializerAndParser.java
│ │ │ │ └── marks
│ │ │ │ ├── FakeDeviceMark.java
│ │ │ │ └── FakeLocMark.java
│ │ │ ├── os
│ │ │ ├── VBinder.java
│ │ │ ├── VEnvironment.java
│ │ │ ├── VUserHandle.java
│ │ │ ├── VUserInfo.java
│ │ │ └── VUserManager.java
│ │ │ ├── remote
│ │ │ ├── AppTaskInfo.java
│ │ │ ├── BadgerInfo.java
│ │ │ ├── InstallResult.java
│ │ │ ├── InstalledAppInfo.java
│ │ │ ├── PendingIntentData.java
│ │ │ ├── PendingResultData.java
│ │ │ ├── Problem.java
│ │ │ ├── ReceiverInfo.java
│ │ │ ├── StubActivityRecord.java
│ │ │ ├── SyncInfo.java
│ │ │ ├── VDeviceInfo.java
│ │ │ ├── VParceledListSlice.java
│ │ │ └── vloc
│ │ │ │ ├── VCell.java
│ │ │ │ ├── VLocation.java
│ │ │ │ └── VWifi.java
│ │ │ └── server
│ │ │ ├── BinderProvider.java
│ │ │ ├── ServiceCache.java
│ │ │ ├── accounts
│ │ │ ├── RegisteredServicesParser.java
│ │ │ ├── VAccount.java
│ │ │ ├── VAccountManagerService.java
│ │ │ ├── VContentService.java
│ │ │ └── VSyncRecord.java
│ │ │ ├── am
│ │ │ ├── ActivityRecord.java
│ │ │ ├── ActivityStack.java
│ │ │ ├── AppBindRecord.java
│ │ │ ├── AttributeCache.java
│ │ │ ├── BroadcastSystem.java
│ │ │ ├── ConnectionRecord.java
│ │ │ ├── PendingIntents.java
│ │ │ ├── ProcessMap.java
│ │ │ ├── ProcessRecord.java
│ │ │ ├── ServiceRecord.java
│ │ │ ├── TaskRecord.java
│ │ │ ├── UidSystem.java
│ │ │ └── VActivityManagerService.java
│ │ │ ├── device
│ │ │ ├── DeviceInfoPersistenceLayer.java
│ │ │ └── VDeviceManagerService.java
│ │ │ ├── interfaces
│ │ │ ├── IAccountManager.java
│ │ │ ├── IActivityManager.java
│ │ │ ├── IAppManager.java
│ │ │ ├── IDeviceInfoManager.java
│ │ │ ├── IJobService.java
│ │ │ ├── INotificationManager.java
│ │ │ ├── IPackageManager.java
│ │ │ ├── IUserManager.java
│ │ │ ├── IVirtualLocationManager.java
│ │ │ └── IVirtualStorageService.java
│ │ │ ├── job
│ │ │ └── VJobSchedulerService.java
│ │ │ ├── location
│ │ │ └── VirtualLocationService.java
│ │ │ ├── memory
│ │ │ ├── MappedMemoryRegion.java
│ │ │ ├── MemoryRegionParser.java
│ │ │ ├── MemoryScanEngine.java
│ │ │ ├── MemoryValue.java
│ │ │ └── ProcessMemory.java
│ │ │ ├── notification
│ │ │ ├── NotificationCompat.java
│ │ │ ├── NotificationCompatCompatV14.java
│ │ │ ├── NotificationCompatCompatV21.java
│ │ │ ├── NotificationFixer.java
│ │ │ ├── PendIntentCompat.java
│ │ │ ├── ReflectionActionCompat.java
│ │ │ ├── RemoteViewsFixer.java
│ │ │ ├── VNotificationManagerService.java
│ │ │ └── WidthCompat.java
│ │ │ ├── pm
│ │ │ ├── FastImmutableArraySet.java
│ │ │ ├── IntentResolver.java
│ │ │ ├── PackageCacheManager.java
│ │ │ ├── PackagePersistenceLayer.java
│ │ │ ├── PackageSetting.java
│ │ │ ├── PackageUserState.java
│ │ │ ├── PrivilegeAppOptimizer.java
│ │ │ ├── ProviderIntentResolver.java
│ │ │ ├── VAppManagerService.java
│ │ │ ├── VPackageManagerService.java
│ │ │ ├── VUserManagerService.java
│ │ │ ├── installer
│ │ │ │ ├── FileBridge.java
│ │ │ │ ├── PackageHelper.java
│ │ │ │ ├── PackageInstallInfo.java
│ │ │ │ ├── PackageInstallObserver.java
│ │ │ │ ├── PackageInstallerSession.java
│ │ │ │ ├── SessionInfo.java
│ │ │ │ ├── SessionParams.java
│ │ │ │ └── VPackageInstallerService.java
│ │ │ └── parser
│ │ │ │ ├── PackageParserEx.java
│ │ │ │ └── VPackage.java
│ │ │ ├── secondary
│ │ │ ├── BinderDelegateService.java
│ │ │ └── FakeIdentityBinder.java
│ │ │ └── vs
│ │ │ ├── VSConfig.java
│ │ │ ├── VSPersistenceLayer.java
│ │ │ └── VirtualStorageService.java
│ └── mirror
│ │ ├── MethodParams.java
│ │ ├── MethodReflectParams.java
│ │ ├── RefBoolean.java
│ │ ├── RefClass.java
│ │ ├── RefConstructor.java
│ │ ├── RefDouble.java
│ │ ├── RefFloat.java
│ │ ├── RefInt.java
│ │ ├── RefLong.java
│ │ ├── RefMethod.java
│ │ ├── RefObject.java
│ │ ├── RefStaticInt.java
│ │ ├── RefStaticMethod.java
│ │ ├── RefStaticObject.java
│ │ ├── android
│ │ ├── accounts
│ │ │ └── IAccountManager.java
│ │ ├── app
│ │ │ ├── Activity.java
│ │ │ ├── ActivityManagerNative.java
│ │ │ ├── ActivityManagerOreo.java
│ │ │ ├── ActivityThread.java
│ │ │ ├── ActivityThreadNMR1.java
│ │ │ ├── ApplicationThreadNative.java
│ │ │ ├── ContextImpl.java
│ │ │ ├── ContextImplICS.java
│ │ │ ├── ContextImplKitkat.java
│ │ │ ├── IActivityManager.java
│ │ │ ├── IActivityManagerICS.java
│ │ │ ├── IActivityManagerL.java
│ │ │ ├── IActivityManagerN.java
│ │ │ ├── IAlarmManager.java
│ │ │ ├── IApplicationThread.java
│ │ │ ├── IApplicationThreadICSMR1.java
│ │ │ ├── IApplicationThreadJBMR1.java
│ │ │ ├── IApplicationThreadKitkat.java
│ │ │ ├── IApplicationThreadOreo.java
│ │ │ ├── ISearchManager.java
│ │ │ ├── IServiceConnectionO.java
│ │ │ ├── IUsageStatsManager.java
│ │ │ ├── LoadedApk.java
│ │ │ ├── LoadedApkHuaWei.java
│ │ │ ├── LoadedApkICS.java
│ │ │ ├── LoadedApkKitkat.java
│ │ │ ├── Notification.java
│ │ │ ├── NotificationL.java
│ │ │ ├── NotificationM.java
│ │ │ ├── NotificationManager.java
│ │ │ ├── PendingIntentJBMR2.java
│ │ │ ├── ServiceStartArgs.java
│ │ │ ├── admin
│ │ │ │ └── IDevicePolicyManager.java
│ │ │ ├── backup
│ │ │ │ └── IBackupManager.java
│ │ │ └── job
│ │ │ │ ├── IJobScheduler.java
│ │ │ │ ├── JobInfo.java
│ │ │ │ └── JobParameters.java
│ │ ├── bluetooth
│ │ │ └── IBluetooth.java
│ │ ├── content
│ │ │ ├── BroadcastReceiver.java
│ │ │ ├── ClipboardManager.java
│ │ │ ├── ClipboardManagerOreo.java
│ │ │ ├── ContentProviderClient.java
│ │ │ ├── ContentProviderHolderOreo.java
│ │ │ ├── ContentProviderNative.java
│ │ │ ├── ContentResolver.java
│ │ │ ├── ContentResolverJBMR2.java
│ │ │ ├── IClipboard.java
│ │ │ ├── IContentProvider.java
│ │ │ ├── IContentService.java
│ │ │ ├── IIntentReceiver.java
│ │ │ ├── IIntentReceiverJB.java
│ │ │ ├── IRestrictionsManager.java
│ │ │ ├── IntentFilter.java
│ │ │ ├── SyncAdapterType.java
│ │ │ ├── SyncAdapterTypeN.java
│ │ │ ├── SyncInfo.java
│ │ │ ├── SyncRequest.java
│ │ │ ├── pm
│ │ │ │ ├── ApplicationInfoL.java
│ │ │ │ ├── ApplicationInfoN.java
│ │ │ │ ├── ILauncherApps.java
│ │ │ │ ├── IShortcutService.java
│ │ │ │ ├── LauncherApps.java
│ │ │ │ ├── PackageInstaller.java
│ │ │ │ ├── PackageParser.java
│ │ │ │ ├── PackageParserJellyBean.java
│ │ │ │ ├── PackageParserJellyBean17.java
│ │ │ │ ├── PackageParserLollipop.java
│ │ │ │ ├── PackageParserLollipop22.java
│ │ │ │ ├── PackageParserMarshmallow.java
│ │ │ │ ├── PackageParserNougat.java
│ │ │ │ ├── PackageUserState.java
│ │ │ │ ├── ParceledListSlice.java
│ │ │ │ ├── ParceledListSliceJBMR2.java
│ │ │ │ └── UserInfo.java
│ │ │ └── res
│ │ │ │ ├── AssetManager.java
│ │ │ │ └── CompatibilityInfo.java
│ │ ├── ddm
│ │ │ ├── DdmHandleAppName.java
│ │ │ └── DdmHandleAppNameJBMR1.java
│ │ ├── graphics
│ │ │ └── drawable
│ │ │ │ └── Icon.java
│ │ ├── hardware
│ │ │ ├── display
│ │ │ │ ├── DisplayManagerGlobal.java
│ │ │ │ └── IDisplayManager.java
│ │ │ ├── fingerprint
│ │ │ │ └── IFingerprintService.java
│ │ │ └── location
│ │ │ │ └── IContextHubService.java
│ │ ├── location
│ │ │ ├── ILocationListener.java
│ │ │ ├── ILocationManager.java
│ │ │ ├── LocationManager.java
│ │ │ └── LocationRequestL.java
│ │ ├── media
│ │ │ ├── AudioManager.java
│ │ │ ├── IAudioService.java
│ │ │ ├── IMediaRouterService.java
│ │ │ ├── MediaRouter.java
│ │ │ └── session
│ │ │ │ └── ISessionManager.java
│ │ ├── net
│ │ │ ├── IConnectivityManager.java
│ │ │ ├── NetworkInfo.java
│ │ │ └── wifi
│ │ │ │ ├── IWifiManager.java
│ │ │ │ ├── WifiInfo.java
│ │ │ │ ├── WifiScanner.java
│ │ │ │ └── WifiSsid.java
│ │ ├── os
│ │ │ ├── BaseBundle.java
│ │ │ ├── Build.java
│ │ │ ├── Bundle.java
│ │ │ ├── BundleICS.java
│ │ │ ├── Handler.java
│ │ │ ├── INetworkManagementService.java
│ │ │ ├── IPowerManager.java
│ │ │ ├── IUserManager.java
│ │ │ ├── Message.java
│ │ │ ├── Process.java
│ │ │ ├── ServiceManager.java
│ │ │ ├── StrictMode.java
│ │ │ ├── mount
│ │ │ │ └── IMountService.java
│ │ │ └── storage
│ │ │ │ └── IStorageManager.java
│ │ ├── providers
│ │ │ └── Settings.java
│ │ ├── renderscript
│ │ │ └── RenderScriptCacheDir.java
│ │ ├── rms
│ │ │ └── resource
│ │ │ │ ├── ReceiverResourceLP.java
│ │ │ │ ├── ReceiverResourceM.java
│ │ │ │ └── ReceiverResourceN.java
│ │ ├── service
│ │ │ └── persistentdata
│ │ │ │ └── IPersistentDataBlockService.java
│ │ ├── telephony
│ │ │ ├── CellIdentityCdma.java
│ │ │ ├── CellIdentityGsm.java
│ │ │ ├── CellInfoCdma.java
│ │ │ ├── CellInfoGsm.java
│ │ │ ├── CellSignalStrengthCdma.java
│ │ │ ├── CellSignalStrengthGsm.java
│ │ │ └── NeighboringCellInfo.java
│ │ ├── util
│ │ │ └── Singleton.java
│ │ ├── view
│ │ │ ├── CompatibilityInfoHolder.java
│ │ │ ├── Display.java
│ │ │ ├── DisplayAdjustments.java
│ │ │ ├── HardwareRenderer.java
│ │ │ ├── IAutoFillManager.java
│ │ │ ├── IGraphicsStats.java
│ │ │ ├── IWindowManager.java
│ │ │ ├── RenderScript.java
│ │ │ ├── SurfaceControl.java
│ │ │ ├── ThreadedRenderer.java
│ │ │ └── WindowManagerGlobal.java
│ │ ├── webkit
│ │ │ ├── IWebViewUpdateService.java
│ │ │ └── WebViewFactory.java
│ │ └── widget
│ │ │ ├── RemoteViews.java
│ │ │ └── Toast.java
│ │ ├── com
│ │ └── android
│ │ │ └── internal
│ │ │ ├── R_Hide.java
│ │ │ ├── app
│ │ │ └── IAppOpsService.java
│ │ │ ├── appwidget
│ │ │ └── IAppWidgetService.java
│ │ │ ├── content
│ │ │ ├── NativeLibraryHelper.java
│ │ │ └── ReferrerIntent.java
│ │ │ ├── os
│ │ │ ├── IDropBoxManagerService.java
│ │ │ ├── IVibratorService.java
│ │ │ └── UserManager.java
│ │ │ ├── policy
│ │ │ └── PhoneWindow.java
│ │ │ ├── telephony
│ │ │ ├── IMms.java
│ │ │ ├── IPhoneSubInfo.java
│ │ │ ├── ISms.java
│ │ │ ├── ISub.java
│ │ │ ├── ITelephony.java
│ │ │ ├── ITelephonyRegistry.java
│ │ │ └── PhoneConstantsMtk.java
│ │ │ └── view
│ │ │ ├── IInputMethodManager.java
│ │ │ └── inputmethod
│ │ │ └── InputMethodManager.java
│ │ ├── dalvik
│ │ └── system
│ │ │ └── VMRuntime.java
│ │ ├── java
│ │ └── lang
│ │ │ ├── ThreadGroup.java
│ │ │ └── ThreadGroupN.java
│ │ └── libcore
│ │ └── io
│ │ ├── ForwardingOs.java
│ │ ├── Libcore.java
│ │ └── Os.java
│ ├── jni
│ ├── Android.mk
│ ├── Application.mk
│ ├── Foundation
│ │ ├── IOUniformer.cpp
│ │ ├── IOUniformer.h
│ │ ├── Path.cpp
│ │ ├── Path.h
│ │ ├── SandboxFs.cpp
│ │ ├── SandboxFs.h
│ │ ├── SymbolFinder.cpp
│ │ ├── SymbolFinder.h
│ │ ├── VMPatch.cpp
│ │ └── VMPatch.h
│ ├── HookZz
│ │ ├── .gitignore
│ │ ├── .gitmodules
│ │ ├── Android.mk
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── docs
│ │ │ ├── HookFrameworkDesign.md
│ │ │ ├── hookzz-docs.md
│ │ │ ├── hookzz-example.md
│ │ │ └── hookzz-getting-started.md
│ │ ├── include
│ │ │ └── hookzz.h
│ │ ├── src
│ │ │ ├── allocator.c
│ │ │ ├── allocator.h
│ │ │ ├── interceptor.c
│ │ │ ├── interceptor.h
│ │ │ ├── memory.c
│ │ │ ├── memory.h
│ │ │ ├── platforms
│ │ │ │ ├── arch-arm
│ │ │ │ │ ├── instructions.c
│ │ │ │ │ ├── instructions.h
│ │ │ │ │ ├── reader-arm.c
│ │ │ │ │ ├── reader-arm.h
│ │ │ │ │ ├── reader-thumb.c
│ │ │ │ │ ├── reader-thumb.h
│ │ │ │ │ ├── regs-arm.c
│ │ │ │ │ ├── regs-arm.h
│ │ │ │ │ ├── relocator-arm.c
│ │ │ │ │ ├── relocator-arm.h
│ │ │ │ │ ├── relocator-thumb.c
│ │ │ │ │ ├── relocator-thumb.h
│ │ │ │ │ ├── writer-arm.c
│ │ │ │ │ ├── writer-arm.h
│ │ │ │ │ ├── writer-thumb.c
│ │ │ │ │ └── writer-thumb.h
│ │ │ │ ├── arch-arm64
│ │ │ │ │ ├── instructions.c
│ │ │ │ │ ├── instructions.h
│ │ │ │ │ ├── reader-arm64.c
│ │ │ │ │ ├── reader-arm64.h
│ │ │ │ │ ├── regs-arm64.c
│ │ │ │ │ ├── regs-arm64.h
│ │ │ │ │ ├── relocator-arm64.c
│ │ │ │ │ ├── relocator-arm64.h
│ │ │ │ │ ├── writer-arm64.c
│ │ │ │ │ └── writer-arm64.h
│ │ │ │ ├── arch-x86
│ │ │ │ │ ├── instructions.c
│ │ │ │ │ ├── instructions.h
│ │ │ │ │ ├── reader-x86.c
│ │ │ │ │ ├── reader-x86.h
│ │ │ │ │ ├── regs-x86.c
│ │ │ │ │ ├── regs-x86.h
│ │ │ │ │ ├── relocator-x86.c
│ │ │ │ │ ├── relocator-x86.h
│ │ │ │ │ ├── writer-x86.c
│ │ │ │ │ └── writer-x86.h
│ │ │ │ ├── backend-arm
│ │ │ │ │ ├── interceptor-arm.c
│ │ │ │ │ ├── interceptor-arm.h
│ │ │ │ │ ├── interceptor-template-arm.s
│ │ │ │ │ ├── thunker-arm.c
│ │ │ │ │ └── thunker-arm.h
│ │ │ │ ├── backend-arm64
│ │ │ │ │ ├── interceptor-arm64.c
│ │ │ │ │ ├── interceptor-arm64.h
│ │ │ │ │ ├── interceptor-template-arm64.s
│ │ │ │ │ ├── thunker-arm64.c
│ │ │ │ │ └── thunker-arm64.h
│ │ │ │ ├── backend-darwin
│ │ │ │ │ ├── memory-darwin.c
│ │ │ │ │ └── memory-darwin.h
│ │ │ │ ├── backend-linux
│ │ │ │ │ ├── memory-linux.c
│ │ │ │ │ └── memory-linux.h
│ │ │ │ ├── backend-posix
│ │ │ │ │ ├── thread-posix.c
│ │ │ │ │ └── thread-posix.h
│ │ │ │ ├── backend-x86
│ │ │ │ │ ├── interceptor-template-x86.s
│ │ │ │ │ ├── interceptor-x86.c
│ │ │ │ │ ├── interceptor-x86.h
│ │ │ │ │ ├── thunker-x86.c
│ │ │ │ │ └── thunker-x86.h
│ │ │ │ └── x86
│ │ │ │ │ ├── instructions.h
│ │ │ │ │ ├── reader.c
│ │ │ │ │ ├── reader.h
│ │ │ │ │ ├── writer.c
│ │ │ │ │ └── writer.h
│ │ │ ├── relocator.h
│ │ │ ├── stack.c
│ │ │ ├── stack.h
│ │ │ ├── thread.h
│ │ │ ├── thunker.h
│ │ │ ├── trampoline.c
│ │ │ ├── trampoline.h
│ │ │ ├── writer.h
│ │ │ ├── zzdefs.h
│ │ │ ├── zzdeps
│ │ │ │ ├── .gitignore
│ │ │ │ ├── README.md
│ │ │ │ ├── common
│ │ │ │ │ ├── LEB128.h
│ │ │ │ │ ├── debugbreak.h
│ │ │ │ │ ├── memory-utils-common.c
│ │ │ │ │ └── memory-utils-common.h
│ │ │ │ ├── darwin
│ │ │ │ │ ├── mach_vm.h
│ │ │ │ │ ├── macho-utils-darwin.c
│ │ │ │ │ ├── macho-utils-darwin.h
│ │ │ │ │ ├── memory-utils-darwin.c
│ │ │ │ │ └── memory-utils-darwin.h
│ │ │ │ ├── linux
│ │ │ │ │ ├── memory-utils-linux.c
│ │ │ │ │ └── memory-utils-linux.h
│ │ │ │ ├── memory-utils.h
│ │ │ │ ├── posix
│ │ │ │ │ ├── memory-utils-posix.c
│ │ │ │ │ ├── memory-utils-posix.h
│ │ │ │ │ ├── thread-utils-posix.c
│ │ │ │ │ └── thread-utils-posix.h
│ │ │ │ └── zz.h
│ │ │ ├── zzinfo.c
│ │ │ └── zzinfo.h
│ │ ├── tests
│ │ │ ├── arm-android
│ │ │ │ ├── makefile
│ │ │ │ ├── test_hook_address_thumb.c
│ │ │ │ ├── test_hook_open_arm.c
│ │ │ │ └── test_hook_printf.c
│ │ │ ├── arm-insn-fix
│ │ │ │ ├── makefile
│ │ │ │ └── test_insn_fix.c
│ │ │ ├── arm-ios
│ │ │ │ ├── makefile
│ │ │ │ ├── test_hook_address_thumb.c
│ │ │ │ ├── test_hook_freeaddr.c
│ │ │ │ ├── test_hook_oc_thumb.m
│ │ │ │ ├── test_hook_open_arm.c
│ │ │ │ └── test_hook_printf.c
│ │ │ ├── arm64-insn-fix
│ │ │ │ ├── makefile
│ │ │ │ └── test_insn_fix.c
│ │ │ └── arm64-ios
│ │ │ │ ├── makefile
│ │ │ │ ├── test_hook_address.c
│ │ │ │ ├── test_hook_oc.m
│ │ │ │ └── test_hook_printf.c
│ │ └── tools
│ │ │ └── ZzSolidifyHook
│ │ │ ├── solidifyhook
│ │ │ ├── solidifyhook.cpp
│ │ │ └── solidifytrampoline.c
│ ├── Jni
│ │ ├── Helper.h
│ │ ├── VAJni.cpp
│ │ └── VAJni.h
│ ├── Substrate
│ │ ├── Buffer.hpp
│ │ ├── CydiaSubstrate.h
│ │ ├── SubstrateARM.hpp
│ │ ├── SubstrateDebug.cpp
│ │ ├── SubstrateDebug.hpp
│ │ ├── SubstrateHook.cpp
│ │ ├── SubstrateHook.h
│ │ ├── SubstrateLog.hpp
│ │ ├── SubstratePosixMemory.cpp
│ │ ├── SubstrateX86.hpp
│ │ ├── hde64.c
│ │ ├── hde64.h
│ │ └── table64.h
│ └── fb
│ │ ├── Android.mk
│ │ ├── BUCK
│ │ ├── Doxyfile
│ │ ├── assert.cpp
│ │ ├── include
│ │ ├── fb
│ │ │ ├── ALog.h
│ │ │ ├── Build.h
│ │ │ ├── Countable.h
│ │ │ ├── Doxyfile
│ │ │ ├── Environment.h
│ │ │ ├── ProgramLocation.h
│ │ │ ├── RefPtr.h
│ │ │ ├── StaticInitialized.h
│ │ │ ├── ThreadLocal.h
│ │ │ ├── assert.h
│ │ │ ├── fbjni.h
│ │ │ ├── fbjni
│ │ │ │ ├── Boxed.h
│ │ │ │ ├── ByteBuffer.h
│ │ │ │ ├── Common.h
│ │ │ │ ├── Context.h
│ │ │ │ ├── CoreClasses-inl.h
│ │ │ │ ├── CoreClasses.h
│ │ │ │ ├── Exceptions.h
│ │ │ │ ├── File.h
│ │ │ │ ├── Hybrid.h
│ │ │ │ ├── Iterator-inl.h
│ │ │ │ ├── Iterator.h
│ │ │ │ ├── JThread.h
│ │ │ │ ├── JWeakReference.h
│ │ │ │ ├── Meta-forward.h
│ │ │ │ ├── Meta-inl.h
│ │ │ │ ├── Meta.h
│ │ │ │ ├── MetaConvert.h
│ │ │ │ ├── NativeRunnable.h
│ │ │ │ ├── ReferenceAllocators-inl.h
│ │ │ │ ├── ReferenceAllocators.h
│ │ │ │ ├── References-forward.h
│ │ │ │ ├── References-inl.h
│ │ │ │ ├── References.h
│ │ │ │ ├── Registration-inl.h
│ │ │ │ ├── Registration.h
│ │ │ │ └── TypeTraits.h
│ │ │ ├── log.h
│ │ │ ├── lyra.h
│ │ │ ├── noncopyable.h
│ │ │ ├── nonmovable.h
│ │ │ └── visibility.h
│ │ └── jni
│ │ │ ├── Countable.h
│ │ │ ├── GlobalReference.h
│ │ │ ├── JniTerminateHandler.h
│ │ │ ├── LocalReference.h
│ │ │ ├── LocalString.h
│ │ │ ├── Registration.h
│ │ │ ├── WeakReference.h
│ │ │ └── jni_helpers.h
│ │ ├── jni
│ │ ├── ByteBuffer.cpp
│ │ ├── Countable.cpp
│ │ ├── Environment.cpp
│ │ ├── Exceptions.cpp
│ │ ├── Hybrid.cpp
│ │ ├── LocalString.cpp
│ │ ├── OnLoad.cpp
│ │ ├── References.cpp
│ │ ├── WeakReference.cpp
│ │ ├── android
│ │ │ ├── CpuCapabilities.cpp
│ │ │ └── ReferenceChecking.cpp
│ │ ├── fbjni.cpp
│ │ ├── java
│ │ │ ├── BUCK
│ │ │ ├── CppException.java
│ │ │ ├── CppSystemErrorException.java
│ │ │ └── UnknownCppException.java
│ │ └── jni_helpers.cpp
│ │ ├── log.cpp
│ │ ├── lyra
│ │ └── lyra.cpp
│ │ └── onload.cpp
│ └── res
│ ├── layout
│ ├── app_not_authorized.xml
│ ├── choose_account_row.xml
│ ├── choose_account_type.xml
│ ├── choose_type_and_account.xml
│ ├── custom_notification.xml
│ ├── custom_notification_lite.xml
│ └── resolve_list_item.xml
│ └── values
│ ├── dimens.xml
│ ├── integer.xml
│ ├── strings.xml
│ └── styles.xml
├── release.apk
└── settings.gradle
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/workspace.xml
5 | /.idea/libraries
6 | .idea
7 | .DS_Store
8 | /build
9 | /captures
10 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # VirtualApp-x326
2 |
本项目基于AsLody的VirtualApp-v326
3 |
具体请点击 [VirtualApp](https://github.com/asLody/VirtualApp) for AsLody
4 |
https://github.com/asLody/VirtualApp
5 |
6 |
7 | ## 修改内容
8 |
9 | 1. 虚拟定位界面提示
10 | 2. 默认中文简体语言
11 | 3. 其他内容优化
12 |
13 |
14 | 本项目已编译,[点击下载Apk](https://github.com/bzsome/VirtualApp-x326/raw/master/release.apk)
15 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/libs/TencentLocationSDK_v6.1.2_r1df4baaa_170627_1056.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/libs/TencentLocationSDK_v6.1.2_r1df4baaa_170627_1056.jar
--------------------------------------------------------------------------------
/app/libs/TencentMapSDK_Raster_v_1.2.8_e45bcd0.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/libs/TencentMapSDK_Raster_v_1.2.8_e45bcd0.jar
--------------------------------------------------------------------------------
/app/libs/TencentMapSearch_v1.1.7.3207904.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/libs/TencentMapSearch_v1.1.7.3207904.jar
--------------------------------------------------------------------------------
/app/libs/armeabi-v7a/libtencentloc.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/libs/armeabi-v7a/libtencentloc.so
--------------------------------------------------------------------------------
/app/libs/armeabi/libtencentloc.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/libs/armeabi/libtencentloc.so
--------------------------------------------------------------------------------
/app/libs/x86/libtencentloc.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/libs/x86/libtencentloc.so
--------------------------------------------------------------------------------
/app/src/main/assets/OaceOaT8w5Xda6wa:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/assets/OaceOaT8w5Xda6wa
--------------------------------------------------------------------------------
/app/src/main/java/androidTool/LogUtils.java:
--------------------------------------------------------------------------------
1 | package androidTool;
2 |
3 | /**
4 | * Created by chao on 2018/2/3.
5 | */
6 |
7 | public class LogUtils {
8 | static void d(String str, String str2) {
9 | System.out.println(str + ":" + str2);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/app/src/main/java/io/virtualapp/VCommends.java:
--------------------------------------------------------------------------------
1 | package io.virtualapp;
2 |
3 | /**
4 | * @author Lody
5 | */
6 | public class VCommends {
7 |
8 | public static final String TAG_NEW_VERSION = "First launch new Version";
9 | public static final String TAG_SHOW_ADD_APP_GUIDE = "Should show add app guide";
10 |
11 | public static final int REQUEST_SELECT_APP = 5;
12 |
13 | public static final String EXTRA_APP_INFO_LIST = "va.extra.APP_INFO_LIST";
14 |
15 | public static final String TAG_ASK_INSTALL_GMS = "va.extra.ASK_INSTALL_GMS";
16 | }
17 |
--------------------------------------------------------------------------------
/app/src/main/java/io/virtualapp/abs/BasePresenter.java:
--------------------------------------------------------------------------------
1 | package io.virtualapp.abs;
2 |
3 | /**
4 | * @author Lody
5 | */
6 | public interface BasePresenter {
7 | void start();
8 | }
9 |
--------------------------------------------------------------------------------
/app/src/main/java/io/virtualapp/abs/BaseView.java:
--------------------------------------------------------------------------------
1 | package io.virtualapp.abs;
2 |
3 | import android.app.Activity;
4 | import android.content.Context;
5 |
6 | /**
7 | * @author Lody
8 | */
9 | public interface BaseView {
10 | Activity getActivity();
11 | Context getContext();
12 | void setPresenter(T presenter);
13 | }
14 |
--------------------------------------------------------------------------------
/app/src/main/java/io/virtualapp/abs/Callback.java:
--------------------------------------------------------------------------------
1 | package io.virtualapp.abs;
2 |
3 | /**
4 | * @author Lody
5 | */
6 |
7 | public interface Callback {
8 | void callback(T result);
9 | }
10 |
--------------------------------------------------------------------------------
/app/src/main/java/io/virtualapp/abs/Value.java:
--------------------------------------------------------------------------------
1 | package io.virtualapp.abs;
2 |
3 | /**
4 | * @author Lody
5 | */
6 |
7 | public class Value {
8 | public T val;
9 | }
10 |
--------------------------------------------------------------------------------
/app/src/main/java/io/virtualapp/abs/reflect/ReflectException.java:
--------------------------------------------------------------------------------
1 | package io.virtualapp.abs.reflect;
2 |
3 | /**
4 | * @author Lody
5 | */
6 | public class ReflectException extends RuntimeException {
7 |
8 | private static final long serialVersionUID = 663038727503637969L;
9 |
10 | public ReflectException(Throwable cause) {
11 | super(cause);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/app/src/main/java/io/virtualapp/abs/ui/VFragment.java:
--------------------------------------------------------------------------------
1 | package io.virtualapp.abs.ui;
2 |
3 | import org.jdeferred.android.AndroidDeferredManager;
4 |
5 | import android.app.Activity;
6 | import android.support.v4.app.Fragment;
7 |
8 | import io.virtualapp.abs.BasePresenter;
9 |
10 | /**
11 | * @author Lody
12 | */
13 | public class VFragment extends Fragment {
14 |
15 | protected T mPresenter;
16 |
17 | public T getPresenter() {
18 | return mPresenter;
19 | }
20 |
21 | public void setPresenter(T presenter) {
22 | this.mPresenter = presenter;
23 | }
24 |
25 | protected AndroidDeferredManager defer() {
26 | return VUiKit.defer();
27 | }
28 |
29 | public void finishActivity() {
30 | Activity activity = getActivity();
31 | if (activity != null) {
32 | activity.finish();
33 | }
34 | }
35 |
36 | public void destroy() {
37 | finishActivity();
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/app/src/main/java/io/virtualapp/delegate/MyPhoneInfoDelegate.java:
--------------------------------------------------------------------------------
1 | package io.virtualapp.delegate;
2 |
3 | import com.lody.virtual.client.hook.delegate.PhoneInfoDelegate;
4 |
5 |
6 | /**
7 | * Fake the Device ID.
8 | */
9 | public class MyPhoneInfoDelegate implements PhoneInfoDelegate {
10 |
11 | @Override
12 | public String getDeviceId(String oldDeviceId, int userId) {
13 | return oldDeviceId;
14 | }
15 |
16 | @Override
17 | public String getBluetoothAddress(String oldAddress, int userId) {
18 | return oldAddress;
19 | }
20 |
21 | @Override
22 | public String getMacAddress(String oldAddress, int userId) {
23 | return oldAddress;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/app/src/main/java/io/virtualapp/home/ListAppContract.java:
--------------------------------------------------------------------------------
1 | package io.virtualapp.home;
2 |
3 | import java.util.List;
4 |
5 | import io.virtualapp.abs.BasePresenter;
6 | import io.virtualapp.abs.BaseView;
7 | import io.virtualapp.home.models.AppInfo;
8 |
9 | /**
10 | * @author Lody
11 | * @version 1.0
12 | */
13 | /*package*/ class ListAppContract {
14 | interface ListAppView extends BaseView {
15 |
16 | void startLoading();
17 |
18 | void loadFinish(List infoList);
19 | }
20 |
21 | interface ListAppPresenter extends BasePresenter {
22 |
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/app/src/main/java/io/virtualapp/home/models/AppData.java:
--------------------------------------------------------------------------------
1 | package io.virtualapp.home.models;
2 |
3 | import android.graphics.drawable.Drawable;
4 |
5 | /**
6 | * @author Lody
7 | */
8 |
9 | public interface AppData {
10 |
11 | boolean isLoading();
12 |
13 | boolean isFirstOpen();
14 |
15 | Drawable getIcon();
16 |
17 | String getName();
18 |
19 | boolean canReorder();
20 |
21 | boolean canLaunch();
22 |
23 | boolean canDelete();
24 |
25 | boolean canCreateShortcut();
26 | }
27 |
--------------------------------------------------------------------------------
/app/src/main/java/io/virtualapp/home/models/AppInfo.java:
--------------------------------------------------------------------------------
1 | package io.virtualapp.home.models;
2 |
3 | import android.graphics.drawable.Drawable;
4 |
5 | /**
6 | * @author Lody
7 | */
8 |
9 | public class AppInfo {
10 | public String packageName;
11 | public String path;
12 | public boolean fastOpen;
13 | public Drawable icon;
14 | public CharSequence name;
15 | public int cloneCount;
16 | }
17 |
--------------------------------------------------------------------------------
/app/src/main/java/io/virtualapp/home/platform/PlatformInfo.java:
--------------------------------------------------------------------------------
1 | package io.virtualapp.home.platform;
2 |
3 | import android.content.pm.PackageInfo;
4 |
5 | import java.util.Collections;
6 | import java.util.HashSet;
7 | import java.util.Set;
8 |
9 | /**
10 | * @author Lody
11 | */
12 | public abstract class PlatformInfo {
13 |
14 | private final Set platformPkgs = new HashSet<>();
15 |
16 | public PlatformInfo(String... pkgs) {
17 | Collections.addAll(platformPkgs, pkgs);
18 | }
19 |
20 | public abstract boolean relyOnPlatform(PackageInfo info);
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/app/src/main/java/io/virtualapp/home/platform/WechatPlatformInfo.java:
--------------------------------------------------------------------------------
1 | package io.virtualapp.home.platform;
2 |
3 | import android.content.pm.ActivityInfo;
4 | import android.content.pm.PackageInfo;
5 |
6 | /**
7 | * @author Lody
8 | */
9 |
10 | public class WechatPlatformInfo extends PlatformInfo {
11 |
12 | public WechatPlatformInfo() {
13 | super("com.tencent.mm");
14 | }
15 |
16 | @Override
17 | public boolean relyOnPlatform(PackageInfo info) {
18 | if (info.activities == null) {
19 | return false;
20 | }
21 | for (ActivityInfo activityInfo : info.activities) {
22 | if (activityInfo.name.endsWith("WXEntryActivity")) {
23 | return true;
24 | }
25 | }
26 | return false;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/app/src/main/java/io/virtualapp/vs/VSManagerActivity.java:
--------------------------------------------------------------------------------
1 | package io.virtualapp.vs;
2 |
3 | import io.virtualapp.abs.ui.VActivity;
4 |
5 | /**
6 | * @author Lody
7 | *
8 | *
9 | *
10 | */
11 | public class VSManagerActivity extends VActivity {
12 | }
13 |
--------------------------------------------------------------------------------
/app/src/main/java/io/virtualapp/widgets/ShimmerViewBase.java:
--------------------------------------------------------------------------------
1 | package io.virtualapp.widgets;
2 |
3 | public interface ShimmerViewBase {
4 |
5 | float getGradientX();
6 |
7 | void setGradientX(float gradientX);
8 |
9 | boolean isShimmering();
10 |
11 | void setShimmering(boolean isShimmering);
12 |
13 | boolean isSetUp();
14 |
15 | void setAnimationSetupCallback(ShimmerViewHelper.AnimationSetupCallback callback);
16 |
17 | int getPrimaryColor();
18 |
19 | void setPrimaryColor(int primaryColor);
20 |
21 | int getReflectionColor();
22 |
23 | void setReflectionColor(int reflectionColor);
24 | }
--------------------------------------------------------------------------------
/app/src/main/java/io/virtualapp/widgets/ViewHelper.java:
--------------------------------------------------------------------------------
1 | package io.virtualapp.widgets;
2 |
3 | import io.virtualapp.VApp;
4 |
5 | /**
6 | * @author Lody
7 | */
8 | public class ViewHelper {
9 |
10 | public static int dip2px(float dpValue) {
11 | final float scale = VApp.getApp().getResources().getDisplayMetrics().density;
12 | return (int) (dpValue * scale + 0.5f);
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_add.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/drawable-hdpi/ic_add.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_add_circle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/drawable-hdpi/ic_add_circle.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_check.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/drawable-hdpi/ic_check.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_crash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/drawable-hdpi/ic_crash.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/drawable-hdpi/ic_menu.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_no_check.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/drawable-hdpi/ic_no_check.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_shortcut.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/drawable-hdpi/ic_shortcut.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_about.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/drawable-xxhdpi/ic_about.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_account.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/drawable-xxhdpi/ic_account.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_device.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/drawable-xxhdpi/ic_device.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/drawable-xxhdpi/ic_notification.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/drawable-xxhdpi/ic_settings.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_vs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/drawable-xxhdpi/ic_vs.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_wifi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/drawable-xxhdpi/ic_wifi.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/blue_circle.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/home_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/icon_bg.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/sel_clone_app_btn.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/sel_guide_btn.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
7 |
10 |
16 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/shape_clone_app_btn.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/shape_clone_app_btn_pressed.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_install.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
11 |
12 |
13 |
14 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_location_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
15 |
16 |
20 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_users.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/content_toolbar.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
16 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_user.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/marktet_map.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/user_menu.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 |
6 |
7 | 60dp
8 | 5dp
9 | 30dp
10 | 8dp
11 | 10dp
12 | 80dp
13 | 5dp
14 | 16dp
15 | 24dp
16 |
17 |
18 | 0.5dp
19 | 60dp
20 |
21 | 56dp
22 | 40dp
23 |
24 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/values/fitTextView.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/ids.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values/integers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -2
4 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bzsome/VirtualApp-x326/6f2b8c979d56ab86d17f584acf7c9fe23b59af32/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sun Nov 19 13:36:42 CST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
7 |
--------------------------------------------------------------------------------
/lib/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 | .externalNativeBuild/
3 | obj/
4 |
--------------------------------------------------------------------------------
/lib/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Users/lody/Desktop/Android/sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/lib/src/main/aidl/android/accounts/IAccountManagerResponse.aidl:
--------------------------------------------------------------------------------
1 | package android.accounts;
2 |
3 | import android.os.Bundle;
4 |
5 | /**
6 | * The interface used to return responses for asynchronous calls to the {@link IAccountManager}
7 | */
8 | interface IAccountManagerResponse {
9 | void onResult(in Bundle value);
10 | void onError(int errorCode, String errorMessage);
11 | }
12 |
--------------------------------------------------------------------------------
/lib/src/main/aidl/android/app/IActivityManager/ContentProviderHolder.aidl:
--------------------------------------------------------------------------------
1 | // ContentProviderHolder.aidl
2 | package android.app.IActivityManager;
3 |
4 | parcelable ContentProviderHolder;
--------------------------------------------------------------------------------
/lib/src/main/aidl/android/app/job/IJobService.aidl:
--------------------------------------------------------------------------------
1 | package android.app.job;
2 |
3 | import android.app.job.JobParameters;
4 |
5 | /**
6 | * Interface that the framework uses to communicate with application code that implements a
7 | * JobService. End user code does not implement this interface directly; instead, the app's
8 | * service implementation will extend android.app.job.JobService.
9 | */
10 | interface IJobService {
11 | /** Begin execution of application's job. */
12 | void startJob(in JobParameters jobParams);
13 | /** Stop execution of application's job. */
14 | void stopJob(in JobParameters jobParams);
15 | }
16 |
--------------------------------------------------------------------------------
/lib/src/main/aidl/android/content/ISyncStatusObserver.aidl:
--------------------------------------------------------------------------------
1 | package android.content;
2 |
3 |
4 | interface ISyncStatusObserver {
5 | void onStatusChanged(int which);
6 | }
7 |
--------------------------------------------------------------------------------
/lib/src/main/aidl/android/content/pm/IPackageDataObserver.aidl:
--------------------------------------------------------------------------------
1 | package android.content.pm;
2 |
3 | /**
4 | * API for package data change related callbacks from the Package Manager.
5 | * Some usage scenarios include deletion of cache directory, generate
6 | * statistics related to code, data, cache usage(TODO)
7 | */
8 | interface IPackageDataObserver {
9 | void onRemoveCompleted(in String packageName, boolean succeeded);
10 | }
11 |
--------------------------------------------------------------------------------
/lib/src/main/aidl/android/content/pm/IPackageInstallObserver.aidl:
--------------------------------------------------------------------------------
1 | package android.content.pm;
2 |
3 | /**
4 | * API for installation callbacks from the Package Manager.
5 | */
6 | interface IPackageInstallObserver {
7 | void packageInstalled(in String packageName, int returnCode);
8 | }
9 |
10 |
--------------------------------------------------------------------------------
/lib/src/main/aidl/android/content/pm/IPackageInstallerCallback.aidl:
--------------------------------------------------------------------------------
1 | package android.content.pm;
2 |
3 | interface IPackageInstallerCallback {
4 | void onSessionCreated(int sessionId);
5 | void onSessionBadgingChanged(int sessionId);
6 | void onSessionActiveChanged(int sessionId, boolean active);
7 | void onSessionProgressChanged(int sessionId, float progress);
8 | void onSessionFinished(int sessionId, boolean success);
9 | }
10 |
--------------------------------------------------------------------------------
/lib/src/main/aidl/android/content/pm/IPackageInstallerSession.aidl:
--------------------------------------------------------------------------------
1 | package android.content.pm;
2 |
3 | import android.content.pm.IPackageInstallObserver2;
4 | import android.content.IntentSender;
5 | import android.os.ParcelFileDescriptor;
6 |
7 | interface IPackageInstallerSession {
8 | void setClientProgress(float progress);
9 | void addClientProgress(float progress);
10 |
11 | String[] getNames();
12 | ParcelFileDescriptor openWrite(String name, long offsetBytes, long lengthBytes);
13 | ParcelFileDescriptor openRead(String name);
14 |
15 | void removeSplit(String splitName);
16 |
17 | void close();
18 | void commit(in IntentSender statusReceiver);
19 | void abandon();
20 | }
21 |
--------------------------------------------------------------------------------
/lib/src/main/aidl/android/location/ILocationListener.aidl:
--------------------------------------------------------------------------------
1 | // ILocationListener.aidl
2 | package android.location;
3 |
4 | import android.location.Location;
5 | import android.os.Bundle;
6 |
7 | interface ILocationListener
8 | {
9 | void onLocationChanged(in Location location);
10 | void onStatusChanged(String provider, int status, in Bundle extras);
11 | void onProviderEnabled(String provider);
12 | void onProviderDisabled(String provider);
13 | }
--------------------------------------------------------------------------------
/lib/src/main/aidl/android/net/IConnectivityManager.aidl:
--------------------------------------------------------------------------------
1 | package android.net;
2 |
3 | import android.net.NetworkInfo;
4 | import android.net.LinkProperties;
5 |
6 | interface IConnectivityManager {
7 |
8 | NetworkInfo getActiveNetworkInfo();
9 | NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked);
10 |
11 | NetworkInfo getNetworkInfo(int networkType);
12 | NetworkInfo[] getAllNetworkInfo();
13 | boolean isActiveNetworkMetered();
14 | boolean requestRouteToHostAddress(int networkType, int address);
15 | LinkProperties getActiveLinkProperties();
16 | LinkProperties getLinkProperties(int networkType);
17 |
18 | }
--------------------------------------------------------------------------------
/lib/src/main/aidl/android/net/wifi/IWifiScanner.aidl:
--------------------------------------------------------------------------------
1 | package android.net.wifi;
2 |
3 | import android.os.Messenger;
4 | import android.os.Bundle;
5 |
6 | interface IWifiScanner
7 | {
8 | Messenger getMessenger();
9 |
10 | Bundle getAvailableChannels(int band);
11 | }
12 |
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/client/IVClient.aidl:
--------------------------------------------------------------------------------
1 | // IVClient.aidl
2 | package com.lody.virtual.client;
3 |
4 | import android.content.pm.ActivityInfo;
5 | import android.content.pm.ApplicationInfo;
6 | import android.content.pm.ProviderInfo;
7 |
8 | import com.lody.virtual.remote.PendingResultData;
9 |
10 | interface IVClient {
11 | void scheduleReceiver(in String processName,in ComponentName component, in Intent intent, in PendingResultData resultData);
12 | void scheduleNewIntent(in String creator, in IBinder token, in Intent intent);
13 | void finishActivity(in IBinder token);
14 | IBinder createProxyService(in ComponentName component, in IBinder binder);
15 | IBinder acquireProviderClient(in ProviderInfo info);
16 | IBinder getAppThread();
17 | IBinder getToken();
18 | String getDebugInfo();
19 | }
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/os/VUserInfo.aidl:
--------------------------------------------------------------------------------
1 | // VUserInfo.aidl
2 | package com.lody.virtual.os;
3 |
4 | parcelable VUserInfo;
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/remote/AppTaskInfo.aidl:
--------------------------------------------------------------------------------
1 | // AppTaskInfo.aidl
2 | package com.lody.virtual.remote;
3 |
4 | parcelable AppTaskInfo;
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/remote/BadgerInfo.aidl:
--------------------------------------------------------------------------------
1 | // BadgerInfo.aidl
2 | package com.lody.virtual.remote;
3 |
4 | parcelable BadgerInfo;
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/remote/InstallResult.aidl:
--------------------------------------------------------------------------------
1 | // InstallResult.aidl
2 | package com.lody.virtual.remote;
3 |
4 | parcelable InstallResult;
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/remote/InstalledAppInfo.aidl:
--------------------------------------------------------------------------------
1 | // AppSetting.aidl
2 | package com.lody.virtual.remote;
3 |
4 | parcelable InstalledAppInfo;
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/remote/PendingIntentData.aidl:
--------------------------------------------------------------------------------
1 | // PendingIntentData.aidl
2 | package com.lody.virtual.remote;
3 |
4 | parcelable PendingIntentData;
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/remote/PendingResultData.aidl:
--------------------------------------------------------------------------------
1 | // PendingResultData.aidl
2 | package com.lody.virtual.remote;
3 |
4 | parcelable PendingResultData;
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/remote/Problem.aidl:
--------------------------------------------------------------------------------
1 | // Problem.aidl
2 | package com.lody.virtual.remote;
3 |
4 | parcelable Problem;
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/remote/ReceiverInfo.aidl:
--------------------------------------------------------------------------------
1 | // ReceiverInfo.aidl
2 | package com.lody.virtual.remote;
3 |
4 | parcelable ReceiverInfo;
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/remote/VDeviceInfo.aidl:
--------------------------------------------------------------------------------
1 | // VDeviceInfo.aidl
2 | package com.lody.virtual.remote;
3 |
4 | parcelable VDeviceInfo;
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/remote/VParceledListSlice.aidl:
--------------------------------------------------------------------------------
1 | // VParceledListSlice.aidl
2 | package com.lody.virtual.remote;
3 |
4 | parcelable VParceledListSlice;
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/remote/vloc/VCell.aidl:
--------------------------------------------------------------------------------
1 | // VCell.aidl
2 | package com.lody.virtual.remote.vloc;
3 |
4 | parcelable VCell;
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/remote/vloc/VLocation.aidl:
--------------------------------------------------------------------------------
1 | // VLocation.aidl
2 | package com.lody.virtual.remote.vloc;
3 |
4 | parcelable VLocation;
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/remote/vloc/VWifi.aidl:
--------------------------------------------------------------------------------
1 | // VWifi.aidl
2 | package com.lody.virtual.remote.vloc;
3 |
4 | parcelable VWifi;
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/server/IBinderDelegateService.aidl:
--------------------------------------------------------------------------------
1 | // IBinderDelegateService.aidl
2 | package com.lody.virtual.server;
3 |
4 | import android.content.ComponentName;
5 |
6 | interface IBinderDelegateService {
7 |
8 | ComponentName getComponent();
9 |
10 | IBinder getService();
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/server/IPackageInstallerSession.aidl:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.server;
2 |
3 | import android.content.IntentSender;
4 | import android.os.ParcelFileDescriptor;
5 |
6 | interface IPackageInstallerSession {
7 | void setClientProgress(float progress);
8 | void addClientProgress(float progress);
9 |
10 | String[] getNames();
11 | ParcelFileDescriptor openWrite(String name, long offsetBytes, long lengthBytes);
12 | ParcelFileDescriptor openRead(String name);
13 | void close();
14 | void commit(in IntentSender statusReceiver);
15 | void abandon();
16 | }
17 |
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/server/interfaces/IAppRequestListener.aidl:
--------------------------------------------------------------------------------
1 | // IAppRequestListener.aidl
2 | package com.lody.virtual.server.interfaces;
3 |
4 | interface IAppRequestListener {
5 | void onRequestInstall(in String path);
6 | void onRequestUninstall(in String pkg);
7 | }
8 |
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/server/interfaces/IIntentFilterObserver.aidl:
--------------------------------------------------------------------------------
1 | // IIntentFilterObserver.aidl
2 | package com.lody.virtual.server.interfaces;
3 |
4 | // Declare any non-default types here with import statements
5 |
6 | interface IIntentFilterObserver {
7 | /**
8 | * Demonstrates some basic types that you can use as parameters
9 | * and return values in AIDL.
10 | */
11 |
12 | Intent filter(in Intent intent);
13 | void setCallBack(IBinder callBack);
14 | IBinder getCallBack();
15 | }
16 |
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/server/interfaces/IPackageObserver.aidl:
--------------------------------------------------------------------------------
1 | // IPackageObserver.aidl
2 | package com.lody.virtual.server.interfaces;
3 |
4 | interface IPackageObserver {
5 | void onPackageInstalled(in String packageName);
6 | void onPackageUninstalled(in String packageName);
7 | void onPackageInstalledAsUser(in int userId, in String packageName);
8 | void onPackageUninstalledAsUser(in int userId, in String packageName);
9 | }
10 |
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/server/interfaces/IProcessObserver.aidl:
--------------------------------------------------------------------------------
1 | // IProcessObserver.aidl
2 | package com.lody.virtual.server.interfaces;
3 |
4 | interface IProcessObserver {
5 | void onProcessCreated(in String pkg, in String processName);
6 |
7 | void onProcessDied(in String pkg, in String processName);
8 | }
9 |
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/server/interfaces/IServiceFetcher.aidl:
--------------------------------------------------------------------------------
1 | // IServiceFetcher.aidl
2 | package com.lody.virtual.server.interfaces;
3 |
4 | interface IServiceFetcher {
5 | IBinder getService(String name);
6 | void addService(String name,in IBinder service);
7 | void removeService(String name);
8 | }
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/server/interfaces/IUiCallback.aidl:
--------------------------------------------------------------------------------
1 | // IUiCallback.aidl
2 | package com.lody.virtual.server.interfaces;
3 |
4 | interface IUiCallback {
5 | void onAppOpened(in String packageName, in int userId);
6 | }
7 |
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/server/pm/installer/SessionInfo.aidl:
--------------------------------------------------------------------------------
1 | // SessionInfo.aidl
2 | package com.lody.virtual.server.pm.installer;
3 |
4 | parcelable SessionInfo;
--------------------------------------------------------------------------------
/lib/src/main/aidl/com/lody/virtual/server/pm/installer/SessionParams.aidl:
--------------------------------------------------------------------------------
1 | // SessionParams.aidl
2 | package com.lody.virtual.server.pm.installer;
3 |
4 | parcelable SessionParams;
--------------------------------------------------------------------------------
/lib/src/main/java/android/location/LocationRequest.java:
--------------------------------------------------------------------------------
1 | package android.location;
2 |
3 | import android.os.Parcel;
4 | import android.os.Parcelable;
5 |
6 | public final class LocationRequest implements Parcelable {
7 |
8 | public String getProvider() {
9 | return null;
10 | }
11 |
12 |
13 | public static final Creator CREATOR = new Creator() {
14 | @Override
15 | public LocationRequest createFromParcel(Parcel in) {
16 | return null;
17 | }
18 |
19 | @Override
20 | public LocationRequest[] newArray(int size) {
21 | return null;
22 | }
23 | };
24 |
25 | @Override
26 | public int describeContents() {
27 | return 0;
28 | }
29 |
30 | @Override
31 | public void writeToParcel(Parcel dest, int flags) {
32 | }
33 | }
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/Build.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual;
2 |
3 | /**
4 | *
5 | * Version info of VirtualApp project.
6 | *
7 | * @author Lody
8 | *
9 | */
10 |
11 | public class Build {
12 |
13 | public static final String VERSION_NAME = "Build-823-01";
14 |
15 | public static final int VERSION_CODE = 8230001;
16 | }
17 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/badger/IBadger.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.badger;
2 |
3 | import android.content.Intent;
4 |
5 | import com.lody.virtual.remote.BadgerInfo;
6 |
7 | /**
8 | * @author Lody
9 | */
10 | public interface IBadger {
11 |
12 | String getAction();
13 |
14 | BadgerInfo handleBadger(Intent intent);
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/core/CrashHandler.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.core;
2 |
3 | /**
4 | * @author Lody
5 | */
6 |
7 | public interface CrashHandler {
8 |
9 | void handleUncaughtException(Thread t, Throwable e);
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/core/InstallStrategy.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.core;
2 |
3 | /**
4 | * @author Lody
5 | *
6 | *
7 | */
8 | public interface InstallStrategy {
9 | int TERMINATE_IF_EXIST = 0x01 << 1;
10 | int UPDATE_IF_EXIST = 0x01 << 2;
11 | int COMPARE_VERSION = 0X01 << 3;
12 | int IGNORE_NEW_VERSION = 0x01 << 4;
13 | int DEPEND_SYSTEM_IF_EXIST = 0x01 << 5;
14 | int SKIP_DEX_OPT = 0x01 << 6;
15 | }
16 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/env/DeadServerException.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.env;
2 |
3 | /**
4 | * @author Lody
5 | */
6 |
7 | public class DeadServerException extends RuntimeException {
8 |
9 | public DeadServerException() {
10 | }
11 |
12 | public DeadServerException(String message) {
13 | super(message);
14 | }
15 |
16 | public DeadServerException(String message, Throwable cause) {
17 | super(message, cause);
18 | }
19 |
20 | public DeadServerException(Throwable cause) {
21 | super(cause);
22 | }
23 |
24 | public DeadServerException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
25 | super(message, cause, enableSuppression, writableStackTrace);
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/base/Inject.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.base;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | /**
9 | * @author Lody
10 | *
11 | */
12 | @Target(ElementType.TYPE)
13 | @Retention(RetentionPolicy.RUNTIME)
14 | public @interface Inject {
15 | Class> value();
16 | }
17 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/base/ReplaceCallingPkgMethodProxy.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.base;
2 |
3 | import java.lang.reflect.Method;
4 |
5 | import com.lody.virtual.client.hook.utils.MethodParameterUtils;
6 |
7 | /**
8 | * @author Lody
9 | */
10 |
11 | public class ReplaceCallingPkgMethodProxy extends StaticMethodProxy {
12 |
13 | public ReplaceCallingPkgMethodProxy(String name) {
14 | super(name);
15 | }
16 |
17 | @Override
18 | public boolean beforeCall(Object who, Method method, Object... args) {
19 | MethodParameterUtils.replaceFirstAppPkg(args);
20 | return super.beforeCall(who, method, args);
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/base/ReplaceLastPkgMethodProxy.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.base;
2 |
3 | import java.lang.reflect.Method;
4 |
5 | import com.lody.virtual.client.hook.utils.MethodParameterUtils;
6 |
7 | /**
8 | * @author Lody
9 | */
10 |
11 | public class ReplaceLastPkgMethodProxy extends StaticMethodProxy {
12 |
13 | public ReplaceLastPkgMethodProxy(String name) {
14 | super(name);
15 | }
16 |
17 | @Override
18 | public boolean beforeCall(Object who, Method method, Object... args) {
19 | MethodParameterUtils.replaceLastAppPkg(args);
20 | return super.beforeCall(who, method, args);
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/base/ReplaceLastUidMethodProxy.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.base;
2 |
3 | import android.os.Process;
4 |
5 | import com.lody.virtual.helper.utils.ArrayUtils;
6 |
7 | import java.lang.reflect.Method;
8 |
9 | public class ReplaceLastUidMethodProxy extends StaticMethodProxy {
10 |
11 | public ReplaceLastUidMethodProxy(String name) {
12 | super(name);
13 | }
14 |
15 | @Override
16 | public boolean beforeCall(Object who, Method method, Object... args) {
17 | int index = ArrayUtils.indexOfLast(args, Integer.class);
18 | if (index != -1) {
19 | int uid = (int) args[index];
20 | if (uid == Process.myUid()) {
21 | args[index] = getRealUid();
22 | }
23 | }
24 | return super.beforeCall(who, method, args);
25 | }
26 | }
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/base/ReplaceSequencePkgMethodProxy.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.base;
2 |
3 | import java.lang.reflect.Method;
4 |
5 | import com.lody.virtual.client.hook.utils.MethodParameterUtils;
6 |
7 | /**
8 | * @author Lody
9 | */
10 |
11 | public class ReplaceSequencePkgMethodProxy extends StaticMethodProxy {
12 |
13 | private int sequence;
14 |
15 | public ReplaceSequencePkgMethodProxy(String name, int sequence) {
16 | super(name);
17 | this.sequence = sequence;
18 | }
19 |
20 | @Override
21 | public boolean beforeCall(Object who, Method method, Object... args) {
22 | MethodParameterUtils.replaceSequenceAppPkg(args, sequence);
23 | return super.beforeCall(who, method, args);
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/base/ReplaceSpecPkgMethodProxy.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.base;
2 |
3 | import java.lang.reflect.Method;
4 |
5 | /**
6 | * @author Lody
7 | */
8 |
9 | public class ReplaceSpecPkgMethodProxy extends StaticMethodProxy {
10 |
11 | private int index;
12 |
13 | public ReplaceSpecPkgMethodProxy(String name, int index) {
14 | super(name);
15 | this.index = index;
16 | }
17 |
18 | @Override
19 | public boolean beforeCall(Object who, Method method, Object... args) {
20 | if (args != null) {
21 | int i = index;
22 | if (i < 0) {
23 | i += args.length;
24 | }
25 | if (i >= 0 && i < args.length && args[i] instanceof String) {
26 | args[i] = getHostPkg();
27 | }
28 | }
29 | return super.beforeCall(who, method, args);
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/base/ReplaceUidMethodProxy.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.base;
2 |
3 | import java.lang.reflect.Method;
4 |
5 | public class ReplaceUidMethodProxy extends StaticMethodProxy {
6 |
7 | private final int index;
8 | public ReplaceUidMethodProxy(String name, int index) {
9 | super(name);
10 | this.index = index;
11 | }
12 |
13 | @Override
14 | public boolean beforeCall(Object who, Method method, Object... args) {
15 | int uid = (int) args[index];
16 | if (uid == getVUid() || uid == getBaseVUid()) {
17 | args[index] = getRealUid();
18 | }
19 | return super.beforeCall(who, method, args);
20 | }
21 | }
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/base/ResultStaticMethodProxy.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.base;
2 |
3 | import java.lang.reflect.Method;
4 |
5 | /**
6 | * @author Lody
7 | */
8 |
9 | public class ResultStaticMethodProxy extends StaticMethodProxy {
10 |
11 | Object mResult;
12 |
13 | public ResultStaticMethodProxy(String name, Object result) {
14 | super(name);
15 | mResult = result;
16 | }
17 |
18 | public Object getResult() {
19 | return mResult;
20 | }
21 |
22 | @Override
23 | public Object call(Object who, Method method, Object... args) throws Throwable {
24 | return mResult;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/base/SkipInject.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.base;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | /**
9 | * @author Lody
10 | *
11 | */
12 | @Target(ElementType.TYPE)
13 | @Retention(RetentionPolicy.RUNTIME)
14 | public @interface SkipInject {
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/base/StaticMethodProxy.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.base;
2 |
3 | /**
4 | * @author Lody
5 | */
6 |
7 | public class StaticMethodProxy extends MethodProxy {
8 |
9 | private String mName;
10 |
11 | public StaticMethodProxy(String name) {
12 | this.mName = name;
13 | }
14 |
15 | @Override
16 | public String getMethodName() {
17 | return mName;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/delegate/PhoneInfoDelegate.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.delegate;
2 |
3 | public interface PhoneInfoDelegate {
4 |
5 | /***
6 | * Fake the Device ID.
7 | *
8 | * @param oldDeviceId old DeviceId
9 | * @param userId user
10 | */
11 | String getDeviceId(String oldDeviceId, int userId);
12 |
13 | /***
14 | * Fake the BluetoothAddress
15 | *
16 | * @param oldBluetoothAddress old BluetoothAddress
17 | * @param userId user
18 | */
19 | String getBluetoothAddress(String oldBluetoothAddress, int userId);
20 |
21 | /***
22 | * Fake the macAddress
23 | *
24 | * @param oldMacAddress old MacAddress
25 | * @param userId user
26 | */
27 | String getMacAddress(String oldMacAddress, int userId);
28 | }
29 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/delegate/TaskDescriptionDelegate.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.delegate;
2 |
3 | import android.annotation.TargetApi;
4 | import android.app.Activity;
5 | import android.app.ActivityManager;
6 | import android.os.Build;
7 |
8 | public interface TaskDescriptionDelegate {
9 | public ActivityManager.TaskDescription getTaskDescription(ActivityManager.TaskDescription oldTaskDescription);
10 | }
11 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/providers/ExternalProviderHook.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.providers;
2 |
3 | import com.lody.virtual.client.core.VirtualCore;
4 |
5 | import java.lang.reflect.Method;
6 |
7 | /**
8 | * @author Lody
9 | */
10 |
11 | public class ExternalProviderHook extends ProviderHook {
12 |
13 | public ExternalProviderHook(Object base) {
14 | super(base);
15 | }
16 |
17 | @Override
18 | protected void processArgs(Method method, Object... args) {
19 | if (args != null && args.length > 0 && args[0] instanceof String) {
20 | String pkg = (String) args[0];
21 | if (VirtualCore.get().isAppInstalled(pkg)) {
22 | args[0] = VirtualCore.get().getHostPkg();
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/providers/InternalProviderHook.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.providers;
2 |
3 | /**
4 | * @author Lody
5 | */
6 |
7 | public class InternalProviderHook extends ProviderHook {
8 |
9 | public InternalProviderHook(Object base) {
10 | super(base);
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/proxies/content/ContentServiceStub.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.proxies.content;
2 |
3 | import com.lody.virtual.client.hook.base.BinderInvocationProxy;
4 |
5 | import mirror.android.content.IContentService;
6 |
7 | /**
8 | * @author Lody
9 | *
10 | * @see IContentService
11 | */
12 |
13 | public class ContentServiceStub extends BinderInvocationProxy {
14 |
15 | public ContentServiceStub() {
16 | super(IContentService.Stub.asInterface, "content");
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/proxies/dropbox/DropBoxManagerStub.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.proxies.dropbox;
2 |
3 | import android.content.Context;
4 |
5 | import com.lody.virtual.client.hook.base.BinderInvocationProxy;
6 | import com.lody.virtual.client.hook.base.ResultStaticMethodProxy;
7 |
8 | import mirror.com.android.internal.os.IDropBoxManagerService;
9 |
10 | /**
11 | * @author Lody
12 | */
13 | public class DropBoxManagerStub extends BinderInvocationProxy {
14 | public DropBoxManagerStub() {
15 | super(IDropBoxManagerService.Stub.asInterface, Context.DROPBOX_SERVICE);
16 | }
17 |
18 | @Override
19 | protected void onBindMethods() {
20 | super.onBindMethods();
21 | addMethodProxy(new ResultStaticMethodProxy("getNextEntry", null));
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/proxies/graphics/GraphicsStatsStub.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.proxies.graphics;
2 |
3 | import com.lody.virtual.client.hook.base.BinderInvocationProxy;
4 | import com.lody.virtual.client.hook.base.ReplaceCallingPkgMethodProxy;
5 |
6 | import mirror.android.view.IGraphicsStats;
7 |
8 |
9 | /**
10 | * @author Lody
11 | */
12 | public class GraphicsStatsStub extends BinderInvocationProxy {
13 |
14 | public GraphicsStatsStub() {
15 | super(IGraphicsStats.Stub.asInterface, "graphicsstats");
16 | }
17 |
18 | @Override
19 | protected void onBindMethods() {
20 | super.onBindMethods();
21 | addMethodProxy(new ReplaceCallingPkgMethodProxy("requestBufferForProcess"));
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/proxies/media/session/SessionManagerStub.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.proxies.media.session;
2 |
3 | import android.annotation.TargetApi;
4 | import android.content.Context;
5 | import android.os.Build;
6 |
7 | import com.lody.virtual.client.hook.base.BinderInvocationProxy;
8 | import com.lody.virtual.client.hook.base.ReplaceCallingPkgMethodProxy;
9 |
10 | import mirror.android.media.session.ISessionManager;
11 |
12 | /**
13 | * @author Lody
14 | */
15 | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
16 | public class SessionManagerStub extends BinderInvocationProxy {
17 |
18 | public SessionManagerStub() {
19 | super(ISessionManager.Stub.asInterface, Context.MEDIA_SESSION_SERVICE);
20 | }
21 |
22 | @Override
23 | protected void onBindMethods() {
24 | super.onBindMethods();
25 | addMethodProxy(new ReplaceCallingPkgMethodProxy("createSession"));
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/proxies/network/NetworkManagementStub.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.proxies.network;
2 |
3 | import android.annotation.TargetApi;
4 | import android.os.Build;
5 |
6 | import com.lody.virtual.client.hook.base.BinderInvocationProxy;
7 | import com.lody.virtual.client.hook.base.ReplaceUidMethodProxy;
8 |
9 | import mirror.android.os.INetworkManagementService;
10 |
11 | @TargetApi(Build.VERSION_CODES.M)
12 | public class
13 | NetworkManagementStub extends BinderInvocationProxy {
14 |
15 | public NetworkManagementStub() {
16 | super(INetworkManagementService.Stub.asInterface, "network_management");
17 | }
18 |
19 | @Override
20 | protected void onBindMethods() {
21 | super.onBindMethods();
22 | addMethodProxy(new ReplaceUidMethodProxy("setUidCleartextNetworkPolicy", 0));
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/proxies/wifi_scanner/WifiScannerStub.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.proxies.wifi_scanner;
2 |
3 | import com.lody.virtual.client.hook.base.BinderInvocationProxy;
4 |
5 | /**
6 | * @author Lody
7 | */
8 |
9 | public class WifiScannerStub extends BinderInvocationProxy {
10 |
11 | public WifiScannerStub() {
12 | super(new GhostWifiScannerImpl(), "wifiscanner");
13 | }
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/hook/secondary/HackAppUtils.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.hook.secondary;
2 |
3 | import com.lody.virtual.helper.utils.Reflect;
4 | import com.lody.virtual.helper.utils.ReflectException;
5 |
6 | /**
7 | * @author Lody
8 | */
9 |
10 | public class HackAppUtils {
11 |
12 | /**
13 | * Enable the Log output of QQ.
14 | *
15 | * @param packageName package name
16 | * @param classLoader class loader
17 | */
18 | public static void enableQQLogOutput(String packageName, ClassLoader classLoader) {
19 | if ("com.tencent.mobileqq".equals(packageName)) {
20 | try {
21 | Reflect.on("com.tencent.qphone.base.util.QLog", classLoader).set("UIN_REPORTLOG_LEVEL", 100);
22 | } catch (ReflectException e) {
23 | // ignore
24 | }
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/interfaces/IInjector.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.interfaces;
2 |
3 | /**
4 | * @author Lody
5 | *
6 | * The Objects who implemention this interface will be able to inject other object.
7 | *
8 | */
9 | public interface IInjector {
10 |
11 | /**
12 | *
13 | * Do injection.
14 | *
15 | * @throws Throwable if inject failed
16 | */
17 | void inject() throws Throwable;
18 |
19 | /**
20 | * Check if the injection has bad.
21 | *
22 | * @return If the injection has bad
23 | */
24 | boolean isEnvBad();
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/ipc/ActivityClientRecord.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.ipc;
2 |
3 | import android.app.Activity;
4 | import android.content.pm.ActivityInfo;
5 |
6 | public class ActivityClientRecord {
7 | public Activity activity;
8 | public ActivityInfo info;
9 | }
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/client/stub/StubPendingActivity.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.client.stub;
2 |
3 | import android.app.Activity;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 |
7 | import com.lody.virtual.client.ipc.VActivityManager;
8 | import com.lody.virtual.remote.StubActivityRecord;
9 |
10 | /**
11 | * @author Lody
12 | */
13 |
14 | public class StubPendingActivity extends Activity {
15 |
16 | @Override
17 | protected void onCreate(Bundle savedInstanceState) {
18 | super.onCreate(savedInstanceState);
19 | finish();
20 | Intent intent = getIntent();
21 | StubActivityRecord r = new StubActivityRecord(intent);
22 | if (r.intent == null) {
23 | return;
24 | }
25 | r.intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
26 | VActivityManager.get().startActivity(r.intent, r.userId);
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/helper/compat/ApplicationThreadCompat.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.helper.compat;
2 |
3 | import android.os.IBinder;
4 | import android.os.IInterface;
5 |
6 | import mirror.android.app.ApplicationThreadNative;
7 | import mirror.android.app.IApplicationThreadOreo;
8 |
9 | /**
10 | * @author Lody
11 | */
12 |
13 | public class ApplicationThreadCompat {
14 |
15 | public static IInterface asInterface(IBinder binder) {
16 | if (BuildCompat.isOreo()) {
17 | return IApplicationThreadOreo.Stub.asInterface.call(binder);
18 | }
19 | return ApplicationThreadNative.asInterface.call(binder);
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/helper/compat/BuildCompat.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.helper.compat;
2 |
3 | import android.os.Build;
4 |
5 | /**
6 | * @author Lody
7 | */
8 |
9 | public class BuildCompat {
10 |
11 | public static int getPreviewSDKInt() {
12 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
13 | try {
14 | return Build.VERSION.PREVIEW_SDK_INT;
15 | } catch (Throwable e) {
16 | // ignore
17 | }
18 | }
19 | return 0;
20 | }
21 |
22 | public static boolean isOreo() {
23 |
24 | return (Build.VERSION.SDK_INT == 25 && getPreviewSDKInt() > 0)
25 | || Build.VERSION.SDK_INT > 25;
26 | }
27 |
28 | }
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/helper/compat/ContentResolverCompat.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.helper.compat;
2 |
3 | /**
4 | * @author Lody
5 | */
6 |
7 | public class ContentResolverCompat {
8 |
9 | public static final int SYNC_OBSERVER_TYPE_STATUS = 1 << 3;
10 |
11 |
12 | public static final int SYNC_ERROR_SYNC_ALREADY_IN_PROGRESS = 1;
13 |
14 | public static final int SYNC_ERROR_AUTHENTICATION = 2;
15 |
16 | public static final int SYNC_ERROR_IO = 3;
17 |
18 | public static final int SYNC_ERROR_PARSE = 4;
19 |
20 | public static final int SYNC_ERROR_CONFLICT = 5;
21 |
22 | public static final int SYNC_ERROR_TOO_MANY_DELETIONS = 6;
23 |
24 | public static final int SYNC_ERROR_TOO_MANY_RETRIES = 7;
25 |
26 | public static final int SYNC_ERROR_INTERNAL = 8;
27 | }
28 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/helper/compat/ObjectsCompat.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.helper.compat;
2 |
3 | /**
4 | * @author Lody
5 | */
6 |
7 | public class ObjectsCompat {
8 |
9 | /**
10 | * Null-safe equivalent of {@code a.equals(b)}.
11 | */
12 | public static boolean equals(Object a, Object b) {
13 | return (a == null) ? (b == null) : a.equals(b);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/helper/ipcbus/IPCSingleton.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.helper.ipcbus;
2 |
3 | /**
4 | * @author Lody
5 | */
6 | public class IPCSingleton {
7 |
8 | private Class> ipcClass;
9 | private T instance;
10 |
11 | public IPCSingleton(Class> ipcClass) {
12 | this.ipcClass = ipcClass;
13 | }
14 |
15 | public T get() {
16 | if (instance == null) {
17 | synchronized (this) {
18 | if (instance == null) {
19 | instance = IPCBus.get(ipcClass);
20 | }
21 | }
22 | }
23 | return instance;
24 | }
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/helper/ipcbus/IServerCache.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.helper.ipcbus;
2 |
3 | import android.os.IBinder;
4 |
5 | /**
6 | * @author Lody
7 | */
8 | public interface IServerCache {
9 | void join(String serverName, IBinder binder);
10 | IBinder query(String serverName);
11 | }
12 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/helper/utils/ClassUtils.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.helper.utils;
2 |
3 | /**
4 | * @author Lody
5 | *
6 | */
7 | public class ClassUtils {
8 |
9 | public static boolean isClassExist(String className) {
10 | try {
11 | Class.forName(className);
12 | return true;
13 | } catch (ClassNotFoundException e) {
14 | return false;
15 | }
16 | }
17 |
18 | public static void fixArgs(Class>[] types, Object[] args) {
19 | for (int i = 0; i < types.length; i++) {
20 | if (types[i] == int.class && args[i] == null) {
21 | args[i] = 0;
22 | } else if (types[i] == boolean.class && args[i] == null) {
23 | args[i] = false;
24 | }
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/helper/utils/ReflectException.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.helper.utils;
2 |
3 | /**
4 | * @author Lody
5 | */
6 | public class ReflectException extends RuntimeException {
7 |
8 | public ReflectException(String message, Throwable cause) {
9 | super(message, cause);
10 | }
11 |
12 | public ReflectException(Throwable cause) {
13 | super(cause);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/helper/utils/Singleton.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.helper.utils;
2 |
3 | /**
4 | * Singleton helper class for lazily initialization.
5 | *
6 | * Modeled after frameworks/base/include/utils/Singleton.h
7 | *
8 | * @hide
9 | */
10 | public abstract class Singleton {
11 | private T mInstance;
12 |
13 | protected abstract T create();
14 |
15 | public final T get() {
16 | synchronized (this) {
17 | if (mInstance == null) {
18 | mInstance = create();
19 | }
20 | return mInstance;
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/helper/utils/XmlSerializerAndParser.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.helper.utils;
2 |
3 | import org.xmlpull.v1.XmlPullParser;
4 | import org.xmlpull.v1.XmlPullParserException;
5 | import org.xmlpull.v1.XmlSerializer;
6 |
7 | import java.io.IOException;
8 |
9 | public interface XmlSerializerAndParser {
10 | void writeAsXml(T item, XmlSerializer out) throws IOException;
11 | T createFromXml(XmlPullParser parser) throws IOException, XmlPullParserException;
12 | }
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/helper/utils/marks/FakeDeviceMark.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.helper.utils.marks;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 |
9 | @Target(ElementType.TYPE)
10 | @Retention(RetentionPolicy.SOURCE)
11 | public @interface FakeDeviceMark {
12 | String value() default "";
13 | }
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/helper/utils/marks/FakeLocMark.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.helper.utils.marks;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 |
9 | @Target(ElementType.TYPE)
10 | @Retention(RetentionPolicy.SOURCE)
11 | public @interface FakeLocMark {
12 | String value() default "";
13 | }
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/os/VBinder.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.os;
2 |
3 | import android.os.Binder;
4 |
5 | import com.lody.virtual.client.ipc.VActivityManager;
6 |
7 | /**
8 | * @author Lody
9 | */
10 |
11 | public class VBinder {
12 |
13 | public static int getCallingUid() {
14 | return VActivityManager.get().getUidByPid(Binder.getCallingPid());
15 | }
16 |
17 | public static int getBaseCallingUid() {
18 | return VUserHandle.getAppId(getCallingUid());
19 | }
20 |
21 | public static int getCallingPid() {
22 | return Binder.getCallingPid();
23 | }
24 |
25 | public static VUserHandle getCallingUserHandle() {
26 | return new VUserHandle(VUserHandle.getUserId(getCallingUid()));
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/server/ServiceCache.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.server;
2 |
3 | import android.os.IBinder;
4 |
5 | import com.lody.virtual.helper.collection.ArrayMap;
6 |
7 | import java.util.Map;
8 |
9 | /**
10 | * @author Lody
11 | */
12 |
13 | public class ServiceCache {
14 |
15 | private static final Map sCache = new ArrayMap<>(5);
16 |
17 | public static void addService(String name, IBinder service) {
18 | sCache.put(name, service);
19 | }
20 |
21 | public static IBinder removeService(String name) {
22 | return sCache.remove(name);
23 | }
24 |
25 | public static IBinder getService(String name) {
26 | return sCache.get(name);
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/server/interfaces/IDeviceInfoManager.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.server.interfaces;
2 |
3 | import android.os.RemoteException;
4 |
5 | import com.lody.virtual.remote.VDeviceInfo;
6 |
7 | /**
8 | * @author Lody
9 | */
10 | public interface IDeviceInfoManager {
11 |
12 | VDeviceInfo getDeviceInfo(int userId) throws RemoteException;
13 |
14 | void updateDeviceInfo(int userId, VDeviceInfo info) throws RemoteException;
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/server/interfaces/IJobService.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.server.interfaces;
2 |
3 | import android.app.job.JobInfo;
4 | import android.os.RemoteException;
5 |
6 | import java.util.List;
7 |
8 | /**
9 | * @author Lody
10 | */
11 | public interface IJobService {
12 |
13 | int schedule(JobInfo job) throws RemoteException;
14 |
15 | void cancel(int jobId) throws RemoteException;
16 |
17 | void cancelAll() throws RemoteException;
18 |
19 | List getAllPendingJobs() throws RemoteException;
20 | }
21 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/server/interfaces/INotificationManager.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.server.interfaces;
2 |
3 | import android.os.RemoteException;
4 |
5 | /**
6 | * @author Lody
7 | */
8 | public interface INotificationManager {
9 |
10 | int dealNotificationId(int id, String packageName, String tag, int userId) throws RemoteException;
11 |
12 | String dealNotificationTag(int id, String packageName, String tag, int userId) throws RemoteException;
13 |
14 | boolean areNotificationsEnabledForPackage(String packageName, int userId) throws RemoteException;
15 |
16 | void setNotificationsEnabledForPackage(String packageName, boolean enable, int userId) throws RemoteException;
17 |
18 | void addNotification(int id, String tag, String packageName, int userId) throws RemoteException;
19 |
20 | void cancelAllNotification(String packageName, int userId) throws RemoteException;
21 | }
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/server/interfaces/IVirtualStorageService.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.server.interfaces;
2 |
3 | import android.os.RemoteException;
4 |
5 | /**
6 | * @author Lody
7 | */
8 | public interface IVirtualStorageService {
9 |
10 | void setVirtualStorage(String packageName, int userId, String vsPath) throws RemoteException;
11 |
12 | String getVirtualStorage(String packageName, int userId) throws RemoteException;
13 |
14 | void setVirtualStorageState(String packageName, int userId, boolean enable) throws RemoteException;
15 |
16 | boolean isVirtualStorageEnable(String packageName, int userId) throws RemoteException;
17 | }
18 |
--------------------------------------------------------------------------------
/lib/src/main/java/com/lody/virtual/server/pm/installer/PackageInstallInfo.java:
--------------------------------------------------------------------------------
1 | package com.lody.virtual.server.pm.installer;
2 |
3 | /**
4 | * @author Lody
5 | */
6 |
7 | public class PackageInstallInfo {
8 |
9 | }
10 |
--------------------------------------------------------------------------------
/lib/src/main/java/mirror/MethodParams.java:
--------------------------------------------------------------------------------
1 | package mirror;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | @Target({ElementType.FIELD})
9 | @Retention(RetentionPolicy.RUNTIME)
10 | public @interface MethodParams {
11 | Class>[] value();
12 | }
--------------------------------------------------------------------------------
/lib/src/main/java/mirror/MethodReflectParams.java:
--------------------------------------------------------------------------------
1 | package mirror;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 | @Target({ElementType.FIELD})
9 | @Retention(RetentionPolicy.RUNTIME)
10 | public @interface MethodReflectParams {
11 | String[] value();
12 | }
--------------------------------------------------------------------------------
/lib/src/main/java/mirror/RefBoolean.java:
--------------------------------------------------------------------------------
1 | package mirror;
2 |
3 | import java.lang.reflect.Field;
4 |
5 | public class RefBoolean {
6 | private Field field;
7 |
8 | public RefBoolean(Class> cls, Field field) throws NoSuchFieldException {
9 | this.field = cls.getDeclaredField(field.getName());
10 | this.field.setAccessible(true);
11 | }
12 |
13 | public boolean get(Object object) {
14 | try {
15 | return this.field.getBoolean(object);
16 | } catch (Exception e) {
17 | return false;
18 | }
19 | }
20 |
21 | public void set(Object obj, boolean value) {
22 | try {
23 | this.field.setBoolean(obj, value);
24 | } catch (Exception e) {
25 | //Ignore
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/lib/src/main/java/mirror/RefDouble.java:
--------------------------------------------------------------------------------
1 | package mirror;
2 |
3 | import java.lang.reflect.Field;
4 |
5 | public class RefDouble {
6 | private Field field;
7 |
8 | public RefDouble(Class cls, Field field) throws NoSuchFieldException {
9 | this.field = cls.getDeclaredField(field.getName());
10 | this.field.setAccessible(true);
11 | }
12 |
13 | public double get(Object object) {
14 | try {
15 | return this.field.getDouble(object);
16 | } catch (Exception e) {
17 | return 0;
18 | }
19 | }
20 |
21 | public void set(Object obj, double value) {
22 | try {
23 | this.field.setDouble(obj, value);
24 | } catch (Exception e) {
25 | //Ignore
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/lib/src/main/java/mirror/RefFloat.java:
--------------------------------------------------------------------------------
1 | package mirror;
2 |
3 | import java.lang.reflect.Field;
4 |
5 | public class RefFloat {
6 | private Field field;
7 |
8 | public RefFloat(Class cls, Field field) throws NoSuchFieldException {
9 | this.field = cls.getDeclaredField(field.getName());
10 | this.field.setAccessible(true);
11 | }
12 |
13 | public float get(Object object) {
14 | try {
15 | return this.field.getFloat(object);
16 | } catch (Exception e) {
17 | return 0;
18 | }
19 | }
20 |
21 | public void set(Object obj, float value) {
22 | try {
23 | this.field.setFloat(obj, value);
24 | } catch (Exception e) {
25 | //Ignore
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/lib/src/main/java/mirror/RefInt.java:
--------------------------------------------------------------------------------
1 | package mirror;
2 |
3 | import java.lang.reflect.Field;
4 |
5 | public class RefInt {
6 | private Field field;
7 |
8 | public RefInt(Class cls, Field field) throws NoSuchFieldException {
9 | this.field = cls.getDeclaredField(field.getName());
10 | this.field.setAccessible(true);
11 | }
12 |
13 | public int get(Object object) {
14 | try {
15 | return this.field.getInt(object);
16 | } catch (Exception e) {
17 | return 0;
18 | }
19 | }
20 |
21 | public void set(Object obj, int intValue) {
22 | try {
23 | this.field.setInt(obj, intValue);
24 | } catch (Exception e) {
25 | //Ignore
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/lib/src/main/java/mirror/RefLong.java:
--------------------------------------------------------------------------------
1 | package mirror;
2 |
3 | import java.lang.reflect.Field;
4 |
5 | public class RefLong {
6 | private Field field;
7 |
8 | public RefLong(Class cls, Field field) throws NoSuchFieldException {
9 | this.field = cls.getDeclaredField(field.getName());
10 | this.field.setAccessible(true);
11 | }
12 |
13 | public long get(Object object) {
14 | try {
15 | return this.field.getLong(object);
16 | } catch (Exception e) {
17 | return 0;
18 | }
19 | }
20 |
21 | public void set(Object obj, long value) {
22 | try {
23 | this.field.setLong(obj, value);
24 | } catch (Exception e) {
25 | //Ignore
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/lib/src/main/java/mirror/RefObject.java:
--------------------------------------------------------------------------------
1 | package mirror;
2 |
3 | import java.lang.reflect.Field;
4 |
5 | @SuppressWarnings("unchecked")
6 | public class RefObject {
7 | private Field field;
8 |
9 | public RefObject(Class> cls, Field field) throws NoSuchFieldException {
10 | this.field = cls.getDeclaredField(field.getName());
11 | this.field.setAccessible(true);
12 | }
13 |
14 | public T get(Object object) {
15 | try {
16 | return (T) this.field.get(object);
17 | } catch (Exception e) {
18 | return null;
19 | }
20 | }
21 |
22 | public void set(Object obj, T value) {
23 | try {
24 | this.field.set(obj, value);
25 | } catch (Exception e) {
26 | //Ignore
27 | }
28 | }
29 | }
--------------------------------------------------------------------------------
/lib/src/main/java/mirror/RefStaticInt.java:
--------------------------------------------------------------------------------
1 | package mirror;
2 |
3 | import java.lang.reflect.Field;
4 |
5 | public class RefStaticInt {
6 | private Field field;
7 |
8 | public RefStaticInt(Class> cls, Field field) throws NoSuchFieldException {
9 | this.field = cls.getDeclaredField(field.getName());
10 | this.field.setAccessible(true);
11 | }
12 |
13 | public int get() {
14 | try {
15 | return this.field.getInt(null);
16 | } catch (Exception e) {
17 | return 0;
18 | }
19 | }
20 |
21 | public void set(int value) {
22 | try {
23 | this.field.setInt(null, value);
24 | } catch (Exception e) {
25 | //Ignore
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/lib/src/main/java/mirror/android/accounts/IAccountManager.java:
--------------------------------------------------------------------------------
1 | package mirror.android.accounts;
2 |
3 | import android.os.IBinder;
4 | import android.os.IInterface;
5 |
6 | import mirror.RefClass;
7 | import mirror.MethodParams;
8 | import mirror.RefStaticMethod;
9 |
10 | public class IAccountManager {
11 | public static Class> TYPE = RefClass.load(IAccountManager.class, "android.accounts.IAccountManager");
12 |
13 | public static class Stub {
14 | public static Class> TYPE = RefClass.load(Stub.class, "android.accounts.IAccountManager$Stub");
15 | @MethodParams({IBinder.class})
16 | public static RefStaticMethod asInterface;
17 | }
18 | }
--------------------------------------------------------------------------------
/lib/src/main/java/mirror/android/app/Activity.java:
--------------------------------------------------------------------------------
1 | package mirror.android.app;
2 |
3 |
4 | import android.content.Intent;
5 | import android.content.pm.ActivityInfo;
6 | import android.os.IBinder;
7 |
8 | import mirror.RefBoolean;
9 | import mirror.RefClass;
10 | import mirror.RefObject;
11 | import mirror.RefInt;
12 |
13 | public class Activity {
14 | public static Class> TYPE = RefClass.load(Activity.class, "android.app.Activity");
15 | public static RefObject mActivityInfo;
16 | public static RefBoolean mFinished;
17 | public static RefObject mParent;
18 | public static RefInt mResultCode;
19 | public static RefObject mResultData;
20 | public static RefObject mToken;
21 | public static RefObject mEmbeddedID;
22 | }
23 |
--------------------------------------------------------------------------------
/lib/src/main/java/mirror/android/app/ActivityManagerNative.java:
--------------------------------------------------------------------------------
1 | package mirror.android.app;
2 |
3 |
4 | import android.os.IInterface;
5 |
6 | import mirror.RefClass;
7 | import mirror.RefStaticObject;
8 | import mirror.RefStaticMethod;
9 |
10 | public class ActivityManagerNative {
11 | public static Class> TYPE = RefClass.load(ActivityManagerNative.class, "android.app.ActivityManagerNative");
12 | public static RefStaticObject