了解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 属性中指定每个要舍弃的资源。
网友评论