美文网首页
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