日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Gradle 入门

發(fā)布時(shí)間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Gradle 入门 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Gradle 入門

轉(zhuǎn)載請(qǐng)標(biāo)明出處:
http://blog.csdn.net/lisdye2/article/details/52173213
本文出自:【Alex_MaHao的博客】
項(xiàng)目中的源碼已經(jīng)共享到github,有需要者請(qǐng)移步【Alex_MaHao的github】

什么是Gradle

公司最近要進(jìn)行版本迭代。最終決定將IDE 從Eclipse轉(zhuǎn)到了Android Studio。 以前自己的一些demo也是通過android Studio 來實(shí)現(xiàn)。但畢竟真正的轉(zhuǎn)到AS ,一些必要的東西還是需要去掌握的。

轉(zhuǎn)到AS,第一個(gè)問題便是多渠道打包,分包架構(gòu)怎么辦。看我之前的博客關(guān)于熱修復(fù)等的,需要用到Ant,那么在Android Studio中能夠使用Ant 呢。關(guān)于這個(gè)我也不清楚。。。。。

AS 中引入了Gradle工具,完成App的編譯工作。那么什么是Gradle呢。

Gradle和Ant類似,也是一種自動(dòng)化腳本編譯語言。能夠?qū)崿F(xiàn)Android app從源碼到打包生成最終apk 的過程。

通過Gradle 我們能實(shí)現(xiàn)多渠道打包,自動(dòng)簽名,MultiDex等方便我們開發(fā)的一些自動(dòng)腳本。

在研究這個(gè)東西時(shí),走了很多彎路,網(wǎng)上的教程大部分都是從原理說起。

比如:Gradle是一個(gè)由Groovy編寫的腳本語言。介紹Groovy語言是什么,哦,Groovy是基于Java的擴(kuò)展性動(dòng)態(tài)語言。開始學(xué)Groovy,然后學(xué)了半天,還是一知半解。本篇博客不介紹原理,只介紹如何使用它。先學(xué)會(huì)用,在慢慢的分析,最后到精通。

AS工程目錄結(jié)構(gòu)

通過AS 創(chuàng)建工程時(shí),系統(tǒng)會(huì)自動(dòng)創(chuàng)建一些文件,下面一張圖介紹了這些文件的作用。

漏了一點(diǎn),補(bǔ)上。。。

從工程目錄可以看到,涉及到Gradle編譯腳本有很多,但我們只需要修改關(guān)注的有以下幾個(gè)文件

工程根目錄下的:

  • settings.gradle
  • build.gradle

每一個(gè)module下:

  • build.gradle

自動(dòng)生成的Gradle腳本解析

settings.gradle

配置哪些module需要加入編譯,例如我新創(chuàng)建的工程,存在一個(gè)基礎(chǔ)的app module和一個(gè)lib(依賴庫),那么它的內(nèi)容為

include ':app', ':lib'

build.gradle

在創(chuàng)建工程時(shí),會(huì)默認(rèn)在工程的根目錄下創(chuàng)建一個(gè)build.gradle,該build.gradle向所有的module提供默認(rèn)的Gradle 編譯配置,作為公有的配置向每一個(gè)module下的build.gradle提供默認(rèn)配置。

// buildscript 屬于一個(gè)script block 。 他的目的是為了配置Gradle編譯所需要的依賴, // 此依賴指的不是我們apk運(yùn)行所需要的依賴、 buildscript {// 添加遠(yuǎn)程倉庫repositories {// // 聲明遠(yuǎn)程倉庫的源// 之前版本則是mavenCentral(), jcenter可以理解成是一個(gè)新的中央遠(yuǎn)程倉庫,兼容maven中心倉庫,而且性能更優(yōu)jcenter()}// 添加依賴,此依賴從遠(yuǎn)程倉庫中查找dependencies {classpath 'com.android.tools.build:gradle:2.1.0'} }// 面向所有工程提供的依賴,在此只聲明了遠(yuǎn)程倉庫的地址 allprojects {// 添加遠(yuǎn)程倉庫repositories {jcenter()} }// 刪除本地的gradle,重新下載 task clean(type: Delete) {delete rootProject.buildDir }

從代碼格式上可以看出:xxx{}的形式,學(xué)名script block。我們把它當(dāng)做代碼塊就可以了,不過每個(gè)代碼塊有固定的意義。

根目錄下的build.gradle自上向下可以分為三個(gè)部分:

  • 針對(duì)Gradle編譯所提供的依賴支持。
    • 使用buildscript作為聲明:該中的配置是為了編譯時(shí)期為我們的gradle提供相關(guān)的庫支持
  • 針對(duì)我們的apk所提供的依賴支持。
    • 從代碼可以看出,只是提供了遠(yuǎn)程倉庫的聲明,是因?yàn)獒槍?duì)于每一個(gè)module,他們依賴的jar包都不相同,所以由他們module下的build.gradle聲明相應(yīng)的依賴。
  • 重新下載gradle插件。此方法不會(huì)調(diào)用,當(dāng)然可以鼠標(biāo)放在代碼處,右鍵run。我試了一下。把我的gradle刪除了又重新下載了。沒有翻墻的不要run。。。

module下的build.gradle

直接上代碼

/*** /*** The first line in the build configuration applies the Android plugin for* Gradle to this build and makes the android {} block available to specify* Android-specific build options.** 應(yīng)用一個(gè)用于構(gòu)建當(dāng)前工程的插件,** apply plugin: 'com.android.application'* 提供了一個(gè)android標(biāo)簽 block,能夠解析android 中的一些屬性*/ apply plugin: 'com.android.application'android {// 編譯時(shí)期使用的sdk版本compileSdkVersion 23// 編譯工具版本buildToolsVersion "23.0.3"// 默認(rèn)的配置defaultConfig {// pplicationId 是一個(gè)為了發(fā)布而定義獨(dú)特的標(biāo)識(shí)符,一般和包名一致。當(dāng)然可以不一致applicationId "com.alex.gradleproject"// 最小sdkminSdkVersion 15// 此標(biāo)示和compileSdkVersion,他指定的是運(yùn)行時(shí)的sdktargetSdkVersion 23// 代碼版本versionCode 1// app版本versionName "1.0"}/*** 配置多樣的構(gòu)建類型,構(gòu)建系統(tǒng)默認(rèn)的有兩種類型:debug 和 relsase* debug 類型不會(huì)顯示的展示在buildType 中但是他已經(jīng)包含了debug 工具和完成相應(yīng)的簽名** release 默認(rèn)顯示,且添加了混淆的配置,但是簽名相關(guān)的并沒有被默認(rèn)配置**/buildTypes {// 是否運(yùn)行混淆release {// 改為true ,表示開啟混淆minifyEnabled false// 混淆的文件地址proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}} }// 依賴 dependencies {// module下的libs 文件夾下的jar文件compile fileTree(dir: 'libs', include: ['*.jar'])// 測(cè)試需要用的jar,不會(huì)打包到apk中testCompile 'junit:junit:4.12'// 打包到apk中的jarcompile 'com.android.support:appcompat-v7:23.4.0'// lib依賴工程compile project(':lib') }

這么詳細(xì)的注釋,真心良心啊。

此版本中需要注意兩點(diǎn)

  • compileSdkVersion和targetSdkVersion兩個(gè)定義的區(qū)別:

    • compileSdkVersion:編譯時(shí)依賴的sdk,例如我指定為23,那么編譯時(shí)將以此sdk作為參考,那些類沒有,或者過時(shí)不可用等。
    • targetSdkVersion:該版本指定的是運(yùn)行時(shí),使用哪個(gè)版本的sdk。23版本android加入了運(yùn)行時(shí)權(quán)限,但我們的app沒有做相關(guān)的處理,則可以指定sdk為23以下,那么就不會(huì)有運(yùn)行時(shí)權(quán)限的相關(guān)東西了。
  • dependencies{}:在工程根目錄下的build.gradle中,只是聲明了工程的遠(yuǎn)程倉庫。而此處便是聲明該module下所依賴的相關(guān)jar。此時(shí)的相關(guān)jar會(huì)從jcenter()中進(jìn)行查找下載。

自動(dòng)簽名

1,生成簽名文件,并將文件放入到module根目錄下,創(chuàng)建key文件夾,放入其中

2,添加簽名信息的配置,在module下的build.gradle文件中

android {// ....signingConfigs{config_release{keyAlias 'alex'keyPassword '111111'storePassword '123456'storeFile file('key/key.jks')}}//.....}

3,將簽名的信息添加到buildTypes的release的block中

buildTypes {// 是否運(yùn)行混淆release {// 改為true ,表示開啟混淆minifyEnabled false// 混淆的文件地址proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'// 添加簽名信息signingConfig signingConfigs.config_release}}

如果我們修改了gradle文件,會(huì)提示sync Now 的提示。必須刷新

4,通過gradle工具編譯apk

在AS 的右側(cè)邊欄中存在一個(gè)Gradle,點(diǎn)擊里面就是對(duì)應(yīng)的Gradle對(duì)象。這個(gè)不能細(xì)說。。。找到:app/tasks/build/assembleRelease,雙擊運(yùn)行。

5,獲取簽過名的apk文件

具體目錄在GradleProject\app\build\outputs\apk中

Gradle 多渠道打包

多渠道打包,一些大公司可能會(huì)自己進(jìn)行統(tǒng)計(jì),而大部分的可能使用的是友盟統(tǒng)計(jì),那么就按照友盟統(tǒng)計(jì)的例子進(jìn)行實(shí)現(xiàn)。

1,清單文件中添加友盟的聲明

<!--這里可以添加更多的配置,gradle構(gòu)建時(shí)動(dòng)態(tài)變量${CHANNEL_VALUE}為渠道信息--><meta-data android:name="UMENG_CHANNEL" android:value="${CHANNEL_VALUE}" />

${}標(biāo)示中添一個(gè)變量,獲取這個(gè)變量的值 。${CHANNEL_VALUE} == CHANNEL_VALUE

Gradle在編譯時(shí),會(huì)將.gradle和清單文件進(jìn)行合并編譯,那么在.gradle中定義一個(gè)CHANNEL_VALUE就實(shí)現(xiàn)了不同值得替換。

2,編寫渠道列表的配置文件,在app的根目錄下 channel.properties

#默認(rèn)渠道 channel.default=paojiao #全部渠道列表 channel.list=baidu,360,hiapk

#號(hào)代表注釋。

3,編寫多渠道打包的腳本channel.gradle

apply plugin: 'com.android.application'/*** gradle 的基礎(chǔ)是Groovy,Groovy是基于Java的,所以java代碼在這里都可以使用** 該文件可以通過一定的方式和app下的build.gradle進(jìn)行合并*/ // 生成配置對(duì)象 Properties properties = new Properties(); // 加載配置文件 properties.load(new FileInputStream(project.rootDir.getAbsolutePath()+"/app/channel.properties")) // 獲取默認(rèn)的配置渠道包 String defau = properties.getProperty('channel.default') // 獲取渠道列表 String channel = properties.get('channel.list') // 將渠道列表進(jìn)行分割成數(shù)組,獲取相應(yīng)的渠道包 String[] channelList = channel.split(',')// 下面的代碼會(huì)默認(rèn)加入到app 下的build.gradle中 android{/*** 為了獲得不同的App 版本 ,能夠設(shè)置一些信息,覆蓋defaultConfig{}的一些配置信息** 該block 不是可選項(xiàng),系統(tǒng)不會(huì)默認(rèn)創(chuàng)建他** 打不通包時(shí),如果有重復(fù)的,優(yōu)先級(jí)如下 ,相同名字下* build variant > build type > product flavor > main source set > library dependencies*/productFlavors{// 循環(huán)遍歷渠道包for(String c : channelList){// 引用變量 此時(shí) ${c} = c的具體字符串"${c}"{// 聲明了一個(gè)變量 類似于鍵值對(duì) key = CHANNEL_VALUE value = channel的值manifestPlaceholders = [CHANNEL_VALUE: c]}}}}

4,將編寫的渠道腳本加入到app下的build.gradle中

apply plugin: 'com.android.application'// 引入channel.gradle apply from:'channel.gradle'

5,在右側(cè)的Gradle工具欄中運(yùn)行g(shù)radle腳本

具體運(yùn)行為app/tasks/build/assembleRelease,雙擊運(yùn)行。

6,獲取渠道包

生成的apk的具體目錄GradleProject\app\build\outputs\apk中

總結(jié)

以上是生活随笔為你收集整理的Gradle 入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。