网站推广找,安徽注册公司网站,网络营销的八种方法,西安市未央区最新消息随着业务迭代#xff0c;apk体积逐渐变大。项目中积累的无用资源#xff0c;未压缩的图片资源等#xff0c;都为apk带来了不必要的体积 增加。而APK 的大小会影响应用加载速度、使用的内存量以及消耗的电量。在讨论如何缩减应用的大小之前#xff0c;有必要了解下应用 APK …随着业务迭代apk体积逐渐变大。项目中积累的无用资源未压缩的图片资源等都为apk带来了不必要的体积 增加。而APK 的大小会影响应用加载速度、使用的内存量以及消耗的电量。在讨论如何缩减应用的大小之前有必要了解下应用 APK 的结构。
一、APK 结构
APK 文件由一个 Zip 压缩文件组成其中包含构成应用的所有文件。这些文件包括 Java 类文件、资源文件和包含已编译资源的文件。
1、APK 包含以下目录
1. META-INF/ 包含 CERT.SF 和 CERT.RSA 签名文件以及 MANIFEST.MF 清单文件。
2. assets/ 包含应用的资源应用可以使用 AssetManager 对象检索这些资源。
3. res/ 包含未编译到 resources.arsc 中的资源图片、音视频等。
4. lib/ 包含特定于处理器软件层的已编译代码。此目录包含每种平台类型的子目录如 armeabi 、armeabi-v7a 、 arm64-v8a 、 x86 、 x86_64 和 mips 。
2、APK 还包含以下文件
1. resources.arsc 包含已编译的资源。此文件包含 res/values/ 文件夹的所有配置中的 XML 内容。打包工具会提取此 XML 内容将其编译为二进制文件形式并压缩内容。此内容包括语言字符串和样式以及未直接包含在 resources.arsc 文件中的内容例如布局文件和图片的路径。
2. classes.dex 包含以 Dalvik/ART 虚拟机可理解的 DEX 文件格式编译的类。
3. AndroidManifest.xml 包含核心 Android 清单文件。此文件列出了应用的名称、版本、访问权限和引用的库文件。该文件使用 Android 的二进制 XML 格式。
二、Android Size Analyzer
Android Size Analyzer 工具可轻松地发现和实施多种缩减应用大小的策略。 首先在 Android Studio 中的插件市场下载安装 Android Size Analyzer 插件。安装插件后从菜单栏中依次选择 Analyze Analyze App Size对当前项目运行应用大小分析。分析了项目后系统会显示一个工具窗口其中包含有关如何缩减应用大小的建议。 三、移除未使用资源
APK瘦身关键就在删除未使用的资源。
1、启用资源缩减 不打包
如果在应用的 build.gradle 文件中启用了资源缩减 shrinkResources 则 Gradle 在打包APK时可以自动忽略未使用资源。 资源缩减只有在与代码缩减 minifyEnabled 配合使用时才能发挥作用。在代码缩减器移除所有不使用的代码后资源缩减器便可确定应用仍要使用的资源 。
android {// Other settingsbuildTypes {release {minifyEnabled trueshrinkResources trueproguardFiles getDefaultProguardFile(proguard-android.txt), proguard-rules.pro}}
}
2、使用Lint分析器物理删除
lint 工具是 Android Studio 中附带的静态代码分析器可检测到 res/ 文件夹中未被代码引用的资源。从菜单栏中依次选择 Analyze Run Inspection By Name。
分析完成后会弹出 lint 工具不会扫描 assets/ 文件夹、通过反射引用的资源或已链接至应用的库文件。此外它也不会移除资源只会提醒您它们的存在。 与资源缩减不同这里点击删除那就是把文件删了。
3、自定义要保留的资源
如果有想要特别声明需要保留或舍弃的特定资源在项目中创建一个包含 resources 标记的 XML 文件并在 tools:keep 属性中指定每个要保留的资源在 tools:discard 属性中指定每个要舍弃的资源。这两个属性都接受以逗号分隔的资源名称列表。还可以将星号字符用作通配符。
?xml version1.0 encodingutf-8?
resources xmlns:toolshttp://schemas.android.com/toolstools:keeplayout/l_used*_c,layout/l_used_a,layout/l_used_b*tools:discardlayout/unused2 /
将该文件保存在项目资源中例如保存在 res/raw/keep.xml 中。构建系统不会将此文件打包到 APK 中。
4、移除未使用的备用资源
Gradle 资源缩减器只会移除未由应用代码引用的资源这意味着它不会移除用于不同设备配置的备用资源。可以使用 Android Gradle 插件的 resConfigs 属性移除应用不需要的备用资源文件。
例如如果使用的是包含语言资源的库如 AppCompat 那么 APK 中将包含这些库中所有已翻译语言的字符串。如果只想保留应用正式支持的语言则可以使用 resConfig 属性指定这些语言。系统会移除未指定语言的所有资源。 配置resConfigs 只打包默认与简体中文资源。
android {defaultConfig {...resConfigs zh-rCN}
} 5、动态库打包配置
so文件是由ndk编译出来的动态库是 c/c 写的所以不是跨平台的。ABI 是应用程序二进制接口简称Application Binary Interface定义了二进制文件尤其是.so文件如何运行在相应的系统平台上从使用的指令集内存对齐到可用的系统函数库。在Android 系统中每一个CPU架构对应一个ABI目前支持的有armeabi-v7aarm64- v8ax86x86_64。目前市面上手机设备基本上都是arm架构 armeabi-v7a 几乎能兼容所有设备。因此可以配置
android{defaultConfig{ndk{abiFilters armeabi-v7a}}
}
对于第三方服务如百度地图、Bugly等会提供全平台的cpu架构。进行了上面的配置之后表示只会把armeabiv7a打包进入Apk。从而减少APK大小。
四、图片资源
1、使用矢量图
Apk中图片应该算是占用空间最多的资源。我们可以使用webp减少png、jpg图片占用空间的大小。对于小图标也可以使用矢量图。 矢量图可以创建与分辨率无关的图标和其他可伸缩媒体。使用这些图形可以极大地减少 APK 占用的空间。 矢量图片在 Android 中以 VectorDrawable 对象的形式表示。借助 VectorDrawable 对象100 字节的文件可以生成与屏幕大小相同的清晰图片。
不过系统渲染每个 VectorDrawable 对象需要花费大量时间而较大的图片则需要更长的时间才能显示在屏幕上。因此建议仅在显示小图片时使用这些矢量图。 2、重复使用资源
现在我们有一个矢量图
vector xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:width24dpandroid:height24dpandroid:viewportWidth24android:viewportHeight24android:tint?attr/colorControlNormalpathandroid:fillColorandroid:color/whiteandroid:pathDataM10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z/
/vector
如果我们需要让矢量图显示红色怎么办这种情况我们不需要再去创建一个新的矢量图。可以直接给 ImageView设置 android:tint 属性 来完成颜色的修改。
ImageViewandroid:layout_width50dpandroid:layout_height50dpandroid:tintcolor/colorAccentandroid:srcdrawable/tabbar_home_vector / 3、使用选择器
如果需要让矢量图实现触摸变色。只需要创建selector设置给tint即可。
!-- tabbar_home_tint_selector --
?xml version1.0 encodingutf-8?
selector xmlns:androidhttp://schemas.android.com/apk/res/androiditem android:colorcolor/colorPrimary android:state_pressedtrue /item android:colorcolor/colorAccent /
/selector ImageView
ImageViewandroid:clickabletrueandroid:layout_width50dpandroid:layout_height50dpandroid:srcdrawable/tabbar_home_vectorandroid:tintcolor/tabbar_home_tint_selector /
4、其他
阿里矢量图库 https://www.iconfont.cn/help/detail?spma313x.7781069.1998910419.d8d11a391helptypecode
开启资源混淆 https://github.com/shwenzhang/AndResGuard
对于发布Google paly的应用选择使用AAB https://developer.android.google.cn/guide/app-bundle