bundle的工程配置

  1. bundle自身工程build.gradle里面需要声明为awb:

     atlas.bundleConfig.awbBundle = true
    
  2. 建议修改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}
    }
    
  1. 外部配置

    1. 在主客工程的packageId.properties中声明资源段(也可以通过mtl.tBuildConfig.autoPackageId设置自动分配packageID)

       com.taobao.android:firstbundle=34//groupId:artifactId=NUM
      
    2. 在主客工程的build.gradle中添加awb依赖

       compile("com.taobao.android:firstbundle:1.0.0@awb")
      

bundle的注意点

遵循代码规范可以有效避免在运行时遇到难以排查的问题。

  1. Bundle的AndroidManifest中不能有对bundle内的资源的引用;比如Activity的Theme,需要声明在主apk中。Bundle的Manifest会合并进主Manifest,如果有bundle的资源引用会直接引发构建出错;另外可以选择的方式是AndroidManifest里面不加Theme,改用在Activity的onCreate方法里面调用setTheme的方式
  2. Activity通过overridePendingTransition使用的切换动画的文件要放在主apk中;
  3. Bundle内的Class最好以特定的packageName开头,resource文件能够带有特定的前缀。这样一来可以避免资源或者类名重复而引起的覆盖,也可以在出现问题的时候及时定位到出问题的模块
  4. Bundle内如果有用到自定义style,那么style的parent如果也是自定义的话,parent的定义必须位于主apk中,这是由于5.0以后系统内style查找的固有逻辑导致的,容器内暂不能完全兼容
  5. Bundle内部如果有so,则安装时so由于无法解压到apk lib目录中,对于直接通过native层使用dlopen来使用so的情况,会存在一定限制,且会影响后续so动态部署,所以目前bundle内so不建议使用dlopen的方式来使用

  6. 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,不过有两个不同点需要引起注意:

  1. Application 初始化的线程基于start bundle时的线程,这样导致了bundle可能会运行在主线程,也可能是在子线程,所以初始化的代码如果对线程敏感的需要注意:如果需要强制主线程的可以通过new Handler(Looper.getMainLooper()).post 去初始化

  2. 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相关推荐

  1. jNs 在 ASP.NET MVC 项目中的应用

    最近做项目用到 ASP.NET Web Optimizatoin Framework,发现 Sea.js 的依赖加载在 Release 版本下不能很好的工作了--因为 Web.Optimizatoin ...

  2. testflight怎么做版本更新_TestFlight 使用指南

    TestFlight Beta 测试是苹果公司的产品,旨在更容易的邀请用户,在你发布产品到App Store之前,让他们能够参与测试你的 iOS, watchOS 和 tvOS 应用.这个教程不需要你 ...

  3. [增强现实]Unity制作AR增强现实--茶壶(亲测)

    1.下载Unity Extension 在这里  https://ar.qualcomm.at/qdevnet/sdk/ios  注册,这个是必须的 或者到asset store里找"Vuf ...

  4. iOS开发之第三方登录微博-- 史上最全最新第三方登录微博方式实现

    相关资源地址: 本项目demo地址 :   https://github.com/zhonggaorong/weiboSDKDemo 最新SDK下载:  最新微博SDK 官网注册地址:点击打开链接 最 ...

  5. QR Code 二维码的生成与扫描

    前言 现在大街小巷.各大网站都有二维码的踪迹,不管是IOS.Android.WP都有相关支持的软件. 最近因为工作需要使用相关技术,所以做了初步了解.今天主要是讲述如何使用ZXing库,在项目中要使用 ...

  6. Java 常用集合类学习

    Java 常用集合类学习 1 Collection集合 1.1 Collection集合简介 1.2 Collection集合基本操作 1.3 Collection集合迭代 2 List集合 2.1 ...

  7. 12、IB之Xib的使用

    12.IB之Xib的使用 1.解决冲突 1.1 解决普通IB文件冲突 1.2 解决Xcode8引起的IB文件冲突 2.创建xib文件 3 关联xib文件与源文件 3.1 关联xib文件与UIView子 ...

  8. Unix编程/应用问答中文版(转)

    Unix编程/应用问答中文版 名称 -- Unix编程/应用问答中文版 版本 -- 0.04 ( 2003-10-09 外发版 ) 维护 -- 小四 <scz@nsfocus.com> 主 ...

  9. GNU Make 使用手册(中译版)

    如果要全面了解Linux的结构.理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级的Makefile文件.目前,在网上虽然有一些著作,但都不能全面的解释Linux源代码中各级的M ...

最新文章

  1. 应用基于资产的开发到 SOA 的服务中1
  2. 【PC工具】如何简单粗暴无脑的解方程
  3. css sprint 生成工具 bg2css
  4. 前后端分离系统使用Nginx代理https地址
  5. python实现网页登录时的rsa加密流程
  6. [burp][CTF]burp intruder爆破出现 Payload set 1: Invalid number settings的解决办法
  7. QT中信号和槽的简单解释
  8. 关于Android中Intent传递Serialzilable数据的问题
  9. 分布式事务解决方案,Seata的基本配置和使用
  10. 数据科学 IPython 笔记本 9.10 数组排序
  11. Linux网络协议栈:关闭一个还有没发送数据完的TCP连接
  12. 微信仿今日头条导航栏滚动
  13. make的时候会报错g++: Command not found
  14. Atitit table的读取与遍历 jquery jsoup 目录 1. atitit.gui控件的定位与选择器 1 2. 读取表格流程 遍历表格table 1 3. W3cdom标准化 1
  15. 破解 找回 lockdir 加密的文件
  16. sap系统webservice接口开发
  17. 第三方支付和代付区别在哪?
  18. Win7安装.net 4.7.2
  19. Oracle中的SQL函数(全)
  20. Windows 远程桌面无法复制粘贴问题

热门文章

  1. 智能电销机器人为什么会被更多企业所青睐
  2. for do done 嵌套
  3. XP,没重启,“魔窟”可以“莫哭”
  4. 教你玩转HTML(html5)h5网页设计,网站开发-刘青-专题视频课程
  5. 为什么找不到工作的是你,技术差的还是你
  6. HP laserjet m1005 mfp语言设置乱了怎么办?
  7. Maven的安装与配置及碰到的问题(自我总结)
  8. Pod 常见错误及故障排查
  9. 原创 | 如何从ArcGIS Online获取世界数据
  10. Mindfusion.Charts and Gauges for Java