美文网首页
apk 瘦身记录

apk 瘦身记录

作者: BIGLEFT_393d | 来源:发表于2020-07-10 15:49 被阅读0次

    了解apk结构
    apk文件包含以下目录:

    assets/: 包含了应用的资源,这些资源能够通过AssetManager对象获得。

    lib/: 包含了针对处理器层面的被编译的代码。这个目录针对每个平台类型都有一个子目录,比如armeabi,armeabi-v7a, arm64-v8a, x86, x86_64和mips。

    res/: 包含了没被编译到resources.arsc的资源。

    META-INF/:

    包含CERT.SF和CERT.RSA签名文件,也包含了MANIFEST.MF文件。(译注:校验这个APK是否被人改动过)

    包含以下文件:

    classes.dex: 包含了能被Dalvik/Art虚拟机理解的 dex 文件格式的类。

    resources.arsc: 包含了被编译的资源。该文件包含了res/values目录的所有配置的 xml内容。打包工具将 xml

    内容编译成二进制形式并压缩。这些内容包含了语言字符串和styles,还包含了那些内容虽然不直接存储在resources.arsc文件中,但是给定了该内容的路径,比如布局文件和图片。所以又叫

    资源映射表

    AndroidManifest.xml:

    包含了主要的Android配置文件。这个文件列出了应用名称、版本、访问权限、引用的库文件。该文件使用二进制 xml格式存储。(译注:该文件还能看到应用的minSdkVersion, targetSdkVersion等信息)

    1.使用SVG对资源图片优化

    SVG(ScalableVectorGraphics),可缩放矢量图。SVG不会像位图一样因为缩放而让图片质量下降。优点在于可以减小APK的尺寸。常用于简单小图标。

    svg是由xml定义的,标准svg根节点为<svg>。

    Android中只支持 <vector>,我们可以通过 vector 将svg的根节点 <svg> 转换为 <vector>。

    在AndroidStudio中打开工程,在res目录中点击右键

    注意:通过svg处理200*200一下的图片


    SVG批量转换

    如果有多个svg需要转换为android的vector,则可以通过第三方工具 svg2vector进行批量转换。

    执行转换命令:

    java -jar svg2vector-cli-1.0.0.jar -d . -o a -h 20 -w20

    -d 指定svg文件所在目录

    -o 输出android vector图像目录

    -h 设置转换后svg的高

    -w 设置转换后svg的宽

    矢量图向后兼容--生成PNG

    Android 5.0(API 21)之前的版本不支持矢量图,使用Vector Asset Studio 有两种方式适配。

    方式一:生成 png 格式的图片

    Vector Asset Studio 可在构建时 针对每种屏幕密度将矢量图转换为不同大小的位图,在

    build.gradle 中配置如下:

    SVG 适用于 Gradle 插件1.5 及以上版本;

    android{

       defaultConfig{

            //5.0(API 21)版本以下,将svg图片生成指定维度的png图片

           generatedDensities = ['xhdpi','xxhdpi']

        }

    }

    默认会在drawable开头的几个文件件都生成png

    方式二:支持库

    在 build.gradle 中配置如下,适用于 Gradle 插件2.0及以上版本:

    android{

        // GradlePlugin 2.0+

       defaultConfig{

            //利用支持库中的 VectorDrawableCompat 类,可实现 2.1 版本及更高版本中支持 VectorDrawable

           vectorDrawables.useSupportLibrary = true

        }

    }

    dependencies {

      // 支持库版本需要是23.2 或更高版本

      compile'com.android.support:appcompat-v7:23.2.0'

    }

    使用矢量图 必须使用 app:srcCompat 属性,而不是 android:src,如下:

    Tint着色器

    我们一般让矢量图为黑色,然后用Tint 着色器去修改矢量图的颜色。(不建议直接在文件内修改)

    Tint着色器-点击效果

    创建两个选择器,然后正常使用即可

    <!-- drawable 选择器 battery_selector.xml-->

    <!-- color 选择器 battery_tint_selector.xml-->

    <!-- 使用 -->

    2.移除无用资源

    1.AS 给我们提供了一键移除所有无用的资源,如图。

    但是这种方式不建议使用,因为如果某资源仅存在动态获取资源id 的方式,那么这个资源会被认为没有使用过,从而会直接被删除。

    动态获取方式:

    getResources().getIdentifier("name","defType",getPackageName());

    2,。lint 使用

    建议对代码比较熟悉,能够大致清楚哪些文件是无用的,进行筛选删除

    3.国际化配置

    通过在gradle 文件配置我们需要的语言:

    android{

       defaultConfig{

            // 只适配英语

           resConfigs 'en'

        }

    }

    这样打包apk 内就只有我们配置的语言

    4.压缩代码

    将 minifyEnabled 设置为 true 即可

    但是我们会发现,运行时会报错,因为 minifyEnabled 即压缩了代码,也混淆了代码,所以我们需要处理下混淆

    5.压缩资源

    资源压缩只与代码压缩协同工作

    默认情况未启用严格模式,如需启动则需设置 shrinkMode,创建keep.xml,如下

    非严格模式:对于动态获取方式如:

    getResources().getIdentifier("name","defType",getPackageName());

    会对name开头的文件都做保留

    严格模式:只保留被使用的资源文件名一致的文件

    将该文件保存在项目资源中,例如,保存在 res/raw/keep.xml。构建不会将该文件打包到

    APK 之中。

    如果你有想要保留或舍弃的特定资源,则可以创建如下的 xml

    文件,然后在 tools:keep 属性中指定每个要保留的资源,在 tools:discard 属性中指定每个要舍弃的资源。

    相关文章

      网友评论

          本文标题:apk 瘦身记录

          本文链接:https://www.haomeiwen.com/subject/zgvpcktx.html