Android框架RePlugin使用詳解
0.先附上一篇原理講解
http://www.dbjr.com.cn/article/127353.htm
這應(yīng)該算是給作者打的廣告吧。如有涉及侵權(quán),請通知我立刻刪除。
1.應(yīng)用場景
Android開發(fā)人員不多,又要求使用插件化開發(fā)的模式。(簡單點講就是自己需要寫宿主APP,還有N多個插件需要開發(fā))
如下圖:
360官方給的Demo是宿主一個工程,插件一個工程,并且工程的build.gradle文件中添加宿主和插件對應(yīng)所需要的依賴,多人開發(fā)時,每個人或多個人維護(hù)一個宿主工程或者插件工程,都沒有什么問題,但是一個人需要同時維護(hù)宿主和多個插件時,來回切換工程調(diào)試以及打包就異常頭疼了。。。
2.一個工程配置宿主和插件的所有依賴
2.1工程的build.gradle文件中添加
buildscript { ... dependencies { classpath 'com.android.tools.build:gradle:2.3.3' //插件化框架 宿主工程所需依賴 classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.0' //插件化框架 插件工程所需依賴 classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.2.0' ... } ... }
2.2宿主app的build.gradle文件中添加
//replugin插件化框架,這一行建議就放在dependencies 的上面,千萬不要放在android{...}的上面
apply plugin: 'replugin-host-gradle'
dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') ... releaseCompile project(path: ':library的moudle名字', configuration: 'release') debugCompile project(path: ':library的moudle名字', configuration: 'debug') compile 'com.qihoo360.replugin:replugin-host-lib:2.2.0' ... }
2.3插件moudle對應(yīng)的build.gradle文件中添加
//replugin插件化框架,這一行建議就放在dependencies 的上面,千萬不要放在android{...}的上面
apply plugin: 'replugin-plugin-gradle' repluginPluginConfig { pluginName = "你自己的插件名字" hostApplicationId = "宿主包名" hostAppLauncherActivity = "宿主包名.MainActivity" } dependencies { ... releaseCompile project(path: ':library的moudle名字', configuration: 'release') debugCompile project(path: ':library的moudle名字', configuration: 'debug') compile 'com.qihoo360.replugin:replugin-plugin-lib:2.2.0' ... }
3.宿主及所有插件使用到的library,這里建議自己做成一個moudle,配置方法上面的代碼理由了 (library的moudle名字)
如有依賴的沖突,在對應(yīng)moudle中添加
android{ ... configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> def requested = details.requested if (requested.group == 'com.android.support') { if (!requested.name.startsWith("multidex")) { details.useVersion '25.3.1'//這里可根據(jù)個人需要改成自己想要的版本 } } } } ... }
4.關(guān)于調(diào)試以及成品包。
調(diào)試時有幾個moudle,就安裝幾個應(yīng)用,調(diào)用的地方
if (!BuildConfig.DEBUG) {//非Debug,成品包 if (RePlugin.isPluginInstalled("插件包名")) { //已安裝 Intent intentHasInstall = RePlugin.createIntent("插件包名" , "插件包名.MainActivity"); intentHasInstall.putExtras(bundle); RePlugin.startActivity(mContext, intentHasInstall); }else{//沒有安裝,自己寫下載的代碼} }else {//debug模式 Intent intent1 = new Intent(); intent1.setComponent(new ComponentName("插件包名", "插件包名.MainActivity")); intent1.putExtras(bundle); startActivity(intent1); }
5.關(guān)于FileProvider
5.1這個首先公用library的那個moudle要有一個公用的Utils,并且每個moudle(插件或宿主)都初始化此工具類
public final class Utils { private static Context context; /** * 初始化工具類 * * @param context 上下文 */ public static void init(@NonNull final Context context) { Utils.context = context.getApplicationContext(); } /** * 獲取ApplicationContext * * @return ApplicationContext */ public static Context getContext() { if (context != null) return context; throw new NullPointerException("請保證你已經(jīng)初始化過!"); } }
5.2每個moudle(插件或宿主)的manifest文件中都添加
<provider android:name="android.support.v4.content.FileProvider" android:authorities="對應(yīng)moudle的包名.fileProvider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
需使用FileProvider時:以獲取文件URI為例
File mTmpFile = new File("你自己的文件路徑");
Uri uri= FileProvider.getUriForFile(Utils.getContext(), Utils.getContext().getPackageName() + ".fileProvider", mTmpFile);
Utils.getContext().getPackageName(),重點是這個方法;
a.debug時,獲取的對應(yīng)插件的包名,通過每個moudle的manifest配置中對應(yīng)的fileProvider找到文件;
b.release時,Utils.getContext().getPackageName()獲取的只會是宿主的fileProvider,這時自然可以通過宿主manifest配置對應(yīng)的fileProvider找到文件;
相關(guān)文章
Android RecyclerView添加頭部和底部實例詳解
這篇文章主要介紹了Android RecyclerView添加頭部和底部實例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06XRecyclerView實現(xiàn)下拉刷新、滾動到底部加載更多等功能
這篇文章主要為大家詳細(xì)介紹了XRecyclerView實現(xiàn)下拉刷新、滾動到底部加載更多等功能,以及添加header功能的RecyclerView,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08為Retrofit統(tǒng)一添加post請求的默認(rèn)參數(shù)的方法
這篇文章主要介紹了為Retrofit統(tǒng)一添加post請求的默認(rèn)參數(shù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04c++ mk文件出錯Jni調(diào)用產(chǎn)生java.lang.UnsatisfiedLinkError錯誤解決方法
錯誤產(chǎn)生在我把方法從c語言轉(zhuǎn)為c++語言后產(chǎn)生的,后來檢查到這種錯誤是因為mk文件出錯,加載c文件和加載c++的文件所用的代碼不一樣,下面請看2013-11-11Android編程實現(xiàn)TextView垂直自動滾動功能【附demo源碼下載】
這篇文章主要介紹了Android編程實現(xiàn)TextView垂直自動滾動功能,詳細(xì)分析了Android TextView垂直自動滾動功能的實現(xiàn)步驟與布局、功能相關(guān)技巧,并附帶了demo源碼供讀者下載,需要的朋友可以參考下2017-02-02