美文网首页
Shadow框架项目实战笔记

Shadow框架项目实战笔记

作者: 撸吗撸码 | 来源:发表于2024-06-11 10:39 被阅读0次

背景

公司要做一个定制的App,想到了使用插件化技术,对比了下国内的所有插件化框架,觉得腾讯的shadow最好。
版本:2.3.0
官网下载地址 : https://github.com/Tencent/Shadow,原理和会用说明这个基本说的很全。认真看都能解决你心中的疑问。

demo顺利运行的关键步骤

  1. host-project 是宿主程序代码
  2. manager-project 是插件框架代码项目
  3. plugin-project 是插件项目,这个里面就是真正的业务实现
  4. 要想整个项目跑起来。必须先打包一个zip文件,一个apk文件
    zip包文件是在plugin-project 项目下,terminal里面敲入 ./gradlew packageDebugPlugin
    这个命令 成功后在项目的根目录的build目录下生成一个plugin-debug.zip
  5. apk 是在manager-project项目的 terminal里面敲入 ./gradlew assembleDebug
    这个成功后在sample-manager/build/outputs/apk/debug/sample-manager-debug.apk 路径下生成apk文件
  6. 有了上面2个文件,接下来就要把它们复制到手机里面。
    对zip文件进行复制到手机里面。敲下面的命令
    adb push build/plugin-debug.zip /data/local/tmp

对apk文件进行复制到手机里面。敲下面的命令
adb push sample-manager/build/outputs/apk/debug/sample-manager-debug.apk /data/local/tmp
复制完毕,就可以运行host-project 查看宿主调用插件了。

遇到的疑难杂症

  1. 在Android 7.1.1上面遇到一个recyclerview 私活加载不出来的问题。后来发现是因为项目用了2个版本的recyclerview。最后统一版本就解决了。所以依赖库必须谨慎再谨慎。
  2. 插件的activity默认动画如何跟系统一致
    方案一 作者也指出了,凡是针对需要传递资源id的系统api,插件框架是无法介入到framework内部的,这也是为啥shadow在实现overridePendingTransition方法时,直接将资源id置为0。一般业务Activity都有类似BaseActivity的基类,可以在基类中调用overridePendingTransition,以实现默认的转场动画
    方案二 是修改ShadowActivity源码,重写 overridePendingTransition的实现,根据id转换为资源名称,通过名称到宿主里找同名资源,将(宿主的)资源id传递给overridePendingTransition方法,源码如下示:
public void overridePendingTransition(int enterAnim, int exitAnim) {
    if (enterAnim != 0 && (enterAnim & 0xFF000000) != 0x01000000) {
        // 通过名称从宿主里去找对应资源(宿主里应该拷贝一份同名的资源)
        String name = getResources().getResourceName(enterAnim);
        enterAnim = getBaseContext().getApplicationContext().getResources().getIdentifier(name, null, null);
    }

    if (exitAnim != 0 && (exitAnim & 0xFF000000) != 0x01000000) {
        String name = getResources().getResourceName(exitAnim);
        exitAnim = getBaseContext().getApplicationContext().getResources().getIdentifier(name, null, null);
    }

    // 以固定anim资源id的方式在host工程中维护同样的anim资源备份
    hostActivityDelegator.overridePendingTransition(enterAnim, exitAnim);
}

简短的源码分析

在宿主项目里面有一个占位的activity

<activity
            android:name="com.tencent.shadow.sample.runtime.PluginDefaultProxyActivity"
            android:launchMode="standard"
            android:screenOrientation="portrait"
            android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|screenLayout|fontScale|uiMode|orientation|screenSize|smallestScreenSize|layoutDirection"
            android:hardwareAccelerated="true"
            android:theme="@style/TransparentTheme"
            android:multiprocess="true" />

就从这个activity 入口,我们看看蛤蟆是如何吃天的 -
首先看下 PluginDefaultProxyActivity 定义

public class PluginContainerActivity extends GeneratedPluginContainerActivity implements HostActivity, HostActivityDelegator {}

abstract class GeneratedPluginContainerActivity extends Activity implements GeneratedHostActivityDelegator {}

由上面代码可知,PluginContainerActivity这个activity 继承自GeneratedPluginContainerActivity,而这个父类又继承自Activity 同时实现了GeneratedHostActivityDelegator 接口,这个接口基本把activity的所有方法都定义了一遍。

相关文章

网友评论

      本文标题:Shadow框架项目实战笔记

      本文链接:https://www.haomeiwen.com/subject/ysbbedtx.html