最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android框架RePlugin使用詳解

 更新時(shí)間:2018年07月08日 09:00:57   作者:wardenlzr  
這篇文章給大家分享了Android 插件化框架 RePlugin使用心得,對(duì)此有興趣的朋友參考學(xué)習(xí)下。

0.先附上一篇原理講解

http://m.fzitv.net/article/127353.htm

這應(yīng)該算是給作者打的廣告吧。如有涉及侵權(quán),請(qǐng)通知我立刻刪除。

1.應(yīng)用場(chǎng)景

Android開(kāi)發(fā)人員不多,又要求使用插件化開(kāi)發(fā)的模式。(簡(jiǎn)單點(diǎn)講就是自己需要寫(xiě)宿主APP,還有N多個(gè)插件需要開(kāi)發(fā))

如下圖:

360官方給的Demo是宿主一個(gè)工程,插件一個(gè)工程,并且工程的build.gradle文件中添加宿主和插件對(duì)應(yīng)所需要的依賴,多人開(kāi)發(fā)時(shí),每個(gè)人或多個(gè)人維護(hù)一個(gè)宿主工程或者插件工程,都沒(méi)有什么問(wèn)題,但是一個(gè)人需要同時(shí)維護(hù)宿主和多個(gè)插件時(shí),來(lái)回切換工程調(diào)試以及打包就異常頭疼了。。。

2.一個(gè)工程配置宿主和插件的所有依賴

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 的上面,千萬(wàn)不要放在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對(duì)應(yīng)的build.gradle文件中添加

//replugin插件化框架,這一行建議就放在dependencies 的上面,千萬(wàn)不要放在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,這里建議自己做成一個(gè)moudle,配置方法上面的代碼理由了 (library的moudle名字)
如有依賴的沖突,在對(duì)應(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ù)個(gè)人需要改成自己想要的版本
   }
  }
 }
}
...
}

4.關(guān)于調(diào)試以及成品包。

調(diào)試時(shí)有幾個(gè)moudle,就安裝幾個(gè)應(yīng)用,調(diào)用的地方

if (!BuildConfig.DEBUG) {//非Debug,成品包
 if (RePlugin.isPluginInstalled("插件包名")) {
  //已安裝
  Intent intentHasInstall = RePlugin.createIntent("插件包名" ,
    "插件包名.MainActivity");
  intentHasInstall.putExtras(bundle);
  RePlugin.startActivity(mContext, intentHasInstall);
  }else{//沒(méi)有安裝,自己寫(xiě)下載的代碼}
}else {//debug模式
Intent intent1 = new Intent();
intent1.setComponent(new ComponentName("插件包名", "插件包名.MainActivity"));
intent1.putExtras(bundle);
startActivity(intent1);
}

5.關(guān)于FileProvider

5.1這個(gè)首先公用library的那個(gè)moudle要有一個(gè)公用的Utils,并且每個(gè)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("請(qǐng)保證你已經(jīng)初始化過(guò)!");
 }
}

5.2每個(gè)moudle(插件或宿主)的manifest文件中都添加

<provider
 android:name="android.support.v4.content.FileProvider"
 android:authorities="對(duì)應(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時(shí):以獲取文件URI為例

File mTmpFile = new File("你自己的文件路徑");
Uri uri= FileProvider.getUriForFile(Utils.getContext(), Utils.getContext().getPackageName() + ".fileProvider", mTmpFile);

Utils.getContext().getPackageName(),重點(diǎn)是這個(gè)方法;

a.debug時(shí),獲取的對(duì)應(yīng)插件的包名,通過(guò)每個(gè)moudle的manifest配置中對(duì)應(yīng)的fileProvider找到文件;

b.release時(shí),Utils.getContext().getPackageName()獲取的只會(huì)是宿主的fileProvider,這時(shí)自然可以通過(guò)宿主manifest配置對(duì)應(yīng)的fileProvider找到文件;

相關(guān)文章

最新評(píng)論

安化县| 额尔古纳市| 仙居县| 资中县| 大英县| 乃东县| 长乐市| 辛集市| 报价| 辰溪县| 沅江市| 湘乡市| 南雄市| 巧家县| 会宁县| 启东市| 抚顺市| 江安县| 邵武市| 胶州市| 荆州市| 晋州市| 台前县| 千阳县| 萝北县| 天津市| 沂源县| 阳新县| 浪卡子县| 永州市| 黄龙县| 荣昌县| 唐海县| 平遥县| 攀枝花市| 陈巴尔虎旗| 宁明县| 铁力市| 衡阳县| 崇仁县| 新绛县|