如何使用php获取apk的版本名称,版本代码,包名称和minsdk级别

时间:2013-09-18 18:11:19

标签: php parsing apk

我需要一个类或函数来从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;
}

1 个答案:

答案 0 :(得分:1)

我也尝试在PHP中找到它,但没有很好的解决方案。以下是一些相关主题:

  1. Thread1
  2. Thread2
  3. 最受欢迎的解决方案是使用aapt dump badging myapp.apk,您可以在AndroidManifest.xml中获取所有信息。

    这是java希望中的另一个代码,可以帮助你:

    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;
    }