星哥的博客

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

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

2013年2月1日 2904点热度 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
取消回复

This site uses Akismet to reduce spam. Learn how your comment data is processed.

wangxingcs

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

我的博客

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

新浪微博 @wangxingcs

Twitter @wangxingcs(常在)

最新 热点 随机
最新 热点 随机
Proxmox VE(PVE)6.X 添加硬盘 PVE解决VM is locked问题 Proxmox VE配置更新源 黑群晖显示真实CPU信息(支持7.0.1) Proxmox VE直通硬盘(全盘映射方式) PVE去除“没有有效订阅”提示
AMH5下给NGINX开启SPDY支持 努力?奋斗?工作? android-apktool 中文使用说明 IE6-8下img标签对两端对齐代码的不兼容 Centos6.2 系统语言设置 织梦DEDECMS友情链接(flink)增加下拉菜单的实现方法
标签聚合
群晖 驱动 DSM CMS FineCMS MTP 虚拟机 PVE

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

Theme Kratos Made By Seaton Jiang

陕ICP备13007295号