thinkphp使用aapt获取apk信息_php获取apk 名称-程序员宅基地

技术标签: PHP  

<pre name="code" class="php">//$type  文件类型
function getUploadsDir($type){
	$date = date('Y-m');
	$filename = C('UPLOAD_PATH').$type.'/'.$date;
	if(mkdirs($filename)){
		return $date;
	}
	return false;
}


/*
 解析apk并获取信息
 $apk_path  apk路径
*/
function apk_parser($apk_path){
	//执行aapt命令,输出apk信息
	exec(C('AAPT_PATH')."/aapt d badging ".$apk_path, $out, $return);
	$base_info_reg = '/^package: name=+.*versionCode=+.*versionName+.*/';
	$name_zh_reg = '/^application-label:+.*/';
	$icon_reg = '/^application-icon-[0-9]{3}+.*/';
	$base_info = $name_zh = '';
	$icons = array();
	foreach ($out as $key => $value) {
		if(!$base_info){
			if(preg_match($base_info_reg,$value,$matchs)){
				$base_info = $value;
			}
		}
		if(!$name_zh){
			if(preg_match($name_zh_reg,$value,$matchs)){
				$name_zh = $value;
			}
		}
		if(preg_match($icon_reg,$value,$matchs)){
			$icons[] = $value;
		}
	}
    $base_info_arr = explode('\'', $base_info);
    $name_zh_arr = explode('\'', $name_zh);

    $data['package_name']=$base_info_arr[1];    // 应用包名 
	$data['version_code']=$base_info_arr[3];  // 版本代码
	$data['version_name']=$base_info_arr[5];  // 版本名称 
	$data['app_name']=$name_zh_arr[1];     // 应用名称
	if($icons){
		foreach ($icons as $key => $value) {
			$icons_arr = explode('\'', $value);
			$icon[$key] = $icons_arr[1];
		}	
		if($icon){
			$zip = new \ZipArchive;
			if ($zip->open($apk_path) === true) {
				$tpl_name = C('UPLOAD_PATH').'tpl/';
				$num = count($icon)-1;
				for($i=$num;$i>=0;$i--){
					if($zip->extractTo($tpl_name, array($icon[$i]))){
						$is_extract = 1;
						break;
					}
				}
				if($is_extract){
					//获取上传目录
					if($filename = getUploadsDir('images')){
						$save_name = uniqid();
						//获取后缀
						$fileinfo = pathinfo($icon[$i]);
			       		$exts = strtolower($fileinfo["extension"]);
			       		$img_name = $filename.'/'.$save_name.'.'.$exts;
			       		if(copy($tpl_name.$icon[$i],C('UPLOAD_PATH').'images/'.$filename.'/'.$save_name.'.'.$exts)){
							$data['app_icon']= $img_name;
							$result = 1;
						}
					}
					//删除临时文件中的文件
					@unlink($tpl_name.$icon[$i]);
				}
			}
		}
	}
	if(!$result){
		$data['app_icon'] = '';
	}                
	return $data;
}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wylb226/article/details/44940947

智能推荐

最新全流程GMS地下水数值模拟及溶质(包含反应性溶质)运移模拟技术深度应用-程序员宅基地

文章浏览阅读704次,点赞30次,收藏18次。最新全流程GMS地下水数值模拟及溶质(包含反应性溶质)运移模拟技术深度应用_gms地下水数值模拟

Android 自定义横向进度条_android自定义横向进度条-程序员宅基地

文章浏览阅读2.4k次。private int max; private double progress; private int bgColor; private int progressColor; private int padding; private boolean openGradient; private int gradientFrom; private int gradientTo; private boolean showSecondProgres_android自定义横向进度条

宝塔打开后,内容渲染失败(405)【了解一下】_宝塔部署后405 not allowed-程序员宅基地

文章浏览阅读111次。如果你是以上这种情况,打开以后发现,数据渲染不上,很可能是因为你的配置反向代理的顺序搞错了,造成的结果就是反向代理没有替换成功!还是那些内容,只是改变了操作步骤;数据就能加载出来了!_宝塔部署后405 not allowed

联想计算机管理员权限设置,Windows XP系统如何新建administrator管理员权限账户-程序员宅基地

文章浏览阅读1.6k次。知识点分析:对于Windows XP系统,有很多种创建用户账户的操作方法。其中包括:使用CMD命令行的net命令进行,也可以使用控制面板的图形界面进行,还可以使用计算机管理控制台中的“本地用户和组”进行。其中后者自定义功能多,本文以此为例进行操作示范。操作步骤:1. 在系统桌面找到并使用鼠标右键点击“我的电脑”图标,然后在弹出菜单中选择“管理(G)”,如下图所示:2. 在弹出的计算机管理窗口,展开..._xp 开启管理员账户

socket 及 websocket的握手过程_websocket三次握手详解-程序员宅基地

文章浏览阅读6k次。一、WebSocket和HTTP之间的关系WebSocket和HTTP一样都是基于TCP的应用层协议。WebSocket协议和HTTP协议是两种不同的东西。客户端开始建立WebSocket连接时要发送一个header标记了 Upgrade的HTTP请求,表示请求协议升级。所以服务器端做出响应的简便方法是,直接在现有的HTTP服务器软件和现有的端口上实现WebSocket协议,然后再回一个状态..._websocket三次握手详解

小学计算机反思案例,小学数学有效教学案例及反思-程序员宅基地

文章浏览阅读210次。小学数学有效教学案例及反思《植树问题》教学设计及反思一、教学目标:1、知识与技能目标:通过动手实践,合作探究,让学生在做数学的过程中经历由现实问题到数学建模,理解并掌握植树棵数与间隔数之间的关系。2、过程与方法目标:通过学生自主实小学数学教学案例及反思小学数学教学案例及反思学生的认知结构,只有在经历学习活动的过程中主动才能完成。只有学生本人的积极思考、主动探索,才能有所发现、有所创新。但在不少学校..._小学数学教学案例博客

随便推点

acwing.188.逆序对数量_acwing 逆序对的数量-程序员宅基地

文章浏览阅读93次。逆序对数量(归并排序应用)给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆序对;否则不是。输入格式第一行包含整数 n,表示数列的长度。第二行包含 n 个整数,表示整个数列。输出格式输出一个整数,表示逆序对的个数。数据范围1≤n≤100000输入样例:62 3 4 5 6 1输出样例:5#include<iostream>using_acwing 逆序对的数量

Spark学习笔记_sparksession.read()-程序员宅基地

文章浏览阅读684次。一、安装1、上传并解压。2、修改spark/conf/spark_env.sh:export JAVA_HOME=/usr/jdk1.8.0_152/export SPARK_MASTER_IP=hadoop1 expart SPARK_MASTER_PORT=7077 export HADOOP_CONF_DIR=/usr/ha..._sparksession.read()

【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )_java 垃圾回收算法 复制算法有标记过程吗-程序员宅基地

文章浏览阅读2.2k次,点赞9次,收藏38次。总结、一、标记清除算法、二、复制算法、三、标记-整理算法、_java 垃圾回收算法 复制算法有标记过程吗

虚幻引擎5 (UE5):完整的初学者学习教程_虚幻5教程-程序员宅基地

文章浏览阅读4.2w次,点赞22次,收藏164次。流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:6.26 GB |时长:7h 32m虚幻引擎5的最快入门方法云桥网络 平台获取教程你会学到什么虚幻引擎虚幻引擎5游戏设计建筑设计产品设计描述欢迎初学者全面了解新的虚幻引擎5。专业人士和初学者都可以使用UE5,借助新的Lumen Lighting System和Nanite虚拟几何引擎,创建令人惊艳的实时内容。作为一名游戏、架构.._虚幻5教程

c语言json库如何编译,C语言的JSON库Jansson-程序员宅基地

文章浏览阅读473次。Jansson概述Jansson是一个C语言库,用于编码,解码和处理JSON数据。其主要特点和设计原则是:简单直观的API和数据模型全面的文档不依赖其他库完全支持Unicode(UTF-8)广泛的测试套件Jansson的API稳定可靠,可广泛应用于生产中。它可以在多种平台上运行,包括多种类Unix系统和windows。它适用于任何系统,包括台式机,服务器和小型嵌入式系统。Jansson是以MIT协..._jansson库编译

学术与产业的碰撞:AI TIME 走进浙大专场活动-程序员宅基地

文章浏览阅读405次。点击蓝字关注我们AI TIME欢迎每一位AI爱好者的加入!2021 年 7 月 13 日,「AI TIME 走进浙大」论坛在浙江大学公共管理学院隆重举行。此次活动得到了浙江大学计算机学院人..._kdd 杨洋 电力异常