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

时间: 2024-11-05 21:54:11

PHP通过exec函数实现对APK自动签名的相关文章

使用ANT实现对web项目的自动更新 编译 打包

在服务器上无法使用eclipse来打包.需采用ant方式 附件中是ant所需要的svn插件 并在ant/lib下面删除:svnjavahl.jar,javasvn.jar http://panyongzheng.iteye.com/blog/1271184 <?xml version="1.0" encoding="UTF-8"?> <project name="cim" default="deploy" b

用 Python 脚本实现对 Linux 服务器的监控

hon 分享到:8 原文出处: 曹江华 目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件).glances(资源监控工具)在实际工作中,Linux 系统管理员可以根据自己使用的服务器的具体情况编写一下简单实用的脚本实现对 Linux 服务器的监控. 本文介绍一下使用 Python 脚本实现对 Linux 服务器 CPU 内存 网络的监控脚本的编写. Python 版本说明 Python 是由 Guido va

在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试

from:http://m.blog.csdn.net/article/details?id=51075023 在VS2015中先创建C#项目,然后再创建要编写的动态库DLL项目,这样做的好处是整个解决方案的编程环境是C#模式,这样就可以有很多智能的提示或快捷的编程方式在整个解决方案中都可以使用. 一:创建C#控制台应用程序:用于调用C++编写的DLL (1)启动VS2015>文件>新建>项目,在弹出的新建项目对话框中按下图进行选择填写,先填写项目的名称,再修改解决方案的名称. (2)项

51单片机实现对24C02进行页写、顺序读取并显示验证

源:51单片机实现对24C02进行页写.顺序读取并显示验证 //************************************************************************************* //**程序名称:51单片机实现对24C02进行页写.顺序读取并显示验证 //**编写人:**** //**修改人:**** //**程序目的:熟悉I2C总线协议,实现51模拟I2C时序和24C02通信 //**功能描述:51单片机将8个字节数据写入24C02的一

Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这部分内容需要以下Jar包支持 mysql-connector:MySQL数据库连接驱动,架起服务端与数据库沟通的桥梁: MyBatis:一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架: log4j:Apache的开源项目,一个功能强大的日志组件,提供方便的日志记录: 修改后的pom.xm

Android下通过root实现对system_server中binder的ioctl调用拦截

Android下通过root实现对system_server中binder的ioctl调用拦截 分类: Android2013-06-19 18:09 779人阅读 评论(0) 收藏 举报 作 者: Passion时 间: 2012-10-18,13:53:53链 接: http://bbs.pediy.com/showthread.php?t=157419 Android下通过root实现对system_server中binder的ioctl调用拦截作者:passion2012-10-18关键

fork和exec函数

#include<unistd.h> pid_t fork(void); 返回:在子进程中为0,在父进程中为子进程IO,若出错则为-1 fork最困难之处在于调用它一次,它却返回两次.它在调用进程(称为父进程)中返回一次,返回值是新派生进程(称为子进程)的进程ID号:在子进程中又返回一次,返回值为0.因此,返回值本身告知当前进程是子进程还是父进程. fork在子进程返回0而不是父进程的进程ID的原因在于:任何子进程只有一个父进程,而子进程总是可以通过getppid取得父进程的进程ID.相反,父

用C/C++实现对STORM的运行信息查看和控制

最近公司有个需求,需要在后端应用服务器上实时获取STORM集群的运行信息和topology相关的提交和控制,经过几天对STORM UI和CMD源码的分析,得出可以通过其thrift接口调用实现这些功能.先下载一个thrift库进行编码和安装.关于thrift可以参见这个地方.安装完成后,从STORM源码中将storm.thrift拷贝到thrift目录下.输入: hrift -gen cpp storm.thrift 会得到一个gen-cpp目录,里面就是thrift先关脚本的C++实现.我们先

用 Python 脚本实现对 Linux 服务器的网卡流量监控

*这篇文章网上已经有相关代码,为了加深印象,我做了相关注释,希望对朋友们有帮助 工作原理:基于/proc文件系统 Linux 系统为管理员提供了非常好的方法,使其可以在系统运行时更改内核,而不需要重新引导内核系统,这是通过/proc 虚拟文件系统实现的./proc 文件虚拟系统是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做"/proc"),这个伪文件系统允许与内核内部数据结构交互,获取有关进程的有用信息,在运行中(on the fly)改变设置(通过改变内核参