/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ Ċ @ file : Jvm Name (" Gradle Plugin Utils ") Ċ Ċ package Ġcom . android . build . gradle . internal . utils Ċ Ċ import Ġcom . android . builder . errors . Issue Reporter Ċ import Ġcom . android . ide . common . repository . Gradle Version Ċ import Ġcom . google . common . annotations . Visible ForTesting Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . artifacts . component . Module Component Identifier Ċ import Ġorg . gradle . api . artifacts . result . Resolution Result Ċ import Ġorg . gradle . api . initialization . dsl . Script Handler . CLAS SPATH _ CONFIGURATION Ċ import Ġjava . net . Jar URLConnection Ċ import Ġjava . util . regex . Pattern Ċ Ċ private Ġval Ġplugin List Ġ= ĠlistOf ( ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ Ġhttps :// issue tracker . google . com / 1 1 6 7 4 7 1 5 9 ĊĠĠĠĠ Ġ* Ġ Ġ( task Ġgenerate Debug R 2 Ġfails Ġon Ġ 3 . 3 a 1 2 Ġwhen Ġgenerating Ġseparate ĠR Ġclasses ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠDependency Info ( ĊĠĠĠĠĠĠĠ Ġ" B utter knife ", ĊĠĠĠĠĠĠĠ Ġ" com . jak ew h art on ", ĊĠĠĠĠĠĠĠ Ġ" but ter knife - gradle - plugin ", ĊĠĠĠĠĠĠĠ ĠGradle Version . parse (" 9 . 0 . 0 - rc 2 ") ĊĠĠĠ Ġ), ĊĊĠĠĠ Ġ// Ġhttps :// issue tracker . google . com / 7 9 9 9 7 4 8 9 ĊĠĠĠ ĠDependency Info ( ĊĠĠĠĠĠĠĠ Ġ" Crash ly t ics ", ĊĠĠĠĠĠĠĠ Ġ" io . fabric . tools ", ĊĠĠĠĠĠĠĠ Ġ" gradle ", ĊĠĠĠĠĠĠĠ ĠGradle Version . parse (" 1 . 2 8 . 0 ") ĊĠĠĠ Ġ), ĊĊĠĠĠ Ġ// Ġhttps :// issue tracker . google . com / 1 1 0 5 6 4 4 0 7 ĊĠĠĠ ĠDependency Info ( ĊĠĠĠĠĠĠĠ Ġ" Protobuf ", ĊĠĠĠĠĠĠĠ Ġ" com . google . protobuf ", ĊĠĠĠĠĠĠĠ Ġ" protobuf - gradle - plugin ", ĊĠĠĠĠĠĠĠ ĠGradle Version . parse (" 0 . 8 . 6 ") ĊĠĠĠ Ġ), ĊĊĠĠĠ Ġ// Ġhttps :// yout rack . jetbrains . com / issue / KT - 3 0 3 4 4 Ġ( b / 1 5 2 8 9 8 9 2 6 ) ĊĠĠĠ ĠDependency Info ( ĊĠĠĠĠĠĠĠ Ġ" Kotlin ", ĊĠĠĠĠĠĠĠ Ġ" org . jetbrains . kotlin ", ĊĠĠĠĠĠĠĠ Ġ" kotlin - gradle - plugin ", ĊĠĠĠĠĠĠĠ ĠGradle Version . parse (" 1 . 3 . 4 0 ") ĊĠĠĠ Ġ) Ċ ) Ċ Ċ @ Visible ForTesting Ċ internal Ġdata Ġclass ĠDependency Info ( ĊĠĠĠ Ġval ĠdisplayName : ĠString , ĊĠĠĠ Ġval Ġdependency Group : ĠString , ĊĠĠĠ Ġval Ġdependency Name : ĠString , ĊĠĠĠ Ġval Ġminimum Version : ĠGradle Version Ċ ) Ċ Ċ /** Ċ Ġ* ĠEn forces Ġminimum Ġversions Ġof Ġcertain Ġplugins . Ċ Ġ*/ Ċ fun Ġenforce Minimum Versions Of Plugins ( project : ĠProject , Ġissue Reporter : ĠIssue Reporter ) Ġ{ ĊĠĠĠ Ġ// ĠRun Ġonly Ġonce Ġper Ġbuild ĊĠĠĠ Ġval Ġextra Properties Ġ= Ġproject . root Project . extensions . extra Properties ĊĠĠĠ Ġif Ġ( extra Properties . has ( AG P _ INTERNAL __ MIN _ PLUGIN _ VERSION _ CHECK _ STARTED )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġextra Properties . set ( AG P _ INTERNAL __ MIN _ PLUGIN _ VERSION _ CHECK _ STARTED , Ġtrue ) ĊĊĠĠĠ Ġproject . gradle . projects Evalu ated Ġ{ Ġgradle Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġprojects ToCheck Ġ= Ġmutable Set Of < Project >() ĊĠĠĠĠĠĠĠ Ġgradle . all projects Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġonly Ġprojects Ġthat Ġhave ĠA GP Ġapplied Ġ( see Ġbug Ġ 1 4 8 7 7 6 2 8 6 ). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAlso Ġcheck Ġtheir Ġparent Ġprojects Ġrecursively Ġbecause Ġthe Ġbuild script Ġclasspath ( s ) Ġof ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġparent Ġprojects Ġare Ġavailable Ġto Ġchild Ġprojects . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . plugin Manager . has Plugin ( ANDROID _ GRAD LE _ PLUGIN _ ID )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent : ĠProject ? Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( current Ġ!= Ġnull Ġ&& Ġprojects ToCheck . add ( current )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠCalling Ġall projects Ġagain Ġis Ġneeded Ġas ĠGradle Ġdoesn 't Ġallow Ġcross - project Ġresolution Ġof ĊĠĠĠĠĠĠĠ Ġ// Ġbuild script Ġclasspath ĊĠĠĠĠĠĠĠ Ġgradle . all projects Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġin Ġprojects ToCheck ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( plugin ToCheck Ġin Ġplugin List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenforce Minimum Version Of Plugin ( it , Ġplugin ToCheck , Ġissue Reporter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġenforce Minimum Version Of Plugin ( ĊĠĠĠ Ġproject : ĠProject , ĊĠĠĠ Ġplugin Info : ĠDependency Info , ĊĠĠĠ Ġissue Reporter : ĠIssue Reporter Ċ ) Ġ{ ĊĠĠĠ Ġ// ĠTra verse Ġthe Ġdependency Ġgraph Ġto Ġcollect Ġviol ating Ġplugins ĊĠĠĠ Ġval Ġbuild Script Classpath Ġ= Ġproject . build script . configurations . get ByName ( CLAS SPATH _ CONFIGURATION ) ĊĠĠĠ Ġval Ġpaths To Vi ol ating Plugins Ġ= ĠVi ol ating Plugin Detector ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Script Classpath . incoming . resolution Result , Ġplugin Info , Ġproject . displayName ĊĠĠĠ Ġ). detect () ĊĊĠĠĠ Ġ// ĠReport Ġviol ating Ġplugins ĊĠĠĠ Ġif Ġ( paths To Vi ol ating Plugins . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġissue Reporter . report Error ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIssue Reporter . Type . TH IRD _ PAR TY _ GRAD LE _ PLUGIN _ TOO _ OLD , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" The ĠAndroid ĠGradle Ġplugin Ġsupports Ġonly Ġ${ plugin Info . displayName } ĠGradle Ġplugin " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġversion Ġ${ plugin Info . minimum Version } Ġand Ġhigher .\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġfollowing Ġdependencies Ġdo Ġnot Ġsatisfy Ġthe Ġrequired Ġversion :\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaths To Vi ol ating Plugins . join ToString ("\ n "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplugin Info . displayName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplugin Info . dependency Group , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplugin Info . dependency Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplugin Info . minimum Version , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaths To Vi ol ating Plugins . join ToString (",", Ġ"[", Ġ"] ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). join ToString ("; ")) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Visible ForTesting Ċ internal Ġclass ĠVi ol ating Plugin Detector ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbuild script Classpath : ĠResolution Result , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġplugin To Search : ĠDependency Info , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġproject DisplayName : ĠString Ċ ) Ġ{ ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġpaths Ġto Ġviol ating Ġplugins . Ġ*/ ĊĠĠĠ Ġfun Ġdetect (): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġviol ating Plugins Ġ= Ġbuild script Classpath . getModule Components Ġ{ Ġmodule Component Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( module Component Id . group Ġ== Ġplugin To Search . dependency Group ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġmodule Component Id . module Ġ== Ġplugin To Search . dependency Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUse ĠGradle Version Ġto Ġparse Ġthe Ġversion Ġsince Ġthe Ġformat Ġaccepted Ġby ĠGradle Version ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġis Ġgeneral Ġenough . ĠIn Ġthe Ġunlikely Ġevent Ġthat Ġthe Ġversion Ġcannot Ġbe Ġparsed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore Ġthe Ġerror . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Version Ġ= ĠGradle Version . try Parse ( module Component Id . version ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( parsed Version Ġ!= Ġnull ) Ġ&& Ġ( parsed Version Ġ< Ġplugin To Search . minimum Version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġviol ating Plugins . map NotNull Ġ{ Ġcomponent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent . getPath From Root (). getPath String ( project DisplayName ). take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore ĠSafe - args Ġplugin Ġfor Ġnow Ġ( bug Ġ 1 7 5 3 7 9 9 6 3 ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! it . contains (" android x . navigation : navigation - safe - args - gradle - plugin : 2 . 3 . 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** ĠLists Ġall Ġmodule Ġdependencies Ġresolved Ġfor Ġbuild script Ġclasspath . Ġ*/ Ċ fun Ġget Build script Dependencies ( project : ĠProject ): ĠList < Module Component Identifier > Ġ{ ĊĠĠĠ Ġval Ġbuild Script Classpath Ġ= Ġproject . build script . configurations . get ByName ( CLAS SPATH _ CONFIGURATION ) ĊĠĠĠ Ġreturn Ġbuild Script Classpath . incoming . resolution Result . getModule Components () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . id Ġas ĠModule Component Identifier Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠEnum er ates Ġthrough Ġthe Ġgradle Ġplugin Ġj ars Ġexisting Ġin Ġthe Ġgiven Ġ[ class Loader ], Ġfinds Ġthe Ċ Ġ* Ġbuild Src Ġjar Ġand Ġloads Ġthe Ġid Ġof Ġeach Ġplugin Ġfrom Ġthe Ġ` META - INF / gradle - plugins /${ id }. properties ` Ċ Ġ* Ġfile Ġname . Ċ Ġ* Ċ Ġ* Ġ@ return Ġa Ġlist Ġof Ġplugin Ġids Ġthat Ġare Ġdefined Ġin Ġthe Ġbuild Src Ċ Ġ*/ Ċ fun Ġget Build Src Plugins ( class Loader : ĠClassLoader ): ĠSet < String > Ġ{ ĊĠĠĠ Ġval Ġpattern Ġ= ĠPattern . compile (" META - INF / gradle - plugins / (. +) \\. properties ") ĊĠĠĠ Ġval Ġurls Ġ= Ġclass Loader . getResources (" META - INF / gradle - plugins ") ĊĊĠĠĠ Ġval Ġbuild Src Plugins Ġ= ĠHashSet < String >() ĊĠĠĠ Ġwhile Ġ( urls . hasMore Elements ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġurls . nextElement () ĊĠĠĠĠĠĠĠ Ġif Ġ(! url . toString (). endsWith (" build Src . jar !/ META - INF / gradle - plugins ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġurl Connection Ġ= Ġurl . open Connection () ĊĠĠĠĠĠĠĠ Ġif Ġ( url Connection Ġis ĠJar URLConnection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl Connection . jar File . use Ġ{ Ġjar Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjar Entries Ġ= Ġjar . entries () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( jar Entries . hasMore Elements ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġjar Entries . nextElement () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= Ġpattern . matcher ( entry . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matcher . matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Src Plugins . add ( matcher . group ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġbuild Src Plugins Ċ } Ċ Ċ private Ġconst Ġval ĠA GP _ INTERNAL __ MIN _ PLUGIN _ VERSION _ CHECK _ STARTED Ġ= Ġ" AG P _ INTERNAL __ MIN _ PLUGIN _ VERSION _ CHECK _ STARTED " Ċ