PS:插件化是什么這里就不再說了,從這里開始兩種加載方式中的一種(內置加載),該框架是奇虎360開發的,官方給出優點
RePlugin是一套完整的、穩定的、適合全面使用的,占坑類插件化方案。我們“逐詞”拆開來解釋這個定義:
完整的:讓插件運行起來“像單品那樣”,支持大部分特性
穩定的:如此靈活完整的情況下,其框架崩潰率僅為業內很低的“萬分之一”
適合全面使用的:其目的是讓應用內的“所有功能皆為插件”
占坑類:以穩定為前提的Manifest占坑思路
插件化方案:基於Android原生API和語言來開發,充分利用原生特性
簡單使用
加載方式
- 內置加載
- 外置加載
內置加載
1:在項目根目錄的 build.gradle 下添加 RePlugin Host Gradle 依賴:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
// 1、添加RePlugin Host Gradle依賴
classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.1'
}
}
2:在 app/build.gradle 下添加 RePlugin Host Library 依賴
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion "26.0.1"
defaultConfig {
applicationId "cn.codingblock.repluginstudy"
minSdkVersion 21
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
//有用
apply plugin: 'replugin-host-gradle'// 集成 RePlugin 添加的配置
// 集成 RePlugin 添加的配置
repluginHostConfig {
useAppCompat = true // 如果項目需要支持 AppComat,則需要將此配置置為 true
// 如果應用需要個性化配置坑位數量,則需要添加以下代碼進行配置
// countNotTranslucentStandard = 6
// countNotTranslucentSingleTop = 2
// countNotTranslucentSingleTask = 3
// countNotTranslucentSingleInstance = 2
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile 'com.qihoo360.replugin:replugin-host-lib:2.2.1' // 集成 RePlugin 添加的配置
testCompile 'junit:junit:4.12'
}
3:讓工程的 Application 直接繼承自 RePluginApplication
不繼承的如下
public class MyApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
RePlugin.App.attachBaseContext(this);
}
@Override
public void onCreate() {
super.onCreate();
RePlugin.App.onCreate();
}
@Override
public void onLowMemory() {
super.onLowMemory();
RePlugin.App.onLowMemory();
}
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
RePlugin.App.onTrimMemory(level);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
RePlugin.App.onConfigurationChanged(newConfig);
}
}
在 AndroidManifest 對 MyApplication 的相關配置
插件apk項目創建
4:根目錄的 build.gradle 添加 RePlugin Plugin Gradle 依賴(若是單獨創建插件工程,則不需要添加注釋1下面的代碼):
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
// 1、添加RePlugin Host Gradle依賴(主工程用)
classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.1'
// 2、添加RePlugin Plugin Gradle依賴(插件工程用)
classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.2.1'
}
}
5:在 app/build.gradle 中添加 replugin-plugin-gradle 插件和 replugin-plugin-lib 依賴:
apply plugin: 'com.android.application'
android {
...
}
apply plugin: 'replugin-plugin-gradle' // 集成 RePlugin 添加的配置
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile 'com.qihoo360.replugin:replugin-plugin-lib:2.2.1' // 集成 RePlugin 添加的配置
testCompile 'junit:junit:4.12'
}
6:Androidmanifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my.myreplugintest2">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
== android:exported="true"==
>
<activity android:name=".MainActivity"
android:theme="@style/AppTheme"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
== <!--插件名稱-->
<meta-data
android:name="com.my.myreplugintest2.name"
android:value="plugin1"/>
<!--插件版本-->
<meta-data
android:name="com.my.myreplugintest2.version.ver"
android:value="1"/>==
</application>
</manifest>
設置成暴露exported="true",然后設置別名
說明:meta-data下的name是包名+name,包名+version.var
然后打成apk
(內置於 APP 之中,並隨 APP 一並發版,需要將插件 apk 改成 .jar 結尾放入主程序的assets/plugins目錄。)
7:主程序運行
在主程序中與java文件同級,創建assets/plugins目錄,把打好的apk修改名字為 plugin1.jar(plugin1是我的別名)
RePlugin.startActivity(MainActivity.this, RePlugin.createIntent("plugin1", "com.my.myreplugintest2.MainActivity"));
plugin1為插件別名。com.my.myreplugintest2.MainActivity是插件文件的位置。