package Ġcom . tencent . vas dol ly . plugin . task Ċ Ċ import Ġcom . android . build . api . artifact . Single Artifact Ċ import Ġcom . android . build . api . variant . Application Variant Ċ import Ġcom . tencent . vas dol ly . plugin . extension . Channel Config Extension Ċ import Ġcom . tencent . vas dol ly . plugin . util . Simple AG P Version Ċ import Ġorg . gradle . api . Gradle Exception Ċ import Ġorg . gradle . api . Invalid UserData Exception Ċ import Ġorg . gradle . api . file . Directory Ċ import Ġorg . gradle . api . provider . Provider Ċ import Ġorg . gradle . api . tasks . Input Ċ import Ġorg . gradle . api . tasks . Input Directory Ċ import Ġorg . gradle . api . tasks . Internal Ċ import Ġorg . gradle . api . tasks . Task Action Ċ import Ġjava . io . File Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . format . DateTime Formatter Ċ Ċ open Ġclass ĠA pk Channel Package Task Ġ: ĠChannel Package Task () Ġ{ ĊĠĠĠ Ġ// Ġå½ĵåīį åŁºç¡Ģ apk ĊĠĠĠ Ġ@ Internal ĊĠĠĠ Ġvar Ġbase A pk : ĠFile ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ get : Input ĊĠĠĠ Ġvar Ġvariant : ĠApplication Variant ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ get : Input ĊĠĠĠ Ġvar Ġchannel Extension : ĠChannel Config Extension ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Task Action ĊĠĠĠ Ġfun Ġtask Action () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// 1 . check Ġall Ġparams ĊĠĠĠĠĠĠĠ Ġcheck Parameter (); ĊĠĠĠĠĠĠĠ Ġ// 2 . generate Ġchannel Ġapk ĊĠĠĠĠĠĠĠ Ġgenerate Channel A pk (); ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** * ĊĠĠĠĠ Ġ* Ġcheck Ġchannel Ġplugin Ġparams ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck Parameter () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( merge Ext Channel List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmerge Channel List () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// 1 . check Ġchannel ĠList ĊĠĠĠĠĠĠĠ Ġif Ġ( channel List . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid UserData Exception (" Task Ġ$ name Ġchannel Ġlist Ġis Ġempty , please Ġcheck Ġit ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprintln (" Task Ġ$ name , Ġchannel List : Ġ$ channel List ") ĊĊĊĠĠĠĠĠĠĠ Ġ// 2 . check Ġbase Ġapk ĊĠĠĠĠĠĠĠ Ġif Ġ( variant Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid UserData Exception (" Task Ġ$ name Ġvariant Ġis Ġnull ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbase A pk Ġ= Ġget Variant Base A pk () Ġ?: Ġthrow ĠRuntimeException (" can 't Ġfind Ġbase Ġapk ") ĊĠĠĠĠĠĠĠ Ġprintln (" Task Ġ$ name , Ġbase A pk : Ġ${ base A pk ?. absolute Path }") ĊĊĊĠĠĠĠĠĠĠ Ġ// 3 . check ĠChannel Extension ĊĠĠĠĠĠĠĠ Ġif Ġ( channel Extension Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid UserData Exception (" Task Ġ$ name Ġchannel Ġis Ġnull ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġchannel Extension ?. check Params () ĊĠĠĠĠĠĠĠ Ġprintln (" Task Ġ$ name , Ġchannel Ġfiles Ġoutput Dir :${ channel Extension ?. output Dir ?. absolute Path }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" Private Api ") ĊĠĠĠ Ġprivate Ġfun Ġget Variant Base A pk (): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvariant ?. let Ġ{ Ġvariant Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent AG P Version Ġ= ĠSimple AG P Version . ANDROID _ GRAD LE _ PLUGIN _ VERSION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġag p Version 7 Ġ= ĠSimple AG P Version ( 7 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapk Folder Ġ= Ġif Ġ( current AG P Version Ġ< Ġag p Version 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// AG P 4 . 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartifact Cls Ġ= ĠClass . forName (" com . android . build . api . artifact . Artifact Type ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapk Class Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass . forName (" com . android . build . api . artifact . Artifact Type ${ '$ '} AP K "). kotlin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= Ġvariant . artifacts . java Class . getMethod (" get ", Ġartifact Cls ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. invoke ( variant . artifacts , Ġapk Class . object Instance ) Ġas ĠProvider < Directory > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// AG P 7 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariant . artifacts . get ( Single Artifact . AP K ). get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvariant . artifacts . get Built Artifacts Loader (). load ( apk Folder )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( it . elements . first (). outputFile ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** * ĊĠĠĠĠ Ġ* Ġæł¹æį® çŃ¾åĲį ç±»åŀĭ çĶŁæĪĲ ä¸įåĲĮçļĦ æ¸ ł éģĵ åĮħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgenerate Channel A pk () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Dir Ġ= Ġchannel Extension ?. output Dir ĊĠĠĠĠĠĠĠ Ġprintln (" generate Channel A pk Ġbase A pk :${ base A pk ?. absolute Path }, output Dir :${ output Dir ?. path }") ĊĠĠĠĠĠĠĠ Ġval Ġsigning Config Ġ= Ġvariant ?. signing Config !! ĊĠĠĠĠĠĠĠ Ġval Ġlow Memory Ġ= Ġchannel Extension ?. low Memory Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġis Fast Mode Ġ= Ġchannel Extension ?. fast Mode Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsigning Config . enable V 2 Signing . get () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate V 2 Channel A pk ( base A pk !! , Ġoutput Dir !! , Ġlow Memory , Ġis Fast Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsigning Config . enable V 1 Signing . get () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate V 1 Channel A pk ( base A pk !! , Ġoutput Dir !! , Ġis Fast Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠGradle Exception (" not Ġhave Ġprecise Ġchannel Ġpackage Ġmode "); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** * ĊĠĠĠĠ Ġ* Ġèİ·åıĸ æ¸ ł éģĵ æĸĩä»¶ åĲį ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Channel A pk Name ( base A pk Name : ĠString , Ġchannel : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtime Format Ġ= ĠChannel Config Extension . DEFAULT _ DATE _ FORMAT ĊĠĠĠĠĠĠĠ Ġif Ġ( channel Extension ?. build Time DateFormat !!. isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Format Ġ= Ġchannel Extension ?. build Time DateFormat !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbuild Time Ġ= ĠLocalDateTime . now (). format ( DateTime Formatter . of Pattern ( time Format )) ĊĠĠĠĠĠĠĠ Ġval Ġout Info Ġ= Ġvariant ?. outputs ?. first () ĊĊĠĠĠĠĠĠĠ Ġval Ġkey Value : ĠMutable Map < String , ĠString > Ġ= Ġmutable Map Of () ĊĠĠĠĠĠĠĠ Ġkey Value [" appName "] Ġ= Ġproject . name ĊĠĠĠĠĠĠĠ Ġkey Value [" flavor Name "] Ġ= Ġchannel ĊĠĠĠĠĠĠĠ Ġkey Value [" build Type "] Ġ= Ġvariant ?. build Type Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġkey Value [" version Name "] Ġ= Ġout Info ?. version Name ?. get () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġkey Value [" version Code "] Ġ= Ġout Info ?. version Code ?. get (). toString () ĊĠĠĠĠĠĠĠ Ġkey Value [" appId "] Ġ= Ġvariant ?. application Id ?. get () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġkey Value [" build Time "] Ġ= Ġbuild Time ĊĊĠĠĠĠĠĠĠ Ġ// é»ĺè®¤ æĸĩä»¶ åĲį ĊĠĠĠĠĠĠĠ Ġvar Ġapk Name Prefix Ġ= ĠChannel Config Extension . DEFAULT _ AP K _ NAME _ FORMAT ĊĠĠĠĠĠĠĠ Ġif Ġ( channel Extension ?. apk Name Format !!. isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapk Name Prefix Ġ= Ġchannel Extension ?. apk Name Format !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġkey Value . forEach Ġ{ Ġ( k , Ġv ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapk Name Prefix Ġ= Ġapk Name Prefix . replace ("${ '$ '} {" Ġ+ Ġk Ġ+ Ġ" }", Ġv ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ apk Name Prefix . apk " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** * ĊĠĠĠĠ Ġ* Ġèİ·åıĸ æ¸ ł éģĵ åĪĹè¡¨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Extension Channel List (): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġchannel Extension ?. getExtension Channel List () Ġ?: ĠlistOf () ĊĠĠĠ Ġ} Ċ }