[插件化] 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 android:name=".PluginMainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> <action android:name="com.example.plugin.main"/>//如果不添加一个识别此Activity的action 就不能用上面的跳转方式进行跳转 <category android:name="android.intent.category.DEFAULT"/>//如果不设置这个将会一直卡在加载界面 </intent-filter> </activity>

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


卡死界面(加载界面)

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

卡死界面

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

Standard00

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

theme

drawable

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

.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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,227评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,755评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,899评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,257评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,617评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,757评论 1 221
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,982评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,715评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,454评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,666评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,148评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,512评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,156评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,112评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,896评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,809评论 2 279
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,691评论 2 272

推荐阅读更多精彩内容