splits——安卓gradle

6,403 阅读3分钟

一、前言

今天分享 splits 配置,从字面意思知道有着 “切开” 的意思,他的作用其实是帮我们把 apk 包从不同维度进行“切开”,减小apk的大小,从而让用户在下载时节省流量。

二、splits 的结构简析

1、splits 的存在位置

Splits 会映射为 com.android.build.gradle.internal.dsl.Splits 类,没有继承任何类。

2、如何运行

splits 主要是用于打包时的拆包,所以我们需要的是进行apk的打包编译。

// app:clean 为了先清空之前的文件
// app:aR 进行编译 release 包
// mac 使用 ./gradlew 
// window 使用 gradlew 
./gradlew app:clean app:aR

三、splits 的属性

1、abi

  • 类型:AbiSplitOptions
  • 描述:对 abi 进行分包处理,具体我们看下面 AbiSplitOptions 讲解。

2、AbiSplitOptions 类型

2.1 enable

  • 描述:是否开启 abi 分包,默认不开启
  • 使用:
splits {
	abi {
		enable true
	}
}
  • 效果图:

2.2 exclude

  • 描述:排除不需要的架构。
  • 使用:
abi {
    // 是否开启
	enable true

    // 排除不必要的架构
	exclude 'x86','arm64-v8a'
}
  • 效果图:

2.3 reset

  • 描述:清除默认架构列表。当我们开启abi 分包时,gradle会帮我们初始化一个架构列表,例如 enable 小节中,我们并没有设置任何架构,而gradle会帮我们分出 “arm64-v8a”、“armeabi-v7a”、“x86”、“x86_64”。

初始化列表会因为gradle的版本不同有所改变

  • 使用:
abi {
    // 是否开启
    enable true

    // 重置包含的目录
	reset()
}

2.4 include

  • 描述:设置我们需要的架构。注意的是,我们需要先使用reset方法将默认列表清空,然后再设置。

  • 使用:

abi {
	// 是否开启
	enable true

	// 重置包含的目录,因为已经是包含全部
	reset()
	// 设置包含,调用前需要先用 reset 将默认清除
	include 'armeabi-v7a', 'x86'
}
  • 效果图:

2.5 universalApk

  • 描述:是否编译一个包含全部架构的apk。
  • 使用:
abi {
	// 是否开启
	enable true

	// 是否打出包含全部的apk
	universalApk true
}
  • 效果图:

3、density

  • 类型:DensitySplitOptions
  • 描述:对 分辨率 进行分包处理,具体我们看下面 DensitySplitOptions 讲解。

4、DensitySplitOptions 类型

4.1 enable

  • 描述:是否开启 abi 分包,默认不开启
  • 使用:
density {
	// 开启
	enable true
}
  • 效果图:

4.2 exclude

  • 描述:排除不需要的分辨率
  • 使用:
density {
	// 开启
	enable true
	
	// 排除分辨率
	exclude 'hdpi', 'ldpi', 'mdpi', 'xhdpi'
}
  • 效果图:

4.3 reset

  • 描述:重置默认的分辨率列表。默认会帮我们添加 "ldpi"、"mdpi"、"hdpi"、"xhdpi"、"xxhdpi"、"xxxhdpi"。

默认列表会根据gradle的版本有所不同。

  • 使用:
density {
	// 开启
	enable true
	
	// 重置默认分辨率列表
	reset()
}

4.4 include

  • 描述:添加需要的分辨率。值得一提的是,我们需要先用 reset 方法进行清空默认列表。
  • 使用:
density {
	// 开启
	enable true
	
	// 重置默认分辨率列表
	reset()
	
	// 包含分辨率
	include 'hdpi', 'xxhdpi'
}
  • 效果图

4.5 compatibleScreens

  • 描述:指定与应用程序兼容的屏幕尺寸。会在 AndroidManifest.xml 中添加一个匹配的 < compatible-screens > 节点。不过官方并不建议这么使用,因为会限制应用支持的设备类型。我们应该尽可能的支持多种设备。

值得一提的是,< compatible-screens > 节点并不会在 apk 的安装和使用过程中发挥最用,它是提供给外部使用的,例如google play。

  • 使用:
density {
	// 开启
	enable true
	
	// 会在 manifest 中添加 < compatible-screens><screen ... >
	compatibleScreens 'small', 'normal', 'large', 'xlarge'
}
  • 效果图

5、language

仅当为Android Instant Apps构建配置APK时,才支持构建每个语言的APK。

  • 类型:LanguageSplitOptions
  • 描述:对 语言 进行分包处理,具体我们看下面 LanguageSplitOptions 讲解。

6、LanguageSplitOptions 类型

6.1 enable

  • 描述:开启语言分包。
  • 使用:
language {
	enable = true
}

6.2 include

  • 描述:设置需要分包的语言。
  • 使用:
language {
	enable = true
	include "fr", "zh", "en"
}

四、写在最后

Gradle项目地址:Github传送门

本篇博文的 splits 配置,请进传送门

如果觉得本篇博文对你有所启发或是解决了困惑,给个赞或关注公众号呀,小盆友会继续分享更多的优质文章。

或是请我喝杯咖啡吧,小盆友会更加信心百倍的写下去