import{_ as l,r as e,o,c as p,b as s,d as c,a as t,e as n}from"./app.fb8271cf.js";const i={},r=t(`
\u8FD9\u662F\u4E00\u4E2A\u5C06\u6A21\u5757\u8D44\u6E90\u3001
Activity
\u7EC4\u4EF6\u4EE5\u53CAContext
\u4E3B\u9898\u6CE8\u5165\u5230\u5BBF\u4E3B\u7684\u6269\u5C55\u529F\u80FD\u3002
\u5728\u4F7F\u7528\u4EE5\u4E0B\u529F\u80FD\u4E4B\u524D\uFF0C\u4E3A\u9632\u6B62\u8D44\u6E90 ID \u4E92\u76F8\u51B2\u7A81\uFF0C\u4F60\u9700\u8981\u5728\u5F53\u524D Xposed \u6A21\u5757\u9879\u76EE\u7684 build.gradle
\u4E2D\u4FEE\u6539\u8D44\u6E90 ID\u3002
android {
androidResources.additionalParameters("--allow-reserved-package-id", "--package-id", "0x64")
}
android {
aaptOptions.additionalParameters '--allow-reserved-package-id', '--package-id', '0x64'
}
\u6CE8\u610F
\u63D0\u4F9B\u7684\u793A\u4F8B\u8D44\u6E90 ID \u503C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u4E0D\u53EF\u4F7F\u7528 0x7f\uFF0C\u9ED8\u8BA4\u4E3A 0x64\uFF0C\u4E3A\u4E86\u9632\u6B62\u5F53\u524D\u5BBF\u4E3B\u5B58\u5728\u591A\u4E2A Xposed \u6A21\u5757\uFF0C\u5EFA\u8BAE\u81EA\u5B9A\u4E49\u4F60\u81EA\u5DF1\u7684\u8D44\u6E90 ID\u3002
\u5728 Hook \u5BBF\u4E3B\u4E4B\u540E\uFF0C\u6211\u4EEC\u53EF\u4EE5\u76F4\u63A5\u5728 Hooker \u4E2D\u5F97\u5230\u7684 Context
\u6CE8\u5165\u5F53\u524D\u6A21\u5757\u8D44\u6E90\u3002
\u793A\u4F8B\u5982\u4E0B
injectMember {
method {
name = "onCreate"
param(BundleClass)
}
afterHook {
instance<Activity>().also {
// <\u65B9\u68481> \u901A\u8FC7 Context \u6CE8\u5165\u6A21\u5757\u8D44\u6E90
it.injectModuleAppResources()
// <\u65B9\u68482> \u76F4\u63A5\u5F97\u5230\u5BBF\u4E3B Resources \u6CE8\u5165\u6A21\u5757\u8D44\u6E90
it.resources.injectModuleAppResources()
// \u76F4\u63A5\u4F7F\u7528\u6A21\u5757\u8D44\u6E90 ID
it.getString(R.id.app_name)
}
}
}
\u4F60\u8FD8\u53EF\u4EE5\u76F4\u63A5\u5728 AppLifecycle
\u4E2D\u6CE8\u5165\u5F53\u524D\u6A21\u5757\u8D44\u6E90\u3002
\u793A\u4F8B\u5982\u4E0B
onAppLifecycle {
onCreate {
// \u5168\u5C40\u6CE8\u5165\u6A21\u5757\u8D44\u6E90\uFF0C\u4F46\u4EC5\u9650\u4E8E\u5168\u5C40\u751F\u547D\u5468\u671F
// \u7C7B\u4F3C ImageView.setImageResource \u8FD9\u6837\u7684\u65B9\u6CD5\u5728 Activity \u4E2D\u9700\u8981\u5355\u72EC\u6CE8\u5165
// <\u65B9\u68481> \u901A\u8FC7 Context \u6CE8\u5165\u6A21\u5757\u8D44\u6E90
injectModuleAppResources()
// <\u65B9\u68482> \u76F4\u63A5\u5F97\u5230\u5BBF\u4E3B Resources \u6CE8\u5165\u6A21\u5757\u8D44\u6E90
resources.injectModuleAppResources()
// \u76F4\u63A5\u4F7F\u7528\u6A21\u5757\u8D44\u6E90 ID
getString(R.id.app_name)
}
}
\u5C0F\u63D0\u793A
\u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 Context+Resources.injectModuleAppResources \u65B9\u6CD5\u3002
\u5728 Android \u7CFB\u7EDF\u4E2D\u6240\u6709\u5E94\u7528\u7684 Activity
\u542F\u52A8\u65F6\uFF0C\u90FD\u9700\u8981\u5728 AndroidManifest.xml
\u4E2D\u8FDB\u884C\u6CE8\u518C\uFF0C\u5728 Hook \u8FC7\u7A0B\u4E2D\uFF0C\u5982\u679C\u6211\u4EEC\u60F3\u901A\u8FC7\u5BBF\u4E3B\u6765\u76F4\u63A5\u542F\u52A8\u6A21\u5757\u4E2D\u672A\u6CE8\u518C\u7684 Activity
\u8981\u600E\u4E48\u505A\u5462\uFF1F
\u5728 Hook \u5BBF\u4E3B\u4E4B\u540E\uFF0C\u6211\u4EEC\u53EF\u4EE5\u76F4\u63A5\u5728 Hooker \u4E2D\u5F97\u5230\u7684 Context
\u6CE8\u518C\u5F53\u524D\u6A21\u5757\u7684 Activity
\u4EE3\u7406\u3002
\u793A\u4F8B\u5982\u4E0B
injectMember {
method {
name = "onCreate"
param(BundleClass)
}
afterHook {
instance<Activity>().registerModuleAppActivities()
}
}
\u4F60\u8FD8\u53EF\u4EE5\u76F4\u63A5\u5728 AppLifecycle
\u4E2D\u6CE8\u518C\u5F53\u524D\u6A21\u5757\u7684 Activity
\u4EE3\u7406\u3002
\u793A\u4F8B\u5982\u4E0B
onAppLifecycle {
onCreate {
registerModuleAppActivities()
}
}
\u5982\u679C\u6CA1\u6709\u586B\u5199 proxy
\u53C2\u6570\uFF0CAPI \u5C06\u4F1A\u6839\u636E\u5F53\u524D Context
\u81EA\u52A8\u83B7\u53D6\u5F53\u524D\u5BBF\u4E3B\u7684\u542F\u52A8\u5165\u53E3 Activity
\u8FDB\u884C\u4EE3\u7406\u3002
\u901A\u5E38\u60C5\u51B5\u4E0B\uFF0C\u5B83\u662F\u6709\u6548\u7684\uFF0C\u4F46\u662F\u4EE5\u4E0A\u60C5\u51B5\u5728\u4E00\u4E9B APP \u4E2D\u4F1A\u5931\u6548\uFF0C\u4F8B\u5982\u4E00\u4E9B Activity
\u4F1A\u5728\u6CE8\u518C\u6E05\u5355\u4E0A\u52A0\u5165\u542F\u52A8\u53C2\u6570\uFF0C\u90A3\u4E48\u6211\u4EEC\u5C31\u9700\u8981\u4F7F\u7528\u53E6\u4E00\u79CD\u89E3\u51B3\u65B9\u6848\u3002
\u82E5\u672A\u6CE8\u518C\u7684 Activity
\u4E0D\u80FD\u88AB\u6B63\u786E\u542F\u52A8\uFF0C\u6211\u4EEC\u53EF\u4EE5\u624B\u52A8\u62FF\u5230\u5BBF\u4E3B\u7684 AndroidManifest.xml
\u8FDB\u884C\u5206\u6790\uFF0C\u6765\u5F97\u5230\u4E00\u4E2A\u6CE8\u518C\u8FC7\u7684 Activity
\u6807\u7B7E\uFF0C\u83B7\u53D6\u5176\u4E2D\u7684 name
\u3002
\u4F60\u9700\u8981\u9009\u62E9\u4E00\u4E2A\u5F53\u524D\u5BBF\u4E3B\u53EF\u80FD\u7528\u4E0D\u5230\u7684\u3001\u4E0D\u9700\u8981\u7684 Activity
\u4F5C\u4E3A\u4E00\u4E2A\u201C\u5080\u5121\u201D\u5C06\u5176\u8FDB\u884C\u4EE3\u7406\uFF0C\u901A\u5E38\u662F\u6709\u6548\u7684\u3002
\u6BD4\u5982\u6211\u4EEC\u5DF2\u7ECF\u627E\u5230\u4E86\u80FD\u591F\u88AB\u4EE3\u7406\u7684\u5408\u9002 Activity
\u3002
\u793A\u4F8B\u5982\u4E0B
<activity
android:name="com.demo.test.activity.TestActivity"
...>
\u6839\u636E\u5176\u4E2D\u7684 name
\uFF0C\u6211\u4EEC\u53EA\u9700\u8981\u5728\u65B9\u6CD5\u4E2D\u52A0\u5165\u8FD9\u4E2A\u53C2\u6570\u8FDB\u884C\u6CE8\u518C\u5373\u53EF\u3002
\u793A\u4F8B\u5982\u4E0B
registerModuleAppActivities(proxy = "com.demo.test.activity.TestActivity")
\u53E6\u4E00\u79CD\u60C5\u51B5\uFF0C\u5982\u679C\u4F60\u5BF9\u5BBF\u4E3B\u7684\u7C7B\u7F16\u5199\u4E86\u4E00\u4E2A stub
\uFF0C\u90A3\u4E48\u4F60\u53EF\u4EE5\u76F4\u63A5\u901A\u8FC7 Class
\u5BF9\u8C61\u6765\u8FDB\u884C\u6CE8\u518C\u3002
\u793A\u4F8B\u5982\u4E0B
registerModuleAppActivities(TestActivity::class.java)
\u6CE8\u518C\u5B8C\u6210\u540E\uFF0C\u8BF7\u5C06\u4F60\u9700\u8981\u4F7F\u7528\u5BBF\u4E3B\u542F\u52A8\u7684\u6A21\u5757\u4E2D\u7684 Activity
\u7EE7\u627F\u4E8E ModuleAppActivity
\u6216 ModuleAppCompatActivity
\u3002
\u8FD9\u4E9B Activity
\u73B0\u5728\u65E0\u9700\u6CE8\u518C\u5373\u53EF\u65E0\u7F1D\u5B58\u6D3B\u4E8E\u5BBF\u4E3B\u4E2D\u3002
\u793A\u4F8B\u5982\u4E0B
class HostTestActivity : ModuleAppActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// \u6A21\u5757\u8D44\u6E90\u5DF2\u88AB\u81EA\u52A8\u6CE8\u5165\uFF0C\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 xml \u88C5\u8F7D\u5E03\u5C40
setContentView(R.layout.activity_main)
}
}
\u82E5\u4F60\u9700\u8981\u7EE7\u627F\u4E8E ModuleAppCompatActivity
\uFF0C\u4F60\u9700\u8981\u624B\u52A8\u8BBE\u7F6E AppCompat \u4E3B\u9898\u3002
\u793A\u4F8B\u5982\u4E0B
class HostTestActivity : ModuleAppCompatActivity() {
// \u8FD9\u91CC\u7684\u4E3B\u9898\u540D\u79F0\u4EC5\u4F9B\u53C2\u8003\uFF0C\u8BF7\u586B\u5199\u4F60\u6A21\u5757\u4E2D\u5DF2\u6709\u7684\u4E3B\u9898\u540D\u79F0
override val moduleTheme get() = R.style.Theme_AppCompat
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// \u6A21\u5757\u8D44\u6E90\u5DF2\u88AB\u81EA\u52A8\u6CE8\u5165\uFF0C\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528 xml \u88C5\u8F7D\u5E03\u5C40
setContentView(R.layout.activity_main)
}
}
\u4EE5\u4E0A\u6B65\u9AA4\u5168\u90E8\u5B8C\u6210\u540E\uFF0C\u4F60\u5C31\u53EF\u4EE5\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4EFB\u610F\u5B58\u5728 Context
\u7684\u5730\u65B9\u6109\u5FEB\u5730\u8C03\u7528 startActivity
\u4E86\u3002
\u793A\u4F8B\u5982\u4E0B
val context: Context = ... // \u5047\u8BBE\u8FD9\u5C31\u662F\u4F60\u7684 Context
context.startActivity(context, HostTestActivity::class.java)
\u5C0F\u63D0\u793A
\u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 Context.registerModuleAppActivities \u65B9\u6CD5\u3002
\u6709\u65F6\u5019\uFF0C\u6211\u4EEC\u9700\u8981\u4F7F\u7528 MaterialAlertDialogBuilder
\u6765\u7F8E\u5316\u81EA\u5DF1\u5728\u5BBF\u4E3B\u4E2D\u7684\u5BF9\u8BDD\u6846\uFF0C\u4F46\u662F\u62FF\u4E0D\u5230 AppCompat \u4E3B\u9898\u5C31\u65E0\u6CD5\u521B\u5EFA\u3002
The style on this component requires your app theme to be Theme.AppCompat (or a descendant).
\u8FD9\u65F6\uFF0C\u6211\u4EEC\u60F3\u5728\u5BBF\u4E3B\u88AB Hook \u7684\u5F53\u524D Activity
\u4E2D\u4F7F\u7528 MaterialAlertDialogBuilder
\u6765\u521B\u5EFA\u5BF9\u8BDD\u6846\uFF0C\u5C31\u53EF\u4EE5\u6709\u5982\u4E0B\u65B9\u6CD5\u3002
\u793A\u4F8B\u5982\u4E0B
injectMember {
method {
name = "onCreate"
param(BundleClass)
}
afterHook {
// \u4F7F\u7528 applyModuleTheme \u521B\u5EFA\u4E00\u4E2A\u5F53\u524D\u6A21\u5757\u4E2D\u7684\u4E3B\u9898\u8D44\u6E90
val appCompatContext = instance<Activity>().applyModuleTheme(R.style.Theme_AppCompat)
// \u76F4\u63A5\u4F7F\u7528\u8FD9\u4E2A\u5305\u88C5\u4E86\u6A21\u5757\u4E3B\u9898\u540E\u7684 Context \u521B\u5EFA\u5BF9\u8BDD\u6846
MaterialAlertDialogBuilder(appCompatContext)
.setTitle("AppCompat \u4E3B\u9898\u5BF9\u8BDD\u6846")
.setMessage("\u6211\u662F\u4E00\u4E2A\u5728\u5BBF\u4E3B\u4E2D\u663E\u793A\u7684 AppCompat \u4E3B\u9898\u5BF9\u8BDD\u6846\u3002")
.setPositiveButton("\u786E\u5B9A", null)
.show()
}
}
\u4F60\u8FD8\u53EF\u4EE5\u5BF9\u5F53\u524D Context
\u901A\u8FC7 uiMode
\u8BBE\u7F6E\u539F\u751F\u7684\u591C\u95F4\u6A21\u5F0F\u548C\u65E5\u95F4\u6A21\u5F0F\uFF0C\u81F3\u5C11\u9700\u8981 Android 10 \u53CA\u4EE5\u4E0A\u7CFB\u7EDF\u7248\u672C\u652F\u6301\u4E14\u5F53\u524D\u4E3B\u9898\u5305\u542B\u591C\u95F4\u6A21\u5F0F\u76F8\u5173\u5143\u7D20\u3002
\u793A\u4F8B\u5982\u4E0B
injectMember {
method {
name = "onCreate"
param(BundleClass)
}
afterHook {
// \u5B9A\u4E49\u5F53\u524D\u6A21\u5757\u4E2D\u7684\u4E3B\u9898\u8D44\u6E90
var appCompatContext: ModuleContextThemeWrapper
// <\u65B9\u68481> \u76F4\u63A5\u5F97\u5230 Configuration \u5BF9\u8C61\u8FDB\u884C\u8BBE\u7F6E
appCompatContext = instance<Activity>()
.applyModuleTheme(R.style.Theme_AppCompat)
.applyConfiguration { uiMode = Configuration.UI_MODE_NIGHT_YES }
// <\u65B9\u68482> \u521B\u5EFA\u4E00\u4E2A\u65B0\u7684 Configuration \u5BF9\u8C61
// \u6B64\u65B9\u6848\u4F1A\u7834\u574F\u5F53\u524D\u5BBF\u4E3B\u4E2D\u539F\u6709\u7684\u5B57\u4F53\u7F29\u653E\u5927\u5C0F\u7B49\u8BBE\u7F6E\uFF0C\u4F60\u9700\u8981\u624B\u52A8\u91CD\u65B0\u4F20\u9012 densityDpi \u7B49\u53C2\u6570
appCompatContext = instance<Activity>().applyModuleTheme(
theme = R.style.Theme_AppCompat,
configuration = Configuration().apply { uiMode = Configuration.UI_MODE_NIGHT_YES }
)
// \u76F4\u63A5\u4F7F\u7528\u8FD9\u4E2A\u5305\u88C5\u4E86\u6A21\u5757\u4E3B\u9898\u540E\u7684 Context \u521B\u5EFA\u5BF9\u8BDD\u6846
MaterialAlertDialogBuilder(appCompatContext)
.setTitle("AppCompat \u4E3B\u9898\u5BF9\u8BDD\u6846")
.setMessage("\u6211\u662F\u4E00\u4E2A\u5728\u5BBF\u4E3B\u4E2D\u663E\u793A\u7684 AppCompat \u4E3B\u9898\u5BF9\u8BDD\u6846\u3002")
.setPositiveButton("\u786E\u5B9A", null)
.show()
}
}
\u8FD9\u6837\uFF0C\u6211\u4EEC\u5C31\u53EF\u4EE5\u5728\u5BBF\u4E3B\u4E2D\u975E\u5E38\u7B80\u5355\u5730\u4F7F\u7528 MaterialAlertDialogBuilder
\u521B\u5EFA\u5BF9\u8BDD\u6846\u4E86\u3002