1. 程式人生 > >gradle wrapper分析

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-

GradleGradle Wrapper與Android Plugin for Gradle的區別和聯絡

原文連結:https://www.cnblogs.com/jiangxinnju/p/8229129.html 總結: Gradle:是一個專案構建系統,類似於Maven。Gradle並不是只能用於Android,而是Android引用裡Gradle。https://docs.gradle.

徹底搞懂GradleGradle Wrapper與Android Plugin for Gradle的區別和聯絡

歡迎和大家交流技術相關問題: 郵箱: [email protected] 部落格園地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://github.com/jiangxincode 知乎地址: https://www.zhihu.com/

gradlegradle 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.gradlegradle-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 使用本軟件的環境:食堂或其他地方 典型場景:食堂阿姨撿到一張飯卡,將此信