Android插件化开发和组件化开发其实是类似的,都是为了便捷开发,提高效率。但插件化的一个好处就是可以实现在线下载更新安装插件,类似热更新的功能,而热更新的classloder技术在插件化中也是关键点。
主要插件化框架:
2019年 爱奇艺qisaw 腾讯shadow
2017年 滴滴virtualapk 360 Replugin
之前还有ali altas Driodplugin等等
主要的技术我觉得是类似的,shadow号称0HOOK,但aiqiyi说看了企鹅的源码,是有hook的,有兴趣可以看看
主要尝试了shadow和replugin,因为对比下来这两种用户广泛,而且兼容性好些
shadow我down了源码和demo,能够很好的运行,但对已有项目的更改可能稍多,同时调研了replugin,感觉replugin的集成更加快捷,先行记录
1.由于兼容或资源问题,宿主的工程添加
maven{url "https://dl.bintray.com/soli/maven"}2.添加RePlugin Host Gradle依赖
classpath 'com.qihoo360.replugin:replugin-host-gradle:2.3.1'3.宿主的app gradle
implementation 'com.qihoo360.replugin:replugin-host-lib:2.2.1' // 集成 RePlugin 添加的配置4.
一是继承RePluginApplication
public class App extends RePluginApplication二是非继承的方式
public class MainApplication 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(); /* Not need to be called if your application's minSdkVersion > = 14 */ RePlugin.App.onLowMemory(); .... } @Override public void onTrimMemory(int level) { super.onTrimMemory(level); /* Not need to be called if your application's minSdkVersion > = 14 */ RePlugin.App.onTrimMemory(level); .... } @Override public void onConfigurationChanged(Configuration config) { super.onConfigurationChanged(config); /* Not need to be called if your application's minSdkVersion > = 14 */ RePlugin.App.onConfigurationChanged(config); .... } }5.plugin app
buildscript { dependencies { classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.2.4' ... } } apply plugin: 'replugin-plugin-gradle' dependencies { compile 'com.qihoo360.replugin:replugin-plugin-lib:2.2.4' ... }6.plugin apk存放路径
只需两步即可:
将APK改名为:[插件名].jar放入主程序的assets/plugins目录好了,准备打开插件吧
Intent intent = RePlugin.createIntent("demo2", "com.qihoo360.replugin.sample.demo2.databinding.DataBindingActivity"); context.startActivity(intent);
到此replugin就集成完了,能正常启动app中的apk了,但是可能运行中遇到各种问题,
1.比如replugin不支持java8,因此你的插件项目如果使用了java8的新特性,如lambad表达式等,就需要进行改造了
2.项目必须包含v4或者v7包,否则会报错,replugin用到了包里的loadmanager
3.gradle版本问题,如果遇到莫名其妙的问题,考虑gradle版本和replugin版本的问题
还有很多设置,比如插件别名,多进程,外置插件等等,这些都简单些了,看需要研究,最主要的是能集成,跑起来。
我demo的源码:
宿主:
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { maven{url "https://dl.bintray.com/soli/maven"} jcenter() {url 'https://maven.aliyun.com/repository/jcenter'} google() } dependencies { classpath 'com.android.tools.build:gradle:2.1.3' // 1、添加RePlugin Host Gradle依赖 classpath 'com.qihoo360.replugin:replugin-host-gradle:2.3.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir } apply plugin: 'com.android.application' android { compileSdkVersion 29 buildToolsVersion "29.0.2" defaultConfig { applicationId "com.ccccit.plugintest" minSdkVersion 21 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility = 1.7 targetCompatibility = 1.7 } } apply plugin: 'replugin-host-gradle'// 集成 RePlugin 添加的配置 // 集成 RePlugin 添加的配置 repluginHostConfig { useAppCompat = true // 如果项目需要支持 AppComat,则需要将此配置置为 true // 如果应用需要个性化配置坑位数量,则需要添加以下代码进行配置 // countNotTranslucentStandard = 6 // countNotTranslucentSingleTop = 2 // countNotTranslucentSingleTask = 3 // countNotTranslucentSingleInstance = 2 } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'com.android.support:support-v4:27.1.1' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' implementation 'com.qihoo360.replugin:replugin-host-lib:2.2.1' // 集成 RePlugin 添加的配置 } // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext.kotlin_version = '1.3.50' repositories { maven {url "https://dl.bintray.com/soli/maven"} google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.1.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.3.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } allprojects { repositories { google() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir } apply plugin: 'com.android.application' android { compileSdkVersion 29 buildToolsVersion "29.0.2" defaultConfig { applicationId "com.ccccit.pluginone" minSdkVersion 21 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility = 1.7 targetCompatibility = 1.7 } } apply plugin: 'replugin-plugin-gradle' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' /*repluginPluginConfig { //插件名 pluginName = "pluginone" //宿主app的包名 hostApplicationId = "com.ccccit.plugintest" //宿主app的启动activity hostAppLauncherActivity = "com.ccccit.plugintest.TestActivity" }*/ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'com.android.support:support-v4:27.1.1' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' implementation 'com.qihoo360.replugin:replugin-plugin-lib:2.2.1' // 集成 RePlugin 添加的配置 implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" }