Heim >Backend-Entwicklung >PHP-Tutorial >php如何获取安卓包里的信息

php如何获取安卓包里的信息

WBOY
WBOYOriginal
2016-07-06 13:52:141202Durchsuche

现在想获取安卓包内xml文件里的信息,有谁能提供一些思路的吗。

回复内容:

现在想获取安卓包内xml文件里的信息,有谁能提供一些思路的吗。

首先如楼上所说,apk文件只是一个zip压缩包,所以有思路:使用php执行解压,读取解压后的文件就能达到题主的目的。
然后搜索”php执行解压”,网上很多相关示例,如:http://jb51.net/article/25521.htm,此处不再过多赘述

希望题主下次遇到问题先自行尝试解决。

需要安装 apktool 工具反编译 apk 文件,之后通过 preg_match 从包信息里匹配你需要的参数,这个我之前做过,就是通过这种方式实现的!

参考:https://github.com/iBotPeaches/Apktool

更新:

刚才找了一下以前写的代码,希望可以帮到你:

<code class="php">
/**
 * 获取 APK 包信息和应用图标(需要exec支持)
 */
public function apkParseInfo($apk) {

    $aapt = '/usr/bin/aapt';

    if( FALSE === is_file($aapt) ) {
        return FALSE;
    }

    exec("{$aapt} d badging {$apk}", $output, $return);

    // 解析错误
    if ( $return !== 0 ) {
        return FALSE;
    }
    
    $output = implode(PHP_EOL, $output);

    $apkinfo = new stdClass;
    
    // 对外显示名称
    $pattern = "/application: label='(.*)'/isU";
    $results = preg_match($pattern, $output, $res);
    $apkinfo->label = $results ? $res[1] : '';
    
    // 内部名称,软件唯一的
    $pattern = "/package: name='(.*)'/isU";
    $results = preg_match($pattern, $output, $res);
    $apkinfo->sys_name = $results ? $res[1] : '';
    
    // 内部版本名称,用于检查升级
    $pattern = "/versionCode='(.*)'/isU";
    $results = preg_match($pattern, $output, $res);
    $apkinfo->version_code = $results ? $res[1] : 0;
    
    // 对外显示的版本名称
    $pattern = "/versionName='(.*)'/isU";
    $results = preg_match($pattern, $output, $res);
    $apkinfo->version = $results ? $res[1] : '';
    
    // 系统支持
    $pattern = "/sdkVersion:'(.*)'/isU";
    $results = preg_match($pattern, $output, $res);
    $apkinfo->sdk_version = $results ? $res[1] : 0;
    
    // 分辨率支持
    $densities = array(
        "/densities: '(.*)'/isU",
        "/densities: '120' '(.*)'/isU",
        "/densities: '160' '(.*)'/isU",
        "/densities: '240' '(.*)'/isU",
        "/densities: '120' '160' '(.*)'/isU",
        "/densities: '160' '240' '(.*)'/isU",
        "/densities: '120' '160' '240' '(.*)'/isU"
    );

    foreach($densities AS $k=>$v) {
        if( preg_match($v, $output, $res) ) {
            $apkinfo->densities[] = $res[1];
        }
    }

    // 应用权限
    $pattern = "/uses-permission:'(.*)'/isU";
    $results = preg_match_all($pattern, $output, $res);
    $apkinfo->permissions = $results ? $res[1] : '';
    
    // 需要的功能(硬件支持)
    $pattern = "/uses-feature:'(.*)'/isU";
    $results = preg_match_all($pattern, $output, $res);
    $apkinfo->features = $results ? $res[1] : '';
    
    // 应用图标路径
    if( preg_match("/icon='(.+)'/isU", $output, $res) ) {

        $icon_draw = trim( $res[1] );
        $icon_hdpi = 'res/drawable-hdpi/' . basename($icon_draw);

        $temp = $this->_file_save_path . basename($apk, '.apk') . DIRECTORY_SEPARATOR;

        if( @is_dir($temp) === FALSE ) {
            create_dir($temp);
        }
        
        exec("unzip {$apk} {$icon_draw} -d " . $temp);
        exec("unzip {$apk} {$icon_hdpi} -d " . $temp);

        $apkinfo->icon = $icon_draw;

        $icon_draw_abs = $temp . $icon_draw;
        $icon_hdpi_abs = $temp . $icon_hdpi;

        $apkinfo->icon = @is_file($icon_hdpi_abs) ? $icon_hdpi_abs : $icon_draw_abs;
    }
    
    return $apkinfo;
}</code>

安卓apk文件其实就是zip压缩包,你可以直接读取里面的xml文件

xml文件里的信息 如果是指 AndroidManifest.xml

则需要使用aapt来读取了,调系统命令就行。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn