手机版

使用php上传apk后自动提取apk包信息(示例下载)

时间:2021-11-20 来源:互联网 编辑:宝哥软件园 浏览:

进入公司的第一个项目是做市场。所以后台应该上传APK软件之类的。为方便起见,上传apk后,系统会自动提取APK文件的相关信息,如APK包名、产品名称、版本信息、APK码、程序大小、ICON等。首先通过命令:Java-jar axmlprinter 2 . jar androidmanifest . XML cmdAfter.xml获取文件cmdAfter.xml,然后对cmdafter . XML文件进行分析,获取相关信息。不幸的是,apk包名可以从这个文件中获得,但ico图标文件名和其他相关信息无法获得。如下图所示

在上图中,例如,标签、图标等。都是标志值,无法直接获得所需的结果。分析了该值与APK文件内部文件的关系,但不同的APK结构不同,实现起来太麻烦。事实上,当你上传APK时,互联网上的一些网站会包含ICON图标、大小等信息。除了提取APK的包名。所以,就算别人能做到,我觉得也一定有办法解决。然后,经过研究,得出了预期的结果。在这里记下方法,欢迎交流。核心APK信息代码的复制代码如下: /*** *分析上传的APK文件,提取需要的数据*/函数up APK(){ global $ _ config _ product _ apktool _ count;//使用apktool.jar解压的次数,原因解释如下。if($this-msg!=' ')返回;//如果有错误,返回$ dir=$ this-upload _ path;//上传路径$ stringsXML _ exists=falseif(file_exists($dir。package/res/values/strings.xml ')解除链接($dir)。package/RES/values/strings . XML ');for($ I=0;$ I $ _ config _ product _ apk tool _ count!$ stringsXML _ exists$i ){ //对于UC APK包或其类似的APK包,不能通过解压一次就完全得到strings.xml文件或相关文件。目前只采用这种方法。//直接使用java -jar.要在系统cmd下解压,有时候可以拿到strings.xml文件,有时候拿不到,不知道是不是jar包。exec('java -jar./apktool.jar d -f '。$this-tmpFile。' '.$dir。包');//注意:Execute $ stringxml _ exists=file _ exists($ dir)。解压缩后的package/RES/values/strings . XML’;}//检查AndroidManifest.xml文件是否存在。如果它不存在,它就不是合法的APK文件。File _ exists ($ dir)。package/androidmanifest . XML '){ $ this-msg='不是合法的APK文件,请重新上传!';返回;} $ AnDroidManifestXMl=file _ get _ contents($ dir)。package/AnDroidManifest . XML’);//读取androidmanifest . xmlif(preg _ match('/package=\ '([\ ']*)\ '/I ',$ androidmanifestxml,$ package))$ return val[' package ']=$ package[1];//如果有包名,返回数组。//添加version code if(preg _ match('/version code=\ '([\ ']*)\ '/I ',$ androidmanifestxml,$ version code))$ return val[' version code ']=$ version code[1。//如果有版本代码,返回数组。//检测到包名后,判断数据库中是否已经存在。

if($this-id==0){//添加新产品时检测,修改产品不检测if($returnVal['package']!=''){ $sql='从产品中选择id,其中包='。SqlEncode($ package[1]);$ result=MySQL _ query($ SQL);if(MySQL _ num _ rows($ result)0){ $ this-msg='该APK已经存在,请更换!';返回;} }else{ $this-msg='系统无法检测该APK信息,请联系管理员!';返回;} } if($ StringsXMl _ exists)$ StringXMl=file _ get _ contents($ dir).包/RES/值/字符串。XML ');//如果有strings.xml则读取strings.xml文件if(preg_match('/versionname=\'([^\']*)\'/i',$androidmanifestxml,$ver))$returnval['ver']=$ver[1];//如果有版本号,返回到数组//版本号的情况目前发现有两种:1、版本号在AndroidManifest.xml中直接列出;通过以上正则即可提取//2、版本号同标签一样,放到strings.xml文件中//2011-11-23添加if($stringXML!=' ' strtr($ ver[1],' @ '){ if(preg_match('/^@string\/(.*)/i ',$ver[1],$ FindVer)){ if(preg _ match('/string name=\ ').$findVer[1].'\'([^]*)\/string/',$stringxml,$a))$returnval['ver']=$a[1];} } /////如果(preg _ match(//应用[\ S \ S]*?android:icon='@drawable\/([^']*)'/i',$androidmanifestxml,$icon))$returnval['thumbimg']=$icon[1];//如果有图标,返回到数组如果($ StringsXMl _ exists preg _ match('/application[\ S \ S]*?android:label='@string\/([^']*)'/i',$androidmanifestxml,$label)){ if(preg _ match('/string name=\ ').$标签[1].'\'([^]*)\/string/',$stringxml,$name)){ $ return val[' name ']=$ name[1];//如果有产品名称,返回到数组/** 百度:strings.xml特殊情况1:字符串名称='app_name ' '掌上百度/string */$ returnVal[' name ']=preg _ replace('/\ s | '/','',$ returnVal[' name ']);} }//$ this-msg=$ returnVal[' package '].- '.$returnVal['ver'].- '.$returnVal['拇指'].- '.$ returnVal[' name '];if($this-oldAPK!=''){//重新上传则删除原apk文件和icon.png图片取消链接($dir).$ this-oldAPK);取消链接($dir).$这个-oldAPK . png ';} //遍历包装/res目录下的目录[draw able | draw able-hdpi | draw able-nodpi | draw able-ldpi | draw able-mdpi]//系统取图标尺寸最大的图标$ TMParr[0]=0;$ TMParr[1]=0;$tmpArr[2]="可绘制";$dirs=opendir($dir .包/RES ');while(($ file=readdir($ dirs)){ preg _ match('/(draw able(-).*?dpi)?)/i ',$file,$ draw able _ folder);$iconPath=$dir .包/res/' .$drawable_folder[1].'/'.$ returnVal[' thumb img ']. png;if(file _ exists($ icon path)){ $ icon fo=getimagesize($ icon path);if($ icon info[0]$ TMparr[0]$ icon info[1]$ TMparr[1]){ $ TMparr[0]=$ icon info[0];$ TMParr[1]=$ icon info[1];$ TMParr[2]=$ draw able _ folder[1];} } }//$ this-msg=$ iconfo[0],”- '.$ icon info[1];close dir($ dirs);如果(重命名($dir .包/res/' .$tmpArr[2].'/'.$ returnVal[' thumbimg ']. png ',$dir .$this-iframe_key .全境通告。png '){//找到目录并成功移动$ return VaL[' thumb img ']=$ this-iframe _ key .全境通告。png ';} if(!move _ uploaded _ file($ this-TMpfile,$dir .$ this-iframe _ key . apk '){ $ this-msg='上传失败!';返回;}//转移apk文件$ returnVal[' filename ']=$ this-iframe _ key,“apk”;$ returnVal[' size ']=$ this-size;$ this-result=$ returnVal;} 提取信息流程1、首先,通过apktool.jar命令提取apk文件中package/res/values/string.xml文件。不知为什么原因,释放apk文件时,有时并不一定得到string.xml文件。所以,后台增加:$ _配置_产品_ apktool _计数参数,来控制释放的最大次数。2、读取释放根目录下的AndroidManifest.xml文件。从该文件中可以获取到APK包名、版本信息。3、检测,如果是新上传的APK,则其包名在数据库中是否存在。就是禁止上传相同包名的APK。修改时不检测。4、通过正则获取所需要的信息。这里为什么要提取string.xml文件?因为并不是所有信息,都在AndroidManifest.xml中。有的信息在AndroidManifest.xml中只是做为一个"引用",真实记录是在string.xml中的。比如AndroidManifest.xml中关于标签和图标的值

上图中:label='@string/app_name '表示string.xml中string的name属性是app_name的值,是APK的“软件名”,这里是“Market market”,如下图所示:

@ drawing able/quickflick_ICON,表示quick flick _ ICON是ICON的文件名。由于特殊需要,我需要找到最大的icon,见以下代码:复制的代码如下: //遍历package/res目录下的目录[draw able | draw able-hdpi | draw able-nodpi | draw able-ldpi | draw able-mdpi]//系统取图标大小最大的ICON,$ tmpar[0]=0;$ TMParr[1]=0;$tmpArr[2]=“可绘制”;$dirs=opendir($dir。包/RES’);while(($ file=readdir($ dirs)){ preg _ match('/(draw able(-)。*?dpi)?)/i ',$file,$ draw able _ folder);$iconPath=$dir。包/res/'。$drawable_folder[1]。'/'.$returnVal['thumbimg']。png ';if(file _ exists($ icon path)){ $ icon fo=getimagesize($ icon path);if($ icon info[0]$ tmpArr[0]$ icon info[1]$ tmpArr[1]){ $ tmpArr[0]=$ icon info[0];$ TMParr[1]=$ icon info[1];$ TMParr[2]=$ draw able _ folder[1];} } }//$ this-msg=$ iconfo[0]。' - '.$ icon info[1];close dir($ dirs);经过分析,存储在通用APK的ICON ICONs存储在以下目录中:drawing able | drawing able-hdpi | drawing able-nodpi | drawing able-ldpi | drawing able-mdpi。最大的图标图标通过遍历和比较获得,然后移动到临时目录。将所有要提取的信息保存到数组中,并通过javascript将其写入表单。如下图所示:

提取APK信息并总结以上代码。到目前为止,在提取和上传的APK中,信息可以正常提取,没有发现错误。从上面代码中的注释也可以看出,“掌上百度”的APK因为其特殊的处理方式,无法提取信息,即:字符串名称=‘app _ name’‘掌上百度’/字符串,他在名称中加了双引号,属于特例。我还没有发现更多的特例,所以可能会有特例,需要在节目中分析APK数据,做特殊处理。在实现这个APK抽取功能的过程中,关键是找到APK包的组织规则。只有找到了规则,程序实现才是顺理成章的事情。发布APK文件(' Java-jar)的关注内容执行./apktool.jar d-f '。$这个-tmpfile。''.$ dir。包');要成功执行上述语句,必须满足以下条件:1。安装java包。对于java目录,用户用户组的权限包括:读取和运行,列出文件夹目录,读取2。cmd.exe档案;用户用户组的权限包括:读取和运行、读取3。允许PHP调用exec4上传目录必须确保有写入文件的权限。如果有更好的提取方法,欢迎大家交流学习。从PHP DEMO中提取APK信息演示下载地址:http://xiazai.jb51.net/201304/yuanma/php_apk_jb51net.rar.

版权声明:使用php上传apk后自动提取apk包信息(示例下载)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。