PHP获取安卓APK文件的信息(名称、版本、图标文件等)

最近业务需要一个功能,后台上传apk文件,需要自动获取到此apk的名称、版本、图标、PackageName等信息。网上查了很多资料,看大家都是使用aapt工具来获取信息,不过不能获取图标。后来发现有大神已经封装了一套组件【php-apk-parser】可以使用,在此总结一下,方便大家使用。

++第一种方式:使用aapt工具获取apk的名称、版本等信息++

我这边环境是docker,内核是64位的centos,因此将下载的64位aapt工具及所需依赖库放到docker容器内即可(使用linux服务器与此同样的操作)。

使用docker cp命令,将文件拷贝到容器内(工具及依赖百度网盘下载链接会放到文章末尾):

复制代码
docker cp ./aapt 20108524628e:/usr/bin/
docker cp ./libc++.so 20108524628e:/usr/lib/

进入容器输入aapt命令进行验证:

接下来就是在PHP中使用exec函数执行"aapt dump badging 【apk文件路径】",这样即可获取到基础信息

大家可以参照网上的一些教程获取相关信息,如:https://blog.csdn.net/xiojing825/article/details/72772905

声明:我对安卓apk并不了解,只是大致看了下相关资料,以下结论是结合自身能力得出,若有错误之处,恳请指正,谢谢!】不过使用aapt方式获取图标icon很麻烦,获取到png格式的还能处理,获取到xml格式的就不好处理了。因为在安卓8之后,为了适配各种分辨率,图标指向了xml格式的文件,还涉及到分层什么的,我试验了几次用aapt遇到xml格式的就没办法获取到图标了。

++第二种方式:使用php-apk-parser扩展组件获取apk的名称、版本、图标文件等信息++

有大神把java使用的apk-parser工具做了封装,PHP也可以使用了,因此第二种方式就是使用这个扩展来解析apk,大神推荐的安装方式是使用composer来安装,且对PHP版本有要求(7.3以上或8.0):

如果你的PHP版本是8.0以上可以直接访问此链接参考安装:

GitHub - tufanbarisyildirim/php-apk-parser: Read basic info about an application from .apk file.

但是我这边PHP版本是7.2,所以我就下载了代码看了下,发现大神代码里使用了Union types(Union types是PHP 8.0引入的一个新特性,允许用管道符|来指定一个参数或者变量可以接受多种类型。),因此我就粗暴的修改了一下大神的代码,把7.2版本不支持的语法去掉就可以使用了。(修改后的代码已打包放到文件末尾, 只修改了lib下的ApkParser**)**

大神代码下载后结构是这样(examples中是使用实例,还有自动加载入口autoload.php):

我这里使用的是Yii2框架,因为无法使用composer,我就自己导入到vendor文件夹中了。

和我一样的小伙伴可以这么做:

  1. 将php-apk-parser-master\lib中的ApkParser文件夹拷贝到vendor文件中

  2. 修改vendor\yiisoft\extensions.php 文件,增加配置如下:

    复制代码
     'ApkParser' =>
         array (
             'name' => 'ApkParser',
             'version' => '0.1.0.0',
             'alias' =>
                 array (
                     '@ApkParser' => $vendorDir . '/ApkParser',
             ),
     ),

这样即可使用:

php 复制代码
引用:
use ApkParser\Parser;


封装的方法:
/**
     * @param $apkPath *apk文件路径 ./aa/bb/cc.apk
     * @param $iconRoute *icon文件目标存放区域(从apk中拷贝出来) ./aa/bb
     * @param $prefix *文件前缀,防止多个文件重名
     * @return array
     * @throws \ApkParser\Exceptions\XmlParserException
     * @time 2024/11/28 14:05
     * @author zsh
     */
    public static function getApkInfo($apkPath, $iconRoute, $prefix = '')
    {
        if(empty($prefix)){
            $prefix = date('YmdHis').'_'.rand(10000, 99999).'_';
        }

        $return = [];

        $apk = new Parser($apkPath, ['manifest_only' => false]);
        $manifest = $apk->getManifest();

        $return['package_name'] = $manifest->getPackageName();
        $return['version'] = $manifest->getVersionName();

//        echo "Package Name      : " . $manifest->getPackageName() . "" . PHP_EOL;
//        echo "Version           : " . $manifest->getVersionName() . " (" . $manifest->getVersionCode() . ")" . PHP_EOL;
//        echo "Min Sdk Level     : " . $manifest->getMinSdkLevel() . "" . PHP_EOL;
//        echo "Min Sdk Platform  : " . $manifest->getMinSdk()->platform . "" . PHP_EOL;
//        echo "Target Sdk Level     : " . $manifest->getTargetSdkLevel() . "" . PHP_EOL;
//        echo "Target Sdk Platform  : " . $manifest->getTargetSdk()->platform . "" . PHP_EOL;

        $application = $manifest->getApplication();

        $labelResourceId = $application->getLabel();
        $appLabel = $apk->getResources($labelResourceId);

        $apkName = '';
        if(!empty($appLabel)){
            if(count($appLabel) > 1){
                $apkName = end($appLabel);
            }else{
                $apkName = $appLabel[0];
            }
        }

        $return['apk_name'] = $apkName;

        $resourceId = $application->getIcon();
        $resources = $apk->getResources($resourceId);

        $return['apk_icon_path'] = '';

        foreach ($resources as $resource) {
            // 获取图标文件
            $fileName = basename($resource);
            $extension = pathinfo($fileName, PATHINFO_EXTENSION);
            $extension = strtoupper($extension);
            if($extension == 'PNG' || $extension == 'WEBP' || $extension == 'JPG'){
                $iconFile = $iconRoute.'/'.$prefix.$fileName;
                $result = file_put_contents($iconFile, $apk->getStream($resource));
                if($result){
                    $return['apk_icon_path'] = $iconFile;
                    break;
                }
            }
//            echo '<img src="data:image/png;base64,', base64_encode(stream_get_contents($apk->getStream($resource))), '" />';
        }

        return $return;
    }

下载链接: https://pan.baidu.com/s/1XlRhP_0WDKIEINnnE8CJKw 提取码: bzaf

相关推荐
咸鱼翻身小阿橙2 小时前
VS2008 + .NET3.5 环境、加热台TCP通讯场景
tcp/ip·php·.net
Yvonne爱编码9 小时前
JAVA EE初阶---DAY 2 计算机网络
java·开发语言·计算机网络·算法·java-ee·php
zuowei288911 小时前
Laravel 9.x核心特性全解析
php·laravel
Cheng小攸11 小时前
协议分析与分析工具(二)
开发语言·php
Johnstons12 小时前
5G网络来了,App怎么测?5G网络损伤测试完整指南
开发语言·网络·5g·php·弱网测试·网络损伤·网络损伤仪
石榴树下的七彩鱼12 小时前
图片去文字接口,支持去除图片中的文字(附 Python / Java / PHP / JS 示例)
java·python·php·api接口·图片去水印·ai图片修复·图片去文字
凡人叶枫1 天前
Effective C++ 条款31:将文件间的编译依存关系降至最低
linux·开发语言·c++·php·嵌入式开发·effective c++
狗凯之家源码网1 天前
正版扭蛋机 V3 商用程序,盲盒系统落地实战指南
开源·php
程序猿阿伟1 天前
《Chrome非必要服务的精细化关闭指南》
前端·chrome·php
皮皮蟹虾饺1 天前
tcpdump指南:从基础抓包到 BPF 高级过滤与生产实战
测试工具·php·tcpdump