精华内容
下载资源
问答
  • gradlew

    千次阅读 2019-08-12 11:01:48
    gradlew 标签(空格分隔): gradlew gradlew 先简单介绍一下: 下面的介绍简单来说就是gradle会快速迭代版本,如果合作开发项目会导致自己下载gradle版本不一,从而手忙脚乱,所以干脆包装起来,统一 转载自*一篇...

    gradlew

    标签(空格分隔): gradlew


    转载自*一篇文章讲清楚Gradle与Gradle Wrapper的区别*
    转载自*Gradle之Gradle Wrapper(四)*

    gradlew

    先简单介绍一下:

    下面的介绍简单来说就是gradle会快速迭代版本,如果合作开发项目会导致成员自己下载gradle,导致版本不一,从而手忙脚乱,所以干脆包装起来,统一

    转载自*一篇文章讲清楚Gradle与Gradle Wrapper的区别*

    因为gradle处于快速迭代阶段,经常发布新版本,如果我们的项目直接去引用,那么更改版本等会变得无比麻烦。而且每个项目又有可能用不一样的gradle版本,这样去手动配置每一个项目对应的gradle版本就会变得麻烦;所以需要包装,引入gradle-wrapper,通过读取配置文件中gradle的版本,为每个项目自动的下载和配置gradle,就是这么简单。我们便不用关心如何去下载gradle,如何去配置进项目来。

    那么gradle wrapper从何而来?就Android而言,看下图

    TIM截图20190812101228.png-11.7kB
    TIM截图20190812101212.png-10.8kB

    在Android Studio安装的时候便会自带这个功能jar包,并且我们也看到了gradle-wrapper.properties。所以我们就知道了,AS每新建一个项目,就会将个目录下的这两个文件拷入到项目的gradle文件夹下面。

    TIM截图20190812101631.png-23.7kB

    当生成好了上面的这些目录与文件后,用户就可以将工程push到远程,当其他用户clone下来后就可以直接进行项目的构建,节省了用户单独下载Gradle的时间,并且可以确保Gradle版本的一致。

    但是有人会疑问为什么不直接执行gradle的命令,而是执行gradlew的命令

    因为就像wrapper本身的意义,gradle命令行也是善变的,所以wrapper对命令行也进行了一层封装,使用同一的gradlew命令,wrapper会自动去执行具体版本对应的gradle命令

    最后还有一个东西说一下,:

    .gradle文件夹,就是那个跟项目第一个文件夹,带点的那个。那个对我们没什么用,他是gradle运行的时候产生的一些记录性的文件。我们不需要关注。

    转载自*Gradle之Gradle Wrapper(四)*

    1. 为什么需要Gradle Wrapper

    Gradle Wrapper称为Gradle包装器,是对Gradle的一层包装。为什么需要Gradle Wrapper呢?比如在一个开发团队中,如果每进来一个成员,都需要在计算机中安装Gradle,这个时候运行Gradle的环境和版本就会对构建结果带来不确定性。针对这个问题,Gradle提供了一个解决方案,那就是Gradle Wrapper,它是一个脚本,可以在计算机没有安装Gradle的情况下运行Gradle构建,并且能够指定Gradle的版本,开发人员可以快速启动并运行Gradle项目,而不必手动安装,这样就标准化了项目,从而提高了开发效率。AS在新建项目时会自带Gradle Wrapper,这也是我们很少去单独去下载安装Gradle的原因。Gradle Wrapper的工作流程如下图所示:

    12044238-7af676491450b278.webp-3.4kB

    当使用Gradle Wrapper启动Gradle时,如果指定版本的Gradle没有被下载关联,会先从Gradle官方仓库下载该版本Gradle到用户本地,进行解包并执行批处理文件,后续的构建运行都会重用这个解包的运行时安装程序。

    2. Gradle Wrapper

    首先要确保计算机中配置好了Gradle的环境。
    Gradle已经内置了Wrapper Task,执行Wrapper Task就可以在项目目录中生成Gradle Wrapper的目录文件,在项目根目录执行gradler wrapper就可以了。

    PS D:\DevelopSoftWare_Location\Gradle\gradle_demo> gradle wrapper
    
    > Configure project :
    The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
            at build_1oqisdjvwto6xm4npmzdamdyu.run(D:\DevelopSoftWare_Location\Gradle\gradle_demo\build.gradle:1)
            (Run with --stacktrace to get the full stack trace of this deprecation warning.)
    
    
    BUILD SUCCESSFUL in 2s
    1 actionable task: 1 executed
    
    

    这时会在项目根目录中生成如下文件

    ├── gradle
    │   └── wrapper
    │       ├── gradle-wrapper.jar
    │       └── gradle-wrapper.properties
    ├── gradlew
    └── gradlew.bat
    

    每个文件的含义如下:

    • gradle-wrapper.jar :包含Gradle运行时的逻辑代码。
    • gradle-wrapper.properties:负责配置包装器运行时行为的属性文件,用来配置使用哪个版本的Gradle等属性。
    • gradlew:Linux平台下,用于执行Gralde命令的包装器脚本。
    • gradlew.bat:Windows平台下,用于执行Gralde命令的包装器脚本。

    当生成好了上面的这些目录与文件后,用户就可以将工程push到远程,当其他用户clone下来后就可以直接进行项目的构建,节省了用户单独下载Gradle的时间,并且可以确保Gradle版本的一致。

    也可以用Gradle命令行选项来生成Gradle Wrapper

    • –gradle-version:用于下载和执行指定的gradle版本。
    • –distribution-type:指定下载Gradle发行版的类型,可用选项有bin和all,默认值是bin,-bin发行版只包含运行时,但不包含源码和文档。
    • –gradle-distribution-url: 指定下载Gradle发行版的完整URL地址。
    • –gradle-distribution-sha256-sum:使用的SHA256散列和验证下载的Gradle发行版。

    具体还可以查阅gradle包含的userguide的introduction的Chapter 5. The Gradle Wrapper

    比如使用命令行:gradle wrapper –gradle-version 4.2.1 –distribution-type all,就可以生成版本为4.2.1的包装器,并使用-all发行版。

    3. 配置Gradle Wrapper

    gradle-wrapper.properties是Gradle Wrapper的属性文件,用来配置Gradle Wrapper,Gradle 4.4版本对应的gradle-wrapper.properties如下所示。

    TIM截图20190812103733.png-21kB

    字段含义如下:

    • distributionBase:Gradle解包后存储的主目录。
    • distributionPath:distributionBase指定目录的子目录。distributionBase± distributionPath就是Gradle解包后的存放位置。
    • distributionUrl:Gradle发行版压缩包的下载地址。
    • zipStoreBase:Gradle压缩包存储主目录。
    • zipStorePath:zipStoreBase指定目录的子目录。zipStoreBase+zipStorePath就是Gradle压缩包的存放位置

    这里我们最需要关注的是distributionUrl这个字段,如果官方的地址下载不了或者缓慢,可以将这个地址换为其他的镜像地址,或者干脆把Gradle发行版压缩包放在服务器上以供下载。

    4、使用Gradle Wrapper

    使用Gradle Wrapper不是用Gradle命令,而是用gradlew和gradlew.bat脚本。在build.gradle中加入如下语句

    task test {
        doLast {
            println 'Hello world!'
        }
    }
    

    以Windows平台为例,进入项目的根目录执行 .\gradlew.bat test,在cmd中不需要加“.\”,在 Windows PowerShell中要加“.\”

    PS D:\DevelopSoftWare_Location\Gradle\gradle_demo> .\gradlew.bat test
    Downloading https://services.gradle.org/distributions/gradle-4.4-bin.zip
    ........................................................................
    Unzipping C:\Users\houyl\.gradle\wrapper\dists\gradle-4.4-bin\bgaq7vklkazwgxox0hdadxbvi\gradle-4.4-bin.zip to C:\Users\houyl\.gradle\wrapper\dists\gradle-4.4-bin\bgaq7vklkazwgxox0hdadxbvi
    
    > Configure project :
    The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
            at build_1oqisdjvwto6xm4npmzdamdyu.run(D:\DevelopSoftWare_Location\Gradle\gradle_demo\build.gradle:1)
            (Run with --stacktrace to get the full stack trace of this deprecation warning.)
    
    > Task :test
    Hello World
    
    
    BUILD SUCCESSFUL in 4m 6s
    1 actionable task: 1 executed
    PS D:\DevelopSoftWare_Location\Gradle\gradle_demo>
    

    如果计算机中没有Gradle发行版,Gradle包装器会将Gradle发行版压缩包下载到本地中并进行解压,比如在我计算机中的存储路径为: C:\Users\houyl.gradle\wrapper\dists\gradle-4.4-bin\bgaq7vklkazwgxox0hdadxbvi
    如果此后Gradle属性文件的distributionUrl属性不变,就会一直使用本地的Gradle发行版。如果我们再次执行gradlew.bat test,就会和调用Gradle命令一样:

    PS D:\DevelopSoftWare_Location\Gradle\gradle_demo> .\gradlew.bat -q test
    Hello World
    PS D:\DevelopSoftWare_Location\Gradle\gradle_demo>
    

    5. 升级Gradle Wrapper

    升级Gradle Wrapper有两种方式,一种是设置Gradle属性文件的distributionUrl属性,第二种是通过运行wrapper任务,推荐使用第二种方式。当前本地的Gradle版本为4.2.1,我想升级为5.1.1,只需要运行gradlew wrapper –gradle-version 5.1.1命令就可以了。

    D:\DevelopSoftWare_Location\Gradle\gradle_demo>gradlew wrapper --gradle-version 5.1.1
    
    > Configure project :
    The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
            at build_1oqisdjvwto6xm4npmzdamdyu.run(D:\DevelopSoftWare_Location\Gradle\gradle_demo\build.gradle:1)
            (Run with --stacktrace to get the full stack trace of this deprecation warning.)
    
    
    BUILD SUCCESSFUL in 1s
    1 actionable task: 1 executed
    

    运行gradlew -v命令来检查Gradle版本

    D:\DevelopSoftWare_Location\Gradle\gradle_demo>gradlew -v
    Downloading https://services.gradle.org/distributions/gradle-5.1.1-bin.zip
    .................................................................................
    Unzipping C:\Users\houyl\.gradle\wrapper\dists\gradle-5.1.1-bin\90y9l8txxfw1s2o6ctiqeruwn\gradle-5.1.1-bin.zip to C:\Users\houyl\.gradle\wrapper\dists\gradle-5.1.1-bin\90y9l8txxfw1s2o6ctiqeruwn
    
    Welcome to Gradle 5.1.1!
    
    Here are the highlights of this release:
     - Control which dependencies can be retrieved from which repositories
     - Production-ready configuration avoidance APIs
    
    For more details see https://docs.gradle.org/5.1.1/release-notes.html
    
    
    ------------------------------------------------------------
    Gradle 5.1.1
    ------------------------------------------------------------
    
    Build time:   2019-01-10 23:05:02 UTC
    Revision:     3c9abb645fb83932c44e8610642393ad62116807
    
    Kotlin DSL:   1.1.1
    Kotlin:       1.3.11
    Groovy:       2.5.4
    Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
    JVM:          1.8.0_191 (Oracle Corporation 25.191-b12)
    OS:           Windows 10 10.0 amd64
    
    

    6. 自定义Gradle Wrapper

    Gradle已经内置了Wrapper Task,因此构建Gradle Wrapper会生成Gradle Wrapper的属性文件,这个属性文件可以通过自定义Wrapper Task来设置。比如我们想要修改要下载的Gralde版本为4.2.1,可以这么设置:

    task wrapper(type: Wrapper) {
        gradleVersion = '4.2.1'
    }
    

    也可以设置Gradle发行版压缩包的下载地址和Gradle解包后的本地存储路径等配置。

    task wrapper(type: Wrapper) {
        gradleVersion = '4.2.1'
        distributionUrl = '../../gradle-4.2.1-bin.zip'
        distributionPath=wrapper/dists
    
    }
    

    distributionUrl属性可以设置为本地的项目目录,你也可以设置为网络地址。


    展开全文
  • gradlew-bootstrap 在任何新项目文件夹中安装 Gradle 包装器的一种缓慢但简单的方法。 最新: curl -sSL https://raw.githubusercontent.com/viphe/gradlew-bootstrap/master/run.sh | \ bash -s 每晚: curl...
  • gradlew-java11-buildpack 此存储库是Heroku的构建包,它使用存储库中找到的Java11和Gradle包装器。 链接
  • Gradlew 介绍 使用命令行构建应用就可以使用gradlew命令来实现。可作为 Windows 的批处理文件 (gradlew.bat) 和 Linux 与 Mac 的 shell 脚本 (gradlew.sh) 使用,可以从使用 Android Studio 创建的每个项目的根目录...

    Gradlew

    介绍

    使用命令行构建应用就可以使用gradlew命令来实现。可作为 Windows 的批处理文件 (gradlew.bat) 和 Linux 与 Mac 的 shell 脚本 (gradlew.sh) 使用,可以从使用 Android Studio 创建的每个项目的根目录启动该工具。

    如需使用封装容器运行任务,请在终端窗口中(在 Android Studio 中,依次选择 View > Tool Windows > Terminal)使用下列命令之一:

    gradlew task-name(任务名称)
    

    如需查看项目的所有可用构建任务列表,执行tasks:

    gradlew tasks
    

    构建调试版 APK

    如需立即测试和调试应用,可以构建调试版 APK。调试版 APK 使用 SDK 工具提供的调试密钥进行签名,并允许通过 adb 进行调试。

    如需构建调试版 APK,请打开命令行,然后转到项目的根目录。如需启动调试 build,请调用 assembleDebug 任务:

    gradlew assembleDebug
    

    将在 project_name/module_name/build/outputs/apk/ 中创建一个名为 module_name-debug.apk 的 APK。该文件已使用调试密钥进行签名并使用 zipalign对齐,因此您可以立即将其安装到设备上。

    或者,如需构建 APK 并立即在运行的模拟器或连接的设备上安装,请改为调用 installDebug

    gradlew installDebug
    

    上述任务名称中的“Debug”部分只是构建变体名称的驼峰式大小写版本,因此可以替换为您想组装或安装的任何构建类型或变体。例如,如果您有“demo”这个产品变种,则可以使用 assembleDemoDebug 任务来构建调试版本。

    如需查看每个变体可用的所有构建和安装任务(包括卸载任务),请运行 tasks 任务。

    构建发布版 APK

    可以调用assembleRelease任务:

    gradlew assembleRelease
    gradlew installRelease
    

    从命令行为应用签名

    生成私钥

    不使用 Android Studio 也可以为应用签名。可以从命令行为应用签名(对于 APK,使用 apksigner;对于 App Bundle,使用 jarsigner),或在构建期间配置 Gradle 来为您的应用签名。无论使用哪种方式,都需要先使用 keytool 生成一个私钥,如下所示:

    keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias
    

    命令参数详解:

    • -genkey 生成秘钥对
    • -v 输出详细信息
    • -keystore 秘钥库名称 ,具体的位置
    • -keyalg 秘钥算法名称(RSA)
    • -keysize 秘钥位的大小
    • -validity 有效天数(单位:天)
    • -alias 秘钥库的别名
    • -storepass 秘钥库的口令 如果没有通过此参数指定,后面会通过交互方式输入
    为应用签名

    如果要从命令行为 App Bundle 签名,您可以使用 jarsigner。如果要为 APK 签名,则需要使用 zipalignapksigner(如下所述)。

    使用以上命令生成的apk是未签名的,可以通过jarsigner命令进行签名:

    jarsigner.exe -verbose -keystore C:\Users\Administrator\Desktop\myfile\key\sdk.jks -storepass 123456 -keypass 123456 -signedjar D:\AndroidStudioProjects\FYSDK3.1\sdktest\build\outputs\apk\release\sdktest-release-signed.apk D:\AndroidStudioProjects\FYSDK3.1\sdktest\build\outputs\apk\release\sdktest-release-unsigned.apk sdk(alis)
    

    options参数说明:

    • [ -verbose[:suboptions ]] 签名/验证时输出详细信息。子选项可以是 all, grouped 或 summary
    • [ -keystore ] 签名使用的秘钥库位置
    • [ -storepass <口令> ] 用于秘钥库完整型的口令,也就是秘钥库的密码
    • [ -keypass <口令> ] 证书口令密码 大多与秘钥库口令一样
    • [ -signedjar <文件> ] 生成签名文件的位置
    • sdk(alis) 证书别名

    使用apksignerzipalign 为apk签名,步骤如下:

    • 打开命令行(在 Android Studio 中,依次选择 View > Tool Windows > Terminal),然后转到未签名的 APK 所在的目录。(apksignerzipalign都在android_sdk/build-tools/version/目录下)

    • 使用 zipalign 对齐未签名的 APK:

      zipalign -v -p 4 my-app-unsigned.apk my-app-unsigned-aligned.apk
      

      zipalign 可以确保所有未压缩数据的开头均相对于文件开头执行特定的字节对齐,从而减少应用占用的 RAM 量。

    • 通过 apksigner使用您的私钥为 APK 签名:

      apksigner sign --ks my-release-key.jks --out my-app-release.apk my-app-unsigned-aligned.apk
      
      apksigner sign --ks my-release-key.jks --ks-key-alias test --ks-pass pass:123456  --out my-app-release.apk my-app-unsigned-aligned.apk
      
    • 验证您的 APK 是否已签名:

      apksigner verify --verbose my-app-release.apk
      
    扩展zipalign

    zipalign 是一种归档对齐工具,可对 Android 应用 (APK) 文件提供重要的优化。其目的是要确保所有未压缩数据的开头均相对于文件开头部分执行特定的对齐。具体来说,它会使 APK 中的所有未压缩数据(例如图片或原始文件)在 4 字节边界上对齐。这样一来,即可使用 mmap() 直接访问所有部分,即使其中包含具有对齐限制的二进制数据也没关系。这样做的好处是可以减少运行应用时消耗的 RAM 容量(内存容量)。

    在将 APK 文件分发给最终用户之前,必须先使用此工具对齐文件。

    注意:必须在应用构建过程中的两个特定时间点之一使用 zipalign,具体在哪个时间点使用,取决于您所使用的应用签名工具:
    
    如果您使用的是 apksigner,只能在为 APK 文件签名之前执行 zipalign。如果您在使用 apksigner 为 APK 签名之后对 APK 做出了进一步更改,签名便会失效。
    如果您使用的是 jarsigner,只能在为 APK 文件签名之后执行 zipalign。
    
    • 使用apksigner 顺序是:zipalign —> apksigner
    • 使用jarsigner 顺序是:jarsigner —> zipalign

    用法

    要对齐 infile.apk 并将其保存为 outfile.apk,请运行以下命令:

    zipalign [-f] [-v] <alignment> infile.apk outfile.apk
    

    命令参数详解:

    • 以字节为单位进行对齐,例如:'4’提供32位对齐 是一个整数,用于定义字节对齐边界。此值必须始终为 4(可提供 32 位对齐),否则实际将不会执行任何操作。
    • -c 确认给定文件的对齐方式 不修改文件
    • -f 覆盖现有的输出文件 outfile.zip(outfile.apk)
    • -p outfile.zip 应对 infile.zip 中的所有共享对象文件使用相同的页面对齐方式
    • -v 详细输出
    • -z 用Zopfli重新进行压缩
    扩展apksigner

    可以使用 Android SDK 构建工具的修订版 24.0.3 及更高版本中提供的 apksigner 工具为 APK 签名,并确保 APK 的签名能够在 APK 支持的所有版本的 Android 平台上成功通过验证

    注意:如果您在使用 apksigner 为 APK 签名后又对 APK 做了更改,则 APK 的签名将会失效。因此,必须在为 APK 签名之前使用zipalign 等工具进行对齐操作。
    

    用法

    使用 apksigner 工具为 APK 签名的语法如下:

    apksigner sign --ks keystore.jks |--key key.pk8 --cert cert.x509.pem [signer_options] app-name.apk
    

    在使用 apksigner 工具为 APK 签名时,必须提供签名者的私钥和证书。可以通过两种不同的方式添加此信息:

    • 使用 --ks 选项指定密钥库文件。

    • 使用 --key--cert 选项分别指定私钥文件和证书文件。私钥文件必须使用 PKCS #8 格式,证书文件必须使用 X.509 格式。

      --ks --ks keystore.jks--key key.pk8 --cert cert.x509.pem是两者选其一

    通常情况下,您只会使用一个签名者为 APK 签名。如果您需要使用多个签名者为 APK 签名,请使用 --next-signer 选项将要应用于每个签名者的常规选项集分隔开

    apksigner sign [signer_1_options] --next-signer [signer_2_options] app-name.apk
    

    验证apk签名

    apksigner verify -v signed.apk
    

    参数详细说明:

    • sign 对提供的apk进行签名 必须参数

    • verify 对签名后文件进行验证 确认在 APK 支持的所有 Android 平台上是否有效

    • –ks 指定密钥库文件

    • –in 输入待签名的文件 如果--out没有指定,这个文件将是最终签名的文件,一般不指定

    • –out 签名后文件存放位置,默认情况下,用签名文件进行替换 也就是可以不指定该选项 如果未明确提供此选项,则 APK 软件包将就地签名,并替换输入的 APK 文件。

    • -v --verbose 详细输出

    • –v1-signing-enabled <true | false> 确定 apksigner 是否会使用基于 JAR 的传统签名方案为给定的 APK 软件包签名。默认情况下,该工具会使用 --min-sdk-version--max-sdk-version 的值来决定何时采用此签名方案。是否采用v1方式签名

    • –v2-signing-enabled <true | false> 确定 apksigner 是否会使用 APK 签名方案 v2为给定的 APK 软件包签名。默认情况下,该工具会使用 --min-sdk-version--max-sdk-version 的值来决定何时采用此签名方案。是否采用v2方式签名

    • –v3-signing-enabled <true | false> 确定 apksigner 是否会使用 APK 签名方案 v3 为给定的 APK 软件包签名。默认情况下,该工具会使用 --min-sdk-version--max-sdk-version 的值来决定何时采用此签名方案。v3签名从Android9开始支持。

    • –next-signer 用于为每个签名者指定不同的常规选项。就是可以使用多个签名文件对apk进行签名

    • –ks-key-alias 表示签名者在密钥库中的私钥和证书数据的别名的名称。如果与签名者关联的密钥库包含多个密钥,则必须指定此选项。

    • –key-pass 签名者私钥的密码。如果私钥受密码保护,则需要该密码。apksigner 工具支持以下格式:

      • pass:<password>- 密码与 apksigner sign 命令的其余部分一起提供(内嵌在其中)。
      • env:<name> - 密码存储在给定的环境变量中。
    • file:<filename> - 密码存储在给定文件中的某一行。

      • stdin - 密码作为标准输入流中的某一行提供。这是 --key-pass 的默认行为。
      **注意**:如果一个文件中包含多个密码,请分别在不同的行中指定这些密码。`apksigner` 工具会根据您指定 APK 签名者的顺序将密码与签名者相关联。如果您为签名者提供了两个密码,`apksigner` 会将第一个密码视为密钥库密码,将第二个密码视为密钥密码。
      
    实例

    使用 release.jks(密钥库中唯一的密钥)为 APK 签名:

    apksigner sign --ks release.jks input.apk 
    

    使用私钥和证书(存储为不同的文件)为 APK 签名:

    apksigner sign --key release.pk8 --cert release.x509.pem app.apk
    

    使用两个密钥为 APK 签名:

    apksigner sign --ks release.jks --next-signer --ks next.jks app.apk
    

    检查 APK 的签名是否可在 APK 支持的所有 Android 平台上被确认为有效:

    apksigner verify -v app.apk 
    

    检查 APK 的签名是否可在 Android 4.0.3(API 级别 15)及更高版本上被确认为有效:

    apksigner verify --min-sdk-version 15 app.apk
    

    参考文档:

    Google官方文档之gradlew

    Google官方文档之zipalign

    Google官方文档之apksigner

    展开全文
  • gradlew指的就是gradle wrapper,可以使用gradle init生成。gradlew就是将gradle封装了一下,在实际使用中,使用gradle的地方直接换成gradlew即可,不必在意事前环境是否安装,是否按照期待进行了安装,一般在第一次...

    在这里插入图片描述
    gradlew指的就是gradle wrapper,可以使用gradle init生成。gradlew就是将gradle封装了一下,在实际使用中,使用gradle的地方直接换成gradlew即可,不必在意事前环境是否安装,是否按照期待进行了安装,一般在第一次使用的时候首先会缺省按照设定文件中指定的版本下载gradle展开到本用户指定的目录下,之后会直接使用此gradle,而在使用的时候第一次会下载gradle,这篇文章介绍一下使用本地zip包进行展开的方式。

    事前准备

    准备一个gradlew的使用示例,实际非常简单,使用gradle init即可,本文使用如下Gradle的镜像生成gradlew的使用示例。

    执行命令:docker run --rm -it liumiaocn/gradle:jdk8.6.0.1 sh

    liumiaocn:jar liumiao$ docker run --rm -it  liumiaocn/gradle:jdk8.6.0.1 sh
    # gradle --version
    
    ------------------------------------------------------------
    Gradle 6.0.1
    ------------------------------------------------------------
    
    Build time:   2019-11-18 20:25:01 UTC
    Revision:     fad121066a68c4701acd362daf4287a7c309a0f5
    
    Kotlin:       1.3.50
    Groovy:       2.5.8
    Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
    JVM:          1.8.0_232 (AdoptOpenJDK 25.232-b09)
    OS:           Linux 4.9.184-linuxkit amd64
    
    # 
    

    生成gradlew的使用示例

    # mkdir test
    # cd test
    # ls
    # gradle init
    
    Select type of project to generate:
      1: basic
      2: application
      3: library
      4: Gradle plugin
    Enter selection (default: basic) [1..4] 1
    
    Select build script DSL:
      1: Groovy
      2: Kotlin
    Enter selection (default: Groovy) [1..2] 1
    
    Project name (default: test): test
    
    > Task :init
    Get more help with your project: https://guides.gradle.org/creating-new-gradle-builds
    
    BUILD SUCCESSFUL in 22s
    2 actionable tasks: 2 executed
    # find  -type f
    ./build.gradle
    ./gradlew.bat
    ./.gitignore
    ./settings.gradle
    ./gradle/wrapper/gradle-wrapper.jar
    ./gradle/wrapper/gradle-wrapper.properties
    ./gradlew
    ./.gradle/6.0.1/gc.properties
    ./.gradle/6.0.1/executionHistory/executionHistory.lock
    ./.gradle/6.0.1/executionHistory/executionHistory.bin
    ./.gradle/6.0.1/fileHashes/fileHashes.bin
    ./.gradle/6.0.1/fileHashes/fileHashes.lock
    ./.gradle/6.0.1/fileChanges/last-build.bin
    ./.gradle/buildOutputCleanup/buildOutputCleanup.lock
    ./.gradle/buildOutputCleanup/outputFiles.bin
    ./.gradle/buildOutputCleanup/cache.properties
    ./.gitattributes
    # 
    

    gradlew第一次执行

    使用./gradlew执行并按CTRL + C中断执行,可以看到第一次执行时首先会下载gradle-6.0.1-bin.zip文件

    # ls
    build.gradle  gradle  gradlew  gradlew.bat  settings.gradle
    # ./gradlew
    Downloading https://services.gradle.org/distributions/gradle-6.0.1-bin.zip
    ^C#
    

    而此下载版本Gradle的配置信息则是在wrapper的如下文件中进行设定的

    # cat ./gradle/wrapper/gradle-wrapper.properties
    distributionBase=GRADLE_USER_HOME
    distributionPath=wrapper/dists
    distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-bin.zip
    zipStoreBase=GRADLE_USER_HOME
    zipStorePath=wrapper/dists
    # 
    

    GRADLE_USER_HOME缺省指的则是~/.gradle目录,这也是distributionUrl下载地址的zip文件所要解压的目的目录, 修改此变量地址指向本地zip文件

    # cat gradle/wrapper/gradle-wrapper.properties
    distributionBase=GRADLE_USER_HOME
    distributionPath=wrapper/dists
    distributionUrl=file:///usr/local/download/gradle-6.0.1-bin.zip
    zipStoreBase=GRADLE_USER_HOME
    zipStorePath=wrapper/dists
    # 
    

    并在本地实现保存相应的zip文件

    # ls /usr/local/download/gradle-6.0.1-bin.zip
    /usr/local/download/gradle-6.0.1-bin.zip
    # 
    

    这样第一次执行时就会直接使用本地文件了,执行结果如下所示:

    # ./gradlew
    Downloading file:/usr/local/download/gradle-6.0.1-bin.zip
    .........10%.........20%.........30%.........40%.........50%.........60%.........70%.........80%.........90%.........100%
    
    Welcome to Gradle 6.0.1!
    ...省略
    BUILD SUCCESSFUL in 7s
    1 actionable task: 1 executed
    # 
    

    执行之后可以看到~/.gradle下也展开了相应的文件

    # find ~/.gradle -type f
    /root/.gradle/native/jansi/1.18/linux64/libjansi.so
    /root/.gradle/native/30/linux-amd64/libnative-platform.so
    ...省略
    /root/.gradle/wrapper/dists/gradle-6.0.1-bin/9urc0czldohtc4p99uuywire5/gradle-6.0.1-bin.zip
    # 
    

    总结

    实际上这种使用gradlew的方法并没有太多实际的意义,使用gradlew一般是同一个用户可能会使用不同版本的gradle,希望在多个版本自由选择和切换时;或者是不同用户使用同一个版本,对于系统级别的gradle为了避免各个用户之间相互影响,所以使用wrapper可以保证每个用户有自己独立不受影响的gradle环境,或者此两种情况的组合,这才是gradlew实际的常见使用场景。不过已经使用了gradlew并希望不改变这个现状,同时使用时无法连接外网的这种有限场景可以使用本文介绍的方式进行对应。

    展开全文
  • Android中gradlew命令的基本使用

    万次阅读 2018-07-11 21:12:08
    title: Android中gradlew命令的基本使用 date: 2018-07-10 16:18:01 tags: Android Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目...

    title: Android中gradlew命令的基本使用
    date: 2018-07-10 16:18:01
    tags: Android


    Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML
    的各种繁琐配置。 面向Java应用为主。当前其支持的语言限于Java、Groovy和Scala,计划未来将支持更多的语言。

    build.gradle是Gradle默认的构建脚本文件,执行Gradle命令的时候,会默认加载当前目录下的build.gradle脚本文件,当然你也可以通过 -b 参数指定
    想要加载执行的文件
    下面进行对android项目进行分析。

    ├── app #Android App目录
    │   ├── app.iml
    │   ├── build #构建输出目录
    │   ├── build.gradle #构建脚本
    │   ├── libs #so相关库
    │   ├── proguard-rules.pro #proguard混淆配置
    │   └── src #源代码,资源等
    ├── module #Android 另外一个module目录
    │   ├── module.iml
    │   ├── build #构建输出目录
    │   ├── build.gradle #构建脚本
    │   ├── libs #so相关库
    │   ├── proguard-rules.pro #proguard混淆配置
    │   └── src #源代码,资源等
    ├── build
    │   └── intermediates
    ├── build.gradle #工程构建文件
    ├── gradle
    │   └── wrapper
    ├── gradle.properties #gradle的配置
    ├── gradlew #gradle wrapper linux shell脚本
    ├── gradlew.bat
    ├── LibSqlite.iml
    ├── local.properties #配置Androod SDK位置文件
    └── settings.gradle #工程配置
    
    

    gradlew 命令就是 gradle wrapper,是gradle的一个包装,可以理解为在这个项目本地就封装了gradle,
    比如我的安卓项目是LoveYouDeeply, 在LoveYouDeeply/gradle/wrapper/gralde-wrapper.properties文件中声明了它指向的目录和版本,比如我的内容是:

    #Sun May 13 12:31:41 CST 2018
    distributionBase=GRADLE_USER_HOME
    distributionPath=wrapper/dists
    zipStoreBase=GRADLE_USER_HOME
    zipStorePath=wrapper/dists
    distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
    
    

    如果你项目没有该文件的话,那么gradlew会到 ~/.gradle/wrapper/dists/gradle-xxx 下寻找,或者你新建给文件,内容复制到里面。其实你会发现是同一个目录咯。里面会有个随机数的文件夹,里面就是gradle,只要下载成功即可用grdlew wrapper的命令代替全局的gradle命令。

    常用命令如下:(linux下是./gradlew,该脚本在项目下,windows直接gradlew即可)

    • ./gradlew -v 版本号,首次运行,没有gradle的要下载的哦。
    $ ./gradlew -v
    
    ------------------------------------------------------------
    Gradle 4.6
    ------------------------------------------------------------
    
    Build time:   2018-02-28 13:36:36 UTC
    Revision:     8fa6ce7945b640e6168488e4417f9bb96e4ab46c
    
    Groovy:       2.4.12
    Ant:          Apache Ant(TM) version 1.9.9 compiled on February 2 2017
    JVM:          1.8.0_171 (Oracle Corporation 25.171-b11)
    
    
    • ./gradlew clean 删除项目LoveYouDeeply/app目录下的build文件夹

    • ./gradlew build 检查依赖并编译打包,这里注意的是 ./gradlew build 命令把debug、release环境的包都打出来,生成的包在目录LoveYouDeeply/app/build/outputs/apk/下。如果正式发布只需要打release的包,该怎么办呢,下面介绍一个很有用的命令 assemble, 如下面要介绍的一些命令。

    • ./gradlew assembleDebug 编译并打Debug包

    • ./gradlew assemblexiaomiDebug 编译并打xiaomi的debug包,其他类似

    • ./gradlew assembleRelease 编译并打Release的包

    • ./gradlew assemblexiaomiRelease 编译并打xiaomi的Release包,其他类似

    • ./gradlew installRelease Release模式打包并安装

    • ./gradlew uninstallRelease 卸载Release模式包

    值得注意的是,在使用react-native的时候,也会使用上面的命令进行管理与生成apk包,如下图所示,就是在使用react-native run android命令时在终端打印出的结果:
    react-native run android

    补充

    1 gradlew build 和 gradle build 有区别吗?

    使用gradle wrapper是gradle官方推荐的build方式,而gradlew正是运行了wrapper task之后生成的(运行wrapper task是Android Studio自动做的)。使用gralde wrapper的一个好处就是每个项目可以依赖不同版本的gradle,构建的时候gradle wrapper会帮你自动下载所依赖的版本的gradle。而如果你使用gradle build的话,同时你又有多个项目使用不同版本的gradle,那就需要你手动在自己的机器上配置多个版本的gradle,稍微麻烦一些

    2 自定义apk包名

    gradle脚本可以使用下面方法进行命名:

    def releaseTime() {
        return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
    }
    
    //自定义apk安装包名
        // applicationVariants are e.g. debug, release
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                // For each separate APK per architecture, set a unique version code as described here:
                // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
                // def versionCodes = ["armeabi-v7a":1, "x86":2]
                // def abi = output.getFilter(OutputFile.ABI)
                // if (abi != null) {  // null for the universal-debug, universal-release variants
                //     output.versionCodeOverride =
                //             versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
                // }
                def outputFile = output.outputFile
                def fileName
                if (outputFile != null && outputFile.name.endsWith('.apk')) {
                    if (variant.buildType.name.equals('release')) {
                        fileName = "com.amarsoft.LoveYouDeeply_v${defaultConfig.versionName}.apk"
                    } else if (variant.buildType.name.equals('debug')) {
                        fileName = "LoveYouDeeply_v${defaultConfig.versionName}_debug_${releaseTime()}.apk"
                    }
                    output.outputFile = new File(outputFile.parent, fileName)
                }
            }
        }
    
    
    

    注意: 在Gradle 4.6中,应该采用下面的写法,而不是直接修改output

        // applicationVariants are e.g. debug, release
        android.applicationVariants.all { variant ->
            variant.outputs.all { output ->
                // For each separate APK per architecture, set a unique version code as described here:
                // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
                // def versionCodes = ["armeabi-v7a":1, "x86":2]
                // def abi = output.getFilter(OutputFile.ABI)
                // if (abi != null) {  // null for the universal-debug, universal-release variants
                //     output.versionCodeOverride =
                //             versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
                // }
                def fileName
                if (outputFile != null && outputFile.name.endsWith('.apk')) {
                    if (variant.buildType.name.equals('release')) {
                        fileName = "com.amarsoft.LoveYouDeeply_v${defaultConfig.versionName}.apk"
                    } else if (variant.buildType.name.equals('debug')) {
                        fileName = "LoveYouDeeply_v${defaultConfig.versionName}_debug_${releaseTime()}.apk"
                    }
                    outputFileName = fileName;
                }
            }
        }
    
    展开全文
  •  Gradle是一个构建工具,它是用来帮助我们构建app的,构建包括编译、...用gradle的指令构建app,需要用到gradlew(即gradle wrapper的简写),本文对gradlew的常用指令做一个总结。   gradlewgradlew.bat: gradle
  • Android studio gradlew 使用方法

    千次阅读 2021-01-30 17:10:07
    Android studio gradlew 使用方法 ./gradlew clean clean项目 ./gradlew build 构建项目 ./gradlew assembleDebug or /gradlew aD 编译并打Debug包 ./gradlew assembleRelease or /gradlew aR 编译并打Release的包 ....
  • gradlew 常用命令行

    2020-11-03 17:13:00
    gradlew build --info --debug --stacktrace 调试模式并打印堆栈信息 gradlew -v 查看Gradle、Groovy、Ant、JVM等的版本,截图如下: gradlew tasks --all 查看所有任务 gradlew clean clean项目 gradlew build 构建...
  • gradlew dependencies

    2020-12-21 10:04:31
    gradlew 查看运行时 项目依赖 gradlew :[appname]:dependencies --configuration releaseRuntimeClasspath 查看编译时 项目依赖 gradlew :[appname]:dependencies --configuration releaseCompileClasspath
  • gradlew命令

    2019-10-14 18:16:34
    ./gradlew clean clean项目 ./gradlew build 构建项目 /gradlew assembleDebug or /gradlew aD 编译并打Debug包 ./gradlew assembleRelease or /gradlew aR 编译并打Release的包 ./gradlew installRelease ...
  • ./gradlew 主要因为mac下执行当前目录下的命令需要在前面加上“./”,否则会到环境变量下找相应命令 然后可能出现The operation couldn’t be completed. Unable to locate a Java Runtime. 在.bash_profile添加 ...
  • Android gradlew命令

    2019-10-24 16:33:28
    (linux下是./gradlew,该脚本在项目下,windows直接gradlew即可) gradlew :app:dependencies 所有人依赖一次库 gradlew -v gradlew clean 删除项目 xxx/app目录下的build文件夹 gradlew build 检查依赖并编译...
  • gradlew命令汇总

    2020-08-28 16:26:24
    ./gradlew makeJar //打包jar ./gradlew clean clean项目 ./gradlew build 构建项目 ./gradlew assembleDebug or /gradlew aD 编译并打Debug包 ./gradlew assembleRelease or /gradlew aR 编译并打Release的包 ./...
  • 点击gradle的sync按钮也是能同步成功 执行打包单个渠道/环境的包是能成功的,比如./gradlew assembleUat1Release ,注意这里无论debug/release的buid type都能成功 执行打多个Release包命令的时候(./gradlew ...
  • ./gradlew dependencies

    2020-10-15 00:24:36
    命令行./gradlew dependencies +--- androidx.legacy:legacy-support-v13:1.0.0 | \--- androidx.legacy:legacy-support-v4:1.0.0 | +--- androidx.core:core:1.0.0 -> 1.1.0 (*) | +--- androidx.media:media:...
  • gradlew常用命令

    千次阅读 2019-10-21 16:54:13
    在开发时有些小伙伴喜欢使用gradlew 命令行进行打包编译App,使用起来很安逸. gradlew -v//查看Gradle、Groovy、Ant、JVM等的版本,截图如下: gradlew clean //和clean project 类似,截图如下: gradlew tasks -...
  • gradlew的基本使用

    千次阅读 2019-06-19 14:58:14
    在你普通的gradle项目中,执行gradle wrapper生成gradle wrapper相关的信息【gralew、gradlew.bat、gradle目录】, 这些信息需要同src等信息一同传递给另外的人,比如git传递,在另外的机器上,即使没有安装gradle,...
  • Android gradlew打包命令

    2020-08-14 10:06:39
    1、gradlew -v 查看当前项目所用的Gradle版本 2、gradlew clean 清除9GAG/app目录下的build文件夹 3、gradlew build 编译项目并生成相应的apk文件 4、gradlew assembleDebug 编译并打Debug包 5、gradlew assemble...
  • Gradle-gradlew

    千次阅读 2018-12-18 15:32:46
    gradlew: 当把本地一个项目放入到远程版本库的时候,如果这个项目是以gradle构建的,那么其他人从远程仓库拉取代码之后如果本地没有安装过gradle会无法编译运行,如果对gradle不熟悉,会使得无法很好的去快速构建...
  • gradle和gradlew的区别

    2019-05-08 22:49:39
    对于刚接触gradle的同学或许电脑中配置gradle环境变量后,并没注意到这两个区别 配置好gradle环境变量后(配置环境变量这里就不说了,可以自行百度),我们就可以在cmd中...接下来说下gradlew: 我们在新建的目录...
  • gradlew:在Android studio的指定是在gradle/wrapper/gradle-wrapper.properties 中 gradle:对于系统gradle其存放在 ~/.gradle 下面 以下内容赶时间可以忽略 定义区别: Gradlew是包装器,自动下载包装器里定义...
  • //编译并打印日志 gradlew compileDebugSource --stacktrace -info gradlew compileDebugJavaWithJavac //展示jar包依赖关系 gradlew :app:dependencies //强制清除 gradle 依赖缓存 gradlew build --refresh-...
  • gradlew compileDebugSources

    千次阅读 2019-08-13 15:26:29
    遇到错误,在terminal中输入gradlew compileDebugSources
  • Gradle的下载安装及Gradlew的使用

    千次阅读 2020-05-31 22:36:33
    Gradle的下载安装及Gradlew的使用 window下安装Gradle Gradle官网 我这里下载的gradle版本是4.4 大家可以可以安装最新版本的 gradle4.4 下载完压缩包解压到指定路径即可 配置环境变量 key:GRADLE_HOMR value:D:\...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,841
精华内容 8,736
关键字:

gradlew