VirtualApk 插件入门小试
1 官方资料
滴滴开源Android插件方案:VirtualAPK
2 宿主App集成方法
(1)在整个工程的build.gradle中添加依赖
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath 'com.didi.virtualapk:gradle:0.9.8.4' // VirtualApk
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
(2)在app模块(宿主App模块名,可改名)build.gradle添加插件引用
apply plugin: 'com.didi.virtualapk.host' // VirtualApk build.gradle文件顶部添加
(3)在app模块build.gradle中添加依赖
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
compile 'com.didi.virtualapk:core:0.9.6' // VirtualApk
}
(4)在Application的attachBaseContext中添加PluginManager初始化代码
import com.didi.virtualapk.PluginManager;
public class TestApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
long start = System.currentTimeMillis();
PluginManager.getInstance(base).init(); // 主要是这句
Log.d("KLH", "use time:" + (System.currentTimeMillis() - start));
}
}
(5)在MainActivity的OnCreate中自动加载插件(这一步的时机可选,也可以是后续再加载),请注意这里加载插件的路径和apk名称,要约定好。
private void loadPlugin() {
PluginManager pm = PluginManager.getInstance(this);
File apk = new File(Environment.getExternalStorageDirectory(), "test_plugin.apk");
if (apk.exists()) {
try {
pm.loadPlugin(apk);
showToast("插件加载成功!!!");
} catch (Exception e) {
e.printStackTrace();
showToast("插件加载异常了。。。");
}
}
}
(6)启动插件Apk(这里以启动插件中的一个Activity为例)
Intent intent = new Intent();
intent.setClassName("com.klh.testplugin", "com.klh.testplugin.MainActivity");
startActivity(intent);
3 插件App集成方法
插件工程是一个独立的App工程,只不过添加了VirtualAPK相关依赖,并且在编译时需要关联宿主工程目录(为了做一些信息同步与共享库删减)
(1)在整个工程的build.gradle中添加依赖
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath 'com.didi.virtualapk:gradle:0.9.8.4' // VirtualApk
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
(2)在app模块的build.gradle中添加依赖
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
compile 'com.didi.virtualapk:core:0.9.6' // VirtualApk
}
(3)在app模块的build.gradle文件末尾中添加插件配置
// VirtualApk
apply plugin: 'com.didi.virtualapk.plugin' virtualApk {
// 要指定一个不重复的ID来区分插件资源,有效值范围:[0x02, 0x7E]
packageId = 0x6a // the package id of Resources. // 宿主App的Application模块(绝对/相对)路径,插件的构建需要依赖此路径
targetHost = '../testAndroid/app' // the path of application module in host project. // 如果插件有引用宿主的类,那么此选项可以确保插件与宿主保持混淆一致
applyHostMapping = true //optional, default value: true.
}
(4)编译方法:gradlew clean assemblePlugin
4 安装测试
(1)安装宿主App
(2)将编译好的插件改名与宿主约定一致,推送到指定目录。例如本文的约定路径是:/sdcard/test_plugin.apk
E:\VirtualShare\gitLab\research\05.VirtualApk\VATestPlugin>adb push app\build\outputs\apk\release\app-release-unsigned.apk /sdcard/test_plugin.apk
app\build\outputs\apk\release\app-release-unsigned.apk: 1 file pushed. 0.9 MB/s (27437 bytes in 0.030s)
5 其他
插件不能直接访问宿主App的接口,可采用与宿主App集成相同的aar包来实现数据交互。
VirtualApk 插件入门小试的更多相关文章
- Uni-app原生插件入门使用教程「2」:如何离线使用原生插件
当HBuilderX中提供的能力无法满足App功能需求,需要通过使用Andorid/iOS原生开发实现时,可使用App离线SDK开发原生插件来扩展原生能力. 如使用Uniapp开发直播功能时,需要调用 ...
- Unreal Engine 4(虚幻UE4) GameplayAbilities插件入门教程(一)
本文系笔者的实习生分享会内容预备兼GameplayAbilities的初学者教程. 本文适合已有四十天UE4开发经验的初学者. 参考资料:https://wiki.unrealengine.com/G ...
- jQuery插件入门
一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写("#"),("#"),("."),写了几年就对别人说非常熟悉JQ ...
- 关于jquery插件 入门
关于 JavaScript & jQuery 的插件开发 最近在温故 JavaScript 的面向对象,于是乎再次翻开了<JavaScript高级程序设计>第3版,了解到其中常 ...
- 使用 ADD-ON SDK 开发 基于 Html JQuery 和 CSS 的 firefox 插件入门教程1: 创建一个简单的 Add-on
[本文转载自http://sixpoint.me/942/implementing-simple-addon/] 实现一个简单的插件 教程的这个部分带你使用 SDK 来实现, 运行并打包一个插件. 这 ...
- jQuery 插件入门
先看http://www.cnblogs.com/lideng/p/3605551.html http://www.cnblogs.com/xcj26/p/3345556.html (非常细致 很多 ...
- Unreal Engine 4 Radiant UI 插件入门教程(二)
本篇章前提要求:在UE4上安装了Radiant UI插件.如果没有安装,请找其它教程(或者是笔者的其它的教程,目前正在写). 本教程的目的:探讨如何从网页元素中调用蓝图中的内容: 第一步: 写一个网页 ...
- Unreal Engine 4(虚幻UE4)GameplayAbilities 插件入门教程(三)技能标签(Ability Tags)
本教程参考了https://wiki.unrealengine.com/GameplayAbilities_and_You,如果没有学习前两篇教程,请前往学习. GameplayAbilities插件 ...
- Unreal Engine 4(虚幻UE4)GameplayAbilities 插件入门教程(二)
我们接着学习.如果没有学习第一篇,请前往学习. 由于GameplayAbilities插件基本上没有资料(除了前面提供的那篇Dave的博文以外,再无资料,有迹象表明Dave是这个插件的开发者). 这个 ...
随机推荐
- linux 中 修改权限的命令 chmod
今天被这个命令给黄了, 连这个都记不住,是该好好的复习复习了,问了一个问题,就是说这个tomcat 如何去修改关于这个权限的问题:一下子把我弄蒙了,不说了,心累: 修改linux文件权限命令:chmo ...
- 解决 Unknown action buyram in contract eosio 错误
- Apache Druid架构原理与应用场景
为了帮助卖家提高运营水平,卖家管理后台会展示一些访客.订单等趋势和指标数据,如PV,UV,转化率,GMV等: 这些指标的计算依靠前端埋点和订单详情等数据,其特点是数据量大,并有一定的实时性要求. Dr ...
- mayavi与X11的一些坑总结
1. Mayavi:https://docs.enthought.com/mayavi/mayavi/ 适合渲染各种和图形有关的数据.在大批量处理数据时,一般不希望对每一个渲染好的对象都将其显示出来, ...
- O/R关系的深入理解(转载)
本文转载自aa8945163: http://aa8945163.iteye.com/blog/859713 什么是O/R Mapping? 广义上,ORM指的是面向对象的对象模型和关系型数据库的数据 ...
- Java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind异常
端口被占用,可能是其他程序占用,也有可能是自己代码逻辑不对,比如BZ在写SocketServer时把添加端口的代码放进了while里(sasasa.....). 查看本机端口是否被占用:netstat ...
- 判断某个元素是否存在于某个 js 数组中
1.正则表达式 Array.prototype.in_array=function(e){ var r=new RegExp(','+e+','); return (r.test(','+this.j ...
- 17python-BS编程
1.前端概述(1)上网:就是下载网页(2)浏览器:就是一个解释器2.BS模式的了解(1)BS模式:-----b:browser(浏览器) s:server(服务端)(2)BS模式运行过程:brow ...
- 使用maven整合spring+springmvc+mybatis
使用maven整合spring+springmvc+mybatis 开发环境: 1. jdk1.8 2. eclipse4.7.0 (Oxygen) 3. mysql 5.7 在pom.xml文件中, ...
- 2018.5.24 lvm创建pool
在调试生产环境时遇到以下情况: 好奇心驱使下,发现是lvm的一个功能——lvm创建pool,就手动创建了相似的环境,操作截图如下: 主要命令: vgcreate -s 32M vg /dev/vdb1 ...