import Ġcom . android . build . gradle . api . Application Variant Ċ import Ġorg . gradle . api . Default Task Ċ import Ġorg . gradle . api . file . Directory Property Ċ import Ġorg . gradle . api . tasks .* Ċ import Ġorg . gradle . work . Incremental Ċ import Ġorg . gradle . work . Input Changes Ċ import Ġjava . security . Message Digest Ċ Ċ abstract Ġclass ĠGenerate Checksum Task Ġ: ĠDefault Task () Ġ{ ĊĠĠĠ Ġabstract Ġval Ġinput : ĠDirectory Property ĊĠĠĠĠĠĠĠ Ġ@ Input Directory Ġ@ Incremental Ġ@ Path Sensitive ( Path Sensitivity . REL ATIVE ) Ġget ĊĊĠĠĠ Ġabstract Ġval Ġoutput : ĠDirectory Property ĊĠĠĠĠĠĠĠ Ġ@ Output Directory Ġget ĊĊĠĠĠ Ġfun Ġfrom Application Variant ( variant : ĠApplication Variant ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinput . set ( project . generated Mag isk Dir ( variant )) ĊĠĠĠĠĠĠĠ Ġoutput . set ( project . generated Mag isk Checksum Dir ( variant )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Task Action ĊĠĠĠ Ġfun Ġgenerate ( input Changes : ĠInput Changes ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinput Changes . getFile Changes ( input ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . file . isDirectory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( EXCL UDE S . any Ġ{ Ġe Ġ-> Ġit . normalized Path . startsWith ( e ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= ĠMessage Digest . getInstance (" SHA - 2 5 6 "). digest ( it . file . read Bytes ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ("") Ġ{ Ġb Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ("% 0 2 x ", Ġb . toInt () Ġand Ġ 0 xFF ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . file ( it . normalized Path Ġ+ Ġ". sha 2 5 6 sum "). get (). as File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġparent File . mkdir s () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. write Text ( text ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠEX CL UDE S Ġ= Ġset Of (" customize . sh ", Ġ" verify . sh ", Ġ" META - INF ", Ġ" README . md ") ĊĠĠĠ Ġ} Ċ }