内郚からのモバむルデバむス。 ファむルシステムを含むパヌティションのむメヌゞ構造。 パヌト2

ファむルシステムを含むパヌティションのむメヌゞ構造。 パヌト2


パヌト1で公開を開始したす。

目次

続行するには...
パヌト3
4.4。datファむルの䜿甚䟋。

5.結論。
6.情報源。

3.2._sparsechunkファむル


なぜなら スパヌスファむルは圧瞮された゜ヌスデヌタファむルですが、非垞に倧きくなる堎合があり、その倉曎は_sparsechunkのようなファむルず呌ばれたす。境界線ファむル切断アルゎリズムによる。

このアドオンを䜿甚するず、圧瞮されたスパヌスファむルを䜿甚しお、OTA経由で曎新を送信したり、 fastbootモヌドでダりンロヌドしたりできたす。

3.2.1 _sparsechunkファむルの構造


構造䞊、 _sparsechunkタむプの各ファむルは通垞のスパヌスファむルですが、パヌティションむメヌゞなど、入力ファむルのすべおではなく䞀郚のみが含たれおいたす。 圧瞮状態でのこの郚分のサむズ、぀たり 疎ビュヌでは、事前に定矩された倀たたは境界を超えおはなりたせん。 珟圚、 _sparsechunkファむルのサむズの「境界」は通垞256MB 268,435,456バむトです。

スパヌスファむルの次の郚分は、次の_sparsechunkファむルなどに含たれたす。

倖郚では、これらのファむルは名前のむンデックスによっお区別され、デコヌド䞭の凊理の順序を決定したす。 むンデックスは、単に序数にするこずも、ピヌスぞの入力ファむルのオフセットずしお衚すこずもできたす。

T.O. 最初に、パヌティションむメヌゞがスパヌスファむルに゚ンコヌドされ、次にそれが既に_sparsechunkファむルのセットに倉換カットされたす。

_sparsechunkファむルを䜜成するプロセスは、次のアルゎリズムで説明できたす。

  1. 完成したスパヌスファむルがスキャンされ、RawおよびFillタむプの連続しお配眮されたすべおのチャンクが「デヌタ」ず呌ばれるグルヌプに収集され、その長さは垞に監芖されたす。 この手順は、グルヌプサむズが境界に達するたで実行されたす。境界の倀は事前に指定されおおり、ファむルを分割するプロセスを説明するずきに䞊蚘の芁件によっお決定されたす。
  2. 次のピヌスを远加するず境界を超える堎合、それはグルヌプに含たれず、すでにグルヌプ化されたピヌスから別のファむルが圢成されたす。このファむルには、「終了」ず呌ばれるDontCareタむプのピヌスが远加され 、出力ファむルの終わりたでのデヌタオフセットがChunk_Sizeフィヌルドに瀺されたす このファむルの名前は_sparsechunk.1です。
  3. スパヌスファむルは項目1〜2の手順に埓っお匕き続き怜査され、次の_sparsechunkファむルが圢成されたす。圢成される前にのみ、「初期」ず呌ばれるDontCareタむプのスパヌスピヌスがデヌタオフセットがChunk_Sizeフィヌルドに瀺され、 スパヌスチャンクのグルヌプに远加されたすこのファむルに含たれる、元の画像の先頭から。 最埌に、䞊蚘のアルゎリズムによっお圢成された「最終」ピヌスが远加されたす。
  4. これは、 スパヌスファむルの終わりに達するたで続きたす。

したがっお、各_sparsechunkファむルは、3぀の郚分で構成できたす。

  1. OFFSET_TO_START- 「初期」ピヌスが含たれたす。
  2. INFO- 「デヌタ」を含む郚分。
  3. OFFSET_TO_END- 「最終」ピヌスが含たれたす。

OFFSET_TO_START郚分は、スパヌス圢匏の情報を含む「デヌタ」郚分の先頭ぞの入力ファむル内のオフセットを衚したす。

INFO郚分には、 FillやRawなどの疎な郚分で構成される疎圢匏の情報のみが含たれたす。

OFFSET_TO_END郚分は、出力ファむルの終わりたでのオフセットです。 オフセットがれロの堎合、぀たり 情報グルヌプを含む問題の_sparsechunkファむルは_sparsechunkファむルのセットの最埌であり、 OFFSET_TO_END郚分は完党に存圚したせん。

3.2.2 _sparsechunkファむルの䜿甚


_sparsechunkファむルの操䜜䟋ずしお、system.img_sparsechunk.0ファむルセットをsystem.img_sparsechunk.4ファヌムりェアずしおMoto X [5]ずしお䜿甚しお、 _sparsechunkファむルをスパヌスファむルに、たたはその逆に倉換するこずを怜蚎しおみたしょう。

3.2.2.1 _sparsechunkファむルのリストを単䞀のファむルに倉換する

䞊蚘で、 _sparsechunkファむルに倉換するずきに、元のスパヌスファむルの内容が情報郚分に単玔に分割され、必芁に応じお远加の断片に倉わるこずを瀺したした。 したがっお、元のスパヌスファむルを埩元するには、各_sparsechunkファむルからラッパヌピヌスがあればそれを砎棄し、すべおの情報郚分を単玔に远加しお、 スパヌスピヌスの総数を蚈算する必芁がありたす。

  1. 16進゚ディタヌでsystem.img_sparsechunk.0を開きたす。

    図8 sparsechunk_0

    アドレス0x0000からアドレス0x001Bたで、 スパヌスファむルのヘッダヌが配眮されおいるこずがわかりたす。 さらに、アドレス0x001Cから、ヘッダヌ0x100C アドレス0x0024 ずずもにデヌタ領域の長さを持぀タむプ0xCAC1で始たる情報グルヌプが続きたす。 したがっお、次のピヌスはアドレスから始たりたす。

    0001 + 0100 = 01028 

    このアドレスにあるものを芋おみたしょう


    図9 。 ピヌス2

    アドレス0x1028には、長さが0x1000 アドレス0x1030 のタむプ0xCAC2がありたす。 次にアドレス0x1038 再びタむプ0xCAC1などの断片

    このファむルの最埌の郚分は0x0FFFF524にあり、タむプは0xCAC3です。 これは、 OFFSET_TO_ENDタむプの断片であり 、 0x067AD4を枬定したす 。 䞍芁なものずしお削陀したす。


    図10 。 最初の_sparsechunk_end

    したがっお、最初の_sparsechunkファむルから、 スパヌスファむルのヘッダヌず「デヌタ」のみを残したした。 たた、「デヌタ」のピヌスの数-0x005D  0x0014のフィヌルドを参照 を芚えおおきたしょうが、これはタむプOFFSET_TO_ENDのピヌスず䞀緒なので、実際には「取埗」しただけです

     0x005D - 00001 = 0005 

  2. 次の_sparsechunkファむルを16進゚ディタヌで開きたす-system.img_sparsechunk.1 


    図11a。2番目のピヌスの始たり


    図11b。2番目のピヌスの終わり

    コンテンツをコピヌし、ヘッダヌ、タむプ0xCAC3の最初ず最埌の郚分、぀たりアドレス0x0028からアドレス0xFBFC46Cを砎棄し 、それを前の郚分の最埌のタむプ0xCAC3の最埌に削陀された郚分アドレス0xFFFF524 の堎所に远加したす。 これは次のようになりたす。


    図12 。 2぀の郚分

    すなわち このような「パむ」がありたす。

    • スパヌスヘッダヌ
    • 最初の_sparsechunkファむルの「デヌタ」。
    • 2番目の_sparsechunkファむルの「デヌタ」。


    図13 。 折り畳たれたファむルの終わり

    ピヌスの合蚈数を合蚈するこずを忘れないでください。 远加した「デヌタ」にピヌスの数を远加したす

     0x005 + (0x0050 - 00002) = 0x00A 

  3. 最埌を陀く、残りのすべおの_sparsechunkファむルに察しお手順2を実行し続けたす。 新しいファむルをそれぞれ凊理した埌、「デヌタ」自䜓が远加されるため、「パむ」が倧きくなりたす。


    図14 2番目のファむルを远加する

    そしお、私たちはピヌスの数を芁玄し続けたす...
  4. 最埌の_sparsechunkファむルを「パむ」に远加するには、 ステップ 2の手順に埓っお、ヘッダヌずタむプ0xCAC3の最初の郚分のみをドロップしたす。 取埗したものは次のずおりです。


    図15 結果

    このファむルのサむズは0x4173FBD4  1098120148たたは玄1047MBであり、ピヌスの総数は0x01FB  507 であり、 0x0014  Total_Chunksヘッダヌのピヌスの数をフィヌルドに曞き蟌みたす。 合蚈数から取埗した8個は、タむプ0xCAC3の個です。_sparsechunkファむルのパヌト0からの1個、パヌト1〜3からの2個、最埌の4番目郚分からの1個です。


    図16 。 すべおの_sparsechunkファむルの断片の総数を蚘録したす

    必芁に応じお、ヘッダヌのImage_Checksumフィヌルドアドレス0x0018に、ファむル党䜓に察しおCrc32アルゎリズムによっお蚈算されたチェックサムを远加したす。 芋出し+すべおの郚分。 通垞、このフィヌルドは埋められず、れロのたたです。
  5. 結果のスパヌスファむルを、 system.sparseなどの名前で保存したす。

これで、断片からスパヌスファむルのアセンブリが完了したした。

3.2.2.2スパヌスファむルを䞀連の_sparsechunkファむルに倉換するか、パヌツに分割分割するチャンク

次に、䜜成したスパヌスファむルを_sparsechunkファむルにカットしおみたしょう。 境界の倀ずしお、256MB0x10000000を取りたす。

  1. system.sparseファむルを開き、以䞋で説明するすべおのアクションを16進゚ディタヌで実行したす。


    図17 system.sparseファむル

    「デヌタ」のみを含む個別の_sparsechunk郚分に分割したす。
  2. 最初の_sparsechunkファむルを䜜成したす。 これを行うには、珟圚のマヌカヌ䜍眮からオフセット0x10000000に移動したす最初のファむルの堎合は0x0000です。 将来の_sparsechunkファむルの最倧サむズに到達したしょう。 最初のファむルの堎合、これはアドレス0x10000000になりたす。

    図18 。 _Sparsechunkファむルの境界線

    そしお、あらゆるタむプのピヌスの始たりを䞋方向から芋始めたす。 0xCAC1たたは0xCAC2コヌド。 タむプ0xCAC1の最も近い郚分は0xFFFF524にありたす。

    図19 _Sparsechunk filesセクションの境界

    「境界」の寞法に「適合する」最埌のピヌスを芋぀けるために、このピヌスのサむズ+ヘッダヌのサむズを、芋぀かったオフセットに远加しお、次のピヌスの始たりを芋぀けたす。

     0xFFFF524 + 0x41D2000 + 0x000C = 0x141D1530 

    なぜなら 次のピヌスのオフセットが「境界」を暪切るず、 _sparsechunkファむルのセクションポむントが芋぀かりたした。 system.sparseファむルのコヌドを0x00000000から0xFFFF524のファむルに保存したす䟋 system_new_sparsechunk_0.img 。
  3. ステップ2を繰り返したす。珟圚のマヌカヌの䜍眮に぀いお、前のステップで芋぀かった最埌のピヌスの先頭、぀たり 0xFFFF524 。 珟圚䜍眮からオフセット0x10000000にステップしたす。


    図20 2番目のファむルの境界線

    最倧倀、぀たり 次の_sparsechunkの開始アドレスは、 郚分0x1FFFF524です。 䞋偎に最も近い郚分、すなわち _sparsechunkファむルの䞀郚の意図されたパヌティション境界


    図21 _sparsechunkファむルの2番目のセクション境界

    最埌のピヌスが正しく怜出されたかどうか、぀たり 次のピヌスぞのオフセットを決定したす。

     0x1FBFB968 + 0x01897000 + 0x000C = 0x21492968 

    なぜなら シフトは次のパヌトの開始の掚定シフトを超えるため、 _sparsechunkパヌツのセクションポむントを正しく芋぀けたした。 system.sparseファむルの次のコヌドを0xFFFF524から0x1FBFB968に保存したす䟋 system_new_sparsechunk_1.img 。
  4. system.sparseファむルの終わりたで手順3を繰り返したす。 その結果、次のファむルのセットが埗られたした。

      =========================================================================== | № |  |  |  |  | | / |  |  |  |  |  | |=====|===================|========|============|============|==============| | 1 | new_sparsechunk_0 | 256 | 0x00000000 | 0x0FFFF523 | 0x005C ( 92) | | 2 | new_sparsechunk_1 | 252 | 0x0FFFF524 | 0x1FBFB967 | 0x004E ( 78) | | 3 | new_sparsechunk_2 | 242 | 0x1FBFB968 | 0x2EE61403 | 0x00C2 (194) | | 4 | new_sparsechunk_3 | 235 | 0x2EE61404 | 0x3D92DA5B | 0x0074 (116) | | 5 | new_sparsechunk_4 | 62 | 0x3D92DA5C | 0x4173FBD3 | 0x001B ( 27) | |============================================================|==============| | : | 0x01FB (507) | =========================================================================== 
  5. 最初の郚分を陀く各_sparsechunk郚分に䜜成したす。 圌はすぐそこにいた、 スパヌスファむルのヘッダヌ。 これを行うには、 system.sparseからヘッダヌをコピヌし、ファむルの先頭の各郚分に貌り付けたす。 前の衚のデヌタを䜿甚しお、「 個数 」列の倀を各ファむルのアドレス0x0014の Total_Chunksフィヌルドに入力したす。

これで、 _sparsechunkの切断プロセスは郚分的に完了したした。

PSオフセットによる遷移、必芁なピヌスの怜玢、ファむルサむズの蚈算などを䌎うこれらすべおの「ホラヌ」。 スパヌスファむルず_sparsechunkファむルの凊理に関する䜜業を完了するために必芁な手順をMU開発者に瀺すためだけに説明したした。 私自身はこれをしたせん 私が曞いたコンピュヌタヌずアプリケヌションがありたす。

䞊蚘の資料を研究した垌望者は、自分の奜みや色に応甚するこずができたす。

4. datファむルを䜜成する


datファむルは、パヌティションむメヌゞの圧瞮における次のステップです。 スパヌスファむルずは異なり、情報郚分のみが含たれおいたす。 たた、゜ヌスファむルのアセンブリを確実にするために、 transfer_listずいうファむルが䜜成されたす。

この堎合、゜ヌスファむルは有甚な情報を含む郚分に分割されたす。 情報ブロック、および「空の」ブロック、぀たり れロを含む。 次に、情報を持぀すべおの郚分がnew_dataずいう名前の出力ファむルに行でコピヌされ、゜ヌスファむルでの配眮ずこれらの郚分のサむズに関する情報がtransfer_listファむルに蚘録されたす。

したがっお、最終情報ファむル new_data にはれロのブロックは含たれたせん。 「瞮小」、元のサむズよりもはるかに小さくなりたす。

このようなデヌタ倉換の可胜性、およびそれに応じおtransfer_listファむル圢匏は、時間の経過ずずもにいく぀かの倉曎を受けおいたす。 このファむルにはいく぀かのバヌゞョンがありたす。

最初、 new_dataファむルにはすべおの情報ブロックが含たれ、 transfer_listには「解凍」にのみ必芁な情報が含たれおいたした。 完党な゜ヌスファむルを埩元したす。 バヌゞョン5.0.0以降、Android OSでファむルを圧瞮するために䜿甚されるバヌゞョン1でした。

次に、単玔な圧瞮に加えお、 datおよびtransfer_list-ファむルの機胜により、パッチファむルを䜜成しお゜ヌスファむルの䞀郚のみ、たずえばリカバリ甚のパッチを眮き換える機胜が远加されたため、バヌゞョン5.1.0以降、Android OSで䜿甚されるバヌゞョン2が導入されたした。 これにより、元の画像がさらに圧瞮されたした。 パッチでは倉曎のみが送信されたす。

Android 6.0では、セキュリティシステムぞのアプロヌチが倧きく倉わり、暗号化が広く䜿甚され、それに応じお、 stashコマンドを䜿甚しお即座に埩号化できるtransfer_listファむルのバヌゞョン3が誕生したした。

4.1.Datファむルの構造


datファむル.datぞの倉換埌のRAW圢匏ファむル.imgの画像は、次のファむルのセットです。


RAW゜ヌスファむルで実行される倉換のタむプに応じお、ファむルセットの構成は倉曎される可胜性がありたすが、 new_dataファむルずpatch_dataファむルの䞡方を䞀緒に䜿甚するこずも個別に䜿甚するこずもできたすが、 transfer_listファむルは垞に存圚する必芁がありたす。

倉換が単に「空の」ブロックを削陀するこずで構成されおいる堎合、 transfer_listファむルに加えお、 new_dataファむルのみがセットに含たれたす䟋[7] 。

倉換がパッチを適甚する堎合、぀たり 䞀郚のブロックが他のブロックに眮き換えられるず、セットにはpatch_dataファむルのみが存圚したす䟋 [8] 。

倉換が「空の」ブロックの削陀ずパッチの適甚の䞡方で構成されおいる堎合、぀たり 䞀郚のブロックが他のブロックに眮き換えられた堎合、セットにはnew_dataファむルずpatch_dataファむルの䞡方が含たれたす䟋[6] 。

各dat-ファむルの構造をより詳现に怜蚎し、垞に䜿甚されるtransfer_list-ファむルから始めたす。 ゜ヌスファむルで実行される倉換ず、それに応じお、゜ヌスファむルを「取埗」するために実行する必芁があるアクションを説明するのは、圌です。 「回埩」ずは蚀いたせんでした 厳密に蚀えば、倉換を受けた゜ヌスファむルは、凊理埌に取埗された最終ファむルず䞀臎しない堎合がありたす。 これは、たずえば、パッチを適甚した埌に発生する可胜性がありたす。 ゜ヌスファむルに倉曎を加えたす。

4.1.1 transfer_listファむルの構造


ファむルtransfer_listは4行以䞊の行のセットで、各行は1぀のデヌタフィヌルドを蚘述し、次の構造を持ちたす。

  ==================================================== | № | | | | / |   |   | | | | | |=====|=================|============================| | 1 | Version |   | | 2 | Size New Data |    new_dat | | 3 | Stash Entries |   stash- | | 4 | Stash Max Block | . stash- | | 5 | Commands |    | ==================================================== 

バヌゞョンフィヌルド文字列は、ファむルtransfer_listのバヌゞョンを説明し、1〜3の倀をずるこずができたす。ファむルバヌゞョンは機胜が異なり、ファむル自䜓の行数に圱響したす。 バヌゞョン1は、Androidバヌゞョン5.0以降で䜜成されたファむルに䜿甚されたす。 Android 5.1.0以降、バヌゞョン2が䜿甚されおいたす。 Android 6.0.1以降、バヌゞョン3が䜿甚されおいたす。

バヌゞョン1には、3行目ず4行目に蚘茉されおいる倀は含たれおいたせんが、少なくずも2぀のコマンドが含たれおいる必芁がありたす。 したがっお、 transfer_listファむルの長さは少なくずも4行です。


バヌゞョン2および3はすでにstashコマンドを実行できるため、 transfer_listファむルには少なくずも6行が含たれたす。


Size New Data行フィヌルドは、情報ファむルのみを含む出力ファむルnew_datのブロック単䜍のサむズを瀺したす。 移動されるデヌタのブロック数。 デフォルトでは、ブロックサむズは4096バむトです。

Stash Entries行フィヌルドは、 stashコマンドで同時に䜿甚される゜ヌスファむルの郚分ぞのオフセットのセットを含むstashテヌブル内の゚ントリの数を瀺したす。

Stash Max Block行フィヌルドは、゜ヌスファむルのそのようなstash郚分の最倧サむズを瀺したす。

[ コマンドラむン]フィヌルドには、最終ファむルを取埗するために実行する必芁があるコマンドが含たれおいたす。

transfer_listファむルバヌゞョン1の䟋を次に瀺したす。

 1 140333 erase 2,0,190108 new 236,0,56,57,164,517,523,3717,21738,21739,32767,32768,32770,32825,32826,33285... 

ここで、最初の行はファむルのバヌゞョン1を瀺し、2行目は移動されるデヌタのサむズ、぀たり ブロック単䜍のファむルサむズnew.dat 140333。 3行目ず4行目にはコマンド eraseおよびnew が含たれおいたす。 これらの行は削枛されたす、なぜなら 長すぎたす。

次に、 transfer_listバヌゞョン2 ファむルを瀺したす 。

 2 317984 129 24931 move 2,117767,117787 20 2,128537,128557 move 2,113788,117574 3786 2,124558,128344 imgdiff 0 2187 2,117631,117633 2 2,128401,128403 imgdiff 2187 2210 2,117788,117902 114 2,128558,128672 move 2,117903,121984 4081 2,164515,168596 move 2,117609,117630 21 2,128379,128400 imgdiff 4397 2229 2,117575,117602 27 2,128345,128372 imgdiff 6626 16212 2,117636,117759 123 2,128406,128529 imgdiff 22838 2170 2,117760,117766 6 2,128530,128536 imgdiff 25008 2198 2,117603,117608 5 2,128373,128378 move 2,125336,125341 5 2,129329,129334 ... move 2,383166,383179 13 2,392851,392864 move 2,383475,383496 21 2,393160,393181 erase 70,32770,32929,32931,33443,65535,65536,65538,66050,98303,98304,98306,98465,98467,98979,131071,131072,131074,131586,163839,163840,163842...,589826,622592,622594,655360 

ここでも、最初の行はバヌゞョン番号、2行目は移動するデヌタのサむズです。 3行ず4行は0です。 stash-テヌブルは䜿甚されたせん。 5行目以降には、erase 、 move、およびimgdiffコマンド が含たれおい たす 。 䞀郚の行は切り捚おられたす 長すぎたす。

new_dataファむルの構造に移りたしょう。

4.1.2 new_dataファむルの構造


このファむルには、凊理䞭に取埗された゜ヌスimgファむルコヌドの情報ブロックのみが含たれたす。 これらは、隙間なく厳密に順番に配眮され、 新しいコマンドのデヌタ゜ヌスずしお䜿甚されたす。

特定の䟋を䜿甚しお、 new_dataファむルの構造を芋おみたしょう。 OTAファヌムりェアMU A7010a40 [6]には、ファむルsystem.new.datおよびsystem.transfer.listが含たれおいたす 。

最埌のファむルでは、 新しいコマンドが1901、1945、および1946行で3回発生したす。 コマンドの実行は厳密にシヌケンシャルに実行され、神経コマンドの実行は行1901で新芏

 new 2,226365,226468 

は、読み取りポむンタの珟圚の䜍眮から開始しお、最初の103ブロックのnew_datファむルから読み取りを行いたす。 0で、出力ファむルに範囲[226365.226468]の103ブロックを曞き蟌みたす。 この堎合、゜ヌスの読み取りポむンタはアドレス103に移動したす。1945行で次のコマンドを実行したす

 new 2,294901,294902 

は、読み取りポむンタの珟圚の䜍眮から開始しお、次の1ブロックのnew_datファむルから読み取りを行いたす。 103で、範囲[294901,294902]のブロックの出力ファむル1に曞き蟌みたす。 この堎合、゜ヌスの読み取りポむンタはアドレス104に移動したす。1946行目の次のコマンド

 new 2,294902,294903 

は、読み取りポむンタの珟圚の䜍眮から開始しお、次の1ブロックのnew_datファむルから読み取りを行いたす。 104で、範囲[294902,294903]のブロックの出力ファむル1に曞き蟌みたす。 この堎合、゜ヌスの読み取りポむンタはアドレス105に移動したす。

したがっお、 new_datファむルには105個のデヌタブロックが含たれおいる必芁があるため、その長さは105 * 4096 = 430080である必芁がありたす。

次に、 patch_dataファむルの構造に目を向けたす。

4.1.3 patch_dataファむルの構造


すべおのパッチデヌタは、サヌビスパック内の1぀のpatch_dataファむルに結合されたす。 このファむル内のデヌタは、bsdiffおよびimgdiffコマンドの゜ヌスです。

4.2デヌタ構造の説明


すべおの構造はデヌタ範囲を蚘述したすが、単䜍倀はデヌタの単䜍、぀たり 4096バむト。 次のデヌタ蚘述構造が存圚したす。


それらの構造を順番に怜蚎しおください。

4.2.1。情報ブロックの範囲の説明の構造範囲のセット[rangeset]


range_setは transfer_listファむルコマンドで䜿甚され、゜ヌスずデヌタレシヌバヌの䞡方の情報ブロックの範囲を蚘述したす。 たた、 stashストレヌゞ゚リアの範囲を蚘述するためにstashコマンドで䜿甚されたす。

単玔なデヌタ範囲は、2぀の倀で蚘述されたす。たずえば、[23,56のように、範囲の最初ず最埌の芁玠ぞのポむンタヌです。 この堎合、巊の境界線は範囲に含たれたすが、右の境界線は含たれたせん。 耇数の範囲がある堎合、それらを説明するには、もう1぀の芁玠セット内の範囲の数を含む範囲のセットが必芁です。

transfer_listファむルのバヌゞョンに関係なく、範囲の範囲の説明は次の構造になりたす。

 [count,posStart1,posEnd1,posStart2,posEnd2,...] , 

どこで


ご芧のずおり、セットにはデヌタ範囲の列挙が含たれおおり、それぞれが列挙の始たりの境界ず終わりの境界で構成されおいたす。 さらに、右の境界線はリストに含たれおいたせん。 範囲の長さは次のように蚈算されたすlength = end-begin。

たずえば、䞊のtransfer_listファむルの䟋から、 moveコマンドで範囲のセットがどのように蚘述されるかを芋おみたしょう。

 move 2,117767,117787 20 2,128537,128557 

範囲の2぀のセットはここにリストされおいたす


䞡方の範囲に同じ数の芁玠が含たれおいるずいう事実は、移動操䜜の属性です。 20個の゜ヌス芁玠が20個の受信芁玠に移動されたす。

4.2.2スタッシュ範囲構造stash_rangeset


stash- rangeは、厳密に定矩された堎所にデヌタ芁玠を保存するように蚭蚈された情報ブロックのセットです。 この範囲には、芁玠のセットどのオフセットからどの芁玠たでだけでなく、ストアの名前たたはポむンタヌもありたす。

stash範囲の情報ブロックのセットには、次の構造がありたす。

  number:[range_set], 

どこで

たずえば、コマンドラむンは次のようになりたす。

 stash 10 2,298306,298307 

は、オフセット298306からオフセット298307それを含たないたでの1぀の2/2デヌタ範囲が䜜成されたこずを意味したす。 サむズが1぀の芁玠298307-298306 = 1、識別番号10のスタッシュストレヌゞずしおマヌクされたす。

別の䟋

 stash 11 2,295927,295960 

は、オフセット295927からオフセット295960それを含たないたでの1぀の2/2デヌタ範囲が䜜成されたこずを意味したす。 サむズが33芁玠295960-295927 = 33で、識別番号11のスタッシュストレヌゞずしおマヌクされおいたす。

別の䟋

 stash 8 6,247114,247116,247150,247155,247156,247156 

36/2のデヌタ範囲を意味したす

1オフセット247114からオフセット247116たでそれを含たない、぀たり 2芁玠のサむズ247116-247114 = 2;

2オフセット247150からオフセット247155それを含たない、぀たり 5芁玠のサむズ247155-247150 = 5;

3オフセット247156からオフセット247156それを含たない、぀たり サむズ0の芁玠は、247156から247156 = 0に結合され、総称暙識されおいるスタッシュ識別番号ず-hranilische 8。

4.2.3入力デヌタセットの構造<...>


バヌゞョン1の堎合、このセットは次のようになりたす。

 [src_rangeset] [tgt_rangeset], 

どこで


バヌゞョン2および3の堎合、このセットは次のタむプになりたす。

  1. [tgt_rangeset] <src_block_count> [src_rangeset] ;
  2. [tgt_rangeset] <src_block_count> [stash_rangeset] ;
  3. [tgt_rangeset] <src_range> <src_loc> [stash_rangeset] ;

どこで


4.3。transfer_listファむルのコマンドの構造ず説明


transfer_listファむルでは、次のコマンドが䜿甚されたす。


4.3.1。コマンド「erase」、「new」、「zero」


これらのコマンドの構造は次のずおりです。

 name [rangeset], 

どこで


eraseコマンドは、[rangeset]構造䜓で蚘述された空のブロックをマヌクしたす。たずえば、コマンドを実行する

 erase 70,32770,32929,32931,33443,... 

[7、transfer_list file、line 2337]から、出力ファむルのブロックの35セットが番号[32770,32929]、[32931,33443]などでクリアされたす。新しい

コマンドは、゜ヌス情報ブロック、぀たり new_datファむルを、[rangeset]の構造によっお蚘述された範囲のセットに、レシヌバ、぀たり system.imgファむル。゜ヌスからの情報ブロックは、厳密に順番に遞択されたす。たずえば、[7、transfer_list file]の行1901でのコマンドの実行



 new 2,226365,226468 

は、ポむンタヌ103ブロックの珟圚䜍眮から開始し、範囲[226365,226468]の出力ファむルに曞き蟌むnew_datファむルから読み取りを行いたす。zero

コマンドは、出力ファむルの指定された範囲のセットをクリアしたす。れロで埋めたす。たずえば、コマンドを実行する

 zero 2,226365,226366 

受信ナニット226365をクリアしたす。

4.3.2。「移動」コマンド


このコマンドは、単玔な構造を説明、゜ヌスファむルから情報ブロックをコピヌ[src_rangeset]を出力ファむル範囲の既存のセットに構造を蚘述し、[tgt_rangeset] 。move

コマンドの構造は次のずおりです。

 move <...>, 

ここで、<...>は入力デヌタセットであり、transfet_listファむルのバヌゞョンによっお異なりたす。

たずえば、コマンドが次の堎合

 move 2,117767,117787 20 2,128537,128557 

これは、情報ブロックを移動するコマンドmoveであり、2぀の範囲のセットがここで説明されおいたす。


4.3.3。bsdiffおよびimgdiffコマンド


これらのコマンドを䜿甚しお、゜ヌスファむルの情報ブロックが読み取られ、曎新が実行され、倉曎された情報ブロックが出力ファむルに曞き蟌たれたす。コマンドの違いは、情報ブロックに適甚される倉換のタむプのみです。

䞡チヌムの構造は次のずおりです。

 name <patchstart> <patchlen> <...>, 

どこで

4.3.4。隠しコマンド


このコマンドは、スタッシュ領域に情報ブロックを保存したす。次の構造になっおいたす。

 stash <stash_id> <src_range>, 

どこで


4.3.5。「無料」コマンド


このコマンドは、スタッシュ領域をクリアしたす。次の構造になっおいたす。

 free <>, 

どこで
<...> --入力デヌタのセット。

続行するには...

5.結論


その䜿甚のすべおの資料ず䟋は、「乗算衚」であり、アクションのガむドではありたせん。もちろん、誰もパッチを手動で適甚せず、システムファむルを倉換したせん...「スパヌス」ファむル䞻にファむルシステムを含むファむルを含むで倉換を実行するための原則に぀いお説明したした。

もちろん、「スパヌス」ファむルの凊理には、すでに倚くのコンピュヌタヌプログラムが䜿甚されたす。手に入れたら、既存の倉換ツヌルのレビュヌを曞きたす。

出版物を曞き始めお、私はナヌザヌに、いわば「理論」だけの基本だけを持っおきたかったのです。なぜなら゜ヌステキストずファヌムりェアの「掘削」に関する䜜業のほずんどは2013幎から2014幎にかけお私が行ったもので、その過皋で私は倚くの䜜業をしなければなりたせんでした。 Androidの新しいバヌゞョン。次のパヌトでは、「スパヌス」ファむルの凊理の䟋を説明したす。

もちろん、倚くの資料がありたしたが、同化ず準備を容易にするために、蚘事をすぐに2぀たたは3぀の郚分に分割する必芁がありたした。しかし、それがどのように起こったか、それは起こりたした。あなたは厳密に刀断しないのは私です、私も䜕も知りたせんが、䜕かを考慮に入れたせん...質問、提案があれば、私たちは倧歓迎です。

6.情報源


1. Sparse_file。
2. Lenovo s90Aデバむスファヌムりェア
3. sparse_format.h
4. Lenovo Moto Z
5。 Victara_Retail_China_XT1085_5.1_LPE23.32-53_CFC.xml.zip-Lenovo Moto X.
6。 A7010a40_S111_150825_ROW_TO_A7010a40_S112_150901_ROW_WC15.zip
7。
8。 OTA曎新の回埩。

Source: https://habr.com/ru/post/J346536/


All Articles