在公司只能用eclipse来进行Android的开发,可领导突然想用gradle实现自动化打包,之前的概念全是AS使用gradle,于是开始研究起gradle,并就对gradle有了全新的认识。
根据不同版本设置不同常量
语法:
buildConfigField "boolean", "API_ENV", "true"
支持String、boolean
例子:有两个版本 debug
和release
,必须得有debug,感觉是这样
比如正式版和开发版服务器的地址是不同的,这时可以在gradle当中配置
android {
buildTypes {
debug {
buildConfigField "String", "API_URL",
"\"http://test.example.com/api\""
buildConfigField "boolean", "LOG_HTTP_CALLS", "true"
}
release {
buildConfigField "String", "API_URL",
"\"http://example.com/api\""
buildConfigField "boolean", "LOG_HTTP_CALLS","false"
}
}
代码获取
String apiUrl = BuildConfig.API_URL;
注意:上述的方法只能在android studio使用,如果要在eclipse中想动态控制变量,可以用以下方法。
1、动态更改xml中的<meta-data>
在AndroidManifest中,它是已这种格式存在
<meta-data
android:name="name"
android:value="value" />
在代码中获取是这么获取
//在Activity应用<meta-data>元素。
ActivityInfo info = this.getPackageManager()
.getActivityInfo(getComponentName(),PackageManager.GET_META_DATA);
info.metaData.getString("meta_name");
//在application应用<meta-data>元素。
ApplicationInfo appInfo = this.getPackageManager()
.getApplicationInfo(getPackageName(),PackageManager.GET_META_DATA);
appInfo.metaData.getString("meta_name");
//在service应用<meta-data>元素。
ComponentName cn = new ComponentName(this, MetaDataService.class);
ServiceInfo info = this.getPackageManager().getServiceInfo(cn, PackageManager.GET_META_DATA);
info.metaData.getString("meta_name");
//在receiver应用<meta-data>元素。
ComponentName cn = new ComponentName(context, MetaDataReceiver.class);
ActivityInfo info = context.getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
info.metaData.getString("meta_name");
而使用gradle方法修改可参考之后的内容动态更改包名以及渠道变量
2、动态更改 resValue
在你的 gradle 内容 buildTypes 或者 productFlavors 下面,如 release 体内写上类似:
resValue "string", "AppName", "Tel4Drakeet"
另外一种方法是直接建立一个文件
来源于:http://tech.meituan.com/mt-apk-adaptation.html
android {
productFlavors {
wandoujia {
}
}
}
上面的配置会默认src/wandoujia目录为wandoujia flavor的dataSet。
接下来,在src目录内创建wandoujia目录,并添加如下应用名字符串资源(src/wandoujia/res/values/strings.xml):
<resources>
<string name="app_name">美团团购</string>
</resources>
同时也能更改图片文件
更改方式和上述string一样
动态更改包名以及渠道变量
生成的渠道包会产生在apk文件下
更改了包名 并生成了 playstore以及hiapk两个渠道的包
productFlavors {
playstore {
packageName='com.youxiachai.androidgradle.playstore'
}
hiapk {
packageName='com.youxiachai.androidgradle.amazonappstore'
}
}
这是生成了wandoujia的渠道包,并且将xml中的渠道变量更改成了wandoujia
productFlavors {
wandoujia{
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
}
而这个变量在xml中是这个形式
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" >
</meta-data>
如果渠道名有很多总共打的包的数量会是 渠道*4
如果想要单独打一个渠道的包
首先
gradle tasks
就可以看到一下内容
Build tasks
-----------
assemble - Assembles all variants of all applications and secondary packages.
assembleAndroidTest - Assembles all the Test applications.
assembleDebug - Assembles all Debug builds.
assembleRelease - Assembles all Release builds.
assembleWandoujia - Assembles all Wandoujia builds.
比方说我只想打wandoujia的渠道包
就执行
gradle assembleWandoujia
这样就会打包豌豆荚的4个包。
以下是我之前编译时遇到的错误及解决方法
- .9图变形的问题可以通过重新制作点9图,或者将.9图改成普通的.png图片
- 还遇到过values文件夹得问题,里面的attrs可能重复项也会导致gradle编译不成功
- values文件夹中的color文件的格式错误,比如name多加了一个空格
- \ttf这种问题。主要是该文件不是utf-8中的无rom要改成这种格式
参考资料
网友评论