This commit is contained in:
2022-02-13 11:36:04 +08:00
parent 6a9741ed33
commit d545fb043f
7 changed files with 228 additions and 29 deletions

View File

@@ -66,6 +66,13 @@ object YukiHookAPI {
@DoNotUseField
var modulePackageName = ""
/**
* 标识是否从自定义 Hook API 装载
*
* - ❗这是私有 API - 请勿手动修改 - 否则会导致功能判断错误
*/
internal var isLoadedFromBaseContext = false
/**
* 配置 YukiHookAPI
*/
@@ -129,6 +136,7 @@ object YukiHookAPI {
* @param initiate Hook 方法体
*/
fun encase(initiate: PackageParam.() -> Unit) {
isLoadedFromBaseContext = false
if (hasXposedBridge)
packageParamCallback = initiate
else printNoXposedBridge()
@@ -144,6 +152,7 @@ object YukiHookAPI {
* @throws IllegalStateException 如果 [hooker] 是空的
*/
fun encase(vararg hooker: YukiBaseHooker) {
isLoadedFromBaseContext = false
if (hasXposedBridge)
packageParamCallback = {
if (hooker.isNotEmpty())
@@ -167,6 +176,7 @@ object YukiHookAPI {
* @param initiate Hook 方法体
*/
fun encase(baseContext: Context?, initiate: PackageParam.() -> Unit) {
isLoadedFromBaseContext = true
if (hasXposedBridge)
(if (baseContext != null) initiate.invoke(baseContext.packagePararm))
else printNoXposedBridge()
@@ -187,6 +197,7 @@ object YukiHookAPI {
* @throws IllegalStateException 如果 [hooker] 是空的
*/
fun encase(baseContext: Context?, vararg hooker: YukiBaseHooker) {
isLoadedFromBaseContext = true
if (hasXposedBridge)
(if (baseContext != null)
if (hooker.isNotEmpty())

View File

@@ -164,7 +164,7 @@ fun Class<*>.obtainConstructor(vararg paramType: Class<*>): Constructor<out Any>
*/
inline fun <reified T> Method.invokeStatic(vararg param: Any?) =
if (param.isNotEmpty())
invoke(null, param) as? T? ?: error("Method ReturnType cannot cast to ${T::class.java}")
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}")
/**
@@ -176,5 +176,5 @@ inline fun <reified T> Method.invokeStatic(vararg param: Any?) =
*/
inline fun <reified T> Method.invokeAny(any: Any?, vararg param: Any?) =
if (param.isNotEmpty())
invoke(any, param) as? T? ?: error("Method ReturnType cannot cast to ${T::class.java}")
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}")

View File

@@ -39,16 +39,19 @@ 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.util.*
import android.view.Display
import android.view.Window
import android.view.WindowManager
import android.widget.Toast
import com.highcapable.yukihookapi.hook.factory.classOf
/**
* 获得 [android.R] 类型
* @return [Class]
*/
val AndroidRClass get() = android.R::class.java
/**
* 获得 [Context] 类型
* @return [Class]
@@ -103,6 +106,12 @@ val LoadedApkClass get() = classOf(name = "android.app.LoadedApk")
*/
val ActivityClass get() = Activity::class.java
/**
* 获得 [Looper] 类型
* @return [Class]
*/
val LooperClass get() = Looper::class.java
/**
* 获得 [Fragment] 类型 - Support
* @return [Class]
@@ -127,12 +136,30 @@ val FragmentActivityClass_AndroidSupport get() = classOf(name = "android.support
*/
val FragmentActivityClass_AndroidX get() = classOf(name = "androidx.fragment.app.FragmentActivity")
/**
* 获得 [DocumentFile] 类型 - AndroidX
* @return [Class]
*/
val DocumentFileClass get() = classOf(name = "androidx.documentfile.provider.DocumentFile")
/**
* 获得 [Service] 类型
* @return [Class]
*/
val ServiceClass get() = Service::class.java
/**
* 获得 [Binder] 类型
* @return [Class]
*/
val BinderClass get() = Binder::class.java
/**
* 获得 [IBinder] 类型
* @return [Class]
*/
val IBinderClass get() = IBinder::class.java
/**
* 获得 [BroadcastReceiver] 类型
* @return [Class]
@@ -145,6 +172,12 @@ val BroadcastReceiverClass get() = BroadcastReceiver::class.java
*/
val BundleClass get() = Bundle::class.java
/**
* 获得 [BaseBundle] 类型
* @return [Class]
*/
val BaseBundleClass get() = BaseBundle::class.java
/**
* 获得 [Resources] 类型
* @return [Class]
@@ -195,6 +228,18 @@ val Handler_CallbackClass get() = Handler.Callback::class.java
*/
val MessageClass get() = Message::class.java
/**
* 获得 [MessageQueue] 类型
* @return [Class]
*/
val MessageQueueClass get() = MessageQueue::class.java
/**
* 获得 [Messenger] 类型
* @return [Class]
*/
val MessengerClass get() = Messenger::class.java
/**
* 获得 [AsyncTask] 类型
* @return [Class]
@@ -215,12 +260,24 @@ val SimpleDateFormatClass_Android get() = SimpleDateFormat::class.java
*/
val Base64Class_Android get() = Base64::class.java
/**
* 获得 [Window] 类型
* @return [Class]
*/
val WindowClass get() = Window::class.java
/**
* 获得 [WindowManager] 类型
* @return [Class]
*/
val WindowManagerClass get() = WindowManager::class.java
/**
* 获得 [Parcel] 类型
* @return [Class]
*/
val ParcelClass get() = Parcel::class.java
/**
* 获得 [Parcelable] 类型
* @return [Class]
@@ -293,12 +350,6 @@ val SharedPreferencesClass get() = SharedPreferences::class.java
*/
val SpannableStringBuilderClass get() = SpannableStringBuilder::class.java
/**
* 获得 [Window] 类型
* @return [Class]
*/
val WindowClass get() = Window::class.java
/**
* 获得 [MediaPlayer] 类型
* @return [Class]
@@ -311,24 +362,30 @@ val MediaPlayerClass get() = MediaPlayer::class.java
*/
val ProgressDialogClass get() = ProgressDialog::class.java
/**
* 获得 [Log] 类型
* @return [Class]
*/
val LogClass get() = Log::class.java
/**
* 获得 [Build] 类型
* @return [Class]
*/
val BuildClass get() = Build::class.java
/**
* 获得 [Xml] 类型
* @return [Class]
*/
val XmlClass get() = Xml::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]
@@ -347,6 +404,12 @@ val NotificationClass get() = Notification::class.java
*/
val Notification_BuilderClass get() = Notification.Builder::class.java
/**
* 获得 [DialogInterface] 类型
* @return [Class]
*/
val DialogInterfaceClass get() = DialogInterface::class.java
/**
* 获得 [DialogInterface.OnClickListener] 类型
* @return [Class]
@@ -363,4 +426,56 @@ val DialogInterface_OnCancelListenerClass get() = DialogInterface.OnCancelListen
* 获得 [DialogInterface.OnDismissListener] 类型
* @return [Class]
*/
val DialogInterface_OnDismissListenerClass get() = DialogInterface.OnDismissListener::class.java
val DialogInterface_OnDismissListenerClass get() = DialogInterface.OnDismissListener::class.java
/**
* 获得 [Environment] 类型
* @return [Class]
*/
val EnvironmentClass get() = Environment::class.java
/**
* 获得 [Process] 类型
* @return [Class]
*/
val ProcessClass get() = Process::class.java
/**
* 获得 [Vibrator] 类型
* @return [Class]
*/
val VibratorClass get() = Vibrator::class.java
/**
* 获得 [VibrationEffect] 类型
*
* ❗在 Android O (26) 及以上系统加入
* @return [Class]
*/
val VibrationEffectClass get() = VibrationEffect::class.java
/**
* 获得 [VibrationAttributes] 类型
*
* ❗在 Android R (30) 及以上系统加入
* @return [Class]
*/
val VibrationAttributesClass get() = VibrationAttributes::class.java
/**
* 获得 [SystemClock] 类型
* @return [Class]
*/
val SystemClockClass get() = SystemClock::class.java
/**
* 获得 [PowerManager] 类型
* @return [Class]
*/
val PowerManagerClass get() = PowerManager::class.java
/**
* 获得 [PowerManager.WakeLock] 类型
* @return [Class]
*/
val PowerManager_WakeLockClass get() = PowerManager.WakeLock::class.java

View File

@@ -45,12 +45,6 @@ val TypefaceClass get() = Typeface::class.java
*/
val BitmapClass get() = Bitmap::class.java
/**
* 获得 [Drawable] 类型
* @return [Class]
*/
val DrawableClass get() = Drawable::class.java
/**
* 获得 [Icon] 类型
*
@@ -59,6 +53,18 @@ val DrawableClass get() = Drawable::class.java
*/
val IconClass get() = Icon::class.java
/**
* 获得 [Outline] 类型
* @return [Class]
*/
val OutlineClass get() = Outline::class.java
/**
* 获得 [Drawable] 类型
* @return [Class]
*/
val DrawableClass get() = Drawable::class.java
/**
* 获得 [GradientDrawable] 类型
* @return [Class]

View File

@@ -29,7 +29,6 @@
package com.highcapable.yukihookapi.hook.type.android
import android.graphics.Outline
import android.util.AttributeSet
import android.view.*
import android.widget.*
@@ -161,10 +160,10 @@ val LinearLayout_LayoutParamsClass get() = LinearLayout.LayoutParams::class.java
val FrameLayout_LayoutParamsClass get() = FrameLayout.LayoutParams::class.java
/**
* 获得 [Outline] 类型
* 获得 [TextClock] 类型
* @return [Class]
*/
val OutlineClass get() = Outline::class.java
val TextClockClass get() = TextClock::class.java
/**
* 获得 [View.OnClickListener] 类型

View File

@@ -450,4 +450,64 @@ val JavaMemberClass get() = Member::class.java
* 获得 [Annotation] 类型
* @return [Class]
*/
val JavaAnnotationClass get() = Annotation::class.java
val JavaAnnotationClass get() = Annotation::class.java
/**
* 获得 [Runtime] 类型
* @return [Class]
*/
val RuntimeClass get() = Runtime::class.java
/**
* 获得 [NullPointerException] 类型
* @return [Class]
*/
val NullPointerExceptionClass get() = NullPointerException::class.java
/**
* 获得 [NumberFormatException] 类型
* @return [Class]
*/
val NumberFormatExceptionClass get() = NumberFormatException::class.java
/**
* 获得 [IllegalStateException] 类型
* @return [Class]
*/
val IllegalStateExceptionClass get() = IllegalStateException::class.java
/**
* 获得 [RuntimeException] 类型
* @return [Class]
*/
val RuntimeExceptionClass get() = RuntimeException::class.java
/**
* 获得 [NoSuchMethodError] 类型
* @return [Class]
*/
val NoSuchMethodErrorClass get() = NoSuchMethodError::class.java
/**
* 获得 [NoSuchFieldError] 类型
* @return [Class]
*/
val NoSuchFieldErrorClass get() = NoSuchFieldError::class.java
/**
* 获得 [Error] 类型
* @return [Class]
*/
val ErrorClass get() = Error::class.java
/**
* 获得 [Exception] 类型
* @return [Class]
*/
val ExceptionClass get() = Exception::class.java
/**
* 获得 [Throwable] 类型
* @return [Class]
*/
val ThrowableClass get() = Throwable::class.java

View File

@@ -79,12 +79,18 @@ class YukiHookModulePrefs(private val context: Context? = null) {
/** 缓存数据 */
private var xPrefCacheKeyValueFloats = HashMap<String, Float>()
/** 检查是否处于自定义 Hook API 状态 */
private fun checkApiInBaseContext() {
if (YukiHookAPI.isLoadedFromBaseContext) error("YukiHookModulePrefs not allowed in Custom Hook API")
}
/**
* 获得 [XSharedPreferences] 对象
* @return [XSharedPreferences]
*/
private val xPref
get() = XSharedPreferences(YukiHookAPI.modulePackageName, prefsName).apply {
checkApiInBaseContext()
makeWorldReadable()
reload()
}
@@ -95,9 +101,11 @@ class YukiHookModulePrefs(private val context: Context? = null) {
*/
private val sPref
get() = try {
checkApiInBaseContext()
context?.getSharedPreferences(prefsName, Context.MODE_WORLD_READABLE)
?: error("If you want to use module prefs,you must set the context instance first")
} catch (_: Throwable) {
checkApiInBaseContext()
context?.getSharedPreferences(prefsName, Context.MODE_PRIVATE)
?: error("If you want to use module prefs,you must set the context instance first")
}