android studio gradle的内容都代表了什么

本文详细解析了Android Studio中build.gradle文件的各项配置含义,包括构建脚本、依赖管理、编译参数设置等内容,并提供了常见问题解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

跑studio 项目,必有这么一个build.gradle 文件,这玩意儿里面的东西太多了,不过我反正都是默认的设置,今天就来看看,都是啥意思.


 

build.gradle内容如下:

import com.sun.org.apache.xalan.internal.xsltc.cmdline.Compile
import com.sun.org.apache.xalan.internal.xsltc.compiler.Copy

//设置脚本的运行环境(一般不用)
buildscript {
    //支持java 依赖库管理(maven/ivy),用于项目的依赖。
    repositories {
        mavenCentral()
    }
    //依赖包的定义。支持maven/ivy,远程,本地库,也支持单文件
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
}

//声明构建的项目类型,这里当然是android了
apply plugin: 'com.android.application'
apply plugin: 'com.droidtitan.lintcleaner'
//设置编译android项目的参数
android {
    compileSdkVersion 23
    buildToolsVersion '23.0.3'
    defaultConfig {
        applicationId 'com.searainbow.enterpriseplat'
        minSdkVersion 14
        targetSdkVersion 22
        multiDexEnabled true
    }
    /*sourceSets {
         main {
             jniLibs.srcDirs = ['libs'] // <-- Set your folder here!
         }
     }*/
    //Android默认配置(一般不用写上)
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
        //测试所在的路径,这里假设是tests文件夹,没有可以不写这一行
        instrumentTest.setRoot('tests')
    }

    //签名设置
    signingConfigs {
        apply plugin: 'signing'
        release {
            storeFile file('release.keystore')
            storePassword "yourstorepassword"
            keyAlias "yourkeyalias"
            keyPassword "yourkeypassword"
        }
        debug {
            storeFile file('debug.keystore')
        }
    }

    defaultConfig {
        applicationId "your package name"
        minSdkVersion 15
        targetSdkVersion 21
        //versionCode Integer.valueOf(vCode())
        //versionName "2.1.10"
    }

    //这个是解决lint报错的代码
    lintOptions { abortOnError false }

    //用来清除无用资源的插件,详见https://github.com/marcoRS/lint-cleaner-plugin
    lintCleaner {
        exclude = ['umeng*.png', '*.xml']
        ignoreResFiles = true
    }
    //将打包后的文件复制到build目录下,这样就不用深入到apk目录,同时还看不到unaligned的apk了
    task copyTask(type: Copy) {
        from 'build/outputs/apk/'
        into 'build/'
        exclude '*-unaligned.apk'
    }
    //多个版本的打包配置(不同包名,ps:未测)
    productFlavors {
        Version1 {
            applicationId "your package name1"
            manifestPlaceholders = [GAO_DE_KEY: "your gaode key1", UMENG_KEY: "your umeng key1"]
        }
        Version2 {
            applicationId "your package name2"
            manifestPlaceholders = [GAO_DE_KEY: "your gaode key2", UMENG_KEY: "your umeng key2"]
        }
    }

    //混淆设置
    buildTypes {
        release {
            //minifyEnabled false
            //proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
            
            signingConfig signingConfigs.release
            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //将release版本的包名重命名,加上版本及日期
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('release.apk')) {
                        def fileName = "${variant.productFlavors[0].name}_V${defaultConfig.versionName}_${releaseTime()}.apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }
        }
        debug {
            signingConfig signingConfigs.release
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
//repositories { flatDir { dirs 'libs' } }
repositories {
    //从中央库里面获取依赖
    mavenCentral()
    //或者使用指定的本地maven 库
    maven {
        url "file://F:/githubrepo/releases"
    }
    //或者使用指定的远程maven库
    maven {
        url "远程库地址"
    }
}

//.so文件的导入
task copyNativeLibs(type: Copy) {
    from fileTree(dir: 'libs', include: 'armeabi/*.so') into 'build/lib'
}
tasks.withType(Compile) {
    options.encoding = "UTF-8"//编码格式
}

/*tasks.withType(Compile) {
    compileTask -> compileTask.dependsOn copyNativeLibs
}*/
clean.dependsOn 'cleanCopyNativeLibs'
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
    pkgTask.jniFolders = [new File(buildDir, 'lib')]
}
//用来清除无用资源的插件,详见https://github.com/marcoRS/lint-cleaner-plugin
lintCleaner {
    // Exclude specific files
    exclude = ['umeng*.png', '*.xml']

    // Ability to ignore all resource files. False by default.
    ignoreResFiles = true

}
//将打包后的文件复制到build目录下,这样就不用深入到apk目录,同时还看不到unaligned的apk了
task copyTask(type: Copy) {
    from 'build/outputs/apk/'
    into 'build/'
    exclude '*-unaligned.apk'
}

/*task bd(dependsOn: ['assembleDebug', 'assembleRelease', 'copyTask']){
    copyTask.mustRunAfter assembleRelease
}*/

//依赖包的定义。支持maven/ivy,远程,本地库,也支持单文件
dependencies {
    compile(name: 'pullToRefresh_library-release', ext: 'aar')
    //某个文件夹下面全部依赖
    compile fileTree(dir: 'libs', include: '*.jar')
    //单文件依赖
    compile files('libs/android-support-v4.jar')
    compile project(':zxing')//依赖第三方lib库
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.google.code.gson:gson:2.4'
}

当然版本信息可以写在gradle里面,但是本人还是习惯写在清单文件里面.上面内容是写的多了一些,正常情况下,

大部分都不会用到的,所有参考作用为大.

当然这里面的东西还有太多,比如涉及热修复时候的task等等,不过今天先写这么点,抽空在补充....


参考 :

http://blog.chinaunix.net/uid-20771867-id-5106723.html

http://www.csdn123.com/html/topnews201408/74/9974.htm



加一些Android studio 的设置:

在android studio目录下找到:studio64.exe.vmoptions文件,

-Xms128m
-Xmx1050m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=96m
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djna.nosys=true
-Djna.boot.library.path=

-Djna.debug_load=true
-Djna.debug_load.jna=true
-Djsse.enableSNIExtension=false
-XX:+UseCodeCacheFlushing
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-Didea.platform.prefix=AndroidStudio
-Didea.paths.selector=AndroidStudio

这些都是什么意思呢? 其中 :

-Xms128m :  就是JVM启动的起始堆内存,堆内存是分配给对象的内存。这里我把它改成了512m

-Xmx750m : 

也就是AndroidStudio能使用的最大heap内存,这里我改成了2048m.

这两个参数都是-X开头的,表示非标准的参数。什么叫非标准的呢?我们知道JVM有很多个实现,

Oracle的,OpenJDK等等,这里的-X参数,是Oracle的JVM实现使用的,OpenJDK不一定能使用,

也就是没有将这些参数标准化,让所有的JVM实现都能使用。

-XX:MaxPermSize=350m : 这个参数指定最大的Permanent generation大小。Permanent Generation也是一块内存区域,

跟heap不同,它里面存放的事类本身(不是对象),以及方法,一些固定的字符串等等。

-XX:ReservedCodeCacheSize=90m : 设置JIT java compiler在compile的时候的最大代码缓存。简单地说就是JIT(Just In Time)编译器在编译代码的时候,需要缓存一些东西,这个参数指定最多能使用多大内存来缓存这些东西。

我们知道编程语言分两种: - 编译型,先将人写的代码整个编译成汇编语言或机器语言,一条一条代码然后执行。 - 解释型,不需要编译,将人写的代码一条一条拿过来一次执行,先取一条,执行,完了再取下一条,然后在执行。

而对于Java来说,这个情况就比较特殊了,因为在Java这里,JVM先是将Java代码整个编译成bytecode,然后在JVM内部再一条一条执行bytecode代码。你说它是编译型的吧,bytecode又不用编译成机器代码,二是一条条bytecode一次执行。你说它是解释型的吧,它又有一个编译的过程。对于Java到底是编译型还是解释型到现在也没有一个定论。不过,我们还是可以探讨一下Java的JIT编译技术。
刚刚说了,在bytecode层面,代码是解释执行的。解释型的语言会比较慢,因为它没有办法根据上下文对代码进行优化。而编译型的语言则可以进行优化。Java的JIT技术,就是在bytecode解释执行的时候,它不一定是一条条解释执行的,二是取一段代码,编译成机器代码,然后执行,这样的话就有了上下文,可以对代码进行优化了,所以执行速度也会更快。
可见,JIT技术结合了编译型(速度更快)和解释型语言(代码更灵活)二者的优势。对于动态语言的执行来说,是一个非常大的优势。

-XX:+UseCompressedOops : 这个参数允许系统将代码里面的引用(reference)类型用32位存储,同时却能够让引用能够使用64位的内存大小。
我们知道现代的机器基本都是64位的,在这种情况下,Java代码里面的reference类型也变成了用64位来存储,这就导致了两个问题:
1. 64位比32为更大,占的内存更多,这是显然的,当然这个问题在整个程序看来根本不显然,因为哪怕系统同时有1000个引用存在,那多出来的内存也就4M,这个不重要,因为现在手机都动不动好几个G,大型服务器就更加不用说了。更重要的是第二点。 2. 相对于内存,CPU的cache就小的可怜了,当reference从32bit变成64bit时,cache里面能存放的reference数量就顿时少了很多。所以64bit的reference对cache是个大问题,于是就有了这个选项,可以允许系统用32bit来存储reference,让cache里面能存放更多的reference,同时又不影响reference的取址范围。至于他们是怎么做到的,我就不得而知了。。。

以上三个参数是以-XX开头的,根据Oracle的说明

Options that are specified with -XX are not stable and are subject to change without notice.

参考 : http://blog.youkuaiyun.com/xyxjn/article/details/46906909

其实自己项目没有特别大的话,基本不用设置,不过后期如果添加了很多jar包,库之类的,这个设置就有必要加了,否则容易报个:

Process 'command 'C:\jdk\bin\java.exe'' finished with non-zero exit value 2,当然这个错误原因也有很多种,顺便贴几个总结的方法吧:

:clean一下工程
:重启AndroidStudio,重启电脑也不行。
那么就是包名冲突,有重复的jar包名。这里的包名不是指jar的名称相同,而是指jar包里的相同的包名。排除冲突即可。
:其实直接打开Gradle项目中的,对应项目的脚本文件 ,改成如下的就行了
dependencies {
   compile project(‘:demo‘)
   provided fileTree(include: [‘*.jar‘], dir: ‘libs‘)
   compile ‘com.android.support:support-v4:22.1.1‘
   compile ‘com.android.support:appcompat-v7:22.1.1‘
}
即将 引用的库的条件改为provided,不要用compile.因为它们已经是库了
:关键代码是build.gradle中的:xx为合理的内存大小
android {
dexOptions {
// javaMaxHeapSize "xx"
javaMaxHeapSize "2g"
}
}

:图片不是png也可能报这个错误
:clean一下工程,不行再clean一下工程


每个':' ,代表我的一种尝试,什么情况都有,要根据自己的情况,去选择有效的解决办法,当然这几个方法也不是万能的,搞不定还是需要去google一下.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值