如何正确使用Bundle
bundle的工程配置
bundle自身工程build.gradle里面需要声明为awb:
atlas.bundleConfig.awbBundle = true
建议修改plugin,更好的支持aar传递依赖等问题(可以采用原生com.android.library)
apply plugin: 'com.taobao.atlas.library'buildscript {repositories {mavenLocal()jcenter()}dependencies {classpath "com.android.tools.build:gradle:2.1"classpath "com.taobao.android:atlasplugin:1.0.0" //使用com.taobao.atlas.library时需要配置atlasplugin等classpath} }
外部配置
在主客工程的packageId.properties中声明资源段(也可以通过mtl.tBuildConfig.autoPackageId设置自动分配packageID)
com.taobao.android:firstbundle=34//groupId:artifactId=NUM
在主客工程的build.gradle中添加awb依赖
compile("com.taobao.android:firstbundle:1.0.0@awb")
bundle的注意点
遵循代码规范可以有效避免在运行时遇到难以排查的问题。
- Bundle的AndroidManifest中不能有对bundle内的资源的引用;比如Activity的Theme,需要声明在主apk中。Bundle的Manifest会合并进主Manifest,如果有bundle的资源引用会直接引发构建出错;另外可以选择的方式是AndroidManifest里面不加Theme,改用在Activity的onCreate方法里面调用setTheme的方式
- Activity通过overridePendingTransition使用的切换动画的文件要放在主apk中;
- Bundle内的Class最好以特定的packageName开头,resource文件能够带有特定的前缀。这样一来可以避免资源或者类名重复而引起的覆盖,也可以在出现问题的时候及时定位到出问题的模块
- Bundle内如果有用到自定义style,那么style的parent如果也是自定义的话,parent的定义必须位于主apk中,这是由于5.0以后系统内style查找的固有逻辑导致的,容器内暂不能完全兼容
Bundle内部如果有so,则安装时so由于无法解压到apk lib目录中,对于直接通过native层使用dlopen来使用so的情况,会存在一定限制,且会影响后续so动态部署,所以目前bundle内so不建议使用dlopen的方式来使用
Bundle内有使用主进程的contentProvider,则Bundle的AndroidManifest的contentprovider声明中最好带上
android:multiprocess="true"android:process=":XX"
这样可以避免主进程一起来就去startBundle导致启动时间过长
初始化Bundle
bundle可以被认为是一个小型的apk,因此每个bundle的初始化都是从Bundle的Application开始的。Application被声明在bundle的AndroidManifest.xml里面
注意点:虽然启动方式类似与普通app,先执行attachBaseContext,再执行onCreate,不过有两个不同点需要引起注意:
Application 初始化的线程基于start bundle时的线程,这样导致了bundle可能会运行在主线程,也可能是在子线程,所以初始化的代码如果对线程敏感的需要注意:如果需要强制主线程的可以通过new Handler(Looper.getMainLooper()).post 去初始化
bundle的Application并不是被系统真正认可的Application,所以需要Application作为参数进行初始化的方法可以传入getBaseContext(),Bundle Application的mBase实际上就是apk真正的application,最好不要直接传入bundle的Application本身进行初始化,会存在潜在的风险。
Bundle如何提供服务给其他Bundle
Bundle虽然提供了依赖的方式,但是这种方式如果使用不当反而会带来隐患,且与bundle本身的封装性相违背。通常如果某个中间件是以bundle的形式存在,那声明依赖是可行的。如果两个本身相对独立的业务bundle存在某几个功能接口的依赖,则可以通过服务的方式,服务提供方提供aidl的接口,被使用方或者主apk依赖;同时自己bundle内部实现service的功能。
主动启动Bundle
默认情况下,Bundle只往外暴露了android原生的component,运行期按需加载。某些特殊的bundle(比如说监控性质的)本身与其他代码完全独立,且又需要在某个时间点启动运行的,可以通过如下方式去启动: 加上Bundle的PackageName为:com.sample.bundleA
```
Atlas.getInstance().installBundleTransitivelyAsync(new String[]{"com.sample.bundleA"}, new BundleInstaller.InstallListener() {@Overridepublic void onFinished() {BundleImpl impl = (BundleImpl) Atlas.getInstance().getBundle("com.sample.bundleA");if(impl!=null){try {impl.start();} catch (BundleException e) {e.printStackTrace();}}}});
如何正确使用Bundle相关推荐
- jNs 在 ASP.NET MVC 项目中的应用
最近做项目用到 ASP.NET Web Optimizatoin Framework,发现 Sea.js 的依赖加载在 Release 版本下不能很好的工作了--因为 Web.Optimizatoin ...
- testflight怎么做版本更新_TestFlight 使用指南
TestFlight Beta 测试是苹果公司的产品,旨在更容易的邀请用户,在你发布产品到App Store之前,让他们能够参与测试你的 iOS, watchOS 和 tvOS 应用.这个教程不需要你 ...
- [增强现实]Unity制作AR增强现实--茶壶(亲测)
1.下载Unity Extension 在这里 https://ar.qualcomm.at/qdevnet/sdk/ios 注册,这个是必须的 或者到asset store里找"Vuf ...
- iOS开发之第三方登录微博-- 史上最全最新第三方登录微博方式实现
相关资源地址: 本项目demo地址 : https://github.com/zhonggaorong/weiboSDKDemo 最新SDK下载: 最新微博SDK 官网注册地址:点击打开链接 最 ...
- QR Code 二维码的生成与扫描
前言 现在大街小巷.各大网站都有二维码的踪迹,不管是IOS.Android.WP都有相关支持的软件. 最近因为工作需要使用相关技术,所以做了初步了解.今天主要是讲述如何使用ZXing库,在项目中要使用 ...
- Java 常用集合类学习
Java 常用集合类学习 1 Collection集合 1.1 Collection集合简介 1.2 Collection集合基本操作 1.3 Collection集合迭代 2 List集合 2.1 ...
- 12、IB之Xib的使用
12.IB之Xib的使用 1.解决冲突 1.1 解决普通IB文件冲突 1.2 解决Xcode8引起的IB文件冲突 2.创建xib文件 3 关联xib文件与源文件 3.1 关联xib文件与UIView子 ...
- Unix编程/应用问答中文版(转)
Unix编程/应用问答中文版 名称 -- Unix编程/应用问答中文版 版本 -- 0.04 ( 2003-10-09 外发版 ) 维护 -- 小四 <scz@nsfocus.com> 主 ...
- GNU Make 使用手册(中译版)
如果要全面了解Linux的结构.理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级的Makefile文件.目前,在网上虽然有一些著作,但都不能全面的解释Linux源代码中各级的M ...
最新文章
- 应用基于资产的开发到 SOA 的服务中1
- 【PC工具】如何简单粗暴无脑的解方程
- css sprint 生成工具 bg2css
- 前后端分离系统使用Nginx代理https地址
- python实现网页登录时的rsa加密流程
- [burp][CTF]burp intruder爆破出现 Payload set 1: Invalid number settings的解决办法
- QT中信号和槽的简单解释
- 关于Android中Intent传递Serialzilable数据的问题
- 分布式事务解决方案,Seata的基本配置和使用
- 数据科学 IPython 笔记本 9.10 数组排序
- Linux网络协议栈:关闭一个还有没发送数据完的TCP连接
- 微信仿今日头条导航栏滚动
- make的时候会报错g++: Command not found
- Atitit table的读取与遍历 jquery jsoup 目录 1. atitit.gui控件的定位与选择器	1 2. 读取表格流程 遍历表格table	1 3. W3cdom标准化	1
- 破解 找回 lockdir 加密的文件
- sap系统webservice接口开发
- 第三方支付和代付区别在哪?
- Win7安装.net 4.7.2
- Oracle中的SQL函数(全)
- Windows 远程桌面无法复制粘贴问题
热门文章
- 智能电销机器人为什么会被更多企业所青睐
- for do done 嵌套
- XP,没重启,“魔窟”可以“莫哭”
- 教你玩转HTML(html5)h5网页设计,网站开发-刘青-专题视频课程
- 为什么找不到工作的是你,技术差的还是你
- HP laserjet m1005 mfp语言设置乱了怎么办?
- Maven的安装与配置及碰到的问题(自我总结)
- Pod 常见错误及故障排查
- 原创 | 如何从ArcGIS Online获取世界数据
- Mindfusion.Charts and Gauges for Java