-
Notifications
You must be signed in to change notification settings - Fork 113
插件程序开发指南
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()