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

APK 瘦身优化

- 启动时间、内存等 APK 组成 APK包结构如下: lib/:包含特定于处理器软件层编译代码。...该文件列出应用程序名称,版本,访问权限和引用文件。该文件使用Android二进制XML格式。...,请在 build.gradle 文件相应构建类型中添加 minifyEnabled true:对无用代码进行删除 minifyEnabled 这个是用来开启删除无用代码,比如没有引用到代码...可以通过multidexing分多个文件,比如这里classes2.dex。换句话说,就是减少代码量。我们可以通过以下方法来实现: 尽量减少第三方库引用,这个在上面我们已经做过优化了。...如果你dex文件太大,检查是否引入了重复功能第三方库(图片加载库,glide,picasso,fresco,image_loader,如果不是你一个人单独开发完成很容易出现这种情况),尽量做到一个功能点一个库解决

1.4K20

dex分包变形记

一、背景 就在项目灰度测试前不久,爆出了在 Android 3.0以下手机上安装时出现 INSTALL _ FAILED_DEXOPT,导致安装失败。...3.安装运行 我们把分包后 apk 在 Android 4.3手机上进行安装。没有问题,顺利安装上了! 没想到是,启动时出现任何页面,直接 crash。Crash log 如下: ?...既然 Android SDK 已经提供了这样一种比较方便工具,我们就不再重复发明轮子了。...如果是启动时同步加载,一般可以在 Application onCreate 或 attachBaseContext 中执行加载,两者区别不大。...---- 四、性能影响 Dex 分包后,如果是启动时同步加载,对应用启动速度会有一定影响,但是主要影响是安装后首次启动。

1.6K110
您找到你想要的搜索结果了吗?
是的
没有找到

Android Studio 3.2新功能特性

Android Jetpack Android Jetpack通过组件,工具和指导来帮助加速Android开发,消除重复性任务,并使您能够更快,更轻松地构建高质量,可测试应用程序。...导航编辑器 新导航编辑器与Android Jetpack导航组件集成,为创建应用导航结构提供图形视图。导航编辑器简化了应用目的地之间导航设计和实现。...Android Gradle插件提供了您可以在gradle.properties文件中设置以下全局标志: android.useAndroidX:设置true为时,此标志表示您希望从现在开始使用AndroidX...您可以通过在项目gradle.properties文件中包含以下内容来开始使用R8预览版本: android.enableR8 = true 修改了默认abi 当建立多个APK每个目标不同ABI...在cpp 目录中,位于应用程序项目范围所有头文件都将在每个本地C / C ++库依赖项include节点下进行组织。

5.4K10

QQ音乐Android编译提速之路

我们做法是,在每次编译成功后,收集所有工程文件最后修改时间,保存为一份文件快照。在下次编译开始时,组件会生成最新文件快照,与上一次文件快照进行比对,就可以收集到用户改动过文件了。...接下来解决方案是这样: 在全量编译期间,组件会同步启动一个独立进程,对所有的class文件进行遍历分析,得到对应ResolvedClass信息,并保存在本地文件中。...其内部把资源打包分成了 编译(compile)与链接(link) 两步,在编译阶段,负责将单个或者多个资源编译为二进制文件;链接阶段,则负责合并所有二进制文件再打包。...后续改动资源时,会先调用aapt2编译功能,将改动资源编译成为二进制文件。然后将新二进制文件拷贝到资源缓存目录中,覆盖掉同名文件。...并使用Gradle提供profile构建分析工具,进行针对性任务分析,解决脚本中一些不合理耗时。同时,也建议同步进行模块化改造,进行代码分拆等。

3.6K71

Android Gradle 同步优化

动态修改gradle配置 android.useAndroidX=true android.enableJetifier=true 复制代码 因为jetifier开关设置在gradle.properties...中,所以我们打算在插件判断是否是同步操作,如果是同步则主动关闭jetifier,从而绕开TransformAction耗时。...allProject{ apply plguins:"jetifier_closs.class" } 复制代码 最后我们还是失败了,以前介绍过项目内含有很多个复合构建项目,然后我们是通过所有子工程...最后决定移除项目所有的support库,主动关闭同步和编译阶段jetifier,这样既能同时加快打包速度也可以让同步速度变得更快,一举两得。...最后采取了之前说方法签名验证,因为已经移除了所有support库,所以最后apk产物必然是缺失对应依赖,这样在方法签名校验过程中就会出现异常。

68410

bat批处理简介:Windows自动化之道

重复工作交给代码。 导语 最近在工作中遇到一些纯粹重复工作,最终都通过脚本方式达到了自动化,大大提高效率。...比如之前每次发布zip包都需要手动编译lua文件、替换lua引用为二进制文件引用,选择对应文件打zip包,每次都需要几分钟,还容易出错、遗漏,很不geek,通过脚本后实现了完全自动化: [archive_demo.gif...] 再比如Android项目中用到了插件,由于正式打包和本地编译gradle脚本不同,以及Android Studio对模块编译支持不够,导致每次都需要手动修改文件名(如本地开发时build.gradle...,十分繁琐且容易造成代码不同步,通过脚本可以实现工程一键编译运行: [plugin_run_demo.gif] 由于之前没有用过bat脚本,所以做自动化时速度不是很快,因此花了一天时间整理一下bat脚本使用要点...主要是目前powershell速度远没有cmd快,正好我自动化任务都比较简单,如果用powershell可能启动时间比运行时间还长。 为什么不用python、perl等脚本语言?

2.1K21

android studio中文乱码各种情况解决办法

情况一:编辑器中文注释乱码。...而且很多人出现这种情况是因为从eclipse复制,或导入文件到了android studio中。Eclipse时候它可以自动识别,到了as就不可以了故出现这些错误。...解决办法:在Gradle Scripts -> build.gradle中的如下下图位置添加: android{compileOptions.encoding="GBK"} 或者 compileOptions.encoding...="GBK" 情况三:Gradle Build 中出现如下乱码,且编辑器中文注释有乱码 需要工具:SublimeText 或者 Notepad++ 或者 EidtPlus 总之是那些能把你文件改成...等一下(不用rebuild什么,文中乱码自己会变成了正常中文) ⑤rebuild一下,重复以上步骤,知道把那些GBK格式文件都改为UTF-8为止 总结: 1、Sublime Text2有个缺点,

5.7K40

AndroidStdio1_2

除了根属性意外,属性名称都以android开头 ? 元素声明指定java类 ? 指定多个值,不是一个元素多个值而是一直重复.带自动补全.好评 权限是一种限制,用于限制对部分代码或设备数据访问。...否则,访问这些权限保护功能会失败,并且不会向用户发送任何通知。 ? ? ? 右键改变 Android要求所有APK必须先使用证书进行数字签名,然后才能安装。...密钥库是一种包含一个或多个私钥二进制文件。 每个应用在其整个生命周期内必须使用相同证书,以便用户能够以应用更新形式安装新版本。...为了解决这个问题就出现了多渠道打包,一份源码给不同市场编译出不同APK文件,每个APK文件中都包含了当前市场渠道码(自己指定一个字符串)。...修改app/build.gradle文件,在Android标签下增加productFlavors标签,内容如下: ? ?

1.8K20

完整解析使用 Github Action 构建和发布 Flutter 应用

上面是 Github doc 里关于 Action 一个基本工作流 yml 文件,具体参数含义 : name:这表示该工作流文件名称,将在 Github actions 选项卡作为名称显示...; on:这将触发该工作流事件名称,它可以包含事件列表,例如这里监听事 push; jobs:每个工作流会包含一个或多个 jobs ,在这里只有一个,主要是用于表示不同工作任务; Explore-GitHub-Actions...或者 macos-latest; steps:每个 jobs 可以将需要执行内容划分为不同步骤; run:用于提供执行命令,例如这里使用了echo 打印日志; name: steps 里...三、隐私安全问题 最后,关于 Github Actions 之前存在过出现泄露敏感数据问题,比如 Github Token 等 ,举个例子,如上面的脚本,它在执行任务时都会需要秘钥 ,如果你使用第三方...action 在执行过程中获取了你密钥并干了一些“非法” 事情,就可能出现异常泄漏问题。

1.1K30

Android组件化问题思考

这个时候会先抽象一个壳工程,然后把所以子项模块用aar方式引入这个壳,之后会把每个业务放在一个仓库内,这样多个业务之间就不会出现代码冲突之类问题了。 这个时候会出现另外一些更困扰问题。...Github传送门 作者对于这个仓库描述是这样Gradle Repo是基于Gradle一个插件,用于管理多个Git仓库,支持方便快捷切换分支。...通过gradle plugin升级这个能力 如果简单使用configurations,还是会出现每个业务模块都需要处理情况,无法把这个能力收束到一个盒子,这个时候我们可以考虑通过一个gradle...定义dep版本配置 首先我们需要定义一份远端和branch版本相关gradle文件,这个文件可以定义好我们以前在工程目录下所熟悉maven仓库版本。...task任务,同步命令被执行时候,我们就通过接口调用或者git操作方式去获取远端gradle,然后更改项目的gralde configurations.all方式,去吧项目aar版本拉平。

1.1K50

开发工具总结(2)之全面总结Android Studio2.X填坑指南

【tips】如果这里没有你遇到难题,欢迎留言提出来,我能解决就一定帮你搞定。 下一篇讲解Android Studio3.0填坑指南 ---- 本文同步在github发布,有兴趣可以去看看。...Android Studio第一次启动时出现 unable to access android sdk add-on list ?...出现原因:电脑没有sdk,studio也没有自带sdk; 解决办法:在安装studio目录下找到bin\idea.properties,打开这个文件,在末尾加上一行 disable.android.first.run.../distributions/gradle-3.5-all.zip); (6)重新同步。...failed to complete gradle execution问题 解决方法有2个(2种方式实质上还是一样) 方法1:打开工程gradle.properties文件,添加如下配置项,这个问题应该就不会出现

1.7K10

Android 重构 | 持续优化统一管理 Gradle

: 一次引用,全文(项目)使用,避免团队协作引入重复依赖; 自带依赖更新提示; 支持跳转等常规操作。...一、buildSrc 搞起来 将官方描述用 Google 翻译了一遍,如下: 复杂构建逻辑通常很适合作为自定义任务或二进制插件进行封装。自定义任务和插件实现不应存在于构建脚本中。...buildSrc 只要不需要在多个独立项目之间共享代码,就可以非常方便地使用该代码。 该目录 buildSrc 被视为包含构建。...: 新建 versions.gradle 用于存放依赖/插件配置,在这里支持依赖更新/提示; 新建 updateDependencies.gradle task,用于将更新后依赖/插件同步 groovy...执行速度还是蛮快,随后变生成了我们 groovy 文件: 大概截取此文件内容,其实就是和我们 versions.gradle 一样,不信你看: Step 6:如何使用?

1.8K31

Android 启动优化详解

热启动 系统所有工作就是将Activity带到前台, 只要应用所有 Activity 仍驻留在内存中,应用就不必重复执行对象初始化、布局膨胀和呈现;undefined但是,如果一些内存为响应内存整理事件...线程优化 减少CPU调度带来波动,让应用启动时间更加稳定 控制线程数量,避免线程太多互争CPU资源,用统一线程池,根据机器性能来控制数量; 检查线程间锁,特别是防止主线程出现长时间空转(主线程因为锁而干等子线程任务...; // 阻塞式GC总耗时 Debug.getRuntimeStat("art.gc.blocking-gc-time"); //如果发现主线程出现比较多 GC 同步等待,就需要通过 Allocation...,如本地缓存,数据库,SP文件非常多时耗时 数据结构选择,如启动时可能只需要sp文件几个字段,SharedPreference就需要分开存储,避免解析全部sp数据耗时过长; 启动过程适合使用随机读写数据结构...) 插件化和熱修復: 事实上大部分框架在设计上都存在大量 Hook 和私有 API 调用,带来缺点主要有两个: 稳定性/兼容性: 厂商兼容性、安装失败、dex2oat 失败等,Android P

4.9K85

Jetpack 最新成员 AndroidX App Startup 实践以及原理分析

这样库,都在 ContentProvider 里面进行一些初始化工作,在 App 启动时运行多个 ContentProvider,这样会带来一些问题: 多个 ContentProvider 会增加了...,这样只会增加 App 加载时间,用户希望 App 加载得快,启动慢会带来糟糕用户体验,AndroidX App Startup 正是为了解决这个问题而出现。...自动初始化 在 build.gradle 文件添加依赖。...手动初始化(也是延迟初始化) 在 build.gradle 文件添加依赖,和上文一样。 创建一个类 LibaryD 实现 Initializer 接口,并重写两个方法,来初始化组件,和上文一样。...App Startup 是 Jetpack 新成员,是为了解决因 App 启动时运行多个 ContentProvider 会增加 App 启动时问题。

79230

启动优化

热启动 系统所有工作就是将Activity带到前台, 只要应用所有 Activity 仍驻留在内存中,应用就不必重复执行对象初始化、布局膨胀和呈现;undefined但是,如果一些内存为响应内存整理事件...线程优化 减少CPU调度带来波动,让应用启动时间更加稳定 控制线程数量,避免线程太多互争CPU资源,用统一线程池,根据机器性能来控制数量; 检查线程间锁,特别是防止主线程出现长时间空转(主线程因为锁而干等子线程任务...; // 阻塞式GC总耗时 Debug.getRuntimeStat("art.gc.blocking-gc-time"); //如果发现主线程出现比较多 GC 同步等待,就需要通过 Allocation...,如本地缓存,数据库,SP文件非常多时耗时 数据结构选择,如启动时可能只需要sp文件几个字段,SharedPreference就需要分开存储,避免解析全部sp数据耗时过长; 启动过程适合使用随机读写数据结构...) 插件化和熱修復: 事实上大部分框架在设计上都存在大量 Hook 和私有 API 调用,带来缺点主要有两个: 稳定性/兼容性: 厂商兼容性、安装失败、dex2oat 失败等,Android P

3.3K54

Android Studio 3.6 新特性一览(推荐)

我们可以在代码中引用所有具有 ID view,但不会有空指针或类强制转换错误风险。这些差异意味着布局和代码之间不兼容将导致编译时而不是运行时构建失败。...要在项目中启用视图绑定,请在每个模块 build.gradle 文件中包含以下内容: android { viewBinding.enabled = true } 一位 GDE 写 View binding...这个 IntelliJ 版本包括许多改进,从新服务工具窗口到大大改进启动时间。...这样在调试开发时候构建速度将会有所提高,但是我们也可以在 gradle.properties 文件中设置 android.useNewApkCreator=false 来改用旧打包工具。 ?...这些路线导航可以可以实时回放,路线导航沿线位置信息也会被发回到模拟器系统。 ? 多个屏幕支持 Emulato 29.1.10 更新了对多个虚拟屏幕初步支持。

2.4K20

还没自定义过 Gradle 插件要学了

但是,Gradle 插件使用了独立模块封装构建逻辑,无论是从开发开始使用来看,Gradle 插件整体体验都更友好。 逻辑复用: 将相同逻辑提供给多个相似项目复用,减少重复维护类似逻辑开销。...因为这种方式发布和复用更加友好,我们一般接触到 Gradle 插件都是指二进制插件形式。...1.4 应用插件步骤 我们总结下使用二进制插件步骤: 1、将插件添加到 classpath: 将插件添加到构建脚本 classpath 中,我们 Gradle 构建脚本才能应用插件。...主要功能分为 3 点: Set 容器: 支持添加多个 T 类型对象,并且不允许命名重复; 命名 DSL: 支持以 DSL 方式配置 T 类型对象,这也要求 T 类型必须带有 String name...,如果其中代码有问题就会出现 Sync 报错。

1.8K20
领券