導航:首頁 > 源碼編譯 > gradlebuild編譯過程

gradlebuild編譯過程

發布時間:2023-08-29 13:27:52

android Studio開發解讀 - gradle編譯項目的build目錄結構

轉自:http://www.cnblogs.com/bbqzsl/p/5926591.html

本文針對android studio工具下的ndk開發。

build目錄就是項目模塊構建過程和結果使用到的位置。

項目根目錄下有一個build目錄。

項目根目錄下各模塊子目錄下各自有一個build目錄。

build目錄下一般由4個子目錄組成:

generated由aapt工具根據資源數據自動生成的java

intermediates中間過程

outputs輸出結果

tmp編譯日誌

根目錄下的build目錄,這個build服務於整個項目,在本文中稱其做項目build,以區分模塊build。

項目build一般只有generated和intermediates兩個子目錄,用於生成這個項目的buildTools。

generated目錄會生成一個mockable-android-${buildToolsVersion}.jar。

intermediates目錄根據需要生成dex-cache,這個目錄纖謹下的xml文件配置jar包在編譯過程中如何緩沖使用。

模塊build目錄在make mole ${MOD_NAME}後就會生成4個子目錄。

我們來看intermediates目錄,中間生成和編譯過程使用到的目錄。

這個目錄下有這么幾個比較關心的子目錄:

binaries                  NDK,生成c++連接庫

bundles                  模塊鏈接到的自定義毀櫻基jar包和各abi版本的c++鏈接庫都捆綁在這里

classes模塊中生成的自定義java類

exploded-aar          由aar包解壓出來的資源,jar包和so鏈接文件等。用於本模塊的鏈接和集成。

jniLibs                   在build.grade中你指定的jniLibs目錄整個拷貝。模塊鏈接到的庫文件會被捆到bundles目錄。

objectFiles              NDK,生成c++中間對象(.o)文件。

transforms              根據你當前選擇的proctFlavor和其包含的abiFilter,從bundles和binaries取出鏈接庫。

接著就是output目錄:

aar如果模塊是android library

jar                         如果模塊是java library

apk                        如果是Activity應用程序

最後就是tmp目錄:

compile$(NDK_Mole)$(ABI)$(BUILD_TYPE)$(PRODUCT_FLAVOR)MainCpp               ndk編譯日誌

link$(NDK_Mole)$(ABI)$(BUILD_TYPE)$(PRODUCT_FLAVOR)$(LIB_TYPE)                ndk鏈接日誌

編譯的子目錄由三要素組合頌磨而成,分別是

BUILD_TYPE := debug|release

ProctFlavor := 你在gradle文件中創建的flavor

abiFilter :=

逆向深入objc,c++ windows下仿objc動畫層UI引擎

❷ 如何 gradle build

1. 為什麼選擇Gradle?

2. 簡單入門
2.1 使用Intellij Idea創建gradle項目
首先在Idea中啟用Gradle支持:Settings->Plugins: Gradle
然後創建一個gradle項目或模塊,會發現目錄結構和maven的很像,其中build.gradle是gradle的配置文件,類似於maven中pom.xml文件,以下是build.gradle的簡單示例:
apply plugin: 'java'

group = 'org.yousharp'
version = '1.0-SNAPSHOT'

sourceCompatibility = 1.7
targetCompatibility = 1.7

repositories {
mavenCentral()
maven { url "repo.maven.apache.org/maven2" }
}
dependencies {
compile group: 'com.google.guava', name: 'guava', version:'17.0'
compile group: 'redis.clients', name: 'jedis', version:'2.6.0'
testCompile group: 'junit', name: 'junit', version:'4.11'
}

插件(plugin):是gradle的一種擴展,gradle預定義了很多插件,常見的如java插件、war插件等;java插件中定義了一些有用的task,如編譯源碼、執行單元測試、生成jar包、約定默認的目錄結構等; repositories定義倉庫,dependencies定義項目的依賴,比maven的XML定義更簡潔;
那麼,如何編譯、測試,以及運行gradle的項目呢?
剛才說到java插件預定義了很多task,其中就包括編譯、測試、生成jar包等task,可以在命令行通過 $ gradle tasks 查看項目已定義的所有task以及含義,如java插件中常用的task有:
+ assemble: 編譯
+ build:編譯並執行測試
+ clean:刪除build目錄
+ jar: 生成jar包
+ test:執行單元測試

2.2 將Java項目從maven遷移到gradle
如何將一個java項目從maven遷移到gradle呢?gradle集成了一個很方便的插件:Build Init Plugin,使用這個插件可以很方便地創建一個新的gradle項目,或者將其它類型的項目轉換為gradle項目。
要將maven項目轉換為gradle項目,只需要在項目的pom文件所在的目錄下執行以下命令:
$ gradle init --type pom

上面的命令會根據pom文件自動生成gradle項目所需的文件和配置,然後以gradle項目重新導入即可。

❸ minecraft我的世界gradle構建,總是失敗,求告訴詳細教程。不要發網址,要會的人。不會的

最近在項目中遇到一個不大,但是還蠻煩人的問題,在Maven的約定中,一個標准Java項目的代碼結構如下:
project
--src
--main
--java
--resources
--test
--java
--resources

當『gradle idea』構建intelliJ項目文件時,會自動幫忙設置好所有的Source Root,Test Source Root。但是,在我工作的部門中,我們希望可以把測試分為unit,intg2個類別,這樣可以更加容易區分測試的目的,同時提供了Build Pipeline分別運行不同類別測試的能力。因此,我們部門內的標准Java項目結構如下:
project
--src
--main
--java
--resources
--test
--common
--java
--unit
--java
--resources
--intg
--java
--resources

有了這個目錄結構之後我們剩下2個問題要解決:
1. 如何區分運行IntegrationTest和Unit Test
2. 如何保證『gradle idea』以後,無需重新設置Test Source Root。因為gradle不具備識別新的代碼結構的能力。

如何寫一個Gradle Plugin

語言:
Java,Groovy,Scala都可,推薦用Groovy,畢竟Gradle本質上來說就是一個用Groovy寫的DSL,使用Groovy可以更一致一點。

注入方式:
Gradle支持3種形式的定製Plugin注入:

1. 直接把Plugin源代碼直接寫在Build Script裡面。
2. 把Pluigin源代碼寫到rootProjectDir/buildSrc/src/main/groovy目錄下
3. 用一個單獨的project來寫Plugin源代碼,然後以jar依賴的形式注入項目。

個人覺得,都想到要自己寫一個Plugin了,那麼一定是有多個項目公用這個Plugin了,否則的話,直接把Plugin的代碼直接寫到腳本里就好了。因此,要定製Plugin,在我看來,一定是需要以一個單獨的jar形式注入的。

寫project-structure Plugin:
在Gradle中,寫一個Plugin非常簡單,首先,添加項目依賴,我使用Groovy來寫插件,所以添加了localGroovy依賴。

Gradle代碼
apply plugin: 'groovy'

dependencies {
compile gradleApi()
compile localGroovy()
}

然後寫Plugin的實現代碼,實現代碼只需要實現Plugin<Project>介面即可,在我的實現代碼中,做了兩件事,一是定製了項目的代碼結構,二是添加了integrationTest Task,該Task只運行*IntegrationTest.class, 這樣可以在Build Pipeline分階段運行Unit Test和IntegrationTest。

Groovy代碼
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.testing.Test

class ProjectStructurePlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.logger.info "Configuring Project Structure for $project.name"

project.configurations {
integrationTestCompile { extendsFrom testCompile }
integrationTestRuntime { extendsFrom integrationTestCompile, testRuntime }
}
configureSourceSets(project)
addIntegrationTestTask(project)
}

private void addIntegrationTestTask(Project project) {
Test intgTest = project.getTasks().create("integrationTest", Test.class);
intgTest.testClassesDir = project.sourceSets.integrationTest.output.classesDir
intgTest.includes = ["**/*IntegrationTest.class"]
intgTest.inputs.dir 'src'
intgTest.outputs.dir project.sourceSets.integrationTest.output.classesDir
project.check.dependsOn project.integrationTest
intgTest.dependsOn project.test
}

private void configureSourceSets(Project project) {
project.sourceSets {
test {
java {
srcDir 'src/test/unit/java'
srcDir 'src/test/common/java'
}
resources {
srcDir 'src/test/unit/resources'
}
}

integrationTest {
java {
srcDir 'src/test/intg/java'
srcDir 'src/test/common/java'
}
resources {
srcDir 'src/test/intg/resources'
}
compileClasspath = project.sourceSets.main.output + project.sourceSets.test.output + project.configurations.integrationTestCompile
runtimeClasspath = output + compileClasspath + project.configurations.integrationTestRuntime
}
}
}
}

接著,在項目的src/main/resources/META-INF/gradle-plugins目錄下,創建一個文件:<plugin-name>.properties,在該文件中指定Plugin的實現類:

Java代碼
implementation-class=com.xianlinbox.plugins.ProjectStructurePlugin

在項目中使用該Plugin
首先,需要在build.gradle腳本中引入該Plugin的jar包依賴,可以是以文件的形式,當然個人更推薦的是把jar包發布到Maven庫中,以Maven依賴的形式的注入,本例中使用的是本地文件依賴:

Groovy代碼
buildscript {
dependencies {
classpath fileTree(dir: 'libs', include: '*.jar')
}
}
然後,注入編寫的插件,注意,該插件必須和java plugin一起使用,因為其中使用到SourceSets屬性是從該插件中引入進來的:

Groovy代碼
apply plugin: 'java'
apply plugin: 'project-structure'

有了這個插件之後,就可以通過『gradle test』和『gradle integrationtTest』區別運行UnitTest和IntrgrationTest了。

最後,解決自動設置Test Source Root的問題,只需要在build.gradle為ideaMole Task增加識別Test Source Root的能力即可:

Groovy代碼
apply plugin: 'idea'
...
idea {
mole {
testSourceDirs += file('src/test/intg/java')
testSourceDirs += file('src/test/intg/resources')
}
}

當然,我們也可以把它寫到Plugin中去,在設置為Project-Structrue之後:

Groovy代碼
......
compileClasspath = project.sourceSets.main.output + project.sourceSets.test.output + project.configurations.integrationTestCompile
runtimeClasspath = output + compileClasspath + project.configurations.integrationTestRuntime
project.idea {
mole {
testSourceDirs = testSourceDirs + new File('src/test/intg/java') + new File('src/test/intg/resources')
}
}
1、安裝
Gradle安裝和Maven一樣方便,只需要,下載(http://www.gradle.org/downloads )==》解壓==》配置環境變數(GRADLE_HOME & PATH),配置好環境變數之後記得使用 source命令使新的環境變數生效。配置成功之後,可以在命令行通過 「gradle -v"驗證是否安裝成功。

2、Gradle編譯Maven風格的java項目
首先,在項目根目錄創建"build.gradle"文件,編譯java項目需要使用gradle的java插件
Groovy代碼
apply plugin: 'java'
,因為要集成maven的功能,需要添加maven插件
Groovy代碼
apply plugin: 'maven'[

接著,配置項目的Repository,風格如下
Groovy代碼
repositories{
mavenCentral();
}
,上面例子使用的是默認的maven的中央庫,如果想用自己的本地庫,可通過如下方式配置
Groovy代碼
def localMavenRepo = 'file://' + new File(System.getProperty('user.home'), '.m2/repository').absolutePath
repositories {
// Use local Maven repo location. We don't need this if we only want to install
// an artifact, but we do need it if we want to use dependencies from the local
// repository.
mavenRepo urls: localMavenRepo
mavenCentral()
}

再然後,配置項目依賴的第三方庫,配置模板如下:
Groovy代碼
dependencies{
compile group: '<group-id>',name:'<artifact-id>',version:'<version>'
}
,舉個例子,假設項目依賴了4.10版本的junit,那麼配置就是
Groovy代碼
compile group: 'junit',name:'junit',version:'4.10'
另外Depencies還可以按如下方式簡寫
Groovy代碼
compile '<group-id>:<artifact-id>:<version>'
例子
Groovy代碼
compile 'junit:junit:4.10'

最後,如何把自己的項目發布到Repository中,
Groovy代碼
uploadArchives {
repositories {
mavenDeployer {
repository(url: "file://localhost/tmp/myRepo/")
}
}

閱讀全文

與gradlebuild編譯過程相關的資料

熱點內容
路由器多種加密方法 瀏覽:604
程序員阻止電腦自動彈出定位 瀏覽:166
如何做伺服器服務商 瀏覽:759
su剖切命令 瀏覽:726
devc編譯背景 瀏覽:209
學習單片機的意義 瀏覽:49
音頻演算法AEC 瀏覽:909
加密貨幣容易被盜 瀏覽:82
蘋果平板如何開啟隱私單個app 瀏覽:704
空調壓縮機一開就停止 瀏覽:528
如何下載虎牙app 瀏覽:847
日語年號的演算法 瀏覽:955
dev裡面的編譯日誌咋調出來 瀏覽:298
php函數引用返回 瀏覽:816
文件夾和文件夾的創建 瀏覽:259
香港加密貨幣牌照 瀏覽:838
程序員鼓勵自己的代碼 瀏覽:393
計算機網路原理pdf 瀏覽:752
吃雞國際體驗服為什麼伺服器繁忙 瀏覽:94
php中sleep 瀏覽:491