/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 Ġ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 . Ċ Ġ*/ Ċ Ċ package Ġandroidx . build . lib ab ig ail Ċ Ċ import Ġandroidx . build . Operating System Ċ import Ġandroidx . build . get Operating System Ċ import Ġorg . gradle . api . Default Task Ċ import Ġorg . gradle . api . Gradle Exception Ċ import Ġorg . gradle . api . provider . List Property Ċ import Ġorg . gradle . api . provider . Property Ċ import Ġorg . gradle . api . tasks . Input Directory Ċ import Ġorg . gradle . api . tasks . Internal Ċ import Ġorg . gradle . api . tasks . Output Files Ċ import Ġorg . gradle . api . tasks . Task Action Ċ import Ġorg . gradle . process . Exec Operations Ċ import Ġorg . gradle . workers . Work Action Ċ import Ġorg . gradle . workers . Work Parameters Ċ import Ġorg . gradle . workers . Worker Executor Ċ import Ġjava . io . File Ċ import Ġjavax . inject . Inject Ċ Ċ private Ġconst Ġval ĠARCH _ PREFIX Ġ= Ġ" android ." Ċ internal Ġval Ġarchitectures Ġ= ĠlistOf (" arm 6 4 - v 8 a ", Ġ" ar me abi - v 7 a ", Ġ" x 8 6 ", Ġ" x 8 6 _ 6 4 ") Ċ Ċ /** Ċ Ġ* ĠTask Ġwhich Ġgenerates Ġnative ĠAPIs Ġfiles Ġfor Ġeach Ġlibrary Ġbuilt Ġby Ġthe Ġ' build C make Debug ' Ġtask Ġusing Ċ Ġ* Ġ` ab id w ` Ġand Ġstores Ġthem Ġin Ġthe Ġ/ native - api Ġin Ġthe Ġproject Ġbuild Ġdirectory . Ċ Ġ*/ Ċ abstract Ġclass ĠGenerate NativeApi Task Ġ: ĠDefault Task () Ġ{ ĊĊĠĠĠ Ġ@ get : Inject ĊĠĠĠ Ġabstract Ġval Ġworker Executor : ĠWorker Executor ĊĊĠĠĠ Ġ@ get : Input Directory ĊĠĠĠ Ġabstract Ġval Ġpref ab Directory : ĠProperty < File > ĊĊĠĠĠ Ġ@ get : Internal ĊĠĠĠ Ġabstract Ġval Ġproject Root Dir : ĠProperty < File > ĊĊĠĠĠ Ġ@ get : Internal ĊĠĠĠ Ġabstract Ġval Ġapi Location : ĠProperty < File > ĊĊĠĠĠ Ġ@ get : Internal ĊĠĠĠ Ġabstract Ġval Ġartifact Names : ĠList Property < String > ĊĊĠĠĠ Ġ@ Output Files ĊĠĠĠ Ġfun Ġget Task Outputs (): ĠList < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Locations For Artifacts ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapi Location . get (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġartifact Names . get () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Task Action ĊĠĠĠ Ġfun Ġexec () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( get Operating System () Ġ!= ĠOperating System . LINUX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Native ĠAPI Ġchecking Ġis Ġcurrently Ġnot Ġsupported Ġon Ġnon - linux Ġdevices " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdestination Dir Ġ= Ġapi Location . get () ĊĠĠĠĠĠĠĠ Ġif Ġ(! destination Dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Dir . mkdir s () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Dir . delete Re cursively () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Dir . mkdir s () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpref ab Dir Ġ= Ġpref ab Directory . get () ĊĠĠĠĠĠĠĠ Ġval Ġwork Queue Ġ= Ġworker Executor . process Isolation () ĊĠĠĠĠĠĠĠ Ġartifact Names . get (). forEach Ġ{ ĠmoduleName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule Ġ= Ġpref ab Dir . resolve (" modules /$ moduleName / libs ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! module . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠGradle Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġpref ab Ġdirectory Ġto Ġinclude Ġpath Ġ$ module , Ġbut Ġit Ġdoes Ġnot Ġexist . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Check Ġvalue Ġof Ġ' pref ab .$ moduleName . name ' Ġconfiguration Ġin Ġbuild . gradle ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule . list Files (). forEach Ġ{ Ġarch Dir Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartifacts Ġ= Ġarch Dir . list Files (). filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġskip Ġabi . json ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . extension Ġ== Ġ" a " Ġ|| Ġit . extension Ġ== Ġ" so " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Counts Ġ= Ġartifacts . grouping By Ġ{ Ġit . name Without Extension Ġ}. each Count () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Counts . forEach Ġ{ Ġ( name , Ġcount ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠGradle Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Found Ġmultiple Ġartifacts Ġin Ġ$ arch Dir Ġwith Ġname Ġ'$ name '" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifacts . forEach Ġ{ Ġartifact Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarch Ġ= Ġarch Dir . name . remove Prefix ( ARCH _ PREFIX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput FilePath Ġ= Ġget Location For Artifact ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Dir , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarch , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifact . name Without Extension ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput FilePath . parent File . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwork Queue . submit ( Ab i Dw Work Action :: class . java ) Ġ{ Ġparameters Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . rootDir Ġ= Ġproject Root Dir . get (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . path To Lib Ġ= Ġartifact . canonical Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . output FilePath Ġ= Ġoutput FilePath . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠAb i Dw Parameters Ġ: ĠWork Parameters Ġ{ ĊĠĠĠ Ġvar Ġroot Dir : ĠString ĊĠĠĠ Ġvar Ġpath To Lib : ĠString ĊĠĠĠ Ġvar Ġoutput FilePath : ĠString Ċ } Ċ Ċ abstract Ġclass ĠAb i Dw Work Action Ġ@ Inject Ġconstructor ( private Ġval Ġexec Operations : ĠExec Operations ) Ġ: ĊĠĠĠ ĠWork Action < Ab i Dw Parameters > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= ĠFile . create TempFile (" abi ", Ġnull ) ĊĠĠĠĠĠĠĠ Ġexec Operations . exec Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . executable Ġ= ĠLib ab ig ail Paths . Linux . ab id w Path ( parameters . rootDir ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . args Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- drop - private - types ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- no - show - locs ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- out - file ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp File . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . path To Lib ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexec Operations . exec Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . executable Ġ= ĠLib ab ig ail Paths . Linux . abit idy Path ( parameters . rootDir ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . args Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- input ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp File . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- output ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . output FilePath , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- abort - on - unt yped - symbols ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- elim inate - duplicates ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- sort ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- prune - unreachable " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġget Locations For Artifacts ( base Dir : ĠFile , Ġartifact Names : ĠList < String >): ĠList < File > Ġ{ ĊĠĠĠ Ġreturn Ġartifact Names . flatMap Ġ{ Ġartifact Name Ġ-> ĊĠĠĠĠĠĠĠ Ġarchitectures . map Ġ{ Ġarch Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Location For Artifact ( base Dir , Ġarch , Ġartifact Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠTakes Ġan Ġ[ arch Name ] Ġand Ġ[ artifact Name ] Ġand Ġreturns Ġthe Ġlocation Ġwithin Ġthe Ġbuild Ġfolder Ġwhere Ċ Ġ* Ġthat Ġartifacts Ġxml Ġrepresentation Ġshould Ġbe Ġstored . Ċ Ġ*/ Ċ private Ġfun Ġget Location For Artifact ( base Dir : ĠFile , Ġarch Name : ĠString , Ġartifact Name : ĠString ): ĠFile Ġ= ĊĠĠĠ Ġbase Dir . resolve ("$ arch Name /$ artifact Name . xml ") Ċ