星哥的博客

  • 首页
  • 系统
  • 虚拟机
  • 网站开发
  • 硬件外设
  • VPS/云主机
  • 心情随笔
  1. 首页
  2. Android系统
  3. 正文

【转】使用php取得android APK文件信息和图标

2013年2月1日 3363点热度 12人点赞 0条评论

虽然php不能直接获取android APK软件包的信息,但是可以通过调用google发行的android-apktool来取得文件信息的,需要exec支持。

首先需要安装android-apktool:

wget http://android-apktool.googlecode.com/files/apktool-install-linux-2.2_r01-1.tar.bz2
tar -jxvf apktool-install-linux-2.2_r01-1.tar.bz2
mv aapt /usr/bin
mv apktool /usr/bin
chmod 0755 /usr/bin/aapt
chmod 0755 /usr/bin/apktool
以下是从一个类中提取出的一个方法,这个方法可以把APK文件信息取出到一个数组中,还可以从APK文件中提取出ICON图标!

/**

     *
     * 需要exec支持
     * @var $apk_file APK文件路径,可以是HTTP形式
     * @var $get_icon 是否提取APK文件中的ICON图标,默认不提取
     * @author admclub.com
     */
    public function readApkInfoFromFile($apk_file,$get_icon=flase){
        $aapt = '/usr/bin/aapt';
        if(substr($apk_file, 0,7)=='http://'){
            $tmp_apk = "/tmp/".md5(microtime()).".apk";
            exec('/usr/bin/wget '.$apk_file.' -O '.$tmp_apk." -t 1",$_out,$_return);
            if(filesize($tmp_apk)>0){
                $apk_file = $tmp_apk;
            }
        }
       exec("{$aapt} d badging {$apk_file}",$out,$return);
       if($return==0){
            $str_out = implode("\n", $out);
            $out = null;
            #icon
            if($get_icon){
                $pattern_icon = "/icon='(.+)'/isU";
                preg_match($pattern_icon, $str_out,$m);
                $info['icon']= $m[1];
                if($info['icon']){
                    if($tmp_apk){
                        $command = "unzip {$tmp_apk} {$info['icon']} -d /tmp";
                    }
                    else{
                        $command = "unzip {$apk_file} {$info['icon']} -d /tmp";
                    }
                    mkdirs("/tmp/".$info['icon'],true);
                    exec($command);
                }
            }
            #对外显示名称
            $pattern_name = "/application: label='(.*)'/isU";
            preg_match($pattern_name, $str_out,$m);
            $info['lable']=$m[1];
            #内部名称,软件唯一的
            $pattern_sys_name = "/package: name='(.*)'/isU";
            preg_match($pattern_sys_name, $str_out,$m);
            $info['sys_name']=$m[1];
            #内部版本名称,用于检查升级
            $pattern_version_code = "/versionCode='(.*)'/isU";
            preg_match($pattern_version_code, $str_out,$m);
            $info['version_code']=$m[1];
            #对外显示的版本名称
            $pattern_version = "/versionName='(.*)'/isU";
            preg_match($pattern_version, $str_out,$m);
            $info['version']=$m[1];
            #系统
            $pattern_sdk = "/sdkVersion:'(.*)'/isU";
            preg_match($pattern_sdk, $str_out,$m);
            $info['sdk_version']=$m[1];
            if($info['sdk_version']){
                $sdk_names = array(3=>"1.5",4=>"1.6",7=>"2.1",8=>"2.2",10=>'2.3.3',11=>"3.0",12=>"3.1",13=>"3.2",14=>"4.0");
                if($sdk_names[$info['sdk_version']]){
                    $info['os_req'] = "Android {$sdk_names[$info['sdk_version']]}";
                }
            }
             #权限
            $pattern_perm = "/uses-permission:'(.*)'/isU";
            preg_match_all($pattern_perm, $str_out,$m);
            if($m){
                $cnt = count($m[1]);
                for($i=0;$i<$cnt;$i++){
                    $info['permissions'] .= $info['permissions']?"\n".$m[1][$i]:$m[1][$i];
                }
            }
            #需要的功能(硬件支持)
            $pattern_features = "/uses-feature:'(.*)'/isU";
            preg_match_all($pattern_features, $str_out,$m);
            if($m){
                $cnt = count($m[1]);
                for($i=0;$i<$cnt;$i++){
                    $info['features'] .= $info['features']?"\n".$m[1][$i]:$m[1][$i];
                }
            }
            $info['apk_info'] = $str_out;
            if($tmp_apk){unlink($tmp_apk);}
            return $info;
        }
        if($tmp_apk){unlink($tmp_apk);}
    }
mkdirs函数:
function mkdirs($path, $lastoneisfile = false, $rights = 0777) {
    if (trim ( $path ) == '')
    return;
    if (! $lastoneisfile && substr ( $path, - 1 ) != '/') {
        $path = $path . "/";
    }
    if (is_dir ( $path )) {
        return true;
    } //found it!
    $path = str_replace ( "\\", "/", $path );
    $path = preg_replace ( '/\/+/i', '/', $path );
    $pathes = explode ( '/', $path );
    $cnt = count ( $pathes ) - 1;
    $dir = current ( $pathes ) . "/";
    if (! is_dir ( $dir . "/" )) {
        mkdir ( $dir );
    }
    for($i = 0; $i < $cnt; $i ++) {
        if (! is_dir ( $dir . "/" )) {
            @mkdir ( $dir );
            @chmod ( $dir, $rights );
        }
        $dir .= next ( $pathes ) . "/";
    }
}
标签: 暂无
最后更新:2013年2月1日

wangxingcs

这个人很懒,什么都没留下

点赞
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理。

wangxingcs

这个人很懒,什么都没留下

我的博客

仅记录一些有用的教程,自己的经历,已屏蔽各大搜索引擎收录。

新浪微博 @wangxingcs

Twitter @wangxingcs(常在)

最新 热点 随机
最新 热点 随机
Proxmox VE(PVE)6.X 添加硬盘 PVE解决VM is locked问题 Proxmox VE配置更新源 黑群晖显示真实CPU信息(支持7.0.1) Proxmox VE直通硬盘(全盘映射方式) PVE去除“没有有效订阅”提示
Linux流量监控工具 - iftop centos 5.6下fdisk分区、格式化、挂载新硬盘 CentOS常用磁盘命令 ecshop添加注册短信验证功能 dede在linux下开启伪静态后分页问题 织梦特殊标签dede:sql dede:php等用法
标签聚合
FineCMS DSM MTP 群晖 PVE 驱动 CMS 虚拟机

COPYRIGHT © 2015-2023 wangxingcs.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

陕ICP备13007295号