摘要: 本文详细探讨了Gradle中编译时和运行时依赖的概念、区别及其重要性。我们也将了解为什么依赖管理对于现代软件开发至关重要,并探讨了一些常见的陷阱和最佳实践。
作者:曾是放牛娃 https://www.jianshu.com/p/59fd653a54d2
携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验。本文将详细介绍Android平台插件式开发和动态加载技术的原理和实现细节,回顾携程Android App的架构演化过程,期望我们的经验能帮助到更多的Android工程师。 需求驱动 2014年,随着业务发展需要和携程无线部门的拆分,各业务产品模块归属到各业务BU,原有携程无线App开发团队被分为基础框架、酒店、机票、火车票等多个开发团队,从此携程App的开发和发布进入了一个全
携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验。本文将详细介绍Android平台插件式开发和动态加载技术的原理和实现细节,回顾携程Android App的架构演化过程,期望我们的经验能帮助到更多的Android工程师。 需求驱动 2014年,随着业务发展需要和携程无线部门的拆分,各业务产品模块归属到各业务BU,原有携程无线App开发团队被分为基础框架、酒店、机票、火车票等多个开发团队,从此携程App的开发和发布进入了
在上篇文章 《组件治理之多仓组件化编译的一些问题》中介绍,一些原本可在编译期间报错的问题被带到了运行时,我们需要开发一款检查插件,把 NoClassDefFoundError、NoSuchMethodError、NoSuchFieldError 与 AbstractMethodError 等异常提前在编译期间卡住。
Java 插件是构建 JVM 项目的基础,它为项目增加了很多能力,例如编译,测试,打包,发布等等。 很多插件都是基于 Java 插件实现的,例如 Android 插件。
为什么要用记录呢,因为我从开始接触Android时我们的项目就在65535的边缘。不久Google就出了multidex的解决方案。我们也已经接入multidex好多年,但我自己还没有接入,所以本博文只是作者自己对multidex接入整理记录其中大部分来源于Google官网。
首先介绍下我们的项目结构,我们是组件化开发,不同的业务组件存放在各自的仓库之中,组件通过提供 api 的方式供其他业务调用,大致效果图如下:
如下是官方使用 Baseline Profiles 在应用启动上提升的百分比,来自 《 Performance best practices for Jetpack Compose[1]》:
前不久,我们准备将自己开发的视频播放sdk提供给公司其他部门,在打包的时候,同事问了我一个问题,为什么我们打sdk的时候需要分别提供armeabi和arm64-v8a(ps,还有其他7种CPU架构)。其实这是一个常识问题,针对不同的架构我们肯定要提供不同的动态链接库,所以,在实际开发过程中,我们并不是将这7种so库都集成到我们的项目中去,我们会根据实际情况做一个取舍。 那么旧事重提,我们再来看看Android动态链接库。 简介 早期的Android系统几乎只支持ARMv5的CPU架构,不过到目前为止支持7种
原文地址:Troubleshooting ProGuard issues on Android 原文作者:Wojtek Kaliciński 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:dieyidezui 校对者:corresponding 为什么使用 ProGuard ProGuard 是一个压缩、优化、混淆代码的工具。尽管有很多其他工具供开发者们使用,但是 ProGuard 作为 Android Gradle 构建过程的一部分,已经打包在 SDK 中
导言 Android App Bundle 是 Android 新推出的一种官方发布格式,可让您以更高效的方式开发和发布应用。企业微信基于 App Bundle 采用低入侵、业务代码基本零重构的技术方案,实现了全业务模块采用动态模块(dynamic feature)开发。最后展示并行编译方案,进一步加速持续集成。 一、项目背景 Android App Bundle 是 Android 新推出的一种官方发布格式,可让您以更高效的方式开发和发布应用。和国内开发者已经熟知的 Kotlin 开发语言、Androi
Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言。
| 导语 众所周知 Android 加载 so 文件本身就是一种运行时动态加载可执行代码的行为,所以把 so 做成动态下发的没有什么技术风险,不过要把这项技术稳定落地到实际生产项目中还是有不少麻烦的问题。本文根据实际项目经验,分享一些 so 动态化关键技术点和需要避免的坑。 需求价值 一般来说,越是成熟的 Android 项目,Native 代码的贡献量就越多,以往 APK 体积的主要占比大都是资源文件,不过现在 Native 代码带来的 so 体积占比也很可观了,所以 so 动态化的价值越来越凸显。另一
本文介绍了如何通过自定义APT生成Java代码,并分析了生成代码的过程和具体实现。同时,本文还提供了关于自定义APT的代码示例和具体应用场景的详细说明。
LZ-Says:在外面呆了一年又一年,似乎都快忘记当初出来的目的,不过,幸好,不忘初心~给家里买点东西,家里开心,我也开心~这就够了。
路由框架 仅限于在 集成模式 下使用 , 组件模式下 , 路由框架不起任何作用 ;
随着APP的一次又一次迭代,APP的体积也越来越大,这时候,会引发这么一个问题,早期的错误异常如下:
两周前 HG 分享了 QQ 空间的热修复框架,今天我来简单讲一下微信开源的热修复框架,Tinker。
写程序离不开运行时,但是有很多伙伴却并没有搞清楚运行时到底是什么。运行时的概念之所以容易被混淆,是因为运行时有两层不同的含义:run time 和 runtime,先贤们在翻译的时候可能忽略了中间的空格,导致运行时一词代表了两种含义:运行时期和运行环境/系统。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
在Android开发中,APT(Annotation Processing Tool)是一种强大的工具,它可以让开发者在编译期间处理注解,生成额外的代码。通过APT,我们可以实现很多高级功能,比如自动生成代码、实现依赖注入、生成路由表等。本文将深入探讨APT的运用以及背后的原理。
移动端跨平台技术自移动开发诞生以来一直是个热门话题,一是持续关注研发效率,降本提效;二是一套代码多端运行可以提升多端业务逻辑的一致性;三是跨端技术方案通常意味着更佳的高效运维和缺陷修复。
1. 序言 工程编译,是Android应用开发工作中的重要一环。而随着工程代码量膨胀,编译耗时也越来越长,拖慢了开发效率。 这个问题在中大型团队中并不少见。以QQ音乐为例,Android工程代码量达到120万行以上,每修改一行代码,都要等待4分钟以上才能在手机上看到改动效果。 为了应对这个问题,我们自研推出了一款增量编译组件。经过一年时间的不断优化,组件已经可以支撑团队内的日常开发工作,有效提升了本地开发场景下的编译效率。 本文将会介绍QQ音乐团队在增量编译组件研发上的探索与实践历程。 2. 问题分析
1、通过aapt打包资源文件res,对应生成R.java、resources.arsc和res文件(二进制&非二进制保持原来的代码)
(抱歉各位,之前发布的内容当中视频嵌入成“迁移 KTS”那一节的视频了,这次重新发布,更正视频内容,感谢大家的支持!)
现在我们的 Gradle 脚本都迁移到 KTS 了。接下来我们要考虑的问题是,能不能添加一些好用的扩展,方面后续脚本的编写?
Android自5.0后增加了不少新控件,帮助开发者实现了更酷更炫的UI效果。可是对于初学者来说,这些新控件的用法不像老控件那么简单,网上相关的使用介绍也不如老控件那样丰富,种种情况无疑加大了我们学习这些新控件的难度。为此,博主初步整理了Android在5.0和6.0之后的新增控件,及其对应的说明博文,给大家提供一个可资学习和借鉴的索引。 下面是新增控件的索引表格:
maven的核心就是依赖管理,在模块过多,之间的依赖关系也很复杂,maven提高了一个高效的管理方法。
当业务方的 Java 环境是 1.8 时,如果 SDK 是使用 Java 11 编译,则调用 SDK 相关代码的地方在编译时将会报错:
一、背景 就在项目灰度测试前不久,爆出了在 Android 3.0以下手机上安装时出现 INSTALL _ FAILED_DEXOPT,导致安装失败。这一问题意味着项目将不能在 Android 3.0以下的手机上安装使用,对项目的发布有比较大的影响,所以必须尽快解决。 INSTAL L_FAILED_DEXOPT导致无法安装的问题,从根本上来说,可能是两个原因造成的: (1) 单个 dex 文件方法总数65K 的限制。 (2) Dexopt 的 LinearAlloc 限制。 当 Android 系统安装一
作者 | Donna Thomas、Jan Luehe 译者 | 刘雅梦 Salesforce 是首批大规模采用 OpenJDK 11 的大型企业之一,在 2018 年底 OpenJDK 11 发布后不久,Salesforce 就开始了 OpenJDK 11 的采用之旅。 前沿吗?当然是。 安全吗?绝对地。 你可能还不知道,Salesforce 在整合前沿、转型技术,并以安全、可靠、无缝的方式,同时在不损害其核心价值:信任 的前提下,将这些技术提供给客户方面一直处于行业的领先地位。从 gRPC 到 Kube
有很多人向涛哥询问,Qt程序发布的相关问题,网络上虽然可以搜到一大堆教程,但是可靠的比较少。
Android 依赖参考文档 : https://developer.android.google.cn/studio/build/dependencies
最近看到一个面试题,问ClassNotFoundException和NoClassDefFoundError的区别。平时没有专门思考过这个问题,藉此机会分析一下。
本文总结分析了Android7.0版本影响开发的改进。分享给大家供大家参考,具体如下:
我们知道不管是插件化还是组件化,都是基于系统的ClassLoader来设计的。只不过Android平台上虚拟机运行的是Dex字节码,一种对class文件优化的产物,传统Class文件是一个Java源码
Java 9引入了一项重要的功能:模块化(Module System)。模块化是一种将代码和资源封装到可重用和独立的单元中的方法,它有助于改善代码的可维护性、可重用性和安全性。本文将介绍Java模块化的基本概念、如何创建和使用模块以及一些最佳实践。
在 【Android 逆向】ART 脱壳 ( DexClassLoader 脱壳 | exec_utils.cc 中执行 Dex 编译为 Oat 文件的 Exec 和 ExecAndReturnC函数 ) 博客中 , 将 dex 文件编译为 oat 文件 , 编译过程是由 dex2oat 可执行程序完成的 , 这是一个有 main 函数的可执行程序 ;
在前段时间的有赞移动沙龙中给大家分享了有赞移动 Android 团队对于编译提效的实践,会上很多小伙伴对这部分十分感兴趣,但由于时间关系没有能进行一些细节上的交流,所以会后我们整理了两篇文章分享给大家。关于第一部分全量编译提效可以阅读我们小伙伴分享的文章,今天给大家带来第二部分:增量编译提效方案Savitar。
指定编译库的环境,其中Toolchain Default使用的是默认的CMake环境;C++ 11也就是C++环境。两种环境都可以编库,至于区别,后续会跟进,当前博文使用的是CMake环境。
笔者总结了自己在拥有Android开发的相关基础后入门iOS开发时遇到的点点滴滴给其他想入门iOS 开发的Android开发的一些参考,少走一些弯路,快速上手iOS开发;文章会以iOS 和 Android的开发工具,语言,工程文件和启动类的对比为主线。两者的主要对比概览
JakeWharton 是 Android 大神,同时也是开源狂魔。他开源的项目特点是小而美,且应用广泛,比如 butterknife、RxBinding、hugo 等,本文从受众最广泛,star 最多的 ButterKnife 讲起。
在面向对象编程中,我们经常处理处理的问题就是解耦,程序的耦合性越低表明这个程序的可读性以及可维护性越高。控制反转(Inversion of Control或IoC)就是常用的面向对象编程的设计原则,使用这个原则我们可以降低耦合性。其中依赖注入是控制反转最常用的实现。
原文地址:Enabling ProGuard in an Android Instant App 原文作者:Wojtek Kaliciński 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:JayZhaoBoy 校对者:hanliuxin5 Instant Apps(即时应用)和 4 MB 字节的限制 把一个已经存在的应用程序转换成 Android Instant App(安卓即时应用程序)是很有挑战性的,但对于模块及结构化你的项目而言却是一个很好的练习,更
一款命令行工具,用于从Vdex文件反编译和提取Android Dex字节码的工具。
本章中的字节码重点研究Java 字节码,Java字节码(Java bytecode)是Java虚拟机执行的一种指令格式。可以通过javap -c -v xxx.class(Class文件路径) 命令来查看一个Class对应的字节码文件,如下图所示:
在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在某个模块,要想实现对用户的行为一和行为二进行统计,因此按照OOP面向对象编程思想,就需要把友盟统计的代码以强依赖的形式写入相应的模块中,这样会造成项目业务逻辑混乱,并且不利于对外提供SDK。因此,通过研究发现,在Android项目中,可以使用AOP面向切面编程思想,把项目中所有的友盟统计代码,从各个业务模块提取出来,统一放到一个模块里面,这样就可以避免我们提供的SDK中包含用户不需要的友盟SDK及其相关代码。
IDE中编译运行没问题,但是打包成可运行jar(spring boot jar包运行)抛出异常:NoSuchMethodError 或 NoSuchFieldError异常。
近期导入了一个项目,因为种种原因始终是失败,各种引入错误,不是这个就是那个,归根到底还是对gradle相关知识不够了解,今天来整理一下。
领取专属 10元无门槛券
手把手带您无忧上云