package Ġc fig . boot img . v 3 Ċ Ċ import Ġc fig . boot img . Common Ċ import Ġc fig . io . Struct 3 Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . InputStream Ċ Ċ @ Opt In ( Experimental Unsigned Types :: class ) Ċ class ĠBoot Header V 3 ( ĊĠĠĠĠĠĠĠ Ġvar Ġkernel Size : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġram disk Size : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġos Version : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġvar Ġos Patch Level : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġvar Ġheader Size : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġheader Version : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġcmd line : ĠString Ġ= Ġ"" Ċ ) Ġ{ ĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġconstructor ( i S : ĠInputStream ?) Ġ: Ġthis () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( i S Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog . warn (" Boot Img Header V 3 Ġconstructor ") ĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= ĠStruct 3 ( FORMAT _ STRING ). unpack ( i S ) ĊĠĠĠĠĠĠĠ Ġassert ( 1 1 Ġ== Ġinfo . size ) ĊĠĠĠĠĠĠĠ Ġif Ġ( info [ 0 ] Ġ!= Ġmagic ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" stream Ġdoesn 't Ġlook Ġlike ĠAndroid ĠBoot ĠImage ĠV 3 ĠHeader ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . kernel Size Ġ= Ġ( info [ 1 ] Ġas ĠUInt ). toInt () ĊĠĠĠĠĠĠĠ Ġthis . ram disk Size Ġ= Ġ( info [ 2 ] Ġas ĠUInt ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġos N Patch Ġ= Ġinfo [ 3 ] Ġas ĠUInt ĊĠĠĠĠĠĠĠ Ġif Ġ( 0 U Ġ!= Ġos N Patch ) Ġ{ Ġ// tre ated Ġas Ġ' reserved ' Ġin Ġthis Ġboot Ġimage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . os Version Ġ= ĠCommon . parse Os Version ( os N Patch . toInt () Ġshr Ġ 1 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . os Patch Level Ġ= ĠCommon . parse Os Patch Level (( os N Patch Ġand Ġ 0 x 7 ff . to UInt ()). toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . header Size Ġ= Ġ( info [ 4 ] Ġas ĠUInt ). toInt () ĊĠĠĠĠĠĠĠ Ġ// 5 , 6 , 7 , 8 Ġreserved ĊĠĠĠĠĠĠĠ Ġthis . header Version Ġ= Ġ( info [ 9 ] Ġas ĠUInt ). toInt () ĊĊĠĠĠĠĠĠĠ Ġthis . cmdline Ġ= Ġinfo [ 1 0 ] Ġas ĠString ĊĊĠĠĠĠĠĠĠ Ġassert ( this . header Size Ġin Ġint ArrayOf ( BOOT _ IMAGE _ HEADER _ V 3 _ SIZE )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġencode (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠStruct 3 ( FORMAT _ STRING ). pack ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmagic , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkernel Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġram disk Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( Common . pack Os Version ( os Version ) Ġshl Ġ 1 1 ) Ġor ĠCommon . pack Os Patch Level ( os Patch Level ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader Version , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmd line ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Boot Img Header V 3 ( kernel Size =$ kernel Size , Ġram disk Size =$ ram disk Size , Ġos Version =$ os Version , Ġos Patch Level =$ os Patch Level , Ġheader Size =$ header Size , Ġheader Version =$ header Version , Ġcmd line ='$ cmdline ')" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Boot Header V 3 :: class . java ) ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġmagic Ġ= Ġ" ANDROID !" ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFORMAT _ STRING Ġ= Ġ" 8 s " Ġ+ Ġ// " ANDROID !" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 4 I " Ġ+ Ġ// kernel Ġsize , Ġram disk Ġsize , Ġos _ version / patch , Ġheader Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 4 I " Ġ+ Ġ// reserved ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" I " Ġ+ Ġ Ġ// header Ġversion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 5 3 6 s " ĠĠĠĠ Ġ// cmdline ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBO OT _ IMAGE _ HEADER _ V 3 _ SIZE Ġ= Ġ 1 5 8 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠpageSize : ĠInt Ġ= Ġ 4 0 9 6 ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( BOOT _ IMAGE _ HEADER _ V 3 _ SIZE Ġ== ĠStruct 3 ( FORMAT _ STRING ). calc Size ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" internal Ġerror : Ġexpected Ġsize Ġ$ BOOT _ IMAGE _ HEADER _ V 3 _ SIZE Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ