Build OS.bat命令解析

本文介绍了一个用于Touch3G设备的固件构建脚本BuildOS.bat的内容及操作步骤,包括OEM包和SYS的重新打包、模块地址排序、nb文件的处理以及最终nbh文件的生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以Touch 3G的英文模板中的Build OS.bat为例

 

@echo off         下面信息不再cmd窗口中显示
TOOLS/BuildOS.exe -auto     OEM包和SYS重新打包成dump目录
TOOLS/greloc.exe -doit -dump      对dump目录的所有模块地址重新排序
copy ROM/OS.nb.payload temp/OS.nb.payload        将ROM/OS.nb.payload拷贝到temp目录
cd temp         进入BuildOS.exe生成的temp目录
../TOOLS/ImgfsFromNb OS.nb.payload imgfs.bin     从nb中提取imgfs.bin
../TOOLS/ImgfsFromDump imgfs.bin imgfs-new.bin       把dump目录打包进imgfs.bin
../TOOLS/ImgfsToNb imgfs-new.bin os.nb.payload os-new.nb.payload      把新的imgfs.bin重新插入到nb中
../TOOLS/NBMerge -kaiser os-new.nb       重新插入extra部分,nbsplit的反过程
../TOOLS/htcrt.exe /buildrom "C:/Jade_Kitchen/TOOLS/Jade.htcrtproj" "C:/Jade_Kitchen/FLASH/RUU_signed.nbh"       把nb文件打包成nbh,其中Jade.htcrtproj这个文件包含了nbh的一些参数,可以用记事本打开看
del boot.hv         删除文件
del boot.rgu         删除文件
del imgfs-new.bin         删除文件
del imgfs.bin         删除文件
del os-new.nb.payload         删除文件
del OS.nb.payload         删除文件
del log.txt         删除文件
pause         暂停

<think>我们正在讨论的是如何在Gradle中创建一个exec任务来执行`./gradlew`命令。注意,`./gradlew`是Gradle Wrapper的脚本,通常在项目的根目录下。 在Gradle中,我们可以使用`Exec`类型的任务来执行外部命令。由于`gradlew`是一个可执行脚本,我们可以通过指定它的路径来执行它。 但是,需要注意的是: 1. 在Unix-like系统中,gradlew是一个shell脚本。 2. 在Windows系统中,gradlew是一个批处理文件(gradlew.bat)。 因此,为了跨平台兼容,我们可以使用Gradle的内置功能来检测操作系统,并相应地调整命令。 下面是一个示例,展示如何创建一个exec任务来执行`./gradlew`命令(例如执行`assembleDebug`): ```groovy task runGradleWrapper(type: Exec) { // 设置工作目录,通常为项目根目录 workingDir rootProject.rootDir // 根据操作系统决定执行的命令 if (System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows')) { commandLine 'cmd', '/c', 'gradlew.bat', 'assembleDebug' } else { commandLine './gradlew', 'assembleDebug' } } ``` 解释: - `type: Exec`:表示这是一个执行外部命令的任务。 - `workingDir`:设置命令执行的工作目录。这里设置为根项目的根目录,因为gradlew脚本通常位于项目根目录。 - `commandLine`:指定要执行的命令及其参数。 - 在Windows上,我们使用`cmd /c`来执行批处理文件`gradlew.bat`。 - 在非Windows系统(如Linux、Mac),我们直接执行`./gradlew`(需要执行权限)。 注意:如果gradlew脚本没有执行权限,在非Windows系统上可能会失败。因此,确保gradlew有执行权限(可以通过`git update-index --chmod=+x gradlew`或手动设置)。 另外,我们也可以使用Gradle Wrapper的Java API来执行任务,但这通常更复杂。使用`Exec`任务是一种简单直接的方法。 如果我们需要在同一个构建中执行另一个Gradle构建,我们可以考虑使用`GradleBuild`类型的任务,但这里我们是要执行gradlew脚本,所以使用`Exec`更合适。 示例:使用`GradleBuild`任务(注意,这不需要通过gradlew脚本,而是直接使用当前的Gradle环境): ```groovy task runGradleBuild(type: GradleBuild) { tasks = ['assembleDebug'] } ``` 但这种方法不会使用gradlew脚本,而是使用当前安装的Gradle(或者当前构建相同的Gradle版本)。它和通过gradlew执行可能略有不同(gradlew会使用项目指定的Gradle版本)。 因此,如果我们的目的是使用项目中的gradlew脚本,那么`Exec`任务是更直接的选择。 最后,我们可以为这个exec任务添加依赖关系,或者将它作为其他任务的一部分。 相关问题: 1. 如何在Gradle Exec任务中传递参数? 2. 如何捕获Exec任务的输出? 3. 如何根据不同的操作系统配置不同的命令?</think>### Gradle Exec Task 执行 `./gradlew` 命令详解 #### 一、核心实现方式 在 Gradle 中使用 `Exec` 任务执行 `./gradlew` 命令需要解决两个关键问题: 1. **跨平台兼容性**:需区分 Windows 和 Unix-like 系统 2. **路径定位**:确保正确找到 gradlew 脚本位置 #### 二、完整实现示例 ```groovy task runGradleWrapper(type: Exec) { // 设置工作目录为项目根目录 workingDir rootProject.projectDir // 根据操作系统选择命令 if (System.getProperty('os.name').toLowerCase().contains('windows')) { commandLine 'cmd', '/c', 'gradlew.bat', 'assembleRelease' } else { commandLine './gradlew', 'assembleRelease' } // 捕获输出结果 standardOutput = new ByteArrayOutputStream() ext.output = { return standardOutput.toString() } // 错误处理 ignoreExitValue = true doLast { if (execResult.exitValue != 0) { throw new GradleException("GradleWrapper 执行失败: ${standardOutput.toString()}") } } } ``` #### 三、关键参数解析 | 参数 | 作用 | 示例值 | |------|------|--------| | `workingDir` | 设置 gradlew 所在目录 | `rootProject.projectDir` | | `commandLine` | 执行命令及参数 | `['./gradlew', 'clean', 'build']` | | `ignoreExitValue` | 是否忽略非0退出码 | `true`(允许失败)/`false`(严格检查) | | `standardOutput` | 捕获标准输出 | `new ByteArrayOutputStream()` | #### 四、跨平台兼容方案 ```groovy // 通用封装方法 def executeGradleCommand(String... args) { exec { workingDir rootDir executable = getGradleWrapperPath() args = args.toList() } } // 自动识别系统 def getGradleWrapperPath() { def isWindows = System.getProperty('os.name').toLowerCase().contains('windows') return isWindows ? 'gradlew.bat' : './gradlew' } // 使用示例 task buildAll { doLast { executeGradleCommand('clean', 'build', '--stacktrace') } } ``` #### 五、高级用法 1. **依赖管理**:确保前置任务完成 ```groovy task wrapperTask(dependsOn: ['clean']) { doLast { executeGradleCommand('assembleDebug') } } ``` 2. **动态参数传递** ```groovy task customBuild(type: Exec) { workingDir rootDir commandLine getGradleWrapperPath() args = [project.hasProperty('buildType') ? "assemble${project.buildType}" : 'assembleRelease'] } // 执行: gradle customBuild -PbuildType=Debug ``` 3. **多项目构建** ```groovy subprojects { task runModuleBuild(type: Exec) { workingDir project.projectDir commandLine "${rootDir}/gradlew", ":${project.name}:assemble" } } ``` #### 六、常见问题解决 1. **权限问题**(Unix系统): ```bash # 添加执行权限 chmod +x gradlew ``` 2. **路径错误**: ```groovy // 确保使用绝对路径 workingDir file(project.rootDir).absolutePath ``` 3. **输出中文乱码**: ```groovy environment "LANG", "en_US.UTF-8" environment "LC_ALL", "en_US.UTF-8" ``` 4. **超时控制**: ```groovy timeout = Duration.ofMinutes(10) // 设置10分钟超时 ``` > **原理说明**:`Exec` 任务通过 Java 的 `ProcessBuilder` 创建子进程执行命令,gradlew 脚本本质是调用项目指定的 Gradle 版本执行任务[^1][^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值