我正在编写一个小的脚本,它将生成签名的apk。
我在
有android构建工具C:/Users/Fname Lname/AppData/Local/Android/Sdk/build-tools/27.0.3/
在这些构建工具文件夹27.0.3
中有apksigner.bat
个文件,它是对apk文件进行签名的工具。
我正在将此文件复制到包含一组命令的数组中,
cmd[1]="C:/Users/Fname Lname/AppData/Local/Android/Sdk/build-tools/27.0.3/apksigner.bat"
使用以下命令进行实际签名操作
"${cmd[1]}" sign --ks "$PATH_TO_JKS_KEY" --out "$outputfile" "$inputfile"
以上命令失败,并显示以下消息,
'C:\Users\Fname' is not recognized as an internal or external command,
operable program or batch file.
我认为问题出在命令路径中Fname Lname之间的空格。
令人惊讶的是,另一个命令完全按照这种方式工作,如下所示
cmd[0]="C:/Users/Fname Lname/AppData/Local/Android/Sdk/build-tools/27.0.3/zipalign"
"${cmd[0]}" -v -p 4 "$inputfilepath" "$outputfilepath"
此命令路径在Fname和Lname之间也有空格。
环境:
Windows 10
Command runs under git bash.
怎么了?
更新1
根据Nahuel Fouilleul在评论部分的建议,我在错误代码之前添加了以下代码
printf "'%s'\n" "${cmd[@]}"
set -x
以下结果出现在屏幕上
'C:/Users/Fname Lname/AppData/Local/Android/Sdk/build-tools/27.0.3/zipalign'
'C:/Users/Fname Lname/AppData/Local/Android/Sdk/build-tools/27.0.3/apksigner.bat'
+ echo ''
+ echo 'ANDROID Apk sign operation in progress'
ANDROID Apk sign operation in progress
+ 'C:/Users/Fname Lname/AppData/Local/Android/Sdk/build-tools/27.0.3/apksigner.bat' sign --ks 'C:\Projects\Dummy\app/my-app/upload_android.jks' --out '/c/Users/Fname Lname/Desktop/cmd_test/test/20-Nov-2018_18-36-14_IST/my-app-release.apk' '/c/Users/Fname Lname/Desktop/cmd_test/test/20-Nov-2018_18-36-14_IST/my-app-release-zipalign.apk'
'C:\Users\Fname' is not recognized as an internal or external command,
operable program or batch file.
+ '[' 1 '!=' 0 ']'
+ echo 'Android apk signing failed'
Android apk signing failed
+ abortRestore gyh5dd9e65ba174f44cd2fe92c4093ed240cda06
+ git reset --hard gyh5dd9e65ba174f44cd2fe92c4093ed240cda06
HEAD is now at gyh5dd9 This is restore point test case
+ '[' 0 '!=' 0 ']'
+ exit 1
更新2
在Charles Duffy发表评论后,我尝试在Mac上运行也很好,当我使用Windows编辑器软件(Notepad ++)时,又遇到了另一个问题,该软件在每行末尾添加了\ r(回车) ,导致脚本执行失败(Link to carriage return issue),所以现在我决定开始在Mac计算机而不是Windows上处理脚本。
Charles重要的评论:
基本上,使用转义的名称调用Windows应用程序需要知道该特定应用程序如何转义其命令行,因为在Windows上,每个程序都负责将作为命令行传递给它的字符串解析到其参数列表中。相比之下,在UNIX上,程序是从数组而不是单个字符串开始的...因此Windows可移植性层需要猜测如何将传递给UNIX sysexec的execv系列的独立字符串的数组更改为单个字符串。一种本机Windows调用程序可以理解的方式。