Skip to content
HiJsonL edited this page Jul 7, 2020 · 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当做Module依赖之后,编译通过,但是打包或者运行宿主包(生成apk)报错.错误信息:E:\projects\DroidPluginDemo\app\build\intermediates\transforms\dex\v_version\release\folders\1000\1f\main\classes.dex (拒绝访问。)