关于包管理:插件化工程R文件瘦身技术方案-京东云技术团队

随着业务的倒退及版本迭代,客户端工程中一直减少新的业务逻辑、引入新的资源,随之而来的问题就是安装包体积变大,后期各个业务模块通过无用资源删减、大图压缩或转上云、AB试验业务逻辑下线或其余伎俩在升高包体积上获得了肯定的成绩。 在瘦身的过程中咱们关注到了R文件瘦身的概念,目前京东APP是反对插件化的,有业务插件工程、宿主工程,对业务插件包文件进行剖析,发现除了惯例的资源及代码外,R类文件大略占包体积的3%~5%左右,对宿主工程包文件进行剖析,R类文件占比也有3%左右。咱们先后在对R类文件瘦身的可行性及业界开源我的项目进行调研后,摸索出了一套实用于插件化工程的R文件瘦身技术计划。 实践根底—R文件R文件也就是咱们日常工作中常常打交道的R.java文件,在Android开发标准中咱们须要将利用中用到的资源别离放入专门命名的资源目录中,内部化利用资源以便对其进行独自保护。 内部化利用资源后,咱们可在我的项目中应用R类ID来拜访这些资源,且R类ID具备唯一性。 public class MainActivity extends BaseActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }}在android apk打包流程中R类文件是由aapt(Android Asset Packaing Tool)工具打包生成的,在生成R类文件的同时对资源文件进行编译,生成resource.arsc文件,resource.arsc文件相当于一个文件索引表,应用层代码通过R类ID 能够拜访到对应的资源。 R文件瘦身的可行性剖析日常开发阶段,在主工程中通过R.xx.xx的形式援用资源,通过编译后R类援用对应的常量会被编译进class中。 setContentView(2131427356);这种变动叫做内联,内联是java的一种机制(如果一个常量被标记为static final,在java编译的过程中会将常量内联到代码中,缩小一次变量的内存寻址)。 非主工程中,R类资源ID以援用的形式编译进class中,不会产生内联。 setContentView(R.layout.activity_main);产生这种景象的起因是AGP打包工具导致的。具体细节,大家能够去查阅一下android gradle plugin在R文件上的处理过程。 论断:R类id内联后程序可运行,但并非所有的工程都会主动产生内联景象,咱们须要通过技术手段在适合的机会将R类id内联到程序中,内联实现后,因为不再依赖R类文件,则能够将R类文件删除,在利用失常运行的同时,达到包瘦身目标。 插件化工程R文件瘦身实战制订技术计划目前京东Android客户端是反对插件化的,整个插件化工程蕴含公共库(是一个aar工程,用来寄存组件和宿主共用的类和资源)、业务插件(插件工程是一个独立的工程,编译产物能够运行在宿主环境中)、宿主(主工程,提供运行环境)。在插件化的过程中为了避免宿主和插件资源抵触,通过批改插件packageId保障了资源的唯一性。因为公共资源库、宿主是被很多业务依赖,对这两个我的项目进行改变评估影响波及比拟多,插件个别都是业务模块自行保护,不存在被依赖问题,所以先在业务插件模块进行R类瘦身实际。 对业务插件工程打出的包进行反编译当前,发现R类ID无内联景象,且R类文件具备肯定的大小,对包内的R文件进行剖析,发现R文件中仅蕴含业务本身的资源,不蕴含业务依赖的公共资源R类。 public View onCreateView(LayoutInflater paramLayoutInflater, ViewGroup paramViewGroup, Bundle paramBundle) { this.b = paramLayoutInflater.inflate(R.layout.lib_pd_main_page, paramViewGroup, false); this.h = (PDBuyStatusView)this.b.findViewById(R.id.pd_buy_status_view); this.f = (PageRecyclerView)this.b.findViewById(R.id.lib_pd_recycle_view);} 联合对业界开源我的项目的调研剖析,尝试制订合乎京东商城的技术计划并优先在业务插件内实现R类ID内联并删除对应的R文件。 1.通过transformapi 收集要解决的class文件Transform 是 Android Gradle 提供的操作字节码的一种形式,它在 class 编译成 dex 之前通过一系列 Transform 解决来实现批改.class文件。 ...

June 13, 2023 · 2 min · jiezi

关于包管理:打造手淘极简包的轻量化框架

作者:周松(北傲) 现在app冗余与包大小始终都是很多业务挥之不去的优化项。行业内很多极简包如雨后春笋般冒出来。又或者是很多业务对极简包的摸索也有踊跃的尝试。 极简包带来的价值,不仅是包大小上的量变,更是用户下载转化率和投放带来的正向效应,线下下沉市场的开拓具备重要价值,对拉新转化率影响很大。 个别极简包会有两种计划: 1、作为一个套壳App,套了一层H5。次要链路由前端去买通交易流程,而后通过更新计划疏导用户降级; 2、作为一个套壳App,套了一层H5。次要链路由前端去买通交易流程,而后通过插件化的模式去动静更新Native版本的app。 无论采纳上述哪种形式,作为H5的载体,只应用原生的web去关上页面体验感仍不是很好。同时还会伴有各种H5的适配联调和优化。而对于H5比拟宏大的业务,如手淘,很多页面前端去适配有极大的工作量,投入产出比不高。 故手淘极简包提供第三种计划: 3、主页由多个TAB实现,能够Native或者H5,由业务本人去抉择,详情页通过H5去加载。前期降级链路是传统Apk更新或者插件化由业务方本人去抉择。 由此手淘极简包我的项目拆散了一个能够疾速搭建极简App的框架。可供作为根底脚手架,疾速搭建出本人业务的极简版App。 MTASMini TaoBao Application Scaffold MTAS是手淘极简版利用脚手架,是基于疾速搭建极简包我的项目的App框架。 现在手机淘宝极简版采纳此极简包根底框架,包大小4M+。 基础架构思维导图 极简根底框架从构造上次要分为几个局部: 极简根底服务 极简根底库 -- 次要集成团体的根底依赖,比方:网络、容器、登录等。都是通过裁剪或重构过的精简版,相较于原版冗余简单性能多,精简版的根底依赖轻量简略性能少。只有须要的根底性能,不去额定减少包大小的累赘。 对立api层 -- 要想疾速搭建一个轻量的app,根底的性能封装不能少,在这个模块中,对立实现罕用的性能,若是业务接入,不须要反复造轮子。只须要简略调用即可。 极简外围容器 极简外围容器由mini-网页容器sdk作为载体,外围实现极简版的相干对立拦挡导航。反对登录、back、跳转、外链拉起、降级等性能。启用多webview计划代替原生webview的缓存后退后退等策略,使页面过渡更加晦涩。进入前后级更加疾速,交互更好。内置缓存冷启及首次启动达到秒开级别,晋升用户体验。 极简降级链路 能够同时反对插件化下载、装置、切换。也能够反对传统的利用apk下载、装置、降级。通过流式调用管制下载相干的操作,调用方能够自定义下载流来做本人想做的事件,例如一些流前查看,流后处理,开关管制等等。 极简业务组件 搭建一个简版首页的根底视图组件、罕用的下拉刷新、上拉加载组件、裁剪过的recyclerView等等组件,能够反对搭建简略的首页。 具体设计极简包根底框架自下而上,从根底依赖到下层业务,一层层做解耦和拆散。 业务能够调用根底性能,也能够自行扩大性能。比拟灵便。 极简包定义一套轻量化计划,外围解决以下三类问题: 包大小:通过轻量根底服务,以及Native + H5业务状态缩减包体大小至4M+;降级转化:插件化底座实现静默更新,插件静默更新 + 兜底APK更新 + 利用市场自动更新,整体晋升降级率;端内体验: Native化外围页面、H5预渲染、H5详情极速版晋升外围链路加载体验登录,保障包体大小前提下,反对支付宝登录、手机号一键登录&验证码登录、首页强疏导。极简版架构设计 极简根底服务极简根底库次要集成团体的根底依赖。都是通过裁剪或重构过的精简版,相较于原版冗余简单性能多,精简版的根底依赖轻量简略性能少。只有须要的根底性能,不去额定减少包大小的累赘。 以下介绍几个次要的裁剪根底库: 网页容器sdk裁剪比照图 mini-网页容器sdk,是一个可扩大的 Hybrid 利用解决方案,为客户端内的 Web 页面提供了弱小、易用的 WebView 容器。轻量且易用,目前只有500kb,不依赖UC内核,做到小而简。 图片库sdk裁剪比照图 mini-图片库sdk,精简无线图片库sdk是阿里巴巴Android端集图像加载、显示、解决、监控于一体的一站式解决方案。笼罩业内支流图片库外围个性,同时就地取材联合团体CDN图片解决规定,旨在更无效地节俭流量、更优越的内存占用、更极致的性能优化、更晦涩的加载体验。简化线程调度框架,缩小图片格式反对,轻量图片降级计划,保留根底性能,对模块合并,代码优化,膨胀一些负责性能。 网关sdk裁剪比照图 mini-网关sdk ,精简API网关平台,为客户端、H5和服务端提供对立、快捷、牢靠的API接入以及监控报表服务。保留平安框架的能力,保障挪动平台利用完整性、利用执行环境可信性、数据机密性。原生网络库减小包大小。提供plugin供前端调用。 mini-数据采集sdk,一套面向客户端开发的目前团体内笼罩app最多的数据采集SDK,具备数据安全级别高、数据达到率高、传输流量小等特点。优化代码做裁剪,去网络底层sdk依赖。 mini-登录sdk,对立登录SDK为淘系APP打造统一的账户体验,并且与平安深度集成,提供统一的平安水位。 代码裁剪,突出一键登录及sso登录,进步登录效率。缩减链路长的登录。 极简包依赖大小比照图 极简包根底依赖裁剪过后,正向收益是非常显著的,无效的升高了包大小,去除不必要的依赖和性能。使利用达到轻量化和简洁化。负向影响也能够意料,性能多样性升高,可供的抉择缩小。 对立api层极简包根底框架中做了一套对立根底实现。集成罕用的工具类,对性能的应用也做了封装。 根底实现包类展现 每个包的划分使职责明确。应用方能够间接用外面的各种办法。也能够本人自定义须要的性能,或者实现接口扩大想要的能力。 极简外围容器容器外围承接了业务的根底性能,保障失常的H5流程及平安相干的反对。同时也能够自定义实现业务方本人的扩大。 拦挡导航 路由拦挡导航次要分为两个局部:替换器(Replace)和拦截器(Filter)。拦截器次要负责拦挡并且做一些安全性的校验以及解决;替换器次要解决业务上通用的性能,不便调试测试的性能等等。 ...

January 17, 2022 · 1 min · jiezi

关于包管理:包管理NPM

NPMnvmnpm1. NVMNVM(Node Version Manager):Node版本治理 Windows上装置地址 下载压缩包间接装置即可常用命令 查看 //查看可装置的node版本nvm ls available//查看曾经装置的node版本nvm ls装置与卸载 //装置一个nodenvm install [version]//卸载一个nodenvm uninstall [version]切换 //切换node版本nvm use [version]2 NPMNPM(Node Package Manager):Node包治理 包治理上传包脚本NRMNPX2.1 包治理全局装置 //全局装置与卸载 不指定version默认为以后最新版本npm install(i) package[@verison] --global(-g)npm uninstall package[@verison] -global(-g)查看 //查看包可装置的版本npm view package[@verison] versions//查看装置的所有包npm list(ls)//查看已装置的一个包npm list(ls) | grep package本地装置 //初始化package.jsonnpm init -y//装置至生产环境npm i package[@verison] [--save]//装置至开发环境npm i package[@verison] --dev(-D)//卸载不必增加额定的修饰符更新版本package.json中的版本锁定 :不锁定版本 - 更新三位^X.X.X:锁定第一位 - 更新后两位~X.X.X:锁定前两位 - 更新最初一位X.X.X :锁定三位 - 指定版本更新 //依据锁定查看可更新信息npm outdated//更新至锁定的最新版本npm update//装置指定版本npm i package@version革除缓存 npm cache clean --force包第一次装置失败后再次装置也可能失败,须要革除缓存2.2 上传包创立一个包 ...

October 28, 2021 · 1 min · jiezi