apk大小压缩 ,混淆,Gradle配置多渠道包

APK 组成以及大小压缩优化:参考  https://www.jianshu.com/p/a0db5e588506

app组成结构

    META-INF/:包含CERT.SF和CERT.RSA签名文件以及MANIFEST.MF 清单文件

   assets/:包含应用可以使用AssetManager对象检索的应用资源。

   res/:包含未编译到的资源 resources.arsc。

  lib/:包含特定于处理器软件层的编译代码。该目录包含了每种平台的子目录,像armeabi,armeabi-v7a, arm64-v8a,x86,      x86_64,和mips。

  resources.arsc:包含已编译的资源。该文件包含res/values/ 文件夹所有配置中的XML内容。打包工具提取此XML内容,将其编  译为二进制格式,并将内容归档。此内容包括语言字符串和样式,以及直接包含在*resources.arsc8文件中的内容路径 ,例如布局文件和图像。(包括 :R.java和resources.arsc,生成的工具是aapt)

classes.dex:包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类。(Android运行的是dex文件,java是.class文件)

AndroidManifest.xml:包含核心Android清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件。该文件使用Android的二进制XML格式。

apk大小压缩 ,混淆,Gradle配置多渠道包

apk  大小优化

       1 :减少dex文件大小

           shrinkResources为true表示移除未引用资源,和代码压缩协同工作。

           minifyEnabled为true表示通过ProGuard启用代码压缩,配合proguardFiles的配置对代码进行混淆并移除未使用的代码。

            代码混淆在压缩apk的同时,也提升了安全性

apk大小压缩 ,混淆,Gradle配置多渠道包

     2:减少res,压缩图文文件:

       图片文件压缩是针对jpg和png格式的图片。我们通常会放置多套不同分辨率的图片以适配不同的屏幕,这里可以进行适当的  删减。在实际使用中,只保留一到两套就足够了(保留一套的话建议保留xxhdpi,两套的话就加上hdpi),然后再对剩余的图片 进行压缩(jpg采用优图压缩,png尝试采用pngquant压缩)

同时android 为了适配国际化,app的value 对应数据只需要配置对应得语言

3:减少lib文件大小:

     由于引用了很多第三方库,lib文件夹占用的空间通常都很大,特别是有so库的情况下。很多so库会同时引入armeabi、armeabi-v7a和x86这几种类型,这里可以只保留armeabi或armeabi-v7a的其中一个就可以了,实际上微信等主流app都是这么做的。

APK 代码混淆:

    博客连接 : https://www.jianshu.com/p/cba8ca7fc36d

     https://blog.csdn.net/sdfsdfdfa/article/details/81058270

前言介绍:

Android中的“混淆”可以分为两部分,一部分是 Java 代码的优化与混淆,依靠 proguard 混淆器来实现----》由于代码混淆用简单抽象的单词代替原有长而通俗易懂的代码,因而减少APK的体积

另一部分是资源压缩,将移除项目及依赖的库中未被使用的资源----》Gradle为Android提供的插件,能将项目中未使用的资源安全移除,大大减少APK体积

出现问题:

    proguard-android.txt ---->默认 ProGuard 配置文件 (proguard-android.txt) 足以满足需要,ProGuard 会移除所有(并且只会移除)未使用的代码。但是,ProGuard可能会移除应用真正需要的代码

    当应用引用的类只来自 AndroidManifest.xml 文件时;
    当应用调用的方法来自 Java 原生接口 (JNI) 时;
    当应用在运行时(例如使用反射或自检)操作代码时。

    继承某个Activity, 但是Activity内部类混淆导致程序崩溃

    json转换成某个包下的 model 后,这个包被混淆了,那么解析json 可能会出错

APK 多渠道打包:

    前言   参考 https://github.com/Meituan-Dianping/walle  

       在安装包中添加不同的标识,配合自动化埋点,应用在请求网络的时候携带渠道信息,方便后台做运营统计,比如说统计我  们的应用在不同应用市场的下载量等信息,或者不同版本app 上架不同应用市场等

   1: 在manifest.xml文件中配置动态渠道变量

apk大小压缩 ,混淆,Gradle配置多渠道包

2 :接着在app目录下的build.gradle中配置productFlavors,也就是配置打包的渠道

apk大小压缩 ,混淆,Gradle配置多渠道包

3: 根据配置的打包渠道,通过gradle命令,输出不同渠道的app

  执行./gradlew assembleRelease ,将会打出所有渠道的release包

执行./gradlew assembleVIVO,将会打出VIVO渠道的release和debug版的包

执行./gradlew assembleVIVORelease将生成VIVO的release包