php上传apk后自动提取apk包信息的使用(示例下载)
php  /  管理员 发布于 7年前   222
/*** * 分析已上传的APK文件,提取所需要的数据 */ function upAPK(){ global $_config_product_apktool_count;//使用apktool.jar解压的次数,原因下面有说明。 if($this->msg!='')return;//如果有错误,返回 $dir=$this->upload_path;//上传路径 $stringsXML_exists=false; if(file_exists($dir.'package/res/values/strings.xml'))unlink($dir.'package/res/values/strings.xml'); for($i=0;$i<$_config_product_apktool_count && !$stringsXML_exists;$i++){ //针对UC的APK包或其类似的APK包,解压一次并不能完全得到strings.xml文件或相关文件。目前只有采用这个办法了。 //在系统cmd下直接使用java -jar ...执行解压,有时可以得到strings.xml文件,有时也得不到,不知道是不是jar包的问题。 exec('java -jar ../apktool.jar d -f '.$this->tmpFile.' '.$dir.'package');//注释:解压完毕再往下执行 $stringsXML_exists=file_exists($dir.'package/res/values/strings.xml'); } //检查AndroidManifest.xml文件是否存在,如果不存在,则不是合法的APK文件 if(!file_exists($dir.'package/AndroidManifest.xml')){$this->msg='不是合法的APK文件,请重新上传!';return;} $AndroidManifestXML=file_get_contents($dir.'package/AndroidManifest.xml');//读取AndroidManifest.xml if(preg_match('/package=\"([^\"]*)\"/i',$AndroidManifestXML,$package))$returnVal['package']=$package[1];//如果有包名,返回到数组 //增加versionCode if(preg_match('/versionCode=\"([^\"]*)\"/i',$AndroidManifestXML,$versionCode))$returnVal['versionCode']=$versionCode[1];//如果有版本代码,返回到数组 //检测到包名后判断数据库中是否已经存在。 if($this->id==0){//添加新产品时检测,修改产品不检测 if($returnVal['package']!=''){ $sql='select id from product where package='.SqlEncode($package[1]); $result=mysql_query($sql); if(mysql_num_rows($result)>0){ $this->msg='该APK已经存在,请更换!'; return; } }else{ $this->msg='系统无法检测该APK信息,请联系管理员!'; return; } } if($stringsXML_exists)$stringXML=file_get_contents($dir.'package/res/values/strings.xml');//如果有strings.xml则读取strings.xml文件 if(preg_match('/versionName=\"([^\"]*)\"/i',$AndroidManifestXML,$ver))$returnVal['ver']=$ver[1];//如果有版本号,返回到数组 //版本号的情况目前发现有两种:1、版本号在AndroidManifest.xml中直接列出;通过以上正则即可提取 //2、版本号同label一样,放到strings.xml文件中 //2011-11-23 add if($stringXML!='' && strstr($ver[1],'@')){ if(preg_match('/^@string\/(.*)/i',$ver[1],$findVer)){ if(preg_match('/([^<]*)<\/string>/',$stringXML,$a))$returnVal['ver']=$a[1]; } } //////////////////////////////////////////// if(preg_match('/ if($stringsXML_exists && preg_match('/ if(preg_match('/([^<]*)<\/string>/',$stringXML,$name)){ $returnVal['name']=$name[1];//如果有产品名称,返回到数组 /** 百度:strings.xml 特殊情况1:" 掌上百度 " */ $returnVal['name']=preg_replace('/\s|"/','',$returnVal['name']); } } //$this->msg=$returnVal['package'].'--'.$returnVal['ver'].'--'.$returnVal['thumbimg'].'--'.$returnVal['name']; if($this->oldAPK!=''){//重新上传则删除原apk文件和icon.png图片 unlink($dir.$this->oldAPK); unlink($dir.$this->oldAPK.'.png'); } //遍历package/res目录下的目录[drawable|drawable-hdpi|drawable-nodpi|drawable-ldpi|drawable-mdpi] //系统取icon尺寸最大的图标 $tmpArr[0]=0;$tmpArr[1]=0;$tmpArr[2]='drawable'; $dirs=opendir($dir.'package/res'); while(($file=readdir($dirs))){ preg_match('/(drawable(-.*?dpi)?)/i',$file,$drawable_folder); $iconPath=$dir.'package/res/'.$drawable_folder[1].'/'.$returnVal['thumbimg'].'.png'; if(file_exists($iconPath)){ $iconInfo=getimagesize($iconPath); if($iconInfo[0]>$tmpArr[0] && $iconInfo[1]>$tmpArr[1]){ $tmpArr[0]=$iconInfo[0];$tmpArr[1]=$iconInfo[1];$tmpArr[2]=$drawable_folder[1]; } } } //$this->msg=$iconInfo[0].'---'.$iconInfo[1]; closedir($dirs); if(rename($dir.'package/res/'.$tmpArr[2].'/'.$returnVal['thumbimg'].'.png',$dir.$this->iframe_key.'.apk.png')){//找到目录并成功移动 $returnVal['thumbimg']=$this->iframe_key.'.apk.png'; } if(!move_uploaded_file($this->tmpFile,$dir.$this->iframe_key.'.apk')){$this->msg='上传失败!';return;}//转移apk文件 $returnVal['filename']=$this->iframe_key.'.apk'; $returnVal['size']=$this->size; $this->result=$returnVal; }
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号