import Ġcom . android . build . api . artifact . Single Artifact Ċ import Ġcom . android . build . api . variant .* Ċ import Ġorg . gradle . api . Default Task Ċ import Ġorg . gradle . api . Plugin Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . file . Directory Property Ċ import Ġorg . gradle . api . file . Regular File Property Ċ import Ġorg . gradle . api . provider . Property Ċ import Ġorg . gradle . api . tasks .* Ċ import Ġorg . gradle . kotlin . dsl . getBy Type Ċ import Ġjava . io . File Ċ Ċ class ĠVariant V 2 Advanced Plugin Ġ: ĠPlugin < Project > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġapply ( project : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġandroid Extension Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . extensions . getBy Type ( Application Android Components Extension :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġandroid Extension . on Variants Ġ{ Ġvariant Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain Output : ĠVariant Output Ġ= Ġvariant . outputs . single Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . output Type Ġ== ĠVariant Output Configuration . OutputType . SINGLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariant Capital ized Name Ġ= Ġvariant . name . capitalize () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExample Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrename A pk Task Ġ= Ġproject . tasks . register ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" rename ${ variant Capital ized Name } A pk ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRename A pk File :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapk Folder Provider Ġ= Ġvariant . artifacts . get ( Single Artifact . AP K ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . out A pk . set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( apk Folder Provider . get (). as File , Ġ" custom -${ main Output . version Name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . apk Folder . set ( apk Folder Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . built Artifacts Loader . set ( variant . artifacts . get Built Artifacts Loader ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExample Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpost Update Task Ġ= Ġproject . tasks . register ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" post Update ${ variant Capital ized Name } Manifest ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest After Merge Task :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariant . artifacts ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. use ( post Update Task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. w ired With Files ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest After Merge Task :: merged Manifest , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest After Merge Task :: updated Manifest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Transform ( Single Artifact . MER GED _ MAN IFEST ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExample Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Task Provider : ĠTask Provider < Notification Task > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġproject . tasks . register ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" notify ${ variant Capital ized Name } Build ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Task :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle . set ("${ project . name } Ġapk Ġis Ġbuilt Ġsuccessfully .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Note . set ( rename A pk Task . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġit . out A pk . get (). as File . length () Ġ/ Ġ 1 0 2 4 . 0 Ġ/ Ġ 1 0 2 4 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" A pk Ġ- Ġ$ size ĠMB " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġclass ĠManifest After Merge Task Ġ: ĠDefault Task () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ get : Input File ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġmerged Manifest : ĠRegular File Property ĊĊĠĠĠĠĠĠĠ Ġ@ get : OutputFile ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġupdated Manifest : ĠRegular File Property ĊĊĠĠĠĠĠĠĠ Ġ@ Task Action ĊĠĠĠĠĠĠĠ Ġfun Ġafter Merge () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodified Manifest Ġ= Ġmerged Manifest . get (). as File . read Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace (" allow Backup =\" true \"", Ġ" allow Backup =\" false \" ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdated Manifest . get (). as File . write Text ( modified Manifest ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġclass ĠRename A pk File Ġ: ĠDefault Task () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ get : Input Files ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġapk Folder : ĠDirectory Property ĊĊĠĠĠĠĠĠĠ Ġ@ get : Internal ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġbuilt Artifacts Loader : ĠProperty < Built Artifacts Loader > ĊĊĠĠĠĠĠĠĠ Ġ@ get : OutputFile ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġout A pk : ĠRegular File Property ĊĊĠĠĠĠĠĠĠ Ġ@ Task Action ĊĠĠĠĠĠĠĠ Ġfun Ġtask Action () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilt Artifacts Ġ= Ġbuilt Artifacts Loader . get (). load ( apk Folder . get ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠRuntimeException (" Cannot Ġload ĠA PK s ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( built Artifacts . elements . single (). outputFile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. copy To ( out A pk . get (). as File ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġclass ĠNotification Task Ġ: ĠDefault Task () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ get : Input ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġtitle : ĠProperty < String > ĊĊĠĠĠĠĠĠĠ Ġ@ get : Input ĊĠĠĠĠĠĠĠ Ġabstract Ġval Ġrelease Note : ĠProperty < String > ĊĊĠĠĠĠĠĠĠ Ġ@ Task Action ĊĠĠĠĠĠĠĠ Ġfun Ġtask Action () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ"${ title . get () }\ n ${ release Note . get () }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= Ġ" 1 2 3 4 5 6 7 8 9 " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Client (). send ( message , Ġchannel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġclass ĠNotification Client Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġsend ( message : ĠString , Ġchannel : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Notification Task : Ġsending Ġ\"$ message \" Ġto Ġchannel Ġ$ channel ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }