Skip to content
Andy Zhang edited this page Aug 19, 2016 · 11 revisions

1.这个插件的工程结构是什么样的?

答:请先导入到Android Studio工程。你会发现有两个工程,一个是TestPlugin,它引用了DroidPlugin的库工程,通过代码简单展示了如何使用DroidPlugin;APITest是一个测试工程,编译后可以当作插件运行在插件系统,用来测试android的各种api。

2.为什么我集成后,奇数次可以打开,偶数次就打不开了?

答:请按照文档中修改PluginManager.STUB_AUTHORITY_NAME="com.example.droidplugin_stub"的值。

3.为什么我运行demon的时候安装不上?

答:如果你安装了360手机助手,则是ContentProvider冲突了,请参照文档第四步修改authorities和PluginManager.STUB_AUTHORITY_NAME。

4.如何实现插件和宿主、插件直接的通讯?

答:DroidPlugin系统本身并不提供通讯机制。如有需要请使用Android系统提供的标准apk之间的通讯方式,如广播、AIDL等方式。但是目前我正在实现更优雅的通讯方式。

5.插件和宿主、插件之间如何实现共享代码?

答:不行。插件和宿主之间、插件之间都使用了不同的ClassLoader,所以不能互相访问彼此的代码,即使通过反射也不行。因为在一些情况下,插件和宿主可能会使用相同的开源库,比如support V4,但是使用的版本不一致,如果使用同样的ClassLoader来加载,则可能会因为开源库的版本不一致导致冲突。

6.插件和宿主、插件之间如何共享资源?

答:不行。插件和宿主之间、插件之间都使用了不同的AssetManager加载资源,故它们的资源互相隔离,这样才可以实现插件免重新打包。只有这样严格的隔离,才能防止插件和宿主、插件之间的资源id不会冲突。其它插件则通过修改aapt,指定生成的资源id段来解决此事,私以为不够优雅。

7.DroidPlugin支持插件带so库吗?64位支持如何?

答:支持。64位支持情况请参见我的提交:Commit 534a970

8.为什么编译无法通过,提示无法找到Class:android.util.Singleton

答:默认情况下,DroidPlugin项目可以在Android Studio下可以直接编译通过。如果你使用eclipse+ADT的方式,请将DroidPlugin/layoutlib.jar通过system lib的方式引入到编译环境中。

9.为什么我编译运行demon程序后无法安装,PluginManager.getInstance().installPackage(String filepath, int flags)方法总是返回失败?

答:无论是Android Studio还是Eclipse+ADT请确保将manifestmerger.enabled选项设置为true。

10.这个项目原理是什么?

答:关键点有三个:1、apk共享进程;2、HOOK机制;3、占坑。当然这其中会有无数多的坑需要埋。具体可以参照源码。

11.为什么我安装插件的时候提示权限太多,无法安装?

答:请确保插件申请的权限是宿主的子集。如果插件的权限在宿主中缺失,请在宿主中补齐。

12.DroidPlugin如何打印日志?为什么日志打印不出来?

答:DroidPlugin统一使用com.morgoo.helper.Log类来打印日志。默认情况下,这个类会判断是否存在/sdcard/360Log/Plugin文件夹,如果存在,则会打印日志,否则不会打印。你也可以修改这个判断逻辑,使其符合你自己的项目逻辑。

13.DroidPlugin的原理是什么?有文档么?

答:你可以参田维术的文章:https://github.com/tiann/understand-plugin-framework

Clone this wiki locally