gradle編譯打包
『壹』 Shell腳本自動編譯打包Gradle項目並docker部署
需要用到2個文件,項目的build.gradle文件和自動化shell腳本(這里我們命名為auto.sh)
一、修改build.gradle文件
新增task配置節,注意build.gradle和Dockerfile在同一目錄下
二、新增auto.sh
這幾天工作上遇到一個問題,三方的jar包在liunx下解壓不了,用gradle又能正常編譯,我們的apk是在liunx下用mk進行編譯的,編譯的過程中需要對jar包進行解壓,這樣就導致編譯失敗。
錯誤信息如下:以後再遇到這個錯誤,可能就jar包的問題。
FAILED: /bin/bash -c "(mkdir -p out/target/common/obj/java_LIBRARIES/xxx-sdk_intermediates/classes.jack.tmpjill.res ) && (unzip -qo /home/x/xx/xxx/APK92_GNBJ_EDO/code/libs/xxx-sdk-java20171027120314.jar -d out/target/common/obj/JAVA_LIBRARIES/xxx-sdk_intermediates/classes.jack.tmpjill.res ) && (find out/target/common/obj/JAVA_LIBRARIES/xxx-sdk_intermediates/classes.jack.tmpjill.res -iname \"*.class\" -delete ) && (JACK_VERSION=3.36.CANDIDATE out/host/linux-x86/bin/jack @build/core/jack-default.args --verbose error -D jack.import.resource.policy=keep-first -D jack.import.type.policy=keep-first -D jack.android.min-api-level=1 --import /home/x/xx/xxx/APK92_GNBJ_EDO/code/libs/xxx-sdk-java20171027120314.jar --import-resource out/target/common/obj/JAVA_LIBRARIES/xxx-sdk_intermediates/classes.jack.tmpjill.res --output-jack out/target/common/obj/JAVA_LIBRARIES/xxx-sdk_intermediates/classes.jack ) && (rm -rf out/target/common/obj/JAVA_LIBRARIES/xxx-sdk_intermediates/classes.jack.tmpjill.res )" warning: stripped absolute path spec from / mapname: conversion of failed ninja: build stopped: subcommand failed. build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed
解決方法:對jar包源碼重新打包
解壓jar包源碼,注意,是帶源碼的jar包,如果是編譯過的jar,是不能重新打包的。
步驟:
1.新建build.gradle文件,因為gradle會默認找到當前目錄下的build.gradle下的文件去執行;
2.在終端執行gradle unzip,執行這個task
以下命令將這個目錄 app/libs/xxx-sdk-java20171027120314.jar 下的jar包解壓到了 unpacked/dist 目錄。
解壓之後的源碼就是文件夾,重新打包的時候需要注意,包名和源碼的路徑名一致。現在利用Android studio進行打包。
步驟:
1.新建lib mole,選擇Android Libeary/Java Library;
2.注意修改包名與jar包路徑相同,eg:jar包解壓之後的路徑 dist/com/example/api ,那麼為了確保新生成的jar包里的Java文件import路徑相同,mole的包名也要命名為 com.example.api ;
3.將解壓之後的源碼java文件復制到lib model中;
4.在 app mole 下添加 lib mole 依賴。這是一種取巧的方法,當你添加了lib mole依賴之後,項目會重新rebuild,這個過程會將mole依賴編譯成jar包,存放在lib mole的 build/libs 目錄下,由於Android Studio版本不同,這個目錄可能有有所不同,但是都在build目錄下,找新的jar包就可以了。
這一部可能會報jar包找不到,或者lib mole中的import失敗,可能是因為lib mole依賴的jar包沒導入,導入之後在lib mole的build.gradle里配置一下就可以了。
這個時候,其實直接用這個jar包也可以了,如果向修改jar包名字,可以執行下面的gradle命令:
想了解更多可以參考 這里
然後在項目里測試一下jar包就可以了。
重新打包之後就可以在liunx下解壓了,正常編譯通過。
最後記錄一下mk編譯的一個錯誤 # [ERROR: Dex writing phase: classes.dex has too many IDs. Try using multi-dex](https://stackoverflow.com/questions/45472852/error-dex-writing-phase-classes-dex-has-too-many-ids-try-using-multi-dex) 在stackoverflow上找到了解決方法。
在mk文件中添加
參考:
https://stackoverflow.com/questions/39457116/gradle-build-hanging-when-jackoptions-is-enabled-for-java-1-8
https://stackoverflow.com/questions/45472852/error-dex-writing-phase-classes-dex-has-too-many-ids-try-using-multi-dex
『叄』 Gradle編譯-APK編譯過程
在早期的Android設備中(Android5.0以下)都是使用的Dalvik虛擬機,Dalvik支持經過轉換的.dex文件。.dex格式是專為Dalvik設計的一種適合內存和處理器速度有限的系統。
但是在Android5.0,google用ART全面取代的Dalvik。Android7.0中又添加了JIT編譯器,使得Android性能也有不少提升。
上圖為從Android源文件開始,最終到APK的過程。
下面博客文章詳細介紹了dalvik虛擬機,可供參考學習。
https://www.cnblogs.com/lao-liang/p/5111399.html
dvm(art)和jvm屬於不同的虛擬機平台,不同平台要求執行的文件類型也就不一樣
dvm(art)--.dex文件
jvm--.class文件
在編譯和生成上
java source --.class文件 ---jvm執行
java source --.class文件 ---.dex文件 --- dvm執行
Android Runtime (ART) 是 Android 上的應用和部分系統服務使用的託管式運行時。ART 及其前身 Dalvik 最初是專為 Android 項目打造的。作為運行時的 ART 可執行 Dalvik 可執行文件並遵循 Dex 位元組碼規范。
ART 和 Dalvik 是運行 Dex 位元組碼的兼容運行時,因此針對 Dalvik 開發的應用也能在 ART 環境中運作。不過,Dalvik 採用的一些技術並不適用於 ART。
ART的功能
1.預先 (AOT) 編譯
使用ART編譯器時,應用程序在安裝期間就已經把dex位元組碼翻譯並存儲在設備上,運行時,只需要執行這些翻譯好的就可以了,因此執行速度也快了不少。
2.垃圾回收方面的優化
3.開發和調試方面的優化
構建流程涉及許多將項目轉換成 Android 應用軟體包 (APK) 的工具和流程。構建流程非常靈活,因此了解它的一些底層工作原理會很有幫助。
『肆』 gradle是什麼呢
Gradle是一個構建工具。它是用來幫助我們構建app的,構建包括編譯、打包等過程。我們可以為Gradle指定構建規則,然後它就會根據我們的命令自動為我們構建app。AndroidStudio中默認就使用Gradle來完成應用的構建。有些同學可能會有疑問:」我用AS不記得給Gradle指定過什麼構建規則呀,最後不還是能搞出來個apk。

gradle構建工具多項目管理
實際使用中,往往需要管理的都不是單單一個項目,maven使用依賴,繼承,組成的概念,在父模塊指定自己的子模塊,並且准備一些各個子模塊公用的資源,配置信息等等。將打包的模塊與實現具體功能的模塊分開的做法來管理多個項目。Gradle在這一方面做得更加清楚。
『伍』 Gradle--多環境編譯打包
前段時間產品經理提了個需求,測試環境,預發布環境,生產環境編譯下的app需要在同一步手機同時存在,實現是可以的,但是得有三個環境下的不同applicationId,網路地圖key,域名,桌面logo,剛開始是想需要什麼環境就換什麼類型,很麻煩,每次都要換一次重新編譯,我就在想有什麼便捷的方法一鍵設置更換,gradle其中的Flavors功能可以實現我想要的。
這個是主項目中build.gradle中的配置,有三個環境我命名為 xiaoming_test,xiaoming_ready,xiaoming_proct,並有不同的applicationId,BAIDU_MAP_KEY,HTTP_HEAD,HTTP_HEAD_JAVA,app_icon,(解釋一下,有兩條域名是因為後面後台是用java開發而做的區分),到這里應該大家有疑問,舉個栗子,我們一般開發的第三方key是在mainifests進行注冊申請的,而我們gradle如何去引用資源的。這里有兩種引用方式,直接引用,自定義引用。
引用logo在application的icon屬性命名為app_icon,$表示引用這個命名,對應的是gradle的配置。
在mainifests自定義為HTTP_HEAD,value值通過${HTTP_HEAD}引用,getHttpHead()獲取自定義注冊的域名值。從而實現每次請求對應的域名,只需在gradle里設置。
只需打開studio的BuildVariarts設置,選擇需要的環境即可重新編譯不同的apk,方便快捷的做到一鍵設置快速打包。
『陸』 Gradle 命令
gradle -v //版本號
gradle clean //清除build文件夾
gradle build //檢查依賴並打包
gradle assembleDebug //編譯打包Debug包
gradle assembleRelease //編譯打包Release包
gradle installRelease //打包並安裝Release包
gradle unstallRelease //卸載Release包
gradle dependencies //查看依賴圖表
gradle clean build -x test //跳過測試編譯
gradle --profile build //分析構建任務
gradle build --dry-run //編譯並不執行任務
gradle install //安置項目jar包到本地Maven倉庫
gradle tasks //查看Gradle任務
gradle tasks --all //查看所有Gradle任務
gradle build --daemon //使用Gradle守護程序(Daemon)
gradle build --offline //用離線模式運行
gradle clean build --refresh-dependencies //刷新Gradle依賴緩存
『柒』 如何使用gradle構建工具打包groovy腳本成jar文件
准備工作安裝 gradle, groovy。
要使用gradle的groovy plugin 來打包groovy 腳本,項目結構。
目錄 含義
src/main/java Java 代碼
src/main/resources Java需要的資源文件
src/main/groovy Groovy代碼,也可以包含Java代碼
src/test/java Java 測試代碼
src/test/resources 測試需要的資源文件
src/test/groovy Groovy測試需要的資源文件
src/sourceSet/java Java代碼源
src/sourceSet/resources 資源文件源
src/sourceSet/groovy Groovy代碼源
我們只需要編譯打包groovy腳本 所以只需要創建 src/main/groovy目錄結構。例子:
gradle_groovy_archive項目 結構是:
gradle_groovy_archive
創建helloWorld.groovy腳本,代碼如下:
package hello
println 'Gradle compile groovy'
創建Gradle構建文件:
apply plugin: 'groovy'
apply plugin: 'maven'
group = 'com.hello'
archiveBaseName = 'hello'
version = '0.1-SNAPSHOT'
defaultTasks 'clean', 'jar'
configurations {
deployerJars
}
repositories {
mavenCentral()
}
dependencies {
//使用本地groovy環境
groovy localGroovy()
//groovy group: 'org.codehaus.groovy', name: 'groovy', version: '1.8.6'
compile fileTree( dir: 'lib', include: ['*.jar'])
deployerJars 'org.apache.maven.wagon:wagon-webdav-jackrabbit:1.0-beta-7'
}
sourceSets {
main {
groovy {
srcDir 'src/main/groovy'
}
}
}
uploadArchives {
repositories.mavenDeployer {
uniqueVersion = false
configuration = configurations.deployerJars
repository(id : repositoryId, url : repositoryUrl) {
authentication (userName : 'deployment', password : 'deployment')
proxy()
}
}
}
創建構建文件屬性文件:
//根據不同情況修改
repositoryId=ND
repositoryUrl=ND
systemProp.http.proxyHost=ND
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=ND
systemProp.http.proxyPassword=ND
在命令行中 敲 gradle 運行,會自動運行 defaultTasks,clean 和 jar,會把 所有groovy下的腳本打成jar包。
『捌』 Gradle如何只編譯而不打包資源
gradle tasks
看看哪個task是你要的
『玖』 Android gradle 打包錯誤A problem occurred configuring project ':app'.
因為項目為插件工程,每次編譯需要使用「./gradlew pushPlugin」自動push到殼工程,但是...我的不行,就不行...
錯誤如下:
一臉懵逼,完全看不懂....
按照提示嘗試找找錯誤原因,然後一頓操作,猛如虎:
./gradlew --stacktrace
./gradlew --info
./gradlew --scan
...
這個錯誤感覺有點意思,可能是病灶的根源,仔細一看,確實,經過幾分鍾仔細研究,終於知道了:
解決方案:
1、我首先去把as的jre配置地方改成系統的,發現,改不了,放棄...
2.as不讓改,還不能改自己的么,改本地的環境變數,把java_home的jre換成as的jre地址,
結果,編譯的特別絲滑...
問題解決了,但是總覺得怪怪了,因為本地jre環境被改了,不舒服,哈哈,原因很簡單啊,本地jdk以後升級就不行了,第二種方法只是暫時解決了,並不完美,所以還得再想想...
終極解決:
編寫了一個腳本文件,主要作用有倆個,第一是臨時替換本地jre的地址,指向到as的。第二是直接編譯,然後push;
腳本如下:
ps:把地址換成自己as的jre地址就可以,注意分隔符的方向
運行編譯,完美編譯, 絲滑 ...
