am928 发表于 2025-2-20 19:15:04

Android插件化技术详解:从入门到放弃,包建强分享不同流派与核心知识

在本文中下载完整的PPT

资深司机简介

Bao ,《应用程序R&D记录》一书的作者。他还撰写了“ 2015年无线技术白皮书”,并在2016年“程序员”杂志上发表。他擅长iOS,并且有许多参与插件和iOS热维修技术。目前从事区块链技术研究。

介绍

让我们简要介绍插件。很久以前,公司已经在研究这项技术,而汤宝则做到了,但是淘宝的技术一直保持保密。直到2015年,许多框架才互相出现,并且插件被分为许多技术学校,实施方法也不同。我今天的主题是不同的学校和插件的想法,以及在进行插件时需要掌握的知识。我今天分享的话题是“从初学者放弃”。在45分钟的演讲中无法清楚地解释插电技术。我大致计算得出的是,真正解释这项技术至少需要六个小时,每个小时都会谈论一个主题,包括基础系统和与插件相关的类别以及四个主要类别。组件和相应的插入实现方法,增量更新,AAPT和其他技术的原理。

共享的内容分为七个部分。首先,过去和现在的生活,即插件的历史。第二部分是介绍性知识,即与插件相关的系统的基本实现原则。第三部分是技术学校,即当前的插电式技术学校及其特定和不同的实施方法。第四部分是实施外围关系技术。第五部分是目前在中国流行的开源框架,包括各种公司正在使用的框架,以及并非广泛流传但重要意义的框架。第六,它正在分享有关插件启动问题的经验。最后,这是插件的未来 - 我们应该放弃这项技术。

过去和现在的生活

插入插件的历史可能是本演讲中最有价值的内容。三年前,我已经对插件开发的一些规则进行了整理。

首先,请记住2012年的这个时刻。2012年,有人制作了插电技术,这是的Tu Yimin。他推出了实施框架。 是一家在中国制作应用程序相对较早的公司。他们积累了很多经验,尤其是插电技术。通过动态加载不同的页面,替换要更改的所有页面。我们还在这个项目中首次看到了如何在插件中读取资源。

在2013年,它出现了。提供一个可以动态下载插件然后动态运行的外壳。可以在外壳外写各种控件并将其放置在此框架中以进行运行。这是插电技术。目前,该项目的作者和开源地址尚不清楚。

在2014年初,您可能已经观看了一段视频,其中一名阿里巴巴员工共享了一项技术,特别是谈论淘宝的Altas技术和该技术的一般方向。但是许多技术细节没有共享。

然后是Ren 的里程碑项目。 2014年底,发布了一个名为-Load-apk的插件项目,该项目与随后的许多插件项目不同。它没有太多的基础方法来挂接系统,但是从上层解决了问题,即应用程序层,创建一个从继承的类,然后让插件中的所有内容都从和覆盖覆盖所有方法。

该项目成为一个里程碑的原因是,在2015年之前,行业中没有太多信息可供参考。后来,他与聊天,当时他如何努力发展这个框架,他感到非常感动。当时我在Tuniu工作,并使用了此插电框架。

2015年4月,推出了一个新框架,称为ACDD。该框架是指淘宝应用程序的许多经验,主要是Hook的想法。同时,它还首次提出了通过扩展AAPT解决插件和主机之间资源ID冲突问题的问题。

2015年8月,Zhang Yong发行了它。这是插件启动的第二个里程碑项目。这个项目太棒了,可以将任何应用程序加载到主机中。您可以根据此框架编写主机应用程序,然后可以加载其他人作为插件写的所有应用程序。该框架的功能确实非常强大,但是强大的成本是重写许多系统的基本代码,更不用说这个人相对懒惰并且没有配制任何文档,这使技术人员很难掌握掌握这个框架。 360年的田·魏胡(Tian )撰写了一系列专门介绍此框架的文章,我将在稍后介绍。

然后将有一个盛开的鲜花时代。上面有许多插件框架,但是这些框架的影响很小,因此我们将在这里跳过。

接下来是热维修技术。 2015年5月,iOS启动了一种机制,可以快速修复任何在线应用程序类的任何方法。但是,当时该系统无法快速更换它。因此,在2015年9月,有人找到了一种实现快速替代的方法,即,将在稍后讨论其原则。

2015年10月,的Jia Jixin制作了一个名为Nuwa(NUWA)的项目。主要想法是相似的,它们都是修复问题的解决方案,并且可以在线修复任何方法。不幸的是,稍后不会继续进行维护。

最后,在2015年底,它仍然是一个插电框架。来自福建的林·广林格(Lin )提出了一种新的机制 - 小框架。这种机制之间的区别在于,资源冲突的问题是通过脚本解决的。

初学者知识

https://img2.baidu.com/it/u=691628505,3506596138&fm=253&fmt=JPEG&app=138&f=JPEG?w=500&h=611

介绍插件的历史记录后,让我们谈谈插件启动所需的基础系统知识。这里的大多数人都是从发展中的,也许是一半到三分之一的人,有些人只工作了一两年,希望对插件有更深入的了解。为了充分了解插件技术,您首先需要了解系统的基本实现。

首先,制作原始系统代码的人应该非常熟悉它,没有它,很难前进。涉及两层技术。您可以将其视为中介模型,该模型在客户端和服务器端之间扮演中介的角色。这就是我在此期间的想法。为了实现四个主要组件的插件,需要修改。无法修改服务器上的内容,因此您只能修改客户端的代码。这四个主要组成部分中的每个客户的客户都不同,您需要自己发现。由于时间限制,我不会在这里谈论它。

最好的学习方法是艾滋病。您可以阅读有关AIDL的大量信息。通过制定AIDL文件,您可以自动生成Java类,研究此Java类的每种方法和变量,然后查看实际上与AIDL相似的四个主要组件。 。

其次,这是应用程序包装的过程。编写代码后,我执行了包装操作,并进行了资源包装,DEX生成,签名等的过程。最重要的是资源包装,即AAPT步骤。如果主机的资源ID和插件冲突,则一个解决方案是在此处进行修改。

第三,该应用程序在手机上的安装过程也非常重要。熟悉安装过程不仅有助于插件,而且在遇到安装错误时也非常重要。在手机上安装应用程序时,通常会有下载异常,提示无法解析资源软件包。目前,您需要知道安装应用程序的代码在哪里。这只是第一步。

第二步需要知道在本地下载应用程序后需要完成什么。无法访问手机的某些目录。将应用程序下载到本地目录后,将其放置在哪些目录和哪些文件中。插件中有一个增量更新的概念,如何下载增量软件包,从本地位置取出软件包,此软件包的特定命名规则是什么。这些详细信息必须清楚地理解。

第四,这是应用启动过程。几种开始方式?一个是写一个,第二个是单击移动应用程序,然后使用移动系统中的机制来启动默认应用程序。通常,应用程序开发人员喜欢的第二种方式是第二种方式。那么第一个方法的开始原理是什么?另外,启动时主要功能在哪里?该主要功能的位置非常重要。我们可以修改其所在的类以实现插件。

第五点更重要。进行插件时需要控制两个地方。首先,插件DEX的加载。如何将插件DEX中的类加载到内存中?另一个是资源加载的问题。该插件可能是APK左右的格式。无论哪一个,R.ID都不会生成,因此不能使用它。这个问题有几种解决方案。

一种是一种重写等的方法,用于更改概念并让插件读取插件中的资源,但缺点是主机的资源ID和插件冲突以及AAPT需求重写。另一种方法是重写保存在AMS中的插件列表,以便主机和插件可以加载其各自的资源而不会发生冲突。第三种方法是在包装后执行脚本并修改生成软件包中的资源ID。

第六点是如何在实施插件后解决不同插件开发人员的工作空间问题。例如,您需要为插件1和插件2下载哪些代码?如何独立运行它们?就像空气票和火车票一样,您如何只运行自己的插件而不是其他插件?这是协作工作的问题。

火车票和机票,这两个团队的工作区不同,因此目前使用脚本。每个项目都有自己的仓库和自己的包装脚本。您只需要使用自己的插件,而主机项目已包装并一起运行,而无需引入其他插件。更重要的是,您还可以包装并运行自己的插件作为应用程序。

以上内容介绍了插件的入门知识,总共有6点,每个点需要大量时间来理解。否则,当面对插件项目时,您会在许多地方感到困惑。只要您了解这六个核心要点,一切都可以轻松解决。

技术学校

接下来是技术的流派。目前有三种类型的技术学校。

第一个是动态替换,即钩子。钩子可以在不同的级别上进行,因此动态替换也被细分为几所小型学校。

您可以在其中直接执行钩子,重写几种使用自己的总和的方法;您也可以在更抽象的级别上进行钩子,也就是说,所涉及的类包括等。最高级别是AMS对其进行修改,这是张Yong的解决方案。这里需要修改许多类,以及AMS,PMS等。需要修改。简而言之,您要钩的抽象越多,需要做出的更改就越大,但是优势在于它的灵活性越高。没有更好的方法,这取决于您自己的选择。

第二种是静态代理,这是Ren 框架所采用的想法。从基类写一个继承,并重写基类生命周期中涉及的所有方法。插件没有生命周期,因此让插件从中继承,因此将有一个生命周期。

第三种是DEX合并,这是热门修复的想法。我刚刚提到了两个项目 - 和Nuwa,其想法是相同的。 DEX带有本机APK,同时加载了插件DEX。但是有一个序列问题,该问题取决于机制。如果主机DEX和插件DEX具有具有相同名称空间的类方法,则首先加载DEX,而哪个DEX是此类的方法,Dex将占据山作为国​​王,而其他方法是其他方法。以后更换同名。

因此,热维修是优先考虑在插件包装中的DEX加载以实现热维修。由于热维修插件套件通常只包括一种类方法,因此大小很小,并且与普通插件的数量级不同,因此它们仅称为热维修补丁程序包,而不是插件。

技术外围设备

https://img1.baidu.com/it/u=1886919388,1260912602&fm=253&fmt=JPEG&app=138&f=JPEG?w=1453&h=500

技术外围内容有三个部分。首先,有AAPT,资源冲突,即默认应用程序应用程序,插件冲突中的资源和数据资源。如果没有引入此资源,那就可以了。很多时候,即使发生冲突,也没关系。问题在于,当插件引用资源并且无法解决时,存在冲突。我应该怎么办?然后,您必须立即重写该应用程序。有一个关于包装的应用程序,您可以添加当前的前缀并将其更改为所需的内容。例如,火车票和酒店是单独命名的,因此您可以指定前缀,软件包和插入模块,并且资源前缀不同。小米还承认它将占据0x11的前缀。这是需要关注的一点。

第二个是增量更新。关于360的最棒的事情是,它将所有数据与以前的版本不同并生成增量数据。当然,他们还更新了插件。 360的Liu 制作了增量更新框架。您可以在背景服务器上将应用程序的两个版本拆分,然后将增量软件包下载到局部区域,将其与局部区域合并,提供STK,然后将其组合在一起。这是增量更新。

第三是插件管理平台,它管理每个版本的差异以及每个插件最低数据的版本编号。

令人尴尬的困境

接下来是过去两年中出现的一些令人尴尬的困境。

首先,插件已成为错误维修的工具。这与插件的最初意图不同。插件是实现新功能,而不是修复错误。

其次,插件启动现在具有更好的替代方法-RN。接下来,RN将是真正实现动态的最佳方法,至少这就是我的想法。

第三,插电式技术仅在中国有一个市场。外国公司对这项技术根本不乐观,这可能是因为他们使用它,而不建议使用插件方法。外国开发商不敢超越这条线。

第四,所有四个主要组件都需要插入吗?根据我自己的经验,有一个或200个电子商务或旅行应用程序很少使用,基本上没有使用。因此,这种应用程序实现和插件启动就足够了。诸如移动助手之类的应用程序经常使用四个主要组件,因此所有四个主要组件都必须插入。这也是张杨在当时360年对四个主要组成部分的支持的原因。

未来的方向

最后,让我们谈谈插件的未来方向。阿里巴巴技术专家冯·森林(Feng )曾经说过,最强大的插件方向应该是每个插件都是插件。在插电式技术交换组提出了这一观点之后,该小组中的每个人都保持沉默很长一段时间。如果您仔细考虑一下,插件的未来确实是开发方向,因此您可以快速替换任何问题。但是一旦提出了RN,这种观点就会逐渐消失。 RN比插件轻,越来越多的人选择RN。

其次,这是双开的技术。双开发技术现在是一项非常受欢迎的技术。如果要实现此机制,则必须实现上述插件介绍的内容。 Lody是宁波的一名高中生,自初中三年级以来就开始研究这项技术,并为其投入了许多良好的双重开放项目。

第三,可以实现我刚才提到的所有数据的增量下载机制。尽管执行非常麻烦,但是一旦实施,它将使您的应用程序非常快。例如,您是否需要每次输入时都需要刷新城市列表?即使您打开GZIP,刷新速度仍然非常慢,大约几百kb。增量更新是更新它的好方法。

最后,这是内部力量的培养。阅读上面列出的基本知识,然后进行应用程序应用程序。您会清楚地知道何时使用静态广播和动态广播,并且在哪些情况下可能发生错误。 AIDL可能很少使用,但是在设计和实施它方面,这种基本技能非常重要。因此,插件只是一项技术,您最关注的是其背后的本质,即内部力量培养。
页: [1]
查看完整版本: Android插件化技术详解:从入门到放弃,包建强分享不同流派与核心知识