欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2024-02-04 23:01:16
...
现在想获取安卓包内xml文件里的信息,有谁能提供一些思路的吗。

回复内容:

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

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

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

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

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

更新:

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


/**
 * 获取 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;
}

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

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

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

相关标签: php