[插件化] Droid Plugin 学习总结

原文地址:
http://www.jianshu.com/p/d16cd0e3333f
http://blog.csdn.net/qq_24889075/article/details/68489830

Droid Plugin的优缺点网上一堆,本文是在学习过程的产物,没有原理 只有使用。

根据Droid Plugin 里readme进行使用

本文流程:

  • 创建项目
  • 导入依赖库
  • 配置依赖库
  • 开发Host Module
  • 开发Plugin Module
  • 其他的说明

新建AS项目

并无特殊注意事项

导入依赖库

在我导入库的时候出现了一个错误 Cannot get property 'compileSdkVersion' on extra properties extension as it does not exist 如图。

Cannot get property 'compileSdkVersion' on extra properties extension as it does not exist

经过一番搜索这篇文章给了答案。我在build.gradle(Project的)中添加如下代码后,错误消失。
ext { compileSdkVersion = 23//具体哪个版本根据自己情况设置 buildToolsVersion = "23.0.1" }

配置依赖库

具体配置方式在Droid Plugin readme中有写。

主要就是

  1. 配置Application
  2. 将插件中Libraries\DroidPlugin\AndroidManifest.xml中所有的provider对应的authorities修改成自己的
    默认为:com.morgoo.droidplugin_stub_P00 避免与其他使用者的出现冲突,可以将其该为
    包名.droidplugin_stub_P00
  3. PluginManager.STUB_AUTHORITY_NAME 为你的值
    PluginManager.STUB_AUTHORITY_NAME="包名.droidplugin_stub"

authorities我改了9个,为什么了我还数了呢,因为当时只改了8个 然后和360助手冲突。
另外,最好只修改前面的com.morgoo.droidplugin部分,后面的P00,P01…..不要改。
反正是我以包名.stub_P00形式命名的,但删掉stub也能跑 , 就按照官方的规范来吧。

开发Host Module

两个按钮:加载插件、跳转Activity

public void installPlugin(View view) { File file = new File(Environment.getExternalStorageDirectory(), "/plugin.apk"); String path = file.getAbsolutePath(); try { PluginManager.getInstance().installPackage(path, PackageManagerCompat.INSTALL_REPLACE_EXISTING); } catch (RemoteException e) { e.printStackTrace(); } }

public void start(View view) { //第一种方式 intent = new Intent(PluginConsts.PLUGIN_MALL_MAIN);//PLUGIN_MALL_MAIN为一个常量,是Plugin Module里的启动界面 startActivity(intent); //第二种方式 下面这种是推荐使用的方式 因为官方Demo用的这种方式 PackageManager pm = getPackageManager(); Intent intent = pm.getLaunchIntentForPackage("包名"); if (intent == null) { Toast.makeText(view.getContext(), "跳转失败", Toast.LENGTH_SHORT).show(); return; } intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }

开发Plugin Module

新建个Hello world应用就好

本项目注意事项

Plugin Module里的启动界面要在AndroidManifest中稍微配置一下,如:

"com.example.plugin.main"这个就是上面说的com.example.plugin.main

//如果不添加一个识别此Activity的action 就不能用上面的跳转方式进行跳转 //如果不设置这个将会一直卡在加载界面

插件最好放在SD卡的某个目录中,不要放在data/data下,因为放在那里加载失败了(没跳转)。具体原因没找,懒得找 放在sd卡中隐藏起来用户也看不见。 ♪(*)


卡死界面(加载界面)

如果看这个界面不爽的可以隐藏掉,暂时没找到官方给的方法(其实是我没找),但简单看了下这个界面,想自己弄的朋友可以改改theme。

[插件化] Droid Plugin 学习总结_第1张图片
卡死界面

卡死界面是在库中的com.morgoo.droidplugin.stub的ActivityStub子类(Activity)中的Standard00,在AndroidManifest中904行左右注册。

[插件化] Droid Plugin 学习总结_第2张图片
Standard00

我们看见的 '进度条'和'努力加载中...' 其实就是一张图片,在其theme中可以看见。如图

[插件化] Droid Plugin 学习总结_第3张图片
theme

drawable

这个图片其实就是一个 .9图。如图:

[插件化] Droid Plugin 学习总结_第4张图片
.9图

其他

依赖库错误原因:

出错的原因在DroidPlugin的build.gradle中。

android { compileSdkVersion rootProject.ext.compileSdkVersion//这里是错误的根源 buildToolsVersion rootProject.ext.buildToolsVersion//这里是错误的根源 sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] jniLibs.srcDirs = ['libs'] } instrumentTest.setRoot('tests') debug.setRoot('build-types/debug') release.setRoot('build-types/release') } lintOptions { abortOnError false } }

rootProject.ext.compileSdkVersion的意思是 调用Project接口下的getRootProject()方法得到project对象,在调用project对象中的ext方法(就是我们刚刚写的ext{.....}那个)中的compileSdkVersion值。 在本文中这个了解下就可以。

结构目录:

在插件安装成功后会在应用文件夹下创建一个Plugin文件夹。Plugin文件夹下是你的插件文件夹,以包名形式存在。里面存了一些东西,重点是里面有一个叫shared_prefs(如果你没有用SharedPreferences是不会出现),这就实现了Host与Plugin的SharedPreferences分离。
要想数据共享可以看这里
实现:
try { Context otherAppsContext = createPackageContext("HostPackageName", Context.CONTEXT_IGNORE_SECURITY); SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("test", Context.MODE_WORLD_READABLE); if (sharedPreferences != null) { String str = sharedPreferences.getString("key",null); Toast.makeText(getApplicationContext(), "result: " + str, Toast.LENGTH_SHORT).show(); } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); }

从Plugin跳转到Host也用这个:

PackageManager pm = getPackageManager(); Intent intent = pm.getLaunchIntentForPackage("包名"); if (intent == null) { Toast.makeText(view.getContext(), "跳转失败", Toast.LENGTH_SHORT).show(); return; } intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);

权限:

在AndroidManifest中申请了一堆权限,可根据项目需要删除或添加

如果提示你申请的权限过多,那么有可能真的是申请过多,去库里删些不用了就好。但如果你删完了,并且host Plugin 还有库里的权限都一样,还是包申请权限过多!那么请你重新检查权限写的是不是一样,我再库里少写了一个权限 就一直包权限过多。。。。 千万马虎不得啊~

加固:

公司用的是梆梆加固,梆梆加固对于DroidPlugin貌似并不认可,使用了DroidPlugin就会在安全监测时出现"engine:cyren name:Helir.D.gen!Eldorado|Trojan"!,本以为是我项目的原因,于是我重新创建了个项目,添加依赖,上传梆梆,同样出现这个报毒的提示。

在Issue上提问了 详情请看 https://github.com/DroidPluginTeam/DroidPlugin/issues/337

这个问题反映给老大之后,老大选择放弃DroidPlugin,使用公司自己写的.... 蛋疼啊~

看来对于DroidPlugin要告一段落了~

后记 虽然360加固没问题,但是老大出于后期维护考虑,打算用梆梆加固,于是选择放弃。 个人进行测试:先用360加固,再用梆梆加固,完美运行!由于项目着急上线 老大采用此方案应急~


学习中看的资料 :
http://www.jianshu.com/p/f1217cce93ef
http://blog.csdn.net/fuchaosz/article/details/51058058
http://blog.csdn.net/yzzst/article/details/48093567

你可能感兴趣的:([插件化] Droid Plugin 学习总结)