参考
gradle中英文 http://gradle.org/ http://doc.gradle.cn/wiki/gradle-main?hl=main
项目转换为gradle http://tools.android.com/tech-docs/new-build-system/intellij_to_gradle
gradle android 详细说明 http://tools.android.com/tech-docs/new-build-system/user-guide
多渠道打包 http://www.cnblogs.com/youxilua/archive/2013/05/20/3087935.html
常用配置
apply plugin: 'java': 指定项目为java项目
apply plugin: 'android' 指定为android项目
apply plugin: 'android-library':增加android库项目
常用命令
gradle -q quite模式,出错才输出
gradle tasks --all 列出所有任务
gradle projects 列出当前目录下所以项目
gradle :app:tasks 例如 gradle test:assemble 运行test项目assemble任务,相关前置任务会检查一次
例子
以聚超值为例子,因为要多个项目构成,需要settings.gradle 这个文件 , 参考
settings.gradle
include ':pcgCommon', ':Juchaozhi'
local.properties ,用于配置sdk.dir
sdk.dir=/Volumes/DATA/tools/android-sdk-macosx
root项目下有两个项目 pcgCommon和Juchaozhi
root 项目build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.12.+'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
pcgCommon build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.12.+'
}
}
apply plugin: 'com.android.library'
android {
compileSdkVersion 17
buildToolsVersion = 20
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
instrumentTest.setRoot('tests')
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
lintOptions {
abortOnError false
}
}
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
}
juchaozhi 项目build.gradle
apply plugin: 'android'
android {
compileSdkVersion 17
buildToolsVersion = 20
useOldManifestMerger true
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ["${rootDir}/pcgCommon/libs"]
}
instrumentTest.setRoot('tests')
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
lintOptions {
abortOnError false
}
}
signingConfigs {
myConfig{
storeFile file("${rootDir}/keystore/xxxxx.keystore")
storePassword "xxxxx"
keyAlias "pcgroup"
keyPassword "xxxxx"
}
}
buildTypes{
release {
signingConfig signingConfigs.myConfig
runProguard flase
proguardFiles getDefaultProguardFile('proguard-android.txt')
}
}
def markets = new File("${rootDir}/keystore/market.config").readLines()
productFlavors {
markets.each { name ->
"$name" {
}
}
}
String fileContents = new File("${projectDir}/AndroidManifest.xml").text
def m = fileContents =~ /android:versionName="(.*)"/
def version = m[0][1]
//println version
applicationVariants.all{ variant ->
def market = variant.productFlavors[0].name;
variant.processManifest.doLast{
copy{
from("${projectDir}/AndroidManifest.xml")
into("${buildDir}/manifests/$variant.name")
filter{
String line -> line.replaceAll("MOFANG_CHANNEL_VALUE", "$market")
}
variant.processResources.manifestFile = file("${buildDir}/manifests/${variant.name}/AndroidManifest.xml")
}
}
def apk = variant.packageApplication.outputFile;
def newName = apk.name.replace("-" + market, "_" + version + "_" + market);
newName = newName.replace("-release", "");
variant.packageApplication.outputFile = new File(apk.parentFile, newName);
if (variant.zipAlign) {
newName = newName.replace("unaligned//", "");
variant.zipAlign.outputFile = new File(apk.parentFile, newName.replace("-unaligned", ""));
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compile project(':pcgCommon')
}
注意事项
- 要注意有些旧项目的AndroidManifest.xml不符合新的规范要加上 useOldManifestMerger true 这个参数
- 检查的时候有问题也跳过
lintOptions {
abortOnError false
}
- runProguard true 代码混淆的选项 参考
- 市场列表文件每一行代表一个市场渠道
- 版本信息用正则匹配 AndroidManifest?.xml 这个文件
- 市场替换的代码 line.replaceAll("MOFANG_CHANNEL_VALUE", "$market"),设置manifestFile文件 variant.processResources.manifestFile
- 只编译release 可以采用 gradle assembleRelease
- 调过lint
tasks.whenTaskAdded { task ->
if (task.name.equals("lint")) {
task.enabled = false
}
}
- 复制so文件到安装包要怎加这个,只有在app模块生效在lib模块不生效 jniLibs.srcDirs = ${rootDir}/pcgCommon/libs?
lint 和 Proguard
proguard官方说明
打开注释 runProguard true ,修改proguard.txt可以打开混淆选项,如果内存不够,修改gradle.properties增加java运行内存
混淆的时候要注意JAVA_HOME版本和proguard支持的java版本相符
参考例子 http://www.eoeandroid.com/blog-1287430-48429.html
buildTypes{
release {
signingConfig signingConfigs.myConfig
runProguard true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), "${rootDir}/proguard.txt"
}
}
sdk里面提供的proguard-android-optimize.txt大致为
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
-optimizationpasses 5
-allowaccessmodification
-dontpreverify
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
-dontwarn android.support.**
proguard.txt内容
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-libraryjars <user.dir>/pcgCommon/libs/android-support-v13.jar
-libraryjars <user.dir>/pcgCommon/libs/framework.jar
-libraryjars <user.dir>/pcgCommon/libs/httpmime-4.1.1.jar
-libraryjars <user.dir>/pcgCommon/libs/imofan-ext.jar
-libraryjars <user.dir>/pcgCommon/libs/imofan.jar
-libraryjars <user.dir>/pcgCommon/libs/jpush-sdk-release1.5.2.jar
-libraryjars <user.dir>/pcgCommon/libs/libammsdk.jar
-libraryjars <user.dir>/pcgCommon/libs/mta-sdk-1.0.0.jar
-libraryjars <user.dir>/pcgCommon/libs/open_sdk.jar
-libraryjars <user.dir>/pcgCommon/libs/pinyin4j-2.5.0.jar
-libraryjars <user.dir>/pcgCommon/libs/weibosdkcore.jar
-libraryjars <java.home>/lib/rt.jar
-dontwarn com.imofan.**
-dontwarn cn.com.pcgroup.**
-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }
lint常见问题
主要是api版本和部分资源没使用的问题
InlinedApi?: Using inlined constants on older versions
NewApi?: Calling new methods on older versions
UnusedResources?: Unused resources
![(please configure the [header_logo] section in trac.ini)](http://www1.pconline.com.cn/hr/2009/global/images/logo.gif)