我正在尝试解析resources {。} c文件中包含的资源,如this问题中所述。我知道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];
}
?>
答案 0 :(得分:5)
这是一个相当复杂的二进制文件。您将需要 way 更多的代码来解析它。 :)
我的建议是使用与平台相同的代码 - 即此处的ResTable和相关类:
框架/碱/包含/ utils的/ ResourceTypes.h 框架/碱/库/ 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来解析资源。