Gradle细节详解及多渠道打包

一些感悟吧

 从2015年的七月份开始接触Android刚好有两年时间了。两年时间很长也很短暂。技术是不断更新的,程序员的我们也应该跟着不停的学习,不然很快就会被淘汰吧。很久没更新博客了,主要还是工作忙,996的节奏工作也吃不消。周末抽点时间把Gradle这一块的知识点做一个总结吧。

Gradle使用详解

1.gradle构建系统的目标

  • 让重用资源变得更加容易
  • 让创建同一应用程序的不同版本变得更加容易,无论是多个apk发布版本还是同一个应用的不同定制版本。
  • 让构建过程变得更加容易配置,扩展和定制。

2.几个有用的Gradle命令
- ./gradlew -v 版本号
- ./gradlew clean 清除app/目录下的build文件夹
- ./gradlew check 检查依赖
- ./gradlew build 检查依赖并编译打包,把debug,release环境的包都打出来
- ./gradlew assembleDebug 编译并打Debug包
- ./gradlew assembleRelease 编译并打Release的包
- ./gradlew –stop 停止编译

3.gradle文件细节详解

(1)主工程的build.gradle文件

  buildscript {
     repositories {
       jcenter()
     }
     dependencies {
       classpath 'com.android.tools.build:gradle:1.3.0'
     }
  }

  allprojects {
     repositories {
       jcenter()//引入远程仓库
       maven{url MAVEN_URL}//引入自己的私有maven仓库
     }
  }
  project.ext.set("android_support_version", "25.3.1")
  project.ext.set("junit_version", "4.12")
  project.ext.set("compileSdkVersion", "25")
  project.ext.set("buildToolsVersion", "25.0.2")

(2)gradle.properties(全局配置文件)
#后台进程构建
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx1536m
org.gradle.parallel=true

#私有maven仓库地址
MAVEN_URL= http://xxx.xx.1.147:8081/nexus/content/repositories/thirdparty/

COMPILE_SDK_VERSION=25
BUILD_TOOLS_VERSION=25.0.2
MIN_SDK_VERSION=15
TARGET_SDK_VERSION=23
ANDROID_SUPPORT_VERSION=25.3.1


VERSION_CODE=31405
VERSION_NAME=3.1.4.05

(3)app/build.gradle(module)

//声明该项目代表一个Android项目,而且一个Android项目只有一句这个声明
//如果是moudle需要声明是为 apply plugin:'com.android.library' 
apply plugin: 'com.android.application'
//声明是要使用谷歌服务框架  
apply plugin: 'com.google.gms.google-services'  

allprojects {
   repositories {
      jcenter()
   }
}
repositories {
   flatDir {
       //引入某library下的aar文件
       dirs project(':network_api').file('aars')
    }
   maven { url 'https://maven.fabric.io/public' }
   mavenCentral()
}

//android节点:项目的配置方法
android {
  //编译SDK的版本,纯粹是编译时使用,不会改变运行时的行为
  compileSdkVersion Integer.parseInt(project.COMPILE_SDK_VERSION)
  //构建工具的版本,比如打包工具aapt等
  buildToolsVersion project.BUILD_TOOLS_VERSION

  //关闭Android Studio的PNG合法性检查的  
  aaptOptions.cruncherEnabled = false  
  aaptOptions.useNewCruncher = false  

  //默认的配置
  defaultConfig {
     applicationId "com.webull.liujian.webull_tv_show"
     //程序可以运行的最低版本
     minSdkVersion project.MIN_SDK_VERSION
     //>=23需要做6.0权限适配
     targetSdkVersion project.TARGET_SDK_VERSION
     versionCode Integer.parseInt(project.VERSION_CODE)
     versionName project.VERSION_NAME
     //当方法超过65535的时候允许dex分包
     multiDexEnabled true
     //Android Test
     testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
     //多语言
     resConfigs "en", "zh-rCN", "zh-rTW", "de", "fr", "hi"
  }

  //签名文件配置,直接可以./gradlew assembleRelease命令生成release包 
  signingConfigs{
     debug{
       // No config
     }
     release{
         storeFile file("../tv.keystore.jks")
         storePassword "liujian"
         keyAlias "liujian"
         keyPassword "liujian"
     }
  }

  //默认情况下,Android Plugin会自动给项目设置同时构建应用程序的debug和release版本。
 //两个版本之间的不同主要围绕着能否在一个安全设备上调试,以及APK如何签名。
 //buildTypes可以定制debug和release实例 
  buildTypes {
    debug{
        //debug版本的包名设置为.debug以便能够同时在一台设备上安装debug和release版本的apk。
        applicationIdSuffix ".debug"
        //显示log
        buildConfigField "boolean","LOG_DEBUG","true"
        //版本名字后面加上后缀名
        versionNameSuffix "-debug"
        minifyEnabled false
        zipAlignEnabled false
        shrinkResources false
        signingConfig signingConfigs.debug
    }

    release {
        //buildConfigField第一个参数为类型,第二个参数为字段名,第三个参数为值
        //代码中通过BuildConfig.LOG_DEBUG获取设置的值
        buildConfigField "boolean","LOG_DEBUG","false"
        zipAlignEnabled true  //zipAlign优化
        shrinkResources true  //移除无用的资源文件
        minifyEnabled true  //开启混淆
        //自定义的混淆文件 proguard-rules.pro
        proguardFiles 'proguard.cfg'
        signingConfig signingConfigs.release
    }
  }

  //为同一个应用创建不同的版本,比如一个国内版本,一个国外版
  productFlavors {
    home {
        manifestPlaceholders = [ CHANNEL:”0"]
        minSdkVersion 21
    }
    abroad {
        manifestPlaceholders = [ CHANNEL:”1"]
        minSdkVersion 14
    }
  }

  //默认的项目结构不适应时,配置项目结构
  sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src']
        resources.srcDirs = ['src']
        aidl.srcDirs = ['src']
        renderscript.srcDirs = ['src']
        //如果创建文件theme用于存放主题相关的color或者style,添加res/theme   
        res.srcDirs = ['res','res/theme',]
        assets.srcDirs = ['assets']
        //在src下面创建jniLibs文件夹,存放so文件
        jniLibs.srcDirs = ['libs']
    }
    //表示单元测试的代码在tests目录下(src并列的目录)
    instrumentTest.setRoot('tests')
    androidTest.setRoot('tests')
    //设置编译内容
    debug.setRoot('build-types/debug')
    release.setRoot('build-types/release')
  }

  lintOptions{
     //build release 版本 时 开启lint 检测
     checkReleaseBuilds true
     //lint时遇到error时继续构建
     abortOnError false
  } 

  //multiDex的一些相关配置,这样配置可以让你的编译速度更快
  dexOptions {
     preDexLibraries = false
     //让它不要对Lib做preDexing
     incremental true
     //开启incremental dexing,优化编译效率,这个功能android studio默认是关闭的。
     javaMaxHeapSize "4g"     //增加java堆内存大小,避免导致编译时出现OOM异常
 }
}

dependencies {
   def android_support_version = project.ANDROID_SUPPORT_VERSION
   //一次性引入所有libs下的所有jar文件 
   compile fileTree(include: ['*.jar'], dir: 'libs')
   //引用库项目
   compile project(':network_api')
   compile "com.android.support:appcompat-v7:$android_support_version"
   compile "com.android.support:gridlayout-v7:$android_support_version"
   compile "com.android.support:recyclerview-v7:$android_support_version"
   compile "com.android.support:design:$android_support_version"
   compile 'io.reactivex:rxandroid:1.2.1'
   compile 'com.squareup.retrofit2:retrofit:2.1.0'
   compile 'com.squareup.retrofit2:converter-gson:2.0.0'
   compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'
   compile 'com.android.support:appcompat-v7:24.0.0'
   compile project(':MPChartLib')
   compile 'com.github.PhilJay:MPAndroidChart-Realm:v1.1.0@aar'
   compile(name:'camerascan-1.0', ext:'aar')
 }
多渠道打包:

gradle文件中定制productFlavors:

//为同一个应用创建不同的版本,比如一个国内版本,一个国外版
  productFlavors {
    home {
      manifestPlaceholders = [ CHANNEL:”0"]
      minSdkVersion 21
   }
   abroad {
      manifestPlaceholders = [ CHANNEL:”1"]
      minSdkVersion 14
   }
 }

AndroidManifest.xml :

   <!-- 自用渠道号设置 -->
   <meta-data
         android:name="CHANNEL"
         android:value="${CHANNEL}”/> 

  gradle编译的时候,会根据这个配置,把manifest里对应的meta-data占位符替换成指定的值。然后Android这边在运行期再去取出来就是:

public static String getChannel(Context context) {
   String channel = "";
   PackageManager pm = sContext.getPackageManager();
   try {
    ApplicationInfo ai = pm.getApplicationInfo(
    context.getPackageName(),
    PackageManager.GET_META_DATA);
    String value = ai.metaData.getString("CHANNEL");
    if (value != null) {
      channel = value;
    }
    } catch (Exception e) {
      // 忽略找不到包信息的异常
}
return channel;
}  

这种多渠道打包方式优点是方便简单,缺点是耗时

Aar文件 ##

(0)aar文件的作用
aar相较于jar包的优点:
包含资源文件
无需重新编译,加快编译速度

(1)生成aar文件
Moudule在项目编译后会自动生成aar包,包的路径在Moudule->build->outputs->aar目录
(2)使用
①将aar包复制到libs目录下
②配置build.gradle文件
  repositories{
flatDir{
dirs ‘libs’
}
}

     dependencies{
       compile(name:'camerascan-1.0', ext:'aar')
     } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值