Android Gradle 使用技巧

总结一下gradle在项目中的一些使用技巧

  1. 全局的配置信息
    在project目录下创建一个config.gradle文件,将每个module相同的配置信息都可以在此文件中设置全局变量,例如:

    ext{ // gradle的全局属性必须放在ext闭包中
         android = [
             compileSdkVersion: 25,
             buildToolsVersion: "26.0.0",
             minSdkVersion    : 15,
             targetSdkVersion : 25,
             versionCode      : 1,
             versionName      : "1.0"
         ]
    
         dependencies = [
               appcompatV7      : 'com.android.support:appcompat-v7:25.+',
               constraintLayout : 'com.android.support.constraint:constraint-layout:1.0.2',
               junit            : 'junit:junit:4.12'
         ]
    }
    

然后需要在project目录下的build.gradle中通过apply from: 'config.gradle'引入全局属性文件config.gradle
在module中的build.gradle调用如下:

   dependencies { 
                compile rootProject.ext.dependencies.appcompatV7      
                compile rootProject.ext.dependencies.constraintLayout
                testCompile rootProject.ext.dependencies.junit
   }
  • 调用gradle.properties文件中变量
    类似签名信息不应该直接暴露在build.gradle文件中,将它保存在gradle.properties文件中是一种不错的做法。在gradle.properties中添加:

       STORE_FILE = /xx/app_key.jks   // 这边不能打引号
       STORE_PWD = xxx
       KEY_ALIAS = xxx
       KEY_PWD = xxx
    

在module中的build.gradle调用如下:

    signingConfigs {
        release {
               storeFile file(STORE_FILE)
               storePassword STORE_PWD
               keyAlias KEY_ALIAS
               keyPassword KEY_PWD
       }
  }

还可以将gradle.properties文件设置的变量供java文件以及`xml``文件调用,比如:

  buildTypes {
        release {
              minifyEnabled true
              shrinkResources true
              signingConfig signingConfigs.release
              proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
              buildConfigField("String", "STORE_PWD", "\"${STORE_PWD}\"") // 往release版本中BuildConfig里面设置值
              resValue("string", "KEY_PWD", "${KEY_PWD}") // 往release版本资源文件中设置值
        }
        debug {
                buildConfigField("String", "STORE_PWD", "\"${STORE_PWD}\"") // 往debug版本BuildConfig里面设置值
                resValue("string", "KEY_PWD", "${KEY_PWD}") // 往debug版本资源文件中设置值
        }
   }
   //  然后就可以在java代码中,通过BuildConfig.XXX进行调用;在layout_xml中直接可以通过android:text="@string/KEY_PWD"进行调用
   // 其中,buildConfigField定义的方式是
   // buildConfigField 类型,变量名,值
   // resValue定义的方式是
   // resValue XML中的类型,变量名,值
   // 对于类型的设置,buildConfigField必须跟java代码中是相同的,比如String 就不能写成string,因为是String 类型,值需要打上双引号;同样resValue也需要对应

实际开发中,debug版本和release版本的接口地址是不同,通过这种方式去设置,就不需要在每次打不同版本包的时候去注释代码了。

  • 调用local.properties文件中变量
    local.properties文件中一般存储着本地的sdk、ndk的路径信息,当然在此文件中同样可以配置变量,比如签名信息,只不过这是本地的,一般不用push到远程仓库中。
    local.properties文件中添加变量跟gradle.properties没区别,区别在于读取:

     Properties properties = new Properties();
     properties.load(new FileInputStream(file("../local.properties")))  // 需要显示指明文件路径
     // 并且当前路径是在app目录下,所以获取project目录下的`local.properties`,应该是../local.properties
     buildTypes {
      debug {
          buildConfigField("String", "URL", "\"${properties['URL']}\"")
          resValue("string", "url", "${properties['URL']}")
      }
    }
    

    其实也可以自定义properties文件,访问形式跟访问local.properties相同,只需要更改文件路径就好。

  • 替换AndroidManifest中的占位符
    可以在AndroidManifest文件中设置一个占位符,类似${app_label}

      <application
          android:name=".AppApplication"
          android:allowBackup="true"
          android:icon="@mipmap/ic_launcher"
          android:label="${app_label}"
          android:roundIcon="@mipmap/ic_launcher_round"
          android:supportsRtl="true"
          android:theme="@style/AppTheme">
          <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    

然后在module下的build.gradle文件中进行设置,可以设置在defaultConfig闭包中,也可以设置在buildTypes下不同版本的闭包中,设置在不同版本的闭包中,那么就可以实现为不同版本的app设置不同的名称了,app log 同样可以通过此种方式来进行配置:

// defaultConfig中设置           
defaultConfig { 
     // ... 省略其他配置
     manifestPlaceholders = [app_label:"@string/app_name"]
}

// buildTypes中设置
 buildTypes {
      release {
           // ... 省略其他配置
        manifestPlaceholders = [app_label:"@string/app_name_release"]
    }
    debug {
         // ... 省略其他配置
        manifestPlaceholders = [app_label:"@string/app_name_debug"]
    }
}

除了可以给不同版本app设置不同名称已经图片之外,还有一种重要的用法就是打渠道包。

 android {
   productFlavors {
    dev{
        manifestPlaceholders = [channel:"dev"]
     }
    official{
        manifestPlaceholders = [channel:"official"]
    }
    // ... ...
    wandoujia{
        manifestPlaceholders = [channel:"wandoujia"]
    }
    xiaomi{
        manifestPlaceholders = [channel:"xiaomi"]
    }
    "360"{  // flavor名如果是数字开头,必须用引号引起来。
        manifestPlaceholders = [channel:"360"]
    }
}
  • 自定义导出apk名称

     android {
         applicationVariants.all { variant ->
                variant.outputs.each { output ->
                   output.outputFile = new File(
                       output.outputFile.parent + "/${variant.buildType.name}",
                  "xx-${variant.buildType.name}-${variant.versionName}-${variant.productFlavors[0].name}.apk".toLowerCase())
                }
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 1.介绍 如果你正在查阅build.gradle文件的所有可选项,请点击这里进行查阅:DSL参考 1.1新构建系统...
    Chuckiefan阅读 12,115评论 8 72
  • 转载注明出处:http://www.jianshu.com/p/5255b100930e 0. 前言 完全由个人翻...
    王三的猫阿德阅读 2,501评论 0 4
  • 当你在开发一个app,通常你会有几个版本。大多数情况是你需要一个开发版本,用来测试app和弄清它的质量,然后还需要...
    雪残阅读 407评论 0 0
  • 这一章主要针对项目中可以用到的一些实用功能来介绍Android Gradle,比如如何隐藏我们的证书文件,降低风险...
    acc8226阅读 7,556评论 3 25