一点娇艳美容提供全面的美容、护肤、化妆资讯,CTRL + D 收藏吧

主页 > 瘦身塑形 >

android 瘦身给Android Apk瘦身的几点浅见

祛斑祛痘 2021-04-30 17:15:29

Android Apk瘦身的几点建议

Apk目录结构分析classes.dex瘦身assets和res中的资源文件优化lib中资源的优化Apk解压后目录分析

使用Apk Analyser 分析我们Apk文件会发现目录结构基本如下:

classes*.dex:包含以Dalvik / ART虚拟机可理解的DEX文 件格式编译的类,单个的 classes.dex 文件可以容纳大约 64K 方法。如果你达到了这个限制,你就必须要在你的工程中使用MultiDex,这将会创建另一个 classes1.dex 文件去存储剩下的方法。以此类推AndroidManifest.xml:清单文件,包含包名,版本,访问权限等等resources.arsc:已经编译的资源,该文件包含values目录下的所有内容,打包工具提取此XML内容,将其编译为二进制格式,并将内容归档。此内容包括语言字符串和样式,以及直接包含在resources.arsc文件中的内容路径 ,例如布局文件和图像。lib:各平台so库文件(armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips)res:未编译的资源assets:包含应用可以使用AssetManager对象检索的应用资源。META-INF/:包含CERT.SF和 CERT.RSA签名文件以及MANIFEST.MF 清单文件。classes.dex瘦身

减少使用复合型的三方库,不要为了实现一个功能引入更多无关代码避免使用枚举,若可能尽量使用@*Def注解方式替代枚举开启项目混淆优化assets和res中的资源文件

res/raw和assets的相同点:两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。res/raw和assets的不同点:

res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。

res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹。针对不同的情况,对于资源文件有不同的优化策略。一般来讲,对于res/drawable-**ddpi中的png资源可以进行压缩。

图片资源优化使用WebP图片格式Android 4.0 (API level 14) 支持有损压缩的WebP格式,Android 4.3 (API level 18) 开始支持无损透明WebP图像。比jpg/png体积更小.对背景图 尽量使用9patch图压缩资源在 build.gradle 文件中将 shrinkResources 属性设置为 true。android {...buildTypes { release { shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }}} 资源压缩器目前不会移除 values/ 文件夹中定义的资源(例如字符串、尺寸、样式和颜色)。这是因为 Android 资源打包工具 (AAPT) 不允许 Gradle 插件为资源指定预定义版本。同时,我们也可以指定哪些资源可以保留下来。

例如,将下边的代码保存在 res/raw/keep.xml。构建不会将该文件打包到 APK 之中。

<?xml version="1.0" encoding="utf-8"?>

<resources xmlns:tools="}

tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"

tools:discard="@layout/unused2" />

resources有以下属性:

tools:keep 指出哪些资源会保留tools:discard 指定哪些资源需要剔除tools:shrinkMode 资源压缩模式,有两种取值strict和safe,默认为safesafe和strict的优化策略:

safe可以简单理解为安全模式,它会尽最大努力检查代码中可能会使用到的资源进行保留,避免运行时错误。如果你的代码调用 Resources.getIdentifier(),这就表示你的代码将根据动态生成的字符串查询资源名称。当你执行这一调用时,默认情况下资源压缩器会采取防御性行为,将所有具有匹配名称格式的资源标记为可能已使用,无法移除。String name = String.format("img_%1d", angle + 1);

res = getResources().getIdentifier(name, "drawable", getPackageName());

strict模式下,img_前缀的资源会做未使用的处理,因此你需要使用tools:keep手动进行已使用标识。移除未使用的备用资源

defaultConfig {

// 对于国际化支持只打包中文资源,

resConfigs "zh-rCN"

}

lib中资源优化

目前主流的机型都是支持armeabi-v7a的,并且armeabi-v7a兼容armeabi。所以在一般的开发中我们只需要使用armeabi-v7a 进行ABI支持。

标签: android 瘦身

上一篇:脸上长了好多的斑,大家有没有可以淡斑产品推荐不?

下一篇:没有了

android 瘦身相关推荐

都在看的护肤知识