gradle wrapper分析
gradle wrapper原始碼可以參考我的github: https://github.com/xiaoyur347/gradlew
gradle比gradle wrapper複雜的多,所謂gradle wrapper包括以下的部分。
檔案 | 含義 |
---|---|
gradlew | Unix指令碼(支援Linux/MacOS) |
gradlew.bat | Win指令碼 |
gradle/wrapper/gradle-wrapper.jar | gradle-wrapper核心jar |
gradle/wrapper/gradle-wrapper.properties | gradle-wrapper配置檔案。 |
gradlew/gradlew.bat
基本就是做了一些路徑查詢和轉換工作,最後轉入
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "[email protected]"
如果將路徑展開,差不多就是
exec java "${JVM_OPTS[@]}" -classpath $APP_HOME/gradle/wrapper/gradle-wrapper.jar org.gradle.wrapper.GradleWrapperMain " [email protected]"
所以gradle wrapper的跨平臺是通過在核心的jar上外包一層指令碼,最終其實也就是呼叫java 應用路徑/gradle/wrapper/gradle-wrapper.jar,並指定了main為org.gradle.wrapper.GradleWrapperMain,因為java支援多個main。
gradle/gradle.bat
額,研究gradle-wrapper跳轉後,發現gradle也是一個指令碼,跟gradlew也是基本類似的。
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH " org.gradle.launcher.GradleMain "[email protected]"
如果將路徑展開,差不多就是
exec java "${JVM_OPTS[@]}" -classpath $APP_HOME/lib/gradle-launcher-2.14.1.jar org.gradle.launcher.GradleMain "[email protected]"
gradle-wrapper.jar
就是gradle原始碼中的org.gradle.cli部分和org.gradle.wrapper部分。
我把gradle 2.14.1 src下相關的目錄建了一個github,即https://github.com/xiaoyur347/gradlew。可實現用gradle來編譯gradle-wrapper.jar
checkout程式碼後,通過
gradle assemble
編譯,得到的jar包為./build/libs/gradlew.jar。可替換現有的jar包進行除錯。
gradle-wrapper裡主要就是下載gradle,和執行gradle命令。
gradle下載到${GRADLE_USER_HOME}/.gradle/wrapper目錄。通常是user/.gradle/wrapper。注意,由於gradlew不使用系統的gradle,即使系統已經安裝了gradle,仍然要進行下載。
gradle-wrapper呼叫gradle
呼叫在BootstrapMainStarter中。就是直接搜尋gradleHome/lib/gradle-launcher-.*.jar,然後載入org.gradle.launcher.GradleMain的main()方法,這跟gradle載入$APP_HOME/lib/gradle-launcher-2.14.1.jar org.gradle.launcher.GradleMain是一致的。
package org.gradle.wrapper;
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class BootstrapMainStarter {
public void start(String[] args, File gradleHome) throws Exception {
File gradleJar = findLauncherJar(gradleHome);
URLClassLoader contextClassLoader = new URLClassLoader(new URL[]{gradleJar.toURI().toURL()}, ClassLoader.getSystemClassLoader().getParent());
Thread.currentThread().setContextClassLoader(contextClassLoader);
Class<?> mainClass = contextClassLoader.loadClass("org.gradle.launcher.GradleMain");
Method mainMethod = mainClass.getMethod("main", String[].class);
mainMethod.invoke(null, new Object[]{args});
}
private File findLauncherJar(File gradleHome) {
for (File file : new File(gradleHome, "lib").listFiles()) {
if (file.getName().matches("gradle-launcher-.*\\.jar")) {
return file;
}
}
throw new RuntimeException(String.format("Could not locate the Gradle launcher JAR in Gradle distribution '%s'.", gradleHome));
}
}
.gradle/wrapper目錄結構
用於存放gradle-wrapper下載gradle的zip包和解壓後的資料夾。
wrapper的目錄規則是
wrapper/dists/gradle-2.14.1-all/${base36}/gradle-2.14.1-all.zip
wrapper/dists/gradle-2.14.1-all/${base36}/gradle-2.14.1-all.zip.lck
wrapper/dists/gradle-2.14.1-all/${base36}/gradle-2.14.1-all.zip.ok
其中base36的規則為:
- 利用0x8c9a3200746e2de49722587c1108fe87構造一個uint 128位整數。
- 將整數利用base36得到base36的值(取小寫)。
java程式碼如下:
import java.math.BigInteger;
import java.security.MessageDigest;
public class Hash {
public static void main(String[] args) {
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] bytes = args[0].getBytes();
messageDigest.update(bytes);
String str = new BigInteger(1, messageDigest.digest()).toString(36);
System.out.println(str);
} catch (Exception e) {
throw new RuntimeException("Could not hash input string.", e);
}
}
}
相關推薦
gradle wrapper分析
gradle wrapper原始碼可以參考我的github: https://github.com/xiaoyur347/gradlew gradle比gradle wrapper複雜的多,所謂gradle wrapper包括以下的部分。 檔案
Could not find gradle wrapper within android sdk
too -a uil orm c項目 info https template tool 問題: IONIC 3.9.2 為ionic項目添加android platform後再build android時,出現如下提示: 問題原因: cordo
Gradle Wrapper
and .cn 生成 需要 AR ima 根目錄 構建 配置 簡介 Gradle Wrapper就是對Gradle的一層封裝,一個項目可以使用指定的gradle版本進行構建而不受當前機器安裝的gradle版本影響,便於一臺機器的多個項目使用不同的gradle版本進行構建而互
ionic 提示 Error: Could not find gradle wrapper within Android SDK.
Error: Could not find gradle wrapper within Android SDK. Might need to update your Android SDK. 到Android SDK目錄下,確認真沒有這個tools/templates/gradle 目錄 可能是And
unzipping/Users/xq/.gradle/wrapper /dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3-all.zi
unzipping/Users/xq/.gradle/wrapper /dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3-all.zip to /Users/xq/.gradle/wrapper/dists/gradle-3.3-
Gradle、Gradle Wrapper與Android Plugin for Gradle的區別和聯絡
原文連結:https://www.cnblogs.com/jiangxinnju/p/8229129.html 總結: Gradle:是一個專案構建系統,類似於Maven。Gradle並不是只能用於Android,而是Android引用裡Gradle。https://docs.gradle.
徹底搞懂Gradle、Gradle Wrapper與Android Plugin for Gradle的區別和聯絡
歡迎和大家交流技術相關問題: 郵箱: [email protected] 部落格園地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://github.com/jiangxincode 知乎地址: https://www.zhihu.com/
gradle與gradle wrapper關係,以及版本關係
轉自:http://www.devdiv.com/Android-gradle_gradle_wrapper_-thread-214388-1-1.html gradle-wrapper.properties是這樣的 distributionUrl=https\://se
android匯入專案,出現Fix Gradle wrapper and re-import project問題以及相關問題的解決
今天本來想研究下android MVP模式,後來我組長給我發了個壓縮過的專案,我解壓專案後,在Android Studio匯入專案的時候,出現了一下問題(原先我as裡面的專案都沒有任何問題): ,(如果原來的專案,出現這個問題, 解決方法跟以下 一樣) 後來我就去Se
Gradle Wrapper初識
Gradle Wrapper存在的意義 gradle wrapper存放在每個專案中的,這樣如果有開發者下載專案,然後想要執行構建任務,用wrapper方式,gradle wrapper會自動檢測本地是否有指定版本的gradle,如果沒有它會自動從網路上下載g
Android Studio之maven Central,JCenter(build.gradle、gradle-wrapper.properties、gradle.properties)
Android studio 是從哪裡得到庫的? Android Studio是從build.gradle裡面定義的Maven 倉庫伺服器上下載library的。Apache Maven是Apache開發的一個工具,提供了用於貢獻library的檔案伺服器。總的來說,只
Minimum supported Gradle version is 4.4. Current version is 4.1. If using the gradle wrapper, trye
是因為兩個 gradle版本不同造成的! 那我們可以看下 自己本地專案中的 gradle版本(可以正常跑的專案) 然後複製過來就行!我是參考這位大佬的方案解決的: 如果還沒有解決問題的朋友可以參考下他
Travis CI Could not find or load main class org.gradle.wrapper.GradleWrapperMain 錯誤
問題 在 Travis CI 編譯的時候出現 Error: Could not find or load main
Error:Minimum supported Gradle version is 2.14.1. Current version is 2.10.原因分析和解決。
圖片 幫助 url err ... tle IT .net fcm 最近和主管一起開發項目一直出現這個問題: Error:Minimum supported Gradle version is 2.14.1. Current version is 12.10. If usi
Gradle基礎:9:wrapper的使用
Gradle Wrapper是gradle建議的使用方式,這篇文章將會結合具體的例子來說明一下如何使用。 Gradle Wrapper Gradle Wrapper實際上就是一個指令碼,使用它可以下載和使用指定版本的gradle,根據需要進行在使用之前進行下載,有效避免本地機器的
Android Studio 出現 Gradle's dependency cache may be corrupt 錯誤分析
雖然針對此問題網上也有答案,但沒能幫我解決掉,自己找到了另一個方法。我是通過SVN下載的專案,就報了此錯誤。 gradle-wrapper.properties裡修改了gradle的版本,與之前沒有報錯的gradle版本一致。就可以了 http\://service
idea gradle-view 依賴分析無法使用
使用gradle-view分析專案依賴的時候會出現以下錯誤日誌資訊 Could not install Gradle distribution from 'https://services.gra
Jenkins+Gradle+pmd對Android工程原始碼進行靜態程式碼分析
轉載請注意出處:http://blog.csdn.net/hwhua1986/article/details/49278941 環境說明 Gradle 2.6. OS:windows server 2008 Jenkins 1.620 pmd 5.4.0 前提: Jen
AndroidStudio環境升級 AS 3.1.1 + gradle 3.1.2 + wrapper 4.7 + sdk 27 踏坑記錄
報錯一: Error:Unable to find method 'com.android.build.gradle.tasks.factory.AndroidJavaCompile.se
典型用戶和場景分析
水平 用途 環境 大學生 空間 黑板 層次 重要性 可能 1. 名字:韓梅梅 年齡:39 職業:食堂阿姨 代表的用戶在市場上的比例和重要性:5% 較重要 知識層次和能力:可能不太會熟練使用手機APP 使用本軟件的環境:食堂或其他地方 典型場景:食堂阿姨撿到一張飯卡,將此信