RePlugin外置插件化的实现和踩过的坑
提示:列表可左右滑动查看。
<p>首先说明的是RePlugin的插件化分为,内置和外置两种方式,感觉区别不是非常大,内置的插件经过升级之后实际上和外置插件是一样的。主要考虑到后期的热更新热修复等技术的应用,本文探讨外置插件化的实现。<br><br> 第一,就是宿主插件的导入:直接上代码<br><br>appModule目录build.gradle</p><pre><code>apply plugin: 'com.android.application'<br> <br>android {<br> compileSdkVersion 28<br> defaultConfig {<br> applicationId "com.replugin.hostapplication"<br> minSdkVersion 19<br> targetSdkVersion 28<br> versionCode 1<br> versionName "1.0"<br> testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"<br> applicationId "com.qihoo360.replugin.sample.host"<br> }<br> buildTypes {<br> release {<br> minifyEnabled false<br> proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'<br> }<br> }<br>}<br> <br>// apply语句必须放置到android标签之后,以读取applicationId属性<br>apply plugin: 'replugin-host-gradle'<br> <br>repluginHostConfig{<br> useAppCompat = true<br>}<br> <br>dependencies {<br> implementation fileTree(dir: 'libs', include: ['*.jar'])<br> implementation 'com.qihoo360.replugin:replugin-host-lib:2.2.4'<br> implementation 'com.android.support:appcompat-v7:28.0.0'<br> implementation 'com.android.support.constraint:constraint-layout:1.1.3'<br> testImplementation 'junit:junit:4.12'<br> androidTestImplementation 'com.android.support.test:runner:1.0.2'<br> androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'<br>}</code></pre><p><span style="color: rgb(77, 77, 77); font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif, SimHei, SimSun; font-size: 16px;">注意:applicationId是一定需要的,否则会出错,此处的applicationId不是清单文件中的哪一个</span><br></p><p><span style="color: rgb(56, 58, 66); font-family: "Source Code Pro", "DejaVu Sans Mono", "Ubuntu Mono", "Anonymous Pro", "Droid Sans Mono", Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, "PingFang SC", "Microsoft YaHei", sans-serif; white-space: pre; background-color: rgb(250, 250, 250);">apply plugin: 'replugin-host-gradle'需要在android{}之后,防止编译的时候找不到Id</span><span style="color: rgb(77, 77, 77); font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif, SimHei, SimSun; font-size: 16px;"><br></span></p><p><span style="color: rgb(56, 58, 66); font-family: "Source Code Pro", "DejaVu Sans Mono", "Ubuntu Mono", "Anonymous Pro", "Droid Sans Mono", Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, "PingFang SC", "Microsoft YaHei", sans-serif; white-space: pre; background-color: rgb(250, 250, 250);"><br></span></p><p><span style="color: rgb(77, 77, 77); font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif, SimHei, SimSun; font-size: 16px;">然后我们继续在根目录下的build.gradle中加入</span> <span style="color: rgb(56, 58, 66); font-family: "Source Code Pro", "DejaVu Sans Mono", "Ubuntu Mono", "Anonymous Pro", "Droid Sans Mono", Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, "PingFang SC", "Microsoft YaHei", sans-serif; white-space: pre; background-color: rgb(250, 250, 250);"><br></span></p><p><span style="color: rgb(56, 58, 66); font-family: "Source Code Pro", "DejaVu Sans Mono", "Ubuntu Mono", "Anonymous Pro", "Droid Sans Mono", Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, "PingFang SC", "Microsoft YaHei", sans-serif; white-space: pre; background-color: rgb(250, 250, 250);">classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.4' </span></p><p><span style="color: rgb(56, 58, 66); font-family: "Source Code Pro", "DejaVu Sans Mono", "Ubuntu Mono", "Anonymous Pro", "Droid Sans Mono", Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, "PingFang SC", "Microsoft YaHei", sans-serif; white-space: pre; background-color: rgb(250, 250, 250);"> 个人使用的仓储</span><br></p><pre><code>maven {<br> url "https://dl.bintray.com/qihoo360/replugin"<br>}<br>//具体配置如下:</code></pre><pre><code>buildscript {<br> <br> repositories {<br> google()<br> jcenter()<br> maven {<br> url "https://dl.bintray.com/qihoo360/replugin"<br> }<br> }<br> dependencies {<br> classpath 'com.android.tools.build:gradle:3.1.4'<br> classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.4'<br> <br> // NOTE: Do not place your application dependencies here; they belong<br> // in the individual module build.gradle files<br> }<br>}<br> <br>allprojects {<br> repositories {<br> google()<br> jcenter()<br> maven {<br> url "https://dl.bintray.com/qihoo360/replugin"<br> }<br> }<br>}<br> <br>task clean(type: Delete) {<br> delete rootProject.buildDir<br>}</code></pre><p><span style="color: rgb(77, 77, 77); font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif, SimHei, SimSun; font-size: 16px;">接下来呢,不要忘记了读写权限,因为宿主插件需要对其他的插件进行读取和写入等操作</span><br></p><pre><code><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><br><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /></code></pre><p><br></p><p style="outline: 0px; margin-top: 0px; margin-bottom: 16px; font-size: 16px; color: rgb(77, 77, 77); overflow: auto hidden; overflow-wrap: break-word; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif, SimHei, SimSun; line-height: 26px !important;">当然了,敏感的权限在Android6以上需要动态申请,这个自己去百度,这里就不多说了。(否则会出现无法install的情况)</p><p style="outline: 0px; margin-top: 0px; margin-bottom: 16px; font-size: 16px; color: rgb(77, 77, 77); overflow: auto hidden; overflow-wrap: break-word; font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif, SimHei, SimSun; line-height: 26px !important;">接下来就是宿主插件的Application了,可以采用继承和非集成的方式,本文采用的是非集成方式</p><pre><code>package com.replugin.hostapplication;<br> <br>import android.app.Application;<br>import android.content.Context;<br>import android.content.res.Configuration;<br> <br>import com.qihoo360.replugin.RePlugin;<br> <br>public class MainApplication extends Application {<br> <br> @Override<br> protected void attachBaseContext(Context base) {<br> super.attachBaseContext(base);<br> <br> RePlugin.App.attachBaseContext(this);<br> }<br> <br> @Override<br> public void onCreate() {<br> super.onCreate();<br> <br> RePlugin.App.onCreate();<br> }<br> <br> @Override<br> public void onLowMemory() {<br> super.onLowMemory();<br> <br> /* Not need to be called if your application's minSdkVersion > = 14 */<br> RePlugin.App.onLowMemory();<br> }<br> <br> @Override<br> public void onTrimMemory(int level) {<br> super.onTrimMemory(level);<br> <br> /* Not need to be called if your application's minSdkVersion > = 14 */<br> RePlugin.App.onTrimMemory(level);<br> }<br> <br> @Override<br> public void onConfigurationChanged(Configuration config) {<br> super.onConfigurationChanged(config);<br> <br> /* Not need to be called if your application's minSdkVersion > = 14 */<br> RePlugin.App.onConfigurationChanged(config);<br> }<br>}</code></pre><p><span style="color: rgb(77, 77, 77); font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif, SimHei, SimSun; font-size: 16px;">就宿主插件而言,最后就只剩下了最基本的对其他插件的调用了,简单的写一下 下载,调用,卸载三个方法的调用</span><br></p><pre><code>public void install(View view){<br> PluginInfo pluginInfo = RePlugin.install(Environment.getExternalStorageDirectory().getPath().toString()+"/plugin1.apk");<br> Log.d(TAG, pluginInfo + "");<br> <br>}</code></pre><pre><code>public void openActivity(View view){<br> try{<br> RePlugin.startActivity(this,RePlugin.createIntent("plugin1", "com.replugin.replugindex1.MainActivity"));<br> }catch (Exception e){<br> e.printStackTrace();<br> }<br>}</code></pre><pre><code>public void unInstall(View view){<br> RePlugin.uninstall("/sdcard/plugin1.apk");<br>}</code></pre><p>这里说明一下sdcard这个路径和Environment.getExternalStorageDirectory().getPath().toString()一个意思,就是你把手机连接上电脑以后打开的第一个目录就是,也就是文件管理的第一个界面,只要你在电脑上把apk丢进去就可以找到了。说明一下,放在这里的插件apk在install之后就会消失,因为已经被放到调用的目录了data/data/包名/app_p_a(自己脑补)<br><br>现在说一下其他插件的接入:<br><br>同理先说明<br><br>根目录下的build.gradle</p><pre><code>// Top-level build file where you can add configuration options common to all sub-projects/modules.<br> <br>buildscript {<br> <br> repositories {<br> google()<br> jcenter()<br> }<br> dependencies {<br> classpath 'com.android.tools.build:gradle:3.1.4'<br> classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.2.4'<br> <br> // NOTE: Do not place your application dependencies here; they belong<br> // in the individual module build.gradle files<br> }<br>}<br> <br> <br>allprojects {<br> repositories {<br> google()<br> jcenter()<br> }<br>}<br> <br>task clean(type: Delete) {<br> delete rootProject.buildDir<br>}</code></pre><p><span style="color: rgb(77, 77, 77); font-family: -apple-system, "SF UI Text", Arial, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif, SimHei, SimSun; font-size: 16px;">app目录下的build.gradle</span><br></p><pre><code>apply plugin: 'com.android.application'<br> <br>android {<br> compileSdkVersion 28<br> defaultConfig {<br> applicationId "com.replugin.replugindex1"<br> minSdkVersion 19<br> targetSdkVersion 28<br> versionCode 1<br> versionName "1.0"<br> testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"<br> }<br> buildTypes {<br> release {<br> minifyEnabled false<br> proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'<br> }<br> }<br>}<br> <br>apply plugin: 'replugin-plugin-gradle'<br> <br>dependencies {<br> implementation fileTree(dir: 'libs', include: ['*.jar'])<br> implementation 'com.qihoo360.replugin:replugin-plugin-lib:2.2.4'<br> implementation 'com.android.support:appcompat-v7:28.0.0'<br> implementation 'com.android.support.constraint:constraint-layout:1.1.3'<br> testImplementation 'junit:junit:4.12'<br> androidTestImplementation 'com.android.support.test:runner:1.0.2'<br> androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'<br>}</code></pre><p>将插件工程build一下在output中找到apk,改名和别名一样,后缀名apk,然后放到sdcard目录下即可。自定义和动态加载和管理,后期会更新。欢迎大家指正<br><br>代码zip包地址(包含宿主插件和其他插件的工程)<br><br>https://download.csdn.net/download/qq_20369621/11233030</p>
赞(0)
收藏(0)
分享
相关标签: