Я пишу небольшой скрипт, который сгенерирует подписанный 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.
Environment:
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
После комментариев Чарльз Даффи Я попытался запустить на Mac, это работало хорошо, и ястолкнулся с еще одной проблемой, когда я использовал программное обеспечение Windows Editor (Notepad ++), которое добавляло \ r (возврат каретки) в конец каждой строки, вызывая сбой выполнения скрипта ( Ссылка на проблему возврата каретки ), так что теперьЯ решил начать работу над сценарием на компьютере Mac вместо Windows.
Важный комментарий Чарльза:
в основном, для вызова приложений Windows с экранированными именами необходимо знать, как это конкретное приложениеотменяет экранирование своей командной строки, поскольку в Windows каждая программа отвечает за анализ строки, переданной ей в виде командной строки, в свой список аргументов;напротив, в UNIX программы запускаются с массива, а не с одной строки ... поэтому слой переносимости Windows должен угадать, как изменить массив отдельных строк, передаваемых в семейство execv системных вызовов UNIX, в одну строку вспособ, которым программа, называемая родной Windows, поймет.