原文地址:
http://www.reibang.com/p/d16cd0e3333f
http://blog.csdn.net/qq_24889075/article/details/68489830
Droid Plugin的優(yōu)缺點(diǎn)網(wǎng)上一堆瘩燥,本文是在學(xué)習(xí)過程的產(chǎn)物,沒有原理 只有使用。
根據(jù)Droid Plugin 里readme進(jìn)行使用
本文流程:
- 創(chuàng)建項(xiàng)目
- 導(dǎo)入依賴庫
- 配置依賴庫
- 開發(fā)Host Module
- 開發(fā)Plugin Module
- 其他的說明
新建AS項(xiàng)目
并無特殊注意事項(xiàng)
導(dǎo)入依賴庫
在我導(dǎo)入庫的時(shí)候出現(xiàn)了一個(gè)錯(cuò)誤 Cannot get property 'compileSdkVersion' on extra properties extension as it does not exist 如圖。
經(jīng)過一番搜索這篇文章給了答案割以。我在build.gradle(Project的)中添加如下代碼后洒擦,錯(cuò)誤消失谎倔。
ext { compileSdkVersion = 23//具體哪個(gè)版本根據(jù)自己情況設(shè)置 buildToolsVersion = "23.0.1" }
配置依賴庫
具體配置方式在Droid Plugin readme中有寫亮曹。
主要就是
- 配置Application
- 將插件中Libraries\DroidPlugin\AndroidManifest.xml中所有的provider對(duì)應(yīng)的authorities修改成自己的
默認(rèn)為:com.morgoo.droidplugin_stub_P00 避免與其他使用者的出現(xiàn)沖突茅糜,可以將其該為
包名.droidplugin_stub_P00 - PluginManager.STUB_AUTHORITY_NAME 為你的值
PluginManager.STUB_AUTHORITY_NAME="包名.droidplugin_stub"
authorities我改了9個(gè)七芭,為什么了我還數(shù)了呢,因?yàn)楫?dāng)時(shí)只改了8個(gè) 然后和360助手沖突蔑赘。
另外狸驳,最好只修改前面的com.morgoo.droidplugin部分,后面的P00,P01…..不要改缩赛。
反正是我以包名.stub_P00形式命名的耙箍,但刪掉stub也能跑 , 就按照官方的規(guī)范來吧。
開發(fā)Host Module
兩個(gè)按鈕:加載插件酥馍、跳轉(zhuǎn)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為一個(gè)常量辩昆,是Plugin Module里的啟動(dòng)界面 startActivity(intent); //第二種方式 下面這種是推薦使用的方式 因?yàn)楣俜紻emo用的這種方式 PackageManager pm = getPackageManager(); Intent intent = pm.getLaunchIntentForPackage("包名"); if (intent == null) { Toast.makeText(view.getContext(), "跳轉(zhuǎn)失敗", Toast.LENGTH_SHORT).show(); return; } intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }
開發(fā)Plugin Module
新建個(gè)Hello world應(yīng)用就好
本項(xiàng)目注意事項(xiàng)
Plugin Module里的啟動(dòng)界面要在AndroidManifest中稍微配置一下,如:
"com.example.plugin.main"這個(gè)就是上面說的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"/>//如果不添加一個(gè)識(shí)別此Activity的action 就不能用上面的跳轉(zhuǎn)方式進(jìn)行跳轉(zhuǎn) <category android:name="android.intent.category.DEFAULT"/>//如果不設(shè)置這個(gè)將會(huì)一直卡在加載界面 </intent-filter> </activity>
插件最好放在SD卡的某個(gè)目錄中物喷,不要放在data/data下卤材,因?yàn)榉旁谀抢锛虞d失敗了(沒跳轉(zhuǎn))。具體原因沒找峦失,懶得找 放在sd卡中隱藏起來用戶也看不見。 ?(?*)
卡死界面(加載界面)
如果看這個(gè)界面不爽的可以隱藏掉术吗,暫時(shí)沒找到官方給的方法(其實(shí)是我沒找),但簡單看了下這個(gè)界面尉辑,想自己弄的朋友可以改改theme。
卡死界面是在庫中的com.morgoo.droidplugin.stub的ActivityStub子類(Activity)中的Standard00较屿,在AndroidManifest中904行左右注冊(cè)隧魄。
我們看見的 '進(jìn)度條'和'努力加載中...' 其實(shí)就是一張圖片,在其theme中可以看見隘蝎。如圖
這個(gè)圖片其實(shí)就是一個(gè) .9圖购啄。如圖:
其他
依賴庫錯(cuò)誤原因:
出錯(cuò)的原因在DroidPlugin的build.gradle中。
android { compileSdkVersion rootProject.ext.compileSdkVersion//這里是錯(cuò)誤的根源 buildToolsVersion rootProject.ext.buildToolsVersion//這里是錯(cuò)誤的根源 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的意思是 調(diào)用Project接口下的getRootProject()方法得到project對(duì)象嘱么,在調(diào)用project對(duì)象中的ext方法(就是我們剛剛寫的ext{.....}那個(gè))中的compileSdkVersion值狮含。 在本文中這個(gè)了解下就可以。
結(jié)構(gòu)目錄:
在插件安裝成功后會(huì)在應(yīng)用文件夾下創(chuàng)建一個(gè)Plugin文件夾曼振。Plugin文件夾下是你的插件文件夾几迄,以包名形式存在。里面存了一些東西冰评,重點(diǎn)是里面有一個(gè)叫shared_prefs(如果你沒有用SharedPreferences是不會(huì)出現(xiàn))映胁,這就實(shí)現(xiàn)了Host與Plugin的SharedPreferences分離。
要想數(shù)據(jù)共享可以看這里
實(shí)現(xiàn):
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跳轉(zhuǎn)到Host也用這個(gè):
PackageManager pm = getPackageManager(); Intent intent = pm.getLaunchIntentForPackage("包名"); if (intent == null) { Toast.makeText(view.getContext(), "跳轉(zhuǎn)失敗", Toast.LENGTH_SHORT).show(); return; } intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
權(quán)限:
在AndroidManifest中申請(qǐng)了一堆權(quán)限甲雅,可根據(jù)項(xiàng)目需要?jiǎng)h除或添加
如果提示你申請(qǐng)的權(quán)限過多解孙,那么有可能真的是申請(qǐng)過多坑填,去庫里刪些不用了就好。但如果你刪完了弛姜,并且host Plugin 還有庫里的權(quán)限都一樣穷遂,還是包申請(qǐng)權(quán)限過多!那么請(qǐng)你重新檢查權(quán)限寫的是不是一樣娱据,我再庫里少寫了一個(gè)權(quán)限 就一直包權(quán)限過多蚪黑。。中剩。忌穿。 千萬馬虎不得啊~
加固:
公司用的是梆梆加固,梆梆加固對(duì)于DroidPlugin貌似并不認(rèn)可结啼,使用了DroidPlugin就會(huì)在安全監(jiān)測時(shí)出現(xiàn)"engine:cyren name:Helir.D.gen!Eldorado|Trojan"!,本以為是我項(xiàng)目的原因掠剑,于是我重新創(chuàng)建了個(gè)項(xiàng)目,添加依賴郊愧,上傳梆梆朴译,同樣出現(xiàn)這個(gè)報(bào)毒的提示。
在Issue上提問了 詳情請(qǐng)看 https://github.com/DroidPluginTeam/DroidPlugin/issues/337
這個(gè)問題反映給老大之后属铁,老大選擇放棄DroidPlugin,使用公司自己寫的.... 蛋疼啊~
看來對(duì)于DroidPlugin要告一段落了~
后記 雖然360加固沒問題眠寿,但是老大出于后期維護(hù)考慮,打算用梆梆加固焦蘑,于是選擇放棄盯拱。 個(gè)人進(jìn)行測試:先用360加固,再用梆梆加固例嘱,完美運(yùn)行狡逢!由于項(xiàng)目著急上線 老大采用此方案應(yīng)急~
學(xué)習(xí)中看的資料 :
http://www.reibang.com/p/f1217cce93ef
http://blog.csdn.net/fuchaosz/article/details/51058058
http://blog.csdn.net/yzzst/article/details/48093567