/* Ċ Ġ* ĠTencent Ġis Ġplease d Ġto Ġsupport Ġthe Ġopen Ġsource Ġcommunity Ġby Ġmaking ĠTencent ĠShadow Ġavailable . Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠTH L ĠA 2 9 ĠLimited , Ġa ĠTencent Ġcompany . Ġ ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠBSD Ġ 3 - Clause ĠLicense Ġ( the Ġ" License "); Ġyou Ġmay Ġnot Ġuse Ċ Ġ* Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ċ Ġ* Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// opensource . org / licenses / BSD - 3 - Clause Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġcom . tencent . shadow . core . gradle Ċ Ċ import Ġcom . tencent . shadow . core . gradle . extensions . Package Plugin Extension Ċ import Ġcom . tencent . shadow . core . gradle . extensions . Plugin Build Type Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . Task Ċ import Ġorg . gradle . api . tasks . bund ling . Zip Ċ import Ġjava . io . Buffered Writer Ċ import Ġjava . io . File Ċ import Ġjava . io . FileWriter Ċ Ċ internal Ġfun Ġcreate Package Plugin Task ( project : ĠProject , Ġbuild Type : ĠPlugin Build Type ): ĠTask Ġ{ ĊĠĠĠ Ġreturn Ġproject . tasks . create (" package ${ build Type . name . capitalize ()} Plugin ", ĠZip :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠ Ġproject . logger . info (" Package Plugin Task Ġtask Ġrun ") ĊĊĠĠĠĠĠĠĠ Ġ// runtime Ġapk Ġfile ĊĠĠĠĠĠĠĠ Ġval Ġruntime A pk Name : ĠString Ġ= Ġbuild Type . runtime A pk Config . v 1 ĊĠĠĠĠĠĠĠ Ġvar Ġruntime File : ĠFile ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( runtime A pk Name . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġruntime File Ġ= ĠShadow Plugin Helper . get Runtime A pk File ( project , Ġbuild Type , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// loader Ġapk Ġfile ĊĠĠĠĠĠĠĠ Ġval Ġloader A pk Name : ĠString Ġ= Ġbuild Type . loader A pk Config . v 2 ĊĠĠĠĠĠĠĠ Ġvar Ġloader File : ĠFile ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( loader A pk Name . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloader File Ġ= ĠShadow Plugin Helper . get Loader A pk File ( project , Ġbuild Type , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// config Ġfile ĊĠĠĠĠĠĠĠ Ġval Ġtarget ConfigFile Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( project . build Dir . absolute Path Ġ+ Ġ"/ inter medi ates / generate Plugin Config /${ build Type . name }/ config . json ") ĊĠĠĠĠĠĠĠ Ġtarget ConfigFile . parent File . mkdir s () ĊĊĊĠĠĠĠĠĠĠ Ġ// all Ġplugin Ġap ks ĊĠĠĠĠĠĠĠ Ġval Ġplugin Files : ĠMutable List < File > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġbuild Type . plugin A pk s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplugin Files . add ( Shadow Plugin Helper . get Plugin File ( project , Ġi )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġit . group Ġ= Ġ" plugin " ĊĠĠĠĠĠĠĠ Ġit . description Ġ= Ġ" æīĵ åĮħ æıĴä»¶ " ĊĠĠĠĠĠĠĠ Ġit . outputs . up ToDate When Ġ{ Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( runtime File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplugin Files . add ( runtime File ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( loader File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplugin Files . add ( loader File ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġit . from ( plugin Files , Ġtarget ConfigFile ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpackage Plugin Ġ= Ġproject . extensions . find ByName (" package Plugin ") ĊĠĠĠĠĠĠĠ Ġval Ġextension Ġ= Ġpackage Plugin Ġas ĠPackage Plugin Extension ĊĊĠĠĠĠĠĠĠ Ġval Ġsuffix Ġ= Ġif Ġ( extension . archive Suffix . isEmpty ()) Ġ"" Ġelse Ġextension . archive Suffix ĊĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġif Ġ( extension . archive Prefix . isEmpty ()) Ġ" plugin " Ġelse Ġextension . archive Prefix ĊĠĠĠĠĠĠĠ Ġif Ġ( suffix . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . archive Name Ġ= Ġ"$ prefix -${ build Type . name }. zip " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . archive Name Ġ= Ġ"$ prefix -${ build Type . name }- $ suffix . zip " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= ĠFile ( extension . destination Dir +" /${ build Type . name }") ĊĠĠĠĠĠĠĠ Ġif Ġ(! parent . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . mkdir s () ĊĠĠĠĠĠĠĠ Ġit . destination Dir Ġ= Ġparent ĊĠĠĠ Ġ}. depends On ( create Generate Config Task ( project , Ġbuild Type )) Ċ } ĊĊ Ċ /** Ċ Ġ* Ġæĭ · è´Ŀ èµĦæºĲ åĪ° å®īåħ¨ åľ° çĤ¹ Ġ éĺ² æŃ¢ è¢« ĠAndroid Ġstudio Ġæ¸ ħ éĻ¤ Ċ Ġ*/ Ċ private Ġfun Ġcopy Resources ( project : ĠProject , Ġbuild Type : ĠPlugin Build Type ) Ġ{ ĊĊĠĠĠ Ġval Ġrun Time A pk Ġ= ĠShadow Plugin Helper . get Runtime A pk File ( project , Ġbuild Type , Ġfalse ) ĊĠĠĠ Ġif Ġ( run Time A pk . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= ĠShadow Plugin Helper . get Runtime A pk File ( project , Ġbuild Type , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġif Ġ( copy . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy . delete () ĊĠĠĠĠĠĠĠ Ġcopy . createNew File () ĊĠĠĠĠĠĠĠ ĠShadow Plugin Helper . copy File ToFile ( run Time A pk , Ġcopy ) ĊĠĠĠĠĠĠĠ Ġprintln (" runtime Ġapk Ġfile Ġupdate Ġsuccessful Ġpath :${ copy }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġloader A pk Ġ= ĠShadow Plugin Helper . get Loader A pk File ( project , Ġbuild Type , Ġfalse ) ĊĠĠĠ Ġif Ġ( loader A pk . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= ĠShadow Plugin Helper . get Loader A pk File ( project , Ġbuild Type , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġif Ġ( copy . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy . delete () ĊĠĠĠĠĠĠĠ Ġcopy . createNew File () ĊĠĠĠĠĠĠĠ ĠShadow Plugin Helper . copy File ToFile ( loader A pk , Ġcopy ) ĊĠĠĠĠĠĠĠ Ġprintln (" loader Ġapk Ġfile Ġupdate Ġsuccessful Ġpath :${ copy }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// æĭ · è´Ŀ åĪ° Ġ åŃĺ æĶ¾ çļĦ çĽ®å½ķ çĶ¨äºİ Ġä½¿çĶ¨ ĊĠĠĠ Ġval Ġmanager A pk Ġ= ĠShadow Plugin Helper . getManager File ( project , Ġbuild Type , Ġfalse ) ĊĠĠĠ Ġif Ġ( manager A pk . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= ĠShadow Plugin Helper . getManager File ( project , Ġbuild Type , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġif Ġ( copy . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy . delete () ĊĠĠĠĠĠĠĠ Ġcopy . createNew File () ĊĠĠĠĠĠĠĠ ĠShadow Plugin Helper . copy File ToFile ( manager A pk , Ġcopy ) ĊĠĠĠĠĠĠĠ Ġprintln (" manager Ġapk Ġfile Ġupdate Ġsuccessful Ġpath :${ copy }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġbuild Type . plugin A pk s . forEach Ġ{ ĊĠĠĠĠĠĠĠ ĠShadow Plugin Helper . copy Plugin File ( project , Ġit ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġcreate Generate Config Task ( project : ĠProject , Ġbuild Type : ĠPlugin Build Type ): ĠTask Ġ{ ĊĠĠĠ Ġproject . logger . info (" Generate Config Task Ġtask Ġrun ") ĊĠĠĠ Ġval Ġpackage Plugin Ġ= Ġproject . extensions . find ByName (" package Plugin ") ĊĠĠĠ Ġval Ġextension Ġ= Ġpackage Plugin Ġas ĠPackage Plugin Extension ĊĊĠĠĠ Ġ// runtime Ġapk Ġbuild Ġtask ĊĠĠĠ Ġval Ġruntime A pk Name Ġ= Ġbuild Type . runtime A pk Config . v 1 ĊĠĠĠ Ġvar Ġruntime Task Ġ= Ġ"" ĊĠĠĠ Ġif Ġ( runtime A pk Name . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġruntime Task Ġ= Ġbuild Type . runtime A pk Config . v 2 ĊĠĠĠĠĠĠĠ Ġproject . logger . info (" runtime Ġtask Ġ= Ġ$ runtime Task ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// loader Ġapk Ġbuild Ġtask ĊĠĠĠ Ġval Ġloader A pk Name Ġ= Ġbuild Type . loader A pk Config . v 1 ĊĠĠĠ Ġvar Ġloader Task Ġ= Ġ"" ĊĠĠĠ Ġif Ġ( loader A pk Name . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġloader Task Ġ= Ġbuild Type . loader A pk Config . v 2 ĊĠĠĠĠĠĠĠ Ġproject . logger . info (" loader Ġtask Ġ= Ġ$ loader Task ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmanager A pk Name Ġ= Ġbuild Type . manager A pk Config . v 1 ĊĠĠĠ Ġvar Ġmanager Task Ġ= Ġ"" ĊĠĠĠ Ġif Ġ( manager A pk Name . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġmanager Task Ġ= Ġbuild Type . manager A pk Config . v 2 ĊĠĠĠĠĠĠĠ Ġproject . logger . info (" loader Ġtask Ġ= Ġ$ manager Task ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtarget ConfigFile Ġ= ĊĠĠĠĠĠĠĠ ĠFile ( project . build Dir . absolute Path Ġ+ Ġ"/ inter medi ates / generate Plugin Config /${ build Type . name }/ config . json ") ĊĊĊĠĠĠ Ġval Ġplugin A pk Tasks : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĠĠĠ Ġfor Ġ( i Ġin Ġbuild Type . plugin A pk s ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġi . build Task ĊĠĠĠĠĠĠĠ Ġproject . logger . info (" plugin A pk Projects Ġtask Ġ= Ġ$ task ") ĊĠĠĠĠĠĠĠ Ġplugin A pk Tasks . add ( task ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtask Ġ= Ġproject . tasks . create (" generate ${ build Type . name . capitalize ()} Config ") Ġ{ ĊĠĠĠĠĠĠĠ Ġit . group Ġ= Ġ" plugin " ĊĠĠĠĠĠĠĠ Ġit . description Ġ= Ġ" çĶŁæĪĲ æıĴä»¶ éħįç½®æĸĩä»¶ " ĊĠĠĠĠĠĠĠ Ġit . outputs . file ( target ConfigFile ) ĊĠĠĠĠĠĠĠ Ġit . outputs . up ToDate When Ġ{ Ġfalse Ġ} ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. depends On ( plugin A pk Tasks ) ĊĠĠĠĠĠĠĠ Ġ. do First Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Resources ( project , Ġbuild Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. do Last Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . logger . info (" generate Config Ġtask Ġbegin ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġextension . toJson ( project , Ġloader A pk Name , Ġruntime A pk Name , Ġbuild Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbiz Writer Ġ= ĠBuffered Writer ( FileWriter ( target ConfigFile )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbiz Writer . write ( json . toJSON String ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbiz Writer . new Line () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbiz Writer . flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbiz Writer . close () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . logger . info (" generate Config Ġtask Ġdone ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( loader Task . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġtask . depends On ( loader Task ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( runtime Task . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġtask . depends On ( runtime Task ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( manager Task . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġtask . depends On ( manager Task ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtask Ċ }