Android Studio| app| build.gradle (1)

* app| build.gradle

 app| build.gradle

apply plugin:'com.android.application'  //APK编译必须加载这个插件 

android { 

      compileSdkVersion gradle.api 

      buildToolsVersion "22.0.1" 

      sourceSets{  //差不多的设置 

       main{ 

           manifest.srcFile'AndroidManifest.xml' 

          //通过设置jni目录为空,我们可不使用apk插件的jni编译功能。为什么?因为据说 

         //APK插件的jni功能好像不是很好使....晕菜 

          jni.srcDirs = []  

           jniLibs.srcDir 'libs' 

            aidl.srcDirs=['src'] 

           java.srcDirs=['src'] 

           res.srcDirs=['res'] 

        } 

    }//main结束 

   signingConfigs { //设置签名信息配置 

       debug { //如果我们在local.properties设置使用特殊的keystore,则使用它 

           //下面这些设置,无非是函数调用....请务必阅读API文档 

           if(project.gradle.debugKeystore !=null){ 

              storeFilefile("file://${project.gradle.debugKeystore}") 

              storePassword"android" 

              keyAlias"androiddebugkey" 

              keyPassword"android" 

           } 

        } 

   }//signingConfigs结束 

     buildTypes { 

       debug { 

           signingConfigsigningConfigs.debug 

           jniDebuggable false 

        } 

    }//buildTypes结束 

   dependencies { 

        //compile:project函数可指定依赖multi-project中的某个子project 

       compile project(':CPosDeviceSdk') 

       compile fileTree(dir: 'libs', include:['*.jar']) 

   } //dependices结束 

  repositories{ 

   flatDir {//flatDir:告诉gradle,编译中依赖的jar包存储在dirs指定的目录 

           name"minsheng-gradle-local-repository" 

            dirsgradle.LOCAL_JAR_OUT //LOCAL_JAR_OUT是我存放编译出来的jar包的位置 

   } 

  }//repositories结束 

}//android结束 

/*

   创建一个Task,类型是Exec,这表明它会执行一个命令。我这里让他执行ndk的

   ndk-build命令,用于编译ndk。关于Exec类型的Task,请自行脑补Gradle的API

*/ 

//注意此处创建task的方法,是直接{}喔,那么它后面的tasks.withType(JavaCompile) 

//设置的依赖关系,还有意义吗?Think!如果你能想明白,gradle掌握也就差不多了 

task buildNative(type:Exec, description: 'CompileJNI source via NDK') { 

       if(project.gradle.ndkDir == null) //看看有没有指定ndk.dir路径 

          println "CANNOT BuildNDK" 

       else{ 

            commandLine"/${project.gradle.ndkDir}/ndk-build", 

               '-C',file('jni').absolutePath, 

               '-j',Runtime.runtime.availableProcessors(), 

               'all', 'NDK_DEBUG=0' 

        } 

  } 

 tasks.withType(JavaCompile) { 

       compileTask -> compileTask.dependsOnbuildNative 

  } 

  ......   

 //对于APK,除了拷贝APK文件到指定目录外,我还特意为它们加上了自动版本命名的功能 

 tasks.getByName("assemble"){ 

       it.doLast{ 

       println "$project.name: Afterassemble, jar libs are copied tolocal repository" 

       project.ext.versionName =android.defaultConfig.versionName 

       println "\t versionName =$versionName" 

       copyOutput(false) 

     } 

----------------------------------------------------

app2 | build.gradle

apply plugin:'com.android.application'  //加载APP插件 

//加载utils.gradle 

applyfrom:rootProject.getRootDir().getAbsolutePath() +"/utils.gradle" 

//buildscript设置android app插件的位置 

buildscript { 

   repositories { jcenter() } 

   dependencies { classpath'com.android.tools.build:gradle:1.2.3' } 

//androidScriptBlock 

android { 

   compileSdkVersion gradle.api 

   buildToolsVersion "22.0.1" 

   sourceSets{//源码设置SB 

        main{ 

           manifest.srcFile'AndroidManifest.xml' 

           jni.srcDirs = [] 

           jniLibs.srcDir 'libs' 

           aidl.srcDirs=['src'] 

           java.srcDirs=['src'] 

           res.srcDirs=['res'] 

           assets.srcDirs = ['assets'] //多了一个assets目录 

        } 

    } 

   signingConfigs {//签名设置 

       debug { //debug对应的SB。注意 

           if(project.gradle.debugKeystore !=null){ 

               storeFilefile("file://${project.gradle.debugKeystore}") 

               storePassword"android" 

               keyAlias"androiddebugkey" 

               keyPassword"android" 

           } 

        } 

    } 

    /*

     最关键的内容来了: buildTypesScriptBlock.

     buildTypes和上面的signingConfigs,当我们在build.gradle中通过{}配置它的时候,

     其背后的所代表的对象是NamedDomainObjectContainer<BuildType>和

    NamedDomainObjectContainer<SigningConfig>

     注意,NamedDomainObjectContainer<BuildType/或者SigningConfig>是一种容器,

     容器的元素是BuildType或者SigningConfig。我们在debug{}要填充BuildType或者

    SigningConfig所包的元素,比如storePassword就是SigningConfig类的成员。而proguardFile等

    是BuildType的成员。

    那么,为什么要使用NamedDomainObjectContainer这种数据结构呢?因为往这种容器里

    添加元素可以采用这样的方法: 比如signingConfig为例

    signingConfig{//这是一个NamedDomainObjectContainer<SigningConfig>

       test1{//新建一个名为test1的SigningConfig元素,然后添加到容器里

         //在这个花括号中设置SigningConfig的成员变量的值

       }

      test2{//新建一个名为test2的SigningConfig元素,然后添加到容器里

         //在这个花括号中设置SigningConfig的成员变量的值

      }

    }

    在buildTypes中,Android默认为这几个NamedDomainObjectContainer添加了

    debug和release对应的对象。如果我们再添加别的名字的东西,那么gradleassemble的时候

    也会编译这个名字的apk出来。比如,我添加一个名为test的buildTypes,那么gradle assemble

    就会编译一个xxx-test-yy.apk。在此,test就好像debug、release一样。

   */ 

   buildTypes{ 

        debug{ //修改debug的signingConfig为signingConfig.debug配置 

           signingConfigsigningConfigs.debug 

        } 

        demo{ //demo版需要混淆 

           proguardFile'proguard-project.txt' 

           signingConfigsigningConfigs.debug 

        } 

       //release版没有设置,所以默认没有签名,没有混淆 

    } 

      ......//其他和posdevice 类似的处理。来看如何动态生成runtime_config文件 

   def runtime_config_file = 'assets/runtime_config' 

   /*

   我们在gradle解析完整个任务之后,找到对应的Task,然后在里边添加一个doFirstAction

   这样能确保编译开始的时候,我们就把runtime_config文件准备好了。

   注意,必须在afterEvaluate里边才能做,否则gradle没有建立完任务有向图,你是找不到

   什么preDebugBuild之类的任务的

   */ 

   project.afterEvaluate{ 

      //找到preDebugBuild任务,然后添加一个Action  

     tasks.getByName("preDebugBuild"){ 

           it.doFirst{ 

               println "generate debugconfiguration for ${project.name}" 

               def configFile = newFile(runtime_config_file) 

              configFile.withOutputStream{os-> 

                   os << I amDebug\n'  //往配置文件里写 I am Debug 

                } 

           } 

        } 

       //找到preReleaseBuild任务 

      tasks.getByName("preReleaseBuild"){ 

           it.doFirst{ 

               println "generate releaseconfiguration for ${project.name}" 

               def configFile = newFile(runtime_config_file) 

              configFile.withOutputStream{os-> 

                   os << I amrelease\n' 

               } 

           } 

        } 

       //找到preDemoBuild。这个任务明显是因为我们在buildType里添加了一个demo的元素 

      //所以Android APP插件自动为我们生成的 

       tasks.getByName("preDemoBuild"){ 

           it.doFirst{ 

               println "generateofflinedemo configuration for${project.name}" 

               def configFile = newFile(runtime_config_file) 

              configFile.withOutputStream{os-> 

                   os << I amDemo\n' 

               } 

            } 

        } 

    } 

 .....//copyOutput 

*

> gradle tasks --all查看所有任务

参考http://www.cnblogs.com/wxishang1991/p/5532006.html 此网页没事多看看。

gradle 原文 https://docs.gradle.org/current/dsl/# 里面讲了settings.gradle、build.gradle的各种元素、方法、写法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值