didi VirtualApk 框架的使用

didi VirtualApk 框架的使用

今年估计是最闲的过年了,呆着无聊,也是对自己的一种充实吧,使用一下didi的VirtualApk ,以前也使用过插件的,但是没有*这个好用。在此,立个flag,每个月至少写俩篇博客,总结一些东西,学习一些知识。

为什么学习使用virtual apk,而不是其他插件框架,主要原因有:

  • 1 功能完备,简单集成就能使用
  • 2 侵入性低
  • 3 四大组件均不需要在宿主manifest中预注册,每个组件都有完整的生命周期
  • 4 优秀的兼容性

VirtualAPK和主流的插件化框架对比

didi VirtualApk 框架的使用_第1张图片
废话不多说,开始集成使用

一、项目引用VirtualAPK依赖

1、 在项目的build.gradle中添加依赖

didi VirtualApk 框架的使用_第2张图片

2、在宿主的 build.gradle中添加依赖,注意我们这里是宿主

在这里插入图片描述

3、在插件的build.gradle中添加依赖,注意这里是插件

在这里插入图片描述
到此,VirtualApk框架的依赖已经结束,是不是很简单,看起来是的。
didi VirtualApk 框架的使用_第3张图片
好了,我们继续。

二、在宿主中初始化插件并使用

1、自定义application并初始化
ps:记得在manifest.xml中配置自己的application

didi VirtualApk 框架的使用_第4张图片

2、由于我这里是把插件apk放在sdcard根目录下,所以需要权限,而且我的手机是android 9.0,所以还需要动态请求权限

didi VirtualApk 框架的使用_第5张图片

3、加载插件

didi VirtualApk 框架的使用_第6张图片

4、在插件的build.gradle中添加宿主是哪个

didi VirtualApk 框架的使用_第7张图片

5、给宿主和插件添加相同的签名

didi VirtualApk 框架的使用_第8张图片

三、打包宿主和插件,这里需要注意,插件必须是签名的,不然不能用,所以最好是给宿主和插件都使用相同的签名。

1、打包宿主

didi VirtualApk 框架的使用_第9张图片

2、打包插件

didi VirtualApk 框架的使用_第10张图片

3、安装宿主,把插件apk放到sdcard目录
4、运行宿主

didi VirtualApk 框架的使用_第11张图片

遇到问题:

1:

didi VirtualApk 框架的使用_第12张图片
解决方案:我是新建的module,需要在module下添加grdle.properties,然后添加android.useDexArchive=false
didi VirtualApk 框架的使用_第13张图片didi VirtualApk 框架的使用_第14张图片

2:

didi VirtualApk 框架的使用_第15张图片

解决方案:

gradle插件版本过高,VirtualApk的构建原理与gradle插件强依赖,建议使用官方demo工程使用的gradle插件版本,这里降至3.0.0 就ok了
didi VirtualApk 框架的使用_第16张图片

最后附上项目的完整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
}

demo下载链接:

添加链接描述

你可能感兴趣的:(android)