1. 程式人生 > >PHP通過exec函數實現對APK自動簽名

PHP通過exec函數實現對APK自動簽名

php android apk簽名

公司開發的Android應用,因為在不同平臺下簽名文件不一樣,需要分別進行簽名,這個很麻煩,於是要求在公司的後臺管理系統中能夠對上傳的APK文件,自動使用不同平臺的簽名文件完成簽名,這樣只需要上傳一次文件就得到所有平臺簽名後的APK了,分發起來方便不少。


具體如何對APK文件進行簽名,網上有很多文章,請自行搜索。考慮到整個簽名過程使用的命令比較多,於是寫了個腳本來完成簽名,這樣在PHP中只需要通過exec()函數執行這個腳本就好了。


思路是沒錯的,但是寫好了腳本以後,PHP執行腳本的時候卻出了問題,windows下的腳本沒有問題,linux的腳本不行,exec()output參數返回為{}

,查看後臺文件發現也確實沒有生成簽名文件。


遂對後臺腳本逐行註釋,最終發現是在執行jarjarsigner命令時失敗,這幾個命令根本沒有被執行,在網上搜了半天,發現說法大多如下:

1、 權限不夠,要提升PHP exec()的權限為sudo,且要免密碼;

2、 PHP exec()只能執行系統原生命令,不能執行後面安裝的第三方應用的命令;

對於說法1,試用了如下方法:

1、 設置php-fpm.confuser參數為root,用php-fpm –R命令啟動PHP,此時php-fpm進程的用戶為root

2、 php-fpm默認用戶為nginx,將該用戶添加到sudoers

,且設置為免密碼;

以上方法均驗證失敗。

最後偶然發現,原來不是權限問題,也不是exec()只能執行原生命令,原來是路徑問題,本來已經將jarjarsigner命令添加到系統PATH參數下了,但是不知道為什麽,在exec()函數中似乎沒有識別PATH參數,也就沒有找到jarjarsigner命令,所以導致簽名失敗,最終的腳本如下(紅色部分代碼是特意為第三方命令添加路徑的):

#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自動簽名