APK压缩

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43724742/article/details/95904481

APK结构:

AndroidManifest.xml:包含核心Android清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件。
classes.dex:包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类
resources.arsc :包含已编译的资源,包含res/values/文件夹所有配置中的XML内容
assets:包含应用可以使用AssetManager对象检索的应用资源,里面的资源不生成id,通过文件名的方式打开
res:已编译过的资源文件,包括drawable,layout,color,xml,anim,mipmap
lib:存放so文件,如armeabi,armeabi-v7a, arm64-v8a,x86,x86_64等。
META-INF:包含CERT.SF和 CERT.RSA签名文件以及MANIFEST.MF 清单文件

图片资源压缩:

尽量使用WebP格式的图片:Android4.0以上支持有损WebP格式的图片,Android4.3以上支持含透明度的WebP
JPG:不支持透明色,使用的一种失真压缩 标准方法,多次上传下载后,图片逐渐会失真
PNG:无损数据压缩,支持透明度

另外可以用矢量图或.9图片代替小图片

assets文件删除和压缩

一般在assets会存放html、xml 或者json,或者javascript文件,对于这些文件的压缩遵循一条原则,精炼、不考虑可读性。

使用ProGuard:

proguard的四个功能:
压缩:移除未使用的类、方法、字段等;
优化:优化字节码、简化代码等操作;
混淆:使用简短的、无意义的名称重全名类名、方法名、字段等;
预校验:为class添加预校验信息;

使用如下gradle配置为发布构建启用代码压缩:

android {
    buildTypes {
        release {
         	shrinkResources true			//资源压缩去除无用资源
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                    'proguard-rules.pro'
        }
    }
}

通过资源混淆可以把资源的长路径名用无意义的短路径名替换,从而达到节省空间的目的;

AndResGuard

AndResGuard通过修改resources.arsc文件,从而可以混淆安卓的资源文件路径,比如:
res/drawable/activity_advanced_setting_for_test=>r/d/a
andresGuard在原生的buildApk步骤之后,使用产生的apk作为输入文件,对其进行混淆压缩,产出一个新的apk
AndResGuard依赖:

apply plugin: 'AndResGuard'

buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.17'
    }
}

andResGuard {
    mappingFile = null
    use7zip = true
    useSign = true
    keepRoot = false
    fixedResName = "arg"
    mergeDuplicatedRes = true
    whiteList = [
        // your icon
        "R.drawable.icon",
        // for fabric
        "R.string.com.crashlytics.*",
        // for google-services
        "R.string.google_app_id",
        "R.string.gcm_defaultSenderId",
        "R.string.default_web_client_id",
        "R.string.ga_trackingId",
        "R.string.firebase_database_url",
        "R.string.google_api_key",
        "R.string.google_crash_reporting_api_key"
    ]
    compressFilePattern = [
        "*.png",
        "*.jpg",
        "*.jpeg",
        "*.gif",
    ]
    sevenzip {
        artifact = 'com.tencent.mm:SevenZip:1.2.17'
    }
}

AndResGuard

字体提取

如果只使用了一个字体的少量的字符,那么可以使用fonttools把这些字符提取出来

移除x86

 	ndk {
        abiFilters "armeabi"
    }

https://www.jianshu.com/p/99f3c09982d4
https://www.jianshu.com/p/97476e095e1a

猜你喜欢

转载自blog.csdn.net/weixin_43724742/article/details/95904481
apk