在App开发过程中,经常会用到或者根据需要来制做马甲包。
什么时候可能会需要用到马甲包?
1.产品或者运营的同事提出需求;
2.在市场试水;
3.希望同时在一部手机上看多个测试服务器,以及生产服务器run的结果,测试也可能需要。
等等......
马甲包作用:
1.马甲包与原app包的功能基本一致,但包名,包id,包图标可以不同。同时也可以通过写.properties文件,来进行一些key包括baseUrl的配置,方便便捷;
2.对于大部分的App最核心的作用就是获取有效用户。关键词覆盖的多,就意味着能够被更多的用户搜索到,有助于增加下载量
3.抗风险,新功能先在马甲包中,随意测试新功能,避免用户流失;
4.增加用户量。等等
如何写?
在app下的buildgradle的android{}内部添加这样的代码就可以了
productFlavors {
/* 三种马甲包 马甲包可以多添加几种 */
ceshi {} //测试
official {}//正式
dbug {} //演示
}
productFlavors.each { flavor ->
def props = new Properties()
/* 读取config文件夹中的配置文件 */
file("../config/${flavor.name}_config.properties").withInputStream {
props.load(new InputStreamReader(it, "GBK"))
}
def application_id = props.getProperty("APPLICATION_ID")
def app_name = props.getProperty("APP_NAME")
def server_url = props.getProperty("SERVER_URL")
def map_key = props.getProperty("MAP_KEY")
def umeng_key = props.getProperty("UMENG_APPKEY")
flavor.applicationId = application_id
flavor.manifestPlaceholders = [
APP_NAME : app_name,
MAP_KEY : map_key,
SERVER_URL : server_url,
UMENG_APPKEY: umeng_key
]
}
其中有一个需要添加的文件夹,在工程中,添加了一个配置文件,这样上边的代码块便可以读取到对应的文件。
APPLICATION_ID =...
APP_NAME = ...
SERVER_URL =...
MAP_KEY=...
UMENG_APPKEY=...
配置文件的写法,内容包括Umeng的key,包名,app的名字等;
在java文件中需要配置信息时,那就需要考虑如何读取文件:
<!--服务器请求地址-->
<meta-data
android:name="SERVER_URL"
android:value="${SERVER_URL}" />
在清单文件中添加如此代码块便可以了。
在java文件中的使用:
封装在一个工具类方法中:
public static String getMetaDataInApp(@NonNull final String key) {
String value = "";
PackageManager pm = Utils.getApp().getPackageManager();
String packageName = Utils.getApp().getPackageName();
try {
ApplicationInfo ai = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
value = String.valueOf(ai.metaData.get(key));
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return value;
}
//调用工具类方法
(类名).getMetaDataInApp("SERVER_URL");
缺点:
影响App的冷启动效率。由于添加配置文件,在app冷启动时,需要先将配置文件读到内存中,影响冷启动时间,因此尽量少配置,或者不进行配置。但这样写确实看着更加漂亮,优雅。