南农校友开发APP,帮你定制摄影师_励志网

南农校友开发APP,帮你定制摄影师

2018-07-18 03:20 来源:励志网

在讲述我们团队为何要在2013年底,设计一套属于自己的插件化之前,我们先来简单谈谈,有了插件化方案后,能为我们带来多大的便利,它究竟解决了什么问题。

此外,目前360公司几乎所有的亿级用户量的APP,以及多款主流第三方APP,都采用了RePlugin方案。

总而言之,您们现在看到的RePlugin,可以说是“久经沙场”、“历经风雨”的方案,是在数亿设备上,历经三年多时间验证的成熟方案,也是可以直接拿来为您们所用的,稳定与灵活兼得的方案。

“不够稳定”怎么破?

然而,在实际调查过程中,我们却发现了一个和这些好处完全不匹配的奇怪现象。究竟是什么呢?

基于上述的情况,我们团队在2014年初,研究全新占坑插件化框架(注意,此时DroidPlugin类方案还没有出现)时,就定了个“小目标”:让Hook越少越好。经过一次次的研究讨论,最终确定只Hook一个点:ClassLoader,且要求“坚持到底”,所有改动都是基于此来展开。

GitHub地址:https://github.com/Qihoo360/RePlugin。

使用不当:“常在河边站,哪有不湿鞋”,Hook的点多了,一旦对某一点的实现原理理解不透而出了错。结果,前功尽弃不说,还可能出现更严重,且更难以察觉的崩溃事故,细思恐极。

随时体验新版:不用去应用市场等到大包升级,用户可以随时体验到新版的应用。现在红极一时的插件化、动态化(RN类)、热更新技术,都或多或少的在围绕此点而展开,可见其对用户带来的巨大价值

插件占应用比(指把代码资源铺开,插件占整个应用的比例)高达83%

年发版次数高达596次(平均每个工作日发版2-3次)

准坑位方案:有的(如2013年的我们)会通过Fragment来模拟Activity,从而实现一定程度上的灵活。

为什么要做RePlugin

“不够灵活”怎么破?

修改ClassLoader的点其实不难,如上图所示逐步反射即可。然而需要注意的是,这个ClassLoader一定得继承自PathClassLoader,防止Android7.x因使用addDexPath而有问题。

组织结构灵活:一旦发版变得足够灵活,则组织结构上就可以由原来的“统一作战”变成“百团作战”,每个团队都在开发“自己的插件单品”,制定自己的发版计划

管理成熟:拥有成熟稳定的“插件管理方案”,支持插件安装、升级、卸载、版本管理,甚至包括进程通讯、协议版本、安全校验等

我们的核心思路,是2015年以后才开始“老生常谈”的一个词,那就是:坑位。

无论是UI、核心业务、合作插件、后台服务,还是基础功能,都可以变成插件,并在RePlugin框架内稳定又灵活的运行起来。甚至,不仅大项目能用,小项目——甚至只是个计算器——都可以使用RePlugin来提升自己的灵活性,并最终实现“插件满天下”的神奇效果。

(RePlugin的核心优势)

对我们而言,这是里程碑式的决定,即便到现在来看也是如此。

那么今天,我们就来详细的和您聊一聊,这个从2014年中旬,正式在手机卫士上启用,并即将开源的360RePlugin,究竟能为我们,更为您能带来什么。

为此,我们在“坚持一个Hook点”原则的前提下,通过不断创新,最终解决了上述问题。

看似灵活,然而下列三种情况,将很有可能导致插件甚至应用,彻底不能工作:

#p#分页标题#e#坑位方案:可以做到“一对多”的关系。例如插件有个XXXActivity,则运行时,主程序可以将自己的N1ST1对应到这个XXXActivity上。一旦该Activity退出,则N1ST1就“空闲”出来。而当YYYActivity进来后,又会重新占用N1ST1。这样就可以做到一个坑位(如N1ST1)对应多个实体。

发版灵活:不用等市场上线,等用户主动升级,结果错过宝贵的时机。插件化方案可让您做到“随时发版”,不受“发版窗口期”的限制。甚至可针对不同地域、不同用户群、不同时段来更新,且可以快速验证自己的构想

虽然我事先已做好功课,然而在GMTC上的调查结果却让人大跌眼镜——在参会的200多位安卓开发者中,仅有不足5%的比例,使用了插件化方案。超过九成的开发者,目前上没有将插件化应用在软件开发之中。

欢迎您为RePlugin项目加Star、发送PullRequest,提Issue。我们会竭尽所能回答您们的疑惑。

截止2017年6月底,RePlugin的:

非坑位方案:标准的一一对应关系。例如,插件有个XXXActivity,那么主程序则要求必须也有个XXXActivity(名字未必一样)来对应。

唯一Hook——ClassLoader

注意:这里所说的“Hook”是指通过Java反射手段,获取并修改与系统Server等交互的InternalAPI,来让框架正常工作的行为,如上面所列部分。正常情况下的反射(例如反射类内部自己的字段)不属于Hook。

当然,我们当初设计坑位思想(恕我再强调,是2014年初)时,也绝不仅仅针对Activity,而是整个四大组件,甚至到了后期,连Theme、进程、Task-Affinity等都做到了“坑位化”,只不过实现方式各异而已。

非常稳定:Hook点仅有一处(Classloader)。其崩溃率做到仅为“万分之一”,并完美兼容市面上近乎所有的AndroidROM。

极其灵活:主程序无需升级(无需在Manifest中预埋组件),即可支持新增的四大组件,甚至全新的插件

我们是怎么做的

对于开发者而言

易于集成:无论插件还是主程序,只需“数行”就能完成接入

目前市面上的完整坑位方案,Hook的地段可以说是“各有千秋”,从AMS、Instrumentation到ContextImpl都有,并以此让插件变得更灵活。

如上所述,无论是对用户,还是对开发者而言,使用插件化框架都是大有益处的,理应做到“飞入寻常应用家”。

进程任意:可让各组件跑在UI、常驻,甚至是“任意坑位进程”

模块思维:可以让团队形成“模块意识”。当然,插件间、插件与宿主间允许有适度的耦合,但不会是“毫无控制”的那种。这让开发者们意识到,我们之间是“插件间的协定”,而非“同一屋檐下随便胡来”,迫使团队以全新又合适的方式来开发应用

#p#分页标题#e#Android原生优势:和动态化(RN类)不同,您可以使用最熟悉的Java/Kotlin语言,及各种原生API来开发您的插件。这使得应用能和系统更“契合”,充分利用原生的各种优势,且在性能上几乎感受不到影响

不够稳定:目前有很多比较灵活的插件化框架,虽然支持特性众多,但因Hook点较多,所以不是非常稳定。因此很多大型项目不是很愿意用它们来开发插件,担心出现应用崩溃、插件无法正常使用等问题。

实际上,这和我们在线下观察到的结果基本吻合。结合之前的调查,我们发现,有三大挑战制约了插件化在Android开发界的普及:

简单来说,我们有五个核心步骤:

既然这么大胆,那么,我们究竟是怎么做到的呢?

而我们的方案和他们有些不同:除了ClassLoader是Hook的,其余一律不需要。那么我们究竟是如何开启一个插件的Activity呢?

一切按需:利用插件化方案,可以让您的应用变得“小而精”。只有当用户需要使用某个特定功能时,才可以下载并开启,且可以随时卸载插件。这不仅可以减小APK大小、节省流量,还可明显的减少内存、内部存储占用,将更多空间让给珍贵的相片、文档等资料

前文提到,不够稳定的主要原因是Hook了太多。那么市面上比较灵活的插件化框架,究竟Hook了哪些呢?

除此之外,此ClassLoader所在位置也非常稳定。目前来看,从Android2.1至今都没有发生过位置、名称上的变化,可以长期使用。

关于这一点,我们之后会有一篇文章来详述,敬请期待。

插件数已达102个(其中,核心基础插件57个)

数亿支撑:有360手机卫士庞大的数亿用户做支撑,三年多的残酷验证,确保App用到的方案是最稳定、最适合使用的

自由隔离:想隔离就隔离(如不稳定或占资源的插件,易于释放),不想隔离的模块就混用(如各种基础、UI插件,都跑在UI进程内,性能优异)

因篇幅所限,这里仅以常用的Activity来简述。有关更详细的内容,欢迎继续关注我们的《RePlugin深度剖析》系列文章。

功能丰富项目专用:目前市面上的插件化方案,大多仅在功能丰富的大型项目中,才被考虑使用,且多用于边缘功能,比如“红包”、“天气”、“摇一摇”等,他们认为只有“非核心”模块,才会考虑做成插件。这也使得插件化的应用范围非常狭窄。

前文提到,就目前市面上的插件化框架而言,若做的足够稳定,则多少会失去一些灵活性。对于我们拥有这么多模块的产品而言,这同样也是不可接受的。

ROM修改:比Android升级更可怕的,是第三方ROM对内部API的“各种改”。这个适配难度是可想而知的。例如自定义Resource、自定义WiFiService等造成的“插件化血案”,不一而足。

此外,这个YYYActivity既可以是已有的,也可以是插件新增的。这样无论插件如何升级,主程序都可以不用动,即可支持新的Activity。

记录:通过PM.startActivity方法来“记录”到要打开的Activity的名字

特性丰富:支持近乎所有在“单品”开发时的特性,包括静态Receiver、Task-Affinity、自定义Theme、进程坑位、AppCompat等

Android升级:既然是内部API,那么Android自然不会认为是“不能修改的”,一旦系统升级时做了改动,轻则功能不正常,重则直接Crash。例如有的插件化框架曾遇到在Android7.0上出现异常,必须升级主程序才能解决的事故,历历在目。

(RePlugin与现有插件化框架的对比)

既然插件化这么好,为什么……

一旦插件要添加一个新的Activity,则对应的,主程序也必须得添加,否则就无法使用这个Activity。

然而,通过我们多年的实践证明,以上三大挑战,其实是可以被攻克的。这也是我们今天要为您介绍的,360手机卫士首款Android开源项目——RePlugin。

然而真的遇到大需求,如和其它应用Activity的交互等,就局限百出,很难称得上是完整坑位思想。

“RePlugin将在6月底开源,这将是我们献给安卓世界最好的礼物。”当我们宣布这一消息时,心中的激动,无以言表。是的,三年的“厚积”,如今的“薄发”,看似平凡的话,实际上却饱含了我们太多的激动、辛酸与泪。

不够灵活:有一些相对稳定的插件化框架,又存在“不够灵活、自由”的问题,一旦插件有较大改动,如新增Activity、Service、进程等,就需要主程序发版,更不用说能做到“一年前的主程序,无需升级,可以用新插件和组件”。也因此,很多项目的“接入动机”也就大打折扣了。

RePlugin是一套完整的、稳定的、适合全面使用的,占坑类插件化方案。其主要优势有:

责编:

视频新闻

  1. App Store将推竞价广告 提高开发者分成比例
  2. 纽约市力推科技教育 让中学生学习开发app
  3. 谷歌正开发移动聊天APP 明年上线无需谷歌账户
  4. 谷歌旗下技术中心打造AR APP 实时体验家具效果
  5. 美国推出白宫观光APP 增强现实技术展现四季风景 _金羊网新闻
  6. 3D东东APP荣膺“金屏奖—最佳3D/VR内容体验奖”
  7. 船用阀门APP 点亮船用阀门业的星星之火
  8. 招商银行APP5.0、摩羯智投正式上线
  9. 神级预判!买家具可以用AR技术提前放置屋里
  10. 【监管层召集百家券商培训 史上最严投资者保护
  11. 假如每个球员都开发一款APP,你想下载哪一个?
  12. App的江湖与小程序的生态,开发者该何去何从?