2011-06-16 19 views
5

this sorusunda açıklandığı gibi bir resources.arsc dosyasında bulunan kaynakları ayrıştırmaya çalışıyorum. Biliyorum androidmanifest.xml dosya .arsc dosyasında bulunan kaynakları tanımlar. .arsc dosyasının başlığını başarıyla ayrıştırmayı başardım, kaynakların nasıl ayrıştırılacağını anlayamıyorum.resources.arsc ayrıştırma yardım?

Birisi lütfen bana bir .arsc dosyasında bulunan kaynakları nasıl ayrıştırılacağını anlamaya yardımcı olabilir misiniz? Bugüne kadar

Benim ayrıştırma kodu:

<?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]; 
} 
?> 

cevap

4

Bu oldukça karmaşık bir ikili dosyadır. Ayrıştırmak için yol kod daha ihtiyacınız olacak. :)

Benim önerim platformu yapar aynı kodu kullanmak olacaktır - yani ResTable ve ilgili sınıfları burada bulunabilir:

çerçeveler/baz// utils'i şunlardır/ResourceTypes.h çerçeveler/tabanını /libs/utils/ResourceTypes.cpp

ResourceTypes.h ayrıca, kaynak tablonun (burada sınıfları ayrıştırmak için kullandığı) tüm yapısı için tanımları olduğunu unutmayın.

Ayrıca aapt aracını da kullanabilirsiniz. O komutları ile kullanılamaz isteyen bazı diğer veriler çerçeveler/baz/araçları aracı kodunu değiştirme düşünün varsa

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. 

: Bu .apk dışına kaynak ilgili verileri ayrıştırmak için çeşitli seçenekler vardır Ne istediğinizi ayrıştırmak için bir şeyler eklemek için/aapt. Bu araç, kaynakları ayrıştırmak için ResTable'ı kullanıyor.