第一次学习使用gradle批量打包,也是跟网上现有的经验学到的,但是感觉现有文章介绍的不够完整,在这里总结了各位的经验,再加上自己的尝试,总结了一个完整的过程,供大家参考。
参考:http://blog.csdn.net/x605940745/article/details/41242687
http://stackoverflow.com/questions/25264823/product-variants-multiple-activities
一. 按照下面图片显示的步骤从eclipse导出gradle build。
1.export
2.由于我安装了Android Studio(Android Studio本身带有gradle插件,可以直接使用),eclipse会提示使用Android Studio。
3.选择一个工程。
4.确认,如果工程中已经有gradle,会显示error:build.gradle already exits at this locations,这时,选择下方的“Force overriding of exiting files”即可。
5.最后给个提示。
6.gradle build已经加到工程中了,在eclipse中选择刷新"refresh”,会出现gradle相关的文件和文件夹:gradle、gradlew、gradlew.bat。
7.打开gradle/wrapper/gradle-wrapper.properties,按照distributionUrl提供的地址下载gradle安装包:http://services.gradle.org/distributions/gradle-1.12-all.zip
二、配置gradle编译环境。
1.将现在的gradle安装包gradle-1.12-all.zip解压,然后配置环境变量:
变量名:GRADLE_HOME,变量值为:F:\eclipse-SDK-3.7-win32\gradle-1.12-all(也就是你下载的Gradle文件的根目录);设置path:在后面加上F:\eclipse-SDK-3.7-win32\gradle-1.12-all\bin。
gradle打包需要Android SDK和JDK,eclipse中配置配置了这两个SDK的路径并不等于gradle能够使用,需要设置系统环境变量才行。
变量名:ANDROID_HOME,变量值:F:\eclipse-SDK-3.7-win32\android-sdks\andrid-sdks(Android SDK的安装目录)
变量名:JAVA_HOME,变量值:F:\eclipse-SDK-3.7-win32\Java1.7(JDK的安装目录)。
环境配置好了就可以编译了。
三、编译
1.运行在cmd中运行gradle -v来判断是否设置成功 如下图
2.编译。确定安装成功之后,就可以运行gradle命令来打包了。将cmd命令定位到工程的根目录,然后运行gradle bulid。如下图。
出现“BUILD SUCCESSFUL”后,表示编译成功。
在eclipse中选择刷新"refresh”,工程中会出现build文件夹,在build/outputs/apk目录下有编译好的apk。如下图。
四、批量打包
想实现批量打包,需要配置build.gradle文件。原始的build.gradle文件如下:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.12.+'
}
}
apply plugin: 'android'
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
}
android {
compileSdkVersion 17
buildToolsVersion "22.0.1"
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
// Move the tests to tests/java, tests/res, etc...
instrumentTest.setRoot('tests')
// Move the build types to build-types/<type>
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/<type>/... which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied
// by a similar customization.
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
}
需要在sourceSets下配置:
app1{
manifest.srcFile 'tests/AndroidManifest1.xml'
}
app2{
manifest.srcFile 'tests/AndroidManifest2.xml'
}
instrumentTest.setRoot('tests')
在工程路径下新建tests文件夹,并新建AndroidManifest1.xml、AndroidManifest2.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.erase1" >
<!-- package="com.example.erase2" > -->
</manifest>
在android下配置:
productFlavors {
useOldManifestMerger true //使用原来的manifest中的配置项。
app1{
//这里可以配置不同的包名
applicationId="com.example.erase1"
}
app2{
applicationId="com.example.erase2"
}
}
配置好的build.gradle是这个样子的:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.12.+'
}
}
apply plugin: 'android'
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
}
android {
compileSdkVersion 17
buildToolsVersion "22.0.1"
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
// Move the tests to tests/java, tests/res, etc...
instrumentTest.setRoot('tests')
// Move the build types to build-types/<type>
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/<type>/... which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied
// by a similar customization.
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
app1{
manifest.srcFile 'tests/AndroidManifest1.xml'
}
app2{
manifest.srcFile 'tests/AndroidManifest2.xml'
}
instrumentTest.setRoot('tests')
}
productFlavors {
useOldManifestMerger true
app1{
//这里可以配置不同的包名
applicationId="com.example.erase1"
}
app2{
applicationId="com.example.erase2"
}
}
}
然后重新运行gradle bulid,编译成功后,会在build/outputs/apk下生成新的apk,如下图:
五、以上步骤都完成之后,就实现批量打包了。可将不同的apk安装到手机上验证他们的包名是不是跟你设置的一样,这个我已经验证过了。如下图:
至此,批量打包就实现了,这只是最基础的功能。还有进阶的技能,比如打包后,每个apk的名字、图标、UI素材会有差别等等,这些需要进一步学习。
另外,如果工程中含有.9的图片,在编译过程中会出现以下error:
F:\eclipse-SDK-3.7-win32\workapace\smart_remote_common_SVN_151203\res\drawable-hdpi\second_under_num.9.png: libpng warning: iCCP: Not recogniz
ing known sRGB profile that has been edited
ERROR: 9-patch image F:\eclipse-SDK-3.7-win32\workapace\smart_remote_common_SVN_151203\res\drawable-hdpi\second_under_num.9.png malformed.
Frame pixels must be either solid or transparent (not intermediate alphas).
Found at pixel #13 along top edge.
给图片包一层边就可以了,就是在图片的每个边上增加一层像素。