Skip to content

插件程序开发指南

Gray Liu edited this page Aug 19, 2019 · 3 revisions

如何开发插件

开发插件就和开发原生APP一样,零学习成本,无缝切换。

插件代码处理

插件如果完全不依赖宿主的代码和资源,允许以独立模式运行,宿主就和加载普通APP一样加载插件。

插件如果需要依赖宿主的代码,比如使用android support库,fresco库等,需要宿主打包成jar包提供给插件以provided方式依赖。

插件资源处理

如果插件完全不依赖宿主的资源,可以不做特殊处理。

如果插件需要依赖和共享宿主的资源,比如android support库,需要宿主生成特定的aar包,keep住宿主的资源id,然后提供给插件。插件开发需要接入gradle-plugin实现资源分段

在根目录下的build.gradle中的buildscrpt块里添加classpath依赖

dependencies {
    classpath  'com.iqiyi.tools.build:neptune-gradle:1.4.0'
}

在App模块的build.gradle中apply插件并配置

apply plugin: 'com.qiyi.neptune.plugin'

neptune {
    pluginMode = true      // In plugin apk build mode
    packageId = 0x30       // The packge id of Resources
    hostDependencies = "{group1}:{artifact1};{group2}:{artifact2}" // host app resources dependencies
}

暂不支持的特性或系统限制

  • 不支持ContentProvider
  • 插件中序列化的类不支持Serializable,必须使用Parceable。这是由于插件ClassLoader和宿主ClassLoader是独立的,dex没有合并,4.x设备intent.setExtraClassLoader()对Serializable数据无法生效
  • 不支持插件通知栏自定义layout,相关的layout资源必须放在宿主中
  • 不支持PendingIntent中指定Activity跳转,需要通过宿主Activity中转
  • overridePendingTransition实现的Activity转场动画资源,必须放在宿主中

插件依赖

插件之间可以互相依赖,比如把一些宿主没有使用到的公共库做成一个基础插件,给其他的业务插件依赖和使用,比如retrofit,butterknife之类的。只需要宿主在安装插件的时候,构造PluginLiteInfo时通过plugin_refs字段指定依赖的插件列表。只有所有依赖的插件和自身都安装成功之后,该插件才能够被正常加载。

插件依赖可以是Java代码,也可以是so库。不过依赖so库时需要注意,必须用包含该so的插件中的类去加载,不能直接在当前插件中调用System.loadLibrary()