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

打印 上一主题 下一主题

主题 1623|帖子 1623|积分 4869

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

我这边环境是docker,内核是64位的centos,因此将下载的64位aapt工具及所需依赖库放到docker容器内即可(使用linux服务器与此同样的操作)。
使用docker cp下令,将文件拷贝到容器内(工具及依赖百度网盘下载链接会放到文章末尾):
  1. docker cp ./aapt 20108524628e:/usr/bin/
  2. 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文件夹中了。
和我一样的小伙伴可以这么做:

  • 将php-apk-parser-master\lib中的ApkParser文件夹拷贝到vendor文件中
  • 修改vendor\yiisoft\extensions.php 文件,增加配置如下:
  1.     'ApkParser' =>
  2.         array (
  3.             'name' => 'ApkParser',
  4.             'version' => '0.1.0.0',
  5.             'alias' =>
  6.                 array (
  7.                     '@ApkParser' => $vendorDir . '/ApkParser',
  8.             ),
  9.     ),
复制代码
这样即可使用:
  1. 引用:
  2. use ApkParser\Parser;
  3. 封装的方法:
  4. /**
  5.      * @param $apkPath *apk文件路径 ./aa/bb/cc.apk
  6.      * @param $iconRoute *icon文件目标存放区域(从apk中拷贝出来) ./aa/bb
  7.      * @param $prefix *文件前缀,防止多个文件重名
  8.      * @return array
  9.      * @throws \ApkParser\Exceptions\XmlParserException
  10.      * @time 2024/11/28 14:05
  11.      * @author zsh
  12.      */
  13.     public static function getApkInfo($apkPath, $iconRoute, $prefix = '')
  14.     {
  15.         if(empty($prefix)){
  16.             $prefix = date('YmdHis').'_'.rand(10000, 99999).'_';
  17.         }
  18.         $return = [];
  19.         $apk = new Parser($apkPath, ['manifest_only' => false]);
  20.         $manifest = $apk->getManifest();
  21.         $return['package_name'] = $manifest->getPackageName();
  22.         $return['version'] = $manifest->getVersionName();
  23. //        echo "Package Name      : " . $manifest->getPackageName() . "" . PHP_EOL;
  24. //        echo "Version           : " . $manifest->getVersionName() . " (" . $manifest->getVersionCode() . ")" . PHP_EOL;
  25. //        echo "Min Sdk Level     : " . $manifest->getMinSdkLevel() . "" . PHP_EOL;
  26. //        echo "Min Sdk Platform  : " . $manifest->getMinSdk()->platform . "" . PHP_EOL;
  27. //        echo "Target Sdk Level     : " . $manifest->getTargetSdkLevel() . "" . PHP_EOL;
  28. //        echo "Target Sdk Platform  : " . $manifest->getTargetSdk()->platform . "" . PHP_EOL;
  29.         $application = $manifest->getApplication();
  30.         $labelResourceId = $application->getLabel();
  31.         $appLabel = $apk->getResources($labelResourceId);
  32.         $apkName = '';
  33.         if(!empty($appLabel)){
  34.             if(count($appLabel) > 1){
  35.                 $apkName = end($appLabel);
  36.             }else{
  37.                 $apkName = $appLabel[0];
  38.             }
  39.         }
  40.         $return['apk_name'] = $apkName;
  41.         $resourceId = $application->getIcon();
  42.         $resources = $apk->getResources($resourceId);
  43.         $return['apk_icon_path'] = '';
  44.         foreach ($resources as $resource) {
  45.             // 获取图标文件
  46.             $fileName = basename($resource);
  47.             $extension = pathinfo($fileName, PATHINFO_EXTENSION);
  48.             $extension = strtoupper($extension);
  49.             if($extension == 'PNG' || $extension == 'WEBP' || $extension == 'JPG'){
  50.                 $iconFile = $iconRoute.'/'.$prefix.$fileName;
  51.                 $result = file_put_contents($iconFile, $apk->getStream($resource));
  52.                 if($result){
  53.                     $return['apk_icon_path'] = $iconFile;
  54.                     break;
  55.                 }
  56.             }
  57. //            echo '<img src="data:image/png;base64,', base64_encode(stream_get_contents($apk->getStream($resource))), '" />';
  58.         }
  59.         return $return;
  60.     }
复制代码
   下载链接: https://pan.baidu.com/s/1XlRhP_0WDKIEINnnE8CJKw 提取码: bzaf 


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

涛声依旧在

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表