2011-06-16 101 views
5

我想解析resources.arsc文件中包含的资源,如this问题所述。我知道androidmanifest.xml文件标识位于.arsc文件中的资源。我已成功设法解析.arsc文件的头文件,但我无法弄清楚如何解析资源本身。帮助解析resources.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]; 
} 
?> 

回答

4

这是一个相当复杂的二进制文件。你将需要方式更多的代码来解析它。 :)

我的建议是使用该平台执行相同的代码 - 这是ResTable和相关类在这里找到:

框架/基/包括/ utils的/ ResourceTypes.h 框架/基/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. 

如果你想不提供这些命令其他一些数据,可以考虑修改框架/基/工具的工具代码/ aapt添加东西来解析出你想要的东西。该工具使用ResTable来分析资源。