首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android 大型工程 App Bundle 模块化实践

Android App Bundle 描述非常恰当: 提升工程速度 将应用功能作为独立模块进行设计、构建、调试和测试,并在准备就绪后将其添加到主应用中。...编译缓存 如官方的 build-cache,或国内模块化惯用的 .aar,或插件化使用的 .apk 等,都是通过配置版本管理、跳过编译任务。区别在缓存粒度和命中率不同。...多工程改造为支持动态模块,分包式多 .apk 更能充分发挥并行、缓存的优势,但这更要求企业微信模块化解决计算资源消耗的问题: 计算迁移 增加可计算资源,开发机、构建机分布式编译,充分利用构建机群。...任何版本迭代、功能需求总是从基线拉出新分支开发,完成后回流。功能分支的生命周期过长会不断加剧合并冲突。 ?...多仓库的方式还能保持 git commit 时间线干净。 并行编译 编译逻辑相同,但部署类型有2种:本地和远程。它们是有区分的,远程可分布式、在不同构建机上编译,极大利用了机群的计算资源。

5K31

Kotlin京东业务实战 | 强大又简洁的JVM语言

artist.print() 第2行会显示一个错误,因为没有对变量进行null检查。 Null曾经被戏称为“十亿美金的错误”,Null虽然好用,但是导致很多错误的元凶往往都是它。...但很多开发者都担心Kotlin编译可能没有Java快,影响开发效率,反而得不偿失。 >>>> 过程分析 ?...Kotlin编译器在目标代码生成环节做了很多类似于Java封装的事情,比如自动生成Getter/Setter代码的生成、Companion转变成静态类、修改类属性为final不可继承(open修饰即可继承...>>>> 常见问题 环境配置出错,出现无法编译或编译正常但apk中无kotlin代码,运行时报kotlin代码找不到; 解决方法:在插件代码中配置kotlin环境,在gradle中增加classpath...; 运行过程中报checkExpressionValueIsNotNull NoSuchMethod异常,分析apk与kotlin源码,发现kotlin中Intrinsics类部分方法打包后丢失;

1.7K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    如何在10分钟内让Android应用大小减少 60%?

    (true启用) 请注意,代码压缩会拖慢构建速度,因此您应该尽可能避免在调试构建中使用。...每次构建时 ProGuard 都会输出下列文件 dump.txt 说明 APK 中所有类文件的内部结构。mapping.txt:提供原始与混淆过的类、方法和字段名称之间的转换。...通过为每个发布构建保留一个mapping.txt文件副本,您就可以在用户提交的已混淆堆叠追踪来自旧版本应用时对问题进行调试。...proguard中一共有三组六个keep关键字的含义 keep 保留类和类中的成员,防止它们被混淆或移除。 keepnames 保留类和类中的成员,防止它们被混淆,但当成员没有被引用时会被移除。...keepclassmembers 只保留类中的成员,防止它们被混淆或移除。 keepclassmembernames 只保留类中的成员,防止它们被混淆,但当成员没有被引用时会被移除。

    86420

    如何在10分钟内让Android应用大小减少 60%?

    (true启用) 请注意,代码压缩会拖慢构建速度,因此您应该尽可能避免在调试构建中使用。...每次构建时 ProGuard 都会输出下列文件 dump.txt 说明 APK 中所有类文件的内部结构。mapping.txt:提供原始与混淆过的类、方法和字段名称之间的转换。...通过为每个发布构建保留一个mapping.txt文件副本,您就可以在用户提交的已混淆堆叠追踪来自旧版本应用时对问题进行调试。...proguard中一共有三组六个keep关键字的含义 keep 保留类和类中的成员,防止它们被混淆或移除。 keepnames 保留类和类中的成员,防止它们被混淆,但当成员没有被引用时会被移除。...keepclassmembers 只保留类中的成员,防止它们被混淆或移除。 keepclassmembernames 只保留类中的成员,防止它们被混淆,但当成员没有被引用时会被移除。

    1.6K10

    使用 Kotlin 重写 AOSP 日历应用

    因为团队中有两个人在进行此项工作,所以我们在 Android.bp 文件中为每个人创建了一个 exclude_srcs 属性,这样两个人就可以在减少代码合并冲突的前提下,都能够同时进行重构并推送代码。...然而,虽然在 Java 中有相应的注解实现版本,但是自动转换过程中并没有为 Kotlin 方法声明中添加 override 修饰符。解决的办法是在所有适当的地方手动添加 override 修饰符。...暴露成员变量 默认情况下,Kotlin 会自动地为类中的实例变量生成 getter 和 setter 方法。...编译时间 Kotlin 和 Java 应用的构建时间是通过取 10 次从零进行完整构建的时间的平均值来计算的 (不包含异常值),Kotlin 应用的平均构建时间为 13 分 27 秒,而 Java 应用的平均构建时间为...欢迎您 点击这里 向我们提交反馈,或分享您喜欢的内容、发现的问题。您的反馈对我们非常重要,感谢您的支持!

    1.2K10

    第九章 Android Gradle高级自定义

    '项目名_渠道名v版本名称构建日期.apk'格式生成的文件名,这样通过文件名就可以把该apk的基本信息了解,比如什么渠道,什么版本,什么时候构建的等等,最后生成的示例apk名字为Example92_google_v1.0...但是这种方式有个很大的问题就是修改不方便,特别当我们的build文件中有很多代码时,不容易找,而且修改容易出错,代码版本管理时也容易产生冲突。...就是要区分是真正的打包发版,还是平时的调试、测试,有很多办法来区分的。...他是一种在构建时,打包成Apk之前,会检测所有资源,看看是否被引用,如果没有,那么这些资源就不会被打包到Apk包中,因为是在这个过程中(构建时),Android Gradle构建系统会拿到所有的资源,不管是你项目自己的...以上自动清理资源只是在打包的时候,不打包到Apk中,实际上并没有删除我们工程中的资源,如果我们在使用的时候发现有大量的无用资源被清理,那么我们自己最好还是把这些资源文件从我们的工程中删除吧,这样也好维护一些

    1.7K10

    AndroidStdio1_2

    • 构建存在多个APK变体(例如免费版本和付费版本)的应用并且需要在两种版本中使用相同的核心组件。...• 资源合并冲突:构建工具会将库模块中的资源与相关应用模块的资源合并。如果在两个模块中均定义了给定资源ID,将使用应用中的资源。...修改后 ? ? ? ? 一同步,完蛋.问题不大 ---- 大概看了下,是版本不搭配的原因 ? ? 9.0稳一点 ? 还没有错误 ?...清单文件 ---- 只有manifest和application是必须的.这两个元素都只能有一个并且必须唯一. 同一级别的元素不区分顺序actvity和provider service ?...由于测试证书通过构建工具创建并且在设计上不安全,大多数应用商店(包括Google Play商店)都不接受使用调试证书签名要发布的APK。

    1.8K20

    Android签名校验机制(数字证书)

    签名的两种模式 调试模式(debug mode) 在调试模式下,ADT会自动的使用debug密钥为应用程序签名,因此我们可以直接运行程序。...,这个alias通常不区分大小写 keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中) keyalg 指定密钥的算法 (如 RSA DSA,默认值为:DSA) list 显示密钥库中的证书信息...指定证书发行者信息 其中: “CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名 称,ST=州或省份名称,C=单位的两字母国家代码” export 将别名指定的证书导出到文件 keytool....zip并修改扩展名为.apk后再次签名 jarsigner 错误: java.security.NoSuchAlgorithmException: unrecognized algorithm...certificates from XXX.apk: Attempt to get length of null array] 使用adb安装时出现该错误是因为应用没有签名,需要先对apk签名之后再尝试安装

    6.7K110

    破解第一个Android程序

    可以猜测:ApkTool内部使用baksmali将APK中的DEX文件反编译为smali文件,但ApkTool在反编译APK时没有处理instant-run.zip中的DEX文件,因此,在反汇编输出信息中没有程序真正的反汇编代码...图2-5 生成Release版本的APK文件 回到Android Studio主界面,打开项目的app模块下的build.gradle文件,会发现多出了signingConfigs这项配置。...修正storeFile的路径为相对路径后,其内容如下。...目前使用的是ApkTool 2.2.2,而framework-res.apk的版本是基于Android 6.0的,其API为23,但Crackme0201的API为25,因此,出现了资源无法解析的问题。...回编译完成后,会在dist目录下生成app-release-unsigned.apk文件。 不过,通过编译生成的APK文件是没有签名的,因此不能进行安装和测试。

    3.4K20

    如何解决 IDEA 编译报错:Error:(2048,1024) java: 找不到符号

    经过进一步的排查,会发现导致报错的根本原因在于 Lombok 生成的 Getter/Setter 方法冲突或未能正常生成。 2..../Setter 后,再次编译,若不再依赖 Lombok 自动生成,则基本可以避免此类大小写冲突带来的编译错误。...移除后,同样需要为对应的字段补上手写的 Getter/Setter,以保证功能的完整性。...3.3 统一命名规范 推荐做法:在项目初始阶段,就应当 统一字段命名规范,避免大小写混乱或形似度过高的字段名。 好处:既能避免 Lombok 的潜在冲突,也方便团队协作和代码维护。...总结 Lombok 的 bug:在处理大小写冲突字段时,可能无法正常生成 Getter/Setter,进而导致 “找不到符号” 的编译错误。

    28410

    Android dex文件64k限制解决办法

    这些变化,除了会导致打包出的 APK 文件越来越大之外,当项目中java代码包含的方法数(method count)超出一个峰值时,编译过程中就会出现如下错误: 较早版本的编译系统中,错误内容如下: Conversion...尽管在不同版本的编译系统中显示的错误内容不尽相同,但内容中都提到了一个具体的数字:65536,这个数字也是本文要讲到的核心内容:Android 64K Method Counts Limit 的峰值。...注意:由于 Instant Run 机制利用的就是 multidex 原理,当项目中minSdkVersion参数设置为20或者更小,并且运行在 Android 4.4 (API 20) 或更低版本的设备中时...但Instant Run仅仅作用于debug版本,我们依然需要给release版本配置multidex来避开64K方法数的限制。...,而又没有使用 multidex 支持,编译过程便会出错。

    1.2K20

    史上最好用的Android全量版本更新库XUpdate使用指南

    如果你使用的是默认版本更新返回api的话, 只需要服务端返回UpdateStatus字段为2即可。...如果你自定义请求返回api的话,只需要设置UpdateEntity的mIsForce字段为true即可。...除此之外,还有两个监听器: 版本更新失败的监听器OnUpdateFailureListener。 版本更新apk安装的监听器OnInstallListener。...2.问:为什么我在开发调试的时候,能够出现最新版本的提示,但是打出来的包却什么反应也没有? 答:出现这个问题,一般是少了混淆配置。如果你使用了自定义的版本更新解析器,请对你的接口实体进行混淆配置。...错误码 错误码 备注 2000 查询更新失败 2001 没有wifi 2002 没有网络 2003 正在进行版本更新 2004 无最新版本 2005 版本检查返回空 2006 版本检查返回json解析失败

    2.4K30

    Android编译的小知识

    现在Android项目构建编译都是通过Gradle进行的,Gradle的版本在gradle/wrapper/gradle-wrapper.properties下 Gradle版本为7.3.3 当我们执行...可以理解为AGP是Gradle构建流程中重要的一环。...中就有问题了 这个时候,A,B,C都是二进制形式,不会参与javac/kotlinc编译,而AGP解决依赖冲突默认以高版本为准。...签名&对齐 签名:生成apk文件后需要对其签名,否则无法安装 对齐:zipalign会对apk中未压缩的数据进行4字节对齐,对齐的主要过程是将APK包中所有的资源文件距离文件起始偏移为4字节整数倍,对齐后就可以使用...还是以Demo为例,引入字节的btrace插件 查看开启bTrace后,反编译的apk产物 他会在每个方法的开始和末尾插入一段代码,用于记录方法节点,以用于运行时trace采集 实际的源码是肯定没有这些代码的

    87330

    有赞美业接入智能 POS 的架构演进之路

    2.3.2 方案分析 差异化打包方案很好地解决了阶段二所发现的问题,但实际上最终这个方案并未被采纳,因为这个方案在解决老问题的同时,却也带来了新的问题: 如果业务 APK 使用了热修复能力,那么此时将会存在多个热修复的基准包...,以独立 APK 的形式为业务 APK 提供能力,这样既能满足拓展能力、SDK 隔离等方面的需求,又没有了阶段三方案后期的维护之忧。...SDK 和文档是两个东西,来回的沟通和确认,效率极为低下 负责接入的同学死活运行出错,外部对接人员却表示反正他们没问题 负责接入的同学天天加班调试,外部对接人员不慌不忙 但是现在,得益于 AIDL 协议层的存在...拓展新设备无压力 - 对于新设备的对接,只需实现其对应的服务APK即可 接入成本相比更低 - 一个业务方完成了对接,其他业务方均将受益 - 全新的对接方式:由第三方或 POS 厂家实现 维护难度:完成接入后的低维护成本...为了验证可行性,笔者对多个插件化方案进行了实际调研,然后发现哪怕是其中宣称已适配了 Android 9.0+ 版本的插件化框架,在实际使用的时候依然是问题重重,比如: gradle 版本大多还停留在 3

    64040

    Gradle 与 AGP 构建 API: 进一步完善您的插件!

    Property 假设我想要创建一个插件,该插件可以使用 Git 版本自动更新应用清单文件中指定的版本号。为了达到这一目标,我需要为构建添加两个 Task。...在我尝试将来自 Provider 的值映射为输入 Property 时,产生了一个错误。map() 的 lambda 参数接收某种类型 (如 T) 的值,该函数会产生另一个类型 (如 S) 的值。...为了读取清单文件,我需要访问 APK 文件,该文件是构建 Task 的产物。为此,我需要将构建 APK 文件夹作为 Task 的输入。...注意,这次我依旧没有显式请求清单转换的执行,但是因为 VerifierTask 请求了最终版本的清单产物,所以自动进行了转换。...欢迎您 点击这里 向我们提交反馈,或分享您喜欢的内容、发现的问题。您的反馈对我们非常重要,感谢您的支持!

    60220

    Gradle的一些技巧和遇到的问题

    ``` # 查看构建版本 ..../gradlew build --profile # 调试模式构建并打印堆栈日志 ....apk 项目可以通过定义多个不同的productFlavors来实现应用的不同定制版本,每一个Flavor与buildTypes配合产出对应的一种输出类型的apk文件,新建的项目初始化只有一个默认的Flavor...如果下载完可以配置gradle离线工作 ,勾选gradle会使得速度更快,但同时存在一个问题,如果需要从网上加载第三方库,会无法下载,所以酌情使用。所以需要没有的第三方模块记得把这个关了。...直接运行release版本 有时候调试SDK必须要用release版本,例如地图、登录,但是每次打包混淆太麻烦,希望能在IDE中直接跑出release版本的应用,简单来说就是在debug模式下产生release

    1.9K30

    apktool的下载,安装,反编译和重新打包

    两个文件放在同一目录,后将该目录添加到您的环境变量系统PATH变量中 Linux 写个sh脚本放在同一目录下 #!...apktool d apk文件路径 o 解压目录 2.重新打包 使用 b 或 build apktool b 解压后的项目目录 -o 新apk的名字 // 重新打包生成的 apk 需要签名才能安装 3....如果您要比较来自不同版本的同一APK的smali,则首选使用。...错误,这表示apk中有apktool不能识别的结构。可能是apktool不支持的更新的api版本,亦或者是该apk为不规则的apk。你可以添加此配置,以跳过错误,但后续你需要手动修复这些错误。...#-m, --match-original 将各文件处理为最接近原生的形式,将会导致不能备重新打包。 Ps:我试了下,格式确实更接近原生,但是我重新打包也是成功了(打包成功,但并未签名安装)。

    7.8K30

    在 Android Instant App(安卓即时应用程序)中启用 ProGuard (混淆)

    为你所有的即时应用功能启用 ProGuard(混淆) 在可安装的应用程序版本构建过程中,ProGuard(混淆)只运行一次:在使用 com.android.application 插件的模块中。...窍门是使用 Android SDK 中提供的工具来近乎自动化的执行这个操作。 首先,准备好一个调试版本(或者没有启用 ProGuard(混淆)的调试版本)。...inflating: detail-debug.apk 每个 APK 都包含一个(或多个)classes.dex 文件,该文件包含从其构建的模块的所有代码。...有了关于 DEX 格式和命令行 APK 分析器(一个分析 APK 中 DEX 文件的工具)的一些知识,我们可以很容易地找到所选模块中哪些被使用了但没有定义的类。...referenced 类只能来自两个地方:Android 框架或其他模块,这取决于...答对了!

    2.6K30

    从构建工具看 Android APK 编译打包流程

    图画的比较简单,标出了大体流程,可以发现整个构建流程大概分为两部分:编译(Compile),打包(Package) 编译 编译过程就是将 java文件 编译成 class文件,最后优化成 dex文件。...打包 打包流程就是将DEX文件和编译后的资源组合成单个APK,并且签名,生成最终的APK。 在这些工作中会有很多工具来辅助完成,比如AAPT,aidl,javac,apk builder 等等。...比如 1)、在以前的AAPT版本,Android 清单文件中出现错误的节点元素只会被忽略或警告,而AAPT2开始会对这些节点进行报错,比如: 版本使用的工具是apkbuilder,但是在最新的版本我发现没有这个工具了,sdk目录下也找不到了。...: Android 构建团队不断进行更改以提高生成性能,在此版本中(Android Studio 3.6),我们将默认打包工具更改为 zipflinger 以进行调试生成。

    4.1K30
    领券