跑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一下.