我需要一个类或函数来从apk文件中获取版本名称,版本代码,包名称和minsdk级别。
我发现了apk解析器php类,但在服务器中它运行不正常。
我发现了这个功能,但是这个功能也有错误。
function apps_infosfromapk($file)
{
global $AAPT_DIR;
$infos=array();
$retour = array();
exec ($AAPT_DIR." l -a ".realpath($file),$retour);
$txt = "";
for($i = 0; $i < sizeof ($retour); $i++)
$txt .= $retour[$i];
$t1 = explode('android:versionName(0x0101021c)="',$txt);
$t3 = explode('"',$t1[1]);
$version = $t3[0];
$t2 = explode ('package="', $txt);
$t4 = explode ('"', $t2[1]);
$package = $t4[0];
$t5 = explode('A: android:minSdkVersion(0x0101020c)=(type 0x10)0x',$txt);
$t6 = explode(' ',$t5[1]);
$minSdk = intval($t6[0]);
$txt2=explode('android:name(0x01010003)="android.permission.',$txt);
$it=0;
$permissions="";
for($i=1;$i<sizeof($txt2);$i++)
{
$tmp=explode('"',$txt2[$i]);
if($it==0)
$permissions.=$tmp[0];
else
$permissions.=";".$tmp[0];
$it++;
}
$infos[0]=$version;
$infos[1]=$package;
$infos[2]=$minSdk;
$infos[3]=$permissions;
return $infos;
}
答案 0 :(得分:1)
我也尝试在PHP中找到它,但没有很好的解决方案。以下是一些相关主题:
最受欢迎的解决方案是使用aapt dump badging myapp.apk
,您可以在AndroidManifest.xml
中获取所有信息。
这是java希望中的另一个代码,可以帮助你:
我找到了一个满足您所有需求的PHP脚本,但仍然需要 aapt 的帮助。
function readApkInfoFromFile($apk_file, $get_icon = false){
exec("/opt/android-sdk-linux/build-tools/19.0.0/aapt d badging {$apk_file}", $out, $return);
$temp_path = FCPATH . 'cache/temp/'.md5($apk_file).'/';
if($return == 0){
@mkdir($temp_path);
$str_out = implode("\n", $out);
$out = null;
#icon
if($get_icon){
$pattern_icon = "/icon='(.+)'/isU";
preg_match($pattern_icon, $str_out, $m);
$info['icon'] = $m[1];
if($info['icon']){
//$command = "unzip {$apk_file} {$info['icon']} -d " . $temp_path;
$command = '7z x "' . $apk_file . '" -y -aos -o"' . $temp_path . '" ' . $info['icon'];
//exit($command);
//mkdirs("/tmp/".$info['icon'],true);
exec($command);
$info['icon'] = $temp_path . $info['icon'];
}
}
$pattern_name = "/application: label='(.*)'/isU";
preg_match($pattern_name, $str_out,$m);
$info['lable']=$m[1];
$pattern_sys_name = "/package: name='(.*)'/isU";
preg_match($pattern_sys_name, $str_out,$m);
$info['sys_name']=$m[1];
$pattern_version_code = "/versionCode='(.*)'/isU";
preg_match($pattern_version_code, $str_out,$m);
$info['version_code']=$m[1];
$pattern_version = "/versionName='(.*)'/isU";
preg_match($pattern_version, $str_out,$m);
$info['version']=$m[1];
$pattern_sdk = "/sdkVersion:'(.*)'/isU";
if(preg_match($pattern_sdk, $str_out,$m)){
$info['sdk_version']=$m[1];
if($info['sdk_version']){
$sdk_names = array(3=>"1.5",4=>"1.6",7=>"2.1",8=>"2.2",10=>'2.3.3',11=>"3.0",12=>"3.1",13=>"3.2",14=>"4.0");
if($sdk_names[$info['sdk_version']]){
$info['os_req'] = "Android {$sdk_names[$info['sdk_version']]}";
}
}
}
$pattern_perm = "/uses-permission:'(.*)'/isU";
preg_match_all($pattern_perm, $str_out,$m);
if(isset($m[1])){
foreach($m[1] as $mm){
$info['permissions'][] = $mm;
}
}
$pattern_features = "/uses-feature:'(.*)'/isU";
preg_match_all($pattern_features, $str_out,$m);
if(isset($m[1])){
foreach($m[1] as $mm){
$info['features'][] = $mm;
}
}
$info['apk_info'] = $str_out;
return $info;
}
return false;
}