• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 浅谈Android Small插件化框架源码

浅谈Android Small插件化框架源码

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android small,small框架,small,small的日文,smallman吉他多少钱等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

浅谈Android Small插件化框架源码


Android Small插件化框架源码分析

目录

概述
Small如何使用
插件加载流程
待改进的地方

一、概述

Small是一个写得非常简洁的插件化框架,工程源码位置:https://github.com/wequick/Small
插件化的方案,说到底要解决的核心问题只有三个:

1.1 插件类的加载

这个问题的解决和其它插件化框架的解决方法差不多。Android的类是由DexClassLoader加载的,通过反射可以将插件包动态加载进去。Small的gradle插件生成的是.so包,在初始化的时候会通过.so文件生成.zip文件,再由.zip文件生成一个dex元素,反射添加到宿主类加载器的dexPathList里。

1.2 插件资源的处理

这里各插件化框架解决办法一般有两种想法:一是插件间不共享资源访问,办法就是每个插件生成一个AssertManager来访问它自己的资源,这样就不会存在资源id冲突的问题;另一种是大家都共用一个AssetManager,这样插件的资源是共享的,可以相互访问,但是要解决资源id冲突的问题。Small采用的是后者,通过修改aapt的生成产物解决了资源id冲突问题,由于共享资源访问,可以做到极小或者根本没有资源冗余,从而减小插件包的大小;

1.3 Activity注册和生命周期问题

*大部分插件化框架解决办法都是采用在宿主工程里预先注册Activity占坑,然后通过占坑Activity将生命周期回调传回给插件Activity的方式。这里Small处理的比较有特色,通过替换 ActivityThread 里的mInstrumentation,在Instrumentation的newActivty实现里面实例化了插件Activity,通过较小改动就能完全解决生命周期回调的问题。

Small的功能模块主要有:
gradle-small插件:Small中的一个gradle自定义插件,用于打包组件;
small library:提供给用户使用的Android Library,主要提供插件加载,解析等功能;

二、使用Small

2.1工程命名
首先Small对工程名称如下要求:

app:host工程 app.*:app插件工程; lib.*:library插件工程; web.*:web插件工程; 其他:其他assert 工程;

2.2 插件引入
在host工程的rootProject的build.gradle中需要引入small插件;
引入small插件后,默认帮你的所有工程引入了一个library依赖small,我们通过small提供的各种接口来实现插件化得一些功能,比如加载插件,打开某个插件中的ui界面,创建某个插件提供的fragment对象等;

2.3 插件声明
作为host程序,要做的最重要的事情就是插件管理,插件跳转uri声明:
插件声明在host程序的assert/bundle.json中声明,格式如下:

{
  "version": "1.0.0",
  "bundles": [
    {
      "uri": "lib.utils",
      "pkg": "net.wequick.example.small.lib.utils"
    },
    {
      "uri": "lib.style",
      "pkg": "com.example.mysmall.lib.style"
    },
    {
      "uri": "main",
      "pkg": "net.wequick.example.small.app.main"
    },
    {
      "uri": "home",
      "pkg": "net.wequick.example.small.app.home",
      "rules"{
          "page1",".MyPage1",
          "page2","net.wequick.example.small.app.home.MyPage2"
       }
    },
    {
      "uri": "message",
      "pkg": "net.wequick.example.small.app.message"
    },
    {
      "uri": "find",
      "pkg": "net.wequick.example.small.app.find"
    },
    {
      "uri": "mine",
      "pkg": "net.wequick.example.small.app.mine"
    },
    {
      "uri": "detail",
      "pkg": "net.wequick.example.small.app.detail"
    },
    {
      "uri": "about",
      "pkg": "net.wequick.example.small.web.about"
    }
  ]
}

bundles 中的每个元素都是一个插件的声明;

    {
      "uri": "home",
      "pkg": "net.wequick.example.small.app.home",
      "rules"{
          "page1",".MyPage1",
          "page2","net.wequick.example.small.app.home.MyPage2"
       }
    }

在采用small框架的应用中,跳转插件的界面都是通过uri来指定的,也就是一个uri唯一对应一个插件;
pkg是插件的包名;
rules:如果插件提供了多个界面供其他人使用,我们需要通过rules将它们区分开来;

举个例子:

Small.openUri("home", context); 

上面这行语句是打开一个插件的界面,home对应的就是上面的uri字段,我们通过home,查找到对应的插件,然后它会打开这个插件在AndroidManifest.xml中声明的第一个Activity。

如果你要调起插件中声明的其他acitivity,你就需要用到rules了,首先是在bundles.json中声明你要跳转的acitivity,如上,如果你想调用home插件中的界面activity MyPage1,
你只需要写如下语句:

Small.openUri("home/page1", context); 

这个时候调用到的就是net.wequick.example.small.app.home.MyPage1这个类对应的activity了

你在调用插件的时候也可以通过queryparameter传参:

Small.openUri("home?from=main", context);

在调起的插件工程获取参数:
Uri uri = Small.getUri(this);
if (uri != null) {
    String from = uri.getQueryParameter("from");
    // Do stuff by `from'
}

2.4 插件加载管理
在host中我们一般要做两件事情:
初始化插件的baseUri;
这个一般在Application的onCreate完成:Small.setBaseUri(“http://m.wequick.net/demo/“);

另外是加载所有插件(待优化,一次加载所有插件过于耗时,我们应该是只加载必备插件,然后再慢慢加载其他插件)
Small.setUp(this, new net.wequick.small.Small.OnCompleteListener() {
@Override
public void onComplete() {
mContentView.postDelayed(new Runnable() {
@Override
public void run() {
Small.openUri(“main”, LaunchActivity.this);
finish();
}
}, 2000);
}
});
setUp提供了插件加载完成的回调,一般我们等插件加载完才能通过openUri去启动界面展示;

2.5 常用操作

打开界面:
Small.openUri(“main”, context);

创建插件提供的fragment :
Fragment fragment = Small.createObject(“fragment-v4”, “home”, context);
如果没有通过rules指定类名,默认的类名是 包名.MainFragment
如果指定了类名,和前面的规则一样。
createObject的第一个参数目前仅支持”fragment”或者”fragment-v4”

获取某个插件界面的Intent
有时候我们不是直接打开界面,比如通知栏通知,我们需要设置一个PendingIntent ,那这个时候需要的是一个Intent
此时可通过获取:

Intent intent = Small.getIntentOfUri("main",context)
获取调用时候的query信息:
//调用
Small.openUri("home?from=main", context);

//参数获取;
Uri uri = Small.getUri(this);
if (uri != null) {
    String from = uri.getQueryParameter("from");
    // Do stuff by `from'
}

三、插件加载流程

Small的核心类比较少,主要包含三类:

Small:接口类,提供用户能使用的各类接口; Bundle: 代表插件,保存了插件的全部信息,控制了插件的load流程,以及lauch流程;它会调用各类BundleLauncher来干活; BundleLauncher:有多个子类,比如.app.,.lib.类的插件,对应的是ApkBundleLauncher,.web.*对应的就是WebBundleLauncher,其他对应的就是ActivityLauncher

插件相关的操作主要有load和lauch:

其中应用启动的时候要准备插件环境,进行的就是load操作,主要是解析插件信息并缓存起来,并将插件dex和资源添加到host;load完成才能进行其他插件操作

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 浅谈Android Small插件化框架源码

相关文章

  • 2017-05-26Android中TextView添加删除线,androidtextview
  • 2017-05-26Android开发学习——打电话应用,android开发打电话
  • 2017-07-23android应用开发-从设计到实现3-8静态原型的Appbar折叠
  • 2017-05-26「视频直播技术详解」系列之六:现代播放器原理,
  • 2017-05-26编译器开发系列--Ocelot语言6.静态类型检查,编译器--ocelot
  • 2017-05-26谷歌电子市场5--推荐,谷歌电子市场5--
  • 2017-05-26硅谷社交3--登录页面,硅谷社交3--
  • 2017-05-26仿微信新消息提示音,消息
  • 2017-07-22Android深入四大组件(四)广播的注册、发送和接收过程
  • 2017-05-26dpdk内存管理——内存初始化

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 自定义一个全屏的AlertDialog。,全屏alertdialog
    • Android新手入门2016(13)--阻塞对话框PopupWindow
    • 安卓第十天笔记-fragment,安卓-fragment
    • Volley的基本使用,Volley使用
    • EventBus初理解,EventBus理解
    • 显示当前光照强度,当前光照强度
    • 硅谷商城第二版3--分类模块,硅谷商城第二版3--
    • Android EditText 取消复制粘贴功能,取消横向全屏编辑功能(一),androidedittext
    • 绘制视图,根据轴测图绘制三视图
    • 关于 android canvas 的简单总结

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有