diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/bean/HookClass.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/bean/HookClass.kt index 798297e2..7ac2abf1 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/bean/HookClass.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/bean/HookClass.kt @@ -28,9 +28,12 @@ package com.highcapable.yukihookapi.hook.bean /** - * 自适应异常 [Class] 接管类 + * 创建一个当前 Hook 的 [Class] 接管类 * @param instance 实例 * @param name 完整名称 * @param throwable 异常 */ -class HookClass(var instance: Class<*>? = null, var name: String, var throwable: Throwable? = null) \ No newline at end of file +class HookClass(var instance: Class<*>? = null, var name: String, var throwable: Throwable? = null) { + + override fun toString() = "[class] $name [throwable] $throwable [instance] $instance" +} \ No newline at end of file diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/FieldFinder.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/FieldFinder.kt index fad7ccf2..f3a9fcea 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/FieldFinder.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/FieldFinder.kt @@ -48,6 +48,13 @@ class FieldFinder(private val hookInstance: YukiHookCreater.MemberHookCreater, p /** 当前找到的 [Field] */ private var fieldInstance: Field? = null + /** + * [Field] 所在的 [Class] + * + * 不填默认为当前的 [hookClass] + */ + var classSet = hookClass + /** * [Field] 名称 * @@ -70,19 +77,26 @@ class FieldFinder(private val hookInstance: YukiHookCreater.MemberHookCreater, p * @throws IllegalStateException 如果 [name] 没有被设置 */ @DoNotUseMethod - fun build() = if (name.isBlank()) { - loggerE(msg = "Field name cannot be empty in Class [$hookClass] [${hookInstance.tag}]") - Result(isNoSuch = true) - } else try { - runBlocking { - fieldInstance = ReflectionUtils.findFieldIfExists(hookClass, type?.name, name) - }.result { - hookInstance.onHookLogMsg(msg = "Find Field [${fieldInstance}] takes ${it}ms [${hookInstance.tag}]") + fun build() = when { + name.isBlank() -> { + loggerE(msg = "Field name cannot be empty in Class [$classSet] [${hookInstance.tag}]") + Result(isNoSuch = true) + } + type == null -> { + loggerE(msg = "Field type cannot be null in Class [$classSet] [${hookInstance.tag}]") + Result(isNoSuch = true) + } + else -> try { + runBlocking { + fieldInstance = ReflectionUtils.findFieldIfExists(classSet, type?.name, name) + }.result { + hookInstance.onHookLogMsg(msg = "Find Field [${fieldInstance}] takes ${it}ms [${hookInstance.tag}]") + } + Result() + } catch (e: Throwable) { + loggerE(msg = "NoSuchField happend in [$classSet] [${hookInstance.tag}]", e = e) + Result(isNoSuch = true, e) } - Result() - } catch (e: Throwable) { - loggerE(msg = "NoSuchField happend in [$hookClass] [${hookInstance.tag}]", e = e) - Result(isNoSuch = true, e) } /** @@ -170,6 +184,8 @@ class FieldFinder(private val hookInstance: YukiHookCreater.MemberHookCreater, p /** 设置变量实例为 null */ fun setNull() = set(null) + + override fun toString() = "[${self?.javaClass?.name ?: ""}] in [${instance?.javaClass?.name ?: ""}] value \"$self\"" } } } \ No newline at end of file diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.kt index 94e2f1f2..f829f000 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/ReflectionFactory.kt @@ -34,25 +34,6 @@ import java.lang.reflect.Constructor import java.lang.reflect.Field import java.lang.reflect.Method -/** - * 字符串转换为实体类 - * @return [Class] - * @throws NoClassDefFoundError - */ -val String.clazz: Class<*> get() = Class.forName(this) - -/** - * 通过字符串查找类是否存在 - * @return [Boolean] 是否存在 - */ -val String.hasClass - get() = try { - clazz - true - } catch (_: Throwable) { - false - } - /** * [Class] 转换为 [HookClass] * @return [HookClass] @@ -65,6 +46,37 @@ val Class<*>.hookClass get() = HookClass(instance = this, name) */ val HookClass.normalClass get() = instance +/** + * 通过字符串查找类是否存在 + * + * - ❗仅限使用当前的 [ClassLoader] + * @return [Boolean] 是否存在 + */ +val String.hasClass get() = hasClass(loader = null) + +/** + * 通过字符串转换为实体类 + * @param name [Class] 的完整包名+名称 + * @param loader [Class] 所在的 [ClassLoader] - 默认空 - 可不填 + * @return [Class] + * @throws NoClassDefFoundError 如果找不到 [Class] 或设置了错误的 [ClassLoader] + */ +fun classOf(name: String, loader: ClassLoader? = null): Class<*> = + if (loader == null) Class.forName(name) + else loader.loadClass(name) + +/** + * 通过字符串查找类是否存在 + * @param loader [Class] 所在的 [ClassLoader] + * @return [Boolean] 是否存在 + */ +fun String.hasClass(loader: ClassLoader?) = try { + classOf(name = this, loader) + true +} catch (_: Throwable) { + false +} + /** * 查找方法是否存在 * @param name 名称 @@ -151,7 +163,9 @@ fun Class<*>.obtainConstructor(vararg paramType: Class<*>): Constructor * @throws IllegalStateException 如果 [T] 类型错误 */ inline fun Method.invokeStatic(vararg param: Any?) = - invoke(null, param) as? T? ?: error("Method ReturnType cannot cast to ${T::class.java}") + if (param.isNotEmpty()) + invoke(null, param) as? T? ?: error("Method ReturnType cannot cast to ${T::class.java}") + else invoke(null) as? T? ?: error("Method ReturnType cannot cast to ${T::class.java}") /** * 执行方法 @@ -161,4 +175,6 @@ inline fun Method.invokeStatic(vararg param: Any?) = * @throws IllegalStateException 如果 [T] 类型错误 */ inline fun Method.invokeAny(any: Any?, vararg param: Any?) = - invoke(any, param) as? T? ?: error("Method ReturnType cannot cast to ${T::class.java}") + if (param.isNotEmpty()) + invoke(any, param) as? T? ?: error("Method ReturnType cannot cast to ${T::class.java}") + else invoke(any) as? T? ?: error("Method ReturnType cannot cast to ${T::class.java}") diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/HookParam.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/HookParam.kt index 89b0bedf..929273a0 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/HookParam.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/HookParam.kt @@ -184,5 +184,9 @@ class HookParam(private val wrapper: HookParamWrapper) { * ❗请确保目标对象的类型是 [Boolean] 不然会发生意想不到的问题 */ fun setFalse() = set(false) + + override fun toString() = "Args of index $index" } + + override fun toString() = "HookParam by $wrapper" } \ No newline at end of file diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt index 84d1acfe..8d85c51b 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt @@ -36,6 +36,8 @@ import com.highcapable.yukihookapi.hook.bean.HookClass import com.highcapable.yukihookapi.hook.bean.VariousClass import com.highcapable.yukihookapi.hook.core.YukiHookCreater import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker +import com.highcapable.yukihookapi.hook.factory.classOf +import com.highcapable.yukihookapi.hook.factory.hasClass import com.highcapable.yukihookapi.hook.factory.hookClass import com.highcapable.yukihookapi.hook.param.wrapper.PackageParamWrapper import com.highcapable.yukihookapi.hook.xposed.prefs.YukiHookModulePrefs @@ -130,13 +132,51 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) { */ fun loadHooker(hooker: YukiBaseHooker) = hooker.assignInstance(packageParam = this) + /** + * 通过字符串转换为实体类 + * + * - 使用当前 [appClassLoader] 装载目标 [Class] + * @return [Class] + * @throws NoClassDefFoundError 如果找不到 [Class] + */ + val String.clazz get() = classOf(name = this, appClassLoader) + + /** + * [VariousClass] 转换为实体类 + * + * - 使用当前 [appClassLoader] 装载目标 [Class] + * @return [Class] + * @throws IllegalStateException 如果任何 [Class] 都没有匹配到 + */ + val VariousClass.clazz + get() :Class<*> { + var finalClass: Class<*>? = null + if (name.isNotEmpty()) run { + name.forEach { + runCatching { + finalClass = it.clazz + return@run + } + } + } + return finalClass ?: error("VariousClass match failed of those $this") + } + + /** + * 通过字符串查找类是否存在 + * + * - 使用当前 [appClassLoader] 装载目标 [Class] + * @return [Boolean] 是否存在 + */ + val String.hasClass get() = hasClass(appClassLoader) + /** * 通过 [appClassLoader] 查询并装载 [Class] * @param name 类名 * @return [HookClass] */ fun findClass(name: String) = try { - appClassLoader.loadClass(name).hookClass + name.clazz.hookClass } catch (e: Throwable) { HookClass(name = name, throwable = e) } @@ -155,21 +195,10 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) { * @param various 实例 * @return [HookClass] */ - fun findClass(various: VariousClass): HookClass { - var finalClass: Class<*>? = null - if (various.name.isNotEmpty()) - run { - various.name.forEach { - runCatching { - finalClass = appClassLoader.loadClass(it) - return@run - } - } - } - return finalClass?.hookClass ?: HookClass( - name = "VariousClass", - throwable = Throwable("VariousClass match failed of those $various") - ) + fun findClass(various: VariousClass) = try { + various.clazz.hookClass + } catch (e: Throwable) { + HookClass(name = "VariousClass", throwable = Throwable(e.message)) } /** @@ -193,7 +222,7 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) { * @return [HookClass] */ private fun HookClass.bind() = try { - appClassLoader.loadClass(name).hookClass + name.clazz.hookClass } catch (e: Throwable) { HookClass(name = name, throwable = throwable ?: e) } @@ -203,4 +232,6 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) { * @return [PackageParam] */ private val thisParam get() = this + + override fun toString() = "PackageParam by $wrapper" } \ No newline at end of file diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/wrapper/HookParamWrapper.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/wrapper/HookParamWrapper.kt index 893ab1c8..9e35eb56 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/wrapper/HookParamWrapper.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/wrapper/HookParamWrapper.kt @@ -89,4 +89,6 @@ class HookParamWrapper(private val baseParam: XC_MethodHook.MethodHookParam) { */ fun invokeOriginalMember(member: Member, vararg args: Any?): Any? = XposedBridge.invokeOriginalMethod(member, instance, args) + + override fun toString() = "HookParamWrapper[$baseParam]" } \ No newline at end of file diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/wrapper/PackageParamWrapper.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/wrapper/PackageParamWrapper.kt index ca995d6f..a29c998d 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/wrapper/PackageParamWrapper.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/wrapper/PackageParamWrapper.kt @@ -48,4 +48,7 @@ class PackageParamWrapper( var processName: String, var appClassLoader: ClassLoader, var appInfo: ApplicationInfo -) \ No newline at end of file +) { + + override fun toString() = "PackageParamWrapper [packageName] $packageName [processName] $processName [appInfo] $appInfo" +} \ No newline at end of file diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.kt index b0f5a687..04acf3de 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.kt @@ -25,20 +25,29 @@ * * This file is Created by fankes on 2022/2/2. */ -@file:Suppress("unused", "KDocUnresolvedReference") +@file:Suppress("unused", "KDocUnresolvedReference", "DEPRECATION", "NewApi") package com.highcapable.yukihookapi.hook.type.android -import android.app.Activity -import android.app.Application -import android.app.Service -import android.content.BroadcastReceiver -import android.content.ContentProvider -import android.content.ContentResolver -import android.content.Context +import android.app.* +import android.content.* +import android.content.res.ColorStateList import android.content.res.Resources -import android.os.Bundle -import com.highcapable.yukihookapi.hook.factory.clazz +import android.graphics.drawable.* +import android.icu.text.SimpleDateFormat +import android.media.MediaPlayer +import android.os.* +import android.service.notification.StatusBarNotification +import android.text.SpannableStringBuilder +import android.util.ArrayMap +import android.util.ArraySet +import android.util.Base64 +import android.util.DisplayMetrics +import android.view.Display +import android.view.Window +import android.view.WindowManager +import android.widget.Toast +import com.highcapable.yukihookapi.hook.factory.classOf /** * 获得 [Context] 类型 @@ -50,7 +59,43 @@ val ContextClass get() = Context::class.java * 获得 [ContextImpl] 类型 * @return [Class] */ -val ContextImplClass get() = ("android.app.ContextImpl").clazz +val ContextImplClass get() = classOf(name = "android.app.ContextImpl") + +/** + * 获得 [ContextWrapper] 类型 + * @return [Class] + */ +val ContextWrapperClass get() = ContextWrapper::class.java + +/** + * 获得 [Application] 类型 + * @return [Class] + */ +val ApplicationClass get() = Application::class.java + +/** + * 获得 [ApplicationPackageManager] 类型 + * @return [Class] + */ +val ApplicationPackageManagerClass get() = classOf(name = "android.app.ApplicationPackageManager") + +/** + * 获得 [ActivityThread] 类型 + * @return [Class] + */ +val ActivityThreadClass get() = classOf(name = "android.app.ActivityThread") + +/** + * 获得 [IPackageManager] 类型 + * @return [Class] + */ +val IPackageManagerClass get() = classOf(name = "android.content.pm.IPackageManager") + +/** + * 获得 [LoadedApk] 类型 + * @return [Class] + */ +val LoadedApkClass get() = classOf(name = "android.app.LoadedApk") /** * 获得 [Activity] 类型 @@ -59,10 +104,28 @@ val ContextImplClass get() = ("android.app.ContextImpl").clazz val ActivityClass get() = Activity::class.java /** - * 获得 [Fragment] 类型 + * 获得 [Fragment] 类型 - Support * @return [Class] */ -val FragmentClass get() = ("androidx.fragment.app.Fragment").clazz +val FragmentClass_AndroidSupport get() = classOf(name = "android.support.v4.app.Fragment") + +/** + * 获得 [Fragment] 类型 - AndroidX + * @return [Class] + */ +val FragmentClass_AndroidX get() = classOf(name = "androidx.fragment.app.Fragment") + +/** + * 获得 [FragmentActivity] 类型 - Support + * @return [Class] + */ +val FragmentActivityClass_AndroidSupport get() = classOf(name = "android.support.v4.app.FragmentActivity") + +/** + * 获得 [FragmentActivity] 类型 - AndroidX + * @return [Class] + */ +val FragmentActivityClass_AndroidX get() = classOf(name = "androidx.fragment.app.FragmentActivity") /** * 获得 [Service] 类型 @@ -88,12 +151,6 @@ val BundleClass get() = Bundle::class.java */ val ResourcesClass get() = Resources::class.java -/** - * 获得 [Application] 类型 - * @return [Class] - */ -val ApplicationClass get() = Application::class.java - /** * 获得 [ContentResolver] 类型 * @return [Class] @@ -104,4 +161,206 @@ val ContentResolverClass get() = ContentResolver::class.java * 获得 [ContentProvider] 类型 * @return [Class] */ -val ContentProviderClass get() = ContentProvider::class.java \ No newline at end of file +val ContentProviderClass get() = ContentProvider::class.java + +/** + * 获得 [ArrayMap] 类型 + * @return [Class] + */ +val ArrayMapClass get() = ArrayMap::class.java + +/** + * 获得 [ArraySet] 类型 + * @return [Class] + * + * ❗在 Android M (23) 及以上系统加入 + */ +val ArraySetClass get() = ArraySet::class.java + +/** + * 获得 [Handler] 类型 + * @return [Class] + */ +val HandlerClass get() = Handler::class.java + +/** + * 获得 [Handler.Callback] 类型 + * @return [Class] + */ +val Handler_CallbackClass get() = Handler.Callback::class.java + +/** + * 获得 [Message] 类型 + * @return [Class] + */ +val MessageClass get() = Message::class.java + +/** + * 获得 [AsyncTask] 类型 + * @return [Class] + */ +val AsyncTaskClass get() = AsyncTask::class.java + +/** + * 获得 [SimpleDateFormat] 类型 + * + * ❗在 Android N (24) 及以上系统加入 + * @return [Class] + */ +val SimpleDateFormatClass_Android get() = SimpleDateFormat::class.java + +/** + * 获得 [Base64] 类型 + * @return [Class] + */ +val Base64Class_Android get() = Base64::class.java + +/** + * 获得 [WindowManager] 类型 + * @return [Class] + */ +val WindowManagerClass get() = WindowManager::class.java + +/** + * 获得 [Parcelable] 类型 + * @return [Class] + */ +val ParcelableClass get() = Parcelable::class.java + +/** + * 获得 [Parcelable.Creator] 类型 + * @return [Class] + */ +val Parcelable_CreatorClass get() = Parcelable.Creator::class.java + +/** + * 获得 [Dialog] 类型 + * @return [Class] + */ +val DialogClass get() = Dialog::class.java + +/** + * 获得 [AlertDialog] 类型 + * @return [Class] + */ +val AlertDialogClass get() = AlertDialog::class.java + +/** + * 获得 [DisplayMetrics] 类型 + * @return [Class] + */ +val DisplayMetricsClass get() = DisplayMetrics::class.java + +/** + * 获得 [Display] 类型 + * @return [Class] + */ +val DisplayClass get() = Display::class.java + +/** + * 获得 [Toast] 类型 + * @return [Class] + */ +val ToastClass get() = Toast::class.java + +/** + * 获得 [Intent] 类型 + * @return [Class] + */ +val IntentClass get() = Intent::class.java + +/** + * 获得 [ColorStateList] 类型 + * @return [Class] + */ +val ColorStateListClass get() = ColorStateList::class.java + +/** + * 获得 [ContentValues] 类型 + * @return [Class] + */ +val ContentValuesClass get() = ContentValues::class.java + +/** + * 获得 [SharedPreferences] 类型 + * @return [Class] + */ +val SharedPreferencesClass get() = SharedPreferences::class.java + +/** + * 获得 [SpannableStringBuilder] 类型 + * @return [Class] + */ +val SpannableStringBuilderClass get() = SpannableStringBuilder::class.java + +/** + * 获得 [Window] 类型 + * @return [Class] + */ +val WindowClass get() = Window::class.java + +/** + * 获得 [MediaPlayer] 类型 + * @return [Class] + */ +val MediaPlayerClass get() = MediaPlayer::class.java + +/** + * 获得 [ProgressDialog] 类型 + * @return [Class] + */ +val ProgressDialogClass get() = ProgressDialog::class.java + +/** + * 获得 [Build] 类型 + * @return [Class] + */ +val BuildClass get() = Build::class.java + +/** + * 获得 [ContrastColorUtil] 类型 + * @return [Class] + */ +val ContrastColorUtilClass get() = classOf(name = "com.android.internal.util.ContrastColorUtil") + +/** + * 获得 [DialogInterface] 类型 + * @return [Class] + */ +val DialogInterfaceClass get() = DialogInterface::class.java + +/** + * 获得 [StatusBarNotification] 类型 + * @return [Class] + */ +val StatusBarNotificationClass get() = StatusBarNotification::class.java + +/** + * 获得 [Notification] 类型 + * @return [Class] + */ +val NotificationClass get() = Notification::class.java + +/** + * 获得 [Notification.Builder] 类型 + * @return [Class] + */ +val Notification_BuilderClass get() = Notification.Builder::class.java + +/** + * 获得 [DialogInterface.OnClickListener] 类型 + * @return [Class] + */ +val DialogInterface_OnClickListenerClass get() = DialogInterface.OnClickListener::class.java + +/** + * 获得 [DialogInterface.OnCancelListener] 类型 + * @return [Class] + */ +val DialogInterface_OnCancelListenerClass get() = DialogInterface.OnCancelListener::class.java + +/** + * 获得 [DialogInterface.OnDismissListener] 类型 + * @return [Class] + */ +val DialogInterface_OnDismissListenerClass get() = DialogInterface.OnDismissListener::class.java \ No newline at end of file diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.kt new file mode 100644 index 00000000..b774809c --- /dev/null +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.kt @@ -0,0 +1,156 @@ +/* + * YukiHookAPI - An efficient Kotlin version of the Xposed Hook API. + * Copyright (C) 2019-2022 HighCapable + * https://github.com/fankes/YukiHookAPI + * + * MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * This file is Created by fankes on 2022/2/13. + */ +@file:Suppress("unused", "KDocUnresolvedReference", "NewApi") + +package com.highcapable.yukihookapi.hook.type.android + +import android.graphics.* +import android.graphics.drawable.* +import android.text.* + +/** + * 获得 [Typeface] 类型 + * @return [Class] + */ +val TypefaceClass get() = Typeface::class.java + +/** + * 获得 [Bitmap] 类型 + * @return [Class] + */ +val BitmapClass get() = Bitmap::class.java + +/** + * 获得 [Drawable] 类型 + * @return [Class] + */ +val DrawableClass get() = Drawable::class.java + +/** + * 获得 [Icon] 类型 + * + * ❗在 Android M (23) 及以上系统加入 + * @return [Class] + */ +val IconClass get() = Icon::class.java + +/** + * 获得 [GradientDrawable] 类型 + * @return [Class] + */ +val GradientDrawableClass get() = GradientDrawable::class.java + +/** + * 获得 [ColorDrawable] 类型 + * @return [Class] + */ +val ColorDrawableClass get() = ColorDrawable::class.java + +/** + * 获得 [BitmapDrawable] 类型 + * @return [Class] + */ +val BitmapDrawableClass get() = BitmapDrawable::class.java + +/** + * 获得 [Rect] 类型 + * @return [Class] + */ +val RectClass get() = Rect::class.java + +/** + * 获得 [NinePatch] 类型 + * @return [Class] + */ +val NinePatchClass get() = NinePatch::class.java + +/** + * 获得 [Paint] 类型 + * @return [Class] + */ +val PaintClass get() = Paint::class.java + +/** + * 获得 [TextPaint] 类型 + * @return [Class] + */ +val TextPaintClass get() = TextPaint::class.java + +/** + * 获得 [Canvas] 类型 + * @return [Class] + */ +val CanvasClass get() = Canvas::class.java + +/** + * 获得 [Point] 类型 + * @return [Class] + */ +val PointClass get() = Point::class.java + +/** + * 获得 [Editable] 类型 + * @return [Class] + */ +val EditableClass get() = Editable::class.java + +/** + * 获得 [TextWatcher] 类型 + * @return [Class] + */ +val TextWatcherClass get() = TextWatcher::class.java + +/** + * 获得 [Editable.Factory] 类型 + * @return [Class] + */ +val Editable_FactoryClass get() = Editable.Factory::class.java + +/** + * 获得 [GetChars] 类型 + * @return [Class] + */ +val GetCharsClass get() = GetChars::class.java + +/** + * 获得 [Spannable] 类型 + * @return [Class] + */ +val SpannableClass get() = Spannable::class.java + +/** + * 获得 [BitmapFactory] 类型 + * @return [Class] + */ +val BitmapFactoryClass get() = BitmapFactory::class.java + +/** + * 获得 [BitmapFactory.Options] 类型 + * @return [Class] + */ +val BitmapFactory_OptionsClass get() = BitmapFactory.Options::class.java \ No newline at end of file diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.kt index f007b002..d234b10f 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.kt @@ -29,8 +29,9 @@ package com.highcapable.yukihookapi.hook.type.android -import android.view.View -import android.view.ViewGroup +import android.graphics.Outline +import android.util.AttributeSet +import android.view.* import android.widget.* /** @@ -79,4 +80,148 @@ val CheckBoxClass get() = CheckBox::class.java * 获得 [CompoundButton] 类型 * @return [Class] */ -val CompoundButtonClass get() = CompoundButton::class.java \ No newline at end of file +val CompoundButtonClass get() = CompoundButton::class.java + +/** + * 获得 [VideoView] 类型 + * @return [Class] + */ +val VideoViewClass get() = VideoView::class.java + +/** + * 获得 [ListView] 类型 + * @return [Class] + */ +val ListViewClass get() = ListView::class.java + +/** + * 获得 [LayoutInflater] 类型 + * @return [Class] + */ +val LayoutInflaterClass get() = LayoutInflater::class.java + +/** + * 获得 [ListAdapter] 类型 + * @return [Class] + */ +val ListAdapterClass get() = ListAdapter::class.java + +/** + * 获得 [ArrayAdapter] 类型 + * @return [Class] + */ +val ArrayAdapterClass get() = ArrayAdapter::class.java + +/** + * 获得 [BaseAdapter] 类型 + * @return [Class] + */ +val BaseAdapterClass get() = BaseAdapter::class.java + +/** + * 获得 [RelativeLayout] 类型 + * @return [Class] + */ +val RelativeLayoutClass get() = RelativeLayout::class.java + +/** + * 获得 [FrameLayout] 类型 + * @return [Class] + */ +val FrameLayoutClass get() = FrameLayout::class.java + +/** + * 获得 [LinearLayout] 类型 + * @return [Class] + */ +val LinearLayoutClass get() = LinearLayout::class.java + +/** + * 获得 [ViewGroup.LayoutParams] 类型 + * @return [Class] + */ +val ViewGroup_LayoutParamsClass get() = ViewGroup.LayoutParams::class.java + +/** + * 获得 [RelativeLayout.LayoutParams] 类型 + * @return [Class] + */ +val RelativeLayout_LayoutParamsClass get() = RelativeLayout.LayoutParams::class.java + +/** + * 获得 [LinearLayout.LayoutParams] 类型 + * @return [Class] + */ +val LinearLayout_LayoutParamsClass get() = LinearLayout.LayoutParams::class.java + +/** + * 获得 [FrameLayout.LayoutParams] 类型 + * @return [Class] + */ +val FrameLayout_LayoutParamsClass get() = FrameLayout.LayoutParams::class.java + +/** + * 获得 [Outline] 类型 + * @return [Class] + */ +val OutlineClass get() = Outline::class.java + +/** + * 获得 [View.OnClickListener] 类型 + * @return [Class] + */ +val View_OnClickListenerClass get() = View.OnClickListener::class.java + +/** + * 获得 [View.OnLongClickListener] 类型 + * @return [Class] + */ +val View_OnLongClickListenerClass get() = View.OnLongClickListener::class.java + +/** + * 获得 [View.OnTouchListener] 类型 + * @return [Class] + */ +val View_OnTouchListenerClass get() = View.OnTouchListener::class.java + +/** + * 获得 [AutoCompleteTextView] 类型 + * @return [Class] + */ +val AutoCompleteTextViewClass get() = AutoCompleteTextView::class.java + +/** + * 获得 [ViewStub] 类型 + * @return [Class] + */ +val ViewStubClass get() = ViewStub::class.java + +/** + * 获得 [ViewStub.OnInflateListener] 类型 + * @return [Class] + */ +val ViewStub_OnInflateListenerClass get() = ViewStub.OnInflateListener::class.java + +/** + * 获得 [GestureDetector] 类型 + * @return [Class] + */ +val GestureDetectorClass get() = GestureDetector::class.java + +/** + * 获得 [GestureDetector.SimpleOnGestureListener] 类型 + * @return [Class] + */ +val GestureDetector_SimpleOnGestureListenerClass get() = GestureDetector.SimpleOnGestureListener::class.java + +/** + * 获得 [ProgressBar] 类型 + * @return [Class] + */ +val ProgressBarClass get() = ProgressBar::class.java + +/** + * 获得 [AttributeSet] 类型 + * @return [Class] + */ +val AttributeSetClass get() = AttributeSet::class.java \ No newline at end of file diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.kt index 6e5f7c9e..87d4f426 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.kt @@ -25,11 +25,38 @@ * * This file is Created by fankes on 2022/2/2. */ -@file:Suppress("unused") +@file:Suppress("unused", "KDocUnresolvedReference", "DEPRECATION", "FunctionName", "NewApi") package com.highcapable.yukihookapi.hook.type.java -import java.io.Serializable +import org.json.JSONArray +import org.json.JSONObject +import java.io.* +import java.lang.ref.Reference +import java.lang.ref.WeakReference +import java.lang.reflect.Constructor +import java.lang.reflect.Field +import java.lang.reflect.Member +import java.lang.reflect.Method +import java.net.HttpCookie +import java.net.HttpURLConnection +import java.net.http.HttpClient +import java.text.SimpleDateFormat +import java.util.* +import java.util.concurrent.atomic.AtomicBoolean +import java.util.zip.ZipEntry +import java.util.zip.ZipFile +import java.util.zip.ZipInputStream +import java.util.zip.ZipOutputStream + +/** + * 任意类型的数组 + * + * Java 中的表示:array[] + * @param type 类型 + * @return [Class] + */ +fun AnyArrayClass(type: Class<*>) = java.lang.reflect.Array.newInstance(type, 0).javaClass /** * 获得 [Any] 类型 @@ -53,31 +80,31 @@ val BooleanType get() = Boolean::class.java * 获得 [Int] 类型 * @return [Class] */ -val IntType get() = Int::class.javaPrimitiveType +val IntType get() = Int::class.javaPrimitiveType ?: UnitType /** * 获得 [Long] 类型 * @return [Class] */ -val LongType get() = Long::class.javaPrimitiveType +val LongType get() = Long::class.javaPrimitiveType ?: UnitType /** * 获得 [Short] 类型 * @return [Class] */ -val ShortType get() = Short::class.javaPrimitiveType +val ShortType get() = Short::class.javaPrimitiveType ?: UnitType /** * 获得 [Float] 类型 * @return [Class] */ -val FloatType get() = Float::class.javaPrimitiveType +val FloatType get() = Float::class.javaPrimitiveType ?: UnitType /** * 获得 [Double] 类型 * @return [Class] */ -val DoubleType get() = Double::class.javaPrimitiveType +val DoubleType get() = Double::class.javaPrimitiveType ?: UnitType /** * 获得 [String] 类型 @@ -101,4 +128,326 @@ val CharSequenceType get() = CharSequence::class.java * 获得 [Serializable] 类型 * @return [Class] */ -val SerializableClass get() = Serializable::class.java \ No newline at end of file +val SerializableClass get() = Serializable::class.java + +/** + * 获得 [Byte] 类型 + * @return [Class] + */ +val ByteClass get() = Byte::class.java + +/** + * 获得 [Array] 类型 + * @return [Class] + */ +val ArrayClass get() = Array::class.java + +/** + * 获得 [Byte] - [Array] 类型 + * + * Java 中表示:byte[] + * @return [Class] + */ +val ByteArrayClass get() = AnyArrayClass(ByteClass) + +/** + * 获得 [Int] - [Array] 类型 + * + * Java 中表示:int[] + * @return [Class] + */ +val IntArrayClass get() = AnyArrayClass(IntType) + +/** + * 获得 [String] - [Array] 类型 + * + * Java 中表示:String[] + * @return [Class] + */ +val StringArrayClass get() = AnyArrayClass(StringType) + +/** + * 获得 [Long] - [Array] 类型 + * + * Java 中表示:long[] + * @return [Class] + */ +val LongArrayClass get() = AnyArrayClass(LongType) + +/** + * 获得 [Short] - [Array] 类型 + * + * Java 中表示:short[] + * @return [Class] + */ +val ShortArrayClass get() = AnyArrayClass(ShortType) + +/** + * 获得 [Float] - [Array] 类型 + * + * Java 中表示:float[] + * @return [Class] + */ +val FloatArrayClass get() = AnyArrayClass(FloatType) + +/** + * 获得 [Double] - [Array] 类型 + * + * Java 中表示:double[] + * @return [Class] + */ +val DoubleArrayClass get() = AnyArrayClass(DoubleType) + +/** + * 获得 [Cloneable] 类型 + * @return [Class] + */ +val CloneableClass get() = Cloneable::class.java + +/** + * 获得 [List] 类型 + * @return [Class] + */ +val ListClass get() = List::class.java + +/** + * 获得 [ArrayList] 类型 + * @return [Class] + */ +val ArrayListClass get() = ArrayList::class.java + +/** + * 获得 [HashMap] 类型 + * @return [Class] + */ +val HashMapClass get() = HashMap::class.java + +/** + * 获得 [HashSet] 类型 + * @return [Class] + */ +val HashSetClass get() = HashSet::class.java + +/** + * 获得 [WeakHashMap] 类型 + * @return [Class] + */ +val WeakHashMapClass get() = WeakHashMap::class.java + +/** + * 获得 [WeakReference] 类型 + * @return [Class] + */ +val WeakReferenceClass get() = WeakReference::class.java + +/** + * 获得 [Map] 类型 + * @return [Class] + */ +val MapClass get() = Map::class.java + +/** + * 获得 [Map.Entry] 类型 + * @return [Class] + */ +val Map_EntryClass get() = Map.Entry::class.java + +/** + * 获得 [Reference] 类型 + * @return [Class] + */ +val ReferenceClass get() = Reference::class.java + +/** + * 获得 [Vector] 类型 + * @return [Class] + */ +val VectorClass get() = Vector::class.java + +/** + * 获得 [File] 类型 + * @return [Class] + */ +val FileClass get() = File::class.java + +/** + * 获得 [InputStream] 类型 + * @return [Class] + */ +val InputStreamClass get() = InputStream::class.java + +/** + * 获得 [OutputStream] 类型 + * @return [Class] + */ +val OutputStreamClass get() = OutputStream::class.java + +/** + * 获得 [BufferedReader] 类型 + * @return [Class] + */ +val BufferedReaderClass get() = BufferedReader::class.java + +/** + * 获得 [Date] 类型 + * @return [Class] + */ +val DateClass get() = Date::class.java + +/** + * 获得 [TimeZone] 类型 + * @return [Class] + */ +val TimeZoneClass get() = TimeZone::class.java + +/** + * 获得 [SimpleDateFormat] 类型 + * @return [Class] + */ +val SimpleDateFormatClass_Java get() = SimpleDateFormat::class.java + +/** + * 获得 [Timer] 类型 + * @return [Class] + */ +val TimerClass get() = Timer::class.java + +/** + * 获得 [TimerTask] 类型 + * @return [Class] + */ +val TimerTaskClass get() = TimerTask::class.java + +/** + * 获得 [Thread] 类型 + * @return [Class] + */ +val ThreadClass get() = Thread::class.java + +/** + * 获得 [Base64] 类型 + * + * ❗在 Android O (26) 及以上系统加入 + * @return [Class] + */ +val Base64Class_Java get() = Base64::class.java + +/** + * 获得 [Observer] 类型 + * @return [Class] + */ +val ObserverClass get() = Observer::class.java + +/** + * 获得 [Set] 类型 + * @return [Class] + */ +val SetClass get() = Set::class.java + +/** + * 获得 [JSONObject] 类型 + * @return [Class] + */ +val JSONObjectClass get() = JSONObject::class.java + +/** + * 获得 [JSONArray] 类型 + * @return [Class] + */ +val JSONArrayClass get() = JSONArray::class.java + +/** + * 获得 [StringBuilder] 类型 + * @return [Class] + */ +val StringBuilderClass get() = StringBuilder::class.java + +/** + * 获得 [StringBuffer] 类型 + * @return [Class] + */ +val StringBufferClass get() = StringBuffer::class.java + +/** + * 获得 [ZipEntry] 类型 + * @return [Class] + */ +val ZipEntryClass get() = ZipEntry::class.java + +/** + * 获得 [ZipFile] 类型 + * @return [Class] + */ +val ZipFileClass get() = ZipFile::class.java + +/** + * 获得 [ZipInputStream] 类型 + * @return [Class] + */ +val ZipInputStreamClass get() = ZipInputStream::class.java + +/** + * 获得 [ZipOutputStream] 类型 + * @return [Class] + */ +val ZipOutputStreamClass get() = ZipOutputStream::class.java + +/** + * 获得 [HttpURLConnection] 类型 + * @return [Class] + */ +val HttpURLConnectionClass get() = HttpURLConnection::class.java + +/** + * 获得 [HttpCookie] 类型 + * @return [Class] + */ +val HttpCookieClass get() = HttpCookie::class.java + +/** + * 获得 [HttpClient] 类型 + * @return [Class] + */ +val HttpClientClass get() = HttpClient::class.java + +/** + * 获得 [AtomicBoolean] 类型 + * @return [Class] + */ +val AtomicBooleanClass get() = AtomicBoolean::class.java + +/** + * 获得 [Class] 类型 + * @return [Class] + */ +val JavaClass get() = Class::class.java + +/** + * 获得 [Method] 类型 + * @return [Class] + */ +val JavaMethodClass get() = Method::class.java + +/** + * 获得 [Field] 类型 + * @return [Class] + */ +val JavaFieldClass get() = Field::class.java + +/** + * 获得 [Constructor] 类型 + * @return [Class] + */ +val JavaConstructorClass get() = Constructor::class.java + +/** + * 获得 [Member] 类型 + * @return [Class] + */ +val JavaMemberClass get() = Member::class.java + +/** + * 获得 [Annotation] 类型 + * @return [Class] + */ +val JavaAnnotationClass get() = Annotation::class.java \ No newline at end of file