apex_test.go 290 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534105351053610537105381053910540105411054210543105441054510546105471054810549105501055110552105531055410555105561055710558105591056010561105621056310564105651056610567105681056910570105711057210573105741057510576105771057810579105801058110582105831058410585105861058710588105891059010591105921059310594105951059610597105981059910600106011060210603106041060510606106071060810609106101061110612106131061410615106161061710618106191062010621106221062310624106251062610627106281062910630106311063210633106341063510636106371063810639106401064110642106431064410645106461064710648106491065010651106521065310654106551065610657106581065910660106611066210663106641066510666106671066810669106701067110672106731067410675106761067710678106791068010681106821068310684106851068610687106881068910690106911069210693106941069510696106971069810699107001070110702107031070410705107061070710708107091071010711
  1. // Copyright 2018 Google Inc. All rights reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package apex
  15. import (
  16. "fmt"
  17. "path"
  18. "path/filepath"
  19. "reflect"
  20. "regexp"
  21. "sort"
  22. "strconv"
  23. "strings"
  24. "testing"
  25. "github.com/google/blueprint"
  26. "github.com/google/blueprint/proptools"
  27. "android/soong/android"
  28. "android/soong/bpf"
  29. "android/soong/cc"
  30. "android/soong/dexpreopt"
  31. prebuilt_etc "android/soong/etc"
  32. "android/soong/filesystem"
  33. "android/soong/java"
  34. "android/soong/rust"
  35. "android/soong/sh"
  36. )
  37. // names returns name list from white space separated string
  38. func names(s string) (ns []string) {
  39. for _, n := range strings.Split(s, " ") {
  40. if len(n) > 0 {
  41. ns = append(ns, n)
  42. }
  43. }
  44. return
  45. }
  46. func testApexError(t *testing.T, pattern, bp string, preparers ...android.FixturePreparer) {
  47. t.Helper()
  48. android.GroupFixturePreparers(
  49. prepareForApexTest,
  50. android.GroupFixturePreparers(preparers...),
  51. ).
  52. ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)).
  53. RunTestWithBp(t, bp)
  54. }
  55. func testApex(t *testing.T, bp string, preparers ...android.FixturePreparer) *android.TestContext {
  56. t.Helper()
  57. optionalBpPreparer := android.NullFixturePreparer
  58. if bp != "" {
  59. optionalBpPreparer = android.FixtureWithRootAndroidBp(bp)
  60. }
  61. result := android.GroupFixturePreparers(
  62. prepareForApexTest,
  63. android.GroupFixturePreparers(preparers...),
  64. optionalBpPreparer,
  65. ).RunTest(t)
  66. return result.TestContext
  67. }
  68. func withFiles(files android.MockFS) android.FixturePreparer {
  69. return files.AddToFixture()
  70. }
  71. func withTargets(targets map[android.OsType][]android.Target) android.FixturePreparer {
  72. return android.FixtureModifyConfig(func(config android.Config) {
  73. for k, v := range targets {
  74. config.Targets[k] = v
  75. }
  76. })
  77. }
  78. // withNativeBridgeTargets sets configuration with targets including:
  79. // - X86_64 (primary)
  80. // - X86 (secondary)
  81. // - Arm64 on X86_64 (native bridge)
  82. // - Arm on X86 (native bridge)
  83. var withNativeBridgeEnabled = android.FixtureModifyConfig(
  84. func(config android.Config) {
  85. config.Targets[android.Android] = []android.Target{
  86. {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "silvermont", Abi: []string{"arm64-v8a"}},
  87. NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
  88. {Os: android.Android, Arch: android.Arch{ArchType: android.X86, ArchVariant: "silvermont", Abi: []string{"armeabi-v7a"}},
  89. NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
  90. {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}},
  91. NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86_64", NativeBridgeRelativePath: "arm64"},
  92. {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
  93. NativeBridge: android.NativeBridgeEnabled, NativeBridgeHostArchName: "x86", NativeBridgeRelativePath: "arm"},
  94. }
  95. },
  96. )
  97. func withManifestPackageNameOverrides(specs []string) android.FixturePreparer {
  98. return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  99. variables.ManifestPackageNameOverrides = specs
  100. })
  101. }
  102. func withApexGlobalMinSdkVersionOverride(minSdkOverride *string) android.FixturePreparer {
  103. return android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  104. variables.ApexGlobalMinSdkVersionOverride = minSdkOverride
  105. })
  106. }
  107. var withBinder32bit = android.FixtureModifyProductVariables(
  108. func(variables android.FixtureProductVariables) {
  109. variables.Binder32bit = proptools.BoolPtr(true)
  110. },
  111. )
  112. var withUnbundledBuild = android.FixtureModifyProductVariables(
  113. func(variables android.FixtureProductVariables) {
  114. variables.Unbundled_build = proptools.BoolPtr(true)
  115. },
  116. )
  117. // Legacy preparer used for running tests within the apex package.
  118. //
  119. // This includes everything that was needed to run any test in the apex package prior to the
  120. // introduction of the test fixtures. Tests that are being converted to use fixtures directly
  121. // rather than through the testApex...() methods should avoid using this and instead use the
  122. // various preparers directly, using android.GroupFixturePreparers(...) to group them when
  123. // necessary.
  124. //
  125. // deprecated
  126. var prepareForApexTest = android.GroupFixturePreparers(
  127. // General preparers in alphabetical order as test infrastructure will enforce correct
  128. // registration order.
  129. android.PrepareForTestWithAndroidBuildComponents,
  130. bpf.PrepareForTestWithBpf,
  131. cc.PrepareForTestWithCcBuildComponents,
  132. java.PrepareForTestWithDexpreopt,
  133. prebuilt_etc.PrepareForTestWithPrebuiltEtc,
  134. rust.PrepareForTestWithRustDefaultModules,
  135. sh.PrepareForTestWithShBuildComponents,
  136. PrepareForTestWithApexBuildComponents,
  137. // Additional apex test specific preparers.
  138. android.FixtureAddTextFile("system/sepolicy/Android.bp", `
  139. filegroup {
  140. name: "myapex-file_contexts",
  141. srcs: [
  142. "apex/myapex-file_contexts",
  143. ],
  144. }
  145. `),
  146. prepareForTestWithMyapex,
  147. android.FixtureMergeMockFs(android.MockFS{
  148. "a.java": nil,
  149. "PrebuiltAppFoo.apk": nil,
  150. "PrebuiltAppFooPriv.apk": nil,
  151. "apex_manifest.json": nil,
  152. "AndroidManifest.xml": nil,
  153. "system/sepolicy/apex/myapex.updatable-file_contexts": nil,
  154. "system/sepolicy/apex/myapex2-file_contexts": nil,
  155. "system/sepolicy/apex/otherapex-file_contexts": nil,
  156. "system/sepolicy/apex/com.android.vndk-file_contexts": nil,
  157. "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil,
  158. "mylib.cpp": nil,
  159. "mytest.cpp": nil,
  160. "mytest1.cpp": nil,
  161. "mytest2.cpp": nil,
  162. "mytest3.cpp": nil,
  163. "myprebuilt": nil,
  164. "my_include": nil,
  165. "foo/bar/MyClass.java": nil,
  166. "prebuilt.jar": nil,
  167. "prebuilt.so": nil,
  168. "vendor/foo/devkeys/test.x509.pem": nil,
  169. "vendor/foo/devkeys/test.pk8": nil,
  170. "testkey.x509.pem": nil,
  171. "testkey.pk8": nil,
  172. "testkey.override.x509.pem": nil,
  173. "testkey.override.pk8": nil,
  174. "vendor/foo/devkeys/testkey.avbpubkey": nil,
  175. "vendor/foo/devkeys/testkey.pem": nil,
  176. "NOTICE": nil,
  177. "custom_notice": nil,
  178. "custom_notice_for_static_lib": nil,
  179. "testkey2.avbpubkey": nil,
  180. "testkey2.pem": nil,
  181. "myapex-arm64.apex": nil,
  182. "myapex-arm.apex": nil,
  183. "myapex.apks": nil,
  184. "frameworks/base/api/current.txt": nil,
  185. "framework/aidl/a.aidl": nil,
  186. "dummy.txt": nil,
  187. "baz": nil,
  188. "bar/baz": nil,
  189. "testdata/baz": nil,
  190. "AppSet.apks": nil,
  191. "foo.rs": nil,
  192. "libfoo.jar": nil,
  193. "libbar.jar": nil,
  194. },
  195. ),
  196. android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  197. variables.DeviceVndkVersion = proptools.StringPtr("current")
  198. variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test")
  199. variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"}
  200. variables.Platform_sdk_codename = proptools.StringPtr("Q")
  201. variables.Platform_sdk_final = proptools.BoolPtr(false)
  202. // "Tiramisu" needs to be in the next line for compatibility with soong code,
  203. // not because of these tests specifically (it's not used by the tests)
  204. variables.Platform_version_active_codenames = []string{"Q", "Tiramisu"}
  205. variables.Platform_vndk_version = proptools.StringPtr("29")
  206. variables.BuildId = proptools.StringPtr("TEST.BUILD_ID")
  207. }),
  208. )
  209. var prepareForTestWithMyapex = android.FixtureMergeMockFs(android.MockFS{
  210. "system/sepolicy/apex/myapex-file_contexts": nil,
  211. })
  212. // ensure that 'result' equals 'expected'
  213. func ensureEquals(t *testing.T, result string, expected string) {
  214. t.Helper()
  215. if result != expected {
  216. t.Errorf("%q != %q", expected, result)
  217. }
  218. }
  219. // ensure that 'result' contains 'expected'
  220. func ensureContains(t *testing.T, result string, expected string) {
  221. t.Helper()
  222. if !strings.Contains(result, expected) {
  223. t.Errorf("%q is not found in %q", expected, result)
  224. }
  225. }
  226. // ensure that 'result' contains 'expected' exactly one time
  227. func ensureContainsOnce(t *testing.T, result string, expected string) {
  228. t.Helper()
  229. count := strings.Count(result, expected)
  230. if count != 1 {
  231. t.Errorf("%q is found %d times (expected 1 time) in %q", expected, count, result)
  232. }
  233. }
  234. // ensures that 'result' does not contain 'notExpected'
  235. func ensureNotContains(t *testing.T, result string, notExpected string) {
  236. t.Helper()
  237. if strings.Contains(result, notExpected) {
  238. t.Errorf("%q is found in %q", notExpected, result)
  239. }
  240. }
  241. func ensureMatches(t *testing.T, result string, expectedRex string) {
  242. ok, err := regexp.MatchString(expectedRex, result)
  243. if err != nil {
  244. t.Fatalf("regexp failure trying to match %s against `%s` expression: %s", result, expectedRex, err)
  245. return
  246. }
  247. if !ok {
  248. t.Errorf("%s does not match regular expession %s", result, expectedRex)
  249. }
  250. }
  251. func ensureListContains(t *testing.T, result []string, expected string) {
  252. t.Helper()
  253. if !android.InList(expected, result) {
  254. t.Errorf("%q is not found in %v", expected, result)
  255. }
  256. }
  257. func ensureListNotContains(t *testing.T, result []string, notExpected string) {
  258. t.Helper()
  259. if android.InList(notExpected, result) {
  260. t.Errorf("%q is found in %v", notExpected, result)
  261. }
  262. }
  263. func ensureListEmpty(t *testing.T, result []string) {
  264. t.Helper()
  265. if len(result) > 0 {
  266. t.Errorf("%q is expected to be empty", result)
  267. }
  268. }
  269. func ensureListNotEmpty(t *testing.T, result []string) {
  270. t.Helper()
  271. if len(result) == 0 {
  272. t.Errorf("%q is expected to be not empty", result)
  273. }
  274. }
  275. // Minimal test
  276. func TestBasicApex(t *testing.T) {
  277. ctx := testApex(t, `
  278. apex_defaults {
  279. name: "myapex-defaults",
  280. manifest: ":myapex.manifest",
  281. androidManifest: ":myapex.androidmanifest",
  282. key: "myapex.key",
  283. binaries: ["foo.rust"],
  284. native_shared_libs: [
  285. "mylib",
  286. "libfoo.ffi",
  287. ],
  288. rust_dyn_libs: ["libfoo.dylib.rust"],
  289. multilib: {
  290. both: {
  291. binaries: ["foo"],
  292. }
  293. },
  294. java_libs: [
  295. "myjar",
  296. "myjar_dex",
  297. ],
  298. updatable: false,
  299. }
  300. apex {
  301. name: "myapex",
  302. defaults: ["myapex-defaults"],
  303. }
  304. apex_key {
  305. name: "myapex.key",
  306. public_key: "testkey.avbpubkey",
  307. private_key: "testkey.pem",
  308. }
  309. filegroup {
  310. name: "myapex.manifest",
  311. srcs: ["apex_manifest.json"],
  312. }
  313. filegroup {
  314. name: "myapex.androidmanifest",
  315. srcs: ["AndroidManifest.xml"],
  316. }
  317. cc_library {
  318. name: "mylib",
  319. srcs: ["mylib.cpp"],
  320. shared_libs: [
  321. "mylib2",
  322. "libbar.ffi",
  323. ],
  324. system_shared_libs: [],
  325. stl: "none",
  326. // TODO: remove //apex_available:platform
  327. apex_available: [
  328. "//apex_available:platform",
  329. "myapex",
  330. ],
  331. }
  332. cc_binary {
  333. name: "foo",
  334. srcs: ["mylib.cpp"],
  335. compile_multilib: "both",
  336. multilib: {
  337. lib32: {
  338. suffix: "32",
  339. },
  340. lib64: {
  341. suffix: "64",
  342. },
  343. },
  344. symlinks: ["foo_link_"],
  345. symlink_preferred_arch: true,
  346. system_shared_libs: [],
  347. stl: "none",
  348. apex_available: [ "myapex", "com.android.gki.*" ],
  349. }
  350. rust_binary {
  351. name: "foo.rust",
  352. srcs: ["foo.rs"],
  353. rlibs: ["libfoo.rlib.rust"],
  354. dylibs: ["libfoo.dylib.rust"],
  355. apex_available: ["myapex"],
  356. }
  357. rust_library_rlib {
  358. name: "libfoo.rlib.rust",
  359. srcs: ["foo.rs"],
  360. crate_name: "foo",
  361. apex_available: ["myapex"],
  362. shared_libs: ["libfoo.shared_from_rust"],
  363. }
  364. cc_library_shared {
  365. name: "libfoo.shared_from_rust",
  366. srcs: ["mylib.cpp"],
  367. system_shared_libs: [],
  368. stl: "none",
  369. apex_available: ["myapex"],
  370. }
  371. rust_library_dylib {
  372. name: "libfoo.dylib.rust",
  373. srcs: ["foo.rs"],
  374. crate_name: "foo",
  375. apex_available: ["myapex"],
  376. }
  377. rust_ffi_shared {
  378. name: "libfoo.ffi",
  379. srcs: ["foo.rs"],
  380. crate_name: "foo",
  381. apex_available: ["myapex"],
  382. }
  383. rust_ffi_shared {
  384. name: "libbar.ffi",
  385. srcs: ["foo.rs"],
  386. crate_name: "bar",
  387. apex_available: ["myapex"],
  388. }
  389. apex {
  390. name: "com.android.gki.fake",
  391. binaries: ["foo"],
  392. key: "myapex.key",
  393. file_contexts: ":myapex-file_contexts",
  394. updatable: false,
  395. }
  396. cc_library_shared {
  397. name: "mylib2",
  398. srcs: ["mylib.cpp"],
  399. system_shared_libs: [],
  400. stl: "none",
  401. static_libs: ["libstatic"],
  402. // TODO: remove //apex_available:platform
  403. apex_available: [
  404. "//apex_available:platform",
  405. "myapex",
  406. ],
  407. }
  408. cc_prebuilt_library_shared {
  409. name: "mylib2",
  410. srcs: ["prebuilt.so"],
  411. // TODO: remove //apex_available:platform
  412. apex_available: [
  413. "//apex_available:platform",
  414. "myapex",
  415. ],
  416. }
  417. cc_library_static {
  418. name: "libstatic",
  419. srcs: ["mylib.cpp"],
  420. system_shared_libs: [],
  421. stl: "none",
  422. // TODO: remove //apex_available:platform
  423. apex_available: [
  424. "//apex_available:platform",
  425. "myapex",
  426. ],
  427. }
  428. java_library {
  429. name: "myjar",
  430. srcs: ["foo/bar/MyClass.java"],
  431. stem: "myjar_stem",
  432. sdk_version: "none",
  433. system_modules: "none",
  434. static_libs: ["myotherjar"],
  435. libs: ["mysharedjar"],
  436. // TODO: remove //apex_available:platform
  437. apex_available: [
  438. "//apex_available:platform",
  439. "myapex",
  440. ],
  441. }
  442. dex_import {
  443. name: "myjar_dex",
  444. jars: ["prebuilt.jar"],
  445. apex_available: [
  446. "//apex_available:platform",
  447. "myapex",
  448. ],
  449. }
  450. java_library {
  451. name: "myotherjar",
  452. srcs: ["foo/bar/MyClass.java"],
  453. sdk_version: "none",
  454. system_modules: "none",
  455. // TODO: remove //apex_available:platform
  456. apex_available: [
  457. "//apex_available:platform",
  458. "myapex",
  459. ],
  460. }
  461. java_library {
  462. name: "mysharedjar",
  463. srcs: ["foo/bar/MyClass.java"],
  464. sdk_version: "none",
  465. system_modules: "none",
  466. }
  467. `)
  468. apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
  469. // Make sure that Android.mk is created
  470. ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
  471. data := android.AndroidMkDataForTest(t, ctx, ab)
  472. var builder strings.Builder
  473. data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
  474. androidMk := builder.String()
  475. ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
  476. ensureNotContains(t, androidMk, "LOCAL_MODULE := mylib.com.android.myapex\n")
  477. optFlags := apexRule.Args["opt_flags"]
  478. ensureContains(t, optFlags, "--pubkey vendor/foo/devkeys/testkey.avbpubkey")
  479. // Ensure that the NOTICE output is being packaged as an asset.
  480. ensureContains(t, optFlags, "--assets_dir out/soong/.intermediates/myapex/android_common_myapex_image/NOTICE")
  481. copyCmds := apexRule.Args["copy_commands"]
  482. // Ensure that main rule creates an output
  483. ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
  484. // Ensure that apex variant is created for the direct dep
  485. ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
  486. ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000")
  487. ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000")
  488. ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000")
  489. ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000")
  490. // Ensure that apex variant is created for the indirect dep
  491. ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
  492. ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000")
  493. ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000")
  494. ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000")
  495. ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000")
  496. ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.shared_from_rust"), "android_arm64_armv8-a_shared_apex10000")
  497. // Ensure that both direct and indirect deps are copied into apex
  498. ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
  499. ensureContains(t, copyCmds, "image.apex/lib64/mylib2.so")
  500. ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar")
  501. ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar")
  502. ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so")
  503. ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so")
  504. ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so")
  505. ensureContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
  506. // .. but not for java libs
  507. ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar")
  508. ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")
  509. // Ensure that the platform variant ends with _shared or _common
  510. ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
  511. ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
  512. ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common")
  513. ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common")
  514. ensureListContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common")
  515. // Ensure that dynamic dependency to java libs are not included
  516. ensureListNotContains(t, ctx.ModuleVariantsForTests("mysharedjar"), "android_common_myapex")
  517. // Ensure that all symlinks are present.
  518. found_foo_link_64 := false
  519. found_foo := false
  520. for _, cmd := range strings.Split(copyCmds, " && ") {
  521. if strings.HasPrefix(cmd, "ln -sfn foo64") {
  522. if strings.HasSuffix(cmd, "bin/foo") {
  523. found_foo = true
  524. } else if strings.HasSuffix(cmd, "bin/foo_link_64") {
  525. found_foo_link_64 = true
  526. }
  527. }
  528. }
  529. good := found_foo && found_foo_link_64
  530. if !good {
  531. t.Errorf("Could not find all expected symlinks! foo: %t, foo_link_64: %t. Command was %s", found_foo, found_foo_link_64, copyCmds)
  532. }
  533. fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
  534. ensureListContains(t, fullDepsInfo, " myjar(minSdkVersion:(no version)) <- myapex")
  535. ensureListContains(t, fullDepsInfo, " mylib2(minSdkVersion:(no version)) <- mylib")
  536. ensureListContains(t, fullDepsInfo, " myotherjar(minSdkVersion:(no version)) <- myjar")
  537. ensureListContains(t, fullDepsInfo, " mysharedjar(minSdkVersion:(no version)) (external) <- myjar")
  538. flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
  539. ensureListContains(t, flatDepsInfo, "myjar(minSdkVersion:(no version))")
  540. ensureListContains(t, flatDepsInfo, "mylib2(minSdkVersion:(no version))")
  541. ensureListContains(t, flatDepsInfo, "myotherjar(minSdkVersion:(no version))")
  542. ensureListContains(t, flatDepsInfo, "mysharedjar(minSdkVersion:(no version)) (external)")
  543. }
  544. func TestDefaults(t *testing.T) {
  545. ctx := testApex(t, `
  546. apex_defaults {
  547. name: "myapex-defaults",
  548. key: "myapex.key",
  549. prebuilts: ["myetc"],
  550. native_shared_libs: ["mylib"],
  551. java_libs: ["myjar"],
  552. apps: ["AppFoo"],
  553. rros: ["rro"],
  554. bpfs: ["bpf", "netdTest"],
  555. updatable: false,
  556. }
  557. prebuilt_etc {
  558. name: "myetc",
  559. src: "myprebuilt",
  560. }
  561. apex {
  562. name: "myapex",
  563. defaults: ["myapex-defaults"],
  564. }
  565. apex_key {
  566. name: "myapex.key",
  567. public_key: "testkey.avbpubkey",
  568. private_key: "testkey.pem",
  569. }
  570. cc_library {
  571. name: "mylib",
  572. system_shared_libs: [],
  573. stl: "none",
  574. apex_available: [ "myapex" ],
  575. }
  576. java_library {
  577. name: "myjar",
  578. srcs: ["foo/bar/MyClass.java"],
  579. sdk_version: "none",
  580. system_modules: "none",
  581. apex_available: [ "myapex" ],
  582. }
  583. android_app {
  584. name: "AppFoo",
  585. srcs: ["foo/bar/MyClass.java"],
  586. sdk_version: "none",
  587. system_modules: "none",
  588. apex_available: [ "myapex" ],
  589. }
  590. runtime_resource_overlay {
  591. name: "rro",
  592. theme: "blue",
  593. }
  594. bpf {
  595. name: "bpf",
  596. srcs: ["bpf.c", "bpf2.c"],
  597. }
  598. bpf {
  599. name: "netdTest",
  600. srcs: ["netdTest.c"],
  601. sub_dir: "netd",
  602. }
  603. `)
  604. ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
  605. "etc/myetc",
  606. "javalib/myjar.jar",
  607. "lib64/mylib.so",
  608. "app/AppFoo@TEST.BUILD_ID/AppFoo.apk",
  609. "overlay/blue/rro.apk",
  610. "etc/bpf/bpf.o",
  611. "etc/bpf/bpf2.o",
  612. "etc/bpf/netd/netdTest.o",
  613. })
  614. }
  615. func TestApexManifest(t *testing.T) {
  616. ctx := testApex(t, `
  617. apex {
  618. name: "myapex",
  619. key: "myapex.key",
  620. updatable: false,
  621. }
  622. apex_key {
  623. name: "myapex.key",
  624. public_key: "testkey.avbpubkey",
  625. private_key: "testkey.pem",
  626. }
  627. `)
  628. module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
  629. args := module.Rule("apexRule").Args
  630. if manifest := args["manifest"]; manifest != module.Output("apex_manifest.pb").Output.String() {
  631. t.Error("manifest should be apex_manifest.pb, but " + manifest)
  632. }
  633. }
  634. func TestApexManifestMinSdkVersion(t *testing.T) {
  635. ctx := testApex(t, `
  636. apex_defaults {
  637. name: "my_defaults",
  638. key: "myapex.key",
  639. product_specific: true,
  640. file_contexts: ":my-file-contexts",
  641. updatable: false,
  642. }
  643. apex {
  644. name: "myapex_30",
  645. min_sdk_version: "30",
  646. defaults: ["my_defaults"],
  647. }
  648. apex {
  649. name: "myapex_current",
  650. min_sdk_version: "current",
  651. defaults: ["my_defaults"],
  652. }
  653. apex {
  654. name: "myapex_none",
  655. defaults: ["my_defaults"],
  656. }
  657. apex_key {
  658. name: "myapex.key",
  659. public_key: "testkey.avbpubkey",
  660. private_key: "testkey.pem",
  661. }
  662. filegroup {
  663. name: "my-file-contexts",
  664. srcs: ["product_specific_file_contexts"],
  665. }
  666. `, withFiles(map[string][]byte{
  667. "product_specific_file_contexts": nil,
  668. }), android.FixtureModifyProductVariables(
  669. func(variables android.FixtureProductVariables) {
  670. variables.Unbundled_build = proptools.BoolPtr(true)
  671. variables.Always_use_prebuilt_sdks = proptools.BoolPtr(false)
  672. }), android.FixtureMergeEnv(map[string]string{
  673. "UNBUNDLED_BUILD_TARGET_SDK_WITH_API_FINGERPRINT": "true",
  674. }))
  675. testCases := []struct {
  676. module string
  677. minSdkVersion string
  678. }{
  679. {
  680. module: "myapex_30",
  681. minSdkVersion: "30",
  682. },
  683. {
  684. module: "myapex_current",
  685. minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
  686. },
  687. {
  688. module: "myapex_none",
  689. minSdkVersion: "Q.$$(cat out/soong/api_fingerprint.txt)",
  690. },
  691. }
  692. for _, tc := range testCases {
  693. module := ctx.ModuleForTests(tc.module, "android_common_"+tc.module+"_image")
  694. args := module.Rule("apexRule").Args
  695. optFlags := args["opt_flags"]
  696. if !strings.Contains(optFlags, "--min_sdk_version "+tc.minSdkVersion) {
  697. t.Errorf("%s: Expected min_sdk_version=%s, got: %s", tc.module, tc.minSdkVersion, optFlags)
  698. }
  699. }
  700. }
  701. func TestFileContexts(t *testing.T) {
  702. for _, useFileContextsAsIs := range []bool{true, false} {
  703. prop := ""
  704. if useFileContextsAsIs {
  705. prop = "use_file_contexts_as_is: true,\n"
  706. }
  707. ctx := testApex(t, `
  708. apex {
  709. name: "myapex",
  710. key: "myapex.key",
  711. file_contexts: "file_contexts",
  712. updatable: false,
  713. vendor: true,
  714. `+prop+`
  715. }
  716. apex_key {
  717. name: "myapex.key",
  718. public_key: "testkey.avbpubkey",
  719. private_key: "testkey.pem",
  720. }
  721. `, withFiles(map[string][]byte{
  722. "file_contexts": nil,
  723. }))
  724. rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("file_contexts")
  725. forceLabellingCommand := "apex_manifest\\\\.pb u:object_r:system_file:s0"
  726. if useFileContextsAsIs {
  727. android.AssertStringDoesNotContain(t, "should force-label",
  728. rule.RuleParams.Command, forceLabellingCommand)
  729. } else {
  730. android.AssertStringDoesContain(t, "shouldn't force-label",
  731. rule.RuleParams.Command, forceLabellingCommand)
  732. }
  733. }
  734. }
  735. func TestBasicZipApex(t *testing.T) {
  736. ctx := testApex(t, `
  737. apex {
  738. name: "myapex",
  739. key: "myapex.key",
  740. payload_type: "zip",
  741. native_shared_libs: ["mylib"],
  742. updatable: false,
  743. }
  744. apex_key {
  745. name: "myapex.key",
  746. public_key: "testkey.avbpubkey",
  747. private_key: "testkey.pem",
  748. }
  749. cc_library {
  750. name: "mylib",
  751. srcs: ["mylib.cpp"],
  752. shared_libs: ["mylib2"],
  753. system_shared_libs: [],
  754. stl: "none",
  755. apex_available: [ "myapex" ],
  756. }
  757. cc_library {
  758. name: "mylib2",
  759. srcs: ["mylib.cpp"],
  760. system_shared_libs: [],
  761. stl: "none",
  762. apex_available: [ "myapex" ],
  763. }
  764. `)
  765. zipApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_zip").Rule("zipApexRule")
  766. copyCmds := zipApexRule.Args["copy_commands"]
  767. // Ensure that main rule creates an output
  768. ensureContains(t, zipApexRule.Output.String(), "myapex.zipapex.unsigned")
  769. // Ensure that APEX variant is created for the direct dep
  770. ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
  771. // Ensure that APEX variant is created for the indirect dep
  772. ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
  773. // Ensure that both direct and indirect deps are copied into apex
  774. ensureContains(t, copyCmds, "image.zipapex/lib64/mylib.so")
  775. ensureContains(t, copyCmds, "image.zipapex/lib64/mylib2.so")
  776. }
  777. func TestApexWithStubs(t *testing.T) {
  778. ctx := testApex(t, `
  779. apex {
  780. name: "myapex",
  781. key: "myapex.key",
  782. native_shared_libs: ["mylib", "mylib3"],
  783. binaries: ["foo.rust"],
  784. updatable: false,
  785. }
  786. apex_key {
  787. name: "myapex.key",
  788. public_key: "testkey.avbpubkey",
  789. private_key: "testkey.pem",
  790. }
  791. cc_library {
  792. name: "mylib",
  793. srcs: ["mylib.cpp"],
  794. shared_libs: ["mylib2", "mylib3"],
  795. system_shared_libs: [],
  796. stl: "none",
  797. apex_available: [ "myapex" ],
  798. }
  799. cc_library {
  800. name: "mylib2",
  801. srcs: ["mylib.cpp"],
  802. cflags: ["-include mylib.h"],
  803. system_shared_libs: [],
  804. stl: "none",
  805. stubs: {
  806. versions: ["1", "2", "3"],
  807. },
  808. }
  809. cc_library {
  810. name: "mylib3",
  811. srcs: ["mylib.cpp"],
  812. shared_libs: ["mylib4"],
  813. system_shared_libs: [],
  814. stl: "none",
  815. stubs: {
  816. versions: ["10", "11", "12"],
  817. },
  818. apex_available: [ "myapex" ],
  819. }
  820. cc_library {
  821. name: "mylib4",
  822. srcs: ["mylib.cpp"],
  823. system_shared_libs: [],
  824. stl: "none",
  825. apex_available: [ "myapex" ],
  826. }
  827. rust_binary {
  828. name: "foo.rust",
  829. srcs: ["foo.rs"],
  830. shared_libs: ["libfoo.shared_from_rust"],
  831. prefer_rlib: true,
  832. apex_available: ["myapex"],
  833. }
  834. cc_library_shared {
  835. name: "libfoo.shared_from_rust",
  836. srcs: ["mylib.cpp"],
  837. system_shared_libs: [],
  838. stl: "none",
  839. stubs: {
  840. versions: ["10", "11", "12"],
  841. },
  842. }
  843. `)
  844. apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
  845. copyCmds := apexRule.Args["copy_commands"]
  846. // Ensure that direct non-stubs dep is always included
  847. ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
  848. // Ensure that indirect stubs dep is not included
  849. ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
  850. // Ensure that direct stubs dep is included
  851. ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
  852. mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
  853. // Ensure that mylib is linking with the latest version of stubs for mylib2
  854. ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
  855. // ... and not linking to the non-stub (impl) variant of mylib2
  856. ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
  857. // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
  858. ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex10000/mylib3.so")
  859. // .. and not linking to the stubs variant of mylib3
  860. ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_12/mylib3.so")
  861. // Comment out this test. Now it fails after the optimization of sharing "cflags" in cc/cc.go
  862. // is replaced by sharing of "cFlags" in cc/builder.go.
  863. // The "cflags" contains "-include mylib.h", but cFlags contained only a reference to the
  864. // module variable representing "cflags". So it was not detected by ensureNotContains.
  865. // Now "cFlags" is a reference to a module variable like $flags1, which includes all previous
  866. // content of "cflags". ModuleForTests...Args["cFlags"] returns the full string of $flags1,
  867. // including the original cflags's "-include mylib.h".
  868. //
  869. // Ensure that stubs libs are built without -include flags
  870. // mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
  871. // ensureNotContains(t, mylib2Cflags, "-include ")
  872. // Ensure that genstub for platform-provided lib is invoked with --systemapi
  873. ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_3").Rule("genStubSrc").Args["flags"], "--systemapi")
  874. // Ensure that genstub for apex-provided lib is invoked with --apex
  875. ensureContains(t, ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_shared_12").Rule("genStubSrc").Args["flags"], "--apex")
  876. ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
  877. "lib64/mylib.so",
  878. "lib64/mylib3.so",
  879. "lib64/mylib4.so",
  880. "bin/foo.rust",
  881. "lib64/libc++.so", // by the implicit dependency from foo.rust
  882. "lib64/liblog.so", // by the implicit dependency from foo.rust
  883. })
  884. // Ensure that stub dependency from a rust module is not included
  885. ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
  886. // The rust module is linked to the stub cc library
  887. rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
  888. ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
  889. ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
  890. apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
  891. ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
  892. }
  893. func TestApexCanUsePrivateApis(t *testing.T) {
  894. ctx := testApex(t, `
  895. apex {
  896. name: "myapex",
  897. key: "myapex.key",
  898. native_shared_libs: ["mylib"],
  899. binaries: ["foo.rust"],
  900. updatable: false,
  901. platform_apis: true,
  902. }
  903. apex_key {
  904. name: "myapex.key",
  905. public_key: "testkey.avbpubkey",
  906. private_key: "testkey.pem",
  907. }
  908. cc_library {
  909. name: "mylib",
  910. srcs: ["mylib.cpp"],
  911. shared_libs: ["mylib2"],
  912. system_shared_libs: [],
  913. stl: "none",
  914. apex_available: [ "myapex" ],
  915. }
  916. cc_library {
  917. name: "mylib2",
  918. srcs: ["mylib.cpp"],
  919. cflags: ["-include mylib.h"],
  920. system_shared_libs: [],
  921. stl: "none",
  922. stubs: {
  923. versions: ["1", "2", "3"],
  924. },
  925. }
  926. rust_binary {
  927. name: "foo.rust",
  928. srcs: ["foo.rs"],
  929. shared_libs: ["libfoo.shared_from_rust"],
  930. prefer_rlib: true,
  931. apex_available: ["myapex"],
  932. }
  933. cc_library_shared {
  934. name: "libfoo.shared_from_rust",
  935. srcs: ["mylib.cpp"],
  936. system_shared_libs: [],
  937. stl: "none",
  938. stubs: {
  939. versions: ["10", "11", "12"],
  940. },
  941. }
  942. `)
  943. apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
  944. copyCmds := apexRule.Args["copy_commands"]
  945. // Ensure that indirect stubs dep is not included
  946. ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
  947. ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.shared_from_rust.so")
  948. // Ensure that we are using non-stub variants of mylib2 and libfoo.shared_from_rust (because
  949. // of the platform_apis: true)
  950. mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
  951. ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
  952. ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
  953. rustDeps := ctx.ModuleForTests("foo.rust", "android_arm64_armv8-a_apex10000").Rule("rustLink").Args["linkFlags"]
  954. ensureNotContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared_current/libfoo.shared_from_rust.so")
  955. ensureContains(t, rustDeps, "libfoo.shared_from_rust/android_arm64_armv8-a_shared/libfoo.shared_from_rust.so")
  956. }
  957. func TestApexWithStubsWithMinSdkVersion(t *testing.T) {
  958. t.Parallel()
  959. ctx := testApex(t, `
  960. apex {
  961. name: "myapex",
  962. key: "myapex.key",
  963. native_shared_libs: ["mylib", "mylib3"],
  964. min_sdk_version: "29",
  965. }
  966. apex_key {
  967. name: "myapex.key",
  968. public_key: "testkey.avbpubkey",
  969. private_key: "testkey.pem",
  970. }
  971. cc_library {
  972. name: "mylib",
  973. srcs: ["mylib.cpp"],
  974. shared_libs: ["mylib2", "mylib3"],
  975. system_shared_libs: [],
  976. stl: "none",
  977. apex_available: [ "myapex" ],
  978. min_sdk_version: "28",
  979. }
  980. cc_library {
  981. name: "mylib2",
  982. srcs: ["mylib.cpp"],
  983. cflags: ["-include mylib.h"],
  984. system_shared_libs: [],
  985. stl: "none",
  986. stubs: {
  987. versions: ["28", "29", "30", "current"],
  988. },
  989. min_sdk_version: "28",
  990. }
  991. cc_library {
  992. name: "mylib3",
  993. srcs: ["mylib.cpp"],
  994. shared_libs: ["mylib4"],
  995. system_shared_libs: [],
  996. stl: "none",
  997. stubs: {
  998. versions: ["28", "29", "30", "current"],
  999. },
  1000. apex_available: [ "myapex" ],
  1001. min_sdk_version: "28",
  1002. }
  1003. cc_library {
  1004. name: "mylib4",
  1005. srcs: ["mylib.cpp"],
  1006. system_shared_libs: [],
  1007. stl: "none",
  1008. apex_available: [ "myapex" ],
  1009. min_sdk_version: "28",
  1010. }
  1011. `)
  1012. apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
  1013. copyCmds := apexRule.Args["copy_commands"]
  1014. // Ensure that direct non-stubs dep is always included
  1015. ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
  1016. // Ensure that indirect stubs dep is not included
  1017. ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
  1018. // Ensure that direct stubs dep is included
  1019. ensureContains(t, copyCmds, "image.apex/lib64/mylib3.so")
  1020. mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex29").Rule("ld").Args["libFlags"]
  1021. // Ensure that mylib is linking with the latest version of stub for mylib2
  1022. ensureContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared_current/mylib2.so")
  1023. // ... and not linking to the non-stub (impl) variant of mylib2
  1024. ensureNotContains(t, mylibLdFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
  1025. // Ensure that mylib is linking with the non-stub (impl) of mylib3 (because mylib3 is in the same apex)
  1026. ensureContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_apex29/mylib3.so")
  1027. // .. and not linking to the stubs variant of mylib3
  1028. ensureNotContains(t, mylibLdFlags, "mylib3/android_arm64_armv8-a_shared_29/mylib3.so")
  1029. // Ensure that stubs libs are built without -include flags
  1030. mylib2Cflags := ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("cc").Args["cFlags"]
  1031. ensureNotContains(t, mylib2Cflags, "-include ")
  1032. // Ensure that genstub is invoked with --systemapi
  1033. ensureContains(t, ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_shared_29").Rule("genStubSrc").Args["flags"], "--systemapi")
  1034. ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
  1035. "lib64/mylib.so",
  1036. "lib64/mylib3.so",
  1037. "lib64/mylib4.so",
  1038. })
  1039. }
  1040. func TestApex_PlatformUsesLatestStubFromApex(t *testing.T) {
  1041. t.Parallel()
  1042. // myapex (Z)
  1043. // mylib -----------------.
  1044. // |
  1045. // otherapex (29) |
  1046. // libstub's versions: 29 Z current
  1047. // |
  1048. // <platform> |
  1049. // libplatform ----------------'
  1050. ctx := testApex(t, `
  1051. apex {
  1052. name: "myapex",
  1053. key: "myapex.key",
  1054. native_shared_libs: ["mylib"],
  1055. min_sdk_version: "Z", // non-final
  1056. }
  1057. cc_library {
  1058. name: "mylib",
  1059. srcs: ["mylib.cpp"],
  1060. shared_libs: ["libstub"],
  1061. apex_available: ["myapex"],
  1062. min_sdk_version: "Z",
  1063. }
  1064. apex_key {
  1065. name: "myapex.key",
  1066. public_key: "testkey.avbpubkey",
  1067. private_key: "testkey.pem",
  1068. }
  1069. apex {
  1070. name: "otherapex",
  1071. key: "myapex.key",
  1072. native_shared_libs: ["libstub"],
  1073. min_sdk_version: "29",
  1074. }
  1075. cc_library {
  1076. name: "libstub",
  1077. srcs: ["mylib.cpp"],
  1078. stubs: {
  1079. versions: ["29", "Z", "current"],
  1080. },
  1081. apex_available: ["otherapex"],
  1082. min_sdk_version: "29",
  1083. }
  1084. // platform module depending on libstub from otherapex should use the latest stub("current")
  1085. cc_library {
  1086. name: "libplatform",
  1087. srcs: ["mylib.cpp"],
  1088. shared_libs: ["libstub"],
  1089. }
  1090. `,
  1091. android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  1092. variables.Platform_sdk_codename = proptools.StringPtr("Z")
  1093. variables.Platform_sdk_final = proptools.BoolPtr(false)
  1094. variables.Platform_version_active_codenames = []string{"Z"}
  1095. }),
  1096. )
  1097. // Ensure that mylib from myapex is built against the latest stub (current)
  1098. mylibCflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
  1099. ensureContains(t, mylibCflags, "-D__LIBSTUB_API__=10000 ")
  1100. mylibLdflags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
  1101. ensureContains(t, mylibLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
  1102. // Ensure that libplatform is built against latest stub ("current") of mylib3 from the apex
  1103. libplatformCflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
  1104. ensureContains(t, libplatformCflags, "-D__LIBSTUB_API__=10000 ") // "current" maps to 10000
  1105. libplatformLdflags := ctx.ModuleForTests("libplatform", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
  1106. ensureContains(t, libplatformLdflags, "libstub/android_arm64_armv8-a_shared_current/libstub.so ")
  1107. }
  1108. func TestApexWithExplicitStubsDependency(t *testing.T) {
  1109. ctx := testApex(t, `
  1110. apex {
  1111. name: "myapex2",
  1112. key: "myapex2.key",
  1113. native_shared_libs: ["mylib"],
  1114. updatable: false,
  1115. }
  1116. apex_key {
  1117. name: "myapex2.key",
  1118. public_key: "testkey.avbpubkey",
  1119. private_key: "testkey.pem",
  1120. }
  1121. cc_library {
  1122. name: "mylib",
  1123. srcs: ["mylib.cpp"],
  1124. shared_libs: ["libfoo#10"],
  1125. static_libs: ["libbaz"],
  1126. system_shared_libs: [],
  1127. stl: "none",
  1128. apex_available: [ "myapex2" ],
  1129. }
  1130. cc_library {
  1131. name: "libfoo",
  1132. srcs: ["mylib.cpp"],
  1133. shared_libs: ["libbar"],
  1134. system_shared_libs: [],
  1135. stl: "none",
  1136. stubs: {
  1137. versions: ["10", "20", "30"],
  1138. },
  1139. }
  1140. cc_library {
  1141. name: "libbar",
  1142. srcs: ["mylib.cpp"],
  1143. system_shared_libs: [],
  1144. stl: "none",
  1145. }
  1146. cc_library_static {
  1147. name: "libbaz",
  1148. srcs: ["mylib.cpp"],
  1149. system_shared_libs: [],
  1150. stl: "none",
  1151. apex_available: [ "myapex2" ],
  1152. }
  1153. `)
  1154. apexRule := ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Rule("apexRule")
  1155. copyCmds := apexRule.Args["copy_commands"]
  1156. // Ensure that direct non-stubs dep is always included
  1157. ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
  1158. // Ensure that indirect stubs dep is not included
  1159. ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
  1160. // Ensure that dependency of stubs is not included
  1161. ensureNotContains(t, copyCmds, "image.apex/lib64/libbar.so")
  1162. mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
  1163. // Ensure that mylib is linking with version 10 of libfoo
  1164. ensureContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared_10/libfoo.so")
  1165. // ... and not linking to the non-stub (impl) variant of libfoo
  1166. ensureNotContains(t, mylibLdFlags, "libfoo/android_arm64_armv8-a_shared/libfoo.so")
  1167. libFooStubsLdFlags := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_10").Rule("ld").Args["libFlags"]
  1168. // Ensure that libfoo stubs is not linking to libbar (since it is a stubs)
  1169. ensureNotContains(t, libFooStubsLdFlags, "libbar.so")
  1170. fullDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/fulllist.txt").Args["content"], "\\n")
  1171. ensureListContains(t, fullDepsInfo, " libfoo(minSdkVersion:(no version)) (external) <- mylib")
  1172. flatDepsInfo := strings.Split(ctx.ModuleForTests("myapex2", "android_common_myapex2_image").Output("depsinfo/flatlist.txt").Args["content"], "\\n")
  1173. ensureListContains(t, flatDepsInfo, "libfoo(minSdkVersion:(no version)) (external)")
  1174. }
  1175. func TestApexWithRuntimeLibsDependency(t *testing.T) {
  1176. /*
  1177. myapex
  1178. |
  1179. v (runtime_libs)
  1180. mylib ------+------> libfoo [provides stub]
  1181. |
  1182. `------> libbar
  1183. */
  1184. ctx := testApex(t, `
  1185. apex {
  1186. name: "myapex",
  1187. key: "myapex.key",
  1188. native_shared_libs: ["mylib"],
  1189. updatable: false,
  1190. }
  1191. apex_key {
  1192. name: "myapex.key",
  1193. public_key: "testkey.avbpubkey",
  1194. private_key: "testkey.pem",
  1195. }
  1196. cc_library {
  1197. name: "mylib",
  1198. srcs: ["mylib.cpp"],
  1199. static_libs: ["libstatic"],
  1200. shared_libs: ["libshared"],
  1201. runtime_libs: ["libfoo", "libbar"],
  1202. system_shared_libs: [],
  1203. stl: "none",
  1204. apex_available: [ "myapex" ],
  1205. }
  1206. cc_library {
  1207. name: "libfoo",
  1208. srcs: ["mylib.cpp"],
  1209. system_shared_libs: [],
  1210. stl: "none",
  1211. stubs: {
  1212. versions: ["10", "20", "30"],
  1213. },
  1214. }
  1215. cc_library {
  1216. name: "libbar",
  1217. srcs: ["mylib.cpp"],
  1218. system_shared_libs: [],
  1219. stl: "none",
  1220. apex_available: [ "myapex" ],
  1221. }
  1222. cc_library {
  1223. name: "libstatic",
  1224. srcs: ["mylib.cpp"],
  1225. system_shared_libs: [],
  1226. stl: "none",
  1227. apex_available: [ "myapex" ],
  1228. runtime_libs: ["libstatic_to_runtime"],
  1229. }
  1230. cc_library {
  1231. name: "libshared",
  1232. srcs: ["mylib.cpp"],
  1233. system_shared_libs: [],
  1234. stl: "none",
  1235. apex_available: [ "myapex" ],
  1236. runtime_libs: ["libshared_to_runtime"],
  1237. }
  1238. cc_library {
  1239. name: "libstatic_to_runtime",
  1240. srcs: ["mylib.cpp"],
  1241. system_shared_libs: [],
  1242. stl: "none",
  1243. apex_available: [ "myapex" ],
  1244. }
  1245. cc_library {
  1246. name: "libshared_to_runtime",
  1247. srcs: ["mylib.cpp"],
  1248. system_shared_libs: [],
  1249. stl: "none",
  1250. apex_available: [ "myapex" ],
  1251. }
  1252. `)
  1253. apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
  1254. copyCmds := apexRule.Args["copy_commands"]
  1255. // Ensure that direct non-stubs dep is always included
  1256. ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
  1257. // Ensure that indirect stubs dep is not included
  1258. ensureNotContains(t, copyCmds, "image.apex/lib64/libfoo.so")
  1259. // Ensure that runtime_libs dep in included
  1260. ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
  1261. ensureContains(t, copyCmds, "image.apex/lib64/libshared.so")
  1262. ensureContains(t, copyCmds, "image.apex/lib64/libshared_to_runtime.so")
  1263. ensureNotContains(t, copyCmds, "image.apex/lib64/libstatic_to_runtime.so")
  1264. apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
  1265. ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
  1266. ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libfoo.so")
  1267. }
  1268. var prepareForTestOfRuntimeApexWithHwasan = android.GroupFixturePreparers(
  1269. cc.PrepareForTestWithCcBuildComponents,
  1270. PrepareForTestWithApexBuildComponents,
  1271. android.FixtureAddTextFile("bionic/apex/Android.bp", `
  1272. apex {
  1273. name: "com.android.runtime",
  1274. key: "com.android.runtime.key",
  1275. native_shared_libs: ["libc"],
  1276. updatable: false,
  1277. }
  1278. apex_key {
  1279. name: "com.android.runtime.key",
  1280. public_key: "testkey.avbpubkey",
  1281. private_key: "testkey.pem",
  1282. }
  1283. `),
  1284. android.FixtureAddFile("system/sepolicy/apex/com.android.runtime-file_contexts", nil),
  1285. )
  1286. func TestRuntimeApexShouldInstallHwasanIfLibcDependsOnIt(t *testing.T) {
  1287. result := android.GroupFixturePreparers(prepareForTestOfRuntimeApexWithHwasan).RunTestWithBp(t, `
  1288. cc_library {
  1289. name: "libc",
  1290. no_libcrt: true,
  1291. nocrt: true,
  1292. stl: "none",
  1293. system_shared_libs: [],
  1294. stubs: { versions: ["1"] },
  1295. apex_available: ["com.android.runtime"],
  1296. sanitize: {
  1297. hwaddress: true,
  1298. }
  1299. }
  1300. cc_prebuilt_library_shared {
  1301. name: "libclang_rt.hwasan",
  1302. no_libcrt: true,
  1303. nocrt: true,
  1304. stl: "none",
  1305. system_shared_libs: [],
  1306. srcs: [""],
  1307. stubs: { versions: ["1"] },
  1308. stem: "libclang_rt.hwasan-aarch64-android",
  1309. sanitize: {
  1310. never: true,
  1311. },
  1312. apex_available: [
  1313. "//apex_available:anyapex",
  1314. "//apex_available:platform",
  1315. ],
  1316. } `)
  1317. ctx := result.TestContext
  1318. ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
  1319. "lib64/bionic/libc.so",
  1320. "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
  1321. })
  1322. hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
  1323. installed := hwasan.Description("install libclang_rt.hwasan")
  1324. ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
  1325. symlink := hwasan.Description("install symlink libclang_rt.hwasan")
  1326. ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
  1327. ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
  1328. }
  1329. func TestRuntimeApexShouldInstallHwasanIfHwaddressSanitized(t *testing.T) {
  1330. result := android.GroupFixturePreparers(
  1331. prepareForTestOfRuntimeApexWithHwasan,
  1332. android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  1333. variables.SanitizeDevice = []string{"hwaddress"}
  1334. }),
  1335. ).RunTestWithBp(t, `
  1336. cc_library {
  1337. name: "libc",
  1338. no_libcrt: true,
  1339. nocrt: true,
  1340. stl: "none",
  1341. system_shared_libs: [],
  1342. stubs: { versions: ["1"] },
  1343. apex_available: ["com.android.runtime"],
  1344. }
  1345. cc_prebuilt_library_shared {
  1346. name: "libclang_rt.hwasan",
  1347. no_libcrt: true,
  1348. nocrt: true,
  1349. stl: "none",
  1350. system_shared_libs: [],
  1351. srcs: [""],
  1352. stubs: { versions: ["1"] },
  1353. stem: "libclang_rt.hwasan-aarch64-android",
  1354. sanitize: {
  1355. never: true,
  1356. },
  1357. apex_available: [
  1358. "//apex_available:anyapex",
  1359. "//apex_available:platform",
  1360. ],
  1361. }
  1362. `)
  1363. ctx := result.TestContext
  1364. ensureExactContents(t, ctx, "com.android.runtime", "android_common_hwasan_com.android.runtime_image", []string{
  1365. "lib64/bionic/libc.so",
  1366. "lib64/bionic/libclang_rt.hwasan-aarch64-android.so",
  1367. })
  1368. hwasan := ctx.ModuleForTests("libclang_rt.hwasan", "android_arm64_armv8-a_shared")
  1369. installed := hwasan.Description("install libclang_rt.hwasan")
  1370. ensureContains(t, installed.Output.String(), "/system/lib64/bootstrap/libclang_rt.hwasan-aarch64-android.so")
  1371. symlink := hwasan.Description("install symlink libclang_rt.hwasan")
  1372. ensureEquals(t, symlink.Args["fromPath"], "/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so")
  1373. ensureContains(t, symlink.Output.String(), "/system/lib64/libclang_rt.hwasan-aarch64-android.so")
  1374. }
  1375. func TestApexDependsOnLLNDKTransitively(t *testing.T) {
  1376. testcases := []struct {
  1377. name string
  1378. minSdkVersion string
  1379. apexVariant string
  1380. shouldLink string
  1381. shouldNotLink []string
  1382. }{
  1383. {
  1384. name: "unspecified version links to the latest",
  1385. minSdkVersion: "",
  1386. apexVariant: "apex10000",
  1387. shouldLink: "current",
  1388. shouldNotLink: []string{"29", "30"},
  1389. },
  1390. {
  1391. name: "always use the latest",
  1392. minSdkVersion: "min_sdk_version: \"29\",",
  1393. apexVariant: "apex29",
  1394. shouldLink: "current",
  1395. shouldNotLink: []string{"29", "30"},
  1396. },
  1397. }
  1398. for _, tc := range testcases {
  1399. t.Run(tc.name, func(t *testing.T) {
  1400. ctx := testApex(t, `
  1401. apex {
  1402. name: "myapex",
  1403. key: "myapex.key",
  1404. native_shared_libs: ["mylib"],
  1405. updatable: false,
  1406. `+tc.minSdkVersion+`
  1407. }
  1408. apex_key {
  1409. name: "myapex.key",
  1410. public_key: "testkey.avbpubkey",
  1411. private_key: "testkey.pem",
  1412. }
  1413. cc_library {
  1414. name: "mylib",
  1415. srcs: ["mylib.cpp"],
  1416. vendor_available: true,
  1417. shared_libs: ["libbar"],
  1418. system_shared_libs: [],
  1419. stl: "none",
  1420. apex_available: [ "myapex" ],
  1421. min_sdk_version: "29",
  1422. }
  1423. cc_library {
  1424. name: "libbar",
  1425. srcs: ["mylib.cpp"],
  1426. system_shared_libs: [],
  1427. stl: "none",
  1428. stubs: { versions: ["29","30"] },
  1429. llndk: {
  1430. symbol_file: "libbar.map.txt",
  1431. }
  1432. }
  1433. `,
  1434. withUnbundledBuild,
  1435. )
  1436. // Ensure that LLNDK dep is not included
  1437. ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
  1438. "lib64/mylib.so",
  1439. })
  1440. // Ensure that LLNDK dep is required
  1441. apexManifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
  1442. ensureListEmpty(t, names(apexManifestRule.Args["provideNativeLibs"]))
  1443. ensureListContains(t, names(apexManifestRule.Args["requireNativeLibs"]), "libbar.so")
  1444. mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_"+tc.apexVariant).Rule("ld").Args["libFlags"]
  1445. ensureContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+tc.shouldLink+"/libbar.so")
  1446. for _, ver := range tc.shouldNotLink {
  1447. ensureNotContains(t, mylibLdFlags, "libbar/android_arm64_armv8-a_shared_"+ver+"/libbar.so")
  1448. }
  1449. mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_"+tc.apexVariant).Rule("cc").Args["cFlags"]
  1450. ver := tc.shouldLink
  1451. if tc.shouldLink == "current" {
  1452. ver = strconv.Itoa(android.FutureApiLevelInt)
  1453. }
  1454. ensureContains(t, mylibCFlags, "__LIBBAR_API__="+ver)
  1455. })
  1456. }
  1457. }
  1458. func TestApexWithSystemLibsStubs(t *testing.T) {
  1459. ctx := testApex(t, `
  1460. apex {
  1461. name: "myapex",
  1462. key: "myapex.key",
  1463. native_shared_libs: ["mylib", "mylib_shared", "libdl", "libm"],
  1464. updatable: false,
  1465. }
  1466. apex_key {
  1467. name: "myapex.key",
  1468. public_key: "testkey.avbpubkey",
  1469. private_key: "testkey.pem",
  1470. }
  1471. cc_library {
  1472. name: "mylib",
  1473. srcs: ["mylib.cpp"],
  1474. system_shared_libs: ["libc", "libm"],
  1475. shared_libs: ["libdl#27"],
  1476. stl: "none",
  1477. apex_available: [ "myapex" ],
  1478. }
  1479. cc_library_shared {
  1480. name: "mylib_shared",
  1481. srcs: ["mylib.cpp"],
  1482. shared_libs: ["libdl#27"],
  1483. stl: "none",
  1484. apex_available: [ "myapex" ],
  1485. }
  1486. cc_library {
  1487. name: "libBootstrap",
  1488. srcs: ["mylib.cpp"],
  1489. stl: "none",
  1490. bootstrap: true,
  1491. }
  1492. `)
  1493. apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
  1494. copyCmds := apexRule.Args["copy_commands"]
  1495. // Ensure that mylib, libm, libdl are included.
  1496. ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
  1497. ensureContains(t, copyCmds, "image.apex/lib64/bionic/libm.so")
  1498. ensureContains(t, copyCmds, "image.apex/lib64/bionic/libdl.so")
  1499. // Ensure that libc is not included (since it has stubs and not listed in native_shared_libs)
  1500. ensureNotContains(t, copyCmds, "image.apex/lib64/bionic/libc.so")
  1501. mylibLdFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
  1502. mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
  1503. mylibSharedCFlags := ctx.ModuleForTests("mylib_shared", "android_arm64_armv8-a_shared_apex10000").Rule("cc").Args["cFlags"]
  1504. // For dependency to libc
  1505. // Ensure that mylib is linking with the latest version of stubs
  1506. ensureContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared_current/libc.so")
  1507. // ... and not linking to the non-stub (impl) variant
  1508. ensureNotContains(t, mylibLdFlags, "libc/android_arm64_armv8-a_shared/libc.so")
  1509. // ... Cflags from stub is correctly exported to mylib
  1510. ensureContains(t, mylibCFlags, "__LIBC_API__=10000")
  1511. ensureContains(t, mylibSharedCFlags, "__LIBC_API__=10000")
  1512. // For dependency to libm
  1513. // Ensure that mylib is linking with the non-stub (impl) variant
  1514. ensureContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_apex10000/libm.so")
  1515. // ... and not linking to the stub variant
  1516. ensureNotContains(t, mylibLdFlags, "libm/android_arm64_armv8-a_shared_29/libm.so")
  1517. // ... and is not compiling with the stub
  1518. ensureNotContains(t, mylibCFlags, "__LIBM_API__=29")
  1519. ensureNotContains(t, mylibSharedCFlags, "__LIBM_API__=29")
  1520. // For dependency to libdl
  1521. // Ensure that mylib is linking with the specified version of stubs
  1522. ensureContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_27/libdl.so")
  1523. // ... and not linking to the other versions of stubs
  1524. ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_28/libdl.so")
  1525. ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_29/libdl.so")
  1526. // ... and not linking to the non-stub (impl) variant
  1527. ensureNotContains(t, mylibLdFlags, "libdl/android_arm64_armv8-a_shared_apex10000/libdl.so")
  1528. // ... Cflags from stub is correctly exported to mylib
  1529. ensureContains(t, mylibCFlags, "__LIBDL_API__=27")
  1530. ensureContains(t, mylibSharedCFlags, "__LIBDL_API__=27")
  1531. // Ensure that libBootstrap is depending on the platform variant of bionic libs
  1532. libFlags := ctx.ModuleForTests("libBootstrap", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
  1533. ensureContains(t, libFlags, "libc/android_arm64_armv8-a_shared/libc.so")
  1534. ensureContains(t, libFlags, "libm/android_arm64_armv8-a_shared/libm.so")
  1535. ensureContains(t, libFlags, "libdl/android_arm64_armv8-a_shared/libdl.so")
  1536. }
  1537. func TestApexMinSdkVersion_NativeModulesShouldBeBuiltAgainstStubs(t *testing.T) {
  1538. // there are three links between liba --> libz.
  1539. // 1) myapex -> libx -> liba -> libz : this should be #30 link
  1540. // 2) otherapex -> liby -> liba -> libz : this should be #30 link
  1541. // 3) (platform) -> liba -> libz : this should be non-stub link
  1542. ctx := testApex(t, `
  1543. apex {
  1544. name: "myapex",
  1545. key: "myapex.key",
  1546. native_shared_libs: ["libx"],
  1547. min_sdk_version: "29",
  1548. }
  1549. apex {
  1550. name: "otherapex",
  1551. key: "myapex.key",
  1552. native_shared_libs: ["liby"],
  1553. min_sdk_version: "30",
  1554. }
  1555. apex_key {
  1556. name: "myapex.key",
  1557. public_key: "testkey.avbpubkey",
  1558. private_key: "testkey.pem",
  1559. }
  1560. cc_library {
  1561. name: "libx",
  1562. shared_libs: ["liba"],
  1563. system_shared_libs: [],
  1564. stl: "none",
  1565. apex_available: [ "myapex" ],
  1566. min_sdk_version: "29",
  1567. }
  1568. cc_library {
  1569. name: "liby",
  1570. shared_libs: ["liba"],
  1571. system_shared_libs: [],
  1572. stl: "none",
  1573. apex_available: [ "otherapex" ],
  1574. min_sdk_version: "29",
  1575. }
  1576. cc_library {
  1577. name: "liba",
  1578. shared_libs: ["libz"],
  1579. system_shared_libs: [],
  1580. stl: "none",
  1581. apex_available: [
  1582. "//apex_available:anyapex",
  1583. "//apex_available:platform",
  1584. ],
  1585. min_sdk_version: "29",
  1586. }
  1587. cc_library {
  1588. name: "libz",
  1589. system_shared_libs: [],
  1590. stl: "none",
  1591. stubs: {
  1592. versions: ["28", "30"],
  1593. },
  1594. }
  1595. `)
  1596. expectLink := func(from, from_variant, to, to_variant string) {
  1597. ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
  1598. ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
  1599. }
  1600. expectNoLink := func(from, from_variant, to, to_variant string) {
  1601. ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
  1602. ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
  1603. }
  1604. // platform liba is linked to non-stub version
  1605. expectLink("liba", "shared", "libz", "shared")
  1606. // liba in myapex is linked to current
  1607. expectLink("liba", "shared_apex29", "libz", "shared_current")
  1608. expectNoLink("liba", "shared_apex29", "libz", "shared_30")
  1609. expectNoLink("liba", "shared_apex29", "libz", "shared_28")
  1610. expectNoLink("liba", "shared_apex29", "libz", "shared")
  1611. // liba in otherapex is linked to current
  1612. expectLink("liba", "shared_apex30", "libz", "shared_current")
  1613. expectNoLink("liba", "shared_apex30", "libz", "shared_30")
  1614. expectNoLink("liba", "shared_apex30", "libz", "shared_28")
  1615. expectNoLink("liba", "shared_apex30", "libz", "shared")
  1616. }
  1617. func TestApexMinSdkVersion_SupportsCodeNames(t *testing.T) {
  1618. ctx := testApex(t, `
  1619. apex {
  1620. name: "myapex",
  1621. key: "myapex.key",
  1622. native_shared_libs: ["libx"],
  1623. min_sdk_version: "R",
  1624. }
  1625. apex_key {
  1626. name: "myapex.key",
  1627. public_key: "testkey.avbpubkey",
  1628. private_key: "testkey.pem",
  1629. }
  1630. cc_library {
  1631. name: "libx",
  1632. shared_libs: ["libz"],
  1633. system_shared_libs: [],
  1634. stl: "none",
  1635. apex_available: [ "myapex" ],
  1636. min_sdk_version: "R",
  1637. }
  1638. cc_library {
  1639. name: "libz",
  1640. system_shared_libs: [],
  1641. stl: "none",
  1642. stubs: {
  1643. versions: ["29", "R"],
  1644. },
  1645. }
  1646. `,
  1647. android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  1648. variables.Platform_version_active_codenames = []string{"R"}
  1649. }),
  1650. )
  1651. expectLink := func(from, from_variant, to, to_variant string) {
  1652. ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
  1653. ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
  1654. }
  1655. expectNoLink := func(from, from_variant, to, to_variant string) {
  1656. ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
  1657. ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
  1658. }
  1659. expectLink("libx", "shared_apex10000", "libz", "shared_current")
  1660. expectNoLink("libx", "shared_apex10000", "libz", "shared_R")
  1661. expectNoLink("libx", "shared_apex10000", "libz", "shared_29")
  1662. expectNoLink("libx", "shared_apex10000", "libz", "shared")
  1663. }
  1664. func TestApexMinSdkVersion_SupportsCodeNames_JavaLibs(t *testing.T) {
  1665. testApex(t, `
  1666. apex {
  1667. name: "myapex",
  1668. key: "myapex.key",
  1669. java_libs: ["libx"],
  1670. min_sdk_version: "S",
  1671. }
  1672. apex_key {
  1673. name: "myapex.key",
  1674. public_key: "testkey.avbpubkey",
  1675. private_key: "testkey.pem",
  1676. }
  1677. java_library {
  1678. name: "libx",
  1679. srcs: ["a.java"],
  1680. apex_available: [ "myapex" ],
  1681. sdk_version: "current",
  1682. min_sdk_version: "S", // should be okay
  1683. }
  1684. `,
  1685. android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  1686. variables.Platform_version_active_codenames = []string{"S"}
  1687. variables.Platform_sdk_codename = proptools.StringPtr("S")
  1688. }),
  1689. )
  1690. }
  1691. func TestApexMinSdkVersion_DefaultsToLatest(t *testing.T) {
  1692. ctx := testApex(t, `
  1693. apex {
  1694. name: "myapex",
  1695. key: "myapex.key",
  1696. native_shared_libs: ["libx"],
  1697. updatable: false,
  1698. }
  1699. apex_key {
  1700. name: "myapex.key",
  1701. public_key: "testkey.avbpubkey",
  1702. private_key: "testkey.pem",
  1703. }
  1704. cc_library {
  1705. name: "libx",
  1706. shared_libs: ["libz"],
  1707. system_shared_libs: [],
  1708. stl: "none",
  1709. apex_available: [ "myapex" ],
  1710. }
  1711. cc_library {
  1712. name: "libz",
  1713. system_shared_libs: [],
  1714. stl: "none",
  1715. stubs: {
  1716. versions: ["1", "2"],
  1717. },
  1718. }
  1719. `)
  1720. expectLink := func(from, from_variant, to, to_variant string) {
  1721. ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
  1722. ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
  1723. }
  1724. expectNoLink := func(from, from_variant, to, to_variant string) {
  1725. ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
  1726. ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
  1727. }
  1728. expectLink("libx", "shared_apex10000", "libz", "shared_current")
  1729. expectNoLink("libx", "shared_apex10000", "libz", "shared_1")
  1730. expectNoLink("libx", "shared_apex10000", "libz", "shared_2")
  1731. expectNoLink("libx", "shared_apex10000", "libz", "shared")
  1732. }
  1733. func TestApexMinSdkVersion_InVendorApex(t *testing.T) {
  1734. ctx := testApex(t, `
  1735. apex {
  1736. name: "myapex",
  1737. key: "myapex.key",
  1738. native_shared_libs: ["mylib"],
  1739. updatable: true,
  1740. vendor: true,
  1741. min_sdk_version: "29",
  1742. }
  1743. apex_key {
  1744. name: "myapex.key",
  1745. public_key: "testkey.avbpubkey",
  1746. private_key: "testkey.pem",
  1747. }
  1748. cc_library {
  1749. name: "mylib",
  1750. srcs: ["mylib.cpp"],
  1751. vendor_available: true,
  1752. min_sdk_version: "29",
  1753. shared_libs: ["libbar"],
  1754. }
  1755. cc_library {
  1756. name: "libbar",
  1757. stubs: { versions: ["29", "30"] },
  1758. llndk: { symbol_file: "libbar.map.txt" },
  1759. }
  1760. `)
  1761. vendorVariant := "android_vendor.29_arm64_armv8-a"
  1762. mylib := ctx.ModuleForTests("mylib", vendorVariant+"_shared_myapex")
  1763. // Ensure that mylib links with "current" LLNDK
  1764. libFlags := names(mylib.Rule("ld").Args["libFlags"])
  1765. ensureListContains(t, libFlags, "out/soong/.intermediates/libbar/"+vendorVariant+"_shared_current/libbar.so")
  1766. // Ensure that mylib is targeting 29
  1767. ccRule := ctx.ModuleForTests("mylib", vendorVariant+"_static_apex29").Output("obj/mylib.o")
  1768. ensureContains(t, ccRule.Args["cFlags"], "-target aarch64-linux-android29")
  1769. // Ensure that the correct variant of crtbegin_so is used.
  1770. crtBegin := mylib.Rule("ld").Args["crtBegin"]
  1771. ensureContains(t, crtBegin, "out/soong/.intermediates/"+cc.DefaultCcCommonTestModulesDir+"crtbegin_so/"+vendorVariant+"_apex29/crtbegin_so.o")
  1772. // Ensure that the crtbegin_so used by the APEX is targeting 29
  1773. cflags := ctx.ModuleForTests("crtbegin_so", vendorVariant+"_apex29").Rule("cc").Args["cFlags"]
  1774. android.AssertStringDoesContain(t, "cflags", cflags, "-target aarch64-linux-android29")
  1775. }
  1776. func TestTrackAllowedDeps(t *testing.T) {
  1777. ctx := testApex(t, `
  1778. apex {
  1779. name: "myapex",
  1780. key: "myapex.key",
  1781. updatable: true,
  1782. native_shared_libs: [
  1783. "mylib",
  1784. "yourlib",
  1785. ],
  1786. min_sdk_version: "29",
  1787. }
  1788. apex {
  1789. name: "myapex2",
  1790. key: "myapex.key",
  1791. updatable: false,
  1792. native_shared_libs: ["yourlib"],
  1793. }
  1794. apex_key {
  1795. name: "myapex.key",
  1796. public_key: "testkey.avbpubkey",
  1797. private_key: "testkey.pem",
  1798. }
  1799. cc_library {
  1800. name: "mylib",
  1801. srcs: ["mylib.cpp"],
  1802. shared_libs: ["libbar"],
  1803. min_sdk_version: "29",
  1804. apex_available: ["myapex"],
  1805. }
  1806. cc_library {
  1807. name: "libbar",
  1808. stubs: { versions: ["29", "30"] },
  1809. }
  1810. cc_library {
  1811. name: "yourlib",
  1812. srcs: ["mylib.cpp"],
  1813. min_sdk_version: "29",
  1814. apex_available: ["myapex", "myapex2", "//apex_available:platform"],
  1815. }
  1816. `, withFiles(android.MockFS{
  1817. "packages/modules/common/build/allowed_deps.txt": nil,
  1818. }))
  1819. depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
  1820. inputs := depsinfo.Rule("generateApexDepsInfoFilesRule").BuildParams.Inputs.Strings()
  1821. android.AssertStringListContains(t, "updatable myapex should generate depsinfo file", inputs,
  1822. "out/soong/.intermediates/myapex/android_common_myapex_image/depsinfo/flatlist.txt")
  1823. android.AssertStringListDoesNotContain(t, "non-updatable myapex2 should not generate depsinfo file", inputs,
  1824. "out/soong/.intermediates/myapex2/android_common_myapex2_image/depsinfo/flatlist.txt")
  1825. myapex := ctx.ModuleForTests("myapex", "android_common_myapex_image")
  1826. flatlist := strings.Split(myapex.Output("depsinfo/flatlist.txt").BuildParams.Args["content"], "\\n")
  1827. android.AssertStringListContains(t, "deps with stubs should be tracked in depsinfo as external dep",
  1828. flatlist, "libbar(minSdkVersion:(no version)) (external)")
  1829. android.AssertStringListDoesNotContain(t, "do not track if not available for platform",
  1830. flatlist, "mylib:(minSdkVersion:29)")
  1831. android.AssertStringListContains(t, "track platform-available lib",
  1832. flatlist, "yourlib(minSdkVersion:29)")
  1833. }
  1834. func TestTrackAllowedDeps_SkipWithoutAllowedDepsTxt(t *testing.T) {
  1835. ctx := testApex(t, `
  1836. apex {
  1837. name: "myapex",
  1838. key: "myapex.key",
  1839. updatable: true,
  1840. min_sdk_version: "29",
  1841. }
  1842. apex_key {
  1843. name: "myapex.key",
  1844. public_key: "testkey.avbpubkey",
  1845. private_key: "testkey.pem",
  1846. }
  1847. `)
  1848. depsinfo := ctx.SingletonForTests("apex_depsinfo_singleton")
  1849. if nil != depsinfo.MaybeRule("generateApexDepsInfoFilesRule").Output {
  1850. t.Error("apex_depsinfo_singleton shouldn't run when allowed_deps.txt doesn't exist")
  1851. }
  1852. }
  1853. func TestPlatformUsesLatestStubsFromApexes(t *testing.T) {
  1854. ctx := testApex(t, `
  1855. apex {
  1856. name: "myapex",
  1857. key: "myapex.key",
  1858. native_shared_libs: ["libx"],
  1859. updatable: false,
  1860. }
  1861. apex_key {
  1862. name: "myapex.key",
  1863. public_key: "testkey.avbpubkey",
  1864. private_key: "testkey.pem",
  1865. }
  1866. cc_library {
  1867. name: "libx",
  1868. system_shared_libs: [],
  1869. stl: "none",
  1870. apex_available: [ "myapex" ],
  1871. stubs: {
  1872. versions: ["1", "2"],
  1873. },
  1874. }
  1875. cc_library {
  1876. name: "libz",
  1877. shared_libs: ["libx"],
  1878. system_shared_libs: [],
  1879. stl: "none",
  1880. }
  1881. `)
  1882. expectLink := func(from, from_variant, to, to_variant string) {
  1883. t.Helper()
  1884. ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
  1885. ensureContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
  1886. }
  1887. expectNoLink := func(from, from_variant, to, to_variant string) {
  1888. t.Helper()
  1889. ldArgs := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld").Args["libFlags"]
  1890. ensureNotContains(t, ldArgs, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
  1891. }
  1892. expectLink("libz", "shared", "libx", "shared_current")
  1893. expectNoLink("libz", "shared", "libx", "shared_2")
  1894. expectNoLink("libz", "shared", "libz", "shared_1")
  1895. expectNoLink("libz", "shared", "libz", "shared")
  1896. }
  1897. var prepareForTestWithSantitizeHwaddress = android.FixtureModifyProductVariables(
  1898. func(variables android.FixtureProductVariables) {
  1899. variables.SanitizeDevice = []string{"hwaddress"}
  1900. },
  1901. )
  1902. func TestQApexesUseLatestStubsInBundledBuildsAndHWASAN(t *testing.T) {
  1903. ctx := testApex(t, `
  1904. apex {
  1905. name: "myapex",
  1906. key: "myapex.key",
  1907. native_shared_libs: ["libx"],
  1908. min_sdk_version: "29",
  1909. }
  1910. apex_key {
  1911. name: "myapex.key",
  1912. public_key: "testkey.avbpubkey",
  1913. private_key: "testkey.pem",
  1914. }
  1915. cc_library {
  1916. name: "libx",
  1917. shared_libs: ["libbar"],
  1918. apex_available: [ "myapex" ],
  1919. min_sdk_version: "29",
  1920. }
  1921. cc_library {
  1922. name: "libbar",
  1923. stubs: {
  1924. versions: ["29", "30"],
  1925. },
  1926. }
  1927. `,
  1928. prepareForTestWithSantitizeHwaddress,
  1929. )
  1930. expectLink := func(from, from_variant, to, to_variant string) {
  1931. ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
  1932. libFlags := ld.Args["libFlags"]
  1933. ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
  1934. }
  1935. expectLink("libx", "shared_hwasan_apex29", "libbar", "shared_current")
  1936. }
  1937. func TestQTargetApexUsesStaticUnwinder(t *testing.T) {
  1938. ctx := testApex(t, `
  1939. apex {
  1940. name: "myapex",
  1941. key: "myapex.key",
  1942. native_shared_libs: ["libx"],
  1943. min_sdk_version: "29",
  1944. }
  1945. apex_key {
  1946. name: "myapex.key",
  1947. public_key: "testkey.avbpubkey",
  1948. private_key: "testkey.pem",
  1949. }
  1950. cc_library {
  1951. name: "libx",
  1952. apex_available: [ "myapex" ],
  1953. min_sdk_version: "29",
  1954. }
  1955. `)
  1956. // ensure apex variant of c++ is linked with static unwinder
  1957. cm := ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared_apex29").Module().(*cc.Module)
  1958. ensureListContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
  1959. // note that platform variant is not.
  1960. cm = ctx.ModuleForTests("libc++", "android_arm64_armv8-a_shared").Module().(*cc.Module)
  1961. ensureListNotContains(t, cm.Properties.AndroidMkStaticLibs, "libunwind")
  1962. }
  1963. func TestApexMinSdkVersion_ErrorIfIncompatibleVersion(t *testing.T) {
  1964. testApexError(t, `module "mylib".*: should support min_sdk_version\(29\)`, `
  1965. apex {
  1966. name: "myapex",
  1967. key: "myapex.key",
  1968. native_shared_libs: ["mylib"],
  1969. min_sdk_version: "29",
  1970. }
  1971. apex_key {
  1972. name: "myapex.key",
  1973. public_key: "testkey.avbpubkey",
  1974. private_key: "testkey.pem",
  1975. }
  1976. cc_library {
  1977. name: "mylib",
  1978. srcs: ["mylib.cpp"],
  1979. system_shared_libs: [],
  1980. stl: "none",
  1981. apex_available: [
  1982. "myapex",
  1983. ],
  1984. min_sdk_version: "30",
  1985. }
  1986. `)
  1987. testApexError(t, `module "libfoo.ffi".*: should support min_sdk_version\(29\)`, `
  1988. apex {
  1989. name: "myapex",
  1990. key: "myapex.key",
  1991. native_shared_libs: ["libfoo.ffi"],
  1992. min_sdk_version: "29",
  1993. }
  1994. apex_key {
  1995. name: "myapex.key",
  1996. public_key: "testkey.avbpubkey",
  1997. private_key: "testkey.pem",
  1998. }
  1999. rust_ffi_shared {
  2000. name: "libfoo.ffi",
  2001. srcs: ["foo.rs"],
  2002. crate_name: "foo",
  2003. apex_available: [
  2004. "myapex",
  2005. ],
  2006. min_sdk_version: "30",
  2007. }
  2008. `)
  2009. testApexError(t, `module "libfoo".*: should support min_sdk_version\(29\)`, `
  2010. apex {
  2011. name: "myapex",
  2012. key: "myapex.key",
  2013. java_libs: ["libfoo"],
  2014. min_sdk_version: "29",
  2015. }
  2016. apex_key {
  2017. name: "myapex.key",
  2018. public_key: "testkey.avbpubkey",
  2019. private_key: "testkey.pem",
  2020. }
  2021. java_import {
  2022. name: "libfoo",
  2023. jars: ["libfoo.jar"],
  2024. apex_available: [
  2025. "myapex",
  2026. ],
  2027. min_sdk_version: "30",
  2028. }
  2029. `)
  2030. // Skip check for modules compiling against core API surface
  2031. testApex(t, `
  2032. apex {
  2033. name: "myapex",
  2034. key: "myapex.key",
  2035. java_libs: ["libfoo"],
  2036. min_sdk_version: "29",
  2037. }
  2038. apex_key {
  2039. name: "myapex.key",
  2040. public_key: "testkey.avbpubkey",
  2041. private_key: "testkey.pem",
  2042. }
  2043. java_library {
  2044. name: "libfoo",
  2045. srcs: ["Foo.java"],
  2046. apex_available: [
  2047. "myapex",
  2048. ],
  2049. // Compile against core API surface
  2050. sdk_version: "core_current",
  2051. min_sdk_version: "30",
  2052. }
  2053. `)
  2054. }
  2055. func TestApexMinSdkVersion_Okay(t *testing.T) {
  2056. testApex(t, `
  2057. apex {
  2058. name: "myapex",
  2059. key: "myapex.key",
  2060. native_shared_libs: ["libfoo"],
  2061. java_libs: ["libbar"],
  2062. min_sdk_version: "29",
  2063. }
  2064. apex_key {
  2065. name: "myapex.key",
  2066. public_key: "testkey.avbpubkey",
  2067. private_key: "testkey.pem",
  2068. }
  2069. cc_library {
  2070. name: "libfoo",
  2071. srcs: ["mylib.cpp"],
  2072. shared_libs: ["libfoo_dep"],
  2073. apex_available: ["myapex"],
  2074. min_sdk_version: "29",
  2075. }
  2076. cc_library {
  2077. name: "libfoo_dep",
  2078. srcs: ["mylib.cpp"],
  2079. apex_available: ["myapex"],
  2080. min_sdk_version: "29",
  2081. }
  2082. java_library {
  2083. name: "libbar",
  2084. sdk_version: "current",
  2085. srcs: ["a.java"],
  2086. static_libs: [
  2087. "libbar_dep",
  2088. "libbar_import_dep",
  2089. ],
  2090. apex_available: ["myapex"],
  2091. min_sdk_version: "29",
  2092. }
  2093. java_library {
  2094. name: "libbar_dep",
  2095. sdk_version: "current",
  2096. srcs: ["a.java"],
  2097. apex_available: ["myapex"],
  2098. min_sdk_version: "29",
  2099. }
  2100. java_import {
  2101. name: "libbar_import_dep",
  2102. jars: ["libbar.jar"],
  2103. apex_available: ["myapex"],
  2104. min_sdk_version: "29",
  2105. }
  2106. `)
  2107. }
  2108. func TestApexMinSdkVersion_MinApiForArch(t *testing.T) {
  2109. // Tests that an apex dependency with min_sdk_version higher than the
  2110. // min_sdk_version of the apex is allowed as long as the dependency's
  2111. // min_sdk_version is less than or equal to the api level that the
  2112. // architecture was introduced in. In this case, arm64 didn't exist
  2113. // until api level 21, so the arm64 code will never need to run on
  2114. // an api level 20 device, even if other architectures of the apex
  2115. // will.
  2116. testApex(t, `
  2117. apex {
  2118. name: "myapex",
  2119. key: "myapex.key",
  2120. native_shared_libs: ["libfoo"],
  2121. min_sdk_version: "20",
  2122. }
  2123. apex_key {
  2124. name: "myapex.key",
  2125. public_key: "testkey.avbpubkey",
  2126. private_key: "testkey.pem",
  2127. }
  2128. cc_library {
  2129. name: "libfoo",
  2130. srcs: ["mylib.cpp"],
  2131. apex_available: ["myapex"],
  2132. min_sdk_version: "21",
  2133. stl: "none",
  2134. }
  2135. `)
  2136. }
  2137. func TestJavaStableSdkVersion(t *testing.T) {
  2138. testCases := []struct {
  2139. name string
  2140. expectedError string
  2141. bp string
  2142. preparer android.FixturePreparer
  2143. }{
  2144. {
  2145. name: "Non-updatable apex with non-stable dep",
  2146. bp: `
  2147. apex {
  2148. name: "myapex",
  2149. java_libs: ["myjar"],
  2150. key: "myapex.key",
  2151. updatable: false,
  2152. }
  2153. apex_key {
  2154. name: "myapex.key",
  2155. public_key: "testkey.avbpubkey",
  2156. private_key: "testkey.pem",
  2157. }
  2158. java_library {
  2159. name: "myjar",
  2160. srcs: ["foo/bar/MyClass.java"],
  2161. sdk_version: "test_current",
  2162. apex_available: ["myapex"],
  2163. }
  2164. `,
  2165. },
  2166. {
  2167. name: "Updatable apex with stable dep",
  2168. bp: `
  2169. apex {
  2170. name: "myapex",
  2171. java_libs: ["myjar"],
  2172. key: "myapex.key",
  2173. updatable: true,
  2174. min_sdk_version: "29",
  2175. }
  2176. apex_key {
  2177. name: "myapex.key",
  2178. public_key: "testkey.avbpubkey",
  2179. private_key: "testkey.pem",
  2180. }
  2181. java_library {
  2182. name: "myjar",
  2183. srcs: ["foo/bar/MyClass.java"],
  2184. sdk_version: "current",
  2185. apex_available: ["myapex"],
  2186. min_sdk_version: "29",
  2187. }
  2188. `,
  2189. },
  2190. {
  2191. name: "Updatable apex with non-stable dep",
  2192. expectedError: "cannot depend on \"myjar\"",
  2193. bp: `
  2194. apex {
  2195. name: "myapex",
  2196. java_libs: ["myjar"],
  2197. key: "myapex.key",
  2198. updatable: true,
  2199. }
  2200. apex_key {
  2201. name: "myapex.key",
  2202. public_key: "testkey.avbpubkey",
  2203. private_key: "testkey.pem",
  2204. }
  2205. java_library {
  2206. name: "myjar",
  2207. srcs: ["foo/bar/MyClass.java"],
  2208. sdk_version: "test_current",
  2209. apex_available: ["myapex"],
  2210. }
  2211. `,
  2212. },
  2213. {
  2214. name: "Updatable apex with non-stable legacy core platform dep",
  2215. expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
  2216. bp: `
  2217. apex {
  2218. name: "myapex",
  2219. java_libs: ["myjar-uses-legacy"],
  2220. key: "myapex.key",
  2221. updatable: true,
  2222. }
  2223. apex_key {
  2224. name: "myapex.key",
  2225. public_key: "testkey.avbpubkey",
  2226. private_key: "testkey.pem",
  2227. }
  2228. java_library {
  2229. name: "myjar-uses-legacy",
  2230. srcs: ["foo/bar/MyClass.java"],
  2231. sdk_version: "core_platform",
  2232. apex_available: ["myapex"],
  2233. }
  2234. `,
  2235. preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
  2236. },
  2237. {
  2238. name: "Updatable apex with non-stable transitive dep",
  2239. // This is not actually detecting that the transitive dependency is unstable, rather it is
  2240. // detecting that the transitive dependency is building against a wider API surface than the
  2241. // module that depends on it is using.
  2242. expectedError: "compiles against Android API, but dependency \"transitive-jar\" is compiling against private API.",
  2243. bp: `
  2244. apex {
  2245. name: "myapex",
  2246. java_libs: ["myjar"],
  2247. key: "myapex.key",
  2248. updatable: true,
  2249. }
  2250. apex_key {
  2251. name: "myapex.key",
  2252. public_key: "testkey.avbpubkey",
  2253. private_key: "testkey.pem",
  2254. }
  2255. java_library {
  2256. name: "myjar",
  2257. srcs: ["foo/bar/MyClass.java"],
  2258. sdk_version: "current",
  2259. apex_available: ["myapex"],
  2260. static_libs: ["transitive-jar"],
  2261. }
  2262. java_library {
  2263. name: "transitive-jar",
  2264. srcs: ["foo/bar/MyClass.java"],
  2265. sdk_version: "core_platform",
  2266. apex_available: ["myapex"],
  2267. }
  2268. `,
  2269. },
  2270. }
  2271. for _, test := range testCases {
  2272. if test.name != "Updatable apex with non-stable legacy core platform dep" {
  2273. continue
  2274. }
  2275. t.Run(test.name, func(t *testing.T) {
  2276. errorHandler := android.FixtureExpectsNoErrors
  2277. if test.expectedError != "" {
  2278. errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
  2279. }
  2280. android.GroupFixturePreparers(
  2281. java.PrepareForTestWithJavaDefaultModules,
  2282. PrepareForTestWithApexBuildComponents,
  2283. prepareForTestWithMyapex,
  2284. android.OptionalFixturePreparer(test.preparer),
  2285. ).
  2286. ExtendWithErrorHandler(errorHandler).
  2287. RunTestWithBp(t, test.bp)
  2288. })
  2289. }
  2290. }
  2291. func TestApexMinSdkVersion_ErrorIfDepIsNewer(t *testing.T) {
  2292. testApexError(t, `module "mylib2".*: should support min_sdk_version\(29\) for "myapex"`, `
  2293. apex {
  2294. name: "myapex",
  2295. key: "myapex.key",
  2296. native_shared_libs: ["mylib"],
  2297. min_sdk_version: "29",
  2298. }
  2299. apex_key {
  2300. name: "myapex.key",
  2301. public_key: "testkey.avbpubkey",
  2302. private_key: "testkey.pem",
  2303. }
  2304. cc_library {
  2305. name: "mylib",
  2306. srcs: ["mylib.cpp"],
  2307. shared_libs: ["mylib2"],
  2308. system_shared_libs: [],
  2309. stl: "none",
  2310. apex_available: [
  2311. "myapex",
  2312. ],
  2313. min_sdk_version: "29",
  2314. }
  2315. // indirect part of the apex
  2316. cc_library {
  2317. name: "mylib2",
  2318. srcs: ["mylib.cpp"],
  2319. system_shared_libs: [],
  2320. stl: "none",
  2321. apex_available: [
  2322. "myapex",
  2323. ],
  2324. min_sdk_version: "30",
  2325. }
  2326. `)
  2327. }
  2328. func TestApexMinSdkVersion_ErrorIfDepIsNewer_Java(t *testing.T) {
  2329. testApexError(t, `module "bar".*: should support min_sdk_version\(29\) for "myapex"`, `
  2330. apex {
  2331. name: "myapex",
  2332. key: "myapex.key",
  2333. apps: ["AppFoo"],
  2334. min_sdk_version: "29",
  2335. updatable: false,
  2336. }
  2337. apex_key {
  2338. name: "myapex.key",
  2339. public_key: "testkey.avbpubkey",
  2340. private_key: "testkey.pem",
  2341. }
  2342. android_app {
  2343. name: "AppFoo",
  2344. srcs: ["foo/bar/MyClass.java"],
  2345. sdk_version: "current",
  2346. min_sdk_version: "29",
  2347. system_modules: "none",
  2348. stl: "none",
  2349. static_libs: ["bar"],
  2350. apex_available: [ "myapex" ],
  2351. }
  2352. java_library {
  2353. name: "bar",
  2354. sdk_version: "current",
  2355. srcs: ["a.java"],
  2356. apex_available: [ "myapex" ],
  2357. }
  2358. `)
  2359. }
  2360. func TestApexMinSdkVersion_OkayEvenWhenDepIsNewer_IfItSatisfiesApexMinSdkVersion(t *testing.T) {
  2361. ctx := testApex(t, `
  2362. apex {
  2363. name: "myapex",
  2364. key: "myapex.key",
  2365. native_shared_libs: ["mylib"],
  2366. min_sdk_version: "29",
  2367. }
  2368. apex_key {
  2369. name: "myapex.key",
  2370. public_key: "testkey.avbpubkey",
  2371. private_key: "testkey.pem",
  2372. }
  2373. // mylib in myapex will link to mylib2#current
  2374. // mylib in otherapex will link to mylib2(non-stub) in otherapex as well
  2375. cc_library {
  2376. name: "mylib",
  2377. srcs: ["mylib.cpp"],
  2378. shared_libs: ["mylib2"],
  2379. system_shared_libs: [],
  2380. stl: "none",
  2381. apex_available: ["myapex", "otherapex"],
  2382. min_sdk_version: "29",
  2383. }
  2384. cc_library {
  2385. name: "mylib2",
  2386. srcs: ["mylib.cpp"],
  2387. system_shared_libs: [],
  2388. stl: "none",
  2389. apex_available: ["otherapex"],
  2390. stubs: { versions: ["29", "30"] },
  2391. min_sdk_version: "30",
  2392. }
  2393. apex {
  2394. name: "otherapex",
  2395. key: "myapex.key",
  2396. native_shared_libs: ["mylib", "mylib2"],
  2397. min_sdk_version: "30",
  2398. }
  2399. `)
  2400. expectLink := func(from, from_variant, to, to_variant string) {
  2401. ld := ctx.ModuleForTests(from, "android_arm64_armv8-a_"+from_variant).Rule("ld")
  2402. libFlags := ld.Args["libFlags"]
  2403. ensureContains(t, libFlags, "android_arm64_armv8-a_"+to_variant+"/"+to+".so")
  2404. }
  2405. expectLink("mylib", "shared_apex29", "mylib2", "shared_current")
  2406. expectLink("mylib", "shared_apex30", "mylib2", "shared_apex30")
  2407. }
  2408. func TestApexMinSdkVersion_WorksWithSdkCodename(t *testing.T) {
  2409. withSAsActiveCodeNames := android.FixtureModifyProductVariables(
  2410. func(variables android.FixtureProductVariables) {
  2411. variables.Platform_sdk_codename = proptools.StringPtr("S")
  2412. variables.Platform_version_active_codenames = []string{"S"}
  2413. },
  2414. )
  2415. testApexError(t, `libbar.*: should support min_sdk_version\(S\)`, `
  2416. apex {
  2417. name: "myapex",
  2418. key: "myapex.key",
  2419. native_shared_libs: ["libfoo"],
  2420. min_sdk_version: "S",
  2421. }
  2422. apex_key {
  2423. name: "myapex.key",
  2424. public_key: "testkey.avbpubkey",
  2425. private_key: "testkey.pem",
  2426. }
  2427. cc_library {
  2428. name: "libfoo",
  2429. shared_libs: ["libbar"],
  2430. apex_available: ["myapex"],
  2431. min_sdk_version: "29",
  2432. }
  2433. cc_library {
  2434. name: "libbar",
  2435. apex_available: ["myapex"],
  2436. }
  2437. `, withSAsActiveCodeNames)
  2438. }
  2439. func TestApexMinSdkVersion_WorksWithActiveCodenames(t *testing.T) {
  2440. withSAsActiveCodeNames := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  2441. variables.Platform_sdk_codename = proptools.StringPtr("S")
  2442. variables.Platform_version_active_codenames = []string{"S", "T"}
  2443. })
  2444. ctx := testApex(t, `
  2445. apex {
  2446. name: "myapex",
  2447. key: "myapex.key",
  2448. native_shared_libs: ["libfoo"],
  2449. min_sdk_version: "S",
  2450. }
  2451. apex_key {
  2452. name: "myapex.key",
  2453. public_key: "testkey.avbpubkey",
  2454. private_key: "testkey.pem",
  2455. }
  2456. cc_library {
  2457. name: "libfoo",
  2458. shared_libs: ["libbar"],
  2459. apex_available: ["myapex"],
  2460. min_sdk_version: "S",
  2461. }
  2462. cc_library {
  2463. name: "libbar",
  2464. stubs: {
  2465. symbol_file: "libbar.map.txt",
  2466. versions: ["30", "S", "T"],
  2467. },
  2468. }
  2469. `, withSAsActiveCodeNames)
  2470. // ensure libfoo is linked with current version of libbar stub
  2471. libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared_apex10000")
  2472. libFlags := libfoo.Rule("ld").Args["libFlags"]
  2473. ensureContains(t, libFlags, "android_arm64_armv8-a_shared_current/libbar.so")
  2474. }
  2475. func TestFilesInSubDir(t *testing.T) {
  2476. ctx := testApex(t, `
  2477. apex {
  2478. name: "myapex",
  2479. key: "myapex.key",
  2480. native_shared_libs: ["mylib"],
  2481. binaries: ["mybin"],
  2482. prebuilts: ["myetc"],
  2483. compile_multilib: "both",
  2484. updatable: false,
  2485. }
  2486. apex_key {
  2487. name: "myapex.key",
  2488. public_key: "testkey.avbpubkey",
  2489. private_key: "testkey.pem",
  2490. }
  2491. prebuilt_etc {
  2492. name: "myetc",
  2493. src: "myprebuilt",
  2494. sub_dir: "foo/bar",
  2495. }
  2496. cc_library {
  2497. name: "mylib",
  2498. srcs: ["mylib.cpp"],
  2499. relative_install_path: "foo/bar",
  2500. system_shared_libs: [],
  2501. stl: "none",
  2502. apex_available: [ "myapex" ],
  2503. }
  2504. cc_binary {
  2505. name: "mybin",
  2506. srcs: ["mylib.cpp"],
  2507. relative_install_path: "foo/bar",
  2508. system_shared_libs: [],
  2509. stl: "none",
  2510. apex_available: [ "myapex" ],
  2511. }
  2512. `)
  2513. generateFsRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("generateFsConfig")
  2514. cmd := generateFsRule.RuleParams.Command
  2515. // Ensure that the subdirectories are all listed
  2516. ensureContains(t, cmd, "/etc ")
  2517. ensureContains(t, cmd, "/etc/foo ")
  2518. ensureContains(t, cmd, "/etc/foo/bar ")
  2519. ensureContains(t, cmd, "/lib64 ")
  2520. ensureContains(t, cmd, "/lib64/foo ")
  2521. ensureContains(t, cmd, "/lib64/foo/bar ")
  2522. ensureContains(t, cmd, "/lib ")
  2523. ensureContains(t, cmd, "/lib/foo ")
  2524. ensureContains(t, cmd, "/lib/foo/bar ")
  2525. ensureContains(t, cmd, "/bin ")
  2526. ensureContains(t, cmd, "/bin/foo ")
  2527. ensureContains(t, cmd, "/bin/foo/bar ")
  2528. }
  2529. func TestFilesInSubDirWhenNativeBridgeEnabled(t *testing.T) {
  2530. ctx := testApex(t, `
  2531. apex {
  2532. name: "myapex",
  2533. key: "myapex.key",
  2534. multilib: {
  2535. both: {
  2536. native_shared_libs: ["mylib"],
  2537. binaries: ["mybin"],
  2538. },
  2539. },
  2540. compile_multilib: "both",
  2541. native_bridge_supported: true,
  2542. updatable: false,
  2543. }
  2544. apex_key {
  2545. name: "myapex.key",
  2546. public_key: "testkey.avbpubkey",
  2547. private_key: "testkey.pem",
  2548. }
  2549. cc_library {
  2550. name: "mylib",
  2551. relative_install_path: "foo/bar",
  2552. system_shared_libs: [],
  2553. stl: "none",
  2554. apex_available: [ "myapex" ],
  2555. native_bridge_supported: true,
  2556. }
  2557. cc_binary {
  2558. name: "mybin",
  2559. relative_install_path: "foo/bar",
  2560. system_shared_libs: [],
  2561. stl: "none",
  2562. apex_available: [ "myapex" ],
  2563. native_bridge_supported: true,
  2564. compile_multilib: "both", // default is "first" for binary
  2565. multilib: {
  2566. lib64: {
  2567. suffix: "64",
  2568. },
  2569. },
  2570. }
  2571. `, withNativeBridgeEnabled)
  2572. ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
  2573. "bin/foo/bar/mybin",
  2574. "bin/foo/bar/mybin64",
  2575. "bin/arm/foo/bar/mybin",
  2576. "bin/arm64/foo/bar/mybin64",
  2577. "lib/foo/bar/mylib.so",
  2578. "lib/arm/foo/bar/mylib.so",
  2579. "lib64/foo/bar/mylib.so",
  2580. "lib64/arm64/foo/bar/mylib.so",
  2581. })
  2582. }
  2583. func TestVendorApex(t *testing.T) {
  2584. result := android.GroupFixturePreparers(
  2585. prepareForApexTest,
  2586. android.FixtureModifyConfig(android.SetKatiEnabledForTests),
  2587. ).RunTestWithBp(t, `
  2588. apex {
  2589. name: "myapex",
  2590. key: "myapex.key",
  2591. binaries: ["mybin"],
  2592. vendor: true,
  2593. updatable: false,
  2594. }
  2595. apex_key {
  2596. name: "myapex.key",
  2597. public_key: "testkey.avbpubkey",
  2598. private_key: "testkey.pem",
  2599. }
  2600. cc_binary {
  2601. name: "mybin",
  2602. vendor: true,
  2603. shared_libs: ["libfoo"],
  2604. }
  2605. cc_library {
  2606. name: "libfoo",
  2607. proprietary: true,
  2608. }
  2609. `)
  2610. ensureExactContents(t, result.TestContext, "myapex", "android_common_myapex_image", []string{
  2611. "bin/mybin",
  2612. "lib64/libfoo.so",
  2613. // TODO(b/159195575): Add an option to use VNDK libs from VNDK APEX
  2614. "lib64/libc++.so",
  2615. })
  2616. apexBundle := result.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
  2617. data := android.AndroidMkDataForTest(t, result.TestContext, apexBundle)
  2618. name := apexBundle.BaseModuleName()
  2619. prefix := "TARGET_"
  2620. var builder strings.Builder
  2621. data.Custom(&builder, name, prefix, "", data)
  2622. androidMk := android.StringRelativeToTop(result.Config, builder.String())
  2623. installPath := "out/target/product/test_device/vendor/apex"
  2624. ensureContains(t, androidMk, "LOCAL_MODULE_PATH := "+installPath)
  2625. apexManifestRule := result.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
  2626. requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
  2627. ensureListNotContains(t, requireNativeLibs, ":vndk")
  2628. }
  2629. func TestVendorApex_use_vndk_as_stable_TryingToIncludeVNDKLib(t *testing.T) {
  2630. testApexError(t, `Trying to include a VNDK library`, `
  2631. apex {
  2632. name: "myapex",
  2633. key: "myapex.key",
  2634. native_shared_libs: ["libc++"], // libc++ is a VNDK lib
  2635. vendor: true,
  2636. use_vndk_as_stable: true,
  2637. updatable: false,
  2638. }
  2639. apex_key {
  2640. name: "myapex.key",
  2641. public_key: "testkey.avbpubkey",
  2642. private_key: "testkey.pem",
  2643. }`)
  2644. }
  2645. func TestVendorApex_use_vndk_as_stable(t *testing.T) {
  2646. // myapex myapex2
  2647. // | |
  2648. // mybin ------. mybin2
  2649. // \ \ / |
  2650. // (stable) .---\--------` |
  2651. // \ / \ |
  2652. // \ / \ /
  2653. // libvndk libvendor
  2654. // (vndk)
  2655. ctx := testApex(t, `
  2656. apex {
  2657. name: "myapex",
  2658. key: "myapex.key",
  2659. binaries: ["mybin"],
  2660. vendor: true,
  2661. use_vndk_as_stable: true,
  2662. updatable: false,
  2663. }
  2664. apex_key {
  2665. name: "myapex.key",
  2666. public_key: "testkey.avbpubkey",
  2667. private_key: "testkey.pem",
  2668. }
  2669. cc_binary {
  2670. name: "mybin",
  2671. vendor: true,
  2672. shared_libs: ["libvndk", "libvendor"],
  2673. }
  2674. cc_library {
  2675. name: "libvndk",
  2676. vndk: {
  2677. enabled: true,
  2678. },
  2679. vendor_available: true,
  2680. product_available: true,
  2681. }
  2682. cc_library {
  2683. name: "libvendor",
  2684. vendor: true,
  2685. stl: "none",
  2686. }
  2687. apex {
  2688. name: "myapex2",
  2689. key: "myapex.key",
  2690. binaries: ["mybin2"],
  2691. vendor: true,
  2692. use_vndk_as_stable: false,
  2693. updatable: false,
  2694. }
  2695. cc_binary {
  2696. name: "mybin2",
  2697. vendor: true,
  2698. shared_libs: ["libvndk", "libvendor"],
  2699. }
  2700. `)
  2701. vendorVariant := "android_vendor.29_arm64_armv8-a"
  2702. for _, tc := range []struct {
  2703. name string
  2704. apexName string
  2705. moduleName string
  2706. moduleVariant string
  2707. libs []string
  2708. contents []string
  2709. requireVndkNamespace bool
  2710. }{
  2711. {
  2712. name: "use_vndk_as_stable",
  2713. apexName: "myapex",
  2714. moduleName: "mybin",
  2715. moduleVariant: vendorVariant + "_apex10000",
  2716. libs: []string{
  2717. // should link with vendor variants of VNDK libs(libvndk/libc++)
  2718. "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared/libvndk.so",
  2719. "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared/libc++.so",
  2720. // unstable Vendor libs as APEX variant
  2721. "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
  2722. },
  2723. contents: []string{
  2724. "bin/mybin",
  2725. "lib64/libvendor.so",
  2726. // VNDK libs (libvndk/libc++) are not included
  2727. },
  2728. requireVndkNamespace: true,
  2729. },
  2730. {
  2731. name: "!use_vndk_as_stable",
  2732. apexName: "myapex2",
  2733. moduleName: "mybin2",
  2734. moduleVariant: vendorVariant + "_myapex2",
  2735. libs: []string{
  2736. // should link with "unique" APEX(myapex2) variant of VNDK libs(libvndk/libc++)
  2737. "out/soong/.intermediates/libvndk/" + vendorVariant + "_shared_myapex2/libvndk.so",
  2738. "out/soong/.intermediates/" + cc.DefaultCcCommonTestModulesDir + "libc++/" + vendorVariant + "_shared_myapex2/libc++.so",
  2739. // unstable vendor libs have "merged" APEX variants
  2740. "out/soong/.intermediates/libvendor/" + vendorVariant + "_shared_apex10000/libvendor.so",
  2741. },
  2742. contents: []string{
  2743. "bin/mybin2",
  2744. "lib64/libvendor.so",
  2745. // VNDK libs are included as well
  2746. "lib64/libvndk.so",
  2747. "lib64/libc++.so",
  2748. },
  2749. requireVndkNamespace: false,
  2750. },
  2751. } {
  2752. t.Run(tc.name, func(t *testing.T) {
  2753. // Check linked libs
  2754. ldRule := ctx.ModuleForTests(tc.moduleName, tc.moduleVariant).Rule("ld")
  2755. libs := names(ldRule.Args["libFlags"])
  2756. for _, lib := range tc.libs {
  2757. ensureListContains(t, libs, lib)
  2758. }
  2759. // Check apex contents
  2760. ensureExactContents(t, ctx, tc.apexName, "android_common_"+tc.apexName+"_image", tc.contents)
  2761. // Check "requireNativeLibs"
  2762. apexManifestRule := ctx.ModuleForTests(tc.apexName, "android_common_"+tc.apexName+"_image").Rule("apexManifestRule")
  2763. requireNativeLibs := names(apexManifestRule.Args["requireNativeLibs"])
  2764. if tc.requireVndkNamespace {
  2765. ensureListContains(t, requireNativeLibs, ":vndk")
  2766. } else {
  2767. ensureListNotContains(t, requireNativeLibs, ":vndk")
  2768. }
  2769. })
  2770. }
  2771. }
  2772. func TestProductVariant(t *testing.T) {
  2773. ctx := testApex(t, `
  2774. apex {
  2775. name: "myapex",
  2776. key: "myapex.key",
  2777. updatable: false,
  2778. product_specific: true,
  2779. binaries: ["foo"],
  2780. }
  2781. apex_key {
  2782. name: "myapex.key",
  2783. public_key: "testkey.avbpubkey",
  2784. private_key: "testkey.pem",
  2785. }
  2786. cc_binary {
  2787. name: "foo",
  2788. product_available: true,
  2789. apex_available: ["myapex"],
  2790. srcs: ["foo.cpp"],
  2791. }
  2792. `, android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  2793. variables.ProductVndkVersion = proptools.StringPtr("current")
  2794. }),
  2795. )
  2796. cflags := strings.Fields(
  2797. ctx.ModuleForTests("foo", "android_product.29_arm64_armv8-a_myapex").Rule("cc").Args["cFlags"])
  2798. ensureListContains(t, cflags, "-D__ANDROID_VNDK__")
  2799. ensureListContains(t, cflags, "-D__ANDROID_APEX__")
  2800. ensureListContains(t, cflags, "-D__ANDROID_PRODUCT__")
  2801. ensureListNotContains(t, cflags, "-D__ANDROID_VENDOR__")
  2802. }
  2803. func TestApex_withPrebuiltFirmware(t *testing.T) {
  2804. testCases := []struct {
  2805. name string
  2806. additionalProp string
  2807. }{
  2808. {"system apex with prebuilt_firmware", ""},
  2809. {"vendor apex with prebuilt_firmware", "vendor: true,"},
  2810. }
  2811. for _, tc := range testCases {
  2812. t.Run(tc.name, func(t *testing.T) {
  2813. ctx := testApex(t, `
  2814. apex {
  2815. name: "myapex",
  2816. key: "myapex.key",
  2817. prebuilts: ["myfirmware"],
  2818. updatable: false,
  2819. `+tc.additionalProp+`
  2820. }
  2821. apex_key {
  2822. name: "myapex.key",
  2823. public_key: "testkey.avbpubkey",
  2824. private_key: "testkey.pem",
  2825. }
  2826. prebuilt_firmware {
  2827. name: "myfirmware",
  2828. src: "myfirmware.bin",
  2829. filename_from_src: true,
  2830. `+tc.additionalProp+`
  2831. }
  2832. `)
  2833. ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
  2834. "etc/firmware/myfirmware.bin",
  2835. })
  2836. })
  2837. }
  2838. }
  2839. func TestAndroidMk_VendorApexRequired(t *testing.T) {
  2840. ctx := testApex(t, `
  2841. apex {
  2842. name: "myapex",
  2843. key: "myapex.key",
  2844. vendor: true,
  2845. native_shared_libs: ["mylib"],
  2846. updatable: false,
  2847. }
  2848. apex_key {
  2849. name: "myapex.key",
  2850. public_key: "testkey.avbpubkey",
  2851. private_key: "testkey.pem",
  2852. }
  2853. cc_library {
  2854. name: "mylib",
  2855. vendor_available: true,
  2856. }
  2857. `)
  2858. apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
  2859. data := android.AndroidMkDataForTest(t, ctx, apexBundle)
  2860. name := apexBundle.BaseModuleName()
  2861. prefix := "TARGET_"
  2862. var builder strings.Builder
  2863. data.Custom(&builder, name, prefix, "", data)
  2864. androidMk := builder.String()
  2865. ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++.vendor.myapex:64 mylib.vendor.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex libc.vendor libm.vendor libdl.vendor\n")
  2866. }
  2867. func TestAndroidMkWritesCommonProperties(t *testing.T) {
  2868. ctx := testApex(t, `
  2869. apex {
  2870. name: "myapex",
  2871. key: "myapex.key",
  2872. vintf_fragments: ["fragment.xml"],
  2873. init_rc: ["init.rc"],
  2874. updatable: false,
  2875. }
  2876. apex_key {
  2877. name: "myapex.key",
  2878. public_key: "testkey.avbpubkey",
  2879. private_key: "testkey.pem",
  2880. }
  2881. cc_binary {
  2882. name: "mybin",
  2883. }
  2884. `)
  2885. apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
  2886. data := android.AndroidMkDataForTest(t, ctx, apexBundle)
  2887. name := apexBundle.BaseModuleName()
  2888. prefix := "TARGET_"
  2889. var builder strings.Builder
  2890. data.Custom(&builder, name, prefix, "", data)
  2891. androidMk := builder.String()
  2892. ensureContains(t, androidMk, "LOCAL_FULL_VINTF_FRAGMENTS := fragment.xml\n")
  2893. ensureContains(t, androidMk, "LOCAL_FULL_INIT_RC := init.rc\n")
  2894. }
  2895. func TestStaticLinking(t *testing.T) {
  2896. ctx := testApex(t, `
  2897. apex {
  2898. name: "myapex",
  2899. key: "myapex.key",
  2900. native_shared_libs: ["mylib"],
  2901. updatable: false,
  2902. }
  2903. apex_key {
  2904. name: "myapex.key",
  2905. public_key: "testkey.avbpubkey",
  2906. private_key: "testkey.pem",
  2907. }
  2908. cc_library {
  2909. name: "mylib",
  2910. srcs: ["mylib.cpp"],
  2911. system_shared_libs: [],
  2912. stl: "none",
  2913. stubs: {
  2914. versions: ["1", "2", "3"],
  2915. },
  2916. apex_available: ["myapex"],
  2917. }
  2918. cc_binary {
  2919. name: "not_in_apex",
  2920. srcs: ["mylib.cpp"],
  2921. static_libs: ["mylib"],
  2922. static_executable: true,
  2923. system_shared_libs: [],
  2924. stl: "none",
  2925. }
  2926. `)
  2927. ldFlags := ctx.ModuleForTests("not_in_apex", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
  2928. // Ensure that not_in_apex is linking with the static variant of mylib
  2929. ensureContains(t, ldFlags, "mylib/android_arm64_armv8-a_static/mylib.a")
  2930. }
  2931. func TestKeys(t *testing.T) {
  2932. ctx := testApex(t, `
  2933. apex {
  2934. name: "myapex_keytest",
  2935. key: "myapex.key",
  2936. certificate: ":myapex.certificate",
  2937. native_shared_libs: ["mylib"],
  2938. file_contexts: ":myapex-file_contexts",
  2939. updatable: false,
  2940. }
  2941. cc_library {
  2942. name: "mylib",
  2943. srcs: ["mylib.cpp"],
  2944. system_shared_libs: [],
  2945. stl: "none",
  2946. apex_available: [ "myapex_keytest" ],
  2947. }
  2948. apex_key {
  2949. name: "myapex.key",
  2950. public_key: "testkey.avbpubkey",
  2951. private_key: "testkey.pem",
  2952. }
  2953. android_app_certificate {
  2954. name: "myapex.certificate",
  2955. certificate: "testkey",
  2956. }
  2957. android_app_certificate {
  2958. name: "myapex.certificate.override",
  2959. certificate: "testkey.override",
  2960. }
  2961. `)
  2962. // check the APEX keys
  2963. keys := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
  2964. if keys.publicKeyFile.String() != "vendor/foo/devkeys/testkey.avbpubkey" {
  2965. t.Errorf("public key %q is not %q", keys.publicKeyFile.String(),
  2966. "vendor/foo/devkeys/testkey.avbpubkey")
  2967. }
  2968. if keys.privateKeyFile.String() != "vendor/foo/devkeys/testkey.pem" {
  2969. t.Errorf("private key %q is not %q", keys.privateKeyFile.String(),
  2970. "vendor/foo/devkeys/testkey.pem")
  2971. }
  2972. // check the APK certs. It should be overridden to myapex.certificate.override
  2973. certs := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk").Args["certificates"]
  2974. if certs != "testkey.override.x509.pem testkey.override.pk8" {
  2975. t.Errorf("cert and private key %q are not %q", certs,
  2976. "testkey.override.509.pem testkey.override.pk8")
  2977. }
  2978. }
  2979. func TestCertificate(t *testing.T) {
  2980. t.Run("if unspecified, it defaults to DefaultAppCertificate", func(t *testing.T) {
  2981. ctx := testApex(t, `
  2982. apex {
  2983. name: "myapex",
  2984. key: "myapex.key",
  2985. updatable: false,
  2986. }
  2987. apex_key {
  2988. name: "myapex.key",
  2989. public_key: "testkey.avbpubkey",
  2990. private_key: "testkey.pem",
  2991. }`)
  2992. rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
  2993. expected := "vendor/foo/devkeys/test.x509.pem vendor/foo/devkeys/test.pk8"
  2994. if actual := rule.Args["certificates"]; actual != expected {
  2995. t.Errorf("certificates should be %q, not %q", expected, actual)
  2996. }
  2997. })
  2998. t.Run("override when unspecified", func(t *testing.T) {
  2999. ctx := testApex(t, `
  3000. apex {
  3001. name: "myapex_keytest",
  3002. key: "myapex.key",
  3003. file_contexts: ":myapex-file_contexts",
  3004. updatable: false,
  3005. }
  3006. apex_key {
  3007. name: "myapex.key",
  3008. public_key: "testkey.avbpubkey",
  3009. private_key: "testkey.pem",
  3010. }
  3011. android_app_certificate {
  3012. name: "myapex.certificate.override",
  3013. certificate: "testkey.override",
  3014. }`)
  3015. rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
  3016. expected := "testkey.override.x509.pem testkey.override.pk8"
  3017. if actual := rule.Args["certificates"]; actual != expected {
  3018. t.Errorf("certificates should be %q, not %q", expected, actual)
  3019. }
  3020. })
  3021. t.Run("if specified as :module, it respects the prop", func(t *testing.T) {
  3022. ctx := testApex(t, `
  3023. apex {
  3024. name: "myapex",
  3025. key: "myapex.key",
  3026. certificate: ":myapex.certificate",
  3027. updatable: false,
  3028. }
  3029. apex_key {
  3030. name: "myapex.key",
  3031. public_key: "testkey.avbpubkey",
  3032. private_key: "testkey.pem",
  3033. }
  3034. android_app_certificate {
  3035. name: "myapex.certificate",
  3036. certificate: "testkey",
  3037. }`)
  3038. rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
  3039. expected := "testkey.x509.pem testkey.pk8"
  3040. if actual := rule.Args["certificates"]; actual != expected {
  3041. t.Errorf("certificates should be %q, not %q", expected, actual)
  3042. }
  3043. })
  3044. t.Run("override when specifiec as <:module>", func(t *testing.T) {
  3045. ctx := testApex(t, `
  3046. apex {
  3047. name: "myapex_keytest",
  3048. key: "myapex.key",
  3049. file_contexts: ":myapex-file_contexts",
  3050. certificate: ":myapex.certificate",
  3051. updatable: false,
  3052. }
  3053. apex_key {
  3054. name: "myapex.key",
  3055. public_key: "testkey.avbpubkey",
  3056. private_key: "testkey.pem",
  3057. }
  3058. android_app_certificate {
  3059. name: "myapex.certificate.override",
  3060. certificate: "testkey.override",
  3061. }`)
  3062. rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
  3063. expected := "testkey.override.x509.pem testkey.override.pk8"
  3064. if actual := rule.Args["certificates"]; actual != expected {
  3065. t.Errorf("certificates should be %q, not %q", expected, actual)
  3066. }
  3067. })
  3068. t.Run("if specified as name, finds it from DefaultDevKeyDir", func(t *testing.T) {
  3069. ctx := testApex(t, `
  3070. apex {
  3071. name: "myapex",
  3072. key: "myapex.key",
  3073. certificate: "testkey",
  3074. updatable: false,
  3075. }
  3076. apex_key {
  3077. name: "myapex.key",
  3078. public_key: "testkey.avbpubkey",
  3079. private_key: "testkey.pem",
  3080. }`)
  3081. rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("signapk")
  3082. expected := "vendor/foo/devkeys/testkey.x509.pem vendor/foo/devkeys/testkey.pk8"
  3083. if actual := rule.Args["certificates"]; actual != expected {
  3084. t.Errorf("certificates should be %q, not %q", expected, actual)
  3085. }
  3086. })
  3087. t.Run("override when specified as <name>", func(t *testing.T) {
  3088. ctx := testApex(t, `
  3089. apex {
  3090. name: "myapex_keytest",
  3091. key: "myapex.key",
  3092. file_contexts: ":myapex-file_contexts",
  3093. certificate: "testkey",
  3094. updatable: false,
  3095. }
  3096. apex_key {
  3097. name: "myapex.key",
  3098. public_key: "testkey.avbpubkey",
  3099. private_key: "testkey.pem",
  3100. }
  3101. android_app_certificate {
  3102. name: "myapex.certificate.override",
  3103. certificate: "testkey.override",
  3104. }`)
  3105. rule := ctx.ModuleForTests("myapex_keytest", "android_common_myapex_keytest_image").Rule("signapk")
  3106. expected := "testkey.override.x509.pem testkey.override.pk8"
  3107. if actual := rule.Args["certificates"]; actual != expected {
  3108. t.Errorf("certificates should be %q, not %q", expected, actual)
  3109. }
  3110. })
  3111. }
  3112. func TestMacro(t *testing.T) {
  3113. ctx := testApex(t, `
  3114. apex {
  3115. name: "myapex",
  3116. key: "myapex.key",
  3117. native_shared_libs: ["mylib", "mylib2"],
  3118. updatable: false,
  3119. }
  3120. apex {
  3121. name: "otherapex",
  3122. key: "myapex.key",
  3123. native_shared_libs: ["mylib", "mylib2"],
  3124. min_sdk_version: "29",
  3125. }
  3126. apex_key {
  3127. name: "myapex.key",
  3128. public_key: "testkey.avbpubkey",
  3129. private_key: "testkey.pem",
  3130. }
  3131. cc_library {
  3132. name: "mylib",
  3133. srcs: ["mylib.cpp"],
  3134. system_shared_libs: [],
  3135. stl: "none",
  3136. apex_available: [
  3137. "myapex",
  3138. "otherapex",
  3139. ],
  3140. recovery_available: true,
  3141. min_sdk_version: "29",
  3142. }
  3143. cc_library {
  3144. name: "mylib2",
  3145. srcs: ["mylib.cpp"],
  3146. system_shared_libs: [],
  3147. stl: "none",
  3148. apex_available: [
  3149. "myapex",
  3150. "otherapex",
  3151. ],
  3152. static_libs: ["mylib3"],
  3153. recovery_available: true,
  3154. min_sdk_version: "29",
  3155. }
  3156. cc_library {
  3157. name: "mylib3",
  3158. srcs: ["mylib.cpp"],
  3159. system_shared_libs: [],
  3160. stl: "none",
  3161. apex_available: [
  3162. "myapex",
  3163. "otherapex",
  3164. ],
  3165. recovery_available: true,
  3166. min_sdk_version: "29",
  3167. }
  3168. `)
  3169. // non-APEX variant does not have __ANDROID_APEX__ defined
  3170. mylibCFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
  3171. ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
  3172. // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
  3173. mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex10000").Rule("cc").Args["cFlags"]
  3174. ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
  3175. // APEX variant has __ANDROID_APEX__ and __ANDROID_APEX__ defined
  3176. mylibCFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_static_apex29").Rule("cc").Args["cFlags"]
  3177. ensureContains(t, mylibCFlags, "-D__ANDROID_APEX__")
  3178. // When a cc_library sets use_apex_name_macro: true each apex gets a unique variant and
  3179. // each variant defines additional macros to distinguish which apex variant it is built for
  3180. // non-APEX variant does not have __ANDROID_APEX__ defined
  3181. mylibCFlags = ctx.ModuleForTests("mylib3", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
  3182. ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
  3183. // recovery variant does not set __ANDROID_APEX__
  3184. mylibCFlags = ctx.ModuleForTests("mylib3", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
  3185. ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
  3186. // non-APEX variant does not have __ANDROID_APEX__ defined
  3187. mylibCFlags = ctx.ModuleForTests("mylib2", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
  3188. ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
  3189. // recovery variant does not set __ANDROID_APEX__
  3190. mylibCFlags = ctx.ModuleForTests("mylib2", "android_recovery_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
  3191. ensureNotContains(t, mylibCFlags, "-D__ANDROID_APEX__")
  3192. }
  3193. func TestHeaderLibsDependency(t *testing.T) {
  3194. ctx := testApex(t, `
  3195. apex {
  3196. name: "myapex",
  3197. key: "myapex.key",
  3198. native_shared_libs: ["mylib"],
  3199. updatable: false,
  3200. }
  3201. apex_key {
  3202. name: "myapex.key",
  3203. public_key: "testkey.avbpubkey",
  3204. private_key: "testkey.pem",
  3205. }
  3206. cc_library_headers {
  3207. name: "mylib_headers",
  3208. export_include_dirs: ["my_include"],
  3209. system_shared_libs: [],
  3210. stl: "none",
  3211. apex_available: [ "myapex" ],
  3212. }
  3213. cc_library {
  3214. name: "mylib",
  3215. srcs: ["mylib.cpp"],
  3216. system_shared_libs: [],
  3217. stl: "none",
  3218. header_libs: ["mylib_headers"],
  3219. export_header_lib_headers: ["mylib_headers"],
  3220. stubs: {
  3221. versions: ["1", "2", "3"],
  3222. },
  3223. apex_available: [ "myapex" ],
  3224. }
  3225. cc_library {
  3226. name: "otherlib",
  3227. srcs: ["mylib.cpp"],
  3228. system_shared_libs: [],
  3229. stl: "none",
  3230. shared_libs: ["mylib"],
  3231. }
  3232. `)
  3233. cFlags := ctx.ModuleForTests("otherlib", "android_arm64_armv8-a_static").Rule("cc").Args["cFlags"]
  3234. // Ensure that the include path of the header lib is exported to 'otherlib'
  3235. ensureContains(t, cFlags, "-Imy_include")
  3236. }
  3237. type fileInApex struct {
  3238. path string // path in apex
  3239. src string // src path
  3240. isLink bool
  3241. }
  3242. func (f fileInApex) String() string {
  3243. return f.src + ":" + f.path
  3244. }
  3245. func (f fileInApex) match(expectation string) bool {
  3246. parts := strings.Split(expectation, ":")
  3247. if len(parts) == 1 {
  3248. match, _ := path.Match(parts[0], f.path)
  3249. return match
  3250. }
  3251. if len(parts) == 2 {
  3252. matchSrc, _ := path.Match(parts[0], f.src)
  3253. matchDst, _ := path.Match(parts[1], f.path)
  3254. return matchSrc && matchDst
  3255. }
  3256. panic("invalid expected file specification: " + expectation)
  3257. }
  3258. func getFiles(t *testing.T, ctx *android.TestContext, moduleName, variant string) []fileInApex {
  3259. t.Helper()
  3260. module := ctx.ModuleForTests(moduleName, variant)
  3261. apexRule := module.MaybeRule("apexRule")
  3262. apexDir := "/image.apex/"
  3263. if apexRule.Rule == nil {
  3264. apexRule = module.Rule("zipApexRule")
  3265. apexDir = "/image.zipapex/"
  3266. }
  3267. copyCmds := apexRule.Args["copy_commands"]
  3268. var ret []fileInApex
  3269. for _, cmd := range strings.Split(copyCmds, "&&") {
  3270. cmd = strings.TrimSpace(cmd)
  3271. if cmd == "" {
  3272. continue
  3273. }
  3274. terms := strings.Split(cmd, " ")
  3275. var dst, src string
  3276. var isLink bool
  3277. switch terms[0] {
  3278. case "mkdir":
  3279. case "cp":
  3280. if len(terms) != 3 && len(terms) != 4 {
  3281. t.Fatal("copyCmds contains invalid cp command", cmd)
  3282. }
  3283. dst = terms[len(terms)-1]
  3284. src = terms[len(terms)-2]
  3285. isLink = false
  3286. case "ln":
  3287. if len(terms) != 3 && len(terms) != 4 {
  3288. // ln LINK TARGET or ln -s LINK TARGET
  3289. t.Fatal("copyCmds contains invalid ln command", cmd)
  3290. }
  3291. dst = terms[len(terms)-1]
  3292. src = terms[len(terms)-2]
  3293. isLink = true
  3294. default:
  3295. t.Fatalf("copyCmds should contain mkdir/cp commands only: %q", cmd)
  3296. }
  3297. if dst != "" {
  3298. index := strings.Index(dst, apexDir)
  3299. if index == -1 {
  3300. t.Fatal("copyCmds should copy a file to "+apexDir, cmd)
  3301. }
  3302. dstFile := dst[index+len(apexDir):]
  3303. ret = append(ret, fileInApex{path: dstFile, src: src, isLink: isLink})
  3304. }
  3305. }
  3306. return ret
  3307. }
  3308. func assertFileListEquals(t *testing.T, expectedFiles []string, actualFiles []fileInApex) {
  3309. t.Helper()
  3310. var failed bool
  3311. var surplus []string
  3312. filesMatched := make(map[string]bool)
  3313. for _, file := range actualFiles {
  3314. matchFound := false
  3315. for _, expected := range expectedFiles {
  3316. if file.match(expected) {
  3317. matchFound = true
  3318. filesMatched[expected] = true
  3319. break
  3320. }
  3321. }
  3322. if !matchFound {
  3323. surplus = append(surplus, file.String())
  3324. }
  3325. }
  3326. if len(surplus) > 0 {
  3327. sort.Strings(surplus)
  3328. t.Log("surplus files", surplus)
  3329. failed = true
  3330. }
  3331. if len(expectedFiles) > len(filesMatched) {
  3332. var missing []string
  3333. for _, expected := range expectedFiles {
  3334. if !filesMatched[expected] {
  3335. missing = append(missing, expected)
  3336. }
  3337. }
  3338. sort.Strings(missing)
  3339. t.Log("missing files", missing)
  3340. failed = true
  3341. }
  3342. if failed {
  3343. t.Fail()
  3344. }
  3345. }
  3346. func ensureExactContents(t *testing.T, ctx *android.TestContext, moduleName, variant string, files []string) {
  3347. assertFileListEquals(t, files, getFiles(t, ctx, moduleName, variant))
  3348. }
  3349. func ensureExactDeapexedContents(t *testing.T, ctx *android.TestContext, moduleName string, variant string, files []string) {
  3350. deapexer := ctx.ModuleForTests(moduleName+".deapexer", variant).Rule("deapexer")
  3351. outputs := make([]string, 0, len(deapexer.ImplicitOutputs)+1)
  3352. if deapexer.Output != nil {
  3353. outputs = append(outputs, deapexer.Output.String())
  3354. }
  3355. for _, output := range deapexer.ImplicitOutputs {
  3356. outputs = append(outputs, output.String())
  3357. }
  3358. actualFiles := make([]fileInApex, 0, len(outputs))
  3359. for _, output := range outputs {
  3360. dir := "/deapexer/"
  3361. pos := strings.LastIndex(output, dir)
  3362. if pos == -1 {
  3363. t.Fatal("Unknown deapexer output ", output)
  3364. }
  3365. path := output[pos+len(dir):]
  3366. actualFiles = append(actualFiles, fileInApex{path: path, src: "", isLink: false})
  3367. }
  3368. assertFileListEquals(t, files, actualFiles)
  3369. }
  3370. func TestVndkApexCurrent(t *testing.T) {
  3371. commonFiles := []string{
  3372. "lib/libc++.so",
  3373. "lib64/libc++.so",
  3374. "etc/llndk.libraries.29.txt",
  3375. "etc/vndkcore.libraries.29.txt",
  3376. "etc/vndksp.libraries.29.txt",
  3377. "etc/vndkprivate.libraries.29.txt",
  3378. "etc/vndkproduct.libraries.29.txt",
  3379. }
  3380. testCases := []struct {
  3381. vndkVersion string
  3382. expectedFiles []string
  3383. }{
  3384. {
  3385. vndkVersion: "current",
  3386. expectedFiles: append(commonFiles,
  3387. "lib/libvndk.so",
  3388. "lib/libvndksp.so",
  3389. "lib64/libvndk.so",
  3390. "lib64/libvndksp.so"),
  3391. },
  3392. {
  3393. vndkVersion: "",
  3394. expectedFiles: append(commonFiles,
  3395. // Legacy VNDK APEX contains only VNDK-SP files (of core variant)
  3396. "lib/libvndksp.so",
  3397. "lib64/libvndksp.so"),
  3398. },
  3399. }
  3400. for _, tc := range testCases {
  3401. t.Run("VNDK.current with DeviceVndkVersion="+tc.vndkVersion, func(t *testing.T) {
  3402. ctx := testApex(t, `
  3403. apex_vndk {
  3404. name: "com.android.vndk.current",
  3405. key: "com.android.vndk.current.key",
  3406. updatable: false,
  3407. }
  3408. apex_key {
  3409. name: "com.android.vndk.current.key",
  3410. public_key: "testkey.avbpubkey",
  3411. private_key: "testkey.pem",
  3412. }
  3413. cc_library {
  3414. name: "libvndk",
  3415. srcs: ["mylib.cpp"],
  3416. vendor_available: true,
  3417. product_available: true,
  3418. vndk: {
  3419. enabled: true,
  3420. },
  3421. system_shared_libs: [],
  3422. stl: "none",
  3423. apex_available: [ "com.android.vndk.current" ],
  3424. }
  3425. cc_library {
  3426. name: "libvndksp",
  3427. srcs: ["mylib.cpp"],
  3428. vendor_available: true,
  3429. product_available: true,
  3430. vndk: {
  3431. enabled: true,
  3432. support_system_process: true,
  3433. },
  3434. system_shared_libs: [],
  3435. stl: "none",
  3436. apex_available: [ "com.android.vndk.current" ],
  3437. }
  3438. // VNDK-Ext should not cause any problems
  3439. cc_library {
  3440. name: "libvndk.ext",
  3441. srcs: ["mylib2.cpp"],
  3442. vendor: true,
  3443. vndk: {
  3444. enabled: true,
  3445. extends: "libvndk",
  3446. },
  3447. system_shared_libs: [],
  3448. stl: "none",
  3449. }
  3450. cc_library {
  3451. name: "libvndksp.ext",
  3452. srcs: ["mylib2.cpp"],
  3453. vendor: true,
  3454. vndk: {
  3455. enabled: true,
  3456. support_system_process: true,
  3457. extends: "libvndksp",
  3458. },
  3459. system_shared_libs: [],
  3460. stl: "none",
  3461. }
  3462. `+vndkLibrariesTxtFiles("current"), android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  3463. variables.DeviceVndkVersion = proptools.StringPtr(tc.vndkVersion)
  3464. }))
  3465. ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", tc.expectedFiles)
  3466. })
  3467. }
  3468. }
  3469. func TestVndkApexWithPrebuilt(t *testing.T) {
  3470. ctx := testApex(t, `
  3471. apex_vndk {
  3472. name: "com.android.vndk.current",
  3473. key: "com.android.vndk.current.key",
  3474. updatable: false,
  3475. }
  3476. apex_key {
  3477. name: "com.android.vndk.current.key",
  3478. public_key: "testkey.avbpubkey",
  3479. private_key: "testkey.pem",
  3480. }
  3481. cc_prebuilt_library_shared {
  3482. name: "libvndk",
  3483. srcs: ["libvndk.so"],
  3484. vendor_available: true,
  3485. product_available: true,
  3486. vndk: {
  3487. enabled: true,
  3488. },
  3489. system_shared_libs: [],
  3490. stl: "none",
  3491. apex_available: [ "com.android.vndk.current" ],
  3492. }
  3493. cc_prebuilt_library_shared {
  3494. name: "libvndk.arm",
  3495. srcs: ["libvndk.arm.so"],
  3496. vendor_available: true,
  3497. product_available: true,
  3498. vndk: {
  3499. enabled: true,
  3500. },
  3501. enabled: false,
  3502. arch: {
  3503. arm: {
  3504. enabled: true,
  3505. },
  3506. },
  3507. system_shared_libs: [],
  3508. stl: "none",
  3509. apex_available: [ "com.android.vndk.current" ],
  3510. }
  3511. `+vndkLibrariesTxtFiles("current"),
  3512. withFiles(map[string][]byte{
  3513. "libvndk.so": nil,
  3514. "libvndk.arm.so": nil,
  3515. }))
  3516. ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
  3517. "lib/libvndk.so",
  3518. "lib/libvndk.arm.so",
  3519. "lib64/libvndk.so",
  3520. "lib/libc++.so",
  3521. "lib64/libc++.so",
  3522. "etc/*",
  3523. })
  3524. }
  3525. func vndkLibrariesTxtFiles(vers ...string) (result string) {
  3526. for _, v := range vers {
  3527. if v == "current" {
  3528. for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
  3529. result += `
  3530. ` + txt + `_libraries_txt {
  3531. name: "` + txt + `.libraries.txt",
  3532. }
  3533. `
  3534. }
  3535. } else {
  3536. for _, txt := range []string{"llndk", "vndkcore", "vndksp", "vndkprivate", "vndkproduct"} {
  3537. result += `
  3538. prebuilt_etc {
  3539. name: "` + txt + `.libraries.` + v + `.txt",
  3540. src: "dummy.txt",
  3541. }
  3542. `
  3543. }
  3544. }
  3545. }
  3546. return
  3547. }
  3548. func TestVndkApexVersion(t *testing.T) {
  3549. ctx := testApex(t, `
  3550. apex_vndk {
  3551. name: "com.android.vndk.v27",
  3552. key: "myapex.key",
  3553. file_contexts: ":myapex-file_contexts",
  3554. vndk_version: "27",
  3555. updatable: false,
  3556. }
  3557. apex_key {
  3558. name: "myapex.key",
  3559. public_key: "testkey.avbpubkey",
  3560. private_key: "testkey.pem",
  3561. }
  3562. vndk_prebuilt_shared {
  3563. name: "libvndk27",
  3564. version: "27",
  3565. vendor_available: true,
  3566. product_available: true,
  3567. vndk: {
  3568. enabled: true,
  3569. },
  3570. target_arch: "arm64",
  3571. arch: {
  3572. arm: {
  3573. srcs: ["libvndk27_arm.so"],
  3574. },
  3575. arm64: {
  3576. srcs: ["libvndk27_arm64.so"],
  3577. },
  3578. },
  3579. apex_available: [ "com.android.vndk.v27" ],
  3580. }
  3581. vndk_prebuilt_shared {
  3582. name: "libvndk27",
  3583. version: "27",
  3584. vendor_available: true,
  3585. product_available: true,
  3586. vndk: {
  3587. enabled: true,
  3588. },
  3589. target_arch: "x86_64",
  3590. arch: {
  3591. x86: {
  3592. srcs: ["libvndk27_x86.so"],
  3593. },
  3594. x86_64: {
  3595. srcs: ["libvndk27_x86_64.so"],
  3596. },
  3597. },
  3598. }
  3599. `+vndkLibrariesTxtFiles("27"),
  3600. withFiles(map[string][]byte{
  3601. "libvndk27_arm.so": nil,
  3602. "libvndk27_arm64.so": nil,
  3603. "libvndk27_x86.so": nil,
  3604. "libvndk27_x86_64.so": nil,
  3605. }))
  3606. ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
  3607. "lib/libvndk27_arm.so",
  3608. "lib64/libvndk27_arm64.so",
  3609. "etc/*",
  3610. })
  3611. }
  3612. func TestVndkApexNameRule(t *testing.T) {
  3613. ctx := testApex(t, `
  3614. apex_vndk {
  3615. name: "com.android.vndk.current",
  3616. key: "myapex.key",
  3617. file_contexts: ":myapex-file_contexts",
  3618. updatable: false,
  3619. }
  3620. apex_vndk {
  3621. name: "com.android.vndk.v28",
  3622. key: "myapex.key",
  3623. file_contexts: ":myapex-file_contexts",
  3624. vndk_version: "28",
  3625. updatable: false,
  3626. }
  3627. apex_key {
  3628. name: "myapex.key",
  3629. public_key: "testkey.avbpubkey",
  3630. private_key: "testkey.pem",
  3631. }`+vndkLibrariesTxtFiles("28", "current"))
  3632. assertApexName := func(expected, moduleName string) {
  3633. module := ctx.ModuleForTests(moduleName, "android_common_image")
  3634. apexManifestRule := module.Rule("apexManifestRule")
  3635. ensureContains(t, apexManifestRule.Args["opt"], "-v name "+expected)
  3636. }
  3637. assertApexName("com.android.vndk.v29", "com.android.vndk.current")
  3638. assertApexName("com.android.vndk.v28", "com.android.vndk.v28")
  3639. }
  3640. func TestVndkApexSkipsNativeBridgeSupportedModules(t *testing.T) {
  3641. ctx := testApex(t, `
  3642. apex_vndk {
  3643. name: "com.android.vndk.current",
  3644. key: "com.android.vndk.current.key",
  3645. file_contexts: ":myapex-file_contexts",
  3646. updatable: false,
  3647. }
  3648. apex_key {
  3649. name: "com.android.vndk.current.key",
  3650. public_key: "testkey.avbpubkey",
  3651. private_key: "testkey.pem",
  3652. }
  3653. cc_library {
  3654. name: "libvndk",
  3655. srcs: ["mylib.cpp"],
  3656. vendor_available: true,
  3657. product_available: true,
  3658. native_bridge_supported: true,
  3659. host_supported: true,
  3660. vndk: {
  3661. enabled: true,
  3662. },
  3663. system_shared_libs: [],
  3664. stl: "none",
  3665. apex_available: [ "com.android.vndk.current" ],
  3666. }
  3667. `+vndkLibrariesTxtFiles("current"),
  3668. withNativeBridgeEnabled)
  3669. ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
  3670. "lib/libvndk.so",
  3671. "lib64/libvndk.so",
  3672. "lib/libc++.so",
  3673. "lib64/libc++.so",
  3674. "etc/*",
  3675. })
  3676. }
  3677. func TestVndkApexDoesntSupportNativeBridgeSupported(t *testing.T) {
  3678. testApexError(t, `module "com.android.vndk.current" .*: native_bridge_supported: .* doesn't support native bridge binary`, `
  3679. apex_vndk {
  3680. name: "com.android.vndk.current",
  3681. key: "com.android.vndk.current.key",
  3682. file_contexts: ":myapex-file_contexts",
  3683. native_bridge_supported: true,
  3684. }
  3685. apex_key {
  3686. name: "com.android.vndk.current.key",
  3687. public_key: "testkey.avbpubkey",
  3688. private_key: "testkey.pem",
  3689. }
  3690. cc_library {
  3691. name: "libvndk",
  3692. srcs: ["mylib.cpp"],
  3693. vendor_available: true,
  3694. product_available: true,
  3695. native_bridge_supported: true,
  3696. host_supported: true,
  3697. vndk: {
  3698. enabled: true,
  3699. },
  3700. system_shared_libs: [],
  3701. stl: "none",
  3702. }
  3703. `)
  3704. }
  3705. func TestVndkApexWithBinder32(t *testing.T) {
  3706. ctx := testApex(t, `
  3707. apex_vndk {
  3708. name: "com.android.vndk.v27",
  3709. key: "myapex.key",
  3710. file_contexts: ":myapex-file_contexts",
  3711. vndk_version: "27",
  3712. updatable: false,
  3713. }
  3714. apex_key {
  3715. name: "myapex.key",
  3716. public_key: "testkey.avbpubkey",
  3717. private_key: "testkey.pem",
  3718. }
  3719. vndk_prebuilt_shared {
  3720. name: "libvndk27",
  3721. version: "27",
  3722. target_arch: "arm",
  3723. vendor_available: true,
  3724. product_available: true,
  3725. vndk: {
  3726. enabled: true,
  3727. },
  3728. arch: {
  3729. arm: {
  3730. srcs: ["libvndk27.so"],
  3731. }
  3732. },
  3733. }
  3734. vndk_prebuilt_shared {
  3735. name: "libvndk27",
  3736. version: "27",
  3737. target_arch: "arm",
  3738. binder32bit: true,
  3739. vendor_available: true,
  3740. product_available: true,
  3741. vndk: {
  3742. enabled: true,
  3743. },
  3744. arch: {
  3745. arm: {
  3746. srcs: ["libvndk27binder32.so"],
  3747. }
  3748. },
  3749. apex_available: [ "com.android.vndk.v27" ],
  3750. }
  3751. `+vndkLibrariesTxtFiles("27"),
  3752. withFiles(map[string][]byte{
  3753. "libvndk27.so": nil,
  3754. "libvndk27binder32.so": nil,
  3755. }),
  3756. withBinder32bit,
  3757. withTargets(map[android.OsType][]android.Target{
  3758. android.Android: {
  3759. {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}},
  3760. NativeBridge: android.NativeBridgeDisabled, NativeBridgeHostArchName: "", NativeBridgeRelativePath: ""},
  3761. },
  3762. }),
  3763. )
  3764. ensureExactContents(t, ctx, "com.android.vndk.v27", "android_common_image", []string{
  3765. "lib/libvndk27binder32.so",
  3766. "etc/*",
  3767. })
  3768. }
  3769. func TestVndkApexShouldNotProvideNativeLibs(t *testing.T) {
  3770. ctx := testApex(t, `
  3771. apex_vndk {
  3772. name: "com.android.vndk.current",
  3773. key: "com.android.vndk.current.key",
  3774. file_contexts: ":myapex-file_contexts",
  3775. updatable: false,
  3776. }
  3777. apex_key {
  3778. name: "com.android.vndk.current.key",
  3779. public_key: "testkey.avbpubkey",
  3780. private_key: "testkey.pem",
  3781. }
  3782. cc_library {
  3783. name: "libz",
  3784. vendor_available: true,
  3785. product_available: true,
  3786. vndk: {
  3787. enabled: true,
  3788. },
  3789. stubs: {
  3790. symbol_file: "libz.map.txt",
  3791. versions: ["30"],
  3792. }
  3793. }
  3794. `+vndkLibrariesTxtFiles("current"), withFiles(map[string][]byte{
  3795. "libz.map.txt": nil,
  3796. }))
  3797. apexManifestRule := ctx.ModuleForTests("com.android.vndk.current", "android_common_image").Rule("apexManifestRule")
  3798. provideNativeLibs := names(apexManifestRule.Args["provideNativeLibs"])
  3799. ensureListEmpty(t, provideNativeLibs)
  3800. ensureExactContents(t, ctx, "com.android.vndk.current", "android_common_image", []string{
  3801. "out/soong/.intermediates/libz/android_vendor.29_arm64_armv8-a_shared/libz.so:lib64/libz.so",
  3802. "out/soong/.intermediates/libz/android_vendor.29_arm_armv7-a-neon_shared/libz.so:lib/libz.so",
  3803. "*/*",
  3804. })
  3805. }
  3806. func TestVendorApexWithVndkPrebuilts(t *testing.T) {
  3807. ctx := testApex(t, "",
  3808. android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  3809. variables.DeviceVndkVersion = proptools.StringPtr("27")
  3810. }),
  3811. android.FixtureRegisterWithContext(func(ctx android.RegistrationContext) {
  3812. cc.RegisterVendorSnapshotModules(ctx)
  3813. }),
  3814. withFiles(map[string][]byte{
  3815. "vendor/foo/Android.bp": []byte(`
  3816. apex {
  3817. name: "myapex",
  3818. binaries: ["foo"],
  3819. key: "myapex.key",
  3820. min_sdk_version: "27",
  3821. vendor: true,
  3822. }
  3823. cc_binary {
  3824. name: "foo",
  3825. vendor: true,
  3826. srcs: ["abc.cpp"],
  3827. shared_libs: [
  3828. "libllndk",
  3829. "libvndk",
  3830. ],
  3831. nocrt: true,
  3832. system_shared_libs: [],
  3833. min_sdk_version: "27",
  3834. }
  3835. apex_key {
  3836. name: "myapex.key",
  3837. public_key: "testkey.avbpubkey",
  3838. private_key: "testkey.pem",
  3839. }
  3840. `),
  3841. // Simulate VNDK prebuilts with vendor_snapshot
  3842. "prebuilts/vndk/Android.bp": []byte(`
  3843. vndk_prebuilt_shared {
  3844. name: "libllndk",
  3845. version: "27",
  3846. vendor_available: true,
  3847. product_available: true,
  3848. target_arch: "arm64",
  3849. arch: {
  3850. arm64: {
  3851. srcs: ["libllndk.so"],
  3852. },
  3853. },
  3854. }
  3855. vndk_prebuilt_shared {
  3856. name: "libvndk",
  3857. version: "27",
  3858. vendor_available: true,
  3859. product_available: true,
  3860. target_arch: "arm64",
  3861. arch: {
  3862. arm64: {
  3863. srcs: ["libvndk.so"],
  3864. },
  3865. },
  3866. vndk: {
  3867. enabled: true,
  3868. },
  3869. min_sdk_version: "27",
  3870. }
  3871. vndk_prebuilt_shared {
  3872. name: "libc++",
  3873. version: "27",
  3874. target_arch: "arm64",
  3875. vendor_available: true,
  3876. product_available: true,
  3877. vndk: {
  3878. enabled: true,
  3879. support_system_process: true,
  3880. },
  3881. arch: {
  3882. arm64: {
  3883. srcs: ["libc++.so"],
  3884. },
  3885. },
  3886. min_sdk_version: "apex_inherit",
  3887. }
  3888. vendor_snapshot {
  3889. name: "vendor_snapshot",
  3890. version: "27",
  3891. arch: {
  3892. arm64: {
  3893. vndk_libs: [
  3894. "libc++",
  3895. "libllndk",
  3896. "libvndk",
  3897. ],
  3898. static_libs: [
  3899. "libc++demangle",
  3900. "libclang_rt.builtins",
  3901. "libunwind",
  3902. ],
  3903. },
  3904. }
  3905. }
  3906. vendor_snapshot_static {
  3907. name: "libclang_rt.builtins",
  3908. version: "27",
  3909. target_arch: "arm64",
  3910. vendor: true,
  3911. arch: {
  3912. arm64: {
  3913. src: "libclang_rt.builtins-aarch64-android.a",
  3914. },
  3915. },
  3916. }
  3917. vendor_snapshot_static {
  3918. name: "libc++demangle",
  3919. version: "27",
  3920. target_arch: "arm64",
  3921. compile_multilib: "64",
  3922. vendor: true,
  3923. arch: {
  3924. arm64: {
  3925. src: "libc++demangle.a",
  3926. },
  3927. },
  3928. min_sdk_version: "apex_inherit",
  3929. }
  3930. vendor_snapshot_static {
  3931. name: "libunwind",
  3932. version: "27",
  3933. target_arch: "arm64",
  3934. compile_multilib: "64",
  3935. vendor: true,
  3936. arch: {
  3937. arm64: {
  3938. src: "libunwind.a",
  3939. },
  3940. },
  3941. min_sdk_version: "apex_inherit",
  3942. }
  3943. `),
  3944. }))
  3945. // Should embed the prebuilt VNDK libraries in the apex
  3946. ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
  3947. "bin/foo",
  3948. "prebuilts/vndk/libc++.so:lib64/libc++.so",
  3949. "prebuilts/vndk/libvndk.so:lib64/libvndk.so",
  3950. })
  3951. // Should link foo with prebuilt libraries (shared/static)
  3952. ldRule := ctx.ModuleForTests("foo", "android_vendor.27_arm64_armv8-a_myapex").Rule("ld")
  3953. android.AssertStringDoesContain(t, "should link to prebuilt llndk", ldRule.Args["libFlags"], "prebuilts/vndk/libllndk.so")
  3954. android.AssertStringDoesContain(t, "should link to prebuilt vndk", ldRule.Args["libFlags"], "prebuilts/vndk/libvndk.so")
  3955. android.AssertStringDoesContain(t, "should link to prebuilt libc++demangle", ldRule.Args["libFlags"], "prebuilts/vndk/libc++demangle.a")
  3956. android.AssertStringDoesContain(t, "should link to prebuilt libunwind", ldRule.Args["libFlags"], "prebuilts/vndk/libunwind.a")
  3957. // Should declare the LLNDK library as a "required" external dependency
  3958. manifestRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
  3959. requireNativeLibs := names(manifestRule.Args["requireNativeLibs"])
  3960. ensureListContains(t, requireNativeLibs, "libllndk.so")
  3961. }
  3962. func TestDependenciesInApexManifest(t *testing.T) {
  3963. ctx := testApex(t, `
  3964. apex {
  3965. name: "myapex_nodep",
  3966. key: "myapex.key",
  3967. native_shared_libs: ["lib_nodep"],
  3968. compile_multilib: "both",
  3969. file_contexts: ":myapex-file_contexts",
  3970. updatable: false,
  3971. }
  3972. apex {
  3973. name: "myapex_dep",
  3974. key: "myapex.key",
  3975. native_shared_libs: ["lib_dep"],
  3976. compile_multilib: "both",
  3977. file_contexts: ":myapex-file_contexts",
  3978. updatable: false,
  3979. }
  3980. apex {
  3981. name: "myapex_provider",
  3982. key: "myapex.key",
  3983. native_shared_libs: ["libfoo"],
  3984. compile_multilib: "both",
  3985. file_contexts: ":myapex-file_contexts",
  3986. updatable: false,
  3987. }
  3988. apex {
  3989. name: "myapex_selfcontained",
  3990. key: "myapex.key",
  3991. native_shared_libs: ["lib_dep_on_bar", "libbar"],
  3992. compile_multilib: "both",
  3993. file_contexts: ":myapex-file_contexts",
  3994. updatable: false,
  3995. }
  3996. apex_key {
  3997. name: "myapex.key",
  3998. public_key: "testkey.avbpubkey",
  3999. private_key: "testkey.pem",
  4000. }
  4001. cc_library {
  4002. name: "lib_nodep",
  4003. srcs: ["mylib.cpp"],
  4004. system_shared_libs: [],
  4005. stl: "none",
  4006. apex_available: [ "myapex_nodep" ],
  4007. }
  4008. cc_library {
  4009. name: "lib_dep",
  4010. srcs: ["mylib.cpp"],
  4011. shared_libs: ["libfoo"],
  4012. system_shared_libs: [],
  4013. stl: "none",
  4014. apex_available: [
  4015. "myapex_dep",
  4016. "myapex_provider",
  4017. "myapex_selfcontained",
  4018. ],
  4019. }
  4020. cc_library {
  4021. name: "lib_dep_on_bar",
  4022. srcs: ["mylib.cpp"],
  4023. shared_libs: ["libbar"],
  4024. system_shared_libs: [],
  4025. stl: "none",
  4026. apex_available: [
  4027. "myapex_selfcontained",
  4028. ],
  4029. }
  4030. cc_library {
  4031. name: "libfoo",
  4032. srcs: ["mytest.cpp"],
  4033. stubs: {
  4034. versions: ["1"],
  4035. },
  4036. system_shared_libs: [],
  4037. stl: "none",
  4038. apex_available: [
  4039. "myapex_provider",
  4040. ],
  4041. }
  4042. cc_library {
  4043. name: "libbar",
  4044. srcs: ["mytest.cpp"],
  4045. stubs: {
  4046. versions: ["1"],
  4047. },
  4048. system_shared_libs: [],
  4049. stl: "none",
  4050. apex_available: [
  4051. "myapex_selfcontained",
  4052. ],
  4053. }
  4054. `)
  4055. var apexManifestRule android.TestingBuildParams
  4056. var provideNativeLibs, requireNativeLibs []string
  4057. apexManifestRule = ctx.ModuleForTests("myapex_nodep", "android_common_myapex_nodep_image").Rule("apexManifestRule")
  4058. provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
  4059. requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
  4060. ensureListEmpty(t, provideNativeLibs)
  4061. ensureListEmpty(t, requireNativeLibs)
  4062. apexManifestRule = ctx.ModuleForTests("myapex_dep", "android_common_myapex_dep_image").Rule("apexManifestRule")
  4063. provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
  4064. requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
  4065. ensureListEmpty(t, provideNativeLibs)
  4066. ensureListContains(t, requireNativeLibs, "libfoo.so")
  4067. apexManifestRule = ctx.ModuleForTests("myapex_provider", "android_common_myapex_provider_image").Rule("apexManifestRule")
  4068. provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
  4069. requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
  4070. ensureListContains(t, provideNativeLibs, "libfoo.so")
  4071. ensureListEmpty(t, requireNativeLibs)
  4072. apexManifestRule = ctx.ModuleForTests("myapex_selfcontained", "android_common_myapex_selfcontained_image").Rule("apexManifestRule")
  4073. provideNativeLibs = names(apexManifestRule.Args["provideNativeLibs"])
  4074. requireNativeLibs = names(apexManifestRule.Args["requireNativeLibs"])
  4075. ensureListContains(t, provideNativeLibs, "libbar.so")
  4076. ensureListEmpty(t, requireNativeLibs)
  4077. }
  4078. func TestOverrideApexManifestDefaultVersion(t *testing.T) {
  4079. ctx := testApex(t, `
  4080. apex {
  4081. name: "myapex",
  4082. key: "myapex.key",
  4083. native_shared_libs: ["mylib"],
  4084. updatable: false,
  4085. }
  4086. apex_key {
  4087. name: "myapex.key",
  4088. public_key: "testkey.avbpubkey",
  4089. private_key: "testkey.pem",
  4090. }
  4091. cc_library {
  4092. name: "mylib",
  4093. srcs: ["mylib.cpp"],
  4094. system_shared_libs: [],
  4095. stl: "none",
  4096. apex_available: [
  4097. "//apex_available:platform",
  4098. "myapex",
  4099. ],
  4100. }
  4101. `, android.FixtureMergeEnv(map[string]string{
  4102. "OVERRIDE_APEX_MANIFEST_DEFAULT_VERSION": "1234",
  4103. }))
  4104. module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
  4105. apexManifestRule := module.Rule("apexManifestRule")
  4106. ensureContains(t, apexManifestRule.Args["default_version"], "1234")
  4107. }
  4108. func TestCompileMultilibProp(t *testing.T) {
  4109. testCases := []struct {
  4110. compileMultiLibProp string
  4111. containedLibs []string
  4112. notContainedLibs []string
  4113. }{
  4114. {
  4115. containedLibs: []string{
  4116. "image.apex/lib64/mylib.so",
  4117. "image.apex/lib/mylib.so",
  4118. },
  4119. compileMultiLibProp: `compile_multilib: "both",`,
  4120. },
  4121. {
  4122. containedLibs: []string{"image.apex/lib64/mylib.so"},
  4123. notContainedLibs: []string{"image.apex/lib/mylib.so"},
  4124. compileMultiLibProp: `compile_multilib: "first",`,
  4125. },
  4126. {
  4127. containedLibs: []string{"image.apex/lib64/mylib.so"},
  4128. notContainedLibs: []string{"image.apex/lib/mylib.so"},
  4129. // compile_multilib, when unset, should result to the same output as when compile_multilib is "first"
  4130. },
  4131. {
  4132. containedLibs: []string{"image.apex/lib64/mylib.so"},
  4133. notContainedLibs: []string{"image.apex/lib/mylib.so"},
  4134. compileMultiLibProp: `compile_multilib: "64",`,
  4135. },
  4136. {
  4137. containedLibs: []string{"image.apex/lib/mylib.so"},
  4138. notContainedLibs: []string{"image.apex/lib64/mylib.so"},
  4139. compileMultiLibProp: `compile_multilib: "32",`,
  4140. },
  4141. }
  4142. for _, testCase := range testCases {
  4143. ctx := testApex(t, fmt.Sprintf(`
  4144. apex {
  4145. name: "myapex",
  4146. key: "myapex.key",
  4147. %s
  4148. native_shared_libs: ["mylib"],
  4149. updatable: false,
  4150. }
  4151. apex_key {
  4152. name: "myapex.key",
  4153. public_key: "testkey.avbpubkey",
  4154. private_key: "testkey.pem",
  4155. }
  4156. cc_library {
  4157. name: "mylib",
  4158. srcs: ["mylib.cpp"],
  4159. apex_available: [
  4160. "//apex_available:platform",
  4161. "myapex",
  4162. ],
  4163. }
  4164. `, testCase.compileMultiLibProp),
  4165. )
  4166. module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
  4167. apexRule := module.Rule("apexRule")
  4168. copyCmds := apexRule.Args["copy_commands"]
  4169. for _, containedLib := range testCase.containedLibs {
  4170. ensureContains(t, copyCmds, containedLib)
  4171. }
  4172. for _, notContainedLib := range testCase.notContainedLibs {
  4173. ensureNotContains(t, copyCmds, notContainedLib)
  4174. }
  4175. }
  4176. }
  4177. func TestNonTestApex(t *testing.T) {
  4178. ctx := testApex(t, `
  4179. apex {
  4180. name: "myapex",
  4181. key: "myapex.key",
  4182. native_shared_libs: ["mylib_common"],
  4183. updatable: false,
  4184. }
  4185. apex_key {
  4186. name: "myapex.key",
  4187. public_key: "testkey.avbpubkey",
  4188. private_key: "testkey.pem",
  4189. }
  4190. cc_library {
  4191. name: "mylib_common",
  4192. srcs: ["mylib.cpp"],
  4193. system_shared_libs: [],
  4194. stl: "none",
  4195. apex_available: [
  4196. "//apex_available:platform",
  4197. "myapex",
  4198. ],
  4199. }
  4200. `)
  4201. module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
  4202. apexRule := module.Rule("apexRule")
  4203. copyCmds := apexRule.Args["copy_commands"]
  4204. if apex, ok := module.Module().(*apexBundle); !ok || apex.testApex {
  4205. t.Log("Apex was a test apex!")
  4206. t.Fail()
  4207. }
  4208. // Ensure that main rule creates an output
  4209. ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
  4210. // Ensure that apex variant is created for the direct dep
  4211. ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
  4212. // Ensure that both direct and indirect deps are copied into apex
  4213. ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
  4214. // Ensure that the platform variant ends with _shared
  4215. ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
  4216. if !ctx.ModuleForTests("mylib_common", "android_arm64_armv8-a_shared_apex10000").Module().(*cc.Module).InAnyApex() {
  4217. t.Log("Found mylib_common not in any apex!")
  4218. t.Fail()
  4219. }
  4220. }
  4221. func TestTestApex(t *testing.T) {
  4222. ctx := testApex(t, `
  4223. apex_test {
  4224. name: "myapex",
  4225. key: "myapex.key",
  4226. native_shared_libs: ["mylib_common_test"],
  4227. updatable: false,
  4228. }
  4229. apex_key {
  4230. name: "myapex.key",
  4231. public_key: "testkey.avbpubkey",
  4232. private_key: "testkey.pem",
  4233. }
  4234. cc_library {
  4235. name: "mylib_common_test",
  4236. srcs: ["mylib.cpp"],
  4237. system_shared_libs: [],
  4238. stl: "none",
  4239. // TODO: remove //apex_available:platform
  4240. apex_available: [
  4241. "//apex_available:platform",
  4242. "myapex",
  4243. ],
  4244. }
  4245. `)
  4246. module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
  4247. apexRule := module.Rule("apexRule")
  4248. copyCmds := apexRule.Args["copy_commands"]
  4249. if apex, ok := module.Module().(*apexBundle); !ok || !apex.testApex {
  4250. t.Log("Apex was not a test apex!")
  4251. t.Fail()
  4252. }
  4253. // Ensure that main rule creates an output
  4254. ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
  4255. // Ensure that apex variant is created for the direct dep
  4256. ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared_apex10000")
  4257. // Ensure that both direct and indirect deps are copied into apex
  4258. ensureContains(t, copyCmds, "image.apex/lib64/mylib_common_test.so")
  4259. // Ensure that the platform variant ends with _shared
  4260. ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common_test"), "android_arm64_armv8-a_shared")
  4261. }
  4262. func TestApexWithTarget(t *testing.T) {
  4263. ctx := testApex(t, `
  4264. apex {
  4265. name: "myapex",
  4266. key: "myapex.key",
  4267. updatable: false,
  4268. multilib: {
  4269. first: {
  4270. native_shared_libs: ["mylib_common"],
  4271. }
  4272. },
  4273. target: {
  4274. android: {
  4275. multilib: {
  4276. first: {
  4277. native_shared_libs: ["mylib"],
  4278. }
  4279. }
  4280. },
  4281. host: {
  4282. multilib: {
  4283. first: {
  4284. native_shared_libs: ["mylib2"],
  4285. }
  4286. }
  4287. }
  4288. }
  4289. }
  4290. apex_key {
  4291. name: "myapex.key",
  4292. public_key: "testkey.avbpubkey",
  4293. private_key: "testkey.pem",
  4294. }
  4295. cc_library {
  4296. name: "mylib",
  4297. srcs: ["mylib.cpp"],
  4298. system_shared_libs: [],
  4299. stl: "none",
  4300. // TODO: remove //apex_available:platform
  4301. apex_available: [
  4302. "//apex_available:platform",
  4303. "myapex",
  4304. ],
  4305. }
  4306. cc_library {
  4307. name: "mylib_common",
  4308. srcs: ["mylib.cpp"],
  4309. system_shared_libs: [],
  4310. stl: "none",
  4311. compile_multilib: "first",
  4312. // TODO: remove //apex_available:platform
  4313. apex_available: [
  4314. "//apex_available:platform",
  4315. "myapex",
  4316. ],
  4317. }
  4318. cc_library {
  4319. name: "mylib2",
  4320. srcs: ["mylib.cpp"],
  4321. system_shared_libs: [],
  4322. stl: "none",
  4323. compile_multilib: "first",
  4324. }
  4325. `)
  4326. apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
  4327. copyCmds := apexRule.Args["copy_commands"]
  4328. // Ensure that main rule creates an output
  4329. ensureContains(t, apexRule.Output.String(), "myapex.apex.unsigned")
  4330. // Ensure that apex variant is created for the direct dep
  4331. ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared_apex10000")
  4332. ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared_apex10000")
  4333. ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000")
  4334. // Ensure that both direct and indirect deps are copied into apex
  4335. ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
  4336. ensureContains(t, copyCmds, "image.apex/lib64/mylib_common.so")
  4337. ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
  4338. // Ensure that the platform variant ends with _shared
  4339. ensureListContains(t, ctx.ModuleVariantsForTests("mylib"), "android_arm64_armv8-a_shared")
  4340. ensureListContains(t, ctx.ModuleVariantsForTests("mylib_common"), "android_arm64_armv8-a_shared")
  4341. ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared")
  4342. }
  4343. func TestApexWithArch(t *testing.T) {
  4344. ctx := testApex(t, `
  4345. apex {
  4346. name: "myapex",
  4347. key: "myapex.key",
  4348. updatable: false,
  4349. native_shared_libs: ["mylib.generic"],
  4350. arch: {
  4351. arm64: {
  4352. native_shared_libs: ["mylib.arm64"],
  4353. exclude_native_shared_libs: ["mylib.generic"],
  4354. },
  4355. x86_64: {
  4356. native_shared_libs: ["mylib.x64"],
  4357. exclude_native_shared_libs: ["mylib.generic"],
  4358. },
  4359. }
  4360. }
  4361. apex_key {
  4362. name: "myapex.key",
  4363. public_key: "testkey.avbpubkey",
  4364. private_key: "testkey.pem",
  4365. }
  4366. cc_library {
  4367. name: "mylib.generic",
  4368. srcs: ["mylib.cpp"],
  4369. system_shared_libs: [],
  4370. stl: "none",
  4371. // TODO: remove //apex_available:platform
  4372. apex_available: [
  4373. "//apex_available:platform",
  4374. "myapex",
  4375. ],
  4376. }
  4377. cc_library {
  4378. name: "mylib.arm64",
  4379. srcs: ["mylib.cpp"],
  4380. system_shared_libs: [],
  4381. stl: "none",
  4382. // TODO: remove //apex_available:platform
  4383. apex_available: [
  4384. "//apex_available:platform",
  4385. "myapex",
  4386. ],
  4387. }
  4388. cc_library {
  4389. name: "mylib.x64",
  4390. srcs: ["mylib.cpp"],
  4391. system_shared_libs: [],
  4392. stl: "none",
  4393. // TODO: remove //apex_available:platform
  4394. apex_available: [
  4395. "//apex_available:platform",
  4396. "myapex",
  4397. ],
  4398. }
  4399. `)
  4400. apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
  4401. copyCmds := apexRule.Args["copy_commands"]
  4402. // Ensure that apex variant is created for the direct dep
  4403. ensureListContains(t, ctx.ModuleVariantsForTests("mylib.arm64"), "android_arm64_armv8-a_shared_apex10000")
  4404. ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.generic"), "android_arm64_armv8-a_shared_apex10000")
  4405. ensureListNotContains(t, ctx.ModuleVariantsForTests("mylib.x64"), "android_arm64_armv8-a_shared_apex10000")
  4406. // Ensure that both direct and indirect deps are copied into apex
  4407. ensureContains(t, copyCmds, "image.apex/lib64/mylib.arm64.so")
  4408. ensureNotContains(t, copyCmds, "image.apex/lib64/mylib.x64.so")
  4409. }
  4410. func TestApexWithShBinary(t *testing.T) {
  4411. ctx := testApex(t, `
  4412. apex {
  4413. name: "myapex",
  4414. key: "myapex.key",
  4415. sh_binaries: ["myscript"],
  4416. updatable: false,
  4417. }
  4418. apex_key {
  4419. name: "myapex.key",
  4420. public_key: "testkey.avbpubkey",
  4421. private_key: "testkey.pem",
  4422. }
  4423. sh_binary {
  4424. name: "myscript",
  4425. src: "mylib.cpp",
  4426. filename: "myscript.sh",
  4427. sub_dir: "script",
  4428. }
  4429. `)
  4430. apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
  4431. copyCmds := apexRule.Args["copy_commands"]
  4432. ensureContains(t, copyCmds, "image.apex/bin/script/myscript.sh")
  4433. }
  4434. func TestApexInVariousPartition(t *testing.T) {
  4435. testcases := []struct {
  4436. propName, parition, flattenedPartition string
  4437. }{
  4438. {"", "system", "system_ext"},
  4439. {"product_specific: true", "product", "product"},
  4440. {"soc_specific: true", "vendor", "vendor"},
  4441. {"proprietary: true", "vendor", "vendor"},
  4442. {"vendor: true", "vendor", "vendor"},
  4443. {"system_ext_specific: true", "system_ext", "system_ext"},
  4444. }
  4445. for _, tc := range testcases {
  4446. t.Run(tc.propName+":"+tc.parition, func(t *testing.T) {
  4447. ctx := testApex(t, `
  4448. apex {
  4449. name: "myapex",
  4450. key: "myapex.key",
  4451. updatable: false,
  4452. `+tc.propName+`
  4453. }
  4454. apex_key {
  4455. name: "myapex.key",
  4456. public_key: "testkey.avbpubkey",
  4457. private_key: "testkey.pem",
  4458. }
  4459. `)
  4460. apex := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
  4461. expected := "out/soong/target/product/test_device/" + tc.parition + "/apex"
  4462. actual := apex.installDir.RelativeToTop().String()
  4463. if actual != expected {
  4464. t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
  4465. }
  4466. flattened := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
  4467. expected = "out/soong/target/product/test_device/" + tc.flattenedPartition + "/apex"
  4468. actual = flattened.installDir.RelativeToTop().String()
  4469. if actual != expected {
  4470. t.Errorf("wrong install path. expected %q. actual %q", expected, actual)
  4471. }
  4472. })
  4473. }
  4474. }
  4475. func TestFileContexts_FindInDefaultLocationIfNotSet(t *testing.T) {
  4476. ctx := testApex(t, `
  4477. apex {
  4478. name: "myapex",
  4479. key: "myapex.key",
  4480. updatable: false,
  4481. }
  4482. apex_key {
  4483. name: "myapex.key",
  4484. public_key: "testkey.avbpubkey",
  4485. private_key: "testkey.pem",
  4486. }
  4487. `)
  4488. module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
  4489. rule := module.Output("file_contexts")
  4490. ensureContains(t, rule.RuleParams.Command, "cat system/sepolicy/apex/myapex-file_contexts")
  4491. }
  4492. func TestFileContexts_ShouldBeUnderSystemSepolicyForSystemApexes(t *testing.T) {
  4493. testApexError(t, `"myapex" .*: file_contexts: should be under system/sepolicy`, `
  4494. apex {
  4495. name: "myapex",
  4496. key: "myapex.key",
  4497. file_contexts: "my_own_file_contexts",
  4498. updatable: false,
  4499. }
  4500. apex_key {
  4501. name: "myapex.key",
  4502. public_key: "testkey.avbpubkey",
  4503. private_key: "testkey.pem",
  4504. }
  4505. `, withFiles(map[string][]byte{
  4506. "my_own_file_contexts": nil,
  4507. }))
  4508. }
  4509. func TestFileContexts_ProductSpecificApexes(t *testing.T) {
  4510. testApexError(t, `"myapex" .*: file_contexts: cannot find`, `
  4511. apex {
  4512. name: "myapex",
  4513. key: "myapex.key",
  4514. product_specific: true,
  4515. file_contexts: "product_specific_file_contexts",
  4516. updatable: false,
  4517. }
  4518. apex_key {
  4519. name: "myapex.key",
  4520. public_key: "testkey.avbpubkey",
  4521. private_key: "testkey.pem",
  4522. }
  4523. `)
  4524. ctx := testApex(t, `
  4525. apex {
  4526. name: "myapex",
  4527. key: "myapex.key",
  4528. product_specific: true,
  4529. file_contexts: "product_specific_file_contexts",
  4530. updatable: false,
  4531. }
  4532. apex_key {
  4533. name: "myapex.key",
  4534. public_key: "testkey.avbpubkey",
  4535. private_key: "testkey.pem",
  4536. }
  4537. `, withFiles(map[string][]byte{
  4538. "product_specific_file_contexts": nil,
  4539. }))
  4540. module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
  4541. rule := module.Output("file_contexts")
  4542. ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
  4543. }
  4544. func TestFileContexts_SetViaFileGroup(t *testing.T) {
  4545. ctx := testApex(t, `
  4546. apex {
  4547. name: "myapex",
  4548. key: "myapex.key",
  4549. product_specific: true,
  4550. file_contexts: ":my-file-contexts",
  4551. updatable: false,
  4552. }
  4553. apex_key {
  4554. name: "myapex.key",
  4555. public_key: "testkey.avbpubkey",
  4556. private_key: "testkey.pem",
  4557. }
  4558. filegroup {
  4559. name: "my-file-contexts",
  4560. srcs: ["product_specific_file_contexts"],
  4561. }
  4562. `, withFiles(map[string][]byte{
  4563. "product_specific_file_contexts": nil,
  4564. }))
  4565. module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
  4566. rule := module.Output("file_contexts")
  4567. ensureContains(t, rule.RuleParams.Command, "cat product_specific_file_contexts")
  4568. }
  4569. func TestApexKeyFromOtherModule(t *testing.T) {
  4570. ctx := testApex(t, `
  4571. apex_key {
  4572. name: "myapex.key",
  4573. public_key: ":my.avbpubkey",
  4574. private_key: ":my.pem",
  4575. product_specific: true,
  4576. }
  4577. filegroup {
  4578. name: "my.avbpubkey",
  4579. srcs: ["testkey2.avbpubkey"],
  4580. }
  4581. filegroup {
  4582. name: "my.pem",
  4583. srcs: ["testkey2.pem"],
  4584. }
  4585. `)
  4586. apex_key := ctx.ModuleForTests("myapex.key", "android_common").Module().(*apexKey)
  4587. expected_pubkey := "testkey2.avbpubkey"
  4588. actual_pubkey := apex_key.publicKeyFile.String()
  4589. if actual_pubkey != expected_pubkey {
  4590. t.Errorf("wrong public key path. expected %q. actual %q", expected_pubkey, actual_pubkey)
  4591. }
  4592. expected_privkey := "testkey2.pem"
  4593. actual_privkey := apex_key.privateKeyFile.String()
  4594. if actual_privkey != expected_privkey {
  4595. t.Errorf("wrong private key path. expected %q. actual %q", expected_privkey, actual_privkey)
  4596. }
  4597. }
  4598. func TestPrebuilt(t *testing.T) {
  4599. ctx := testApex(t, `
  4600. prebuilt_apex {
  4601. name: "myapex",
  4602. arch: {
  4603. arm64: {
  4604. src: "myapex-arm64.apex",
  4605. },
  4606. arm: {
  4607. src: "myapex-arm.apex",
  4608. },
  4609. },
  4610. }
  4611. `)
  4612. testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
  4613. prebuilt := testingModule.Module().(*Prebuilt)
  4614. expectedInput := "myapex-arm64.apex"
  4615. if prebuilt.inputApex.String() != expectedInput {
  4616. t.Errorf("inputApex invalid. expected: %q, actual: %q", expectedInput, prebuilt.inputApex.String())
  4617. }
  4618. android.AssertStringDoesContain(t, "Invalid provenance metadata file",
  4619. prebuilt.ProvenanceMetaDataFile().String(), "soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto")
  4620. rule := testingModule.Rule("genProvenanceMetaData")
  4621. android.AssertStringEquals(t, "Invalid input", "myapex-arm64.apex", rule.Inputs[0].String())
  4622. android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
  4623. android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
  4624. android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.apex", rule.Args["install_path"])
  4625. entries := android.AndroidMkEntriesForTest(t, ctx, testingModule.Module())[0]
  4626. android.AssertStringEquals(t, "unexpected LOCAL_SOONG_MODULE_TYPE", "prebuilt_apex", entries.EntryMap["LOCAL_SOONG_MODULE_TYPE"][0])
  4627. }
  4628. func TestPrebuiltMissingSrc(t *testing.T) {
  4629. testApexError(t, `module "myapex" variant "android_common_myapex".*: prebuilt_apex does not support "arm64_armv8-a"`, `
  4630. prebuilt_apex {
  4631. name: "myapex",
  4632. }
  4633. `)
  4634. }
  4635. func TestPrebuiltFilenameOverride(t *testing.T) {
  4636. ctx := testApex(t, `
  4637. prebuilt_apex {
  4638. name: "myapex",
  4639. src: "myapex-arm.apex",
  4640. filename: "notmyapex.apex",
  4641. }
  4642. `)
  4643. testingModule := ctx.ModuleForTests("myapex", "android_common_myapex")
  4644. p := testingModule.Module().(*Prebuilt)
  4645. expected := "notmyapex.apex"
  4646. if p.installFilename != expected {
  4647. t.Errorf("installFilename invalid. expected: %q, actual: %q", expected, p.installFilename)
  4648. }
  4649. rule := testingModule.Rule("genProvenanceMetaData")
  4650. android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
  4651. android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex/provenance_metadata.textproto", rule.Output.String())
  4652. android.AssertStringEquals(t, "Invalid args", "myapex", rule.Args["module_name"])
  4653. android.AssertStringEquals(t, "Invalid args", "/system/apex/notmyapex.apex", rule.Args["install_path"])
  4654. }
  4655. func TestApexSetFilenameOverride(t *testing.T) {
  4656. testApex(t, `
  4657. apex_set {
  4658. name: "com.company.android.myapex",
  4659. apex_name: "com.android.myapex",
  4660. set: "company-myapex.apks",
  4661. filename: "com.company.android.myapex.apex"
  4662. }
  4663. `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
  4664. testApex(t, `
  4665. apex_set {
  4666. name: "com.company.android.myapex",
  4667. apex_name: "com.android.myapex",
  4668. set: "company-myapex.apks",
  4669. filename: "com.company.android.myapex.capex"
  4670. }
  4671. `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
  4672. testApexError(t, `filename should end in .apex or .capex for apex_set`, `
  4673. apex_set {
  4674. name: "com.company.android.myapex",
  4675. apex_name: "com.android.myapex",
  4676. set: "company-myapex.apks",
  4677. filename: "some-random-suffix"
  4678. }
  4679. `)
  4680. }
  4681. func TestPrebuiltOverrides(t *testing.T) {
  4682. ctx := testApex(t, `
  4683. prebuilt_apex {
  4684. name: "myapex.prebuilt",
  4685. src: "myapex-arm.apex",
  4686. overrides: [
  4687. "myapex",
  4688. ],
  4689. }
  4690. `)
  4691. testingModule := ctx.ModuleForTests("myapex.prebuilt", "android_common_myapex.prebuilt")
  4692. p := testingModule.Module().(*Prebuilt)
  4693. expected := []string{"myapex"}
  4694. actual := android.AndroidMkEntriesForTest(t, ctx, p)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
  4695. if !reflect.DeepEqual(actual, expected) {
  4696. t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES value '%s', expected '%s'", actual, expected)
  4697. }
  4698. rule := testingModule.Rule("genProvenanceMetaData")
  4699. android.AssertStringEquals(t, "Invalid input", "myapex-arm.apex", rule.Inputs[0].String())
  4700. android.AssertStringEquals(t, "Invalid output", "out/soong/.intermediates/provenance_metadata/myapex.prebuilt/provenance_metadata.textproto", rule.Output.String())
  4701. android.AssertStringEquals(t, "Invalid args", "myapex.prebuilt", rule.Args["module_name"])
  4702. android.AssertStringEquals(t, "Invalid args", "/system/apex/myapex.prebuilt.apex", rule.Args["install_path"])
  4703. }
  4704. func TestPrebuiltApexName(t *testing.T) {
  4705. testApex(t, `
  4706. prebuilt_apex {
  4707. name: "com.company.android.myapex",
  4708. apex_name: "com.android.myapex",
  4709. src: "company-myapex-arm.apex",
  4710. }
  4711. `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
  4712. testApex(t, `
  4713. apex_set {
  4714. name: "com.company.android.myapex",
  4715. apex_name: "com.android.myapex",
  4716. set: "company-myapex.apks",
  4717. }
  4718. `).ModuleForTests("com.company.android.myapex", "android_common_com.android.myapex")
  4719. }
  4720. func TestPrebuiltApexNameWithPlatformBootclasspath(t *testing.T) {
  4721. _ = android.GroupFixturePreparers(
  4722. java.PrepareForTestWithJavaDefaultModules,
  4723. PrepareForTestWithApexBuildComponents,
  4724. android.FixtureWithRootAndroidBp(`
  4725. platform_bootclasspath {
  4726. name: "platform-bootclasspath",
  4727. fragments: [
  4728. {
  4729. apex: "com.android.art",
  4730. module: "art-bootclasspath-fragment",
  4731. },
  4732. ],
  4733. }
  4734. prebuilt_apex {
  4735. name: "com.company.android.art",
  4736. apex_name: "com.android.art",
  4737. src: "com.company.android.art-arm.apex",
  4738. exported_bootclasspath_fragments: ["art-bootclasspath-fragment"],
  4739. }
  4740. prebuilt_bootclasspath_fragment {
  4741. name: "art-bootclasspath-fragment",
  4742. image_name: "art",
  4743. contents: ["core-oj"],
  4744. hidden_api: {
  4745. annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
  4746. metadata: "my-bootclasspath-fragment/metadata.csv",
  4747. index: "my-bootclasspath-fragment/index.csv",
  4748. stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
  4749. all_flags: "my-bootclasspath-fragment/all-flags.csv",
  4750. },
  4751. }
  4752. java_import {
  4753. name: "core-oj",
  4754. jars: ["prebuilt.jar"],
  4755. }
  4756. `),
  4757. ).RunTest(t)
  4758. }
  4759. // These tests verify that the prebuilt_apex/deapexer to java_import wiring allows for the
  4760. // propagation of paths to dex implementation jars from the former to the latter.
  4761. func TestPrebuiltExportDexImplementationJars(t *testing.T) {
  4762. transform := android.NullFixturePreparer
  4763. checkDexJarBuildPath := func(t *testing.T, ctx *android.TestContext, name string) {
  4764. t.Helper()
  4765. // Make sure the import has been given the correct path to the dex jar.
  4766. p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
  4767. dexJarBuildPath := p.DexJarBuildPath().PathOrNil()
  4768. stem := android.RemoveOptionalPrebuiltPrefix(name)
  4769. android.AssertStringEquals(t, "DexJarBuildPath should be apex-related path.",
  4770. ".intermediates/myapex.deapexer/android_common/deapexer/javalib/"+stem+".jar",
  4771. android.NormalizePathForTesting(dexJarBuildPath))
  4772. }
  4773. checkDexJarInstallPath := func(t *testing.T, ctx *android.TestContext, name string) {
  4774. t.Helper()
  4775. // Make sure the import has been given the correct path to the dex jar.
  4776. p := ctx.ModuleForTests(name, "android_common_myapex").Module().(java.UsesLibraryDependency)
  4777. dexJarBuildPath := p.DexJarInstallPath()
  4778. stem := android.RemoveOptionalPrebuiltPrefix(name)
  4779. android.AssertStringEquals(t, "DexJarInstallPath should be apex-related path.",
  4780. "target/product/test_device/apex/myapex/javalib/"+stem+".jar",
  4781. android.NormalizePathForTesting(dexJarBuildPath))
  4782. }
  4783. ensureNoSourceVariant := func(t *testing.T, ctx *android.TestContext, name string) {
  4784. t.Helper()
  4785. // Make sure that an apex variant is not created for the source module.
  4786. android.AssertArrayString(t, "Check if there is no source variant",
  4787. []string{"android_common"},
  4788. ctx.ModuleVariantsForTests(name))
  4789. }
  4790. t.Run("prebuilt only", func(t *testing.T) {
  4791. bp := `
  4792. prebuilt_apex {
  4793. name: "myapex",
  4794. arch: {
  4795. arm64: {
  4796. src: "myapex-arm64.apex",
  4797. },
  4798. arm: {
  4799. src: "myapex-arm.apex",
  4800. },
  4801. },
  4802. exported_java_libs: ["libfoo", "libbar"],
  4803. }
  4804. java_import {
  4805. name: "libfoo",
  4806. jars: ["libfoo.jar"],
  4807. }
  4808. java_sdk_library_import {
  4809. name: "libbar",
  4810. public: {
  4811. jars: ["libbar.jar"],
  4812. },
  4813. }
  4814. `
  4815. // Make sure that dexpreopt can access dex implementation files from the prebuilt.
  4816. ctx := testDexpreoptWithApexes(t, bp, "", transform)
  4817. deapexerName := deapexerModuleName("myapex")
  4818. android.AssertStringEquals(t, "APEX module name from deapexer name", "myapex", apexModuleName(deapexerName))
  4819. // Make sure that the deapexer has the correct input APEX.
  4820. deapexer := ctx.ModuleForTests(deapexerName, "android_common")
  4821. rule := deapexer.Rule("deapexer")
  4822. if expected, actual := []string{"myapex-arm64.apex"}, android.NormalizePathsForTesting(rule.Implicits); !reflect.DeepEqual(expected, actual) {
  4823. t.Errorf("expected: %q, found: %q", expected, actual)
  4824. }
  4825. // Make sure that the prebuilt_apex has the correct input APEX.
  4826. prebuiltApex := ctx.ModuleForTests("myapex", "android_common_myapex")
  4827. rule = prebuiltApex.Rule("android/soong/android.Cp")
  4828. if expected, actual := "myapex-arm64.apex", android.NormalizePathForTesting(rule.Input); !reflect.DeepEqual(expected, actual) {
  4829. t.Errorf("expected: %q, found: %q", expected, actual)
  4830. }
  4831. checkDexJarBuildPath(t, ctx, "libfoo")
  4832. checkDexJarInstallPath(t, ctx, "libfoo")
  4833. checkDexJarBuildPath(t, ctx, "libbar")
  4834. checkDexJarInstallPath(t, ctx, "libbar")
  4835. })
  4836. t.Run("prebuilt with source preferred", func(t *testing.T) {
  4837. bp := `
  4838. prebuilt_apex {
  4839. name: "myapex",
  4840. arch: {
  4841. arm64: {
  4842. src: "myapex-arm64.apex",
  4843. },
  4844. arm: {
  4845. src: "myapex-arm.apex",
  4846. },
  4847. },
  4848. exported_java_libs: ["libfoo", "libbar"],
  4849. }
  4850. java_import {
  4851. name: "libfoo",
  4852. jars: ["libfoo.jar"],
  4853. }
  4854. java_library {
  4855. name: "libfoo",
  4856. }
  4857. java_sdk_library_import {
  4858. name: "libbar",
  4859. public: {
  4860. jars: ["libbar.jar"],
  4861. },
  4862. }
  4863. java_sdk_library {
  4864. name: "libbar",
  4865. srcs: ["foo/bar/MyClass.java"],
  4866. unsafe_ignore_missing_latest_api: true,
  4867. }
  4868. `
  4869. // Make sure that dexpreopt can access dex implementation files from the prebuilt.
  4870. ctx := testDexpreoptWithApexes(t, bp, "", transform)
  4871. checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
  4872. checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
  4873. ensureNoSourceVariant(t, ctx, "libfoo")
  4874. checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
  4875. checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
  4876. ensureNoSourceVariant(t, ctx, "libbar")
  4877. })
  4878. t.Run("prebuilt preferred with source", func(t *testing.T) {
  4879. bp := `
  4880. prebuilt_apex {
  4881. name: "myapex",
  4882. arch: {
  4883. arm64: {
  4884. src: "myapex-arm64.apex",
  4885. },
  4886. arm: {
  4887. src: "myapex-arm.apex",
  4888. },
  4889. },
  4890. exported_java_libs: ["libfoo", "libbar"],
  4891. }
  4892. java_import {
  4893. name: "libfoo",
  4894. prefer: true,
  4895. jars: ["libfoo.jar"],
  4896. }
  4897. java_library {
  4898. name: "libfoo",
  4899. }
  4900. java_sdk_library_import {
  4901. name: "libbar",
  4902. prefer: true,
  4903. public: {
  4904. jars: ["libbar.jar"],
  4905. },
  4906. }
  4907. java_sdk_library {
  4908. name: "libbar",
  4909. srcs: ["foo/bar/MyClass.java"],
  4910. unsafe_ignore_missing_latest_api: true,
  4911. }
  4912. `
  4913. // Make sure that dexpreopt can access dex implementation files from the prebuilt.
  4914. ctx := testDexpreoptWithApexes(t, bp, "", transform)
  4915. checkDexJarBuildPath(t, ctx, "prebuilt_libfoo")
  4916. checkDexJarInstallPath(t, ctx, "prebuilt_libfoo")
  4917. ensureNoSourceVariant(t, ctx, "libfoo")
  4918. checkDexJarBuildPath(t, ctx, "prebuilt_libbar")
  4919. checkDexJarInstallPath(t, ctx, "prebuilt_libbar")
  4920. ensureNoSourceVariant(t, ctx, "libbar")
  4921. })
  4922. }
  4923. func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
  4924. preparer := android.GroupFixturePreparers(
  4925. java.FixtureConfigureApexBootJars("myapex:libfoo", "myapex:libbar"),
  4926. // Make sure that the frameworks/base/Android.bp file exists as otherwise hidden API encoding
  4927. // is disabled.
  4928. android.FixtureAddTextFile("frameworks/base/Android.bp", ""),
  4929. )
  4930. checkBootDexJarPath := func(t *testing.T, ctx *android.TestContext, stem string, bootDexJarPath string) {
  4931. t.Helper()
  4932. s := ctx.ModuleForTests("platform-bootclasspath", "android_common")
  4933. foundLibfooJar := false
  4934. base := stem + ".jar"
  4935. for _, output := range s.AllOutputs() {
  4936. if filepath.Base(output) == base {
  4937. foundLibfooJar = true
  4938. buildRule := s.Output(output)
  4939. android.AssertStringEquals(t, "boot dex jar path", bootDexJarPath, buildRule.Input.String())
  4940. }
  4941. }
  4942. if !foundLibfooJar {
  4943. t.Errorf("Rule for libfoo.jar missing in dex_bootjars singleton outputs %q", android.StringPathsRelativeToTop(ctx.Config().SoongOutDir(), s.AllOutputs()))
  4944. }
  4945. }
  4946. checkHiddenAPIIndexFromClassesInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
  4947. t.Helper()
  4948. platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
  4949. var rule android.TestingBuildParams
  4950. rule = platformBootclasspath.Output("hiddenapi-monolithic/index-from-classes.csv")
  4951. java.CheckHiddenAPIRuleInputs(t, "intermediate index", expectedIntermediateInputs, rule)
  4952. }
  4953. checkHiddenAPIIndexFromFlagsInputs := func(t *testing.T, ctx *android.TestContext, expectedIntermediateInputs string) {
  4954. t.Helper()
  4955. platformBootclasspath := ctx.ModuleForTests("platform-bootclasspath", "android_common")
  4956. var rule android.TestingBuildParams
  4957. rule = platformBootclasspath.Output("hiddenapi-index.csv")
  4958. java.CheckHiddenAPIRuleInputs(t, "monolithic index", expectedIntermediateInputs, rule)
  4959. }
  4960. fragment := java.ApexVariantReference{
  4961. Apex: proptools.StringPtr("myapex"),
  4962. Module: proptools.StringPtr("my-bootclasspath-fragment"),
  4963. }
  4964. t.Run("prebuilt only", func(t *testing.T) {
  4965. bp := `
  4966. prebuilt_apex {
  4967. name: "myapex",
  4968. arch: {
  4969. arm64: {
  4970. src: "myapex-arm64.apex",
  4971. },
  4972. arm: {
  4973. src: "myapex-arm.apex",
  4974. },
  4975. },
  4976. exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
  4977. }
  4978. prebuilt_bootclasspath_fragment {
  4979. name: "my-bootclasspath-fragment",
  4980. contents: ["libfoo", "libbar"],
  4981. apex_available: ["myapex"],
  4982. hidden_api: {
  4983. annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
  4984. metadata: "my-bootclasspath-fragment/metadata.csv",
  4985. index: "my-bootclasspath-fragment/index.csv",
  4986. signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
  4987. filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
  4988. filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
  4989. },
  4990. }
  4991. java_import {
  4992. name: "libfoo",
  4993. jars: ["libfoo.jar"],
  4994. apex_available: ["myapex"],
  4995. permitted_packages: ["foo"],
  4996. }
  4997. java_sdk_library_import {
  4998. name: "libbar",
  4999. public: {
  5000. jars: ["libbar.jar"],
  5001. },
  5002. apex_available: ["myapex"],
  5003. shared_library: false,
  5004. permitted_packages: ["bar"],
  5005. }
  5006. `
  5007. ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
  5008. checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
  5009. checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
  5010. // Verify the correct module jars contribute to the hiddenapi index file.
  5011. checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
  5012. checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
  5013. my-bootclasspath-fragment/index.csv
  5014. out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
  5015. `)
  5016. })
  5017. t.Run("apex_set only", func(t *testing.T) {
  5018. bp := `
  5019. apex_set {
  5020. name: "myapex",
  5021. set: "myapex.apks",
  5022. exported_java_libs: ["myjavalib"],
  5023. exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
  5024. exported_systemserverclasspath_fragments: ["my-systemserverclasspath-fragment"],
  5025. }
  5026. java_import {
  5027. name: "myjavalib",
  5028. jars: ["myjavalib.jar"],
  5029. apex_available: ["myapex"],
  5030. permitted_packages: ["javalib"],
  5031. }
  5032. prebuilt_bootclasspath_fragment {
  5033. name: "my-bootclasspath-fragment",
  5034. contents: ["libfoo", "libbar"],
  5035. apex_available: ["myapex"],
  5036. hidden_api: {
  5037. annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
  5038. metadata: "my-bootclasspath-fragment/metadata.csv",
  5039. index: "my-bootclasspath-fragment/index.csv",
  5040. signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
  5041. filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
  5042. filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
  5043. },
  5044. }
  5045. prebuilt_systemserverclasspath_fragment {
  5046. name: "my-systemserverclasspath-fragment",
  5047. contents: ["libbaz"],
  5048. apex_available: ["myapex"],
  5049. }
  5050. java_import {
  5051. name: "libfoo",
  5052. jars: ["libfoo.jar"],
  5053. apex_available: ["myapex"],
  5054. permitted_packages: ["foo"],
  5055. }
  5056. java_sdk_library_import {
  5057. name: "libbar",
  5058. public: {
  5059. jars: ["libbar.jar"],
  5060. },
  5061. apex_available: ["myapex"],
  5062. shared_library: false,
  5063. permitted_packages: ["bar"],
  5064. }
  5065. java_sdk_library_import {
  5066. name: "libbaz",
  5067. public: {
  5068. jars: ["libbaz.jar"],
  5069. },
  5070. apex_available: ["myapex"],
  5071. shared_library: false,
  5072. permitted_packages: ["baz"],
  5073. }
  5074. `
  5075. ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
  5076. checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
  5077. checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
  5078. // Verify the correct module jars contribute to the hiddenapi index file.
  5079. checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
  5080. checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
  5081. my-bootclasspath-fragment/index.csv
  5082. out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
  5083. `)
  5084. myApex := ctx.ModuleForTests("myapex", "android_common_myapex").Module()
  5085. overrideNames := []string{
  5086. "",
  5087. "myjavalib.myapex",
  5088. "libfoo.myapex",
  5089. "libbar.myapex",
  5090. "libbaz.myapex",
  5091. }
  5092. mkEntries := android.AndroidMkEntriesForTest(t, ctx, myApex)
  5093. for i, e := range mkEntries {
  5094. g := e.OverrideName
  5095. if w := overrideNames[i]; w != g {
  5096. t.Errorf("Expected override name %q, got %q", w, g)
  5097. }
  5098. }
  5099. })
  5100. t.Run("prebuilt with source library preferred", func(t *testing.T) {
  5101. bp := `
  5102. prebuilt_apex {
  5103. name: "myapex",
  5104. arch: {
  5105. arm64: {
  5106. src: "myapex-arm64.apex",
  5107. },
  5108. arm: {
  5109. src: "myapex-arm.apex",
  5110. },
  5111. },
  5112. exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
  5113. }
  5114. prebuilt_bootclasspath_fragment {
  5115. name: "my-bootclasspath-fragment",
  5116. contents: ["libfoo", "libbar"],
  5117. apex_available: ["myapex"],
  5118. hidden_api: {
  5119. annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
  5120. metadata: "my-bootclasspath-fragment/metadata.csv",
  5121. index: "my-bootclasspath-fragment/index.csv",
  5122. stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
  5123. all_flags: "my-bootclasspath-fragment/all-flags.csv",
  5124. },
  5125. }
  5126. java_import {
  5127. name: "libfoo",
  5128. jars: ["libfoo.jar"],
  5129. apex_available: ["myapex"],
  5130. }
  5131. java_library {
  5132. name: "libfoo",
  5133. srcs: ["foo/bar/MyClass.java"],
  5134. apex_available: ["myapex"],
  5135. }
  5136. java_sdk_library_import {
  5137. name: "libbar",
  5138. public: {
  5139. jars: ["libbar.jar"],
  5140. },
  5141. apex_available: ["myapex"],
  5142. shared_library: false,
  5143. }
  5144. java_sdk_library {
  5145. name: "libbar",
  5146. srcs: ["foo/bar/MyClass.java"],
  5147. unsafe_ignore_missing_latest_api: true,
  5148. apex_available: ["myapex"],
  5149. }
  5150. `
  5151. // In this test the source (java_library) libfoo is active since the
  5152. // prebuilt (java_import) defaults to prefer:false. However the
  5153. // prebuilt_apex module always depends on the prebuilt, and so it doesn't
  5154. // find the dex boot jar in it. We either need to disable the source libfoo
  5155. // or make the prebuilt libfoo preferred.
  5156. testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment)
  5157. // dexbootjar check is skipped if AllowMissingDependencies is true
  5158. preparerAllowMissingDeps := android.GroupFixturePreparers(
  5159. preparer,
  5160. android.PrepareForTestWithAllowMissingDependencies,
  5161. )
  5162. testDexpreoptWithApexes(t, bp, "", preparerAllowMissingDeps, fragment)
  5163. })
  5164. t.Run("prebuilt library preferred with source", func(t *testing.T) {
  5165. bp := `
  5166. prebuilt_apex {
  5167. name: "myapex",
  5168. arch: {
  5169. arm64: {
  5170. src: "myapex-arm64.apex",
  5171. },
  5172. arm: {
  5173. src: "myapex-arm.apex",
  5174. },
  5175. },
  5176. exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
  5177. }
  5178. prebuilt_bootclasspath_fragment {
  5179. name: "my-bootclasspath-fragment",
  5180. contents: ["libfoo", "libbar"],
  5181. apex_available: ["myapex"],
  5182. hidden_api: {
  5183. annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
  5184. metadata: "my-bootclasspath-fragment/metadata.csv",
  5185. index: "my-bootclasspath-fragment/index.csv",
  5186. signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
  5187. filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
  5188. filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
  5189. },
  5190. }
  5191. java_import {
  5192. name: "libfoo",
  5193. prefer: true,
  5194. jars: ["libfoo.jar"],
  5195. apex_available: ["myapex"],
  5196. permitted_packages: ["foo"],
  5197. }
  5198. java_library {
  5199. name: "libfoo",
  5200. srcs: ["foo/bar/MyClass.java"],
  5201. apex_available: ["myapex"],
  5202. }
  5203. java_sdk_library_import {
  5204. name: "libbar",
  5205. prefer: true,
  5206. public: {
  5207. jars: ["libbar.jar"],
  5208. },
  5209. apex_available: ["myapex"],
  5210. shared_library: false,
  5211. permitted_packages: ["bar"],
  5212. }
  5213. java_sdk_library {
  5214. name: "libbar",
  5215. srcs: ["foo/bar/MyClass.java"],
  5216. unsafe_ignore_missing_latest_api: true,
  5217. apex_available: ["myapex"],
  5218. }
  5219. `
  5220. ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
  5221. checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
  5222. checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
  5223. // Verify the correct module jars contribute to the hiddenapi index file.
  5224. checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
  5225. checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
  5226. my-bootclasspath-fragment/index.csv
  5227. out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
  5228. `)
  5229. })
  5230. t.Run("prebuilt with source apex preferred", func(t *testing.T) {
  5231. bp := `
  5232. apex {
  5233. name: "myapex",
  5234. key: "myapex.key",
  5235. java_libs: ["libfoo", "libbar"],
  5236. updatable: false,
  5237. }
  5238. apex_key {
  5239. name: "myapex.key",
  5240. public_key: "testkey.avbpubkey",
  5241. private_key: "testkey.pem",
  5242. }
  5243. prebuilt_apex {
  5244. name: "myapex",
  5245. arch: {
  5246. arm64: {
  5247. src: "myapex-arm64.apex",
  5248. },
  5249. arm: {
  5250. src: "myapex-arm.apex",
  5251. },
  5252. },
  5253. exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
  5254. }
  5255. prebuilt_bootclasspath_fragment {
  5256. name: "my-bootclasspath-fragment",
  5257. contents: ["libfoo", "libbar"],
  5258. apex_available: ["myapex"],
  5259. hidden_api: {
  5260. annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
  5261. metadata: "my-bootclasspath-fragment/metadata.csv",
  5262. index: "my-bootclasspath-fragment/index.csv",
  5263. signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
  5264. filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
  5265. filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
  5266. },
  5267. }
  5268. java_import {
  5269. name: "libfoo",
  5270. jars: ["libfoo.jar"],
  5271. apex_available: ["myapex"],
  5272. }
  5273. java_library {
  5274. name: "libfoo",
  5275. srcs: ["foo/bar/MyClass.java"],
  5276. apex_available: ["myapex"],
  5277. permitted_packages: ["foo"],
  5278. }
  5279. java_sdk_library_import {
  5280. name: "libbar",
  5281. public: {
  5282. jars: ["libbar.jar"],
  5283. },
  5284. apex_available: ["myapex"],
  5285. shared_library: false,
  5286. }
  5287. java_sdk_library {
  5288. name: "libbar",
  5289. srcs: ["foo/bar/MyClass.java"],
  5290. unsafe_ignore_missing_latest_api: true,
  5291. apex_available: ["myapex"],
  5292. permitted_packages: ["bar"],
  5293. }
  5294. `
  5295. ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
  5296. checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/libfoo/android_common_apex10000/hiddenapi/libfoo.jar")
  5297. checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/libbar/android_common_myapex/hiddenapi/libbar.jar")
  5298. // Verify the correct module jars contribute to the hiddenapi index file.
  5299. checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
  5300. checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
  5301. my-bootclasspath-fragment/index.csv
  5302. out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
  5303. `)
  5304. })
  5305. t.Run("prebuilt preferred with source apex disabled", func(t *testing.T) {
  5306. bp := `
  5307. apex {
  5308. name: "myapex",
  5309. enabled: false,
  5310. key: "myapex.key",
  5311. java_libs: ["libfoo", "libbar"],
  5312. }
  5313. apex_key {
  5314. name: "myapex.key",
  5315. public_key: "testkey.avbpubkey",
  5316. private_key: "testkey.pem",
  5317. }
  5318. prebuilt_apex {
  5319. name: "myapex",
  5320. arch: {
  5321. arm64: {
  5322. src: "myapex-arm64.apex",
  5323. },
  5324. arm: {
  5325. src: "myapex-arm.apex",
  5326. },
  5327. },
  5328. exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
  5329. }
  5330. prebuilt_bootclasspath_fragment {
  5331. name: "my-bootclasspath-fragment",
  5332. contents: ["libfoo", "libbar"],
  5333. apex_available: ["myapex"],
  5334. hidden_api: {
  5335. annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
  5336. metadata: "my-bootclasspath-fragment/metadata.csv",
  5337. index: "my-bootclasspath-fragment/index.csv",
  5338. signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
  5339. filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
  5340. filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
  5341. },
  5342. }
  5343. java_import {
  5344. name: "libfoo",
  5345. prefer: true,
  5346. jars: ["libfoo.jar"],
  5347. apex_available: ["myapex"],
  5348. permitted_packages: ["foo"],
  5349. }
  5350. java_library {
  5351. name: "libfoo",
  5352. srcs: ["foo/bar/MyClass.java"],
  5353. apex_available: ["myapex"],
  5354. }
  5355. java_sdk_library_import {
  5356. name: "libbar",
  5357. prefer: true,
  5358. public: {
  5359. jars: ["libbar.jar"],
  5360. },
  5361. apex_available: ["myapex"],
  5362. shared_library: false,
  5363. permitted_packages: ["bar"],
  5364. }
  5365. java_sdk_library {
  5366. name: "libbar",
  5367. srcs: ["foo/bar/MyClass.java"],
  5368. unsafe_ignore_missing_latest_api: true,
  5369. apex_available: ["myapex"],
  5370. }
  5371. `
  5372. ctx := testDexpreoptWithApexes(t, bp, "", preparer, fragment)
  5373. checkBootDexJarPath(t, ctx, "libfoo", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libfoo.jar")
  5374. checkBootDexJarPath(t, ctx, "libbar", "out/soong/.intermediates/myapex.deapexer/android_common/deapexer/javalib/libbar.jar")
  5375. // Verify the correct module jars contribute to the hiddenapi index file.
  5376. checkHiddenAPIIndexFromClassesInputs(t, ctx, ``)
  5377. checkHiddenAPIIndexFromFlagsInputs(t, ctx, `
  5378. my-bootclasspath-fragment/index.csv
  5379. out/soong/.intermediates/frameworks/base/boot/platform-bootclasspath/android_common/hiddenapi-monolithic/index-from-classes.csv
  5380. `)
  5381. })
  5382. }
  5383. func TestApexWithTests(t *testing.T) {
  5384. ctx := testApex(t, `
  5385. apex_test {
  5386. name: "myapex",
  5387. key: "myapex.key",
  5388. updatable: false,
  5389. tests: [
  5390. "mytest",
  5391. "mytests",
  5392. ],
  5393. }
  5394. apex_key {
  5395. name: "myapex.key",
  5396. public_key: "testkey.avbpubkey",
  5397. private_key: "testkey.pem",
  5398. }
  5399. filegroup {
  5400. name: "fg",
  5401. srcs: [
  5402. "baz",
  5403. "bar/baz"
  5404. ],
  5405. }
  5406. cc_test {
  5407. name: "mytest",
  5408. gtest: false,
  5409. srcs: ["mytest.cpp"],
  5410. relative_install_path: "test",
  5411. shared_libs: ["mylib"],
  5412. system_shared_libs: [],
  5413. static_executable: true,
  5414. stl: "none",
  5415. data: [":fg"],
  5416. }
  5417. cc_library {
  5418. name: "mylib",
  5419. srcs: ["mylib.cpp"],
  5420. system_shared_libs: [],
  5421. stl: "none",
  5422. }
  5423. filegroup {
  5424. name: "fg2",
  5425. srcs: [
  5426. "testdata/baz"
  5427. ],
  5428. }
  5429. cc_test {
  5430. name: "mytests",
  5431. gtest: false,
  5432. srcs: [
  5433. "mytest1.cpp",
  5434. "mytest2.cpp",
  5435. "mytest3.cpp",
  5436. ],
  5437. test_per_src: true,
  5438. relative_install_path: "test",
  5439. system_shared_libs: [],
  5440. static_executable: true,
  5441. stl: "none",
  5442. data: [
  5443. ":fg",
  5444. ":fg2",
  5445. ],
  5446. }
  5447. `)
  5448. apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
  5449. copyCmds := apexRule.Args["copy_commands"]
  5450. // Ensure that test dep (and their transitive dependencies) are copied into apex.
  5451. ensureContains(t, copyCmds, "image.apex/bin/test/mytest")
  5452. ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
  5453. //Ensure that test data are copied into apex.
  5454. ensureContains(t, copyCmds, "image.apex/bin/test/baz")
  5455. ensureContains(t, copyCmds, "image.apex/bin/test/bar/baz")
  5456. // Ensure that test deps built with `test_per_src` are copied into apex.
  5457. ensureContains(t, copyCmds, "image.apex/bin/test/mytest1")
  5458. ensureContains(t, copyCmds, "image.apex/bin/test/mytest2")
  5459. ensureContains(t, copyCmds, "image.apex/bin/test/mytest3")
  5460. // Ensure the module is correctly translated.
  5461. bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
  5462. data := android.AndroidMkDataForTest(t, ctx, bundle)
  5463. name := bundle.BaseModuleName()
  5464. prefix := "TARGET_"
  5465. var builder strings.Builder
  5466. data.Custom(&builder, name, prefix, "", data)
  5467. androidMk := builder.String()
  5468. ensureContains(t, androidMk, "LOCAL_MODULE := mytest.myapex\n")
  5469. ensureContains(t, androidMk, "LOCAL_MODULE := mytest1.myapex\n")
  5470. ensureContains(t, androidMk, "LOCAL_MODULE := mytest2.myapex\n")
  5471. ensureContains(t, androidMk, "LOCAL_MODULE := mytest3.myapex\n")
  5472. ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex\n")
  5473. ensureContains(t, androidMk, "LOCAL_MODULE := apex_pubkey.myapex\n")
  5474. ensureContains(t, androidMk, "LOCAL_MODULE := myapex\n")
  5475. flatBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
  5476. data = android.AndroidMkDataForTest(t, ctx, flatBundle)
  5477. data.Custom(&builder, name, prefix, "", data)
  5478. flatAndroidMk := builder.String()
  5479. ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :baz :bar/baz\n")
  5480. ensureContainsOnce(t, flatAndroidMk, "LOCAL_TEST_DATA := :testdata/baz\n")
  5481. }
  5482. func TestInstallExtraFlattenedApexes(t *testing.T) {
  5483. ctx := testApex(t, `
  5484. apex {
  5485. name: "myapex",
  5486. key: "myapex.key",
  5487. updatable: false,
  5488. }
  5489. apex_key {
  5490. name: "myapex.key",
  5491. public_key: "testkey.avbpubkey",
  5492. private_key: "testkey.pem",
  5493. }
  5494. `,
  5495. android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  5496. variables.InstallExtraFlattenedApexes = proptools.BoolPtr(true)
  5497. }),
  5498. )
  5499. ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
  5500. ensureListContains(t, ab.makeModulesToInstall, "myapex.flattened")
  5501. mk := android.AndroidMkDataForTest(t, ctx, ab)
  5502. var builder strings.Builder
  5503. mk.Custom(&builder, ab.Name(), "TARGET_", "", mk)
  5504. androidMk := builder.String()
  5505. ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex myapex.flattened\n")
  5506. }
  5507. func TestErrorsIfDepsAreNotEnabled(t *testing.T) {
  5508. testApexError(t, `module "myapex" .* depends on disabled module "libfoo"`, `
  5509. apex {
  5510. name: "myapex",
  5511. key: "myapex.key",
  5512. native_shared_libs: ["libfoo"],
  5513. }
  5514. apex_key {
  5515. name: "myapex.key",
  5516. public_key: "testkey.avbpubkey",
  5517. private_key: "testkey.pem",
  5518. }
  5519. cc_library {
  5520. name: "libfoo",
  5521. stl: "none",
  5522. system_shared_libs: [],
  5523. enabled: false,
  5524. apex_available: ["myapex"],
  5525. }
  5526. `)
  5527. testApexError(t, `module "myapex" .* depends on disabled module "myjar"`, `
  5528. apex {
  5529. name: "myapex",
  5530. key: "myapex.key",
  5531. java_libs: ["myjar"],
  5532. }
  5533. apex_key {
  5534. name: "myapex.key",
  5535. public_key: "testkey.avbpubkey",
  5536. private_key: "testkey.pem",
  5537. }
  5538. java_library {
  5539. name: "myjar",
  5540. srcs: ["foo/bar/MyClass.java"],
  5541. sdk_version: "none",
  5542. system_modules: "none",
  5543. enabled: false,
  5544. apex_available: ["myapex"],
  5545. }
  5546. `)
  5547. }
  5548. func TestApexWithJavaImport(t *testing.T) {
  5549. ctx := testApex(t, `
  5550. apex {
  5551. name: "myapex",
  5552. key: "myapex.key",
  5553. java_libs: ["myjavaimport"],
  5554. updatable: false,
  5555. }
  5556. apex_key {
  5557. name: "myapex.key",
  5558. public_key: "testkey.avbpubkey",
  5559. private_key: "testkey.pem",
  5560. }
  5561. java_import {
  5562. name: "myjavaimport",
  5563. apex_available: ["myapex"],
  5564. jars: ["my.jar"],
  5565. compile_dex: true,
  5566. }
  5567. `)
  5568. module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
  5569. apexRule := module.Rule("apexRule")
  5570. copyCmds := apexRule.Args["copy_commands"]
  5571. ensureContains(t, copyCmds, "image.apex/javalib/myjavaimport.jar")
  5572. }
  5573. func TestApexWithApps(t *testing.T) {
  5574. ctx := testApex(t, `
  5575. apex {
  5576. name: "myapex",
  5577. key: "myapex.key",
  5578. apps: [
  5579. "AppFoo",
  5580. "AppFooPriv",
  5581. ],
  5582. updatable: false,
  5583. }
  5584. apex_key {
  5585. name: "myapex.key",
  5586. public_key: "testkey.avbpubkey",
  5587. private_key: "testkey.pem",
  5588. }
  5589. android_app {
  5590. name: "AppFoo",
  5591. srcs: ["foo/bar/MyClass.java"],
  5592. sdk_version: "current",
  5593. system_modules: "none",
  5594. jni_libs: ["libjni"],
  5595. stl: "none",
  5596. apex_available: [ "myapex" ],
  5597. }
  5598. android_app {
  5599. name: "AppFooPriv",
  5600. srcs: ["foo/bar/MyClass.java"],
  5601. sdk_version: "current",
  5602. system_modules: "none",
  5603. privileged: true,
  5604. privapp_allowlist: "privapp_allowlist_com.android.AppFooPriv.xml",
  5605. stl: "none",
  5606. apex_available: [ "myapex" ],
  5607. }
  5608. cc_library_shared {
  5609. name: "libjni",
  5610. srcs: ["mylib.cpp"],
  5611. shared_libs: ["libfoo"],
  5612. stl: "none",
  5613. system_shared_libs: [],
  5614. apex_available: [ "myapex" ],
  5615. sdk_version: "current",
  5616. }
  5617. cc_library_shared {
  5618. name: "libfoo",
  5619. stl: "none",
  5620. system_shared_libs: [],
  5621. apex_available: [ "myapex" ],
  5622. sdk_version: "current",
  5623. }
  5624. `)
  5625. module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
  5626. apexRule := module.Rule("apexRule")
  5627. copyCmds := apexRule.Args["copy_commands"]
  5628. ensureContains(t, copyCmds, "image.apex/app/AppFoo@TEST.BUILD_ID/AppFoo.apk")
  5629. ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPriv@TEST.BUILD_ID/AppFooPriv.apk")
  5630. ensureContains(t, copyCmds, "image.apex/etc/permissions/privapp_allowlist_com.android.AppFooPriv.xml")
  5631. appZipRule := ctx.ModuleForTests("AppFoo", "android_common_apex10000").Description("zip jni libs")
  5632. // JNI libraries are uncompressed
  5633. if args := appZipRule.Args["jarArgs"]; !strings.Contains(args, "-L 0") {
  5634. t.Errorf("jni libs are not uncompressed for AppFoo")
  5635. }
  5636. // JNI libraries including transitive deps are
  5637. for _, jni := range []string{"libjni", "libfoo"} {
  5638. jniOutput := ctx.ModuleForTests(jni, "android_arm64_armv8-a_sdk_shared_apex10000").Module().(*cc.Module).OutputFile().RelativeToTop()
  5639. // ... embedded inside APK (jnilibs.zip)
  5640. ensureListContains(t, appZipRule.Implicits.Strings(), jniOutput.String())
  5641. // ... and not directly inside the APEX
  5642. ensureNotContains(t, copyCmds, "image.apex/lib64/"+jni+".so")
  5643. }
  5644. }
  5645. func TestApexWithAppImportBuildId(t *testing.T) {
  5646. invalidBuildIds := []string{"../", "a b", "a/b", "a/b/../c", "/a"}
  5647. for _, id := range invalidBuildIds {
  5648. message := fmt.Sprintf("Unable to use build id %s as filename suffix", id)
  5649. fixture := android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  5650. variables.BuildId = proptools.StringPtr(id)
  5651. })
  5652. testApexError(t, message, `apex {
  5653. name: "myapex",
  5654. key: "myapex.key",
  5655. apps: ["AppFooPrebuilt"],
  5656. updatable: false,
  5657. }
  5658. apex_key {
  5659. name: "myapex.key",
  5660. public_key: "testkey.avbpubkey",
  5661. private_key: "testkey.pem",
  5662. }
  5663. android_app_import {
  5664. name: "AppFooPrebuilt",
  5665. apk: "PrebuiltAppFoo.apk",
  5666. presigned: true,
  5667. apex_available: ["myapex"],
  5668. }
  5669. `, fixture)
  5670. }
  5671. }
  5672. func TestApexWithAppImports(t *testing.T) {
  5673. ctx := testApex(t, `
  5674. apex {
  5675. name: "myapex",
  5676. key: "myapex.key",
  5677. apps: [
  5678. "AppFooPrebuilt",
  5679. "AppFooPrivPrebuilt",
  5680. ],
  5681. updatable: false,
  5682. }
  5683. apex_key {
  5684. name: "myapex.key",
  5685. public_key: "testkey.avbpubkey",
  5686. private_key: "testkey.pem",
  5687. }
  5688. android_app_import {
  5689. name: "AppFooPrebuilt",
  5690. apk: "PrebuiltAppFoo.apk",
  5691. presigned: true,
  5692. dex_preopt: {
  5693. enabled: false,
  5694. },
  5695. apex_available: ["myapex"],
  5696. }
  5697. android_app_import {
  5698. name: "AppFooPrivPrebuilt",
  5699. apk: "PrebuiltAppFooPriv.apk",
  5700. privileged: true,
  5701. presigned: true,
  5702. dex_preopt: {
  5703. enabled: false,
  5704. },
  5705. filename: "AwesomePrebuiltAppFooPriv.apk",
  5706. apex_available: ["myapex"],
  5707. }
  5708. `)
  5709. module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
  5710. apexRule := module.Rule("apexRule")
  5711. copyCmds := apexRule.Args["copy_commands"]
  5712. ensureContains(t, copyCmds, "image.apex/app/AppFooPrebuilt@TEST.BUILD_ID/AppFooPrebuilt.apk")
  5713. ensureContains(t, copyCmds, "image.apex/priv-app/AppFooPrivPrebuilt@TEST.BUILD_ID/AwesomePrebuiltAppFooPriv.apk")
  5714. }
  5715. func TestApexWithAppImportsPrefer(t *testing.T) {
  5716. ctx := testApex(t, `
  5717. apex {
  5718. name: "myapex",
  5719. key: "myapex.key",
  5720. apps: [
  5721. "AppFoo",
  5722. ],
  5723. updatable: false,
  5724. }
  5725. apex_key {
  5726. name: "myapex.key",
  5727. public_key: "testkey.avbpubkey",
  5728. private_key: "testkey.pem",
  5729. }
  5730. android_app {
  5731. name: "AppFoo",
  5732. srcs: ["foo/bar/MyClass.java"],
  5733. sdk_version: "none",
  5734. system_modules: "none",
  5735. apex_available: [ "myapex" ],
  5736. }
  5737. android_app_import {
  5738. name: "AppFoo",
  5739. apk: "AppFooPrebuilt.apk",
  5740. filename: "AppFooPrebuilt.apk",
  5741. presigned: true,
  5742. prefer: true,
  5743. apex_available: ["myapex"],
  5744. }
  5745. `, withFiles(map[string][]byte{
  5746. "AppFooPrebuilt.apk": nil,
  5747. }))
  5748. ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
  5749. "app/AppFoo@TEST.BUILD_ID/AppFooPrebuilt.apk",
  5750. })
  5751. }
  5752. func TestApexWithTestHelperApp(t *testing.T) {
  5753. ctx := testApex(t, `
  5754. apex {
  5755. name: "myapex",
  5756. key: "myapex.key",
  5757. apps: [
  5758. "TesterHelpAppFoo",
  5759. ],
  5760. updatable: false,
  5761. }
  5762. apex_key {
  5763. name: "myapex.key",
  5764. public_key: "testkey.avbpubkey",
  5765. private_key: "testkey.pem",
  5766. }
  5767. android_test_helper_app {
  5768. name: "TesterHelpAppFoo",
  5769. srcs: ["foo/bar/MyClass.java"],
  5770. apex_available: [ "myapex" ],
  5771. }
  5772. `)
  5773. module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
  5774. apexRule := module.Rule("apexRule")
  5775. copyCmds := apexRule.Args["copy_commands"]
  5776. ensureContains(t, copyCmds, "image.apex/app/TesterHelpAppFoo@TEST.BUILD_ID/TesterHelpAppFoo.apk")
  5777. }
  5778. func TestApexPropertiesShouldBeDefaultable(t *testing.T) {
  5779. // libfoo's apex_available comes from cc_defaults
  5780. testApexError(t, `requires "libfoo" that doesn't list the APEX under 'apex_available'.`, `
  5781. apex {
  5782. name: "myapex",
  5783. key: "myapex.key",
  5784. native_shared_libs: ["libfoo"],
  5785. updatable: false,
  5786. }
  5787. apex_key {
  5788. name: "myapex.key",
  5789. public_key: "testkey.avbpubkey",
  5790. private_key: "testkey.pem",
  5791. }
  5792. apex {
  5793. name: "otherapex",
  5794. key: "myapex.key",
  5795. native_shared_libs: ["libfoo"],
  5796. updatable: false,
  5797. }
  5798. cc_defaults {
  5799. name: "libfoo-defaults",
  5800. apex_available: ["otherapex"],
  5801. }
  5802. cc_library {
  5803. name: "libfoo",
  5804. defaults: ["libfoo-defaults"],
  5805. stl: "none",
  5806. system_shared_libs: [],
  5807. }`)
  5808. }
  5809. func TestApexAvailable_DirectDep(t *testing.T) {
  5810. // libfoo is not available to myapex, but only to otherapex
  5811. testApexError(t, "requires \"libfoo\" that doesn't list the APEX under 'apex_available'.", `
  5812. apex {
  5813. name: "myapex",
  5814. key: "myapex.key",
  5815. native_shared_libs: ["libfoo"],
  5816. updatable: false,
  5817. }
  5818. apex_key {
  5819. name: "myapex.key",
  5820. public_key: "testkey.avbpubkey",
  5821. private_key: "testkey.pem",
  5822. }
  5823. apex {
  5824. name: "otherapex",
  5825. key: "otherapex.key",
  5826. native_shared_libs: ["libfoo"],
  5827. updatable: false,
  5828. }
  5829. apex_key {
  5830. name: "otherapex.key",
  5831. public_key: "testkey.avbpubkey",
  5832. private_key: "testkey.pem",
  5833. }
  5834. cc_library {
  5835. name: "libfoo",
  5836. stl: "none",
  5837. system_shared_libs: [],
  5838. apex_available: ["otherapex"],
  5839. }`)
  5840. }
  5841. func TestApexAvailable_IndirectDep(t *testing.T) {
  5842. // libbbaz is an indirect dep
  5843. testApexError(t, `requires "libbaz" that doesn't list the APEX under 'apex_available'.\n\nDependency path:
  5844. .*via tag apex\.dependencyTag\{"sharedLib"\}
  5845. .*-> libfoo.*link:shared.*
  5846. .*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
  5847. .*-> libbar.*link:shared.*
  5848. .*via tag cc\.libraryDependencyTag.*Kind:sharedLibraryDependency.*
  5849. .*-> libbaz.*link:shared.*`, `
  5850. apex {
  5851. name: "myapex",
  5852. key: "myapex.key",
  5853. native_shared_libs: ["libfoo"],
  5854. updatable: false,
  5855. }
  5856. apex_key {
  5857. name: "myapex.key",
  5858. public_key: "testkey.avbpubkey",
  5859. private_key: "testkey.pem",
  5860. }
  5861. cc_library {
  5862. name: "libfoo",
  5863. stl: "none",
  5864. shared_libs: ["libbar"],
  5865. system_shared_libs: [],
  5866. apex_available: ["myapex"],
  5867. }
  5868. cc_library {
  5869. name: "libbar",
  5870. stl: "none",
  5871. shared_libs: ["libbaz"],
  5872. system_shared_libs: [],
  5873. apex_available: ["myapex"],
  5874. }
  5875. cc_library {
  5876. name: "libbaz",
  5877. stl: "none",
  5878. system_shared_libs: [],
  5879. }`)
  5880. }
  5881. func TestApexAvailable_IndirectStaticDep(t *testing.T) {
  5882. testApex(t, `
  5883. apex {
  5884. name: "myapex",
  5885. key: "myapex.key",
  5886. native_shared_libs: ["libfoo"],
  5887. updatable: false,
  5888. }
  5889. apex_key {
  5890. name: "myapex.key",
  5891. public_key: "testkey.avbpubkey",
  5892. private_key: "testkey.pem",
  5893. }
  5894. cc_library {
  5895. name: "libfoo",
  5896. stl: "none",
  5897. static_libs: ["libbar"],
  5898. system_shared_libs: [],
  5899. apex_available: ["myapex"],
  5900. }
  5901. cc_library {
  5902. name: "libbar",
  5903. stl: "none",
  5904. shared_libs: ["libbaz"],
  5905. system_shared_libs: [],
  5906. apex_available: ["myapex"],
  5907. }
  5908. cc_library {
  5909. name: "libbaz",
  5910. stl: "none",
  5911. system_shared_libs: [],
  5912. }`)
  5913. testApexError(t, `requires "libbar" that doesn't list the APEX under 'apex_available'.`, `
  5914. apex {
  5915. name: "myapex",
  5916. key: "myapex.key",
  5917. native_shared_libs: ["libfoo"],
  5918. updatable: false,
  5919. }
  5920. apex_key {
  5921. name: "myapex.key",
  5922. public_key: "testkey.avbpubkey",
  5923. private_key: "testkey.pem",
  5924. }
  5925. cc_library {
  5926. name: "libfoo",
  5927. stl: "none",
  5928. static_libs: ["libbar"],
  5929. system_shared_libs: [],
  5930. apex_available: ["myapex"],
  5931. }
  5932. cc_library {
  5933. name: "libbar",
  5934. stl: "none",
  5935. system_shared_libs: [],
  5936. }`)
  5937. }
  5938. func TestApexAvailable_InvalidApexName(t *testing.T) {
  5939. testApexError(t, "\"otherapex\" is not a valid module name", `
  5940. apex {
  5941. name: "myapex",
  5942. key: "myapex.key",
  5943. native_shared_libs: ["libfoo"],
  5944. updatable: false,
  5945. }
  5946. apex_key {
  5947. name: "myapex.key",
  5948. public_key: "testkey.avbpubkey",
  5949. private_key: "testkey.pem",
  5950. }
  5951. cc_library {
  5952. name: "libfoo",
  5953. stl: "none",
  5954. system_shared_libs: [],
  5955. apex_available: ["otherapex"],
  5956. }`)
  5957. testApex(t, `
  5958. apex {
  5959. name: "myapex",
  5960. key: "myapex.key",
  5961. native_shared_libs: ["libfoo", "libbar"],
  5962. updatable: false,
  5963. }
  5964. apex_key {
  5965. name: "myapex.key",
  5966. public_key: "testkey.avbpubkey",
  5967. private_key: "testkey.pem",
  5968. }
  5969. cc_library {
  5970. name: "libfoo",
  5971. stl: "none",
  5972. system_shared_libs: [],
  5973. runtime_libs: ["libbaz"],
  5974. apex_available: ["myapex"],
  5975. }
  5976. cc_library {
  5977. name: "libbar",
  5978. stl: "none",
  5979. system_shared_libs: [],
  5980. apex_available: ["//apex_available:anyapex"],
  5981. }
  5982. cc_library {
  5983. name: "libbaz",
  5984. stl: "none",
  5985. system_shared_libs: [],
  5986. stubs: {
  5987. versions: ["10", "20", "30"],
  5988. },
  5989. }`)
  5990. }
  5991. func TestApexAvailable_CheckForPlatform(t *testing.T) {
  5992. ctx := testApex(t, `
  5993. apex {
  5994. name: "myapex",
  5995. key: "myapex.key",
  5996. native_shared_libs: ["libbar", "libbaz"],
  5997. updatable: false,
  5998. }
  5999. apex_key {
  6000. name: "myapex.key",
  6001. public_key: "testkey.avbpubkey",
  6002. private_key: "testkey.pem",
  6003. }
  6004. cc_library {
  6005. name: "libfoo",
  6006. stl: "none",
  6007. system_shared_libs: [],
  6008. shared_libs: ["libbar"],
  6009. apex_available: ["//apex_available:platform"],
  6010. }
  6011. cc_library {
  6012. name: "libfoo2",
  6013. stl: "none",
  6014. system_shared_libs: [],
  6015. shared_libs: ["libbaz"],
  6016. apex_available: ["//apex_available:platform"],
  6017. }
  6018. cc_library {
  6019. name: "libbar",
  6020. stl: "none",
  6021. system_shared_libs: [],
  6022. apex_available: ["myapex"],
  6023. }
  6024. cc_library {
  6025. name: "libbaz",
  6026. stl: "none",
  6027. system_shared_libs: [],
  6028. apex_available: ["myapex"],
  6029. stubs: {
  6030. versions: ["1"],
  6031. },
  6032. }`)
  6033. // libfoo shouldn't be available to platform even though it has "//apex_available:platform",
  6034. // because it depends on libbar which isn't available to platform
  6035. libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
  6036. if libfoo.NotAvailableForPlatform() != true {
  6037. t.Errorf("%q shouldn't be available to platform", libfoo.String())
  6038. }
  6039. // libfoo2 however can be available to platform because it depends on libbaz which provides
  6040. // stubs
  6041. libfoo2 := ctx.ModuleForTests("libfoo2", "android_arm64_armv8-a_shared").Module().(*cc.Module)
  6042. if libfoo2.NotAvailableForPlatform() == true {
  6043. t.Errorf("%q should be available to platform", libfoo2.String())
  6044. }
  6045. }
  6046. func TestApexAvailable_CreatedForApex(t *testing.T) {
  6047. ctx := testApex(t, `
  6048. apex {
  6049. name: "myapex",
  6050. key: "myapex.key",
  6051. native_shared_libs: ["libfoo"],
  6052. updatable: false,
  6053. }
  6054. apex_key {
  6055. name: "myapex.key",
  6056. public_key: "testkey.avbpubkey",
  6057. private_key: "testkey.pem",
  6058. }
  6059. cc_library {
  6060. name: "libfoo",
  6061. stl: "none",
  6062. system_shared_libs: [],
  6063. apex_available: ["myapex"],
  6064. static: {
  6065. apex_available: ["//apex_available:platform"],
  6066. },
  6067. }`)
  6068. libfooShared := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module().(*cc.Module)
  6069. if libfooShared.NotAvailableForPlatform() != true {
  6070. t.Errorf("%q shouldn't be available to platform", libfooShared.String())
  6071. }
  6072. libfooStatic := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*cc.Module)
  6073. if libfooStatic.NotAvailableForPlatform() != false {
  6074. t.Errorf("%q should be available to platform", libfooStatic.String())
  6075. }
  6076. }
  6077. func TestOverrideApex(t *testing.T) {
  6078. ctx := testApex(t, `
  6079. apex {
  6080. name: "myapex",
  6081. key: "myapex.key",
  6082. apps: ["app"],
  6083. bpfs: ["bpf"],
  6084. prebuilts: ["myetc"],
  6085. overrides: ["oldapex"],
  6086. updatable: false,
  6087. }
  6088. override_apex {
  6089. name: "override_myapex",
  6090. base: "myapex",
  6091. apps: ["override_app"],
  6092. bpfs: ["overrideBpf"],
  6093. prebuilts: ["override_myetc"],
  6094. overrides: ["unknownapex"],
  6095. logging_parent: "com.foo.bar",
  6096. package_name: "test.overridden.package",
  6097. key: "mynewapex.key",
  6098. certificate: ":myapex.certificate",
  6099. }
  6100. apex_key {
  6101. name: "myapex.key",
  6102. public_key: "testkey.avbpubkey",
  6103. private_key: "testkey.pem",
  6104. }
  6105. apex_key {
  6106. name: "mynewapex.key",
  6107. public_key: "testkey2.avbpubkey",
  6108. private_key: "testkey2.pem",
  6109. }
  6110. android_app_certificate {
  6111. name: "myapex.certificate",
  6112. certificate: "testkey",
  6113. }
  6114. android_app {
  6115. name: "app",
  6116. srcs: ["foo/bar/MyClass.java"],
  6117. package_name: "foo",
  6118. sdk_version: "none",
  6119. system_modules: "none",
  6120. apex_available: [ "myapex" ],
  6121. }
  6122. override_android_app {
  6123. name: "override_app",
  6124. base: "app",
  6125. package_name: "bar",
  6126. }
  6127. bpf {
  6128. name: "bpf",
  6129. srcs: ["bpf.c"],
  6130. }
  6131. bpf {
  6132. name: "overrideBpf",
  6133. srcs: ["overrideBpf.c"],
  6134. }
  6135. prebuilt_etc {
  6136. name: "myetc",
  6137. src: "myprebuilt",
  6138. }
  6139. prebuilt_etc {
  6140. name: "override_myetc",
  6141. src: "override_myprebuilt",
  6142. }
  6143. `, withManifestPackageNameOverrides([]string{"myapex:com.android.myapex"}))
  6144. originalVariant := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(android.OverridableModule)
  6145. overriddenVariant := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Module().(android.OverridableModule)
  6146. if originalVariant.GetOverriddenBy() != "" {
  6147. t.Errorf("GetOverriddenBy should be empty, but was %q", originalVariant.GetOverriddenBy())
  6148. }
  6149. if overriddenVariant.GetOverriddenBy() != "override_myapex" {
  6150. t.Errorf("GetOverriddenBy should be \"override_myapex\", but was %q", overriddenVariant.GetOverriddenBy())
  6151. }
  6152. module := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image")
  6153. apexRule := module.Rule("apexRule")
  6154. copyCmds := apexRule.Args["copy_commands"]
  6155. ensureNotContains(t, copyCmds, "image.apex/app/app@TEST.BUILD_ID/app.apk")
  6156. ensureContains(t, copyCmds, "image.apex/app/override_app@TEST.BUILD_ID/override_app.apk")
  6157. ensureNotContains(t, copyCmds, "image.apex/etc/bpf/bpf.o")
  6158. ensureContains(t, copyCmds, "image.apex/etc/bpf/overrideBpf.o")
  6159. ensureNotContains(t, copyCmds, "image.apex/etc/myetc")
  6160. ensureContains(t, copyCmds, "image.apex/etc/override_myetc")
  6161. apexBundle := module.Module().(*apexBundle)
  6162. name := apexBundle.Name()
  6163. if name != "override_myapex" {
  6164. t.Errorf("name should be \"override_myapex\", but was %q", name)
  6165. }
  6166. if apexBundle.overridableProperties.Logging_parent != "com.foo.bar" {
  6167. t.Errorf("override_myapex should have logging parent (com.foo.bar), but was %q.", apexBundle.overridableProperties.Logging_parent)
  6168. }
  6169. optFlags := apexRule.Args["opt_flags"]
  6170. ensureContains(t, optFlags, "--override_apk_package_name test.overridden.package")
  6171. ensureContains(t, optFlags, "--pubkey testkey2.avbpubkey")
  6172. signApkRule := module.Rule("signapk")
  6173. ensureEquals(t, signApkRule.Args["certificates"], "testkey.x509.pem testkey.pk8")
  6174. data := android.AndroidMkDataForTest(t, ctx, apexBundle)
  6175. var builder strings.Builder
  6176. data.Custom(&builder, name, "TARGET_", "", data)
  6177. androidMk := builder.String()
  6178. ensureContains(t, androidMk, "LOCAL_MODULE := override_app.override_myapex")
  6179. ensureContains(t, androidMk, "LOCAL_MODULE := overrideBpf.o.override_myapex")
  6180. ensureContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.override_myapex")
  6181. ensureContains(t, androidMk, "LOCAL_MODULE_STEM := override_myapex.apex")
  6182. ensureContains(t, androidMk, "LOCAL_OVERRIDES_MODULES := unknownapex myapex")
  6183. ensureNotContains(t, androidMk, "LOCAL_MODULE := app.myapex")
  6184. ensureNotContains(t, androidMk, "LOCAL_MODULE := bpf.myapex")
  6185. ensureNotContains(t, androidMk, "LOCAL_MODULE := override_app.myapex")
  6186. ensureNotContains(t, androidMk, "LOCAL_MODULE := apex_manifest.pb.myapex")
  6187. ensureNotContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.apex")
  6188. }
  6189. func TestMinSdkVersionOverride(t *testing.T) {
  6190. // Override from 29 to 31
  6191. minSdkOverride31 := "31"
  6192. ctx := testApex(t, `
  6193. apex {
  6194. name: "myapex",
  6195. key: "myapex.key",
  6196. native_shared_libs: ["mylib"],
  6197. updatable: true,
  6198. min_sdk_version: "29"
  6199. }
  6200. override_apex {
  6201. name: "override_myapex",
  6202. base: "myapex",
  6203. logging_parent: "com.foo.bar",
  6204. package_name: "test.overridden.package"
  6205. }
  6206. apex_key {
  6207. name: "myapex.key",
  6208. public_key: "testkey.avbpubkey",
  6209. private_key: "testkey.pem",
  6210. }
  6211. cc_library {
  6212. name: "mylib",
  6213. srcs: ["mylib.cpp"],
  6214. runtime_libs: ["libbar"],
  6215. system_shared_libs: [],
  6216. stl: "none",
  6217. apex_available: [ "myapex" ],
  6218. min_sdk_version: "apex_inherit"
  6219. }
  6220. cc_library {
  6221. name: "libbar",
  6222. srcs: ["mylib.cpp"],
  6223. system_shared_libs: [],
  6224. stl: "none",
  6225. apex_available: [ "myapex" ],
  6226. min_sdk_version: "apex_inherit"
  6227. }
  6228. `, withApexGlobalMinSdkVersionOverride(&minSdkOverride31))
  6229. apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
  6230. copyCmds := apexRule.Args["copy_commands"]
  6231. // Ensure that direct non-stubs dep is always included
  6232. ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
  6233. // Ensure that runtime_libs dep in included
  6234. ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
  6235. // Ensure libraries target overridden min_sdk_version value
  6236. ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
  6237. }
  6238. func TestMinSdkVersionOverrideToLowerVersionNoOp(t *testing.T) {
  6239. // Attempt to override from 31 to 29, should be a NOOP
  6240. minSdkOverride29 := "29"
  6241. ctx := testApex(t, `
  6242. apex {
  6243. name: "myapex",
  6244. key: "myapex.key",
  6245. native_shared_libs: ["mylib"],
  6246. updatable: true,
  6247. min_sdk_version: "31"
  6248. }
  6249. override_apex {
  6250. name: "override_myapex",
  6251. base: "myapex",
  6252. logging_parent: "com.foo.bar",
  6253. package_name: "test.overridden.package"
  6254. }
  6255. apex_key {
  6256. name: "myapex.key",
  6257. public_key: "testkey.avbpubkey",
  6258. private_key: "testkey.pem",
  6259. }
  6260. cc_library {
  6261. name: "mylib",
  6262. srcs: ["mylib.cpp"],
  6263. runtime_libs: ["libbar"],
  6264. system_shared_libs: [],
  6265. stl: "none",
  6266. apex_available: [ "myapex" ],
  6267. min_sdk_version: "apex_inherit"
  6268. }
  6269. cc_library {
  6270. name: "libbar",
  6271. srcs: ["mylib.cpp"],
  6272. system_shared_libs: [],
  6273. stl: "none",
  6274. apex_available: [ "myapex" ],
  6275. min_sdk_version: "apex_inherit"
  6276. }
  6277. `, withApexGlobalMinSdkVersionOverride(&minSdkOverride29))
  6278. apexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule")
  6279. copyCmds := apexRule.Args["copy_commands"]
  6280. // Ensure that direct non-stubs dep is always included
  6281. ensureContains(t, copyCmds, "image.apex/lib64/mylib.so")
  6282. // Ensure that runtime_libs dep in included
  6283. ensureContains(t, copyCmds, "image.apex/lib64/libbar.so")
  6284. // Ensure libraries target the original min_sdk_version value rather than the overridden
  6285. ensureListContains(t, ctx.ModuleVariantsForTests("libbar"), "android_arm64_armv8-a_shared_apex31")
  6286. }
  6287. func TestLegacyAndroid10Support(t *testing.T) {
  6288. ctx := testApex(t, `
  6289. apex {
  6290. name: "myapex",
  6291. key: "myapex.key",
  6292. native_shared_libs: ["mylib"],
  6293. min_sdk_version: "29",
  6294. }
  6295. apex_key {
  6296. name: "myapex.key",
  6297. public_key: "testkey.avbpubkey",
  6298. private_key: "testkey.pem",
  6299. }
  6300. cc_library {
  6301. name: "mylib",
  6302. srcs: ["mylib.cpp"],
  6303. stl: "libc++",
  6304. system_shared_libs: [],
  6305. apex_available: [ "myapex" ],
  6306. min_sdk_version: "29",
  6307. }
  6308. `, withUnbundledBuild)
  6309. module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
  6310. args := module.Rule("apexRule").Args
  6311. ensureContains(t, args["opt_flags"], "--manifest_json "+module.Output("apex_manifest.json").Output.String())
  6312. ensureNotContains(t, args["opt_flags"], "--no_hashtree")
  6313. // The copies of the libraries in the apex should have one more dependency than
  6314. // the ones outside the apex, namely the unwinder. Ideally we should check
  6315. // the dependency names directly here but for some reason the names are blank in
  6316. // this test.
  6317. for _, lib := range []string{"libc++", "mylib"} {
  6318. apexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared_apex29").Rule("ld").Implicits
  6319. nonApexImplicits := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld").Implicits
  6320. if len(apexImplicits) != len(nonApexImplicits)+1 {
  6321. t.Errorf("%q missing unwinder dep", lib)
  6322. }
  6323. }
  6324. }
  6325. var filesForSdkLibrary = android.MockFS{
  6326. "api/current.txt": nil,
  6327. "api/removed.txt": nil,
  6328. "api/system-current.txt": nil,
  6329. "api/system-removed.txt": nil,
  6330. "api/test-current.txt": nil,
  6331. "api/test-removed.txt": nil,
  6332. "100/public/api/foo.txt": nil,
  6333. "100/public/api/foo-removed.txt": nil,
  6334. "100/system/api/foo.txt": nil,
  6335. "100/system/api/foo-removed.txt": nil,
  6336. // For java_sdk_library_import
  6337. "a.jar": nil,
  6338. }
  6339. func TestJavaSDKLibrary(t *testing.T) {
  6340. ctx := testApex(t, `
  6341. apex {
  6342. name: "myapex",
  6343. key: "myapex.key",
  6344. java_libs: ["foo"],
  6345. updatable: false,
  6346. }
  6347. apex_key {
  6348. name: "myapex.key",
  6349. public_key: "testkey.avbpubkey",
  6350. private_key: "testkey.pem",
  6351. }
  6352. java_sdk_library {
  6353. name: "foo",
  6354. srcs: ["a.java"],
  6355. api_packages: ["foo"],
  6356. apex_available: [ "myapex" ],
  6357. }
  6358. prebuilt_apis {
  6359. name: "sdk",
  6360. api_dirs: ["100"],
  6361. }
  6362. `, withFiles(filesForSdkLibrary))
  6363. // java_sdk_library installs both impl jar and permission XML
  6364. ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
  6365. "javalib/foo.jar",
  6366. "etc/permissions/foo.xml",
  6367. })
  6368. // Permission XML should point to the activated path of impl jar of java_sdk_library
  6369. sdkLibrary := ctx.ModuleForTests("foo.xml", "android_common_myapex").Rule("java_sdk_xml")
  6370. ensureMatches(t, sdkLibrary.RuleParams.Command, `<library\\n\s+name=\\\"foo\\\"\\n\s+file=\\\"/apex/myapex/javalib/foo.jar\\\"`)
  6371. }
  6372. func TestJavaSDKLibrary_WithinApex(t *testing.T) {
  6373. ctx := testApex(t, `
  6374. apex {
  6375. name: "myapex",
  6376. key: "myapex.key",
  6377. java_libs: ["foo", "bar"],
  6378. updatable: false,
  6379. }
  6380. apex_key {
  6381. name: "myapex.key",
  6382. public_key: "testkey.avbpubkey",
  6383. private_key: "testkey.pem",
  6384. }
  6385. java_sdk_library {
  6386. name: "foo",
  6387. srcs: ["a.java"],
  6388. api_packages: ["foo"],
  6389. apex_available: ["myapex"],
  6390. sdk_version: "none",
  6391. system_modules: "none",
  6392. }
  6393. java_library {
  6394. name: "bar",
  6395. srcs: ["a.java"],
  6396. libs: ["foo"],
  6397. apex_available: ["myapex"],
  6398. sdk_version: "none",
  6399. system_modules: "none",
  6400. }
  6401. prebuilt_apis {
  6402. name: "sdk",
  6403. api_dirs: ["100"],
  6404. }
  6405. `, withFiles(filesForSdkLibrary))
  6406. // java_sdk_library installs both impl jar and permission XML
  6407. ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
  6408. "javalib/bar.jar",
  6409. "javalib/foo.jar",
  6410. "etc/permissions/foo.xml",
  6411. })
  6412. // The bar library should depend on the implementation jar.
  6413. barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
  6414. if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
  6415. t.Errorf("expected %q, found %#q", expected, actual)
  6416. }
  6417. }
  6418. func TestJavaSDKLibrary_CrossBoundary(t *testing.T) {
  6419. ctx := testApex(t, `
  6420. apex {
  6421. name: "myapex",
  6422. key: "myapex.key",
  6423. java_libs: ["foo"],
  6424. updatable: false,
  6425. }
  6426. apex_key {
  6427. name: "myapex.key",
  6428. public_key: "testkey.avbpubkey",
  6429. private_key: "testkey.pem",
  6430. }
  6431. java_sdk_library {
  6432. name: "foo",
  6433. srcs: ["a.java"],
  6434. api_packages: ["foo"],
  6435. apex_available: ["myapex"],
  6436. sdk_version: "none",
  6437. system_modules: "none",
  6438. }
  6439. java_library {
  6440. name: "bar",
  6441. srcs: ["a.java"],
  6442. libs: ["foo"],
  6443. sdk_version: "none",
  6444. system_modules: "none",
  6445. }
  6446. prebuilt_apis {
  6447. name: "sdk",
  6448. api_dirs: ["100"],
  6449. }
  6450. `, withFiles(filesForSdkLibrary))
  6451. // java_sdk_library installs both impl jar and permission XML
  6452. ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
  6453. "javalib/foo.jar",
  6454. "etc/permissions/foo.xml",
  6455. })
  6456. // The bar library should depend on the stubs jar.
  6457. barLibrary := ctx.ModuleForTests("bar", "android_common").Rule("javac")
  6458. if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.stubs\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
  6459. t.Errorf("expected %q, found %#q", expected, actual)
  6460. }
  6461. }
  6462. func TestJavaSDKLibrary_ImportPreferred(t *testing.T) {
  6463. ctx := testApex(t, `
  6464. prebuilt_apis {
  6465. name: "sdk",
  6466. api_dirs: ["100"],
  6467. }`,
  6468. withFiles(map[string][]byte{
  6469. "apex/a.java": nil,
  6470. "apex/apex_manifest.json": nil,
  6471. "apex/Android.bp": []byte(`
  6472. package {
  6473. default_visibility: ["//visibility:private"],
  6474. }
  6475. apex {
  6476. name: "myapex",
  6477. key: "myapex.key",
  6478. java_libs: ["foo", "bar"],
  6479. updatable: false,
  6480. }
  6481. apex_key {
  6482. name: "myapex.key",
  6483. public_key: "testkey.avbpubkey",
  6484. private_key: "testkey.pem",
  6485. }
  6486. java_library {
  6487. name: "bar",
  6488. srcs: ["a.java"],
  6489. libs: ["foo"],
  6490. apex_available: ["myapex"],
  6491. sdk_version: "none",
  6492. system_modules: "none",
  6493. }
  6494. `),
  6495. "source/a.java": nil,
  6496. "source/api/current.txt": nil,
  6497. "source/api/removed.txt": nil,
  6498. "source/Android.bp": []byte(`
  6499. package {
  6500. default_visibility: ["//visibility:private"],
  6501. }
  6502. java_sdk_library {
  6503. name: "foo",
  6504. visibility: ["//apex"],
  6505. srcs: ["a.java"],
  6506. api_packages: ["foo"],
  6507. apex_available: ["myapex"],
  6508. sdk_version: "none",
  6509. system_modules: "none",
  6510. public: {
  6511. enabled: true,
  6512. },
  6513. }
  6514. `),
  6515. "prebuilt/a.jar": nil,
  6516. "prebuilt/Android.bp": []byte(`
  6517. package {
  6518. default_visibility: ["//visibility:private"],
  6519. }
  6520. java_sdk_library_import {
  6521. name: "foo",
  6522. visibility: ["//apex", "//source"],
  6523. apex_available: ["myapex"],
  6524. prefer: true,
  6525. public: {
  6526. jars: ["a.jar"],
  6527. },
  6528. }
  6529. `),
  6530. }), withFiles(filesForSdkLibrary),
  6531. )
  6532. // java_sdk_library installs both impl jar and permission XML
  6533. ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
  6534. "javalib/bar.jar",
  6535. "javalib/foo.jar",
  6536. "etc/permissions/foo.xml",
  6537. })
  6538. // The bar library should depend on the implementation jar.
  6539. barLibrary := ctx.ModuleForTests("bar", "android_common_myapex").Rule("javac")
  6540. if expected, actual := `^-classpath [^:]*/turbine-combined/foo\.impl\.jar$`, barLibrary.Args["classpath"]; !regexp.MustCompile(expected).MatchString(actual) {
  6541. t.Errorf("expected %q, found %#q", expected, actual)
  6542. }
  6543. }
  6544. func TestJavaSDKLibrary_ImportOnly(t *testing.T) {
  6545. testApexError(t, `java_libs: "foo" is not configured to be compiled into dex`, `
  6546. apex {
  6547. name: "myapex",
  6548. key: "myapex.key",
  6549. java_libs: ["foo"],
  6550. updatable: false,
  6551. }
  6552. apex_key {
  6553. name: "myapex.key",
  6554. public_key: "testkey.avbpubkey",
  6555. private_key: "testkey.pem",
  6556. }
  6557. java_sdk_library_import {
  6558. name: "foo",
  6559. apex_available: ["myapex"],
  6560. prefer: true,
  6561. public: {
  6562. jars: ["a.jar"],
  6563. },
  6564. }
  6565. `, withFiles(filesForSdkLibrary))
  6566. }
  6567. func TestCompatConfig(t *testing.T) {
  6568. result := android.GroupFixturePreparers(
  6569. prepareForApexTest,
  6570. java.PrepareForTestWithPlatformCompatConfig,
  6571. ).RunTestWithBp(t, `
  6572. apex {
  6573. name: "myapex",
  6574. key: "myapex.key",
  6575. compat_configs: ["myjar-platform-compat-config"],
  6576. java_libs: ["myjar"],
  6577. updatable: false,
  6578. }
  6579. apex_key {
  6580. name: "myapex.key",
  6581. public_key: "testkey.avbpubkey",
  6582. private_key: "testkey.pem",
  6583. }
  6584. platform_compat_config {
  6585. name: "myjar-platform-compat-config",
  6586. src: ":myjar",
  6587. }
  6588. java_library {
  6589. name: "myjar",
  6590. srcs: ["foo/bar/MyClass.java"],
  6591. sdk_version: "none",
  6592. system_modules: "none",
  6593. apex_available: [ "myapex" ],
  6594. }
  6595. // Make sure that a preferred prebuilt does not affect the apex contents.
  6596. prebuilt_platform_compat_config {
  6597. name: "myjar-platform-compat-config",
  6598. metadata: "compat-config/metadata.xml",
  6599. prefer: true,
  6600. }
  6601. `)
  6602. ctx := result.TestContext
  6603. ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
  6604. "etc/compatconfig/myjar-platform-compat-config.xml",
  6605. "javalib/myjar.jar",
  6606. })
  6607. }
  6608. func TestNoDupeApexFiles(t *testing.T) {
  6609. android.GroupFixturePreparers(
  6610. android.PrepareForTestWithAndroidBuildComponents,
  6611. PrepareForTestWithApexBuildComponents,
  6612. prepareForTestWithMyapex,
  6613. prebuilt_etc.PrepareForTestWithPrebuiltEtc,
  6614. ).
  6615. ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern("is provided by two different files")).
  6616. RunTestWithBp(t, `
  6617. apex {
  6618. name: "myapex",
  6619. key: "myapex.key",
  6620. prebuilts: ["foo", "bar"],
  6621. updatable: false,
  6622. }
  6623. apex_key {
  6624. name: "myapex.key",
  6625. public_key: "testkey.avbpubkey",
  6626. private_key: "testkey.pem",
  6627. }
  6628. prebuilt_etc {
  6629. name: "foo",
  6630. src: "myprebuilt",
  6631. filename_from_src: true,
  6632. }
  6633. prebuilt_etc {
  6634. name: "bar",
  6635. src: "myprebuilt",
  6636. filename_from_src: true,
  6637. }
  6638. `)
  6639. }
  6640. func TestRejectNonInstallableJavaLibrary(t *testing.T) {
  6641. testApexError(t, `"myjar" is not configured to be compiled into dex`, `
  6642. apex {
  6643. name: "myapex",
  6644. key: "myapex.key",
  6645. java_libs: ["myjar"],
  6646. updatable: false,
  6647. }
  6648. apex_key {
  6649. name: "myapex.key",
  6650. public_key: "testkey.avbpubkey",
  6651. private_key: "testkey.pem",
  6652. }
  6653. java_library {
  6654. name: "myjar",
  6655. srcs: ["foo/bar/MyClass.java"],
  6656. sdk_version: "none",
  6657. system_modules: "none",
  6658. compile_dex: false,
  6659. apex_available: ["myapex"],
  6660. }
  6661. `)
  6662. }
  6663. func TestCarryRequiredModuleNames(t *testing.T) {
  6664. ctx := testApex(t, `
  6665. apex {
  6666. name: "myapex",
  6667. key: "myapex.key",
  6668. native_shared_libs: ["mylib"],
  6669. updatable: false,
  6670. }
  6671. apex_key {
  6672. name: "myapex.key",
  6673. public_key: "testkey.avbpubkey",
  6674. private_key: "testkey.pem",
  6675. }
  6676. cc_library {
  6677. name: "mylib",
  6678. srcs: ["mylib.cpp"],
  6679. system_shared_libs: [],
  6680. stl: "none",
  6681. required: ["a", "b"],
  6682. host_required: ["c", "d"],
  6683. target_required: ["e", "f"],
  6684. apex_available: [ "myapex" ],
  6685. }
  6686. `)
  6687. apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
  6688. data := android.AndroidMkDataForTest(t, ctx, apexBundle)
  6689. name := apexBundle.BaseModuleName()
  6690. prefix := "TARGET_"
  6691. var builder strings.Builder
  6692. data.Custom(&builder, name, prefix, "", data)
  6693. androidMk := builder.String()
  6694. ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex a b\n")
  6695. ensureContains(t, androidMk, "LOCAL_HOST_REQUIRED_MODULES := c d\n")
  6696. ensureContains(t, androidMk, "LOCAL_TARGET_REQUIRED_MODULES := e f\n")
  6697. }
  6698. func TestSymlinksFromApexToSystem(t *testing.T) {
  6699. bp := `
  6700. apex {
  6701. name: "myapex",
  6702. key: "myapex.key",
  6703. native_shared_libs: ["mylib"],
  6704. java_libs: ["myjar"],
  6705. updatable: false,
  6706. }
  6707. apex {
  6708. name: "myapex.updatable",
  6709. key: "myapex.key",
  6710. native_shared_libs: ["mylib"],
  6711. java_libs: ["myjar"],
  6712. updatable: true,
  6713. min_sdk_version: "33",
  6714. }
  6715. apex_key {
  6716. name: "myapex.key",
  6717. public_key: "testkey.avbpubkey",
  6718. private_key: "testkey.pem",
  6719. }
  6720. cc_library {
  6721. name: "mylib",
  6722. srcs: ["mylib.cpp"],
  6723. shared_libs: [
  6724. "myotherlib",
  6725. "myotherlib_ext",
  6726. ],
  6727. system_shared_libs: [],
  6728. stl: "none",
  6729. apex_available: [
  6730. "myapex",
  6731. "myapex.updatable",
  6732. "//apex_available:platform",
  6733. ],
  6734. min_sdk_version: "33",
  6735. }
  6736. cc_library {
  6737. name: "myotherlib",
  6738. srcs: ["mylib.cpp"],
  6739. system_shared_libs: [],
  6740. stl: "none",
  6741. apex_available: [
  6742. "myapex",
  6743. "myapex.updatable",
  6744. "//apex_available:platform",
  6745. ],
  6746. min_sdk_version: "33",
  6747. }
  6748. cc_library {
  6749. name: "myotherlib_ext",
  6750. srcs: ["mylib.cpp"],
  6751. system_shared_libs: [],
  6752. system_ext_specific: true,
  6753. stl: "none",
  6754. apex_available: [
  6755. "myapex",
  6756. "myapex.updatable",
  6757. "//apex_available:platform",
  6758. ],
  6759. min_sdk_version: "33",
  6760. }
  6761. java_library {
  6762. name: "myjar",
  6763. srcs: ["foo/bar/MyClass.java"],
  6764. sdk_version: "none",
  6765. system_modules: "none",
  6766. libs: ["myotherjar"],
  6767. apex_available: [
  6768. "myapex",
  6769. "myapex.updatable",
  6770. "//apex_available:platform",
  6771. ],
  6772. min_sdk_version: "33",
  6773. }
  6774. java_library {
  6775. name: "myotherjar",
  6776. srcs: ["foo/bar/MyClass.java"],
  6777. sdk_version: "none",
  6778. system_modules: "none",
  6779. apex_available: [
  6780. "myapex",
  6781. "myapex.updatable",
  6782. "//apex_available:platform",
  6783. ],
  6784. min_sdk_version: "33",
  6785. }
  6786. `
  6787. ensureRealfileExists := func(t *testing.T, files []fileInApex, file string) {
  6788. for _, f := range files {
  6789. if f.path == file {
  6790. if f.isLink {
  6791. t.Errorf("%q is not a real file", file)
  6792. }
  6793. return
  6794. }
  6795. }
  6796. t.Errorf("%q is not found", file)
  6797. }
  6798. ensureSymlinkExists := func(t *testing.T, files []fileInApex, file string, target string) {
  6799. for _, f := range files {
  6800. if f.path == file {
  6801. if !f.isLink {
  6802. t.Errorf("%q is not a symlink", file)
  6803. }
  6804. if f.src != target {
  6805. t.Errorf("expected symlink target to be %q, got %q", target, f.src)
  6806. }
  6807. return
  6808. }
  6809. }
  6810. t.Errorf("%q is not found", file)
  6811. }
  6812. // For unbundled build, symlink shouldn't exist regardless of whether an APEX
  6813. // is updatable or not
  6814. ctx := testApex(t, bp, withUnbundledBuild)
  6815. files := getFiles(t, ctx, "myapex", "android_common_myapex_image")
  6816. ensureRealfileExists(t, files, "javalib/myjar.jar")
  6817. ensureRealfileExists(t, files, "lib64/mylib.so")
  6818. ensureRealfileExists(t, files, "lib64/myotherlib.so")
  6819. ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
  6820. files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
  6821. ensureRealfileExists(t, files, "javalib/myjar.jar")
  6822. ensureRealfileExists(t, files, "lib64/mylib.so")
  6823. ensureRealfileExists(t, files, "lib64/myotherlib.so")
  6824. ensureRealfileExists(t, files, "lib64/myotherlib_ext.so")
  6825. // For bundled build, symlink to the system for the non-updatable APEXes only
  6826. ctx = testApex(t, bp)
  6827. files = getFiles(t, ctx, "myapex", "android_common_myapex_image")
  6828. ensureRealfileExists(t, files, "javalib/myjar.jar")
  6829. ensureRealfileExists(t, files, "lib64/mylib.so")
  6830. ensureSymlinkExists(t, files, "lib64/myotherlib.so", "/system/lib64/myotherlib.so") // this is symlink
  6831. ensureSymlinkExists(t, files, "lib64/myotherlib_ext.so", "/system_ext/lib64/myotherlib_ext.so") // this is symlink
  6832. files = getFiles(t, ctx, "myapex.updatable", "android_common_myapex.updatable_image")
  6833. ensureRealfileExists(t, files, "javalib/myjar.jar")
  6834. ensureRealfileExists(t, files, "lib64/mylib.so")
  6835. ensureRealfileExists(t, files, "lib64/myotherlib.so") // this is a real file
  6836. ensureRealfileExists(t, files, "lib64/myotherlib_ext.so") // this is a real file
  6837. }
  6838. func TestSymlinksFromApexToSystemRequiredModuleNames(t *testing.T) {
  6839. ctx := testApex(t, `
  6840. apex {
  6841. name: "myapex",
  6842. key: "myapex.key",
  6843. native_shared_libs: ["mylib"],
  6844. updatable: false,
  6845. }
  6846. apex_key {
  6847. name: "myapex.key",
  6848. public_key: "testkey.avbpubkey",
  6849. private_key: "testkey.pem",
  6850. }
  6851. cc_library_shared {
  6852. name: "mylib",
  6853. srcs: ["mylib.cpp"],
  6854. shared_libs: ["myotherlib"],
  6855. system_shared_libs: [],
  6856. stl: "none",
  6857. apex_available: [
  6858. "myapex",
  6859. "//apex_available:platform",
  6860. ],
  6861. }
  6862. cc_prebuilt_library_shared {
  6863. name: "myotherlib",
  6864. srcs: ["prebuilt.so"],
  6865. system_shared_libs: [],
  6866. stl: "none",
  6867. apex_available: [
  6868. "myapex",
  6869. "//apex_available:platform",
  6870. ],
  6871. }
  6872. `)
  6873. apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
  6874. data := android.AndroidMkDataForTest(t, ctx, apexBundle)
  6875. var builder strings.Builder
  6876. data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
  6877. androidMk := builder.String()
  6878. // `myotherlib` is added to `myapex` as symlink
  6879. ensureContains(t, androidMk, "LOCAL_MODULE := mylib.myapex\n")
  6880. ensureNotContains(t, androidMk, "LOCAL_MODULE := prebuilt_myotherlib.myapex\n")
  6881. ensureNotContains(t, androidMk, "LOCAL_MODULE := myotherlib.myapex\n")
  6882. // `myapex` should have `myotherlib` in its required line, not `prebuilt_myotherlib`
  6883. ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := mylib.myapex:64 myotherlib:64 apex_manifest.pb.myapex apex_pubkey.myapex\n")
  6884. }
  6885. func TestApexWithJniLibs(t *testing.T) {
  6886. ctx := testApex(t, `
  6887. apex {
  6888. name: "myapex",
  6889. key: "myapex.key",
  6890. jni_libs: ["mylib", "libfoo.rust"],
  6891. updatable: false,
  6892. }
  6893. apex_key {
  6894. name: "myapex.key",
  6895. public_key: "testkey.avbpubkey",
  6896. private_key: "testkey.pem",
  6897. }
  6898. cc_library {
  6899. name: "mylib",
  6900. srcs: ["mylib.cpp"],
  6901. shared_libs: ["mylib2"],
  6902. system_shared_libs: [],
  6903. stl: "none",
  6904. apex_available: [ "myapex" ],
  6905. }
  6906. cc_library {
  6907. name: "mylib2",
  6908. srcs: ["mylib.cpp"],
  6909. system_shared_libs: [],
  6910. stl: "none",
  6911. apex_available: [ "myapex" ],
  6912. }
  6913. rust_ffi_shared {
  6914. name: "libfoo.rust",
  6915. crate_name: "foo",
  6916. srcs: ["foo.rs"],
  6917. shared_libs: ["libfoo.shared_from_rust"],
  6918. prefer_rlib: true,
  6919. apex_available: ["myapex"],
  6920. }
  6921. cc_library_shared {
  6922. name: "libfoo.shared_from_rust",
  6923. srcs: ["mylib.cpp"],
  6924. system_shared_libs: [],
  6925. stl: "none",
  6926. stubs: {
  6927. versions: ["10", "11", "12"],
  6928. },
  6929. }
  6930. `)
  6931. rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexManifestRule")
  6932. // Notice mylib2.so (transitive dep) is not added as a jni_lib
  6933. ensureEquals(t, rule.Args["opt"], "-a jniLibs libfoo.rust.so mylib.so")
  6934. ensureExactContents(t, ctx, "myapex", "android_common_myapex_image", []string{
  6935. "lib64/mylib.so",
  6936. "lib64/mylib2.so",
  6937. "lib64/libfoo.rust.so",
  6938. "lib64/libc++.so", // auto-added to libfoo.rust by Soong
  6939. "lib64/liblog.so", // auto-added to libfoo.rust by Soong
  6940. })
  6941. // b/220397949
  6942. ensureListContains(t, names(rule.Args["requireNativeLibs"]), "libfoo.shared_from_rust.so")
  6943. }
  6944. func TestApexMutatorsDontRunIfDisabled(t *testing.T) {
  6945. ctx := testApex(t, `
  6946. apex {
  6947. name: "myapex",
  6948. key: "myapex.key",
  6949. updatable: false,
  6950. }
  6951. apex_key {
  6952. name: "myapex.key",
  6953. public_key: "testkey.avbpubkey",
  6954. private_key: "testkey.pem",
  6955. }
  6956. `,
  6957. android.FixtureModifyConfig(func(config android.Config) {
  6958. delete(config.Targets, android.Android)
  6959. config.AndroidCommonTarget = android.Target{}
  6960. }),
  6961. )
  6962. if expected, got := []string{""}, ctx.ModuleVariantsForTests("myapex"); !reflect.DeepEqual(expected, got) {
  6963. t.Errorf("Expected variants: %v, but got: %v", expected, got)
  6964. }
  6965. }
  6966. func TestAppBundle(t *testing.T) {
  6967. ctx := testApex(t, `
  6968. apex {
  6969. name: "myapex",
  6970. key: "myapex.key",
  6971. apps: ["AppFoo"],
  6972. updatable: false,
  6973. }
  6974. apex_key {
  6975. name: "myapex.key",
  6976. public_key: "testkey.avbpubkey",
  6977. private_key: "testkey.pem",
  6978. }
  6979. android_app {
  6980. name: "AppFoo",
  6981. srcs: ["foo/bar/MyClass.java"],
  6982. sdk_version: "none",
  6983. system_modules: "none",
  6984. apex_available: [ "myapex" ],
  6985. }
  6986. `, withManifestPackageNameOverrides([]string{"AppFoo:com.android.foo"}))
  6987. bundleConfigRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Output("bundle_config.json")
  6988. content := bundleConfigRule.Args["content"]
  6989. ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
  6990. ensureContains(t, content, `"apex_config":{"apex_embedded_apk_config":[{"package_name":"com.android.foo","path":"app/AppFoo@TEST.BUILD_ID/AppFoo.apk"}]}`)
  6991. }
  6992. func TestAppSetBundle(t *testing.T) {
  6993. ctx := testApex(t, `
  6994. apex {
  6995. name: "myapex",
  6996. key: "myapex.key",
  6997. apps: ["AppSet"],
  6998. updatable: false,
  6999. }
  7000. apex_key {
  7001. name: "myapex.key",
  7002. public_key: "testkey.avbpubkey",
  7003. private_key: "testkey.pem",
  7004. }
  7005. android_app_set {
  7006. name: "AppSet",
  7007. set: "AppSet.apks",
  7008. }`)
  7009. mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
  7010. bundleConfigRule := mod.Output("bundle_config.json")
  7011. content := bundleConfigRule.Args["content"]
  7012. ensureContains(t, content, `"compression":{"uncompressed_glob":["apex_payload.img","apex_manifest.*"]}`)
  7013. s := mod.Rule("apexRule").Args["copy_commands"]
  7014. copyCmds := regexp.MustCompile(" *&& *").Split(s, -1)
  7015. if len(copyCmds) != 4 {
  7016. t.Fatalf("Expected 4 commands, got %d in:\n%s", len(copyCmds), s)
  7017. }
  7018. ensureMatches(t, copyCmds[0], "^rm -rf .*/app/AppSet@TEST.BUILD_ID$")
  7019. ensureMatches(t, copyCmds[1], "^mkdir -p .*/app/AppSet@TEST.BUILD_ID$")
  7020. ensureMatches(t, copyCmds[2], "^cp -f .*/app/AppSet@TEST.BUILD_ID/AppSet.apk$")
  7021. ensureMatches(t, copyCmds[3], "^unzip .*-d .*/app/AppSet@TEST.BUILD_ID .*/AppSet.zip$")
  7022. // Ensure that canned_fs_config has an entry for the app set zip file
  7023. generateFsRule := mod.Rule("generateFsConfig")
  7024. cmd := generateFsRule.RuleParams.Command
  7025. ensureContains(t, cmd, "AppSet.zip")
  7026. }
  7027. func TestAppSetBundlePrebuilt(t *testing.T) {
  7028. bp := `
  7029. apex_set {
  7030. name: "myapex",
  7031. filename: "foo_v2.apex",
  7032. sanitized: {
  7033. none: { set: "myapex.apks", },
  7034. hwaddress: { set: "myapex.hwasan.apks", },
  7035. },
  7036. }
  7037. `
  7038. ctx := testApex(t, bp, prepareForTestWithSantitizeHwaddress)
  7039. // Check that the extractor produces the correct output file from the correct input file.
  7040. extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.hwasan.apks"
  7041. m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
  7042. extractedApex := m.Output(extractorOutput)
  7043. android.AssertArrayString(t, "extractor input", []string{"myapex.hwasan.apks"}, extractedApex.Inputs.Strings())
  7044. // Ditto for the apex.
  7045. m = ctx.ModuleForTests("myapex", "android_common_myapex")
  7046. copiedApex := m.Output("out/soong/.intermediates/myapex/android_common_myapex/foo_v2.apex")
  7047. android.AssertStringEquals(t, "myapex input", extractorOutput, copiedApex.Input.String())
  7048. }
  7049. func TestApexSetApksModuleAssignment(t *testing.T) {
  7050. ctx := testApex(t, `
  7051. apex_set {
  7052. name: "myapex",
  7053. set: ":myapex_apks_file",
  7054. }
  7055. filegroup {
  7056. name: "myapex_apks_file",
  7057. srcs: ["myapex.apks"],
  7058. }
  7059. `)
  7060. m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
  7061. // Check that the extractor produces the correct apks file from the input module
  7062. extractorOutput := "out/soong/.intermediates/myapex.apex.extractor/android_common/extracted/myapex.apks"
  7063. extractedApex := m.Output(extractorOutput)
  7064. android.AssertArrayString(t, "extractor input", []string{"myapex.apks"}, extractedApex.Inputs.Strings())
  7065. }
  7066. func testNoUpdatableJarsInBootImage(t *testing.T, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) {
  7067. t.Helper()
  7068. bp := `
  7069. java_library {
  7070. name: "some-updatable-apex-lib",
  7071. srcs: ["a.java"],
  7072. sdk_version: "current",
  7073. apex_available: [
  7074. "some-updatable-apex",
  7075. ],
  7076. permitted_packages: ["some.updatable.apex.lib"],
  7077. min_sdk_version: "33",
  7078. }
  7079. java_library {
  7080. name: "some-non-updatable-apex-lib",
  7081. srcs: ["a.java"],
  7082. apex_available: [
  7083. "some-non-updatable-apex",
  7084. ],
  7085. compile_dex: true,
  7086. permitted_packages: ["some.non.updatable.apex.lib"],
  7087. }
  7088. bootclasspath_fragment {
  7089. name: "some-non-updatable-fragment",
  7090. contents: ["some-non-updatable-apex-lib"],
  7091. apex_available: [
  7092. "some-non-updatable-apex",
  7093. ],
  7094. hidden_api: {
  7095. split_packages: ["*"],
  7096. },
  7097. }
  7098. java_library {
  7099. name: "some-platform-lib",
  7100. srcs: ["a.java"],
  7101. sdk_version: "current",
  7102. installable: true,
  7103. }
  7104. java_library {
  7105. name: "some-art-lib",
  7106. srcs: ["a.java"],
  7107. sdk_version: "current",
  7108. apex_available: [
  7109. "com.android.art.debug",
  7110. ],
  7111. hostdex: true,
  7112. compile_dex: true,
  7113. min_sdk_version: "33",
  7114. }
  7115. apex {
  7116. name: "some-updatable-apex",
  7117. key: "some-updatable-apex.key",
  7118. java_libs: ["some-updatable-apex-lib"],
  7119. updatable: true,
  7120. min_sdk_version: "33",
  7121. }
  7122. apex {
  7123. name: "some-non-updatable-apex",
  7124. key: "some-non-updatable-apex.key",
  7125. bootclasspath_fragments: ["some-non-updatable-fragment"],
  7126. updatable: false,
  7127. }
  7128. apex_key {
  7129. name: "some-updatable-apex.key",
  7130. }
  7131. apex_key {
  7132. name: "some-non-updatable-apex.key",
  7133. }
  7134. apex {
  7135. name: "com.android.art.debug",
  7136. key: "com.android.art.debug.key",
  7137. bootclasspath_fragments: ["art-bootclasspath-fragment"],
  7138. updatable: true,
  7139. min_sdk_version: "33",
  7140. }
  7141. bootclasspath_fragment {
  7142. name: "art-bootclasspath-fragment",
  7143. image_name: "art",
  7144. contents: ["some-art-lib"],
  7145. apex_available: [
  7146. "com.android.art.debug",
  7147. ],
  7148. hidden_api: {
  7149. split_packages: ["*"],
  7150. },
  7151. }
  7152. apex_key {
  7153. name: "com.android.art.debug.key",
  7154. }
  7155. filegroup {
  7156. name: "some-updatable-apex-file_contexts",
  7157. srcs: [
  7158. "system/sepolicy/apex/some-updatable-apex-file_contexts",
  7159. ],
  7160. }
  7161. filegroup {
  7162. name: "some-non-updatable-apex-file_contexts",
  7163. srcs: [
  7164. "system/sepolicy/apex/some-non-updatable-apex-file_contexts",
  7165. ],
  7166. }
  7167. `
  7168. testDexpreoptWithApexes(t, bp, errmsg, preparer, fragments...)
  7169. }
  7170. func testDexpreoptWithApexes(t *testing.T, bp, errmsg string, preparer android.FixturePreparer, fragments ...java.ApexVariantReference) *android.TestContext {
  7171. t.Helper()
  7172. fs := android.MockFS{
  7173. "a.java": nil,
  7174. "a.jar": nil,
  7175. "apex_manifest.json": nil,
  7176. "AndroidManifest.xml": nil,
  7177. "system/sepolicy/apex/myapex-file_contexts": nil,
  7178. "system/sepolicy/apex/some-updatable-apex-file_contexts": nil,
  7179. "system/sepolicy/apex/some-non-updatable-apex-file_contexts": nil,
  7180. "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
  7181. "framework/aidl/a.aidl": nil,
  7182. }
  7183. errorHandler := android.FixtureExpectsNoErrors
  7184. if errmsg != "" {
  7185. errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
  7186. }
  7187. result := android.GroupFixturePreparers(
  7188. cc.PrepareForTestWithCcDefaultModules,
  7189. java.PrepareForTestWithHiddenApiBuildComponents,
  7190. java.PrepareForTestWithJavaDefaultModules,
  7191. java.PrepareForTestWithJavaSdkLibraryFiles,
  7192. PrepareForTestWithApexBuildComponents,
  7193. preparer,
  7194. fs.AddToFixture(),
  7195. android.FixtureModifyMockFS(func(fs android.MockFS) {
  7196. if _, ok := fs["frameworks/base/boot/Android.bp"]; !ok {
  7197. insert := ""
  7198. for _, fragment := range fragments {
  7199. insert += fmt.Sprintf("{apex: %q, module: %q},\n", *fragment.Apex, *fragment.Module)
  7200. }
  7201. fs["frameworks/base/boot/Android.bp"] = []byte(fmt.Sprintf(`
  7202. platform_bootclasspath {
  7203. name: "platform-bootclasspath",
  7204. fragments: [
  7205. %s
  7206. ],
  7207. }
  7208. `, insert))
  7209. }
  7210. }),
  7211. dexpreopt.FixtureSetBootImageProfiles("art/build/boot/boot-image-profile.txt"),
  7212. ).
  7213. ExtendWithErrorHandler(errorHandler).
  7214. RunTestWithBp(t, bp)
  7215. return result.TestContext
  7216. }
  7217. func TestDuplicateDeapexersFromPrebuiltApexes(t *testing.T) {
  7218. preparers := android.GroupFixturePreparers(
  7219. java.PrepareForTestWithJavaDefaultModules,
  7220. PrepareForTestWithApexBuildComponents,
  7221. ).
  7222. ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
  7223. "Multiple installable prebuilt APEXes provide ambiguous deapexers: com.android.myapex and com.mycompany.android.myapex"))
  7224. bpBase := `
  7225. apex_set {
  7226. name: "com.android.myapex",
  7227. installable: true,
  7228. exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
  7229. set: "myapex.apks",
  7230. }
  7231. apex_set {
  7232. name: "com.mycompany.android.myapex",
  7233. apex_name: "com.android.myapex",
  7234. installable: true,
  7235. exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
  7236. set: "company-myapex.apks",
  7237. }
  7238. prebuilt_bootclasspath_fragment {
  7239. name: "my-bootclasspath-fragment",
  7240. apex_available: ["com.android.myapex"],
  7241. %s
  7242. }
  7243. `
  7244. t.Run("java_import", func(t *testing.T) {
  7245. _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
  7246. java_import {
  7247. name: "libfoo",
  7248. jars: ["libfoo.jar"],
  7249. apex_available: ["com.android.myapex"],
  7250. }
  7251. `)
  7252. })
  7253. t.Run("java_sdk_library_import", func(t *testing.T) {
  7254. _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
  7255. java_sdk_library_import {
  7256. name: "libfoo",
  7257. public: {
  7258. jars: ["libbar.jar"],
  7259. },
  7260. apex_available: ["com.android.myapex"],
  7261. }
  7262. `)
  7263. })
  7264. t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
  7265. _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
  7266. image_name: "art",
  7267. contents: ["libfoo"],
  7268. `)+`
  7269. java_sdk_library_import {
  7270. name: "libfoo",
  7271. public: {
  7272. jars: ["libbar.jar"],
  7273. },
  7274. apex_available: ["com.android.myapex"],
  7275. }
  7276. `)
  7277. })
  7278. }
  7279. func TestDuplicateButEquivalentDeapexersFromPrebuiltApexes(t *testing.T) {
  7280. preparers := android.GroupFixturePreparers(
  7281. java.PrepareForTestWithJavaDefaultModules,
  7282. PrepareForTestWithApexBuildComponents,
  7283. )
  7284. bpBase := `
  7285. apex_set {
  7286. name: "com.android.myapex",
  7287. installable: true,
  7288. exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
  7289. set: "myapex.apks",
  7290. }
  7291. apex_set {
  7292. name: "com.android.myapex_compressed",
  7293. apex_name: "com.android.myapex",
  7294. installable: true,
  7295. exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
  7296. set: "myapex_compressed.apks",
  7297. }
  7298. prebuilt_bootclasspath_fragment {
  7299. name: "my-bootclasspath-fragment",
  7300. apex_available: [
  7301. "com.android.myapex",
  7302. "com.android.myapex_compressed",
  7303. ],
  7304. hidden_api: {
  7305. annotation_flags: "annotation-flags.csv",
  7306. metadata: "metadata.csv",
  7307. index: "index.csv",
  7308. signature_patterns: "signature_patterns.csv",
  7309. },
  7310. %s
  7311. }
  7312. `
  7313. t.Run("java_import", func(t *testing.T) {
  7314. result := preparers.RunTestWithBp(t,
  7315. fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
  7316. java_import {
  7317. name: "libfoo",
  7318. jars: ["libfoo.jar"],
  7319. apex_available: [
  7320. "com.android.myapex",
  7321. "com.android.myapex_compressed",
  7322. ],
  7323. }
  7324. `)
  7325. module := result.Module("libfoo", "android_common_com.android.myapex")
  7326. usesLibraryDep := module.(java.UsesLibraryDependency)
  7327. android.AssertPathRelativeToTopEquals(t, "dex jar path",
  7328. "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
  7329. usesLibraryDep.DexJarBuildPath().Path())
  7330. })
  7331. t.Run("java_sdk_library_import", func(t *testing.T) {
  7332. result := preparers.RunTestWithBp(t,
  7333. fmt.Sprintf(bpBase, `contents: ["libfoo"]`)+`
  7334. java_sdk_library_import {
  7335. name: "libfoo",
  7336. public: {
  7337. jars: ["libbar.jar"],
  7338. },
  7339. apex_available: [
  7340. "com.android.myapex",
  7341. "com.android.myapex_compressed",
  7342. ],
  7343. compile_dex: true,
  7344. }
  7345. `)
  7346. module := result.Module("libfoo", "android_common_com.android.myapex")
  7347. usesLibraryDep := module.(java.UsesLibraryDependency)
  7348. android.AssertPathRelativeToTopEquals(t, "dex jar path",
  7349. "out/soong/.intermediates/com.android.myapex.deapexer/android_common/deapexer/javalib/libfoo.jar",
  7350. usesLibraryDep.DexJarBuildPath().Path())
  7351. })
  7352. t.Run("prebuilt_bootclasspath_fragment", func(t *testing.T) {
  7353. _ = preparers.RunTestWithBp(t, fmt.Sprintf(bpBase, `
  7354. image_name: "art",
  7355. contents: ["libfoo"],
  7356. `)+`
  7357. java_sdk_library_import {
  7358. name: "libfoo",
  7359. public: {
  7360. jars: ["libbar.jar"],
  7361. },
  7362. apex_available: [
  7363. "com.android.myapex",
  7364. "com.android.myapex_compressed",
  7365. ],
  7366. compile_dex: true,
  7367. }
  7368. `)
  7369. })
  7370. }
  7371. func TestUpdatable_should_set_min_sdk_version(t *testing.T) {
  7372. testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
  7373. apex {
  7374. name: "myapex",
  7375. key: "myapex.key",
  7376. updatable: true,
  7377. }
  7378. apex_key {
  7379. name: "myapex.key",
  7380. public_key: "testkey.avbpubkey",
  7381. private_key: "testkey.pem",
  7382. }
  7383. `)
  7384. }
  7385. func TestUpdatableDefault_should_set_min_sdk_version(t *testing.T) {
  7386. testApexError(t, `"myapex" .*: updatable: updatable APEXes should set min_sdk_version`, `
  7387. apex {
  7388. name: "myapex",
  7389. key: "myapex.key",
  7390. }
  7391. apex_key {
  7392. name: "myapex.key",
  7393. public_key: "testkey.avbpubkey",
  7394. private_key: "testkey.pem",
  7395. }
  7396. `)
  7397. }
  7398. func Test_use_vndk_as_stable_shouldnt_be_used_for_updatable_vendor_apexes(t *testing.T) {
  7399. testApexError(t, `"myapex" .*: use_vndk_as_stable: updatable APEXes can't use external VNDK libs`, `
  7400. apex {
  7401. name: "myapex",
  7402. key: "myapex.key",
  7403. updatable: true,
  7404. use_vndk_as_stable: true,
  7405. soc_specific: true,
  7406. }
  7407. apex_key {
  7408. name: "myapex.key",
  7409. public_key: "testkey.avbpubkey",
  7410. private_key: "testkey.pem",
  7411. }
  7412. `)
  7413. }
  7414. func Test_use_vndk_as_stable_shouldnt_be_used_with_min_sdk_version(t *testing.T) {
  7415. testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported when min_sdk_version is set`, `
  7416. apex {
  7417. name: "myapex",
  7418. key: "myapex.key",
  7419. updatable: false,
  7420. min_sdk_version: "29",
  7421. use_vndk_as_stable: true,
  7422. vendor: true,
  7423. }
  7424. apex_key {
  7425. name: "myapex.key",
  7426. public_key: "testkey.avbpubkey",
  7427. private_key: "testkey.pem",
  7428. }
  7429. `)
  7430. }
  7431. func Test_use_vndk_as_stable_shouldnt_be_used_for_non_vendor_apexes(t *testing.T) {
  7432. testApexError(t, `"myapex" .*: use_vndk_as_stable: not supported for system/system_ext APEXes`, `
  7433. apex {
  7434. name: "myapex",
  7435. key: "myapex.key",
  7436. updatable: false,
  7437. use_vndk_as_stable: true,
  7438. }
  7439. apex_key {
  7440. name: "myapex.key",
  7441. public_key: "testkey.avbpubkey",
  7442. private_key: "testkey.pem",
  7443. }
  7444. `)
  7445. }
  7446. func TestUpdatable_should_not_set_generate_classpaths_proto(t *testing.T) {
  7447. testApexError(t, `"mysystemserverclasspathfragment" .* it must not set generate_classpaths_proto to false`, `
  7448. apex {
  7449. name: "myapex",
  7450. key: "myapex.key",
  7451. systemserverclasspath_fragments: [
  7452. "mysystemserverclasspathfragment",
  7453. ],
  7454. min_sdk_version: "29",
  7455. updatable: true,
  7456. }
  7457. apex_key {
  7458. name: "myapex.key",
  7459. public_key: "testkey.avbpubkey",
  7460. private_key: "testkey.pem",
  7461. }
  7462. java_library {
  7463. name: "foo",
  7464. srcs: ["b.java"],
  7465. min_sdk_version: "29",
  7466. installable: true,
  7467. apex_available: [
  7468. "myapex",
  7469. ],
  7470. }
  7471. systemserverclasspath_fragment {
  7472. name: "mysystemserverclasspathfragment",
  7473. generate_classpaths_proto: false,
  7474. contents: [
  7475. "foo",
  7476. ],
  7477. apex_available: [
  7478. "myapex",
  7479. ],
  7480. }
  7481. `,
  7482. dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
  7483. )
  7484. }
  7485. func TestNoUpdatableJarsInBootImage(t *testing.T) {
  7486. // Set the BootJars in dexpreopt.GlobalConfig and productVariables to the same value. This can
  7487. // result in an invalid configuration as it does not set the ArtApexJars and allows art apex
  7488. // modules to be included in the BootJars.
  7489. prepareSetBootJars := func(bootJars ...string) android.FixturePreparer {
  7490. return android.GroupFixturePreparers(
  7491. dexpreopt.FixtureSetBootJars(bootJars...),
  7492. android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  7493. variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
  7494. }),
  7495. )
  7496. }
  7497. // Set the ArtApexJars and BootJars in dexpreopt.GlobalConfig and productVariables all to the
  7498. // same value. This can result in an invalid configuration as it allows non art apex jars to be
  7499. // specified in the ArtApexJars configuration.
  7500. prepareSetArtJars := func(bootJars ...string) android.FixturePreparer {
  7501. return android.GroupFixturePreparers(
  7502. dexpreopt.FixtureSetArtBootJars(bootJars...),
  7503. dexpreopt.FixtureSetBootJars(bootJars...),
  7504. android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  7505. variables.BootJars = android.CreateTestConfiguredJarList(bootJars)
  7506. }),
  7507. )
  7508. }
  7509. t.Run("updatable jar from ART apex in the ART boot image => ok", func(t *testing.T) {
  7510. preparer := android.GroupFixturePreparers(
  7511. java.FixtureConfigureBootJars("com.android.art.debug:some-art-lib"),
  7512. java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
  7513. )
  7514. fragments := []java.ApexVariantReference{
  7515. {
  7516. Apex: proptools.StringPtr("com.android.art.debug"),
  7517. Module: proptools.StringPtr("art-bootclasspath-fragment"),
  7518. },
  7519. {
  7520. Apex: proptools.StringPtr("some-non-updatable-apex"),
  7521. Module: proptools.StringPtr("some-non-updatable-fragment"),
  7522. },
  7523. }
  7524. testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
  7525. })
  7526. t.Run("updatable jar from ART apex in the platform bootclasspath => error", func(t *testing.T) {
  7527. err := `module "some-art-lib" from updatable apexes \["com.android.art.debug"\] is not allowed in the platform bootclasspath`
  7528. // Update the dexpreopt BootJars directly.
  7529. preparer := android.GroupFixturePreparers(
  7530. prepareSetBootJars("com.android.art.debug:some-art-lib"),
  7531. java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
  7532. )
  7533. testNoUpdatableJarsInBootImage(t, err, preparer)
  7534. })
  7535. t.Run("updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
  7536. err := `ArtApexJars expects this to be in apex "some-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
  7537. // Update the dexpreopt ArtApexJars directly.
  7538. preparer := prepareSetArtJars("some-updatable-apex:some-updatable-apex-lib")
  7539. testNoUpdatableJarsInBootImage(t, err, preparer)
  7540. })
  7541. t.Run("non-updatable jar from some other apex in the ART boot image => error", func(t *testing.T) {
  7542. err := `ArtApexJars expects this to be in apex "some-non-updatable-apex" but this is only in apexes.*"com.android.art.debug"`
  7543. // Update the dexpreopt ArtApexJars directly.
  7544. preparer := prepareSetArtJars("some-non-updatable-apex:some-non-updatable-apex-lib")
  7545. testNoUpdatableJarsInBootImage(t, err, preparer)
  7546. })
  7547. t.Run("updatable jar from some other apex in the platform bootclasspath => error", func(t *testing.T) {
  7548. err := `module "some-updatable-apex-lib" from updatable apexes \["some-updatable-apex"\] is not allowed in the platform bootclasspath`
  7549. preparer := android.GroupFixturePreparers(
  7550. java.FixtureConfigureBootJars("some-updatable-apex:some-updatable-apex-lib"),
  7551. java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
  7552. )
  7553. testNoUpdatableJarsInBootImage(t, err, preparer)
  7554. })
  7555. t.Run("non-updatable jar from some other apex in the platform bootclasspath => ok", func(t *testing.T) {
  7556. preparer := java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib")
  7557. fragment := java.ApexVariantReference{
  7558. Apex: proptools.StringPtr("some-non-updatable-apex"),
  7559. Module: proptools.StringPtr("some-non-updatable-fragment"),
  7560. }
  7561. testNoUpdatableJarsInBootImage(t, "", preparer, fragment)
  7562. })
  7563. t.Run("nonexistent jar in the ART boot image => error", func(t *testing.T) {
  7564. err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
  7565. preparer := java.FixtureConfigureBootJars("platform:nonexistent")
  7566. testNoUpdatableJarsInBootImage(t, err, preparer)
  7567. })
  7568. t.Run("nonexistent jar in the platform bootclasspath => error", func(t *testing.T) {
  7569. err := `"platform-bootclasspath" depends on undefined module "nonexistent"`
  7570. preparer := java.FixtureConfigureBootJars("platform:nonexistent")
  7571. testNoUpdatableJarsInBootImage(t, err, preparer)
  7572. })
  7573. t.Run("platform jar in the ART boot image => error", func(t *testing.T) {
  7574. err := `ArtApexJars is invalid as it requests a platform variant of "some-platform-lib"`
  7575. // Update the dexpreopt ArtApexJars directly.
  7576. preparer := prepareSetArtJars("platform:some-platform-lib")
  7577. testNoUpdatableJarsInBootImage(t, err, preparer)
  7578. })
  7579. t.Run("platform jar in the platform bootclasspath => ok", func(t *testing.T) {
  7580. preparer := android.GroupFixturePreparers(
  7581. java.FixtureConfigureBootJars("platform:some-platform-lib"),
  7582. java.FixtureConfigureApexBootJars("some-non-updatable-apex:some-non-updatable-apex-lib"),
  7583. )
  7584. fragments := []java.ApexVariantReference{
  7585. {
  7586. Apex: proptools.StringPtr("some-non-updatable-apex"),
  7587. Module: proptools.StringPtr("some-non-updatable-fragment"),
  7588. },
  7589. }
  7590. testNoUpdatableJarsInBootImage(t, "", preparer, fragments...)
  7591. })
  7592. }
  7593. func TestDexpreoptAccessDexFilesFromPrebuiltApex(t *testing.T) {
  7594. preparer := java.FixtureConfigureApexBootJars("myapex:libfoo")
  7595. t.Run("prebuilt no source", func(t *testing.T) {
  7596. fragment := java.ApexVariantReference{
  7597. Apex: proptools.StringPtr("myapex"),
  7598. Module: proptools.StringPtr("my-bootclasspath-fragment"),
  7599. }
  7600. testDexpreoptWithApexes(t, `
  7601. prebuilt_apex {
  7602. name: "myapex" ,
  7603. arch: {
  7604. arm64: {
  7605. src: "myapex-arm64.apex",
  7606. },
  7607. arm: {
  7608. src: "myapex-arm.apex",
  7609. },
  7610. },
  7611. exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
  7612. }
  7613. prebuilt_bootclasspath_fragment {
  7614. name: "my-bootclasspath-fragment",
  7615. contents: ["libfoo"],
  7616. apex_available: ["myapex"],
  7617. hidden_api: {
  7618. annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
  7619. metadata: "my-bootclasspath-fragment/metadata.csv",
  7620. index: "my-bootclasspath-fragment/index.csv",
  7621. signature_patterns: "my-bootclasspath-fragment/signature-patterns.csv",
  7622. filtered_stub_flags: "my-bootclasspath-fragment/filtered-stub-flags.csv",
  7623. filtered_flags: "my-bootclasspath-fragment/filtered-flags.csv",
  7624. },
  7625. }
  7626. java_import {
  7627. name: "libfoo",
  7628. jars: ["libfoo.jar"],
  7629. apex_available: ["myapex"],
  7630. permitted_packages: ["libfoo"],
  7631. }
  7632. `, "", preparer, fragment)
  7633. })
  7634. }
  7635. func testBootJarPermittedPackagesRules(t *testing.T, errmsg, bp string, bootJars []string, rules []android.Rule) {
  7636. t.Helper()
  7637. bp += `
  7638. apex_key {
  7639. name: "myapex.key",
  7640. public_key: "testkey.avbpubkey",
  7641. private_key: "testkey.pem",
  7642. }`
  7643. fs := android.MockFS{
  7644. "lib1/src/A.java": nil,
  7645. "lib2/src/B.java": nil,
  7646. "system/sepolicy/apex/myapex-file_contexts": nil,
  7647. }
  7648. errorHandler := android.FixtureExpectsNoErrors
  7649. if errmsg != "" {
  7650. errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(errmsg)
  7651. }
  7652. android.GroupFixturePreparers(
  7653. android.PrepareForTestWithAndroidBuildComponents,
  7654. java.PrepareForTestWithJavaBuildComponents,
  7655. PrepareForTestWithApexBuildComponents,
  7656. android.PrepareForTestWithNeverallowRules(rules),
  7657. android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  7658. apexBootJars := make([]string, 0, len(bootJars))
  7659. for _, apexBootJar := range bootJars {
  7660. apexBootJars = append(apexBootJars, "myapex:"+apexBootJar)
  7661. }
  7662. variables.ApexBootJars = android.CreateTestConfiguredJarList(apexBootJars)
  7663. }),
  7664. fs.AddToFixture(),
  7665. ).
  7666. ExtendWithErrorHandler(errorHandler).
  7667. RunTestWithBp(t, bp)
  7668. }
  7669. func TestApexPermittedPackagesRules(t *testing.T) {
  7670. testcases := []struct {
  7671. name string
  7672. expectedError string
  7673. bp string
  7674. bootJars []string
  7675. bcpPermittedPackages map[string][]string
  7676. }{
  7677. {
  7678. name: "Non-Bootclasspath apex jar not satisfying allowed module packages.",
  7679. expectedError: "",
  7680. bp: `
  7681. java_library {
  7682. name: "bcp_lib1",
  7683. srcs: ["lib1/src/*.java"],
  7684. permitted_packages: ["foo.bar"],
  7685. apex_available: ["myapex"],
  7686. sdk_version: "none",
  7687. system_modules: "none",
  7688. }
  7689. java_library {
  7690. name: "nonbcp_lib2",
  7691. srcs: ["lib2/src/*.java"],
  7692. apex_available: ["myapex"],
  7693. permitted_packages: ["a.b"],
  7694. sdk_version: "none",
  7695. system_modules: "none",
  7696. }
  7697. apex {
  7698. name: "myapex",
  7699. key: "myapex.key",
  7700. java_libs: ["bcp_lib1", "nonbcp_lib2"],
  7701. updatable: false,
  7702. }`,
  7703. bootJars: []string{"bcp_lib1"},
  7704. bcpPermittedPackages: map[string][]string{
  7705. "bcp_lib1": []string{
  7706. "foo.bar",
  7707. },
  7708. },
  7709. },
  7710. {
  7711. name: "Bootclasspath apex jar not satisfying allowed module packages.",
  7712. expectedError: `(?s)module "bcp_lib2" .* which is restricted because bcp_lib2 bootjar may only use these package prefixes: foo.bar. Please consider the following alternatives:\n 1. If the offending code is from a statically linked library, consider removing that dependency and using an alternative already in the bootclasspath, or perhaps a shared library. 2. Move the offending code into an allowed package.\n 3. Jarjar the offending code. Please be mindful of the potential system health implications of bundling that code, particularly if the offending jar is part of the bootclasspath.`,
  7713. bp: `
  7714. java_library {
  7715. name: "bcp_lib1",
  7716. srcs: ["lib1/src/*.java"],
  7717. apex_available: ["myapex"],
  7718. permitted_packages: ["foo.bar"],
  7719. sdk_version: "none",
  7720. system_modules: "none",
  7721. }
  7722. java_library {
  7723. name: "bcp_lib2",
  7724. srcs: ["lib2/src/*.java"],
  7725. apex_available: ["myapex"],
  7726. permitted_packages: ["foo.bar", "bar.baz"],
  7727. sdk_version: "none",
  7728. system_modules: "none",
  7729. }
  7730. apex {
  7731. name: "myapex",
  7732. key: "myapex.key",
  7733. java_libs: ["bcp_lib1", "bcp_lib2"],
  7734. updatable: false,
  7735. }
  7736. `,
  7737. bootJars: []string{"bcp_lib1", "bcp_lib2"},
  7738. bcpPermittedPackages: map[string][]string{
  7739. "bcp_lib1": []string{
  7740. "foo.bar",
  7741. },
  7742. "bcp_lib2": []string{
  7743. "foo.bar",
  7744. },
  7745. },
  7746. },
  7747. {
  7748. name: "Updateable Bootclasspath apex jar not satisfying allowed module packages.",
  7749. expectedError: "",
  7750. bp: `
  7751. java_library {
  7752. name: "bcp_lib_restricted",
  7753. srcs: ["lib1/src/*.java"],
  7754. apex_available: ["myapex"],
  7755. permitted_packages: ["foo.bar"],
  7756. sdk_version: "none",
  7757. min_sdk_version: "29",
  7758. system_modules: "none",
  7759. }
  7760. java_library {
  7761. name: "bcp_lib_unrestricted",
  7762. srcs: ["lib2/src/*.java"],
  7763. apex_available: ["myapex"],
  7764. permitted_packages: ["foo.bar", "bar.baz"],
  7765. sdk_version: "none",
  7766. min_sdk_version: "29",
  7767. system_modules: "none",
  7768. }
  7769. apex {
  7770. name: "myapex",
  7771. key: "myapex.key",
  7772. java_libs: ["bcp_lib_restricted", "bcp_lib_unrestricted"],
  7773. updatable: true,
  7774. min_sdk_version: "29",
  7775. }
  7776. `,
  7777. bootJars: []string{"bcp_lib1", "bcp_lib2"},
  7778. bcpPermittedPackages: map[string][]string{
  7779. "bcp_lib1_non_updateable": []string{
  7780. "foo.bar",
  7781. },
  7782. // bcp_lib2_updateable has no entry here since updateable bcp can contain new packages - tracking via an allowlist is not necessary
  7783. },
  7784. },
  7785. }
  7786. for _, tc := range testcases {
  7787. t.Run(tc.name, func(t *testing.T) {
  7788. rules := createBcpPermittedPackagesRules(tc.bcpPermittedPackages)
  7789. testBootJarPermittedPackagesRules(t, tc.expectedError, tc.bp, tc.bootJars, rules)
  7790. })
  7791. }
  7792. }
  7793. func TestTestFor(t *testing.T) {
  7794. ctx := testApex(t, `
  7795. apex {
  7796. name: "myapex",
  7797. key: "myapex.key",
  7798. native_shared_libs: ["mylib", "myprivlib"],
  7799. updatable: false,
  7800. }
  7801. apex_key {
  7802. name: "myapex.key",
  7803. public_key: "testkey.avbpubkey",
  7804. private_key: "testkey.pem",
  7805. }
  7806. cc_library {
  7807. name: "mylib",
  7808. srcs: ["mylib.cpp"],
  7809. system_shared_libs: [],
  7810. stl: "none",
  7811. stubs: {
  7812. versions: ["1"],
  7813. },
  7814. apex_available: ["myapex"],
  7815. }
  7816. cc_library {
  7817. name: "myprivlib",
  7818. srcs: ["mylib.cpp"],
  7819. system_shared_libs: [],
  7820. stl: "none",
  7821. apex_available: ["myapex"],
  7822. }
  7823. cc_test {
  7824. name: "mytest",
  7825. gtest: false,
  7826. srcs: ["mylib.cpp"],
  7827. system_shared_libs: [],
  7828. stl: "none",
  7829. shared_libs: ["mylib", "myprivlib", "mytestlib"],
  7830. test_for: ["myapex"]
  7831. }
  7832. cc_library {
  7833. name: "mytestlib",
  7834. srcs: ["mylib.cpp"],
  7835. system_shared_libs: [],
  7836. shared_libs: ["mylib", "myprivlib"],
  7837. stl: "none",
  7838. test_for: ["myapex"],
  7839. }
  7840. cc_benchmark {
  7841. name: "mybench",
  7842. srcs: ["mylib.cpp"],
  7843. system_shared_libs: [],
  7844. shared_libs: ["mylib", "myprivlib"],
  7845. stl: "none",
  7846. test_for: ["myapex"],
  7847. }
  7848. `)
  7849. ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
  7850. ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
  7851. mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
  7852. android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
  7853. }
  7854. // These modules are tests for the apex, therefore are linked to the
  7855. // actual implementation of mylib instead of its stub.
  7856. ensureLinkedLibIs("mytest", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
  7857. ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
  7858. ensureLinkedLibIs("mybench", "android_arm64_armv8-a", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
  7859. }
  7860. func TestIndirectTestFor(t *testing.T) {
  7861. ctx := testApex(t, `
  7862. apex {
  7863. name: "myapex",
  7864. key: "myapex.key",
  7865. native_shared_libs: ["mylib", "myprivlib"],
  7866. updatable: false,
  7867. }
  7868. apex_key {
  7869. name: "myapex.key",
  7870. public_key: "testkey.avbpubkey",
  7871. private_key: "testkey.pem",
  7872. }
  7873. cc_library {
  7874. name: "mylib",
  7875. srcs: ["mylib.cpp"],
  7876. system_shared_libs: [],
  7877. stl: "none",
  7878. stubs: {
  7879. versions: ["1"],
  7880. },
  7881. apex_available: ["myapex"],
  7882. }
  7883. cc_library {
  7884. name: "myprivlib",
  7885. srcs: ["mylib.cpp"],
  7886. system_shared_libs: [],
  7887. stl: "none",
  7888. shared_libs: ["mylib"],
  7889. apex_available: ["myapex"],
  7890. }
  7891. cc_library {
  7892. name: "mytestlib",
  7893. srcs: ["mylib.cpp"],
  7894. system_shared_libs: [],
  7895. shared_libs: ["myprivlib"],
  7896. stl: "none",
  7897. test_for: ["myapex"],
  7898. }
  7899. `)
  7900. ensureLinkedLibIs := func(mod, variant, linkedLib, expectedVariant string) {
  7901. ldFlags := strings.Split(ctx.ModuleForTests(mod, variant).Rule("ld").Args["libFlags"], " ")
  7902. mylibLdFlags := android.FilterListPred(ldFlags, func(s string) bool { return strings.HasPrefix(s, linkedLib) })
  7903. android.AssertArrayString(t, "unexpected "+linkedLib+" link library for "+mod, []string{linkedLib + expectedVariant}, mylibLdFlags)
  7904. }
  7905. // The platform variant of mytestlib links to the platform variant of the
  7906. // internal myprivlib.
  7907. ensureLinkedLibIs("mytestlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/myprivlib/", "android_arm64_armv8-a_shared/myprivlib.so")
  7908. // The platform variant of myprivlib links to the platform variant of mylib
  7909. // and bypasses its stubs.
  7910. ensureLinkedLibIs("myprivlib", "android_arm64_armv8-a_shared", "out/soong/.intermediates/mylib/", "android_arm64_armv8-a_shared/mylib.so")
  7911. }
  7912. func TestTestForForLibInOtherApex(t *testing.T) {
  7913. // This case is only allowed for known overlapping APEXes, i.e. the ART APEXes.
  7914. _ = testApex(t, `
  7915. apex {
  7916. name: "com.android.art",
  7917. key: "myapex.key",
  7918. native_shared_libs: ["libnativebridge"],
  7919. updatable: false,
  7920. }
  7921. apex {
  7922. name: "com.android.art.debug",
  7923. key: "myapex.key",
  7924. native_shared_libs: ["libnativebridge", "libnativebrdige_test"],
  7925. updatable: false,
  7926. }
  7927. apex_key {
  7928. name: "myapex.key",
  7929. public_key: "testkey.avbpubkey",
  7930. private_key: "testkey.pem",
  7931. }
  7932. cc_library {
  7933. name: "libnativebridge",
  7934. srcs: ["libnativebridge.cpp"],
  7935. system_shared_libs: [],
  7936. stl: "none",
  7937. stubs: {
  7938. versions: ["1"],
  7939. },
  7940. apex_available: ["com.android.art", "com.android.art.debug"],
  7941. }
  7942. cc_library {
  7943. name: "libnativebrdige_test",
  7944. srcs: ["mylib.cpp"],
  7945. system_shared_libs: [],
  7946. shared_libs: ["libnativebridge"],
  7947. stl: "none",
  7948. apex_available: ["com.android.art.debug"],
  7949. test_for: ["com.android.art"],
  7950. }
  7951. `,
  7952. android.MockFS{
  7953. "system/sepolicy/apex/com.android.art-file_contexts": nil,
  7954. "system/sepolicy/apex/com.android.art.debug-file_contexts": nil,
  7955. }.AddToFixture())
  7956. }
  7957. // TODO(jungjw): Move this to proptools
  7958. func intPtr(i int) *int {
  7959. return &i
  7960. }
  7961. func TestApexSet(t *testing.T) {
  7962. ctx := testApex(t, `
  7963. apex_set {
  7964. name: "myapex",
  7965. set: "myapex.apks",
  7966. filename: "foo_v2.apex",
  7967. overrides: ["foo"],
  7968. }
  7969. `,
  7970. android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  7971. variables.Platform_sdk_version = intPtr(30)
  7972. }),
  7973. android.FixtureModifyConfig(func(config android.Config) {
  7974. config.Targets[android.Android] = []android.Target{
  7975. {Os: android.Android, Arch: android.Arch{ArchType: android.Arm, ArchVariant: "armv7-a-neon", Abi: []string{"armeabi-v7a"}}},
  7976. {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}},
  7977. }
  7978. }),
  7979. )
  7980. m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
  7981. // Check extract_apks tool parameters.
  7982. extractedApex := m.Output("extracted/myapex.apks")
  7983. actual := extractedApex.Args["abis"]
  7984. expected := "ARMEABI_V7A,ARM64_V8A"
  7985. if actual != expected {
  7986. t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
  7987. }
  7988. actual = extractedApex.Args["sdk-version"]
  7989. expected = "30"
  7990. if actual != expected {
  7991. t.Errorf("Unexpected abis parameter - expected %q vs actual %q", expected, actual)
  7992. }
  7993. m = ctx.ModuleForTests("myapex", "android_common_myapex")
  7994. a := m.Module().(*ApexSet)
  7995. expectedOverrides := []string{"foo"}
  7996. actualOverrides := android.AndroidMkEntriesForTest(t, ctx, a)[0].EntryMap["LOCAL_OVERRIDES_MODULES"]
  7997. if !reflect.DeepEqual(actualOverrides, expectedOverrides) {
  7998. t.Errorf("Incorrect LOCAL_OVERRIDES_MODULES - expected %q vs actual %q", expectedOverrides, actualOverrides)
  7999. }
  8000. }
  8001. func TestApexSet_NativeBridge(t *testing.T) {
  8002. ctx := testApex(t, `
  8003. apex_set {
  8004. name: "myapex",
  8005. set: "myapex.apks",
  8006. filename: "foo_v2.apex",
  8007. overrides: ["foo"],
  8008. }
  8009. `,
  8010. android.FixtureModifyConfig(func(config android.Config) {
  8011. config.Targets[android.Android] = []android.Target{
  8012. {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64, ArchVariant: "", Abi: []string{"x86_64"}}},
  8013. {Os: android.Android, Arch: android.Arch{ArchType: android.Arm64, ArchVariant: "armv8-a", Abi: []string{"arm64-v8a"}}, NativeBridge: android.NativeBridgeEnabled},
  8014. }
  8015. }),
  8016. )
  8017. m := ctx.ModuleForTests("myapex.apex.extractor", "android_common")
  8018. // Check extract_apks tool parameters. No native bridge arch expected
  8019. extractedApex := m.Output("extracted/myapex.apks")
  8020. android.AssertStringEquals(t, "abis", "X86_64", extractedApex.Args["abis"])
  8021. }
  8022. func TestNoStaticLinkingToStubsLib(t *testing.T) {
  8023. testApexError(t, `.*required by "mylib" is a native library providing stub.*`, `
  8024. apex {
  8025. name: "myapex",
  8026. key: "myapex.key",
  8027. native_shared_libs: ["mylib"],
  8028. updatable: false,
  8029. }
  8030. apex_key {
  8031. name: "myapex.key",
  8032. public_key: "testkey.avbpubkey",
  8033. private_key: "testkey.pem",
  8034. }
  8035. cc_library {
  8036. name: "mylib",
  8037. srcs: ["mylib.cpp"],
  8038. static_libs: ["otherlib"],
  8039. system_shared_libs: [],
  8040. stl: "none",
  8041. apex_available: [ "myapex" ],
  8042. }
  8043. cc_library {
  8044. name: "otherlib",
  8045. srcs: ["mylib.cpp"],
  8046. system_shared_libs: [],
  8047. stl: "none",
  8048. stubs: {
  8049. versions: ["1", "2", "3"],
  8050. },
  8051. apex_available: [ "myapex" ],
  8052. }
  8053. `)
  8054. }
  8055. func TestApexKeysTxt(t *testing.T) {
  8056. ctx := testApex(t, `
  8057. apex {
  8058. name: "myapex",
  8059. key: "myapex.key",
  8060. updatable: false,
  8061. custom_sign_tool: "sign_myapex",
  8062. }
  8063. apex_key {
  8064. name: "myapex.key",
  8065. public_key: "testkey.avbpubkey",
  8066. private_key: "testkey.pem",
  8067. }
  8068. `)
  8069. apexKeysText := ctx.SingletonForTests("apex_keys_text")
  8070. content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
  8071. ensureContains(t, content, `name="myapex.apex" public_key="vendor/foo/devkeys/testkey.avbpubkey" private_key="vendor/foo/devkeys/testkey.pem" container_certificate="vendor/foo/devkeys/test.x509.pem" container_private_key="vendor/foo/devkeys/test.pk8" partition="system_ext" sign_tool="sign_myapex"`)
  8072. }
  8073. func TestApexKeysTxtOverrides(t *testing.T) {
  8074. ctx := testApex(t, `
  8075. apex {
  8076. name: "myapex",
  8077. key: "myapex.key",
  8078. updatable: false,
  8079. custom_sign_tool: "sign_myapex",
  8080. }
  8081. apex_key {
  8082. name: "myapex.key",
  8083. public_key: "testkey.avbpubkey",
  8084. private_key: "testkey.pem",
  8085. }
  8086. prebuilt_apex {
  8087. name: "myapex",
  8088. prefer: true,
  8089. arch: {
  8090. arm64: {
  8091. src: "myapex-arm64.apex",
  8092. },
  8093. arm: {
  8094. src: "myapex-arm.apex",
  8095. },
  8096. },
  8097. }
  8098. apex_set {
  8099. name: "myapex_set",
  8100. set: "myapex.apks",
  8101. filename: "myapex_set.apex",
  8102. overrides: ["myapex"],
  8103. }
  8104. `)
  8105. apexKeysText := ctx.SingletonForTests("apex_keys_text")
  8106. content := apexKeysText.MaybeDescription("apexkeys.txt").BuildParams.Args["content"]
  8107. ensureContains(t, content, `name="myapex_set.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
  8108. ensureContains(t, content, `name="myapex.apex" public_key="PRESIGNED" private_key="PRESIGNED" container_certificate="PRESIGNED" container_private_key="PRESIGNED" partition="system"`)
  8109. }
  8110. func TestAllowedFiles(t *testing.T) {
  8111. ctx := testApex(t, `
  8112. apex {
  8113. name: "myapex",
  8114. key: "myapex.key",
  8115. apps: ["app"],
  8116. allowed_files: "allowed.txt",
  8117. updatable: false,
  8118. }
  8119. apex_key {
  8120. name: "myapex.key",
  8121. public_key: "testkey.avbpubkey",
  8122. private_key: "testkey.pem",
  8123. }
  8124. android_app {
  8125. name: "app",
  8126. srcs: ["foo/bar/MyClass.java"],
  8127. package_name: "foo",
  8128. sdk_version: "none",
  8129. system_modules: "none",
  8130. apex_available: [ "myapex" ],
  8131. }
  8132. `, withFiles(map[string][]byte{
  8133. "sub/Android.bp": []byte(`
  8134. override_apex {
  8135. name: "override_myapex",
  8136. base: "myapex",
  8137. apps: ["override_app"],
  8138. allowed_files: ":allowed",
  8139. }
  8140. // Overridable "path" property should be referenced indirectly
  8141. filegroup {
  8142. name: "allowed",
  8143. srcs: ["allowed.txt"],
  8144. }
  8145. override_android_app {
  8146. name: "override_app",
  8147. base: "app",
  8148. package_name: "bar",
  8149. }
  8150. `),
  8151. }))
  8152. rule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("diffApexContentRule")
  8153. if expected, actual := "allowed.txt", rule.Args["allowed_files_file"]; expected != actual {
  8154. t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
  8155. }
  8156. rule2 := ctx.ModuleForTests("myapex", "android_common_override_myapex_myapex_image").Rule("diffApexContentRule")
  8157. if expected, actual := "sub/allowed.txt", rule2.Args["allowed_files_file"]; expected != actual {
  8158. t.Errorf("allowed_files_file: expected %q but got %q", expected, actual)
  8159. }
  8160. }
  8161. func TestNonPreferredPrebuiltDependency(t *testing.T) {
  8162. testApex(t, `
  8163. apex {
  8164. name: "myapex",
  8165. key: "myapex.key",
  8166. native_shared_libs: ["mylib"],
  8167. updatable: false,
  8168. }
  8169. apex_key {
  8170. name: "myapex.key",
  8171. public_key: "testkey.avbpubkey",
  8172. private_key: "testkey.pem",
  8173. }
  8174. cc_library {
  8175. name: "mylib",
  8176. srcs: ["mylib.cpp"],
  8177. stubs: {
  8178. versions: ["current"],
  8179. },
  8180. apex_available: ["myapex"],
  8181. }
  8182. cc_prebuilt_library_shared {
  8183. name: "mylib",
  8184. prefer: false,
  8185. srcs: ["prebuilt.so"],
  8186. stubs: {
  8187. versions: ["current"],
  8188. },
  8189. apex_available: ["myapex"],
  8190. }
  8191. `)
  8192. }
  8193. func TestCompressedApex(t *testing.T) {
  8194. ctx := testApex(t, `
  8195. apex {
  8196. name: "myapex",
  8197. key: "myapex.key",
  8198. compressible: true,
  8199. updatable: false,
  8200. }
  8201. apex_key {
  8202. name: "myapex.key",
  8203. public_key: "testkey.avbpubkey",
  8204. private_key: "testkey.pem",
  8205. }
  8206. `,
  8207. android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  8208. variables.CompressedApex = proptools.BoolPtr(true)
  8209. }),
  8210. )
  8211. compressRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("compressRule")
  8212. ensureContains(t, compressRule.Output.String(), "myapex.capex.unsigned")
  8213. signApkRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Description("sign compressedApex")
  8214. ensureEquals(t, signApkRule.Input.String(), compressRule.Output.String())
  8215. // Make sure output of bundle is .capex
  8216. ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
  8217. ensureContains(t, ab.outputFile.String(), "myapex.capex")
  8218. // Verify android.mk rules
  8219. data := android.AndroidMkDataForTest(t, ctx, ab)
  8220. var builder strings.Builder
  8221. data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
  8222. androidMk := builder.String()
  8223. ensureContains(t, androidMk, "LOCAL_MODULE_STEM := myapex.capex\n")
  8224. }
  8225. func TestPreferredPrebuiltSharedLibDep(t *testing.T) {
  8226. ctx := testApex(t, `
  8227. apex {
  8228. name: "myapex",
  8229. key: "myapex.key",
  8230. native_shared_libs: ["mylib"],
  8231. updatable: false,
  8232. }
  8233. apex_key {
  8234. name: "myapex.key",
  8235. public_key: "testkey.avbpubkey",
  8236. private_key: "testkey.pem",
  8237. }
  8238. cc_library {
  8239. name: "mylib",
  8240. srcs: ["mylib.cpp"],
  8241. apex_available: ["myapex"],
  8242. shared_libs: ["otherlib"],
  8243. system_shared_libs: [],
  8244. }
  8245. cc_library {
  8246. name: "otherlib",
  8247. srcs: ["mylib.cpp"],
  8248. stubs: {
  8249. versions: ["current"],
  8250. },
  8251. }
  8252. cc_prebuilt_library_shared {
  8253. name: "otherlib",
  8254. prefer: true,
  8255. srcs: ["prebuilt.so"],
  8256. stubs: {
  8257. versions: ["current"],
  8258. },
  8259. }
  8260. `)
  8261. ab := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
  8262. data := android.AndroidMkDataForTest(t, ctx, ab)
  8263. var builder strings.Builder
  8264. data.Custom(&builder, ab.BaseModuleName(), "TARGET_", "", data)
  8265. androidMk := builder.String()
  8266. // The make level dependency needs to be on otherlib - prebuilt_otherlib isn't
  8267. // a thing there.
  8268. ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := libc++:64 mylib.myapex:64 apex_manifest.pb.myapex apex_pubkey.myapex otherlib\n")
  8269. }
  8270. func TestExcludeDependency(t *testing.T) {
  8271. ctx := testApex(t, `
  8272. apex {
  8273. name: "myapex",
  8274. key: "myapex.key",
  8275. native_shared_libs: ["mylib"],
  8276. updatable: false,
  8277. }
  8278. apex_key {
  8279. name: "myapex.key",
  8280. public_key: "testkey.avbpubkey",
  8281. private_key: "testkey.pem",
  8282. }
  8283. cc_library {
  8284. name: "mylib",
  8285. srcs: ["mylib.cpp"],
  8286. system_shared_libs: [],
  8287. stl: "none",
  8288. apex_available: ["myapex"],
  8289. shared_libs: ["mylib2"],
  8290. target: {
  8291. apex: {
  8292. exclude_shared_libs: ["mylib2"],
  8293. },
  8294. },
  8295. }
  8296. cc_library {
  8297. name: "mylib2",
  8298. srcs: ["mylib.cpp"],
  8299. system_shared_libs: [],
  8300. stl: "none",
  8301. }
  8302. `)
  8303. // Check if mylib is linked to mylib2 for the non-apex target
  8304. ldFlags := ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared").Rule("ld").Args["libFlags"]
  8305. ensureContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared/mylib2.so")
  8306. // Make sure that the link doesn't occur for the apex target
  8307. ldFlags = ctx.ModuleForTests("mylib", "android_arm64_armv8-a_shared_apex10000").Rule("ld").Args["libFlags"]
  8308. ensureNotContains(t, ldFlags, "mylib2/android_arm64_armv8-a_shared_apex10000/mylib2.so")
  8309. // It shouldn't appear in the copy cmd as well.
  8310. copyCmds := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("apexRule").Args["copy_commands"]
  8311. ensureNotContains(t, copyCmds, "image.apex/lib64/mylib2.so")
  8312. }
  8313. func TestPrebuiltStubLibDep(t *testing.T) {
  8314. bpBase := `
  8315. apex {
  8316. name: "myapex",
  8317. key: "myapex.key",
  8318. native_shared_libs: ["mylib"],
  8319. updatable: false,
  8320. }
  8321. apex_key {
  8322. name: "myapex.key",
  8323. public_key: "testkey.avbpubkey",
  8324. private_key: "testkey.pem",
  8325. }
  8326. cc_library {
  8327. name: "mylib",
  8328. srcs: ["mylib.cpp"],
  8329. apex_available: ["myapex"],
  8330. shared_libs: ["stublib"],
  8331. system_shared_libs: [],
  8332. }
  8333. apex {
  8334. name: "otherapex",
  8335. enabled: %s,
  8336. key: "myapex.key",
  8337. native_shared_libs: ["stublib"],
  8338. updatable: false,
  8339. }
  8340. `
  8341. stublibSourceBp := `
  8342. cc_library {
  8343. name: "stublib",
  8344. srcs: ["mylib.cpp"],
  8345. apex_available: ["otherapex"],
  8346. system_shared_libs: [],
  8347. stl: "none",
  8348. stubs: {
  8349. versions: ["1"],
  8350. },
  8351. }
  8352. `
  8353. stublibPrebuiltBp := `
  8354. cc_prebuilt_library_shared {
  8355. name: "stublib",
  8356. srcs: ["prebuilt.so"],
  8357. apex_available: ["otherapex"],
  8358. stubs: {
  8359. versions: ["1"],
  8360. },
  8361. %s
  8362. }
  8363. `
  8364. tests := []struct {
  8365. name string
  8366. stublibBp string
  8367. usePrebuilt bool
  8368. modNames []string // Modules to collect AndroidMkEntries for
  8369. otherApexEnabled []string
  8370. }{
  8371. {
  8372. name: "only_source",
  8373. stublibBp: stublibSourceBp,
  8374. usePrebuilt: false,
  8375. modNames: []string{"stublib"},
  8376. otherApexEnabled: []string{"true", "false"},
  8377. },
  8378. {
  8379. name: "source_preferred",
  8380. stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, ""),
  8381. usePrebuilt: false,
  8382. modNames: []string{"stublib", "prebuilt_stublib"},
  8383. otherApexEnabled: []string{"true", "false"},
  8384. },
  8385. {
  8386. name: "prebuilt_preferred",
  8387. stublibBp: stublibSourceBp + fmt.Sprintf(stublibPrebuiltBp, "prefer: true,"),
  8388. usePrebuilt: true,
  8389. modNames: []string{"stublib", "prebuilt_stublib"},
  8390. otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
  8391. },
  8392. {
  8393. name: "only_prebuilt",
  8394. stublibBp: fmt.Sprintf(stublibPrebuiltBp, ""),
  8395. usePrebuilt: true,
  8396. modNames: []string{"stublib"},
  8397. otherApexEnabled: []string{"false"}, // No "true" since APEX cannot depend on prebuilt.
  8398. },
  8399. }
  8400. for _, test := range tests {
  8401. t.Run(test.name, func(t *testing.T) {
  8402. for _, otherApexEnabled := range test.otherApexEnabled {
  8403. t.Run("otherapex_enabled_"+otherApexEnabled, func(t *testing.T) {
  8404. ctx := testApex(t, fmt.Sprintf(bpBase, otherApexEnabled)+test.stublibBp)
  8405. type modAndMkEntries struct {
  8406. mod *cc.Module
  8407. mkEntries android.AndroidMkEntries
  8408. }
  8409. entries := []*modAndMkEntries{}
  8410. // Gather shared lib modules that are installable
  8411. for _, modName := range test.modNames {
  8412. for _, variant := range ctx.ModuleVariantsForTests(modName) {
  8413. if !strings.HasPrefix(variant, "android_arm64_armv8-a_shared") {
  8414. continue
  8415. }
  8416. mod := ctx.ModuleForTests(modName, variant).Module().(*cc.Module)
  8417. if !mod.Enabled() || mod.IsHideFromMake() {
  8418. continue
  8419. }
  8420. for _, ent := range android.AndroidMkEntriesForTest(t, ctx, mod) {
  8421. if ent.Disabled {
  8422. continue
  8423. }
  8424. entries = append(entries, &modAndMkEntries{
  8425. mod: mod,
  8426. mkEntries: ent,
  8427. })
  8428. }
  8429. }
  8430. }
  8431. var entry *modAndMkEntries = nil
  8432. for _, ent := range entries {
  8433. if strings.Join(ent.mkEntries.EntryMap["LOCAL_MODULE"], ",") == "stublib" {
  8434. if entry != nil {
  8435. t.Errorf("More than one AndroidMk entry for \"stublib\": %s and %s", entry.mod, ent.mod)
  8436. } else {
  8437. entry = ent
  8438. }
  8439. }
  8440. }
  8441. if entry == nil {
  8442. t.Errorf("AndroidMk entry for \"stublib\" missing")
  8443. } else {
  8444. isPrebuilt := entry.mod.Prebuilt() != nil
  8445. if isPrebuilt != test.usePrebuilt {
  8446. t.Errorf("Wrong module for \"stublib\" AndroidMk entry: got prebuilt %t, want prebuilt %t", isPrebuilt, test.usePrebuilt)
  8447. }
  8448. if !entry.mod.IsStubs() {
  8449. t.Errorf("Module for \"stublib\" AndroidMk entry isn't a stub: %s", entry.mod)
  8450. }
  8451. if entry.mkEntries.EntryMap["LOCAL_NOT_AVAILABLE_FOR_PLATFORM"] != nil {
  8452. t.Errorf("AndroidMk entry for \"stublib\" has LOCAL_NOT_AVAILABLE_FOR_PLATFORM set: %+v", entry.mkEntries)
  8453. }
  8454. cflags := entry.mkEntries.EntryMap["LOCAL_EXPORT_CFLAGS"]
  8455. expected := "-D__STUBLIB_API__=10000"
  8456. if !android.InList(expected, cflags) {
  8457. t.Errorf("LOCAL_EXPORT_CFLAGS expected to have %q, but got %q", expected, cflags)
  8458. }
  8459. }
  8460. })
  8461. }
  8462. })
  8463. }
  8464. }
  8465. func TestHostApexInHostOnlyBuild(t *testing.T) {
  8466. testApex(t, `
  8467. apex {
  8468. name: "myapex",
  8469. host_supported: true,
  8470. key: "myapex.key",
  8471. updatable: false,
  8472. payload_type: "zip",
  8473. }
  8474. apex_key {
  8475. name: "myapex.key",
  8476. public_key: "testkey.avbpubkey",
  8477. private_key: "testkey.pem",
  8478. }
  8479. `,
  8480. android.FixtureModifyConfig(func(config android.Config) {
  8481. // We may not have device targets in all builds, e.g. in
  8482. // prebuilts/build-tools/build-prebuilts.sh
  8483. config.Targets[android.Android] = []android.Target{}
  8484. }))
  8485. }
  8486. func TestApexJavaCoverage(t *testing.T) {
  8487. bp := `
  8488. apex {
  8489. name: "myapex",
  8490. key: "myapex.key",
  8491. java_libs: ["mylib"],
  8492. bootclasspath_fragments: ["mybootclasspathfragment"],
  8493. systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
  8494. updatable: false,
  8495. }
  8496. apex_key {
  8497. name: "myapex.key",
  8498. public_key: "testkey.avbpubkey",
  8499. private_key: "testkey.pem",
  8500. }
  8501. java_library {
  8502. name: "mylib",
  8503. srcs: ["mylib.java"],
  8504. apex_available: ["myapex"],
  8505. compile_dex: true,
  8506. }
  8507. bootclasspath_fragment {
  8508. name: "mybootclasspathfragment",
  8509. contents: ["mybootclasspathlib"],
  8510. apex_available: ["myapex"],
  8511. hidden_api: {
  8512. split_packages: ["*"],
  8513. },
  8514. }
  8515. java_library {
  8516. name: "mybootclasspathlib",
  8517. srcs: ["mybootclasspathlib.java"],
  8518. apex_available: ["myapex"],
  8519. compile_dex: true,
  8520. }
  8521. systemserverclasspath_fragment {
  8522. name: "mysystemserverclasspathfragment",
  8523. contents: ["mysystemserverclasspathlib"],
  8524. apex_available: ["myapex"],
  8525. }
  8526. java_library {
  8527. name: "mysystemserverclasspathlib",
  8528. srcs: ["mysystemserverclasspathlib.java"],
  8529. apex_available: ["myapex"],
  8530. compile_dex: true,
  8531. }
  8532. `
  8533. result := android.GroupFixturePreparers(
  8534. PrepareForTestWithApexBuildComponents,
  8535. prepareForTestWithMyapex,
  8536. java.PrepareForTestWithJavaDefaultModules,
  8537. android.PrepareForTestWithAndroidBuildComponents,
  8538. android.FixtureWithRootAndroidBp(bp),
  8539. dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
  8540. dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
  8541. java.PrepareForTestWithJacocoInstrumentation,
  8542. ).RunTest(t)
  8543. // Make sure jacoco ran on both mylib and mybootclasspathlib
  8544. if result.ModuleForTests("mylib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
  8545. t.Errorf("Failed to find jacoco rule for mylib")
  8546. }
  8547. if result.ModuleForTests("mybootclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
  8548. t.Errorf("Failed to find jacoco rule for mybootclasspathlib")
  8549. }
  8550. if result.ModuleForTests("mysystemserverclasspathlib", "android_common_apex10000").MaybeRule("jacoco").Rule == nil {
  8551. t.Errorf("Failed to find jacoco rule for mysystemserverclasspathlib")
  8552. }
  8553. }
  8554. func TestProhibitStaticExecutable(t *testing.T) {
  8555. testApexError(t, `executable mybin is static`, `
  8556. apex {
  8557. name: "myapex",
  8558. key: "myapex.key",
  8559. binaries: ["mybin"],
  8560. min_sdk_version: "29",
  8561. }
  8562. apex_key {
  8563. name: "myapex.key",
  8564. public_key: "testkey.avbpubkey",
  8565. private_key: "testkey.pem",
  8566. }
  8567. cc_binary {
  8568. name: "mybin",
  8569. srcs: ["mylib.cpp"],
  8570. relative_install_path: "foo/bar",
  8571. static_executable: true,
  8572. system_shared_libs: [],
  8573. stl: "none",
  8574. apex_available: [ "myapex" ],
  8575. min_sdk_version: "29",
  8576. }
  8577. `)
  8578. testApexError(t, `executable mybin.rust is static`, `
  8579. apex {
  8580. name: "myapex",
  8581. key: "myapex.key",
  8582. binaries: ["mybin.rust"],
  8583. min_sdk_version: "29",
  8584. }
  8585. apex_key {
  8586. name: "myapex.key",
  8587. public_key: "testkey.avbpubkey",
  8588. private_key: "testkey.pem",
  8589. }
  8590. rust_binary {
  8591. name: "mybin.rust",
  8592. srcs: ["foo.rs"],
  8593. static_executable: true,
  8594. apex_available: ["myapex"],
  8595. min_sdk_version: "29",
  8596. }
  8597. `)
  8598. }
  8599. func TestAndroidMk_DexpreoptBuiltInstalledForApex(t *testing.T) {
  8600. ctx := testApex(t, `
  8601. apex {
  8602. name: "myapex",
  8603. key: "myapex.key",
  8604. updatable: false,
  8605. java_libs: ["foo"],
  8606. }
  8607. apex_key {
  8608. name: "myapex.key",
  8609. public_key: "testkey.avbpubkey",
  8610. private_key: "testkey.pem",
  8611. }
  8612. java_library {
  8613. name: "foo",
  8614. srcs: ["foo.java"],
  8615. apex_available: ["myapex"],
  8616. installable: true,
  8617. }
  8618. `,
  8619. dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
  8620. )
  8621. apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
  8622. data := android.AndroidMkDataForTest(t, ctx, apexBundle)
  8623. var builder strings.Builder
  8624. data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
  8625. androidMk := builder.String()
  8626. ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex\n")
  8627. }
  8628. func TestAndroidMk_DexpreoptBuiltInstalledForApex_Prebuilt(t *testing.T) {
  8629. ctx := testApex(t, `
  8630. prebuilt_apex {
  8631. name: "myapex",
  8632. arch: {
  8633. arm64: {
  8634. src: "myapex-arm64.apex",
  8635. },
  8636. arm: {
  8637. src: "myapex-arm.apex",
  8638. },
  8639. },
  8640. exported_java_libs: ["foo"],
  8641. }
  8642. java_import {
  8643. name: "foo",
  8644. jars: ["foo.jar"],
  8645. apex_available: ["myapex"],
  8646. }
  8647. `,
  8648. dexpreopt.FixtureSetApexSystemServerJars("myapex:foo"),
  8649. )
  8650. prebuilt := ctx.ModuleForTests("myapex", "android_common_myapex").Module().(*Prebuilt)
  8651. entriesList := android.AndroidMkEntriesForTest(t, ctx, prebuilt)
  8652. mainModuleEntries := entriesList[0]
  8653. android.AssertArrayString(t,
  8654. "LOCAL_REQUIRED_MODULES",
  8655. mainModuleEntries.EntryMap["LOCAL_REQUIRED_MODULES"],
  8656. []string{
  8657. "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.odex",
  8658. "foo-dexpreopt-arm64-apex@myapex@javalib@foo.jar@classes.vdex",
  8659. })
  8660. }
  8661. func TestAndroidMk_RequiredModules(t *testing.T) {
  8662. ctx := testApex(t, `
  8663. apex {
  8664. name: "myapex",
  8665. key: "myapex.key",
  8666. updatable: false,
  8667. java_libs: ["foo"],
  8668. required: ["otherapex"],
  8669. }
  8670. apex {
  8671. name: "otherapex",
  8672. key: "myapex.key",
  8673. updatable: false,
  8674. java_libs: ["foo"],
  8675. required: ["otherapex"],
  8676. }
  8677. apex_key {
  8678. name: "myapex.key",
  8679. public_key: "testkey.avbpubkey",
  8680. private_key: "testkey.pem",
  8681. }
  8682. java_library {
  8683. name: "foo",
  8684. srcs: ["foo.java"],
  8685. apex_available: ["myapex", "otherapex"],
  8686. installable: true,
  8687. }
  8688. `)
  8689. apexBundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
  8690. data := android.AndroidMkDataForTest(t, ctx, apexBundle)
  8691. var builder strings.Builder
  8692. data.Custom(&builder, apexBundle.BaseModuleName(), "TARGET_", "", data)
  8693. androidMk := builder.String()
  8694. ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := foo.myapex apex_manifest.pb.myapex apex_pubkey.myapex otherapex")
  8695. }
  8696. func TestAndroidMk_RequiredDeps(t *testing.T) {
  8697. ctx := testApex(t, `
  8698. apex {
  8699. name: "myapex",
  8700. key: "myapex.key",
  8701. updatable: false,
  8702. }
  8703. apex_key {
  8704. name: "myapex.key",
  8705. public_key: "testkey.avbpubkey",
  8706. private_key: "testkey.pem",
  8707. }
  8708. `)
  8709. bundle := ctx.ModuleForTests("myapex", "android_common_myapex_image").Module().(*apexBundle)
  8710. bundle.makeModulesToInstall = append(bundle.makeModulesToInstall, "foo")
  8711. data := android.AndroidMkDataForTest(t, ctx, bundle)
  8712. var builder strings.Builder
  8713. data.Custom(&builder, bundle.BaseModuleName(), "TARGET_", "", data)
  8714. androidMk := builder.String()
  8715. ensureContains(t, androidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex apex_pubkey.myapex foo\n")
  8716. flattenedBundle := ctx.ModuleForTests("myapex", "android_common_myapex_flattened").Module().(*apexBundle)
  8717. flattenedBundle.makeModulesToInstall = append(flattenedBundle.makeModulesToInstall, "foo")
  8718. flattenedData := android.AndroidMkDataForTest(t, ctx, flattenedBundle)
  8719. var flattenedBuilder strings.Builder
  8720. flattenedData.Custom(&flattenedBuilder, flattenedBundle.BaseModuleName(), "TARGET_", "", flattenedData)
  8721. flattenedAndroidMk := flattenedBuilder.String()
  8722. ensureContains(t, flattenedAndroidMk, "LOCAL_REQUIRED_MODULES := apex_manifest.pb.myapex.flattened apex_pubkey.myapex.flattened foo\n")
  8723. }
  8724. func TestApexOutputFileProducer(t *testing.T) {
  8725. for _, tc := range []struct {
  8726. name string
  8727. ref string
  8728. expected_data []string
  8729. }{
  8730. {
  8731. name: "test_using_output",
  8732. ref: ":myapex",
  8733. expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.capex:myapex.capex"},
  8734. },
  8735. {
  8736. name: "test_using_apex",
  8737. ref: ":myapex{.apex}",
  8738. expected_data: []string{"out/soong/.intermediates/myapex/android_common_myapex_image/myapex.apex:myapex.apex"},
  8739. },
  8740. } {
  8741. t.Run(tc.name, func(t *testing.T) {
  8742. ctx := testApex(t, `
  8743. apex {
  8744. name: "myapex",
  8745. key: "myapex.key",
  8746. compressible: true,
  8747. updatable: false,
  8748. }
  8749. apex_key {
  8750. name: "myapex.key",
  8751. public_key: "testkey.avbpubkey",
  8752. private_key: "testkey.pem",
  8753. }
  8754. java_test {
  8755. name: "`+tc.name+`",
  8756. srcs: ["a.java"],
  8757. data: ["`+tc.ref+`"],
  8758. }
  8759. `,
  8760. android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
  8761. variables.CompressedApex = proptools.BoolPtr(true)
  8762. }))
  8763. javaTest := ctx.ModuleForTests(tc.name, "android_common").Module().(*java.Test)
  8764. data := android.AndroidMkEntriesForTest(t, ctx, javaTest)[0].EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
  8765. android.AssertStringPathsRelativeToTopEquals(t, "data", ctx.Config(), tc.expected_data, data)
  8766. })
  8767. }
  8768. }
  8769. func TestSdkLibraryCanHaveHigherMinSdkVersion(t *testing.T) {
  8770. preparer := android.GroupFixturePreparers(
  8771. PrepareForTestWithApexBuildComponents,
  8772. prepareForTestWithMyapex,
  8773. java.PrepareForTestWithJavaSdkLibraryFiles,
  8774. java.PrepareForTestWithJavaDefaultModules,
  8775. android.PrepareForTestWithAndroidBuildComponents,
  8776. dexpreopt.FixtureSetApexBootJars("myapex:mybootclasspathlib"),
  8777. dexpreopt.FixtureSetApexSystemServerJars("myapex:mysystemserverclasspathlib"),
  8778. )
  8779. // Test java_sdk_library in bootclasspath_fragment may define higher min_sdk_version than the apex
  8780. t.Run("bootclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
  8781. preparer.RunTestWithBp(t, `
  8782. apex {
  8783. name: "myapex",
  8784. key: "myapex.key",
  8785. bootclasspath_fragments: ["mybootclasspathfragment"],
  8786. min_sdk_version: "30",
  8787. updatable: false,
  8788. }
  8789. apex_key {
  8790. name: "myapex.key",
  8791. public_key: "testkey.avbpubkey",
  8792. private_key: "testkey.pem",
  8793. }
  8794. bootclasspath_fragment {
  8795. name: "mybootclasspathfragment",
  8796. contents: ["mybootclasspathlib"],
  8797. apex_available: ["myapex"],
  8798. hidden_api: {
  8799. split_packages: ["*"],
  8800. },
  8801. }
  8802. java_sdk_library {
  8803. name: "mybootclasspathlib",
  8804. srcs: ["mybootclasspathlib.java"],
  8805. apex_available: ["myapex"],
  8806. compile_dex: true,
  8807. unsafe_ignore_missing_latest_api: true,
  8808. min_sdk_version: "31",
  8809. static_libs: ["util"],
  8810. }
  8811. java_library {
  8812. name: "util",
  8813. srcs: ["a.java"],
  8814. apex_available: ["myapex"],
  8815. min_sdk_version: "31",
  8816. static_libs: ["another_util"],
  8817. }
  8818. java_library {
  8819. name: "another_util",
  8820. srcs: ["a.java"],
  8821. min_sdk_version: "31",
  8822. apex_available: ["myapex"],
  8823. }
  8824. `)
  8825. })
  8826. // Test java_sdk_library in systemserverclasspath_fragment may define higher min_sdk_version than the apex
  8827. t.Run("systemserverclasspath_fragment jar has higher min_sdk_version than apex", func(t *testing.T) {
  8828. preparer.RunTestWithBp(t, `
  8829. apex {
  8830. name: "myapex",
  8831. key: "myapex.key",
  8832. systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
  8833. min_sdk_version: "30",
  8834. updatable: false,
  8835. }
  8836. apex_key {
  8837. name: "myapex.key",
  8838. public_key: "testkey.avbpubkey",
  8839. private_key: "testkey.pem",
  8840. }
  8841. systemserverclasspath_fragment {
  8842. name: "mysystemserverclasspathfragment",
  8843. contents: ["mysystemserverclasspathlib"],
  8844. apex_available: ["myapex"],
  8845. }
  8846. java_sdk_library {
  8847. name: "mysystemserverclasspathlib",
  8848. srcs: ["mysystemserverclasspathlib.java"],
  8849. apex_available: ["myapex"],
  8850. compile_dex: true,
  8851. min_sdk_version: "32",
  8852. unsafe_ignore_missing_latest_api: true,
  8853. static_libs: ["util"],
  8854. }
  8855. java_library {
  8856. name: "util",
  8857. srcs: ["a.java"],
  8858. apex_available: ["myapex"],
  8859. min_sdk_version: "31",
  8860. static_libs: ["another_util"],
  8861. }
  8862. java_library {
  8863. name: "another_util",
  8864. srcs: ["a.java"],
  8865. min_sdk_version: "31",
  8866. apex_available: ["myapex"],
  8867. }
  8868. `)
  8869. })
  8870. t.Run("bootclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
  8871. preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mybootclasspathlib".*must set min_sdk_version`)).
  8872. RunTestWithBp(t, `
  8873. apex {
  8874. name: "myapex",
  8875. key: "myapex.key",
  8876. bootclasspath_fragments: ["mybootclasspathfragment"],
  8877. min_sdk_version: "30",
  8878. updatable: false,
  8879. }
  8880. apex_key {
  8881. name: "myapex.key",
  8882. public_key: "testkey.avbpubkey",
  8883. private_key: "testkey.pem",
  8884. }
  8885. bootclasspath_fragment {
  8886. name: "mybootclasspathfragment",
  8887. contents: ["mybootclasspathlib"],
  8888. apex_available: ["myapex"],
  8889. hidden_api: {
  8890. split_packages: ["*"],
  8891. },
  8892. }
  8893. java_sdk_library {
  8894. name: "mybootclasspathlib",
  8895. srcs: ["mybootclasspathlib.java"],
  8896. apex_available: ["myapex"],
  8897. compile_dex: true,
  8898. unsafe_ignore_missing_latest_api: true,
  8899. }
  8900. `)
  8901. })
  8902. t.Run("systemserverclasspath_fragment jar must set min_sdk_version", func(t *testing.T) {
  8903. preparer.ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(`module "mysystemserverclasspathlib".*must set min_sdk_version`)).
  8904. RunTestWithBp(t, `
  8905. apex {
  8906. name: "myapex",
  8907. key: "myapex.key",
  8908. systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
  8909. min_sdk_version: "30",
  8910. updatable: false,
  8911. }
  8912. apex_key {
  8913. name: "myapex.key",
  8914. public_key: "testkey.avbpubkey",
  8915. private_key: "testkey.pem",
  8916. }
  8917. systemserverclasspath_fragment {
  8918. name: "mysystemserverclasspathfragment",
  8919. contents: ["mysystemserverclasspathlib"],
  8920. apex_available: ["myapex"],
  8921. }
  8922. java_sdk_library {
  8923. name: "mysystemserverclasspathlib",
  8924. srcs: ["mysystemserverclasspathlib.java"],
  8925. apex_available: ["myapex"],
  8926. compile_dex: true,
  8927. unsafe_ignore_missing_latest_api: true,
  8928. }
  8929. `)
  8930. })
  8931. }
  8932. // Verifies that the APEX depends on all the Make modules in the list.
  8933. func ensureContainsRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
  8934. a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
  8935. for _, dep := range deps {
  8936. android.AssertStringListContains(t, "", a.makeModulesToInstall, dep)
  8937. }
  8938. }
  8939. // Verifies that the APEX does not depend on any of the Make modules in the list.
  8940. func ensureDoesNotContainRequiredDeps(t *testing.T, ctx *android.TestContext, moduleName, variant string, deps []string) {
  8941. a := ctx.ModuleForTests(moduleName, variant).Module().(*apexBundle)
  8942. for _, dep := range deps {
  8943. android.AssertStringListDoesNotContain(t, "", a.makeModulesToInstall, dep)
  8944. }
  8945. }
  8946. // TODO(b/193460475): Re-enable this test
  8947. //func TestApexStrictUpdtabilityLint(t *testing.T) {
  8948. // bpTemplate := `
  8949. // apex {
  8950. // name: "myapex",
  8951. // key: "myapex.key",
  8952. // java_libs: ["myjavalib"],
  8953. // updatable: %v,
  8954. // min_sdk_version: "29",
  8955. // }
  8956. // apex_key {
  8957. // name: "myapex.key",
  8958. // }
  8959. // java_library {
  8960. // name: "myjavalib",
  8961. // srcs: ["MyClass.java"],
  8962. // apex_available: [ "myapex" ],
  8963. // lint: {
  8964. // strict_updatability_linting: %v,
  8965. // },
  8966. // sdk_version: "current",
  8967. // min_sdk_version: "29",
  8968. // }
  8969. // `
  8970. // fs := android.MockFS{
  8971. // "lint-baseline.xml": nil,
  8972. // }
  8973. //
  8974. // testCases := []struct {
  8975. // testCaseName string
  8976. // apexUpdatable bool
  8977. // javaStrictUpdtabilityLint bool
  8978. // lintFileExists bool
  8979. // disallowedFlagExpected bool
  8980. // }{
  8981. // {
  8982. // testCaseName: "lint-baseline.xml does not exist, no disallowed flag necessary in lint cmd",
  8983. // apexUpdatable: true,
  8984. // javaStrictUpdtabilityLint: true,
  8985. // lintFileExists: false,
  8986. // disallowedFlagExpected: false,
  8987. // },
  8988. // {
  8989. // testCaseName: "non-updatable apex respects strict_updatability of javalib",
  8990. // apexUpdatable: false,
  8991. // javaStrictUpdtabilityLint: false,
  8992. // lintFileExists: true,
  8993. // disallowedFlagExpected: false,
  8994. // },
  8995. // {
  8996. // testCaseName: "non-updatable apex respects strict updatability of javalib",
  8997. // apexUpdatable: false,
  8998. // javaStrictUpdtabilityLint: true,
  8999. // lintFileExists: true,
  9000. // disallowedFlagExpected: true,
  9001. // },
  9002. // {
  9003. // testCaseName: "updatable apex sets strict updatability of javalib to true",
  9004. // apexUpdatable: true,
  9005. // javaStrictUpdtabilityLint: false, // will be set to true by mutator
  9006. // lintFileExists: true,
  9007. // disallowedFlagExpected: true,
  9008. // },
  9009. // }
  9010. //
  9011. // for _, testCase := range testCases {
  9012. // bp := fmt.Sprintf(bpTemplate, testCase.apexUpdatable, testCase.javaStrictUpdtabilityLint)
  9013. // fixtures := []android.FixturePreparer{}
  9014. // if testCase.lintFileExists {
  9015. // fixtures = append(fixtures, fs.AddToFixture())
  9016. // }
  9017. //
  9018. // result := testApex(t, bp, fixtures...)
  9019. // myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
  9020. // sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
  9021. // disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi")
  9022. //
  9023. // if disallowedFlagActual != testCase.disallowedFlagExpected {
  9024. // t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
  9025. // }
  9026. // }
  9027. //}
  9028. //
  9029. //func TestUpdatabilityLintSkipLibcore(t *testing.T) {
  9030. // bp := `
  9031. // apex {
  9032. // name: "myapex",
  9033. // key: "myapex.key",
  9034. // java_libs: ["myjavalib"],
  9035. // updatable: true,
  9036. // min_sdk_version: "29",
  9037. // }
  9038. // apex_key {
  9039. // name: "myapex.key",
  9040. // }
  9041. // java_library {
  9042. // name: "myjavalib",
  9043. // srcs: ["MyClass.java"],
  9044. // apex_available: [ "myapex" ],
  9045. // sdk_version: "current",
  9046. // min_sdk_version: "29",
  9047. // }
  9048. // `
  9049. //
  9050. // testCases := []struct {
  9051. // testCaseName string
  9052. // moduleDirectory string
  9053. // disallowedFlagExpected bool
  9054. // }{
  9055. // {
  9056. // testCaseName: "lintable module defined outside libcore",
  9057. // moduleDirectory: "",
  9058. // disallowedFlagExpected: true,
  9059. // },
  9060. // {
  9061. // testCaseName: "lintable module defined in libcore root directory",
  9062. // moduleDirectory: "libcore/",
  9063. // disallowedFlagExpected: false,
  9064. // },
  9065. // {
  9066. // testCaseName: "lintable module defined in libcore child directory",
  9067. // moduleDirectory: "libcore/childdir/",
  9068. // disallowedFlagExpected: true,
  9069. // },
  9070. // }
  9071. //
  9072. // for _, testCase := range testCases {
  9073. // lintFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"lint-baseline.xml", "")
  9074. // bpFileCreator := android.FixtureAddTextFile(testCase.moduleDirectory+"Android.bp", bp)
  9075. // result := testApex(t, "", lintFileCreator, bpFileCreator)
  9076. // myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
  9077. // sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
  9078. // cmdFlags := fmt.Sprintf("--baseline %vlint-baseline.xml --disallowed_issues NewApi", testCase.moduleDirectory)
  9079. // disallowedFlagActual := strings.Contains(*sboxProto.Commands[0].Command, cmdFlags)
  9080. //
  9081. // if disallowedFlagActual != testCase.disallowedFlagExpected {
  9082. // t.Errorf("Failed testcase: %v \nActual lint cmd: %v", testCase.testCaseName, *sboxProto.Commands[0].Command)
  9083. // }
  9084. // }
  9085. //}
  9086. //
  9087. //// checks transtive deps of an apex coming from bootclasspath_fragment
  9088. //func TestApexStrictUpdtabilityLintBcpFragmentDeps(t *testing.T) {
  9089. // bp := `
  9090. // apex {
  9091. // name: "myapex",
  9092. // key: "myapex.key",
  9093. // bootclasspath_fragments: ["mybootclasspathfragment"],
  9094. // updatable: true,
  9095. // min_sdk_version: "29",
  9096. // }
  9097. // apex_key {
  9098. // name: "myapex.key",
  9099. // }
  9100. // bootclasspath_fragment {
  9101. // name: "mybootclasspathfragment",
  9102. // contents: ["myjavalib"],
  9103. // apex_available: ["myapex"],
  9104. // hidden_api: {
  9105. // split_packages: ["*"],
  9106. // },
  9107. // }
  9108. // java_library {
  9109. // name: "myjavalib",
  9110. // srcs: ["MyClass.java"],
  9111. // apex_available: [ "myapex" ],
  9112. // sdk_version: "current",
  9113. // min_sdk_version: "29",
  9114. // compile_dex: true,
  9115. // }
  9116. // `
  9117. // fs := android.MockFS{
  9118. // "lint-baseline.xml": nil,
  9119. // }
  9120. //
  9121. // result := testApex(t, bp, dexpreopt.FixtureSetApexBootJars("myapex:myjavalib"), fs.AddToFixture())
  9122. // myjavalib := result.ModuleForTests("myjavalib", "android_common_apex29")
  9123. // sboxProto := android.RuleBuilderSboxProtoForTests(t, myjavalib.Output("lint.sbox.textproto"))
  9124. // if !strings.Contains(*sboxProto.Commands[0].Command, "--baseline lint-baseline.xml --disallowed_issues NewApi") {
  9125. // t.Errorf("Strict updabality lint missing in myjavalib coming from bootclasspath_fragment mybootclasspath-fragment\nActual lint cmd: %v", *sboxProto.Commands[0].Command)
  9126. // }
  9127. //}
  9128. // updatable apexes should propagate updatable=true to its apps
  9129. func TestUpdatableApexEnforcesAppUpdatability(t *testing.T) {
  9130. bp := `
  9131. apex {
  9132. name: "myapex",
  9133. key: "myapex.key",
  9134. updatable: %v,
  9135. apps: [
  9136. "myapp",
  9137. ],
  9138. min_sdk_version: "30",
  9139. }
  9140. apex_key {
  9141. name: "myapex.key",
  9142. }
  9143. android_app {
  9144. name: "myapp",
  9145. updatable: %v,
  9146. apex_available: [
  9147. "myapex",
  9148. ],
  9149. sdk_version: "current",
  9150. min_sdk_version: "30",
  9151. }
  9152. `
  9153. testCases := []struct {
  9154. name string
  9155. apex_is_updatable_bp bool
  9156. app_is_updatable_bp bool
  9157. app_is_updatable_expected bool
  9158. }{
  9159. {
  9160. name: "Non-updatable apex respects updatable property of non-updatable app",
  9161. apex_is_updatable_bp: false,
  9162. app_is_updatable_bp: false,
  9163. app_is_updatable_expected: false,
  9164. },
  9165. {
  9166. name: "Non-updatable apex respects updatable property of updatable app",
  9167. apex_is_updatable_bp: false,
  9168. app_is_updatable_bp: true,
  9169. app_is_updatable_expected: true,
  9170. },
  9171. {
  9172. name: "Updatable apex respects updatable property of updatable app",
  9173. apex_is_updatable_bp: true,
  9174. app_is_updatable_bp: true,
  9175. app_is_updatable_expected: true,
  9176. },
  9177. {
  9178. name: "Updatable apex sets updatable=true on non-updatable app",
  9179. apex_is_updatable_bp: true,
  9180. app_is_updatable_bp: false,
  9181. app_is_updatable_expected: true,
  9182. },
  9183. }
  9184. for _, testCase := range testCases {
  9185. result := testApex(t, fmt.Sprintf(bp, testCase.apex_is_updatable_bp, testCase.app_is_updatable_bp))
  9186. myapp := result.ModuleForTests("myapp", "android_common").Module().(*java.AndroidApp)
  9187. android.AssertBoolEquals(t, testCase.name, testCase.app_is_updatable_expected, myapp.Updatable())
  9188. }
  9189. }
  9190. func TestApexBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
  9191. bp := `
  9192. apex {
  9193. name: "myapex",
  9194. key: "myapex.key",
  9195. native_shared_libs: ["libbaz"],
  9196. binaries: ["binfoo"],
  9197. min_sdk_version: "29",
  9198. }
  9199. apex_key {
  9200. name: "myapex.key",
  9201. }
  9202. cc_binary {
  9203. name: "binfoo",
  9204. shared_libs: ["libbar", "libbaz", "libqux",],
  9205. apex_available: ["myapex"],
  9206. min_sdk_version: "29",
  9207. recovery_available: false,
  9208. }
  9209. cc_library {
  9210. name: "libbar",
  9211. srcs: ["libbar.cc"],
  9212. stubs: {
  9213. symbol_file: "libbar.map.txt",
  9214. versions: [
  9215. "29",
  9216. ],
  9217. },
  9218. }
  9219. cc_library {
  9220. name: "libbaz",
  9221. srcs: ["libbaz.cc"],
  9222. apex_available: ["myapex"],
  9223. min_sdk_version: "29",
  9224. stubs: {
  9225. symbol_file: "libbaz.map.txt",
  9226. versions: [
  9227. "29",
  9228. ],
  9229. },
  9230. }
  9231. cc_api_library {
  9232. name: "libbar",
  9233. src: "libbar_stub.so",
  9234. min_sdk_version: "29",
  9235. variants: ["apex.29"],
  9236. }
  9237. cc_api_variant {
  9238. name: "libbar",
  9239. variant: "apex",
  9240. version: "29",
  9241. src: "libbar_apex_29.so",
  9242. }
  9243. cc_api_library {
  9244. name: "libbaz",
  9245. src: "libbaz_stub.so",
  9246. min_sdk_version: "29",
  9247. variants: ["apex.29"],
  9248. }
  9249. cc_api_variant {
  9250. name: "libbaz",
  9251. variant: "apex",
  9252. version: "29",
  9253. src: "libbaz_apex_29.so",
  9254. }
  9255. cc_api_library {
  9256. name: "libqux",
  9257. src: "libqux_stub.so",
  9258. min_sdk_version: "29",
  9259. variants: ["apex.29"],
  9260. }
  9261. cc_api_variant {
  9262. name: "libqux",
  9263. variant: "apex",
  9264. version: "29",
  9265. src: "libqux_apex_29.so",
  9266. }
  9267. api_imports {
  9268. name: "api_imports",
  9269. apex_shared_libs: [
  9270. "libbar",
  9271. "libbaz",
  9272. "libqux",
  9273. ],
  9274. }
  9275. `
  9276. result := testApex(t, bp)
  9277. hasDep := func(m android.Module, wantDep android.Module) bool {
  9278. t.Helper()
  9279. var found bool
  9280. result.VisitDirectDeps(m, func(dep blueprint.Module) {
  9281. if dep == wantDep {
  9282. found = true
  9283. }
  9284. })
  9285. return found
  9286. }
  9287. // Library defines stubs and cc_api_library should be used with cc_api_library
  9288. binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Module()
  9289. libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
  9290. libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
  9291. android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
  9292. android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
  9293. binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a_apex29").Rule("ld").Args["libFlags"]
  9294. android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
  9295. android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
  9296. android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
  9297. // Library defined in the same APEX should be linked with original definition instead of cc_api_library
  9298. libbazApexVariant := result.ModuleForTests("libbaz", "android_arm64_armv8-a_shared_apex29").Module()
  9299. libbazApiImportCoreVariant := result.ModuleForTests("libbaz.apiimport", "android_arm64_armv8-a_shared").Module()
  9300. android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even from same APEX", true, hasDep(binfooApexVariant, libbazApiImportCoreVariant))
  9301. android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbazApexVariant))
  9302. android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbaz.so")
  9303. android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbaz.apiimport.so")
  9304. android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbaz.apex.29.apiimport.so")
  9305. // cc_api_library defined without original library should be linked with cc_api_library
  9306. libquxApiImportApexVariant := result.ModuleForTests("libqux.apiimport", "android_arm64_armv8-a_shared").Module()
  9307. android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries even original library definition does not exist", true, hasDep(binfooApexVariant, libquxApiImportApexVariant))
  9308. android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libqux.apex.29.apiimport.so")
  9309. }
  9310. func TestPlatformBinaryBuildsAgainstApiSurfaceStubLibraries(t *testing.T) {
  9311. bp := `
  9312. apex {
  9313. name: "myapex",
  9314. key: "myapex.key",
  9315. native_shared_libs: ["libbar"],
  9316. min_sdk_version: "29",
  9317. }
  9318. apex_key {
  9319. name: "myapex.key",
  9320. }
  9321. cc_binary {
  9322. name: "binfoo",
  9323. shared_libs: ["libbar"],
  9324. recovery_available: false,
  9325. }
  9326. cc_library {
  9327. name: "libbar",
  9328. srcs: ["libbar.cc"],
  9329. apex_available: ["myapex"],
  9330. min_sdk_version: "29",
  9331. stubs: {
  9332. symbol_file: "libbar.map.txt",
  9333. versions: [
  9334. "29",
  9335. ],
  9336. },
  9337. }
  9338. cc_api_library {
  9339. name: "libbar",
  9340. src: "libbar_stub.so",
  9341. variants: ["apex.29"],
  9342. }
  9343. cc_api_variant {
  9344. name: "libbar",
  9345. variant: "apex",
  9346. version: "29",
  9347. src: "libbar_apex_29.so",
  9348. }
  9349. api_imports {
  9350. name: "api_imports",
  9351. apex_shared_libs: [
  9352. "libbar",
  9353. ],
  9354. }
  9355. `
  9356. result := testApex(t, bp)
  9357. hasDep := func(m android.Module, wantDep android.Module) bool {
  9358. t.Helper()
  9359. var found bool
  9360. result.VisitDirectDeps(m, func(dep blueprint.Module) {
  9361. if dep == wantDep {
  9362. found = true
  9363. }
  9364. })
  9365. return found
  9366. }
  9367. // Library defines stubs and cc_api_library should be used with cc_api_library
  9368. binfooApexVariant := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Module()
  9369. libbarCoreVariant := result.ModuleForTests("libbar", "android_arm64_armv8-a_shared").Module()
  9370. libbarApiImportCoreVariant := result.ModuleForTests("libbar.apiimport", "android_arm64_armv8-a_shared").Module()
  9371. android.AssertBoolEquals(t, "apex variant should link against API surface stub libraries", true, hasDep(binfooApexVariant, libbarApiImportCoreVariant))
  9372. android.AssertBoolEquals(t, "apex variant should link against original library if exists", true, hasDep(binfooApexVariant, libbarCoreVariant))
  9373. binFooCFlags := result.ModuleForTests("binfoo", "android_arm64_armv8-a").Rule("ld").Args["libFlags"]
  9374. android.AssertStringDoesContain(t, "binfoo should link against APEX variant", binFooCFlags, "libbar.apex.29.apiimport.so")
  9375. android.AssertStringDoesNotContain(t, "binfoo should not link against cc_api_library itself", binFooCFlags, "libbar.apiimport.so")
  9376. android.AssertStringDoesNotContain(t, "binfoo should not link against original definition", binFooCFlags, "libbar.so")
  9377. }
  9378. func TestTrimmedApex(t *testing.T) {
  9379. bp := `
  9380. apex {
  9381. name: "myapex",
  9382. key: "myapex.key",
  9383. native_shared_libs: ["libfoo","libbaz"],
  9384. min_sdk_version: "29",
  9385. trim_against: "mydcla",
  9386. }
  9387. apex {
  9388. name: "mydcla",
  9389. key: "myapex.key",
  9390. native_shared_libs: ["libfoo","libbar"],
  9391. min_sdk_version: "29",
  9392. file_contexts: ":myapex-file_contexts",
  9393. dynamic_common_lib_apex: true,
  9394. }
  9395. apex_key {
  9396. name: "myapex.key",
  9397. }
  9398. cc_library {
  9399. name: "libfoo",
  9400. shared_libs: ["libc"],
  9401. apex_available: ["myapex","mydcla"],
  9402. min_sdk_version: "29",
  9403. }
  9404. cc_library {
  9405. name: "libbar",
  9406. shared_libs: ["libc"],
  9407. apex_available: ["myapex","mydcla"],
  9408. min_sdk_version: "29",
  9409. }
  9410. cc_library {
  9411. name: "libbaz",
  9412. shared_libs: ["libc"],
  9413. apex_available: ["myapex","mydcla"],
  9414. min_sdk_version: "29",
  9415. }
  9416. cc_api_library {
  9417. name: "libc",
  9418. src: "libc.so",
  9419. min_sdk_version: "29",
  9420. recovery_available: true,
  9421. }
  9422. api_imports {
  9423. name: "api_imports",
  9424. shared_libs: [
  9425. "libc",
  9426. ],
  9427. header_libs: [],
  9428. }
  9429. `
  9430. ctx := testApex(t, bp)
  9431. module := ctx.ModuleForTests("myapex", "android_common_myapex_image")
  9432. apexRule := module.MaybeRule("apexRule")
  9433. if apexRule.Rule == nil {
  9434. t.Errorf("Expecting regular apex rule but a non regular apex rule found")
  9435. }
  9436. ctx = testApex(t, bp, android.FixtureModifyConfig(android.SetTrimmedApexEnabledForTests))
  9437. trimmedApexRule := ctx.ModuleForTests("myapex", "android_common_myapex_image").Rule("TrimmedApexRule")
  9438. libs_to_trim := trimmedApexRule.Args["libs_to_trim"]
  9439. android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libfoo")
  9440. android.AssertStringDoesContain(t, "missing lib to trim", libs_to_trim, "libbar")
  9441. android.AssertStringDoesNotContain(t, "unexpected libs in the libs to trim", libs_to_trim, "libbaz")
  9442. }
  9443. func TestCannedFsConfig(t *testing.T) {
  9444. ctx := testApex(t, `
  9445. apex {
  9446. name: "myapex",
  9447. key: "myapex.key",
  9448. updatable: false,
  9449. }
  9450. apex_key {
  9451. name: "myapex.key",
  9452. public_key: "testkey.avbpubkey",
  9453. private_key: "testkey.pem",
  9454. }`)
  9455. mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
  9456. generateFsRule := mod.Rule("generateFsConfig")
  9457. cmd := generateFsRule.RuleParams.Command
  9458. ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; ) >`)
  9459. }
  9460. func TestCannedFsConfig_HasCustomConfig(t *testing.T) {
  9461. ctx := testApex(t, `
  9462. apex {
  9463. name: "myapex",
  9464. key: "myapex.key",
  9465. canned_fs_config: "my_config",
  9466. updatable: false,
  9467. }
  9468. apex_key {
  9469. name: "myapex.key",
  9470. public_key: "testkey.avbpubkey",
  9471. private_key: "testkey.pem",
  9472. }`)
  9473. mod := ctx.ModuleForTests("myapex", "android_common_myapex_image")
  9474. generateFsRule := mod.Rule("generateFsConfig")
  9475. cmd := generateFsRule.RuleParams.Command
  9476. // Ensure that canned_fs_config has "cat my_config" at the end
  9477. ensureContains(t, cmd, `( echo '/ 1000 1000 0755'; echo '/apex_manifest.json 1000 1000 0644'; echo '/apex_manifest.pb 1000 1000 0644'; cat my_config ) >`)
  9478. }
  9479. func TestStubLibrariesMultipleApexViolation(t *testing.T) {
  9480. testCases := []struct {
  9481. desc string
  9482. hasStubs bool
  9483. apexAvailable string
  9484. expectedError string
  9485. }{
  9486. {
  9487. desc: "non-stub library can have multiple apex_available",
  9488. hasStubs: false,
  9489. apexAvailable: `["myapex", "otherapex"]`,
  9490. },
  9491. {
  9492. desc: "stub library should not be available to anyapex",
  9493. hasStubs: true,
  9494. apexAvailable: `["//apex_available:anyapex"]`,
  9495. expectedError: "Stub libraries should have a single apex_available.*anyapex",
  9496. },
  9497. {
  9498. desc: "stub library should not be available to multiple apexes",
  9499. hasStubs: true,
  9500. apexAvailable: `["myapex", "otherapex"]`,
  9501. expectedError: "Stub libraries should have a single apex_available.*myapex.*otherapex",
  9502. },
  9503. {
  9504. desc: "stub library can be available to a core apex and a test apex",
  9505. hasStubs: true,
  9506. apexAvailable: `["myapex", "test_myapex"]`,
  9507. },
  9508. }
  9509. bpTemplate := `
  9510. cc_library {
  9511. name: "libfoo",
  9512. %v
  9513. apex_available: %v,
  9514. }
  9515. apex {
  9516. name: "myapex",
  9517. key: "apex.key",
  9518. updatable: false,
  9519. native_shared_libs: ["libfoo"],
  9520. }
  9521. apex {
  9522. name: "otherapex",
  9523. key: "apex.key",
  9524. updatable: false,
  9525. }
  9526. apex_test {
  9527. name: "test_myapex",
  9528. key: "apex.key",
  9529. updatable: false,
  9530. native_shared_libs: ["libfoo"],
  9531. }
  9532. apex_key {
  9533. name: "apex.key",
  9534. }
  9535. `
  9536. for _, tc := range testCases {
  9537. stubs := ""
  9538. if tc.hasStubs {
  9539. stubs = `stubs: {symbol_file: "libfoo.map.txt"},`
  9540. }
  9541. bp := fmt.Sprintf(bpTemplate, stubs, tc.apexAvailable)
  9542. mockFsFixturePreparer := android.FixtureModifyMockFS(func(fs android.MockFS) {
  9543. fs["system/sepolicy/apex/test_myapex-file_contexts"] = nil
  9544. })
  9545. if tc.expectedError == "" {
  9546. testApex(t, bp, mockFsFixturePreparer)
  9547. } else {
  9548. testApexError(t, tc.expectedError, bp, mockFsFixturePreparer)
  9549. }
  9550. }
  9551. }
  9552. func TestFileSystemShouldSkipApexLibraries(t *testing.T) {
  9553. context := android.GroupFixturePreparers(
  9554. android.PrepareForIntegrationTestWithAndroid,
  9555. cc.PrepareForIntegrationTestWithCc,
  9556. PrepareForTestWithApexBuildComponents,
  9557. prepareForTestWithMyapex,
  9558. filesystem.PrepareForTestWithFilesystemBuildComponents,
  9559. )
  9560. result := context.RunTestWithBp(t, `
  9561. android_system_image {
  9562. name: "myfilesystem",
  9563. deps: [
  9564. "libfoo",
  9565. ],
  9566. linker_config_src: "linker.config.json",
  9567. }
  9568. cc_library {
  9569. name: "libfoo",
  9570. shared_libs: [
  9571. "libbar",
  9572. ],
  9573. stl: "none",
  9574. }
  9575. cc_library {
  9576. name: "libbar",
  9577. stl: "none",
  9578. apex_available: ["myapex"],
  9579. }
  9580. apex {
  9581. name: "myapex",
  9582. native_shared_libs: ["libbar"],
  9583. key: "myapex.key",
  9584. updatable: false,
  9585. }
  9586. apex_key {
  9587. name: "myapex.key",
  9588. public_key: "testkey.avbpubkey",
  9589. private_key: "testkey.pem",
  9590. }
  9591. `)
  9592. inputs := result.ModuleForTests("myfilesystem", "android_common").Output("deps.zip").Implicits
  9593. android.AssertStringListDoesNotContain(t, "filesystem should not have libbar",
  9594. inputs.Strings(),
  9595. "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so")
  9596. }