PHP通過exec函數實現對APK自動簽名
公司開發的Android應用,因為在不同平臺下簽名文件不一樣,需要分別進行簽名,這個很麻煩,於是要求在公司的後臺管理系統中能夠對上傳的APK文件,自動使用不同平臺的簽名文件完成簽名,這樣只需要上傳一次文件就得到所有平臺簽名後的APK了,分發起來方便不少。
具體如何對APK文件進行簽名,網上有很多文章,請自行搜索。考慮到整個簽名過程使用的命令比較多,於是寫了個腳本來完成簽名,這樣在PHP中只需要通過exec()函數執行這個腳本就好了。
思路是沒錯的,但是寫好了腳本以後,PHP執行腳本的時候卻出了問題,windows下的腳本沒有問題,linux的腳本不行,exec()的output參數返回為{}
遂對後臺腳本逐行註釋,最終發現是在執行jar、jarsigner命令時失敗,這幾個命令根本沒有被執行,在網上搜了半天,發現說法大多如下:
1、 權限不夠,要提升PHP exec()的權限為sudo,且要免密碼;
2、 PHP exec()只能執行系統原生命令,不能執行後面安裝的第三方應用的命令;
對於說法1,試用了如下方法:
1、 設置php-fpm.conf的user參數為root,用php-fpm –R命令啟動PHP,此時php-fpm進程的用戶為root;
2、 php-fpm默認用戶為nginx,將該用戶添加到sudoers
以上方法均驗證失敗。
最後偶然發現,原來不是權限問題,也不是exec()只能執行原生命令,原來是路徑問題,本來已經將jar、jarsigner命令添加到系統PATH參數下了,但是不知道為什麽,在exec()函數中似乎沒有識別PATH參數,也就沒有找到jar、jarsigner命令,所以導致簽名失敗,最終的腳本如下(紅色部分代碼是特意為第三方命令添加路徑的):
#SOR_NAME=FlyingStone-v2.0.4 #SOR_FILE=$SOR_NAME.apk #PASS=By51096188 #KEY_STORE=beyondscreen.keystore #PLAT_FORM=samsung #KEY_STORE_ALIAS=bygame DIR="$1" SOR_NAME="$2" PASS="$3" KEY_STORE="$4" PLAT_FORM="$5" KEY_STORE_ALIAS="$6" SOR_FILE=$SOR_NAME.apk JAVA_BIN=/usr/local/java/jdk1.8.0_144/bin #進入到工作目錄,待簽名APK在這個目錄下 cd $DIR #建立temp子目錄,且將待簽名APK拷貝到temp子目錄 if [ -d temp ]; then rm -rf temp fi mkdir temp cp $SOR_FILE temp/$SOR_FILE #進入temp子目錄,將待簽名APK解壓,並刪除META-INF子目錄下原來的簽名文件 #因為如果帶有簽名文件,會導致簽名失敗 cd temp "$JAVA_BIN"/jar -xf $SOR_FILE rm $SOR_FILE cd META-INF rm -f *.RSA rm -f *.SF cd .. #將temp目錄下的文件重新打包為新的APK文件,用來進行簽名 "$JAVA_BIN"/jar -cvf0 ../"$SOR_NAME"_new.apk ./ cd .. #對新的APK文件進行簽名 "$JAVA_BIN"/jarsigner -verbose -storepass $PASS -keystore $KEY_STORE -signedjar "$SOR_NAME"-signed-"$PLAT_FORM".apk "$SOR_NAME"_new.apk $KEY_STORE_ALIAS rm "$SOR_NAME"_new.apk rm -f -R temp |
本文出自 “rainman” 博客,請務必保留此出處http://lancelot.blog.51cto.com/393579/1969087
PHP通過exec函數實現對APK自動簽名