原文地址:
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 如图。
经过一番搜索这篇文章给了答案。我在build.gradle(Project的)中添加如下代码后,错误消失。
ext { compileSdkVersion = 23//具体哪个版本根据自己情况设置 buildToolsVersion = "23.0.1" }
配置依赖库
具体配置方式在Droid Plugin readme中有写。
主要就是
- 配置Application
- 将插件中Libraries\DroidPlugin\AndroidManifest.xml中所有的provider对应的authorities修改成自己的
默认为:com.morgoo.droidplugin_stub_P00 避免与其他使用者的出现冲突,可以将其该为
包名.droidplugin_stub_P00 - 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行左右注册。
我们看见的 '进度条'和'努力加载中...' 其实就是一张图片,在其theme中可以看见。如图
这个图片其实就是一个 .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