什么是apk (apk瘦身)
如果有更好的建议或者想看更多关于综合百科技术大全及相关资讯,可以多多关注茶馆百科网。

转载请声明出处!
前言
完成一个app后,我们都需要生成一个apk,然后上线。apk的大小也在一定程度上影响了用户是否愿意下载你的app,所以就有了瘦身apk的艺术。目录
apk的结构图压缩和矢量图适配;Tint shader动态库删除so库ABI结论apk的结构
相关知识点既然要瘦身一个apk,首先要知道apk格式的文件内容。事实上,apk文件就是一个zip包。我们只需要把后缀改成zip,然后解压就能看到内容了。让我们来看看其中的文件及其功能:apk包含以下目录:
Assets/:包含应用程序的资源,可以通过AssetManager对象获得。Lib/:包含处理器级的编译代码。这个目录下有每个平台类型的子目录,比如armeabi、armeabi-v7a、arm64-v8a、x86、x86 _ 64和mips。Res/:包含尚未编译成resources.arsc的资源,META-INF/:包含CERT的签名文件。SF和CERT。RSA以及清单。MF文件。检查一下这个APK是否被改动过。apk包含以下文件:.
Classes.dex:包含Dalvik/Art虚拟机可以理解的dex文件格式的类。Resources.arsc:包含已编译的资源。该文件包含res/values目录的所有已配置的xml内容。打包工具将xml内容编译成二进制形式并进行压缩。这些内容包括语言字符串和样式,以及那些不直接存储在resources.arsc文件中,但给定了内容路径的内容,如布局文件和图片。因此,它也被称为资源映射表Android manifest . XML :包含主要的Android配置文件。该文件列出了应用程序名称、版本、访问权限和引用的库文件。该文件以二进制xml格式存储。(注意:文件还可以看到应用的minSdkVersion、targetSdkVersion等信息。)好了,既然知道了apk是什么,那就开始一步一步的瘦身这些内容吧。
图片压缩
众所周知,一个apk会用到很多图片。如果图片可以压缩,效果还是很可观的。如下图,我们在项目中经常用到这样一套图纸。
显然只是一张图片,但是我们需要这样的一组,因为它的大小和颜色,显然占用了很大的尺寸。有什么办法可以优化吗?
答案是肯定的。
Google的AS为我们提供了一个名为vectorAssetStudio的工具,可以帮助我们添加内置的材质图标,并将SVG(ScalablevectorGraphics)等本地格式作为矢量图资源导入到项目中,生成一个以可绘制目录中Vector为根节点的xml文件,矢量图的大小也更小。是不是很棒?那我们来看看怎么实现。
1、导入矢量图
首先,我们在AS中运行VectorAssetStudio。这些步骤是:右键单击项目中的res文件夹,然后选择New - VectorAsset。这时会弹出如下对话框。选择图中标注的相应操作,导入内置材质图标或SVG矢量图。
但是这种方法只能一张一张地导入图片,显然很麻烦。有没有更好的办法?其实我们之所以要用这个工具导入svg图片,而不是直接把svg图片复制到drawable中,是因为Android不支持svg,需要工具转换,所以我们可以用第三方库svg2vector进行批量转换,然后直接复制到drawable中。转换命令如下:
Java-jarsvg 2 vector-CLI-1 . 0 . 0 . jar-d .-OA-h20-w20
-d指定svg文件所在的目录。
-o输出androidvector图像目录。
-h设置转换后的svg的高度。
-w设置转换后的svg的宽度。
2、适配问题
因为只有Android5.0(API21)支持矢量图形,所以我们还需要适应这个地方。如果不匹配,而你的最小minSdkVersion版本小于21,它会在每个可绘制目录下自动生成对应的png图片,这样会使apk包变大,这里一定要注意。我们有以下两种适应方式:
方式一:生成png格式的图片
这种方式是在一个drawable文件中生成相应的png,但是我们可以指定只生成哪些。例如,以下配置
我们可以在项目的build.gradle中进行如下配置,即在指定的drawable文件中生成对应的png格式图片。
方式二:支持库
另一种方法是使用支持库,它支持库。
版本需要23.2或者更高,也是在项目的build.gradle中进行配置,如下:这种适配方式使用图片的时候,需要用app:srcCompat属性,而不是android:src,如下:
通过这个方式只是解决了不同大小需要多张图片的问题,但是还需要有不同颜色的图片。这个我们怎么处理呢?不要急,这个问题谷歌工程师也为我们准备了一个工具,它就是Tint着色器。
3、Tint着色器
一般我们矢量图都是使用黑色,然后由Tint着色器去修改颜色,直接在xml中使用即可,如下:
在java代码中,我们可以通过DrawableCompat去设置,如下:
那如果想要实现按键效果,通过Tint也能实现吗?答案是可以的。
首先我们需要创建两个选择器,一个是drawable选择器,一个是color选择器,如下:
然后就可以直接使用了,如下:
总的来说使用Tint找色器去修改矢量图的颜色还是蛮简单的吧。
通过矢量图这个方式,我们就能够减小使用图片的总大小,从而减小apk的大小。
瘦身不是一蹴而就的,所以我们接着减。
动态库移除
1、so库的相关知识点
说到so库,相信大部分人都有使用过,但是却不知道它到底是什么。其实so库就是由ndk编译出来的动态库。
那我们为什么要把so文件分别放在armeabi、arm64-v8a、armeabi-v7a、x86、x86_64这些文件中呢?
主要是因为我们的app运行在不同的手机中,而so库是由c\c++编译的,不是跨平台的,所以不同平台(不同CPU)需要使用不同的so库。那不同的文件是什么意思呢?我们接着往下看。
2、ABI
ABI是应用程序二进制接口简称(ApplicationBinaryInterface),定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。在Android系统上,每一个CPU架构对应一个ABI,即:armeabi,armeabi-v7a,arm64-v8a,x86,x86_64,mips,mips64。
ABISupportedInstructionSet(s)armeabiARMV5TEandlater,Thumb-1armeabi-v7aarmeabi,Thumb-2,VFPv3-D16,Other,optionalarm64-v8aAArch-64x86x86(IA-32),MMX,SSE/2/3,SSSE3x86_64x86-64,MMX,SSE/2/3,SSE3,SSE4.1,SSE4.2,POPCNTmipsMIPS32r1andlatermips64MIPS64r6
各版本分析如下:
mips/mips64:极少用于手机可以忽略x86/x86_64:x86架构的手机都会包含由Intel提供的称为Houdini的指令集动态转码工具,实现对arm.so的兼容,再考虑x861%以下的市场占有率,x86相关的两个.so也是可以忽略的armeabi:ARMv5这是相当老旧的一个版本,缺少对浮点数计算的硬件支持,在需要大量计算时有性能瓶颈armeabi-v7a:ARMv7目前主流版本arm64-v8a:64位支持所以现在我们一般只要在项目的build.gradle中适配ARMv7就行了,如下:
结束语
如果你的技术提升遇到瓶颈了,或者缺高级Android进阶视频学习提升自己,这有大量大厂面试题为你面试做准备!
后台私信回复:“Android学习”,“面试文档”,“视频收集大整理”获取。
未完待续。。。
好的,今天我们就暂时介绍到这儿,瘦身之旅长路漫漫,还有的方式我们下次分享。
如果喜欢本文可以关注我们的官方账号,第一时间获取资讯。
你的关注是对我们更新最大的动力~
本文主要介绍了关于什么是apk (apk瘦身)的相关养殖或种植技术,综合百科栏目还介绍了该行业生产经营方式及经营管理,关注综合百科发展动向,注重系统性、科学性、实用性和先进性,内容全面新颖、重点突出、通俗易懂,全面给您讲解综合百科技术怎么管理的要点,是您综合百科致富的点金石。
以上文章来自互联网,不代表本人立场,如需删除,请注明该网址:http://23.234.50.4:8411/article/84091.html