李子园出新品啦!李子园果蔬酸奶赋予双重营养!
芹菜可帮助人们润肠通便,调节钠钾平衡。
此外,寻求专业人士的建议和支持,与亲朋好友分享减肥经验,也将有助于您更顺利地实现减肥目标。特别是对于孕妇、哺乳期妇女、糖尿病患者、低血糖患者等特殊人群,更需要在专业人士的指导下进行尝试。
根据基因检测结果,您可以了解自己对某些食物的反应,例如有些人可能对乳糖不耐受,有些人可能更容易从碳水化合物中吸收能量。重复:将高强度和低强度运动交替进行,共进行6-8轮。例如,一项发表在《新英格兰医学杂志》的综述指出,间歇性禁食可以降低胰岛素抵抗、降低胆固醇水平、减轻炎症反应等。PART02间歇性禁食法间歇性禁食是一种逐渐受到广泛关注的减肥方法。放松:最后进行5分钟的轻松拉伸或冷却运动。
这种锻炼方式可以在较短时间内帮助您燃烧大量热量,提高新陈代谢率,从而达到减肥效果。通过对个人基因的检测,我们可以更深入地了解自己的身体特点,从而制定更加符合自身需求的减肥计划。虽然在这封公开信中并未明确组织架构调整所涉及的人数,但有接近好大夫在线的人士透露,这次裁员比例可能达到80%。
自2022年12月开始的一系列业务调整以来,公司亏损情况快速改善,但面对股东撤资、要求赎回的巨大压力,调整方案未达到预期。原标题:好大夫在线再传瘦身:三不做原则下盈利能力遭质疑,理想主义难敌股东撤资? 源自网络 好大夫在线疑似将再次面临瘦身。去年12月某论坛上,王航曾指出,医疗服务是整个行业的核心。但资本市场整体低迷之下,此方案仍难达到股东预期。
不愿被资本裹挟的理想主义 但是,作为2006年创立的第一批互联网医疗企业,好大夫在线却一直选择不上市。而其最大的一笔投资额则来自腾讯在2017年领投的D轮融资,总金额高达2亿美元。
去年,在资本市场压力之下,公司多个股东提出撤资、要求公司回赎。在去年12月的内部信中,王航提出,希望公司能摆脱对融资的依赖、自负盈亏。事实上,好大夫已有5年时间没有传出过融资新闻。而在今年6月8日流传出的好大夫内部信中,指出:当前我们面临主要压力,在于股东撤资、要求赎回的巨大压力
R 文件瘦身的可行性分析 日常开发阶段,在主工程中通过 R.xx.xx 的方式引用资源,经过编译后 R 类引用对应的常量会被编译进 class 中。插件化工程 R 文件瘦身实战 制定技术方案 目前京东 Android 客户端是支持插件化的,整个插件化工程包含公共库(是一个 aar 工程,用来存放组件和宿主共用的类和资源)、业务插件(插件工程是一个独立的工程,编译产物可以运行在宿主环境中)、宿主(主工程,提供运行环境)。由于公共资源库、宿主是被很多业务依赖,对这两个项目进行改动评估影响涉及比较多,插件一般都是业务模块自行维护,不存在被依赖问题,所以先在业务插件模块进行 R 类瘦身实践。1. 通过 transform api 收集要处理的 class 文件 Transform 是 Android Gradle 提供的操作字节码的一种方式,它在 class 编译成 dex 之前通过一系列 Transform 处理来实现修改.class 文件。
我们先后在对 R 类文件瘦身的可行性及业界开源项目进行调研后,探索出了一套适用于插件化工程的 R 文件瘦身技术方案。setContentView(2131427356); 这种变化叫做内联,内联是 java 的一种机制(如果一个常量被标记为 static final,在 java 编译的过程中会将常量内联到代码中,减少一次变量的内存寻址)。
在业务模块引入 R 类瘦身插件后,业务模块功能可正常运行,且插件包大小均有 3%~5% 不同程度的减少。当然围绕 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 文件。非主工程中,R 类资源 ID 以引用的方式编译进 class 中,不会产生内联。在瘦身的过程中我们关注到了 R 文件瘦身的概念,目前京东 APP 是支持插件化的,有业务插件工程、宿主工程,对业务插件包文件进行分析,发现除了常规的资源及代码外,R 类文件大概占包体积的 3%~5% 左右,对宿主工程包文件进行分析,R 类文件占比也有 3% 左右。为了解决这个问题一开始的方案设想是增加白名单机制,keep 住所有被业务模块使用的公共资源,但很快这个想法就被推翻,公共资源存在本身就是希望各个业务模块直接引用这部分资源,而不是自己定义,如果 keep 住的话,必然有很大一部分的资源无法删减,瘦身的效果会大打折扣。public MapString, String parse() throws Exception { if (in == null) { return null; } DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(in); Element rootElement = doc.getDocumentElement(); NodeList list = rootElement.getChildNodes(); return resNode; } } R 类资源 id 内联部分代码如下: public void visitFieldInsn(int opcode, String owner, String name, String desc) { if (opcode == Opcodes.GETSTATIC) { //优先从业务模块R类资源中查找 Object value = jdRstore.getRFieldValue(owner, name); if (value != null) { mv.visitLdcInsn(value); return; } //从公共R类资源中查找 value = getPublicRFileValue(name); if (value != null) { mv.visitLdcInsn(value); return; } } super.visitFieldInsn(opcode, owner, name, desc); } 该方案完善后,结合商详业务插件进行了验证,在商详及宿主均完成 R 文件内联瘦身后,商详模块业务功能可正常使用,无异常现象。@Override public void transform(TransformInvocation transformInvocation) throws TransformException, InterruptedException, IOException { super.transform(transformInvocation); // 通过TransformInvocation.getInputs()获取输入文件,有两种 // DirectoryInpu以源码方式参与编译的目录结构及目录下的文件 // JarInput以jar包方式参与编译的所有jar包 allDirs = new ArrayList(invocation.getInputs().size()); allJars = new ArrayList(invocation.getInputs().size()); CollectionTransformInput inputs = invocation.getInputs(); for (TransformInput input : inputs) { CollectionDirectoryInput directoryInputs = input.getDirectoryInputs(); for (DirectoryInput directoryInput : directoryInputs) { allDirs.add(directoryInput.getFile()); } CollectionJarInput jarInputs = input.getJarInputs(); for (JarInput jarInput : jarInputs) { allJars.add(jarInput.getFile()); } } } 2. 对收集到的.class 文件结合 ASM 框架进行分析处理 ASM 是一个操作 Java 字节码的类库,通过 ASM 我们可以方便对.class 文件进行修改。
外部化应用资源后,我们可在项目中使用 R 类 ID 来访问这些资源,且 R 类 ID 具有唯一性。对崩溃原因分析如下:业务插件代码中使用了公共库中的 R 类资源、插件打包流程独立于宿主打包,在插件打包的过程中仅完成了业务模块 R 类的内联,并没有考虑到公共资源 R 类的内联,基于上述原因当宿主打包过程完成 R 类文件删除瘦身后,我们在运行某业务插件的过程中,自然就会报公共资源 R 类找不到的问题从而产生崩溃。
理论基础 —R 文件 R 文件也就是我们日常工作中经常打交道的 R.java 文件,在 Android 开发规范中我们需要将应用中用到的资源分别放入专门命名的资源目录中,外部化应用资源以便对其进行单独维护。原标题:插件化工程R文件瘦身技术方案 | 京东云技术团队 随着业务的发展及版本迭代,客户端工程中不断增加新的业务逻辑、引入新的资源,随之而来的问题就是安装包体积变大,前期各个业务模块通过无用资源删减、大图压缩或转上云、AB 实验业务逻辑下线或其他手段在降低包体积上取得了一定的成果。
公共库跟随宿主一起打包,在宿主打包过程中引入 R 类瘦身插件,打包后的 apk 有明显的减小,手机安装 apk 后启动首页正常展示无问题,但在打开某些业务插件时,会有异常闪退现象,崩溃类型为 R.x resource not found。setContentView(R.layout.activity_main); 产生这种现象的原因是 AGP 打包工具导致的。
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 可以访问到对应的资源。具体细节,大家可以去查阅一下 android gradle plugin 在 R 文件上的处理过程。前面提到京东是支持插件化的,整个插件化方案是基于 aura 平台实现的,我们向 aura 团队进行了咨询,然后 get 到了新的方案切入点。至此,基于京东商城探索的插件化工程 R 文件瘦身 gradle plugin 就开发完成,目前已在部分业务插件模块进行了线上验证,在功能上线以后我们也及时的进行了崩溃观测以及用户反馈的跟进,暂无异常问题。
既然保留的方案并不合适,那就将公共资源 R 类 id 也内联到代码中去。考虑到 R 文件内联瘦身 gradle plugin 是在打包编译阶段引入的,我们也统计了一下引入该插件以后对打包时长的影响,数据如下: 结合数据来看,引入 R 文件瘦身插件后对整体打包时长并无显著影响。
aura 平台在插件化的过程中已通过 aapt2 引入了公共资源 id 固定的能力,在该能力下,已定义的公共资源 id 会一直固定 (各个业务插件中引用的公共资源 id 一致),且公共资源库中已有的资源不可被其他模块重复定义,否则会覆盖之前已定义好的资源,基于上述的结果和规则,我们对之前的 R 文件瘦身 gralde plugin 功能进行完善,将公共资源的 R 类 id 内联到项目中。在插件化的过程中为了防止宿主和插件资源冲突,通过修改插件 packageId 保证了资源的唯一性。
结论:R 类 id 内联后程序可运行,但并非所有的工程都会自动产生内联现象,我们需要通过技术手段在合适的时机将 R 类 id 内联到程序中,内联完成后,由于不再依赖 R 类文件,则可以将 R 类文件删除,在应用正常运行的同时,达到包瘦身目的。利用 appt2 的 - stable-ids 和 - emit-ids 两个参数实现固化资源 id 的功能,并将将固化后的 ids 文件命名为 shared_res_public.xml 存储在公共资源库中,业务插件依赖公共资源库,在打包编译的过程中 aura 会将 shared_res_public.xml 复制到业务工程临时编译文件夹 intermediates 下的指定位置并参与业务模块的打包过程中,其文件内容格式如下: 修改 R 文件瘦身 gradle plugin 代码,从指定位置读取并识别这部分公共资源,按照 name,id 的形式进行变量存储,并在后续过程中对业务模块中的公共资源部分进行 id 替换。
对业务插件工程打出的包进行反编译以后,发现 R 类 ID 无内联现象,且 R 类文件具有一定的大小,对包内的 R 文件进行分析,发现 R 文件中仅包含业务自身的资源,不包含业务依赖的公共资源 R 类。优先识别 R 类文件,通过 ClassVisitor 访问 R.class 文件,读取文件中的静态常量,进行临时变量存储: @Overridepublic FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { //R类中收集 public static final int 对应的变量 if (JDASMUtil.isPublic(access) JDASMUtil.isStatic(access) JDASMUtil.isFinal(access) JDASMUtil.isInt(desc)) { jdRstore.addInlineRField(className, name, value); } return super.visitField(access, name, desc, signature, value);} 非 R 类文件,通过 MethodVisitor 识别到代码中的 R 类引用,获取引用对应的值,进行 id 值替换: @Override public void visitFieldInsn(int opcode, String owner, String name, String desc) { if (opcode == Opcodes.GETSTATIC) { //owner:包名;name:具体变量名;value:R类变量对应的具体id值 Object value = jdRstore.getRFieldValue(owner, name); if (value != null) { //调用该api实现值替换 mv.visitLdcInsn(value); return; } } super.visitFieldInsn(opcode, owner, name, desc); } * 注:以上代码仅为部分示意代码,非正式插件代码。公共资源 R 类 ID 内联 由于在京东 android 客户端代码中,更多的资源文件集中在公共资源库中,相对的公共库生成的 R 类文件也更大,对编译后的 apk 包内容进行分析后,公共资源库的 R 类文件占比高达 3%我们先后在对 R 类文件瘦身的可行性及业界开源项目进行调研后,探索出了一套适用于插件化工程的 R 文件瘦身技术方案。
非主工程中,R 类资源 ID 以引用的方式编译进 class 中,不会产生内联。对业务插件工程打出的包进行反编译以后,发现 R 类 ID 无内联现象,且 R 类文件具有一定的大小,对包内的 R 文件进行分析,发现 R 文件中仅包含业务自身的资源,不包含业务依赖的公共资源 R 类。
对崩溃原因分析如下:业务插件代码中使用了公共库中的 R 类资源、插件打包流程独立于宿主打包,在插件打包的过程中仅完成了业务模块 R 类的内联,并没有考虑到公共资源 R 类的内联,基于上述原因当宿主打包过程完成 R 类文件删除瘦身后,我们在运行某业务插件的过程中,自然就会报公共资源 R 类找不到的问题从而产生崩溃。利用 appt2 的 - stable-ids 和 - emit-ids 两个参数实现固化资源 id 的功能,并将将固化后的 ids 文件命名为 shared_res_public.xml 存储在公共资源库中,业务插件依赖公共资源库,在打包编译的过程中 aura 会将 shared_res_public.xml 复制到业务工程临时编译文件夹 intermediates 下的指定位置并参与业务模块的打包过程中,其文件内容格式如下: 修改 R 文件瘦身 gradle plugin 代码,从指定位置读取并识别这部分公共资源,按照 name,id 的形式进行变量存储,并在后续过程中对业务模块中的公共资源部分进行 id 替换。
原标题:插件化工程R文件瘦身技术方案 | 京东云技术团队 随着业务的发展及版本迭代,客户端工程中不断增加新的业务逻辑、引入新的资源,随之而来的问题就是安装包体积变大,前期各个业务模块通过无用资源删减、大图压缩或转上云、AB 实验业务逻辑下线或其他手段在降低包体积上取得了一定的成果。在插件化的过程中为了防止宿主和插件资源冲突,通过修改插件 packageId 保证了资源的唯一性。
相关阅读
- 《模拟农场22》全球销量突破600万份
- 霍州煤电金能煤业 山煤国际韩家洼煤业把实事办到员工心坎上
- 《Left Behind》PC平台免费发布 第一人称恐怖探索
- 《归途列车》新DLC《Legion Tales》上线 追加10个新任务
- 全省首家焦化行业生态环境执法实训基地落户山西焦化
- 西山煤电杜儿坪矿:全方位打造本质安全高效矿井
- 基层单位扎实做好岁末年初安全生产工作(一)
- 勇闯致命绝地《地心归途》全新版本“毒瘴之都”现已上线
- 2019年12月21日-2019年12月27日焦炭价格指数(CSPI)
- 卡普空9个月财报:整体业务销售额破千亿日元
- 霍州煤电木瓜矿:精益“做优” 加码安全
- 山西省纪委监委官微“清廉山西”丨山西焦煤:构建“大监督”体系助...
- 《Apex英雄》更新彻底封禁手柄配置文件位移作弊方法
- 汾西矿业中盛煤业 霍州煤电回坡底矿 强化安全 确保生产
- 欧洲游戏开发者联盟对苹果欧盟新策“很失望”
- 腾讯收购《龙与地下城》IP?威世智出面否认
- 西山煤电官地选煤厂:投用干雾抑尘装置
- 2020年07月04日-2020年07月10日焦炭价格指数(CSPI)
- 春节期间《碧海黑帆》开启不限量免费公测
- 吸血鬼:避世血族2
- 山西经济网 | 汾西矿业贺西矿对标一流重实干 聚力发展见实效
- 《龙之信条2》角色介绍:女兽人梅内拉 精灵格林多尔和杜兰
- 模拟经营游戏《汉尘.腐草为萤》Steam页面上线 第二季度发售
- 山西焦煤集团2023职工体育运动会开幕
- 《幻兽帕鲁》开发商警告玩家:手机版游戏都是假的
- 英伟达面临AI芯片供应短缺 转向英特尔寻求封装服务
- 2020年01月04日-2020年01月10日焦炭价格指数(CSPI)
- 西山煤电官地选煤厂:投用干雾抑尘装置
- 中国煤炭报丨“五建十帮”帮了残疾人大忙
- 报告称宝可梦公司正在进行侵权调查 但并非针对《幻兽帕鲁》
- 山西今日智库能源有限公司招聘启事
- 评论|筑牢安全基石 时刻警钟长鸣
- Aonic成立发行部门 负责发行《杀出重围》主创新作
- 西山煤电官地矿:自制注水装置助力安全生产
- 国际奥组委:首届奥林匹克电竞运动会最晚于2026年举办
- 贯彻落实山西焦煤安全环保工作会精神,基层单位这样做!(七)
- 秋之回忆
- 《夜莺》PC配置公开 支持DLSS 3和FSR 3
- 《最终幻想7:重生》3D同人图 蒂法爱丽丝穿晚礼服秀好身材
- 投资公司正仁煤业建设项目喜获开工批复
- 山西日报丨山西焦煤春节期间安全生产全力保供
- 《彩六:围攻》交易市场测试上线 稀有皮肤价格破百
- 华晋焦煤金达煤业:来了,热腾腾的班中餐
- 鲍永生出席投资公司第三次党代会
- 《模拟农场22》全球销量突破600万份
- 西山煤电太原公司:强堡垒创品牌
- 山西焦煤开展办公室系统业务能力提升培训
- 荣耀时刻丨最后一波奖牌来袭,看看都有谁~
- 记者节特别策划丨视频:记得•值得——与新焦煤一起奔跑的这一年
- 勇闯致命绝地《地心归途》全新版本“毒瘴之都”现已上线
- 2020年02月29日-2020年03月06日焦炭价格指数(CSPI)
- 《命运/守护之夜:重制版》宣布 今年登陆NS和Steam支持简中
- 2019年04月27日-2019年05月03日焦炭价格指数(CSPI)
- 像素风冒险游戏《国王之墓》将于4月17日发售
- 英伟达面临AI芯片供应短缺 转向英特尔寻求封装服务
- 《最后的生还者2》最早是受《血源》启发的开放世界游戏
- 麻枝准最新力作《炽焰天穹》首曝PV 现已开启预约
- 山西焦煤推荐评选2017年度全国煤炭工业先进集体劳动模范(补充...
- 笃行实干!基层单位高质量完成2023年目标任务(二)
- 据报道腾讯叫停了一款《尼尔》手游 已秘密开发两年