didi VirtualApk 框架的使用
今年估计是最闲的过年了,呆着无聊,也是对自己的一种充实吧,使用一下didi的VirtualApk ,以前也使用过插件的,但是没有*这个好用。在此,立个flag,每个月至少写俩篇博客,总结一些东西,学习一些知识。
为什么学习使用virtual apk,而不是其他插件框架,主要原因有:
- 1 功能完备,简单集成就能使用
- 2 侵入性低
- 3 四大组件均不需要在宿主manifest中预注册,每个组件都有完整的生命周期
- 4 优秀的兼容性
VirtualAPK和主流的插件化框架对比
废话不多说,开始集成使用
一、项目引用VirtualAPK依赖
1、 在项目的build.gradle中添加依赖
2、在宿主的 build.gradle中添加依赖,注意我们这里是宿主
3、在插件的build.gradle中添加依赖,注意这里是插件
到此,VirtualApk框架的依赖已经结束,是不是很简单,看起来是的。
好了,我们继续。
二、在宿主中初始化插件并使用
1、自定义application并初始化
ps:记得在manifest.xml中配置自己的application
2、由于我这里是把插件apk放在sdcard根目录下,所以需要权限,而且我的手机是android 9.0,所以还需要动态请求权限
3、加载插件
4、在插件的build.gradle中添加宿主是哪个
5、给宿主和插件添加相同的签名
三、打包宿主和插件,这里需要注意,插件必须是签名的,不然不能用,所以最好是给宿主和插件都使用相同的签名。
1、打包宿主
2、打包插件
3、安装宿主,把插件apk放到sdcard目录
4、运行宿主
遇到问题:
1:
解决方案:我是新建的module,需要在module下添加grdle.properties,然后添加android.useDexArchive=false
2:
解决方案:
gradle插件版本过高,VirtualApk的构建原理与gradle插件强依赖,建议使用官方demo工程使用的gradle插件版本,这里降至3.0.0 就ok了
最后附上项目的完整build.gradle
项目build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
classpath 'com.didi.virtualapk:gradle:0.9.8.6'
// 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
}
宿主build.gradle
apply plugin: 'com.android.application'
apply plugin: 'com.didi.virtualapk.host' //这个是宿主中添加的
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.vanish.interview"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
signingConfigs{
release {
keyAlias 'vanish'
keyPassword 'android'
storeFile file('D:/StudioProject/keyStore/sign.jks')
storePassword 'android'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
//virtualApk
implementation 'com.didi.virtualapk:core:0.9.8'
//Andpermission
implementation 'com.yanzhenjie:permission:2.0.0-rc4'
}
插件build.gradle
apply plugin: 'com.android.application'
apply plugin: 'com.didi.virtualapk.plugin'//注意这个是plugin结尾,宿主是以host结尾的
android {
compileSdkVersion 28
signingConfigs{
release {
keyAlias 'vanish'
keyPassword 'android'
storeFile file('D:/StudioProject/keyStore/sign.jks')
storePassword 'android'
}
}
defaultConfig {
applicationId "com.vanish.interview2"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
//virtualApk
implementation 'com.didi.virtualapk:core:0.9.8'
}
virtualApk{
//插件资源表中的packageId,需要确保不同插件有不同的packageId.
packageId = 0x6f
targetHost = '../../MyInterview/app'//宿主应用的app模块路径
//默认为true,如果插件有引用宿主的类,那么这个选项可以使得插件和宿主保持混淆一致
applyHostMapping = true
}