Skip to content

Latest commit

 

History

History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

README.md

Sample

在Shadow框架下,应用由几部分构成。 宿主应用打包了很简单的一些接口,并在Manifest中注册了壳子代理组件, 还打包了插件管理器(manager)的动态升级逻辑。 manager负责下载、安装插件,还带有一个动态的View表达Loading态。 而"插件"则不光包含业务App,还包含Shadow的核心实现,即loader和runtime。 "插件"中的业务App和loader、runtime是同一个版本的代码编译出的, 因此loader可以包含一些业务逻辑,针对业务进行特殊处理。 由于loader是多实例的,因此同一个宿主中可以有多种不同的loader实现。 manager在加载"插件"时,首先需要先加载"插件"中的runtime和loader, 再通过loader的Binder(插件应该处于独立进程中避免native库冲突)操作loader进而加载业务App。

在这个Sample目录下,提供了两种示例工程:

源码依赖SDK的Sample(projects/sample/source)


要测试这个Sample请用Android Studio直接打开clone版本库的根目录。


  • sample-host是宿主应用
  • sample-manager是插件管理器的动态实现
  • sample-plugin/sample-loader是loader的动态实现,业务主要在这里定义插件组件和壳子代理组件的配对关系等。
  • sample-constant是在前3者中共用的相同字符串常量。
  • sample-plugin/sample-runtime是runtime的动态实现,业务主要在这里定义壳子代理组件的实际类。
  • sample-plugin/sample-app-lib是业务App的主要代码,是一个aar库。
  • sample-plugin/sample-normal-app是一个apk模块壳子,将sample-app-lib打包在其中,演示业务App是可以正常安装运行的。
  • sample-plugin/sample-plugin-app也是一个apk模块壳子,同样将sample-app-lib打包在其中,但是额外应用了Shadow插件,生成的apk不能正常安装运行。

这些工程中对Shadow SDK的依赖完全是源码级的依赖,因此修改Shadow SDK的源码后可以直接运行生效。

使用时可以直接在Android Studio中选择运行sample-host模块。 sample-host在构建中会自动打包manager和"插件"到assets中,在运行时自动释放模拟下载过程。

二进制Maven依赖SDK的Sample(projects/sample/maven)


要测试这个Sample请用Android Studio 分别 打开projects/sample/maven/host-project,projects/sample/maven/manager-project,projects/sample/maven/plugin-project三个目录。


源码依赖SDK的Sample中对Shadow SDK的依赖配置不适用于正式业务接入。 Shadow实现了完整的Maven发布脚本,支持方便的Maven依赖。

maven目录下的3个目录分别演示了3个工程。 这3个工程在实际业务中大概率上是3个不同的代码库。 因此,在这个演示中没有试图做着3个工程间的任何依赖关系, 甚至3个工程中依赖的Shadow版本都是独立配置的, 使用时请注意这一点。


特别注意,这3个工程中以maven方式引用的SDK,都是需要自行发布到mavenLocal()才能使用的。 因为,对于业务来说,不太可能会跟其他业务使用完全一致的二进制实现。所以Shadow直接发布一份二进制意义不大。 建议真正接入时按下面介绍,将二进制发布到自己的maven仓库中。


buildScripts/gradle/maven.gradle文件中配置了Shadow的Maven发布脚本。 正式使用时,请修改其中的两个GroupID变量:coreGroupIddynamicGroupId, 以及setScm方法中的两个URL到自己的版本库地址上。

然后将mavenLocal()改为自己发布的目标Maven仓库。

执行./gradlew publish即可将Shadow SDK发布到Maven仓库。

构件的版本号可以在build/pom目录中查看生成的pom文件中查看。

在这个Sample的3个工程的build.gradle文件中都有shadow_version定义, 将这个定义值改为刚刚发布的版本号(生成的pom中写的版本号)。

运行方法

这个演示工程没有实现下载功能,而是假设下载的文件直接位于指定路径。 因此运行前需要手工用adb命令将指定内容push到指定位置。

编译插件,在plugin-project目录中运行:

./gradlew packageDebugPlugin

adb push build/plugin-debug.zip /data/local/tmp

编译PluginManager,在manager-project目录中运行:

./gradlew assembleDebug
adb push sample-manager/build/outputs/apk/debug/sample-manager-debug.apk /data/local/tmp

最后可以用Android Studio打开host-project直接运行sample-host模块。

plugin-project中的plugin-normal-apk模块也可以直接安装运行,演示不使用Shadow时插件的运行情况。

演示AndroidX正常工作的Sample(projects/sample/sunflower)

这个Sample和projects/sample/maven的组织结构是一样的。

主要是将https://github.com/android/sunflower/改造成插件运行起来。