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

相关推荐
BingoGo16 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack16 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082854 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe4 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5