帮助解析 resources.arsc?

6
我正在尝试解析位于resources.arsc文件中的资源,如问题所讨论。我知道androidmanifest.xml文件标识了在.arsc文件中的资源。我已经成功地解析了.arsc文件的头信息,但我无法弄清如何解析资源本身。
请问有人可以帮助我解决如何解析包含在.arsc文件中的资源吗?
我的解析代码如下:
<?php

$doc = fopen('resources.arsc', 'r+');


for($i=1;$i<10;$i++){
    $res[$i] = _unpack('V', fread($doc, 4));
}


for ($i = 0, $j = $res[6]; $i <= $j; $i++)  {
    $word = fread($doc, 4);
    $stroffs[] = _unpack('V', $word);
}


$strings = array();

$curroffs = 0;
foreach($stroffs as $offs){
    //read length
    $len = _unpack('v', fread($doc, 2));

    //read string
    if($len>0){
        $str = fread($doc, $len*2);
    }else{
        $str = '';
    }
    //null
    $wd = fread($doc, 2);
    //utf-16le
    $strings[] =  mb_convert_encoding($str, 'gbk', 'UTF-16LE');

    //curr offset
    $curroffs += ($len+1)*2 + 2;
}


$tpos = ftell($doc);

read_doc_past_sentinel($doc);

//fseek($doc, $tpos + $tpos % 4);

$i = 0;

$xmls = $strings;

print_r($xmls);

//------------------------------------
//and then...somebody konw format or continue parse?
//------------------------------------


function read_doc_past_sentinel(&$doc){
    $pos = ftell($doc);
    $count= 0;
    while($word = fread($doc, 4)){
        if(_unpack('V', $word)==-1)break;
    }

    $n = 1;
    if ($count < $n){
        while($word = peek_doc($doc, 4)){
            if(_unpack('V', $word) != -1)break;
            fread($doc, 4);
            $n++;
            if(isset($count) && $count >= $n)break;
        }
        echo 'skip '.$n.' chars<br />';
    }

}

function peek_doc(&$doc, $size){
    $data = fread($doc, $size);
    fseek($doc, ftell($doc)-$size);
    return $data;
}



function _unpack($m, $b){
    //if(!$b)return '';
     $res = unpack($m, $b);
    return $res[1];
}
?>
1个回答

5
这是一个相当复杂的二进制文件。你需要比那更多的代码来解析它。 :)
我的建议是使用与平台相同的代码——即在这里找到的ResTable和相关类:
frameworks/base/include/utils/ResourceTypes.h frameworks/base/libs/utils/ResourceTypes.cpp 请注意,ResourceTypes.h还定义了资源表的完整结构(这些类用于解析它)。
您也可以尝试使用aapt工具。它有许多选项可以从.apk中解析与资源相关的数据:
aapt d[ump] [--values] WHAT file.{apk} [asset [asset ...]]
  badging          Print the label and icon for the app declared in APK.
  permissions      Print the permissions from the APK.
  resources        Print the resource table from the APK.
  configurations   Print the configurations in the APK.
  xmltree          Print the compiled xmls in the given assets.
  xmlstrings       Print the strings of the given compiled xml assets.

如果您需要其他命令无法提供的数据,请考虑修改位于frameworks/base/tools/aapt中的工具代码,以添加所需解析内容。此工具使用ResTable来解析资源。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接