php编译apk,PHP打包apk 如何实现 - PHP - 论坛

513e0ae2403962738148e2d46f6ed753.png

@Ta

/ 2019-03-30

Thinkphp5.0.24 服务层

创建对象 server_app_builder

调用  ->dirve() //主方法即可开始 在线生成其他网站对接的APP,并且自动进行360加固

如有兴趣,可以发你成品学习参考

/**

* Created by PhpStorm. IEDUser: admin

* Powery by 猫腻王子

* major-> Mobile Application develop Class

* Date: 2019/3/25 14:59

*/

namespace app\taskapi\servers;

use app\common\model\AppBuilderTasks;

use think\Debug;

/*

*app_builder 服务端

*return ['running_time','memory_userd','invalid_qq','curl_times'];

*/

class server_app_builder

{

/*

* 开发人员文档:

* 修改器应该为当前命名的 __CLASS__.vendor命名,系统将会自动引入,并且默认执行 main主方法

*================================================================================

* 任务列队 (Double) status 详情:

* // 0正等待系统接收->0.1列队锁等待中->0.2资源不存在->0.3读写权限失败->1.1开启解包 1.2解包失败->1.3解包成功 ->2.1进行修改器->3进行打包->3.2打包错误->3.3打包成功->4本地签名

//->5.1加固签名导入->5.2加固签名导入失败->5.3签名导入成功

/

6.1加固开始->6.2加固失败->6.3加固成功->6.4加固完毕,生成完毕

*/

public $resources_path; //资源路径

public $decompile_path; //解包资源路径

public $apktmp_path;    //打包临时占用位子

public $tool_path;   //操作工具

public $apktool_framework;//框架路径

public $complete_nosign;//生成好的初级包

public $complete_sign;//生成好的签名初级包

public $java_env_path;//java环境目录

public $jiagu360_path;//360加固地方

public $msg;

/**

* @return array

* 服务层 APP反汇编生成 执行驱动

*/

public  function dirve(){

Debug::remark(__CLASS__);

$this->tool_path   = ROOT_PATH.'tmp/tools/';

$this->resources_path = ROOT_PATH.'tmp/resources/';

$this->decompile_path = ROOT_PATH.'tmp/decompile/';

$this->apktmp_path    = ROOT_PATH.'tmp/apktmp/';

$this->complete_nosign= ROOT_PATH.'tmp/complete_nosign/';

$this->apktool_framework=ROOT_PATH.'tmp/apktool_framework/';

$this->complete_sign  = ROOT_PATH.'tmp/complete_sign/';

$this->jiagu360_path  = ROOT_PATH.'tmp/jiagu360/';

$this->java_env_path='D:\env\jdk\bin\\';

// AOP  动作

$limit=1;

$mysql_result=AppBuilderTasks::where('status','

->order('create_time','desc')

->limit($limit)

->select();

if($mysql_result) {

foreach ($mysql_result as $item) {

$this->colony($item);

$this->save_log($item);//记录到日志

$this->task_lock($item,false,'u');

}

}else{

$this->msg[]='系统暂无任务';

}

return [

'running_time'=>Debug::getRangeTime(__CLASS__,null),

'memory_userd'=> Debug::getRangeMem(__CLASS__,null),

'exec_msg'=>$this->msg

];

}

/**

* @param $app_task 任务列队

* @return array

* 批量执行一个任务列队

* 防止用户恶意填写执行参数,或者系统自身错误。请把task_return 错误捕捉,记录到数据库。

*/

private function colony($app_task)

{

//列队锁

if(!$this->task_lock($app_task)){

$this->task_status($app_task,'0.1');

return false;

}

$this->task_lock($app_task,false,'w');//锁住

//资源存在?

if(!$this->resource_has($app_task['resource'])){

$this->task_status($app_task,'0.2');

return false;

}

//可读写??

if(!$this->write_file()){

$this->task_status($app_task,'0.3');

return false;

}

//解包

$this->task_status($app_task,'1.1');

if(!$this->decompile($app_task['resource'])){

$this->task_status($app_task,'1.2');

return false;

}

$this->task_status($app_task,'1.3');

$this->task_status($app_task,'2.1');

if(!$this->update_resource($app_task)){

$this->task_status($app_task,'2.2');

return false;

}

$this->task_status($app_task,'2.9');

$this->task_status($app_task,'3.1');

if(!$this->app_compile($app_task)){

$this->task_status($app_task,'3.2');

return false;

}

$this->task_status($app_task,'3.3');

$this->task_status($app_task,'4.1');

if(!$this->app_sign($app_task)) {

$this->task_status($app_task,'4.2');

return false;

}

$this->task_status($app_task,'4.3');

$this->task_status($app_task,'5.1');

if(!$this->jiagu_360_importsign('2727450911','sign2','2727450911')){  //导入东西

$this->task_status($app_task,'5.2');

return false;

}

$this->task_status($app_task,'5.3');

$this->task_status($app_task,'6.1');

if(!$this->jiagu_360_builder($app_task)){

$this->task_status($app_task,'6.2');

return false;

}

$this->task_status($app_task,'6.4');

//$this->jiagu_360_login('272745091@qq.com','');

//$this->jiagu_360_importsign('2727450911','sign2','2727450911');

// $this->jiagu_360_verifying_sign();

//$this->jiagu_360_builder($app_task);

return true;

}

/**

* @param $app_task

* @param $code

* 记录状态哦

*/

protected function task_status($app_task,$code){

AppBuilderTasks::update(['status'=>$code],['md5name'=>$app_task['md5name']]);

}

protected function save_log($app_task){

$log='';

if($this->msg==null){

return;

}

foreach ($this->msg as $msg){

$log.=$msg.'
';

}

AppBuilderTasks::update(['log'=>$log,'complete_time'=>date("Y-m-d H:i:s")],['md5name'=>$app_task['md5name']]);

}

/**

* 防止系统解包资源不存在

* @param $resource_name

* @return bool

*/

protected function resource_has($resource_name){

if(file_exists($this->resources_path.$resource_name)){

return true;

}

return false;

}

/**

* @param $resource_name

* @return bool 任务列队锁

*/

protected function task_lock($resource,$ischeck=true,$uw='w'){

if($ischeck!==true){

if($uw=='w'){

file_put_contents($this->resources_path.$resource['resource'].'.lock','任务锁定'.date("Y-m-d H:i:s"));

return true;

}else{

unlink($this->resources_path.$resource['resource'].'.lock');

return true;

}

}

if(file_exists($this->resources_path.$resource['resource'].'.lock')){

return false;

}

return true;

}

/**

* 检查 两个目录的权限

* @param $account

* @return bool

*/

protected function write_file(){

if(!file_put_contents($this->decompile_path.'test.txt','test')){

$this->msg[]='服务器内部权限问题!无法写入解包目录'.$this->decompile_path;

return false;

}

unlink($this->decompile_path.'test.txt');

if(!file_put_contents($this->apktmp_path.'test.txt','test')){

$this->msg[]='服务器内部权限问题!无法写入临时解包目录'.$this->apktmp_path;

return false;

}

unlink($this->apktmp_path.'test.txt');

return true;

}

/**

* 解压资源包文件夹

* @param $resource_name

* @param $account

* @return bool

*/

protected function decompile($resource_name){

//如果资源解包完成

$resource_name_name=str_replace('.','',$resource_name);

if(is_dir($this->decompile_path.$resource_name_name)){

$this->msg[]='ok';

return true;

}

//防止禁止了exec运行

if(in_array('exec',explode(',',ini_get('disable_functions ')))){

$this->msg[]='服务器内部权限问题!exec被禁止了';

return false;

}

//资源不存在添加文件夹包

if(!file_exists($this->decompile_path.$resource_name_name))

{

$this->msg[]='创建文件夹给与解包';

mkdir($this->decompile_path.$resource_name_name,0777,true);

}

if(!is_dir($this->decompile_path.$resource_name_name))

{

$this->msg[]='服务器内部权限问题!无法新建资源包目录'.$this->apktmp_path;

return false;

}

$resource_name=escapeshellarg ($this->resources_path.$resource_name); //原包资源路径

$decompile_tmp=escapeshellarg($this->decompile_path.$resource_name_name.'/');//解包文件夹

$cmd=escapeshellcmd($this->java_env_path.'java -jar '.$this->tool_path.'apktool.jar'.'  d -f -s  '.$resource_name.' -o '.$decompile_tmp.' -p '.$this->apktool_framework);

exec($cmd,$systemout);

if($systemout===1){

$this->msg[]='执行解原始包指令失败!';

return false;

}

return true;

}

/**

* 0创建任务->1开启解包->2进行修改器

* @param $resource_name

* @return bool

*/

protected function update_resource($resource){

return true;

}

/**

* 0创建任务->1开启解包->2进行修改器->3进行打包

* 进行打包 生成特定md5包名,保存到

*/

protected function app_compile($app_task){

$complete_nosign_md5nameAPK=$this->complete_nosign.$app_task['md5name'].'.apk';

$resource_name_name=str_replace('.','',$app_task['resource']);

$decompile_tmp=escapeshellarg($this->decompile_path.$resource_name_name.'/');//解包文件夹

$cmd=$this->java_env_path.'java -jar '.$this->tool_path.'apktool.jar'.' b  '.$decompile_tmp.' -o  '.$complete_nosign_md5nameAPK.' -p '.$this->apktool_framework;

exec(escapeshellcmd($cmd),$systemout);

if($systemout===1){

$this->msg[]='生成初级包指令失败';

return false;

}

$this->msg[]='生成初级包指令成功';

return true;

}

/**

* 0创建任务->1开启解包->2进行修改器->3进行打包->4签名APP并且移动下载目录(完成)

*/

protected function app_sign($app_task){

$complete_nosign_md5nameAPK=$this->complete_nosign.$app_task['md5name'].'.apk';

$complete_sign_md5nameAPK=$this->complete_sign.$app_task['md5name'].'.apk';

$cmd=$this->java_env_path.'java -jar '.$this->tool_path.'signapk.jar  '.$this->tool_path.'sign.pem '.$this->tool_path.'sign.pk8  '.$complete_nosign_md5nameAPK.' '.$complete_sign_md5nameAPK;

exec(escapeshellcmd($cmd),$systemout);

if($systemout===1){

$this->msg[]='生成初级签名包指令失败';

return false;

}

$this->msg[]='生成初级签名包指令成功';

return true;

}

/**

* @param $username

* @param $passwd

* 360登陆

*/

protected function jiagu_360_login($username,$passwd){

$cmd=$this->java_env_path.'java -jar '.$this->tool_path.'jiagu/jiagu.jar  –login  '.$username.' '.$passwd;

$cmd=escapeshellcmd($cmd);

exec($cmd,$sysout);

foreach ($sysout as $s){

if(strpos($s,'success')!==false){

$this->msg[]='360账号登陆成功';

}

}

}

/**

* @param $resource

* 360加固完毕

*/

protected function jiagu_360_builder($resource){

$this->tmp_false=false;

//$complete_sign_md5nameAPK=$this->complete_sign.$resource['md5name'].'.apk';

$complete_sign_md5nameAPK=$this->complete_nosign.$resource['md5name'].'.apk';

if(!file_exists($this->jiagu360_path.$resource['md5name'].'apk')){

mkdir($this->jiagu360_path.$resource['md5name'].'apk',0777,true);

}

$complete_360_jiaguAPK= $this->jiagu360_path.$resource['md5name'].'apk';

$cmd=$this->java_env_path.'java -jar '.$this->tool_path.'jiagu/jiagu.jar -jiagu '.$complete_sign_md5nameAPK.' '.$complete_360_jiaguAPK.' -autosign  -automulpkg';

exec($cmd,$system);

foreach ($system as $sys){

$sys= iconv('gbk','UTF-8',$sys);

if(strpos($sys,'#')!==false || strpos($sys,'下载进度')!==false || strpos($sys,'上传进度')!==false || $sys==''){

continue;

}

$this->msg[]='360加固->'.$sys;

if(strpos($sys,'任务完成')!==false){

$this->tmp_false=true;

}

}

return $this->tmp_false;

}

/**

* @param $resource

* 360导入签名

*/

protected function jiagu_360_importsign($key1,$aliasName,$aliaskey2){

$cmd=$this->java_env_path.'java -jar '.$this->tool_path.'jiagu/jiagu.jar -importsign '.$this->tool_path.'sign.keystore '.$key1.' '.$aliasName.' '.$aliaskey2;

exec($cmd,$system);

foreach ($system as $sys){

if(strpos($sys,'signer saving succeed.')!==false){

$this->msg[]='360加固->签名导入成功!';

return true;

}

}

return false;

}

/**

* @return mixed

* 签名验证

*/

protected function jiagu_360_verifying_sign(){

$cmd=$this->java_env_path.'java -jar '.$this->tool_path.'jiagu/jiagu.jar  –showsign';

exec($cmd,$system);

return $system;

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值