PHP读取APK的包信息,包括包名,应用名,权限,LOGO等

/**
     * 获取 APK 包信息和应用图标(需要exec支持)
     */
    public function apkParseInfo($apk) {

        $aapt = 'aapt';// 这里其实是aapt的路径,不过我已经ln到/usr/local/aapt了。就不用了。
        $temp_save_path='/var/www/apks/temp/';

        exec("{$aapt} d badging {$apk}", $output, $return);

        // 解析错误
        if ( $return !== 0 ) {
            return FALSE;
        }

        $output = implode(PHP_EOL, $output);


        dump($output);

        echo '<br/>';

        $apkinfo = new \stdClass;

        // 对外显示名称
        $pattern = "/application: label='(.*)'/isU";
        $results = preg_match($pattern, $output, $res);
        $apkinfo->label = $results ? $res[1] : '';

        // 内部名称,软件唯一的
        $pattern = "/package: name='(.*)'/isU";
        $results = preg_match($pattern, $output, $res);
        $apkinfo->sys_name = $results ? $res[1] : '';

        // 内部版本名称,用于检查升级
        $pattern = "/versionCode='(.*)'/isU";
        $results = preg_match($pattern, $output, $res);
        $apkinfo->version_code = $results ? $res[1] : 0;

        // 对外显示的版本名称
        $pattern = "/versionName='(.*)'/isU";
        $results = preg_match($pattern, $output, $res);
        $apkinfo->version = $results ? $res[1] : '';

        // 系统支持
        $pattern = "/sdkVersion:'(.*)'/isU";
        $results = preg_match($pattern, $output, $res);
        $apkinfo->sdk_version = $results ? $res[1] : 0;

        // 分辨率支持
        $densities = array(
            "/densities: '(.*)'/isU",
            "/densities: '120' '(.*)'/isU",
            "/densities: '160' '(.*)'/isU",
            "/densities: '240' '(.*)'/isU",
            "/densities: '120' '160' '(.*)'/isU",
            "/densities: '160' '240' '(.*)'/isU",
            "/densities: '120' '160' '240' '(.*)'/isU"
        );

        foreach($densities AS $k=>$v) {
            if( preg_match($v, $output, $res) ) {
                $apkinfo->densities[] = $res[1];
            }
        }

        // 应用权限
        $pattern = "/uses-permission: name='(.*)'/isU";
        $results = preg_match_all($pattern, $output, $res);
        $apkinfo->permissions = $results ? $res[1] : '';

        // 需要的功能(硬件支持)
        $pattern = "/uses-feature: name='(.*)'/isU";
        $results = preg_match_all($pattern, $output, $res);
        $apkinfo->features = $results ? $res[1] : '';

        // 应用图标路径
        if( preg_match("/icon='(.+)'/isU", $output, $res) ) {

            $icon_draw = trim( $res[1] );
            $icon_hdpi = 'res/drawable-hdpi/' . basename($icon_draw);

            $temp =$temp_save_path.basename($apk, '.apk') . DIRECTORY_SEPARATOR;

            if( @is_dir($temp) === FALSE ) {
                mkdir($temp,0777,true);
            }

            exec("unzip {$apk} {$icon_draw} -d " . $temp);
            exec("unzip {$apk} {$icon_hdpi} -d " . $temp);

            $apkinfo->icon = $icon_draw;

            $icon_draw_abs = $temp . $icon_draw;
            $icon_hdpi_abs = $temp . $icon_hdpi;

            $apkinfo->icon = @is_file($icon_hdpi_abs) ? $icon_hdpi_abs : $icon_draw_abs;
        }

        return $apkinfo;
    }


                
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值