亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

php獲取apk包信息的方法

2020-03-22 18:21:17
字體:
來源:轉載
供稿:網友
有時候在使用php上傳安卓apk包的時候,我們需要獲取安卓apk包內的信息,本文以實例形式講述了php獲取apk包信息的方法。具體實現方法如下:/*解析安卓apk包中的壓縮XML文件,還原和讀取XML內容依賴功能:需要PHP的ZIP包函數支持。*/include('./Apkparser.php');$appObj = new Apkparser(); $targetFile = a.apk;//apk所在的路徑地址$res = $appObj- open($targetFile);$appObj- getAppName(); // 應用名稱$appObj- getPackage(); // 應用包名$appObj- getVersionName(); // 版本名稱$appObj- getVersionCode(); // 版本代碼
//---------------------- html' target='_blank'>public function open($apk_file, $xml_file='AndroidManifest.xml'){ $zip = new /ZipArchive; if ($zip- open($apk_file) === TRUE) { $xml = $zip- getFromName($xml_file); $zip- close(); if ($xml){ try { return $this- parseString($xml); }catch (Exception $e){ return false; public function parseString($xml){ $this- xml = $xml; $this- length = strlen($xml); $this- root = $this- parseBlock(self::AXML_FILE); return true; public function getXML($node=NULL, $lv=-1){ if ($lv == -1) $node = $this- root; if (!$node) return ''; if ($node['type'] == self::END_TAG) $lv--; $xml = @($node['line'] == 0 || $node['line'] == $this- line) '' : "/n".str_repeat(' ', $lv); $xml .= $node['tag']; $this- line = @$node['line']; foreach ($node['child'] as $c){ $xml .= $this- getXML($c, $lv+1); return $xml; public function getPackage(){ return $this- getAttribute('manifest', 'package'); public function getVersionName(){ return $this- getAttribute('manifest', 'android:versionName'); public function getVersionCode(){ return $this- getAttribute('manifest', 'android:versionCode'); public function getAppName(){ return $this- getAttribute('manifest/application', 'android:name'); public function getMainActivity(){ for ($id=0; true; $id++){ $act = $this- getAttribute("manifest/application/activity[{$id}]/intent-filter/action", 'android:name'); if (!$act) break; if ($act == 'android.intent.action.MAIN') return $this- getActivity($id); return NULL; public function getActivity($idx=0){ $idx = intval($idx); return $this- getAttribute("manifest/application/activity[{$idx}]", 'android:name'); public function getAttribute($path, $name){ $r = $this- getElement($path); if (is_null($r)) return NULL; if (isset($r['attrs'])){ foreach ($r['attrs'] as $a){ if ($a['ns_name'] == $name) return $this- getAttributeValue($a); return NULL;//----------------------// 類型常量定義//---------------------- const AXML_FILE = 0x00080003; const STRING_BLOCK = 0x001C0001; const RESOURCEIDS = 0x00080180; const START_NAMESPACE = 0x00100100; const END_NAMESPACE = 0x00100101; const START_TAG = 0x00100102; const END_TAG = 0x00100103; const TEXT = 0x00100104; const TYPE_NULL =0; const TYPE_REFERENCE =1; const TYPE_ATTRIBUTE =2; const TYPE_STRING =3; const TYPE_FLOAT =4; const TYPE_DIMENSION =5; const TYPE_FRACTION =6; const TYPE_INT_DEC =16; const TYPE_INT_HEX =17; const TYPE_INT_BOOLEAN =18; const TYPE_INT_COLOR_ARGB8 =28; const TYPE_INT_COLOR_RGB8 =29; const TYPE_INT_COLOR_ARGB4 =30; const TYPE_INT_COLOR_RGB4 =31; const UNIT_MASK = 15; private static $RADIX_MULTS = array(0.00390625, 3.051758E-005, 1.192093E-007, 4.656613E-010); private static $DIMENSION_UNITS = array("px","dip","sp","pt","in","mm","",""); private static $FRACTION_UNITS = array("%","%p","","","","","",""); private $xml=''; private $length = 0; private $stringCount = 0; private $styleCount = 0; private $stringTab = array(); private $styleTab = array(); private $resourceIDs = array(); private $ns = array(); private $cur_ns = NULL; private $root = NULL; private $line = 0;//----------------------// 內部私有函數//---------------------- private function getElement($path){ if (!$this- root) return NULL; $ps = explode('/', $path); $r = $this- root; foreach ($ps as $v){ if (preg_match('/([^/[]+)/[([0-9]+)/]$/', $v, $ms)){ $v = $ms[1]; $off = $ms[2]; }else { $off = 0; foreach ($r['child'] as $c){ if ($c['type'] == self::START_TAG && $c['ns_name'] == $v){ if ($off == 0){ $r = $c; continue 2; }else { $off--; // 沒有找到節點 return NULL; return $r; private function parseBlock($need = 0){ $o = 0; $type = $this- get32($o); if ($need && $type != $need) throw new Exception('Block Type Error', 1); $size = $this- get32($o); if ($size 8 || $size $this- length) throw new Exception('Block Size Error', 2); $left = $this- length - $size; $props = false; switch ($type){ case self::AXML_FILE: $props = array( 'line' = 0, 'tag' = ' xml version="1.0" encoding="utf-8" ' break; case self::STRING_BLOCK: $this- stringCount = $this- get32($o); $this- styleCount = $this- get32($o); $o += 4; $strOffset = $this- get32($o); $styOffset = $this- get32($o); $strListOffset = $this- get32array($o, $this- stringCount); $styListOffset = $this- get32array($o, $this- styleCount); $this- stringTab = $this- stringCount 0 $this- getStringTab($strOffset, $strListOffset) : array(); $this- styleTab = $this- styleCount 0 $this- getStringTab($styOffset, $styListOffset) : array(); $o = $size; break; case self::RESOURCEIDS: $count = $size / 4 - 2; $this- resourceIDs = $this- get32array($o, $count); break; case self::START_NAMESPACE: $o += 8; $prefix = $this- get32($o); $uri = $this- get32($o); if (empty($this- cur_ns)){ $this- cur_ns = array(); $this- ns[] = &$this- cur_ns; $this- cur_ns[$uri] = $prefix; break; case self::END_NAMESPACE: $o += 8; $prefix = $this- get32($o); $uri = $this- get32($o); if (empty($this- cur_ns)) break; unset($this- cur_ns[$uri]); break; case self::START_TAG: $line = $this- get32($o); $o += 4; $attrs = array(); $props = array( 'line' = $line, 'ns' = $this- getNameSpace($this- get32($o)), 'name' = $this- getString($this- get32($o)), 'flag' = $this- get32($o), 'count' = $this- get16($o), 'id' = $this- get16($o)-1, 'class' = $this- get16($o)-1, 'style' = $this- get16($o)-1, 'attrs' = &$attrs $props['ns_name'] = $props['ns'].$props['name']; for ($i=0; $i $props['count']; $i++){ $a = array( 'ns' = $this- getNameSpace($this- get32($o)), 'name' = $this- getString($this- get32($o)), 'val_str' = $this- get32($o), 'val_type' = $this- get32($o), 'val_data' = $this- get32($o) $a['ns_name'] = $a['ns'].$a['name']; $a['val_type'] = 24; $attrs[] = $a; // 處理TAG字符串 $tag = " {$props['ns_name']}"; foreach ($this- cur_ns as $uri = $prefix){ $uri = $this- getString($uri); $prefix = $this- getString($prefix); $tag .= " xmlns:{$prefix}=/"{$uri}/""; foreach ($props['attrs'] as $a){ $tag .= " {$a['ns_name']}=/"". $this- getAttributeValue($a). '"'; $tag .= ' $props['tag'] = $tag; unset($this- cur_ns); $this- cur_ns = array(); $this- ns[] = &$this- cur_ns; $left = -1; break; case self::END_TAG: $line = $this- get32($o); $o += 4; $props = array( 'line' = $line, 'ns' = $this- getNameSpace($this- get32($o)), 'name' = $this- getString($this- get32($o)) $props['ns_name'] = $props['ns'].$props['name']; $props['tag'] = " /{$props['ns_name']} if (count($this- ns) 1){ array_pop($this- unset($this- cur_ns); $this- cur_ns = array_pop($this- $this- ns[] = &$this- cur_ns; break; case self::TEXT: $o += 8; $props = array( 'tag' = $this- getString($this- get32($o)) $o += 8; break; default: throw new Exception('Block Type Error', 3); break; $this- skip($o); $child = array(); while ($this- length $left){ $c = $this- parseBlock(); if ($props && $c) $child[] = $c; if ($left == -1 && $c['type'] == self::END_TAG){ $left = $this- length; break; if ($this- length != $left) throw new Exception('Block Overflow Error', 4); if ($props){ $props['type'] = $type; $props['size'] = $size; $props['child'] = $child; return $props; }else { return false; private function getAttributeValue($a){ $type = &$a['val_type']; $data = &$a['val_data']; switch ($type){ case self::TYPE_STRING: return $this- getString($a['val_str']); case self::TYPE_ATTRIBUTE: return sprintf(' %s%08X', self::_getPackage($data), $data); case self::TYPE_REFERENCE: return sprintf('@%s%08X', self::_getPackage($data), $data); case self::TYPE_INT_HEX: return sprintf('0x%08X', $data); case self::TYPE_INT_BOOLEAN: return ($data != 0 'true' : 'false'); case self::TYPE_INT_COLOR_ARGB8: case self::TYPE_INT_COLOR_RGB8: case self::TYPE_INT_COLOR_ARGB4: case self::TYPE_INT_COLOR_RGB4: return sprintf('#%08X', $data); case self::TYPE_DIMENSION: return $this- _complexToFloat($data).self::$DIMENSION_UNITS[$data & self::UNIT_MASK]; case self::TYPE_FRACTION: return $this- _complexToFloat($data).self::$FRACTION_UNITS[$data & self::UNIT_MASK]; case self::TYPE_FLOAT: return $this- _int2float($data); if ($type =self::TYPE_INT_DEC && $type self::TYPE_INT_COLOR_ARGB8){ return (string)$data; return sprintf(' 0x%X, type 0x%02X ', $data, $type); private function _complexToFloat($data){ return (float)($data & 0xFFFFFF00) * self::$RADIX_MULTS[($data 4) private function _int2float($v) { $x = ($v & ((1 23) - 1)) + (1 23) * ($v 31 | 1); $exp = ($v 23 & 0xFF) - 127; return $x * pow(2, $exp - 23); private static function _getPackage($data){ return ($data 24 == 1) 'android:' : ''; private function getStringTab($base, $list){ $tab = array(); foreach ($list as $off){ $off += $base; $len = $this- get16($off); $mask = ($len 0x8) $len = $len if ($len == $mask){ if ($off + $len $this- length) throw new Exception('String Table Overflow', 11); $tab[] = substr($this- xml, $off, $len); }else { if ($off + $len * 2 $this- length) throw new Exception('String Table Overflow', 11); $str = substr($this- xml, $off, $len * 2); $tab[] = mb_convert_encoding($str, 'UTF-8', 'UCS-2LE'); return $tab; private function getString($id){ if ($id -1 && $id $this- stringCount){ return $this- stringTab[$id]; }else { return ''; private function getNameSpace($uri){ for ($i=count($this- $i ){ $ns = $this- ns[--$i]; if (isset($ns[$uri])){ $ns = $this- getString($ns[$uri]); if (!empty($ns)) $ns .= ':'; return $ns; return ''; private function get32(&$off){ $int = unpack('V', substr($this- xml, $off, 4)); $off += 4; return array_shift($int); private function get32array(&$off, $size){ if ($size = 0) return NULL; $arr = unpack('V*', substr($this- xml, $off, 4 * $size)); if (count($arr) != $size) throw new Exception('Array Size Error', 10); $off += 4 * $size; return $arr; private function get16(&$off){ $int = unpack('v', substr($this- xml, $off, 2)); $off += 2; return array_shift($int); private function skip($size){ $this- xml = substr($this- xml, $size); $this- length -= $size;//---------------------//Apkparser類包結束 //---------------------
感興趣的朋友可以調試運行一下本文實例,相信會對大家的php程序開發帶來一定的啟發。PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产成人在线| 国产精品一区二区三区久久久| 亚洲精品色婷婷福利天堂| 国产91av在线| 欧美日韩色婷婷| 成人免费视频在线观看超级碰| 亚洲精品视频在线观看视频| 日韩免费视频在线观看| 美女福利视频一区| 日韩激情av在线免费观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲第一精品久久忘忧草社区| 久久久精品一区二区| 欧美日韩国产精品一区| 青青久久aⅴ北条麻妃| 欧美另类69精品久久久久9999| 成人黄色片网站| 久久精品欧美视频| 国产精品自拍视频| 亚洲精品av在线| 日韩高清av在线| 亚洲一区免费网站| 精品成人国产在线观看男人呻吟| 日韩精品免费看| 亚洲精品日韩久久久| 亚洲国产精品va在线看黑人动漫| 7777精品久久久久久| 精品偷拍一区二区三区在线看| 欧美成人午夜激情在线| 中文字幕亚洲欧美一区二区三区| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美日韩午夜视频在线观看| 91久久精品美女| 欧美日韩视频免费播放| 国产美女精品免费电影| 久久999免费视频| 麻豆一区二区在线观看| 亚洲a成v人在线观看| 亚洲无亚洲人成网站77777| 国产一区二区久久精品| 在线观看久久久久久| 狠狠躁18三区二区一区| 欧美视频第一页| 欧美激情视频在线免费观看 欧美视频免费一| 成人免费福利视频| 亚洲综合成人婷婷小说| 亚洲国产天堂久久综合| 中文字幕欧美精品在线| 国产精品高清免费在线观看| 欧美孕妇与黑人孕交| 插插插亚洲综合网| 热re99久久精品国产66热| 欧美激情精品久久久久久蜜臀| 色综合色综合久久综合频道88| 欧美乱大交xxxxx| 欧美性受xxx| 成年无码av片在线| 欧美乱大交做爰xxxⅹ性3| 精品久久久国产精品999| 日韩av中文在线| 中文字幕欧美日韩| 精品中文字幕视频| 亚洲欧美日韩精品久久奇米色影视| 日韩精品www| 精品成人国产在线观看男人呻吟| 国产日本欧美视频| 国产精品久久久久久久7电影| 欧美日韩一区二区在线播放| 欧美福利视频在线观看| 国产成人啪精品视频免费网| 日产日韩在线亚洲欧美| 韩国日本不卡在线| 人人澡人人澡人人看欧美| 欧美另类极品videosbest最新版本| 日韩欧美在线视频免费观看| 中文字幕av一区二区| 欧美成人一区在线| 日韩av色综合| 国内精品久久久久久久久| 精品久久久久久久久久久久| 91成人性视频| 午夜精品三级视频福利| 亚洲精品福利在线| 欧美成人黄色小视频| 激情亚洲一区二区三区四区| 亚洲一区二区久久| 日本久久中文字幕| 孩xxxx性bbbb欧美| 国产精品欧美激情在线播放| 日韩欧美在线国产| 久久激情视频免费观看| 久久久亚洲天堂| 日韩精品欧美国产精品忘忧草| 久久电影一区二区| 亚洲女人天堂色在线7777| 日本精品久久电影| 亚洲欧美日韩在线一区| 日韩精品免费一线在线观看| 欧美伦理91i| 日韩欧美国产免费播放| 97视频在线观看成人| 日韩视频第一页| 91国偷自产一区二区三区的观看方式| 2019中文字幕免费视频| 最新日韩中文字幕| 欧美日韩精品二区| 日韩高清a**址| 91久久精品日日躁夜夜躁国产| 国产成人一区二区| 黑人巨大精品欧美一区二区一视频| 国产成人在线亚洲欧美| 国产精品爽黄69| 日韩美女av在线免费观看| 亚洲美女福利视频网站| 色偷偷88888欧美精品久久久| 亚洲伊人第一页| 成人精品网站在线观看| 国外成人在线播放| 国产69精品久久久久9999| 国产一区二区三区高清在线观看| 久久综合久久88| 久久九九有精品国产23| 欧美日本啪啪无遮挡网站| 欧美亚洲视频在线观看| 亚洲精品福利免费在线观看| 亚洲视频免费一区| 国产精品99久久久久久白浆小说| 日韩av一卡二卡| 91欧美激情另类亚洲| 亚洲精品福利在线| 亚洲一级黄色片| 日韩久久午夜影院| 国产精品扒开腿做爽爽爽视频| 国产91网红主播在线观看| xxxxxxxxx欧美| 国产精品678| 亚洲精品www久久久| 成人免费视频在线观看超级碰| 欧美最猛黑人xxxx黑人猛叫黄| 久久九九亚洲综合| 亚洲欧美激情视频| 97**国产露脸精品国产| 91深夜福利视频| 九九综合九九综合| 亚洲午夜精品久久久久久性色| 91精品久久久久久久久中文字幕| 午夜精品一区二区三区av| 国产日韩中文字幕在线| 久久国产精品首页| 亚洲精品99久久久久中文字幕| 97视频人免费观看| 国产精品免费电影| 超碰91人人草人人干| 久久久91精品| 日韩a**站在线观看| 国产一区私人高清影院| 97在线精品国自产拍中文| 一本色道久久88综合亚洲精品ⅰ| 91精品国产综合久久香蕉922| 九九热这里只有精品6| 国产精品中文字幕在线观看| 日韩美女福利视频| 精品毛片三在线观看| 不卡毛片在线看|