useHostContext: () -> Array
) : AbstractTransformManager(ctClassInputMap, classPool) {
override val mTransformList: List = listOf(
ApplicationTransform(),
ActivityTransform(),
ServiceTransform(),
InstrumentationTransform(),
RemoteViewTransform(),
FragmentTransform(ctClassInputMap),
DialogTransform(),
WebViewTransform(),
ContentProviderTransform(),
PackageManagerTransform(),
KeepHostContextTransform(useHostContext())
)
}
这里的 mTransformList 就是要依次执行的 Transform 内容,也就是需要替换的类映射。我们以 ApplicationTransform 和 ActivityTransform 为例。
class ApplicationTransform : SimpleRenameTransform(
mapOf(
“android.app.Application”
to “com.tencent.shadow.core.runtime.ShadowApplication”
,
“android.app.Application$ActivityLifecycleCallbacks”
to “com.tencent.shadow.core.runtime.ShadowActivityLifecycleCallbacks”
)
)
class ActivityTransform : SimpleRenameTransform(
mapOf(
“android.app.Activity”
to “com.tencent.shadow.core.runtime.ShadowActivity”
)
)
可以看到,打包过程中,插件的 Application 会被替换成 ShadowApplication,Activity 会被替换成 ShadowActivity,这里主要看一下 ShadowActivity 的继承关系。
为何插件 Activity 可以不用继承 Activity 呢?因为在代理 Activity 的方式中,插件 Activity 是被当作一个普通类来使用的,只要负责执行对应的生命周期即可。
宿主中如何启动插件 Activity
宿主中启动插件 Activity 原理如下图:
我们就从 sample 里的 MainActivity 开始看起。 sample-host/src/main/java/com/tencent/shadow/sample/host/MainActivity 是 demo 的主入口。
启动插件的方式是:
startPluginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// …
Intent intent = new Intent(MainActivity.this, PluginLoadActivity.class);
intent.putExtra(Constant.KEY_PLUGIN_PART_KEY, partKey);
intent.putExtra(Constant.KEY_ACTIVITY_CLASSNAME, “com.tencent.shadow.sample.plugin.app.lib.gallery.splash.SplashActivity”);
// …
startActivity(intent);
}
});
可以看到,这里是通过 PluginLoadActivity 来启动的,传入了要启动的插件 Activity:SplashActivity,接着就到 PluginLoadActivity 里看一下具体的启动。
class PluginLoadActivity extends Activity {
public void startPlugin() {
PluginHelper.getInstance().singlePool.execute(new Runnable() {
@Override