利用 Android Meta Data 定制多版本不同行为的APK

本文主要参考文档如下:

[1]. Android学习之 Manifest 中 meta-data 扩展元素数据的配置与获取

在前作利用 Android Studio 和 Gradle 打包多版本APK所述优化完成后,我们的项目已经可以实现定制多版本不同行为的APK了,但是当时的实现方式还比较low,是通过一个工具类判断当前的Build Variant来决定各种特性的开启和值的,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class ThemeHelper {

……

/**
* BuildType为debug的版本可以重设置服务器地址。
*
* @param context
* @return
*/
public static boolean canChangeServerUrl(Context context) {
switch (BuildConfig.BUILD_TYPE) {
case "debug":
return true;
default:
return false;
}
}

……
}

思考了半天,想到了利用 Manifest 中 meta-data 扩展元素和 build.gradle 定制占位符来实现这个定制。

利用 Android Studio 和 Gradle 打包多版本APK

本文主要参考文档有:

[1]. Android 项目利用 Android Studio 和 Gradle 打包多版本APK

[2]. Building Multiple Editions of an Android App with Gradle

[3]. Gradle Plugin User Guide 中文版

[4]. Manifest Merger

[5]. Get product flavor or build variant in an android app

[6]. How to create a release signed apk file using Gradle?

我主要是从公司项目需求出发,依照参考文档[1]的思路学习配置Gradle来实现多版本、多ApplicationID的Apk打包,在学习过程中通过参考其他文档实现了与项目原本就采用的AndroidAnnotations框架和Robolectric测试框架的兼容,最后完成品可见此链接 build.gradle (后面具体介绍时会有针对性地放出相关代码),实现了用gradle命令自动打包apk时具备以下效果:

  1. 可以根据渠道不同在版本名中增加相应后缀, 可以根据特殊客户要求打包不同 ApplicationID 的 apk 包,并可分别使用不同的资源文件(如不同的应用图标等)——主要使用 productFlavors 特性;
  2. 可以为开发人员、测试人员、IT人员和正式用户打包不同的 apk 包,以便在程序行为上针对不同使用需求做少量定制(如是否可以更改远程服务器地址等)——主要使用 buildType 特性;
  3. 打包不同 ApplicationID 的 apk 包时可以与 AndroidAnnotations 框架兼容不出错—— apt arguments 中设定 resourcePackageName 参数;
  4. 测试不同 ApplicationID 的 apk 包时可以与 Robolectric 测试框架兼容不出异常——设置 TestCase 的 @Config 中各参数;
  5. 打包时可根据需求自动签名,且签名文件不需要放在项目文件夹下,可以实现不同开发设备配置不同的签名文件路径。

下面将针对上述各条效果分别说明实现方法,在阅读以下内容时请确保您已至少阅读上述参考文档[1],并建议最好阅读完上述参考文档[2]、[3]。

记一次Android OOM问题的解决

一个困扰了我一个多礼拜的OOM bug今天终于给解决掉了,前辈攻城狮说OOM这种东西总是由不起眼的东西引起的,此言不虚啊!
最初客户回报上来的症状是程序莫名卡死、黑屏,无法操作乃至需要重启设备才能恢复正常( 这里我学到了一个道理:客户都是没什么耐心的。 其实多等几秒系统杀掉程序出现FC对话框就不需要重启设备了的说)。