app_test.go 90 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384
  1. // Copyright 2017 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 java
  15. import (
  16. "fmt"
  17. "path/filepath"
  18. "reflect"
  19. "regexp"
  20. "sort"
  21. "strings"
  22. "testing"
  23. "github.com/google/blueprint/proptools"
  24. "android/soong/android"
  25. "android/soong/cc"
  26. )
  27. var (
  28. resourceFiles = []string{
  29. "res/layout/layout.xml",
  30. "res/values/strings.xml",
  31. "res/values-en-rUS/strings.xml",
  32. }
  33. compiledResourceFiles = []string{
  34. "aapt2/res/layout_layout.xml.flat",
  35. "aapt2/res/values_strings.arsc.flat",
  36. "aapt2/res/values-en-rUS_strings.arsc.flat",
  37. }
  38. )
  39. func testAppConfig(env map[string]string, bp string, fs map[string][]byte) android.Config {
  40. appFS := map[string][]byte{}
  41. for k, v := range fs {
  42. appFS[k] = v
  43. }
  44. for _, file := range resourceFiles {
  45. appFS[file] = nil
  46. }
  47. return testConfig(env, bp, appFS)
  48. }
  49. func testApp(t *testing.T, bp string) *android.TestContext {
  50. config := testAppConfig(nil, bp, nil)
  51. ctx := testContext()
  52. run(t, ctx, config)
  53. return ctx
  54. }
  55. func TestApp(t *testing.T) {
  56. for _, moduleType := range []string{"android_app", "android_library"} {
  57. t.Run(moduleType, func(t *testing.T) {
  58. ctx := testApp(t, moduleType+` {
  59. name: "foo",
  60. srcs: ["a.java"],
  61. sdk_version: "current"
  62. }
  63. `)
  64. foo := ctx.ModuleForTests("foo", "android_common")
  65. var expectedLinkImplicits []string
  66. manifestFixer := foo.Output("manifest_fixer/AndroidManifest.xml")
  67. expectedLinkImplicits = append(expectedLinkImplicits, manifestFixer.Output.String())
  68. frameworkRes := ctx.ModuleForTests("framework-res", "android_common")
  69. expectedLinkImplicits = append(expectedLinkImplicits,
  70. frameworkRes.Output("package-res.apk").Output.String())
  71. // Test the mapping from input files to compiled output file names
  72. compile := foo.Output(compiledResourceFiles[0])
  73. if !reflect.DeepEqual(resourceFiles, compile.Inputs.Strings()) {
  74. t.Errorf("expected aapt2 compile inputs expected:\n %#v\n got:\n %#v",
  75. resourceFiles, compile.Inputs.Strings())
  76. }
  77. compiledResourceOutputs := compile.Outputs.Strings()
  78. sort.Strings(compiledResourceOutputs)
  79. expectedLinkImplicits = append(expectedLinkImplicits, compiledResourceOutputs...)
  80. list := foo.Output("aapt2/res.list")
  81. expectedLinkImplicits = append(expectedLinkImplicits, list.Output.String())
  82. // Check that the link rule uses
  83. res := ctx.ModuleForTests("foo", "android_common").Output("package-res.apk")
  84. if !reflect.DeepEqual(expectedLinkImplicits, res.Implicits.Strings()) {
  85. t.Errorf("expected aapt2 link implicits expected:\n %#v\n got:\n %#v",
  86. expectedLinkImplicits, res.Implicits.Strings())
  87. }
  88. })
  89. }
  90. }
  91. func TestAppSplits(t *testing.T) {
  92. ctx := testApp(t, `
  93. android_app {
  94. name: "foo",
  95. srcs: ["a.java"],
  96. package_splits: ["v4", "v7,hdpi"],
  97. sdk_version: "current"
  98. }`)
  99. foo := ctx.ModuleForTests("foo", "android_common")
  100. expectedOutputs := []string{
  101. filepath.Join(buildDir, ".intermediates/foo/android_common/foo.apk"),
  102. filepath.Join(buildDir, ".intermediates/foo/android_common/foo_v4.apk"),
  103. filepath.Join(buildDir, ".intermediates/foo/android_common/foo_v7_hdpi.apk"),
  104. }
  105. for _, expectedOutput := range expectedOutputs {
  106. foo.Output(expectedOutput)
  107. }
  108. outputFiles, err := foo.Module().(*AndroidApp).OutputFiles("")
  109. if err != nil {
  110. t.Fatal(err)
  111. }
  112. if g, w := outputFiles.Strings(), expectedOutputs; !reflect.DeepEqual(g, w) {
  113. t.Errorf(`want OutputFiles("") = %q, got %q`, w, g)
  114. }
  115. }
  116. func TestAndroidAppSet(t *testing.T) {
  117. ctx, config := testJava(t, `
  118. android_app_set {
  119. name: "foo",
  120. set: "prebuilts/apks/app.apks",
  121. prerelease: true,
  122. }`)
  123. module := ctx.ModuleForTests("foo", "android_common")
  124. const packedSplitApks = "foo.zip"
  125. params := module.Output(packedSplitApks)
  126. if params.Rule == nil {
  127. t.Errorf("expected output %s is missing", packedSplitApks)
  128. }
  129. if s := params.Args["allow-prereleased"]; s != "true" {
  130. t.Errorf("wrong allow-prereleased value: '%s', expected 'true'", s)
  131. }
  132. if s := params.Args["partition"]; s != "system" {
  133. t.Errorf("wrong partition value: '%s', expected 'system'", s)
  134. }
  135. mkEntries := android.AndroidMkEntriesForTest(t, config, "", module.Module())[0]
  136. actualInstallFile := mkEntries.EntryMap["LOCAL_APK_SET_INSTALL_FILE"]
  137. expectedInstallFile := []string{"foo.apk"}
  138. if !reflect.DeepEqual(actualInstallFile, expectedInstallFile) {
  139. t.Errorf("Unexpected LOCAL_APK_SET_INSTALL_FILE value: '%s', expected: '%s',",
  140. actualInstallFile, expectedInstallFile)
  141. }
  142. }
  143. func TestAndroidAppSet_Variants(t *testing.T) {
  144. bp := `
  145. android_app_set {
  146. name: "foo",
  147. set: "prebuilts/apks/app.apks",
  148. }`
  149. testCases := []struct {
  150. name string
  151. targets []android.Target
  152. aaptPrebuiltDPI []string
  153. sdkVersion int
  154. expected map[string]string
  155. }{
  156. {
  157. name: "One",
  158. targets: []android.Target{
  159. {Os: android.Android, Arch: android.Arch{ArchType: android.X86}},
  160. },
  161. aaptPrebuiltDPI: []string{"ldpi", "xxhdpi"},
  162. sdkVersion: 29,
  163. expected: map[string]string{
  164. "abis": "X86",
  165. "allow-prereleased": "false",
  166. "screen-densities": "LDPI,XXHDPI",
  167. "sdk-version": "29",
  168. "stem": "foo",
  169. },
  170. },
  171. {
  172. name: "Two",
  173. targets: []android.Target{
  174. {Os: android.Android, Arch: android.Arch{ArchType: android.X86_64}},
  175. {Os: android.Android, Arch: android.Arch{ArchType: android.X86}},
  176. },
  177. aaptPrebuiltDPI: nil,
  178. sdkVersion: 30,
  179. expected: map[string]string{
  180. "abis": "X86_64,X86",
  181. "allow-prereleased": "false",
  182. "screen-densities": "all",
  183. "sdk-version": "30",
  184. "stem": "foo",
  185. },
  186. },
  187. }
  188. for _, test := range testCases {
  189. config := testAppConfig(nil, bp, nil)
  190. config.TestProductVariables.AAPTPrebuiltDPI = test.aaptPrebuiltDPI
  191. config.TestProductVariables.Platform_sdk_version = &test.sdkVersion
  192. config.Targets[android.Android] = test.targets
  193. ctx := testContext()
  194. run(t, ctx, config)
  195. module := ctx.ModuleForTests("foo", "android_common")
  196. const packedSplitApks = "foo.zip"
  197. params := module.Output(packedSplitApks)
  198. for k, v := range test.expected {
  199. if actual := params.Args[k]; actual != v {
  200. t.Errorf("%s: bad build arg value for '%s': '%s', expected '%s'",
  201. test.name, k, actual, v)
  202. }
  203. }
  204. }
  205. }
  206. func TestPlatformAPIs(t *testing.T) {
  207. testJava(t, `
  208. android_app {
  209. name: "foo",
  210. srcs: ["a.java"],
  211. platform_apis: true,
  212. }
  213. `)
  214. testJava(t, `
  215. android_app {
  216. name: "foo",
  217. srcs: ["a.java"],
  218. sdk_version: "current",
  219. }
  220. `)
  221. testJavaError(t, "platform_apis must be true when sdk_version is empty.", `
  222. android_app {
  223. name: "bar",
  224. srcs: ["b.java"],
  225. }
  226. `)
  227. testJavaError(t, "platform_apis must be false when sdk_version is not empty.", `
  228. android_app {
  229. name: "bar",
  230. srcs: ["b.java"],
  231. sdk_version: "system_current",
  232. platform_apis: true,
  233. }
  234. `)
  235. }
  236. func TestAndroidAppLinkType(t *testing.T) {
  237. testJava(t, `
  238. android_app {
  239. name: "foo",
  240. srcs: ["a.java"],
  241. libs: ["bar"],
  242. static_libs: ["baz"],
  243. platform_apis: true,
  244. }
  245. java_library {
  246. name: "bar",
  247. sdk_version: "current",
  248. srcs: ["b.java"],
  249. }
  250. android_library {
  251. name: "baz",
  252. sdk_version: "system_current",
  253. srcs: ["c.java"],
  254. }
  255. `)
  256. testJavaError(t, "Adjust sdk_version: property of the source or target module so that target module is built with the same or smaller API set than the source.", `
  257. android_app {
  258. name: "foo",
  259. srcs: ["a.java"],
  260. libs: ["bar"],
  261. sdk_version: "current",
  262. static_libs: ["baz"],
  263. }
  264. java_library {
  265. name: "bar",
  266. sdk_version: "current",
  267. srcs: ["b.java"],
  268. }
  269. android_library {
  270. name: "baz",
  271. sdk_version: "system_current",
  272. srcs: ["c.java"],
  273. }
  274. `)
  275. testJava(t, `
  276. android_app {
  277. name: "foo",
  278. srcs: ["a.java"],
  279. libs: ["bar"],
  280. sdk_version: "system_current",
  281. static_libs: ["baz"],
  282. }
  283. java_library {
  284. name: "bar",
  285. sdk_version: "current",
  286. srcs: ["b.java"],
  287. }
  288. android_library {
  289. name: "baz",
  290. sdk_version: "system_current",
  291. srcs: ["c.java"],
  292. }
  293. `)
  294. testJavaError(t, "Adjust sdk_version: property of the source or target module so that target module is built with the same or smaller API set than the source.", `
  295. android_app {
  296. name: "foo",
  297. srcs: ["a.java"],
  298. libs: ["bar"],
  299. sdk_version: "system_current",
  300. static_libs: ["baz"],
  301. }
  302. java_library {
  303. name: "bar",
  304. sdk_version: "current",
  305. srcs: ["b.java"],
  306. }
  307. android_library {
  308. name: "baz",
  309. srcs: ["c.java"],
  310. }
  311. `)
  312. }
  313. func TestUpdatableApps(t *testing.T) {
  314. testCases := []struct {
  315. name string
  316. bp string
  317. expectedError string
  318. }{
  319. {
  320. name: "Stable public SDK",
  321. bp: `android_app {
  322. name: "foo",
  323. srcs: ["a.java"],
  324. sdk_version: "29",
  325. min_sdk_version: "29",
  326. updatable: true,
  327. }`,
  328. },
  329. {
  330. name: "Stable system SDK",
  331. bp: `android_app {
  332. name: "foo",
  333. srcs: ["a.java"],
  334. sdk_version: "system_29",
  335. min_sdk_version: "29",
  336. updatable: true,
  337. }`,
  338. },
  339. {
  340. name: "Current public SDK",
  341. bp: `android_app {
  342. name: "foo",
  343. srcs: ["a.java"],
  344. sdk_version: "current",
  345. min_sdk_version: "29",
  346. updatable: true,
  347. }`,
  348. },
  349. {
  350. name: "Current system SDK",
  351. bp: `android_app {
  352. name: "foo",
  353. srcs: ["a.java"],
  354. sdk_version: "system_current",
  355. min_sdk_version: "29",
  356. updatable: true,
  357. }`,
  358. },
  359. {
  360. name: "Current module SDK",
  361. bp: `android_app {
  362. name: "foo",
  363. srcs: ["a.java"],
  364. sdk_version: "module_current",
  365. min_sdk_version: "29",
  366. updatable: true,
  367. }`,
  368. },
  369. {
  370. name: "Current core SDK",
  371. bp: `android_app {
  372. name: "foo",
  373. srcs: ["a.java"],
  374. sdk_version: "core_current",
  375. min_sdk_version: "29",
  376. updatable: true,
  377. }`,
  378. },
  379. {
  380. name: "No Platform APIs",
  381. bp: `android_app {
  382. name: "foo",
  383. srcs: ["a.java"],
  384. platform_apis: true,
  385. min_sdk_version: "29",
  386. updatable: true,
  387. }`,
  388. expectedError: "Updatable apps must use stable SDKs",
  389. },
  390. {
  391. name: "No Core Platform APIs",
  392. bp: `android_app {
  393. name: "foo",
  394. srcs: ["a.java"],
  395. sdk_version: "core_platform",
  396. min_sdk_version: "29",
  397. updatable: true,
  398. }`,
  399. expectedError: "Updatable apps must use stable SDKs",
  400. },
  401. {
  402. name: "No unspecified APIs",
  403. bp: `android_app {
  404. name: "foo",
  405. srcs: ["a.java"],
  406. updatable: true,
  407. min_sdk_version: "29",
  408. }`,
  409. expectedError: "Updatable apps must use stable SDK",
  410. },
  411. {
  412. name: "Must specify min_sdk_version",
  413. bp: `android_app {
  414. name: "app_without_min_sdk_version",
  415. srcs: ["a.java"],
  416. sdk_version: "29",
  417. updatable: true,
  418. }`,
  419. expectedError: "updatable apps must set min_sdk_version.",
  420. },
  421. }
  422. for _, test := range testCases {
  423. t.Run(test.name, func(t *testing.T) {
  424. if test.expectedError == "" {
  425. testJava(t, test.bp)
  426. } else {
  427. testJavaError(t, test.expectedError, test.bp)
  428. }
  429. })
  430. }
  431. }
  432. func TestUpdatableApps_TransitiveDepsShouldSetMinSdkVersion(t *testing.T) {
  433. testJavaError(t, `module "bar".*: should support min_sdk_version\(29\)`, cc.GatherRequiredDepsForTest(android.Android)+`
  434. android_app {
  435. name: "foo",
  436. srcs: ["a.java"],
  437. updatable: true,
  438. sdk_version: "current",
  439. min_sdk_version: "29",
  440. static_libs: ["bar"],
  441. }
  442. java_library {
  443. name: "bar",
  444. sdk_version: "current",
  445. }
  446. `)
  447. }
  448. func TestUpdatableApps_JniLibsShouldShouldSupportMinSdkVersion(t *testing.T) {
  449. testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
  450. android_app {
  451. name: "foo",
  452. srcs: ["a.java"],
  453. updatable: true,
  454. sdk_version: "current",
  455. min_sdk_version: "current",
  456. jni_libs: ["libjni"],
  457. }
  458. cc_library {
  459. name: "libjni",
  460. stl: "none",
  461. system_shared_libs: [],
  462. sdk_version: "current",
  463. }
  464. `)
  465. }
  466. func TestUpdatableApps_JniLibShouldBeBuiltAgainstMinSdkVersion(t *testing.T) {
  467. bp := cc.GatherRequiredDepsForTest(android.Android) + `
  468. android_app {
  469. name: "foo",
  470. srcs: ["a.java"],
  471. updatable: true,
  472. sdk_version: "current",
  473. min_sdk_version: "29",
  474. jni_libs: ["libjni"],
  475. }
  476. cc_library {
  477. name: "libjni",
  478. stl: "none",
  479. system_shared_libs: [],
  480. sdk_version: "29",
  481. }
  482. `
  483. fs := map[string][]byte{
  484. "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtbegin_so.o": nil,
  485. "prebuilts/ndk/current/platforms/android-29/arch-arm64/usr/lib/crtend_so.o": nil,
  486. "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtbegin_so.o": nil,
  487. "prebuilts/ndk/current/platforms/android-29/arch-arm/usr/lib/crtend_so.o": nil,
  488. }
  489. ctx, _ := testJavaWithConfig(t, testConfig(nil, bp, fs))
  490. inputs := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").Description("link").Implicits
  491. var crtbeginFound, crtendFound bool
  492. expectedCrtBegin := ctx.ModuleForTests("crtbegin_so",
  493. "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
  494. expectedCrtEnd := ctx.ModuleForTests("crtend_so",
  495. "android_arm64_armv8-a_sdk_29").Rule("partialLd").Output
  496. implicits := []string{}
  497. for _, input := range inputs {
  498. implicits = append(implicits, input.String())
  499. if strings.HasSuffix(input.String(), expectedCrtBegin.String()) {
  500. crtbeginFound = true
  501. } else if strings.HasSuffix(input.String(), expectedCrtEnd.String()) {
  502. crtendFound = true
  503. }
  504. }
  505. if !crtbeginFound {
  506. t.Error(fmt.Sprintf(
  507. "expected implicit with suffix %q, have the following implicits:\n%s",
  508. expectedCrtBegin, strings.Join(implicits, "\n")))
  509. }
  510. if !crtendFound {
  511. t.Error(fmt.Sprintf(
  512. "expected implicit with suffix %q, have the following implicits:\n%s",
  513. expectedCrtEnd, strings.Join(implicits, "\n")))
  514. }
  515. }
  516. func TestUpdatableApps_ErrorIfJniLibDoesntSupportMinSdkVersion(t *testing.T) {
  517. bp := cc.GatherRequiredDepsForTest(android.Android) + `
  518. android_app {
  519. name: "foo",
  520. srcs: ["a.java"],
  521. updatable: true,
  522. sdk_version: "current",
  523. min_sdk_version: "29", // this APK should support 29
  524. jni_libs: ["libjni"],
  525. }
  526. cc_library {
  527. name: "libjni",
  528. stl: "none",
  529. sdk_version: "current",
  530. }
  531. `
  532. testJavaError(t, `"libjni" .*: sdk_version\(current\) is higher than min_sdk_version\(29\)`, bp)
  533. }
  534. func TestUpdatableApps_ErrorIfDepSdkVersionIsHigher(t *testing.T) {
  535. bp := cc.GatherRequiredDepsForTest(android.Android) + `
  536. android_app {
  537. name: "foo",
  538. srcs: ["a.java"],
  539. updatable: true,
  540. sdk_version: "current",
  541. min_sdk_version: "29", // this APK should support 29
  542. jni_libs: ["libjni"],
  543. }
  544. cc_library {
  545. name: "libjni",
  546. stl: "none",
  547. shared_libs: ["libbar"],
  548. system_shared_libs: [],
  549. sdk_version: "27",
  550. }
  551. cc_library {
  552. name: "libbar",
  553. stl: "none",
  554. system_shared_libs: [],
  555. sdk_version: "current",
  556. }
  557. `
  558. testJavaError(t, `"libjni" .*: links "libbar" built against newer API version "current"`, bp)
  559. }
  560. func TestResourceDirs(t *testing.T) {
  561. testCases := []struct {
  562. name string
  563. prop string
  564. resources []string
  565. }{
  566. {
  567. name: "no resource_dirs",
  568. prop: "",
  569. resources: []string{"res/res/values/strings.xml"},
  570. },
  571. {
  572. name: "resource_dirs",
  573. prop: `resource_dirs: ["res"]`,
  574. resources: []string{"res/res/values/strings.xml"},
  575. },
  576. {
  577. name: "empty resource_dirs",
  578. prop: `resource_dirs: []`,
  579. resources: nil,
  580. },
  581. }
  582. fs := map[string][]byte{
  583. "res/res/values/strings.xml": nil,
  584. }
  585. bp := `
  586. android_app {
  587. name: "foo",
  588. sdk_version: "current",
  589. %s
  590. }
  591. `
  592. for _, testCase := range testCases {
  593. t.Run(testCase.name, func(t *testing.T) {
  594. config := testConfig(nil, fmt.Sprintf(bp, testCase.prop), fs)
  595. ctx := testContext()
  596. run(t, ctx, config)
  597. module := ctx.ModuleForTests("foo", "android_common")
  598. resourceList := module.MaybeOutput("aapt2/res.list")
  599. var resources []string
  600. if resourceList.Rule != nil {
  601. for _, compiledResource := range resourceList.Inputs.Strings() {
  602. resources = append(resources, module.Output(compiledResource).Inputs.Strings()...)
  603. }
  604. }
  605. if !reflect.DeepEqual(resources, testCase.resources) {
  606. t.Errorf("expected resource files %q, got %q",
  607. testCase.resources, resources)
  608. }
  609. })
  610. }
  611. }
  612. func TestLibraryAssets(t *testing.T) {
  613. bp := `
  614. android_app {
  615. name: "foo",
  616. sdk_version: "current",
  617. static_libs: ["lib1", "lib2", "lib3"],
  618. }
  619. android_library {
  620. name: "lib1",
  621. sdk_version: "current",
  622. asset_dirs: ["assets_a"],
  623. }
  624. android_library {
  625. name: "lib2",
  626. sdk_version: "current",
  627. }
  628. android_library {
  629. name: "lib3",
  630. sdk_version: "current",
  631. static_libs: ["lib4"],
  632. }
  633. android_library {
  634. name: "lib4",
  635. sdk_version: "current",
  636. asset_dirs: ["assets_b"],
  637. }
  638. `
  639. testCases := []struct {
  640. name string
  641. assetFlag string
  642. assetPackages []string
  643. }{
  644. {
  645. name: "foo",
  646. // lib1 has its own asset. lib3 doesn't have any, but provides lib4's transitively.
  647. assetPackages: []string{
  648. buildDir + "/.intermediates/foo/android_common/aapt2/package-res.apk",
  649. buildDir + "/.intermediates/lib1/android_common/assets.zip",
  650. buildDir + "/.intermediates/lib3/android_common/assets.zip",
  651. },
  652. },
  653. {
  654. name: "lib1",
  655. assetFlag: "-A assets_a",
  656. },
  657. {
  658. name: "lib2",
  659. },
  660. {
  661. name: "lib3",
  662. assetPackages: []string{
  663. buildDir + "/.intermediates/lib3/android_common/aapt2/package-res.apk",
  664. buildDir + "/.intermediates/lib4/android_common/assets.zip",
  665. },
  666. },
  667. {
  668. name: "lib4",
  669. assetFlag: "-A assets_b",
  670. },
  671. }
  672. ctx := testApp(t, bp)
  673. for _, test := range testCases {
  674. t.Run(test.name, func(t *testing.T) {
  675. m := ctx.ModuleForTests(test.name, "android_common")
  676. // Check asset flag in aapt2 link flags
  677. var aapt2link android.TestingBuildParams
  678. if len(test.assetPackages) > 0 {
  679. aapt2link = m.Output("aapt2/package-res.apk")
  680. } else {
  681. aapt2link = m.Output("package-res.apk")
  682. }
  683. aapt2Flags := aapt2link.Args["flags"]
  684. if test.assetFlag != "" {
  685. if !strings.Contains(aapt2Flags, test.assetFlag) {
  686. t.Errorf("Can't find asset flag %q in aapt2 link flags %q", test.assetFlag, aapt2Flags)
  687. }
  688. } else {
  689. if strings.Contains(aapt2Flags, " -A ") {
  690. t.Errorf("aapt2 link flags %q contain unexpected asset flag", aapt2Flags)
  691. }
  692. }
  693. // Check asset merge rule.
  694. if len(test.assetPackages) > 0 {
  695. mergeAssets := m.Output("package-res.apk")
  696. if !reflect.DeepEqual(test.assetPackages, mergeAssets.Inputs.Strings()) {
  697. t.Errorf("Unexpected mergeAssets inputs: %v, expected: %v",
  698. mergeAssets.Inputs.Strings(), test.assetPackages)
  699. }
  700. }
  701. })
  702. }
  703. }
  704. func TestAndroidResources(t *testing.T) {
  705. testCases := []struct {
  706. name string
  707. enforceRROTargets []string
  708. enforceRROExcludedOverlays []string
  709. resourceFiles map[string][]string
  710. overlayFiles map[string][]string
  711. rroDirs map[string][]string
  712. }{
  713. {
  714. name: "no RRO",
  715. enforceRROTargets: nil,
  716. enforceRROExcludedOverlays: nil,
  717. resourceFiles: map[string][]string{
  718. "foo": nil,
  719. "bar": {"bar/res/res/values/strings.xml"},
  720. "lib": nil,
  721. "lib2": {"lib2/res/res/values/strings.xml"},
  722. },
  723. overlayFiles: map[string][]string{
  724. "foo": {
  725. buildDir + "/.intermediates/lib2/android_common/package-res.apk",
  726. buildDir + "/.intermediates/lib/android_common/package-res.apk",
  727. buildDir + "/.intermediates/lib3/android_common/package-res.apk",
  728. "foo/res/res/values/strings.xml",
  729. "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
  730. "device/vendor/blah/overlay/foo/res/values/strings.xml",
  731. "product/vendor/blah/overlay/foo/res/values/strings.xml",
  732. },
  733. "bar": {
  734. "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
  735. "device/vendor/blah/overlay/bar/res/values/strings.xml",
  736. },
  737. "lib": {
  738. buildDir + "/.intermediates/lib2/android_common/package-res.apk",
  739. "lib/res/res/values/strings.xml",
  740. "device/vendor/blah/overlay/lib/res/values/strings.xml",
  741. },
  742. },
  743. rroDirs: map[string][]string{
  744. "foo": nil,
  745. "bar": nil,
  746. },
  747. },
  748. {
  749. name: "enforce RRO on foo",
  750. enforceRROTargets: []string{"foo"},
  751. enforceRROExcludedOverlays: []string{"device/vendor/blah/static_overlay"},
  752. resourceFiles: map[string][]string{
  753. "foo": nil,
  754. "bar": {"bar/res/res/values/strings.xml"},
  755. "lib": nil,
  756. "lib2": {"lib2/res/res/values/strings.xml"},
  757. },
  758. overlayFiles: map[string][]string{
  759. "foo": {
  760. buildDir + "/.intermediates/lib2/android_common/package-res.apk",
  761. buildDir + "/.intermediates/lib/android_common/package-res.apk",
  762. buildDir + "/.intermediates/lib3/android_common/package-res.apk",
  763. "foo/res/res/values/strings.xml",
  764. "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
  765. },
  766. "bar": {
  767. "device/vendor/blah/static_overlay/bar/res/values/strings.xml",
  768. "device/vendor/blah/overlay/bar/res/values/strings.xml",
  769. },
  770. "lib": {
  771. buildDir + "/.intermediates/lib2/android_common/package-res.apk",
  772. "lib/res/res/values/strings.xml",
  773. "device/vendor/blah/overlay/lib/res/values/strings.xml",
  774. },
  775. },
  776. rroDirs: map[string][]string{
  777. "foo": {
  778. "device:device/vendor/blah/overlay/foo/res",
  779. // Enforce RRO on "foo" could imply RRO on static dependencies, but for now it doesn't.
  780. // "device/vendor/blah/overlay/lib/res",
  781. "product:product/vendor/blah/overlay/foo/res",
  782. },
  783. "bar": nil,
  784. "lib": nil,
  785. },
  786. },
  787. {
  788. name: "enforce RRO on all",
  789. enforceRROTargets: []string{"*"},
  790. enforceRROExcludedOverlays: []string{
  791. // Excluding specific apps/res directories also allowed.
  792. "device/vendor/blah/static_overlay/foo",
  793. "device/vendor/blah/static_overlay/bar/res",
  794. },
  795. resourceFiles: map[string][]string{
  796. "foo": nil,
  797. "bar": {"bar/res/res/values/strings.xml"},
  798. "lib": nil,
  799. "lib2": {"lib2/res/res/values/strings.xml"},
  800. },
  801. overlayFiles: map[string][]string{
  802. "foo": {
  803. buildDir + "/.intermediates/lib2/android_common/package-res.apk",
  804. buildDir + "/.intermediates/lib/android_common/package-res.apk",
  805. buildDir + "/.intermediates/lib3/android_common/package-res.apk",
  806. "foo/res/res/values/strings.xml",
  807. "device/vendor/blah/static_overlay/foo/res/values/strings.xml",
  808. },
  809. "bar": {"device/vendor/blah/static_overlay/bar/res/values/strings.xml"},
  810. "lib": {
  811. buildDir + "/.intermediates/lib2/android_common/package-res.apk",
  812. "lib/res/res/values/strings.xml",
  813. },
  814. },
  815. rroDirs: map[string][]string{
  816. "foo": {
  817. "device:device/vendor/blah/overlay/foo/res",
  818. "product:product/vendor/blah/overlay/foo/res",
  819. // Lib dep comes after the direct deps
  820. "device:device/vendor/blah/overlay/lib/res",
  821. },
  822. "bar": {"device:device/vendor/blah/overlay/bar/res"},
  823. "lib": {"device:device/vendor/blah/overlay/lib/res"},
  824. },
  825. },
  826. }
  827. deviceResourceOverlays := []string{
  828. "device/vendor/blah/overlay",
  829. "device/vendor/blah/overlay2",
  830. "device/vendor/blah/static_overlay",
  831. }
  832. productResourceOverlays := []string{
  833. "product/vendor/blah/overlay",
  834. }
  835. fs := map[string][]byte{
  836. "foo/res/res/values/strings.xml": nil,
  837. "bar/res/res/values/strings.xml": nil,
  838. "lib/res/res/values/strings.xml": nil,
  839. "lib2/res/res/values/strings.xml": nil,
  840. "device/vendor/blah/overlay/foo/res/values/strings.xml": nil,
  841. "device/vendor/blah/overlay/bar/res/values/strings.xml": nil,
  842. "device/vendor/blah/overlay/lib/res/values/strings.xml": nil,
  843. "device/vendor/blah/static_overlay/foo/res/values/strings.xml": nil,
  844. "device/vendor/blah/static_overlay/bar/res/values/strings.xml": nil,
  845. "device/vendor/blah/overlay2/res/values/strings.xml": nil,
  846. "product/vendor/blah/overlay/foo/res/values/strings.xml": nil,
  847. }
  848. bp := `
  849. android_app {
  850. name: "foo",
  851. sdk_version: "current",
  852. resource_dirs: ["foo/res"],
  853. static_libs: ["lib", "lib3"],
  854. }
  855. android_app {
  856. name: "bar",
  857. sdk_version: "current",
  858. resource_dirs: ["bar/res"],
  859. }
  860. android_library {
  861. name: "lib",
  862. sdk_version: "current",
  863. resource_dirs: ["lib/res"],
  864. static_libs: ["lib2"],
  865. }
  866. android_library {
  867. name: "lib2",
  868. sdk_version: "current",
  869. resource_dirs: ["lib2/res"],
  870. }
  871. // This library has the same resources as lib (should not lead to dupe RROs)
  872. android_library {
  873. name: "lib3",
  874. sdk_version: "current",
  875. resource_dirs: ["lib/res"]
  876. }
  877. `
  878. for _, testCase := range testCases {
  879. t.Run(testCase.name, func(t *testing.T) {
  880. config := testAppConfig(nil, bp, fs)
  881. config.TestProductVariables.DeviceResourceOverlays = deviceResourceOverlays
  882. config.TestProductVariables.ProductResourceOverlays = productResourceOverlays
  883. if testCase.enforceRROTargets != nil {
  884. config.TestProductVariables.EnforceRROTargets = testCase.enforceRROTargets
  885. }
  886. if testCase.enforceRROExcludedOverlays != nil {
  887. config.TestProductVariables.EnforceRROExcludedOverlays = testCase.enforceRROExcludedOverlays
  888. }
  889. ctx := testContext()
  890. run(t, ctx, config)
  891. resourceListToFiles := func(module android.TestingModule, list []string) (files []string) {
  892. for _, o := range list {
  893. res := module.MaybeOutput(o)
  894. if res.Rule != nil {
  895. // If the overlay is compiled as part of this module (i.e. a .arsc.flat file),
  896. // verify the inputs to the .arsc.flat rule.
  897. files = append(files, res.Inputs.Strings()...)
  898. } else {
  899. // Otherwise, verify the full path to the output of the other module
  900. files = append(files, o)
  901. }
  902. }
  903. return files
  904. }
  905. getResources := func(moduleName string) (resourceFiles, overlayFiles, rroDirs []string) {
  906. module := ctx.ModuleForTests(moduleName, "android_common")
  907. resourceList := module.MaybeOutput("aapt2/res.list")
  908. if resourceList.Rule != nil {
  909. resourceFiles = resourceListToFiles(module, resourceList.Inputs.Strings())
  910. }
  911. overlayList := module.MaybeOutput("aapt2/overlay.list")
  912. if overlayList.Rule != nil {
  913. overlayFiles = resourceListToFiles(module, overlayList.Inputs.Strings())
  914. }
  915. for _, d := range module.Module().(AndroidLibraryDependency).ExportedRRODirs() {
  916. var prefix string
  917. if d.overlayType == device {
  918. prefix = "device:"
  919. } else if d.overlayType == product {
  920. prefix = "product:"
  921. } else {
  922. t.Fatalf("Unexpected overlayType %d", d.overlayType)
  923. }
  924. rroDirs = append(rroDirs, prefix+d.path.String())
  925. }
  926. return resourceFiles, overlayFiles, rroDirs
  927. }
  928. modules := []string{"foo", "bar", "lib", "lib2"}
  929. for _, module := range modules {
  930. resourceFiles, overlayFiles, rroDirs := getResources(module)
  931. if !reflect.DeepEqual(resourceFiles, testCase.resourceFiles[module]) {
  932. t.Errorf("expected %s resource files:\n %#v\n got:\n %#v",
  933. module, testCase.resourceFiles[module], resourceFiles)
  934. }
  935. if !reflect.DeepEqual(overlayFiles, testCase.overlayFiles[module]) {
  936. t.Errorf("expected %s overlay files:\n %#v\n got:\n %#v",
  937. module, testCase.overlayFiles[module], overlayFiles)
  938. }
  939. if !reflect.DeepEqual(rroDirs, testCase.rroDirs[module]) {
  940. t.Errorf("expected %s rroDirs: %#v\n got:\n %#v",
  941. module, testCase.rroDirs[module], rroDirs)
  942. }
  943. }
  944. })
  945. }
  946. }
  947. func checkSdkVersion(t *testing.T, config android.Config, expectedSdkVersion string) {
  948. ctx := testContext()
  949. run(t, ctx, config)
  950. foo := ctx.ModuleForTests("foo", "android_common")
  951. link := foo.Output("package-res.apk")
  952. linkFlags := strings.Split(link.Args["flags"], " ")
  953. min := android.IndexList("--min-sdk-version", linkFlags)
  954. target := android.IndexList("--target-sdk-version", linkFlags)
  955. if min == -1 || target == -1 || min == len(linkFlags)-1 || target == len(linkFlags)-1 {
  956. t.Fatalf("missing --min-sdk-version or --target-sdk-version in link flags: %q", linkFlags)
  957. }
  958. gotMinSdkVersion := linkFlags[min+1]
  959. gotTargetSdkVersion := linkFlags[target+1]
  960. if gotMinSdkVersion != expectedSdkVersion {
  961. t.Errorf("incorrect --min-sdk-version, expected %q got %q",
  962. expectedSdkVersion, gotMinSdkVersion)
  963. }
  964. if gotTargetSdkVersion != expectedSdkVersion {
  965. t.Errorf("incorrect --target-sdk-version, expected %q got %q",
  966. expectedSdkVersion, gotTargetSdkVersion)
  967. }
  968. }
  969. func TestAppSdkVersion(t *testing.T) {
  970. testCases := []struct {
  971. name string
  972. sdkVersion string
  973. platformSdkInt int
  974. platformSdkCodename string
  975. platformSdkFinal bool
  976. expectedMinSdkVersion string
  977. platformApis bool
  978. activeCodenames []string
  979. }{
  980. {
  981. name: "current final SDK",
  982. sdkVersion: "current",
  983. platformSdkInt: 27,
  984. platformSdkCodename: "REL",
  985. platformSdkFinal: true,
  986. expectedMinSdkVersion: "27",
  987. },
  988. {
  989. name: "current non-final SDK",
  990. sdkVersion: "current",
  991. platformSdkInt: 27,
  992. platformSdkCodename: "OMR1",
  993. platformSdkFinal: false,
  994. expectedMinSdkVersion: "OMR1",
  995. activeCodenames: []string{"OMR1"},
  996. },
  997. {
  998. name: "default final SDK",
  999. sdkVersion: "",
  1000. platformApis: true,
  1001. platformSdkInt: 27,
  1002. platformSdkCodename: "REL",
  1003. platformSdkFinal: true,
  1004. expectedMinSdkVersion: "27",
  1005. },
  1006. {
  1007. name: "default non-final SDK",
  1008. sdkVersion: "",
  1009. platformApis: true,
  1010. platformSdkInt: 27,
  1011. platformSdkCodename: "OMR1",
  1012. platformSdkFinal: false,
  1013. expectedMinSdkVersion: "OMR1",
  1014. activeCodenames: []string{"OMR1"},
  1015. },
  1016. {
  1017. name: "14",
  1018. sdkVersion: "14",
  1019. expectedMinSdkVersion: "14",
  1020. platformSdkCodename: "S",
  1021. activeCodenames: []string{"S"},
  1022. },
  1023. }
  1024. for _, moduleType := range []string{"android_app", "android_library"} {
  1025. for _, test := range testCases {
  1026. t.Run(moduleType+" "+test.name, func(t *testing.T) {
  1027. platformApiProp := ""
  1028. if test.platformApis {
  1029. platformApiProp = "platform_apis: true,"
  1030. }
  1031. bp := fmt.Sprintf(`%s {
  1032. name: "foo",
  1033. srcs: ["a.java"],
  1034. sdk_version: "%s",
  1035. %s
  1036. }`, moduleType, test.sdkVersion, platformApiProp)
  1037. config := testAppConfig(nil, bp, nil)
  1038. config.TestProductVariables.Platform_sdk_version = &test.platformSdkInt
  1039. config.TestProductVariables.Platform_sdk_codename = &test.platformSdkCodename
  1040. config.TestProductVariables.Platform_version_active_codenames = test.activeCodenames
  1041. config.TestProductVariables.Platform_sdk_final = &test.platformSdkFinal
  1042. checkSdkVersion(t, config, test.expectedMinSdkVersion)
  1043. })
  1044. }
  1045. }
  1046. }
  1047. func TestVendorAppSdkVersion(t *testing.T) {
  1048. testCases := []struct {
  1049. name string
  1050. sdkVersion string
  1051. platformSdkInt int
  1052. platformSdkCodename string
  1053. platformSdkFinal bool
  1054. deviceCurrentApiLevelForVendorModules string
  1055. expectedMinSdkVersion string
  1056. }{
  1057. {
  1058. name: "current final SDK",
  1059. sdkVersion: "current",
  1060. platformSdkInt: 29,
  1061. platformSdkCodename: "REL",
  1062. platformSdkFinal: true,
  1063. deviceCurrentApiLevelForVendorModules: "29",
  1064. expectedMinSdkVersion: "29",
  1065. },
  1066. {
  1067. name: "current final SDK",
  1068. sdkVersion: "current",
  1069. platformSdkInt: 29,
  1070. platformSdkCodename: "REL",
  1071. platformSdkFinal: true,
  1072. deviceCurrentApiLevelForVendorModules: "28",
  1073. expectedMinSdkVersion: "28",
  1074. },
  1075. {
  1076. name: "current final SDK",
  1077. sdkVersion: "current",
  1078. platformSdkInt: 29,
  1079. platformSdkCodename: "Q",
  1080. platformSdkFinal: false,
  1081. deviceCurrentApiLevelForVendorModules: "28",
  1082. expectedMinSdkVersion: "28",
  1083. },
  1084. }
  1085. for _, moduleType := range []string{"android_app", "android_library"} {
  1086. for _, sdkKind := range []string{"", "system_"} {
  1087. for _, test := range testCases {
  1088. t.Run(moduleType+" "+test.name, func(t *testing.T) {
  1089. bp := fmt.Sprintf(`%s {
  1090. name: "foo",
  1091. srcs: ["a.java"],
  1092. sdk_version: "%s%s",
  1093. vendor: true,
  1094. }`, moduleType, sdkKind, test.sdkVersion)
  1095. config := testAppConfig(nil, bp, nil)
  1096. config.TestProductVariables.Platform_sdk_version = &test.platformSdkInt
  1097. config.TestProductVariables.Platform_sdk_codename = &test.platformSdkCodename
  1098. config.TestProductVariables.Platform_sdk_final = &test.platformSdkFinal
  1099. config.TestProductVariables.DeviceCurrentApiLevelForVendorModules = &test.deviceCurrentApiLevelForVendorModules
  1100. config.TestProductVariables.DeviceSystemSdkVersions = []string{"28", "29"}
  1101. checkSdkVersion(t, config, test.expectedMinSdkVersion)
  1102. })
  1103. }
  1104. }
  1105. }
  1106. }
  1107. func TestJNIABI(t *testing.T) {
  1108. ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
  1109. cc_library {
  1110. name: "libjni",
  1111. system_shared_libs: [],
  1112. sdk_version: "current",
  1113. stl: "none",
  1114. }
  1115. android_test {
  1116. name: "test",
  1117. sdk_version: "core_platform",
  1118. jni_libs: ["libjni"],
  1119. }
  1120. android_test {
  1121. name: "test_first",
  1122. sdk_version: "core_platform",
  1123. compile_multilib: "first",
  1124. jni_libs: ["libjni"],
  1125. }
  1126. android_test {
  1127. name: "test_both",
  1128. sdk_version: "core_platform",
  1129. compile_multilib: "both",
  1130. jni_libs: ["libjni"],
  1131. }
  1132. android_test {
  1133. name: "test_32",
  1134. sdk_version: "core_platform",
  1135. compile_multilib: "32",
  1136. jni_libs: ["libjni"],
  1137. }
  1138. android_test {
  1139. name: "test_64",
  1140. sdk_version: "core_platform",
  1141. compile_multilib: "64",
  1142. jni_libs: ["libjni"],
  1143. }
  1144. `)
  1145. testCases := []struct {
  1146. name string
  1147. abis []string
  1148. }{
  1149. {"test", []string{"arm64-v8a"}},
  1150. {"test_first", []string{"arm64-v8a"}},
  1151. {"test_both", []string{"arm64-v8a", "armeabi-v7a"}},
  1152. {"test_32", []string{"armeabi-v7a"}},
  1153. {"test_64", []string{"arm64-v8a"}},
  1154. }
  1155. for _, test := range testCases {
  1156. t.Run(test.name, func(t *testing.T) {
  1157. app := ctx.ModuleForTests(test.name, "android_common")
  1158. jniLibZip := app.Output("jnilibs.zip")
  1159. var abis []string
  1160. args := strings.Fields(jniLibZip.Args["jarArgs"])
  1161. for i := 0; i < len(args); i++ {
  1162. if args[i] == "-P" {
  1163. abis = append(abis, filepath.Base(args[i+1]))
  1164. i++
  1165. }
  1166. }
  1167. if !reflect.DeepEqual(abis, test.abis) {
  1168. t.Errorf("want abis %v, got %v", test.abis, abis)
  1169. }
  1170. })
  1171. }
  1172. }
  1173. func TestAppSdkVersionByPartition(t *testing.T) {
  1174. testJavaError(t, "sdk_version must have a value when the module is located at vendor or product", `
  1175. android_app {
  1176. name: "foo",
  1177. srcs: ["a.java"],
  1178. vendor: true,
  1179. platform_apis: true,
  1180. }
  1181. `)
  1182. testJava(t, `
  1183. android_app {
  1184. name: "bar",
  1185. srcs: ["b.java"],
  1186. platform_apis: true,
  1187. }
  1188. `)
  1189. for _, enforce := range []bool{true, false} {
  1190. bp := `
  1191. android_app {
  1192. name: "foo",
  1193. srcs: ["a.java"],
  1194. product_specific: true,
  1195. platform_apis: true,
  1196. }
  1197. `
  1198. config := testAppConfig(nil, bp, nil)
  1199. config.TestProductVariables.EnforceProductPartitionInterface = proptools.BoolPtr(enforce)
  1200. if enforce {
  1201. testJavaErrorWithConfig(t, "sdk_version must have a value when the module is located at vendor or product", config)
  1202. } else {
  1203. testJavaWithConfig(t, config)
  1204. }
  1205. }
  1206. }
  1207. func TestJNIPackaging(t *testing.T) {
  1208. ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
  1209. cc_library {
  1210. name: "libjni",
  1211. system_shared_libs: [],
  1212. stl: "none",
  1213. sdk_version: "current",
  1214. }
  1215. android_app {
  1216. name: "app",
  1217. jni_libs: ["libjni"],
  1218. sdk_version: "current",
  1219. }
  1220. android_app {
  1221. name: "app_noembed",
  1222. jni_libs: ["libjni"],
  1223. use_embedded_native_libs: false,
  1224. sdk_version: "current",
  1225. }
  1226. android_app {
  1227. name: "app_embed",
  1228. jni_libs: ["libjni"],
  1229. use_embedded_native_libs: true,
  1230. sdk_version: "current",
  1231. }
  1232. android_test {
  1233. name: "test",
  1234. sdk_version: "current",
  1235. jni_libs: ["libjni"],
  1236. }
  1237. android_test {
  1238. name: "test_noembed",
  1239. sdk_version: "current",
  1240. jni_libs: ["libjni"],
  1241. use_embedded_native_libs: false,
  1242. }
  1243. android_test_helper_app {
  1244. name: "test_helper",
  1245. sdk_version: "current",
  1246. jni_libs: ["libjni"],
  1247. }
  1248. android_test_helper_app {
  1249. name: "test_helper_noembed",
  1250. sdk_version: "current",
  1251. jni_libs: ["libjni"],
  1252. use_embedded_native_libs: false,
  1253. }
  1254. `)
  1255. testCases := []struct {
  1256. name string
  1257. packaged bool
  1258. compressed bool
  1259. }{
  1260. {"app", false, false},
  1261. {"app_noembed", false, false},
  1262. {"app_embed", true, false},
  1263. {"test", true, false},
  1264. {"test_noembed", true, true},
  1265. {"test_helper", true, false},
  1266. {"test_helper_noembed", true, true},
  1267. }
  1268. for _, test := range testCases {
  1269. t.Run(test.name, func(t *testing.T) {
  1270. app := ctx.ModuleForTests(test.name, "android_common")
  1271. jniLibZip := app.MaybeOutput("jnilibs.zip")
  1272. if g, w := (jniLibZip.Rule != nil), test.packaged; g != w {
  1273. t.Errorf("expected jni packaged %v, got %v", w, g)
  1274. }
  1275. if jniLibZip.Rule != nil {
  1276. if g, w := !strings.Contains(jniLibZip.Args["jarArgs"], "-L 0"), test.compressed; g != w {
  1277. t.Errorf("expected jni compressed %v, got %v", w, g)
  1278. }
  1279. if !strings.Contains(jniLibZip.Implicits[0].String(), "_sdk_") {
  1280. t.Errorf("expected input %q to use sdk variant", jniLibZip.Implicits[0].String())
  1281. }
  1282. }
  1283. })
  1284. }
  1285. }
  1286. func TestJNISDK(t *testing.T) {
  1287. ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
  1288. cc_library {
  1289. name: "libjni",
  1290. system_shared_libs: [],
  1291. stl: "none",
  1292. sdk_version: "current",
  1293. }
  1294. android_test {
  1295. name: "app_platform",
  1296. jni_libs: ["libjni"],
  1297. platform_apis: true,
  1298. }
  1299. android_test {
  1300. name: "app_sdk",
  1301. jni_libs: ["libjni"],
  1302. sdk_version: "current",
  1303. }
  1304. android_test {
  1305. name: "app_force_platform",
  1306. jni_libs: ["libjni"],
  1307. sdk_version: "current",
  1308. jni_uses_platform_apis: true,
  1309. }
  1310. android_test {
  1311. name: "app_force_sdk",
  1312. jni_libs: ["libjni"],
  1313. platform_apis: true,
  1314. jni_uses_sdk_apis: true,
  1315. }
  1316. cc_library {
  1317. name: "libvendorjni",
  1318. system_shared_libs: [],
  1319. stl: "none",
  1320. vendor: true,
  1321. }
  1322. android_test {
  1323. name: "app_vendor",
  1324. jni_libs: ["libvendorjni"],
  1325. sdk_version: "current",
  1326. vendor: true,
  1327. }
  1328. `)
  1329. testCases := []struct {
  1330. name string
  1331. sdkJNI bool
  1332. vendorJNI bool
  1333. }{
  1334. {name: "app_platform"},
  1335. {name: "app_sdk", sdkJNI: true},
  1336. {name: "app_force_platform"},
  1337. {name: "app_force_sdk", sdkJNI: true},
  1338. {name: "app_vendor", vendorJNI: true},
  1339. }
  1340. platformJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_shared").
  1341. Output("libjni.so").Output.String()
  1342. sdkJNI := ctx.ModuleForTests("libjni", "android_arm64_armv8-a_sdk_shared").
  1343. Output("libjni.so").Output.String()
  1344. vendorJNI := ctx.ModuleForTests("libvendorjni", "android_arm64_armv8-a_shared").
  1345. Output("libvendorjni.so").Output.String()
  1346. for _, test := range testCases {
  1347. t.Run(test.name, func(t *testing.T) {
  1348. app := ctx.ModuleForTests(test.name, "android_common")
  1349. jniLibZip := app.MaybeOutput("jnilibs.zip")
  1350. if len(jniLibZip.Implicits) != 1 {
  1351. t.Fatalf("expected exactly one jni library, got %q", jniLibZip.Implicits.Strings())
  1352. }
  1353. gotJNI := jniLibZip.Implicits[0].String()
  1354. if test.sdkJNI {
  1355. if gotJNI != sdkJNI {
  1356. t.Errorf("expected SDK JNI library %q, got %q", sdkJNI, gotJNI)
  1357. }
  1358. } else if test.vendorJNI {
  1359. if gotJNI != vendorJNI {
  1360. t.Errorf("expected platform JNI library %q, got %q", vendorJNI, gotJNI)
  1361. }
  1362. } else {
  1363. if gotJNI != platformJNI {
  1364. t.Errorf("expected platform JNI library %q, got %q", platformJNI, gotJNI)
  1365. }
  1366. }
  1367. })
  1368. }
  1369. t.Run("jni_uses_platform_apis_error", func(t *testing.T) {
  1370. testJavaError(t, `jni_uses_platform_apis: can only be set for modules that set sdk_version`, `
  1371. android_test {
  1372. name: "app_platform",
  1373. platform_apis: true,
  1374. jni_uses_platform_apis: true,
  1375. }
  1376. `)
  1377. })
  1378. t.Run("jni_uses_sdk_apis_error", func(t *testing.T) {
  1379. testJavaError(t, `jni_uses_sdk_apis: can only be set for modules that do not set sdk_version`, `
  1380. android_test {
  1381. name: "app_sdk",
  1382. sdk_version: "current",
  1383. jni_uses_sdk_apis: true,
  1384. }
  1385. `)
  1386. })
  1387. }
  1388. func TestCertificates(t *testing.T) {
  1389. testCases := []struct {
  1390. name string
  1391. bp string
  1392. certificateOverride string
  1393. expectedLineage string
  1394. expectedCertificate string
  1395. }{
  1396. {
  1397. name: "default",
  1398. bp: `
  1399. android_app {
  1400. name: "foo",
  1401. srcs: ["a.java"],
  1402. sdk_version: "current",
  1403. }
  1404. `,
  1405. certificateOverride: "",
  1406. expectedLineage: "",
  1407. expectedCertificate: "build/make/target/product/security/testkey.x509.pem build/make/target/product/security/testkey.pk8",
  1408. },
  1409. {
  1410. name: "module certificate property",
  1411. bp: `
  1412. android_app {
  1413. name: "foo",
  1414. srcs: ["a.java"],
  1415. certificate: ":new_certificate",
  1416. sdk_version: "current",
  1417. }
  1418. android_app_certificate {
  1419. name: "new_certificate",
  1420. certificate: "cert/new_cert",
  1421. }
  1422. `,
  1423. certificateOverride: "",
  1424. expectedLineage: "",
  1425. expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
  1426. },
  1427. {
  1428. name: "path certificate property",
  1429. bp: `
  1430. android_app {
  1431. name: "foo",
  1432. srcs: ["a.java"],
  1433. certificate: "expiredkey",
  1434. sdk_version: "current",
  1435. }
  1436. `,
  1437. certificateOverride: "",
  1438. expectedLineage: "",
  1439. expectedCertificate: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
  1440. },
  1441. {
  1442. name: "certificate overrides",
  1443. bp: `
  1444. android_app {
  1445. name: "foo",
  1446. srcs: ["a.java"],
  1447. certificate: "expiredkey",
  1448. sdk_version: "current",
  1449. }
  1450. android_app_certificate {
  1451. name: "new_certificate",
  1452. certificate: "cert/new_cert",
  1453. }
  1454. `,
  1455. certificateOverride: "foo:new_certificate",
  1456. expectedLineage: "",
  1457. expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
  1458. },
  1459. {
  1460. name: "certificate lineage",
  1461. bp: `
  1462. android_app {
  1463. name: "foo",
  1464. srcs: ["a.java"],
  1465. certificate: ":new_certificate",
  1466. lineage: "lineage.bin",
  1467. sdk_version: "current",
  1468. }
  1469. android_app_certificate {
  1470. name: "new_certificate",
  1471. certificate: "cert/new_cert",
  1472. }
  1473. `,
  1474. certificateOverride: "",
  1475. expectedLineage: "--lineage lineage.bin",
  1476. expectedCertificate: "cert/new_cert.x509.pem cert/new_cert.pk8",
  1477. },
  1478. }
  1479. for _, test := range testCases {
  1480. t.Run(test.name, func(t *testing.T) {
  1481. config := testAppConfig(nil, test.bp, nil)
  1482. if test.certificateOverride != "" {
  1483. config.TestProductVariables.CertificateOverrides = []string{test.certificateOverride}
  1484. }
  1485. ctx := testContext()
  1486. run(t, ctx, config)
  1487. foo := ctx.ModuleForTests("foo", "android_common")
  1488. signapk := foo.Output("foo.apk")
  1489. signCertificateFlags := signapk.Args["certificates"]
  1490. if test.expectedCertificate != signCertificateFlags {
  1491. t.Errorf("Incorrect signing flags, expected: %q, got: %q", test.expectedCertificate, signCertificateFlags)
  1492. }
  1493. signFlags := signapk.Args["flags"]
  1494. if test.expectedLineage != signFlags {
  1495. t.Errorf("Incorrect signing flags, expected: %q, got: %q", test.expectedLineage, signFlags)
  1496. }
  1497. })
  1498. }
  1499. }
  1500. func TestRequestV4SigningFlag(t *testing.T) {
  1501. testCases := []struct {
  1502. name string
  1503. bp string
  1504. expected string
  1505. }{
  1506. {
  1507. name: "default",
  1508. bp: `
  1509. android_app {
  1510. name: "foo",
  1511. srcs: ["a.java"],
  1512. sdk_version: "current",
  1513. }
  1514. `,
  1515. expected: "",
  1516. },
  1517. {
  1518. name: "default",
  1519. bp: `
  1520. android_app {
  1521. name: "foo",
  1522. srcs: ["a.java"],
  1523. sdk_version: "current",
  1524. v4_signature: false,
  1525. }
  1526. `,
  1527. expected: "",
  1528. },
  1529. {
  1530. name: "module certificate property",
  1531. bp: `
  1532. android_app {
  1533. name: "foo",
  1534. srcs: ["a.java"],
  1535. sdk_version: "current",
  1536. v4_signature: true,
  1537. }
  1538. `,
  1539. expected: "--enable-v4",
  1540. },
  1541. }
  1542. for _, test := range testCases {
  1543. t.Run(test.name, func(t *testing.T) {
  1544. config := testAppConfig(nil, test.bp, nil)
  1545. ctx := testContext()
  1546. run(t, ctx, config)
  1547. foo := ctx.ModuleForTests("foo", "android_common")
  1548. signapk := foo.Output("foo.apk")
  1549. signFlags := signapk.Args["flags"]
  1550. if test.expected != signFlags {
  1551. t.Errorf("Incorrect signing flags, expected: %q, got: %q", test.expected, signFlags)
  1552. }
  1553. })
  1554. }
  1555. }
  1556. func TestPackageNameOverride(t *testing.T) {
  1557. testCases := []struct {
  1558. name string
  1559. bp string
  1560. packageNameOverride string
  1561. expected []string
  1562. }{
  1563. {
  1564. name: "default",
  1565. bp: `
  1566. android_app {
  1567. name: "foo",
  1568. srcs: ["a.java"],
  1569. sdk_version: "current",
  1570. }
  1571. `,
  1572. packageNameOverride: "",
  1573. expected: []string{
  1574. buildDir + "/.intermediates/foo/android_common/foo.apk",
  1575. buildDir + "/target/product/test_device/system/app/foo/foo.apk",
  1576. },
  1577. },
  1578. {
  1579. name: "overridden",
  1580. bp: `
  1581. android_app {
  1582. name: "foo",
  1583. srcs: ["a.java"],
  1584. sdk_version: "current",
  1585. }
  1586. `,
  1587. packageNameOverride: "foo:bar",
  1588. expected: []string{
  1589. // The package apk should be still be the original name for test dependencies.
  1590. buildDir + "/.intermediates/foo/android_common/bar.apk",
  1591. buildDir + "/target/product/test_device/system/app/bar/bar.apk",
  1592. },
  1593. },
  1594. }
  1595. for _, test := range testCases {
  1596. t.Run(test.name, func(t *testing.T) {
  1597. config := testAppConfig(nil, test.bp, nil)
  1598. if test.packageNameOverride != "" {
  1599. config.TestProductVariables.PackageNameOverrides = []string{test.packageNameOverride}
  1600. }
  1601. ctx := testContext()
  1602. run(t, ctx, config)
  1603. foo := ctx.ModuleForTests("foo", "android_common")
  1604. outputs := foo.AllOutputs()
  1605. outputMap := make(map[string]bool)
  1606. for _, o := range outputs {
  1607. outputMap[o] = true
  1608. }
  1609. for _, e := range test.expected {
  1610. if _, exist := outputMap[e]; !exist {
  1611. t.Errorf("Can't find %q in output files.\nAll outputs:%v", e, outputs)
  1612. }
  1613. }
  1614. })
  1615. }
  1616. }
  1617. func TestInstrumentationTargetOverridden(t *testing.T) {
  1618. bp := `
  1619. android_app {
  1620. name: "foo",
  1621. srcs: ["a.java"],
  1622. sdk_version: "current",
  1623. }
  1624. android_test {
  1625. name: "bar",
  1626. instrumentation_for: "foo",
  1627. sdk_version: "current",
  1628. }
  1629. `
  1630. config := testAppConfig(nil, bp, nil)
  1631. config.TestProductVariables.ManifestPackageNameOverrides = []string{"foo:org.dandroid.bp"}
  1632. ctx := testContext()
  1633. run(t, ctx, config)
  1634. bar := ctx.ModuleForTests("bar", "android_common")
  1635. res := bar.Output("package-res.apk")
  1636. aapt2Flags := res.Args["flags"]
  1637. e := "--rename-instrumentation-target-package org.dandroid.bp"
  1638. if !strings.Contains(aapt2Flags, e) {
  1639. t.Errorf("target package renaming flag, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
  1640. }
  1641. }
  1642. func TestOverrideAndroidApp(t *testing.T) {
  1643. ctx, _ := testJava(t, `
  1644. android_app {
  1645. name: "foo",
  1646. srcs: ["a.java"],
  1647. certificate: "expiredkey",
  1648. overrides: ["qux"],
  1649. sdk_version: "current",
  1650. }
  1651. override_android_app {
  1652. name: "bar",
  1653. base: "foo",
  1654. certificate: ":new_certificate",
  1655. lineage: "lineage.bin",
  1656. logging_parent: "bah",
  1657. }
  1658. android_app_certificate {
  1659. name: "new_certificate",
  1660. certificate: "cert/new_cert",
  1661. }
  1662. override_android_app {
  1663. name: "baz",
  1664. base: "foo",
  1665. package_name: "org.dandroid.bp",
  1666. }
  1667. override_android_app {
  1668. name: "baz_no_rename_resources",
  1669. base: "foo",
  1670. package_name: "org.dandroid.bp",
  1671. rename_resources_package: false,
  1672. }
  1673. android_app {
  1674. name: "foo_no_rename_resources",
  1675. srcs: ["a.java"],
  1676. certificate: "expiredkey",
  1677. overrides: ["qux"],
  1678. rename_resources_package: false,
  1679. sdk_version: "current",
  1680. }
  1681. override_android_app {
  1682. name: "baz_base_no_rename_resources",
  1683. base: "foo_no_rename_resources",
  1684. package_name: "org.dandroid.bp",
  1685. }
  1686. override_android_app {
  1687. name: "baz_override_base_rename_resources",
  1688. base: "foo_no_rename_resources",
  1689. package_name: "org.dandroid.bp",
  1690. rename_resources_package: true,
  1691. }
  1692. `)
  1693. expectedVariants := []struct {
  1694. name string
  1695. moduleName string
  1696. variantName string
  1697. apkName string
  1698. apkPath string
  1699. certFlag string
  1700. lineageFlag string
  1701. overrides []string
  1702. packageFlag string
  1703. renameResources bool
  1704. logging_parent string
  1705. }{
  1706. {
  1707. name: "foo",
  1708. moduleName: "foo",
  1709. variantName: "android_common",
  1710. apkPath: "/target/product/test_device/system/app/foo/foo.apk",
  1711. certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
  1712. lineageFlag: "",
  1713. overrides: []string{"qux"},
  1714. packageFlag: "",
  1715. renameResources: false,
  1716. logging_parent: "",
  1717. },
  1718. {
  1719. name: "foo",
  1720. moduleName: "bar",
  1721. variantName: "android_common_bar",
  1722. apkPath: "/target/product/test_device/system/app/bar/bar.apk",
  1723. certFlag: "cert/new_cert.x509.pem cert/new_cert.pk8",
  1724. lineageFlag: "--lineage lineage.bin",
  1725. overrides: []string{"qux", "foo"},
  1726. packageFlag: "",
  1727. renameResources: false,
  1728. logging_parent: "bah",
  1729. },
  1730. {
  1731. name: "foo",
  1732. moduleName: "baz",
  1733. variantName: "android_common_baz",
  1734. apkPath: "/target/product/test_device/system/app/baz/baz.apk",
  1735. certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
  1736. lineageFlag: "",
  1737. overrides: []string{"qux", "foo"},
  1738. packageFlag: "org.dandroid.bp",
  1739. renameResources: true,
  1740. logging_parent: "",
  1741. },
  1742. {
  1743. name: "foo",
  1744. moduleName: "baz_no_rename_resources",
  1745. variantName: "android_common_baz_no_rename_resources",
  1746. apkPath: "/target/product/test_device/system/app/baz_no_rename_resources/baz_no_rename_resources.apk",
  1747. certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
  1748. lineageFlag: "",
  1749. overrides: []string{"qux", "foo"},
  1750. packageFlag: "org.dandroid.bp",
  1751. renameResources: false,
  1752. logging_parent: "",
  1753. },
  1754. {
  1755. name: "foo_no_rename_resources",
  1756. moduleName: "baz_base_no_rename_resources",
  1757. variantName: "android_common_baz_base_no_rename_resources",
  1758. apkPath: "/target/product/test_device/system/app/baz_base_no_rename_resources/baz_base_no_rename_resources.apk",
  1759. certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
  1760. lineageFlag: "",
  1761. overrides: []string{"qux", "foo_no_rename_resources"},
  1762. packageFlag: "org.dandroid.bp",
  1763. renameResources: false,
  1764. logging_parent: "",
  1765. },
  1766. {
  1767. name: "foo_no_rename_resources",
  1768. moduleName: "baz_override_base_rename_resources",
  1769. variantName: "android_common_baz_override_base_rename_resources",
  1770. apkPath: "/target/product/test_device/system/app/baz_override_base_rename_resources/baz_override_base_rename_resources.apk",
  1771. certFlag: "build/make/target/product/security/expiredkey.x509.pem build/make/target/product/security/expiredkey.pk8",
  1772. lineageFlag: "",
  1773. overrides: []string{"qux", "foo_no_rename_resources"},
  1774. packageFlag: "org.dandroid.bp",
  1775. renameResources: true,
  1776. logging_parent: "",
  1777. },
  1778. }
  1779. for _, expected := range expectedVariants {
  1780. variant := ctx.ModuleForTests(expected.name, expected.variantName)
  1781. // Check the final apk name
  1782. outputs := variant.AllOutputs()
  1783. expectedApkPath := buildDir + expected.apkPath
  1784. found := false
  1785. for _, o := range outputs {
  1786. if o == expectedApkPath {
  1787. found = true
  1788. break
  1789. }
  1790. }
  1791. if !found {
  1792. t.Errorf("Can't find %q in output files.\nAll outputs:%v", expectedApkPath, outputs)
  1793. }
  1794. // Check the certificate paths
  1795. signapk := variant.Output(expected.moduleName + ".apk")
  1796. certFlag := signapk.Args["certificates"]
  1797. if expected.certFlag != certFlag {
  1798. t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected.certFlag, certFlag)
  1799. }
  1800. // Check the lineage flags
  1801. lineageFlag := signapk.Args["flags"]
  1802. if expected.lineageFlag != lineageFlag {
  1803. t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected.lineageFlag, lineageFlag)
  1804. }
  1805. // Check if the overrides field values are correctly aggregated.
  1806. mod := variant.Module().(*AndroidApp)
  1807. if !reflect.DeepEqual(expected.overrides, mod.appProperties.Overrides) {
  1808. t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
  1809. expected.overrides, mod.appProperties.Overrides)
  1810. }
  1811. // Test Overridable property: Logging_parent
  1812. logging_parent := mod.aapt.LoggingParent
  1813. if expected.logging_parent != logging_parent {
  1814. t.Errorf("Incorrect overrides property value for logging parent, expected: %q, got: %q",
  1815. expected.logging_parent, logging_parent)
  1816. }
  1817. // Check the package renaming flag, if exists.
  1818. res := variant.Output("package-res.apk")
  1819. aapt2Flags := res.Args["flags"]
  1820. checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
  1821. expectedPackage := expected.packageFlag
  1822. if !expected.renameResources {
  1823. expectedPackage = ""
  1824. }
  1825. checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expectedPackage)
  1826. }
  1827. }
  1828. func TestOverrideAndroidAppDependency(t *testing.T) {
  1829. ctx, _ := testJava(t, `
  1830. android_app {
  1831. name: "foo",
  1832. srcs: ["a.java"],
  1833. sdk_version: "current",
  1834. }
  1835. override_android_app {
  1836. name: "bar",
  1837. base: "foo",
  1838. package_name: "org.dandroid.bp",
  1839. }
  1840. android_test {
  1841. name: "baz",
  1842. srcs: ["b.java"],
  1843. instrumentation_for: "foo",
  1844. }
  1845. android_test {
  1846. name: "qux",
  1847. srcs: ["b.java"],
  1848. instrumentation_for: "bar",
  1849. }
  1850. `)
  1851. // Verify baz, which depends on the overridden module foo, has the correct classpath javac arg.
  1852. javac := ctx.ModuleForTests("baz", "android_common").Rule("javac")
  1853. fooTurbine := filepath.Join(buildDir, ".intermediates", "foo", "android_common", "turbine-combined", "foo.jar")
  1854. if !strings.Contains(javac.Args["classpath"], fooTurbine) {
  1855. t.Errorf("baz classpath %v does not contain %q", javac.Args["classpath"], fooTurbine)
  1856. }
  1857. // Verify qux, which depends on the overriding module bar, has the correct classpath javac arg.
  1858. javac = ctx.ModuleForTests("qux", "android_common").Rule("javac")
  1859. barTurbine := filepath.Join(buildDir, ".intermediates", "foo", "android_common_bar", "turbine-combined", "foo.jar")
  1860. if !strings.Contains(javac.Args["classpath"], barTurbine) {
  1861. t.Errorf("qux classpath %v does not contain %q", javac.Args["classpath"], barTurbine)
  1862. }
  1863. }
  1864. func TestOverrideAndroidTest(t *testing.T) {
  1865. ctx, _ := testJava(t, `
  1866. android_app {
  1867. name: "foo",
  1868. srcs: ["a.java"],
  1869. package_name: "com.android.foo",
  1870. sdk_version: "current",
  1871. }
  1872. override_android_app {
  1873. name: "bar",
  1874. base: "foo",
  1875. package_name: "com.android.bar",
  1876. }
  1877. android_test {
  1878. name: "foo_test",
  1879. srcs: ["b.java"],
  1880. instrumentation_for: "foo",
  1881. }
  1882. override_android_test {
  1883. name: "bar_test",
  1884. base: "foo_test",
  1885. package_name: "com.android.bar.test",
  1886. instrumentation_for: "bar",
  1887. instrumentation_target_package: "com.android.bar",
  1888. }
  1889. `)
  1890. expectedVariants := []struct {
  1891. moduleName string
  1892. variantName string
  1893. apkPath string
  1894. overrides []string
  1895. targetVariant string
  1896. packageFlag string
  1897. targetPackageFlag string
  1898. }{
  1899. {
  1900. variantName: "android_common",
  1901. apkPath: "/target/product/test_device/testcases/foo_test/arm64/foo_test.apk",
  1902. overrides: nil,
  1903. targetVariant: "android_common",
  1904. packageFlag: "",
  1905. targetPackageFlag: "",
  1906. },
  1907. {
  1908. variantName: "android_common_bar_test",
  1909. apkPath: "/target/product/test_device/testcases/bar_test/arm64/bar_test.apk",
  1910. overrides: []string{"foo_test"},
  1911. targetVariant: "android_common_bar",
  1912. packageFlag: "com.android.bar.test",
  1913. targetPackageFlag: "com.android.bar",
  1914. },
  1915. }
  1916. for _, expected := range expectedVariants {
  1917. variant := ctx.ModuleForTests("foo_test", expected.variantName)
  1918. // Check the final apk name
  1919. outputs := variant.AllOutputs()
  1920. expectedApkPath := buildDir + expected.apkPath
  1921. found := false
  1922. for _, o := range outputs {
  1923. if o == expectedApkPath {
  1924. found = true
  1925. break
  1926. }
  1927. }
  1928. if !found {
  1929. t.Errorf("Can't find %q in output files.\nAll outputs:%v", expectedApkPath, outputs)
  1930. }
  1931. // Check if the overrides field values are correctly aggregated.
  1932. mod := variant.Module().(*AndroidTest)
  1933. if !reflect.DeepEqual(expected.overrides, mod.appProperties.Overrides) {
  1934. t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
  1935. expected.overrides, mod.appProperties.Overrides)
  1936. }
  1937. // Check if javac classpath has the correct jar file path. This checks instrumentation_for overrides.
  1938. javac := variant.Rule("javac")
  1939. turbine := filepath.Join(buildDir, ".intermediates", "foo", expected.targetVariant, "turbine-combined", "foo.jar")
  1940. if !strings.Contains(javac.Args["classpath"], turbine) {
  1941. t.Errorf("classpath %q does not contain %q", javac.Args["classpath"], turbine)
  1942. }
  1943. // Check aapt2 flags.
  1944. res := variant.Output("package-res.apk")
  1945. aapt2Flags := res.Args["flags"]
  1946. checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
  1947. checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", expected.packageFlag)
  1948. checkAapt2LinkFlag(t, aapt2Flags, "rename-instrumentation-target-package", expected.targetPackageFlag)
  1949. }
  1950. }
  1951. func TestAndroidTest_FixTestConfig(t *testing.T) {
  1952. ctx, _ := testJava(t, `
  1953. android_app {
  1954. name: "foo",
  1955. srcs: ["a.java"],
  1956. package_name: "com.android.foo",
  1957. sdk_version: "current",
  1958. }
  1959. android_test {
  1960. name: "foo_test",
  1961. srcs: ["b.java"],
  1962. instrumentation_for: "foo",
  1963. }
  1964. android_test {
  1965. name: "bar_test",
  1966. srcs: ["b.java"],
  1967. package_name: "com.android.bar.test",
  1968. instrumentation_for: "foo",
  1969. }
  1970. override_android_test {
  1971. name: "baz_test",
  1972. base: "foo_test",
  1973. package_name: "com.android.baz.test",
  1974. }
  1975. `)
  1976. testCases := []struct {
  1977. moduleName string
  1978. variantName string
  1979. expectedFlags []string
  1980. }{
  1981. {
  1982. moduleName: "foo_test",
  1983. variantName: "android_common",
  1984. },
  1985. {
  1986. moduleName: "bar_test",
  1987. variantName: "android_common",
  1988. expectedFlags: []string{
  1989. "--manifest " + buildDir + "/.intermediates/bar_test/android_common/manifest_fixer/AndroidManifest.xml",
  1990. "--package-name com.android.bar.test",
  1991. },
  1992. },
  1993. {
  1994. moduleName: "foo_test",
  1995. variantName: "android_common_baz_test",
  1996. expectedFlags: []string{
  1997. "--manifest " + buildDir +
  1998. "/.intermediates/foo_test/android_common_baz_test/manifest_fixer/AndroidManifest.xml",
  1999. "--package-name com.android.baz.test",
  2000. "--test-file-name baz_test.apk",
  2001. },
  2002. },
  2003. }
  2004. for _, test := range testCases {
  2005. variant := ctx.ModuleForTests(test.moduleName, test.variantName)
  2006. params := variant.MaybeOutput("test_config_fixer/AndroidTest.xml")
  2007. if len(test.expectedFlags) > 0 {
  2008. if params.Rule == nil {
  2009. t.Errorf("test_config_fixer was expected to run, but didn't")
  2010. } else {
  2011. for _, flag := range test.expectedFlags {
  2012. if !strings.Contains(params.RuleParams.Command, flag) {
  2013. t.Errorf("Flag %q was not found in command: %q", flag, params.RuleParams.Command)
  2014. }
  2015. }
  2016. }
  2017. } else {
  2018. if params.Rule != nil {
  2019. t.Errorf("test_config_fixer was not expected to run, but did: %q", params.RuleParams.Command)
  2020. }
  2021. }
  2022. }
  2023. }
  2024. func TestAndroidAppImport(t *testing.T) {
  2025. ctx, _ := testJava(t, `
  2026. android_app_import {
  2027. name: "foo",
  2028. apk: "prebuilts/apk/app.apk",
  2029. certificate: "platform",
  2030. dex_preopt: {
  2031. enabled: true,
  2032. },
  2033. }
  2034. `)
  2035. variant := ctx.ModuleForTests("foo", "android_common")
  2036. // Check dexpreopt outputs.
  2037. if variant.MaybeOutput("dexpreopt/oat/arm64/package.vdex").Rule == nil ||
  2038. variant.MaybeOutput("dexpreopt/oat/arm64/package.odex").Rule == nil {
  2039. t.Errorf("can't find dexpreopt outputs")
  2040. }
  2041. // Check cert signing flag.
  2042. signedApk := variant.Output("signed/foo.apk")
  2043. signingFlag := signedApk.Args["certificates"]
  2044. expected := "build/make/target/product/security/platform.x509.pem build/make/target/product/security/platform.pk8"
  2045. if expected != signingFlag {
  2046. t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected, signingFlag)
  2047. }
  2048. }
  2049. func TestAndroidAppImport_NoDexPreopt(t *testing.T) {
  2050. ctx, _ := testJava(t, `
  2051. android_app_import {
  2052. name: "foo",
  2053. apk: "prebuilts/apk/app.apk",
  2054. certificate: "platform",
  2055. dex_preopt: {
  2056. enabled: false,
  2057. },
  2058. }
  2059. `)
  2060. variant := ctx.ModuleForTests("foo", "android_common")
  2061. // Check dexpreopt outputs. They shouldn't exist.
  2062. if variant.MaybeOutput("dexpreopt/oat/arm64/package.vdex").Rule != nil ||
  2063. variant.MaybeOutput("dexpreopt/oat/arm64/package.odex").Rule != nil {
  2064. t.Errorf("dexpreopt shouldn't have run.")
  2065. }
  2066. }
  2067. func TestAndroidAppImport_Presigned(t *testing.T) {
  2068. ctx, _ := testJava(t, `
  2069. android_app_import {
  2070. name: "foo",
  2071. apk: "prebuilts/apk/app.apk",
  2072. presigned: true,
  2073. dex_preopt: {
  2074. enabled: true,
  2075. },
  2076. }
  2077. `)
  2078. variant := ctx.ModuleForTests("foo", "android_common")
  2079. // Check dexpreopt outputs.
  2080. if variant.MaybeOutput("dexpreopt/oat/arm64/package.vdex").Rule == nil ||
  2081. variant.MaybeOutput("dexpreopt/oat/arm64/package.odex").Rule == nil {
  2082. t.Errorf("can't find dexpreopt outputs")
  2083. }
  2084. // Make sure signing was skipped and aligning was done.
  2085. if variant.MaybeOutput("signed/foo.apk").Rule != nil {
  2086. t.Errorf("signing rule shouldn't be included.")
  2087. }
  2088. if variant.MaybeOutput("zip-aligned/foo.apk").Rule == nil {
  2089. t.Errorf("can't find aligning rule")
  2090. }
  2091. }
  2092. func TestAndroidAppImport_SigningLineage(t *testing.T) {
  2093. ctx, _ := testJava(t, `
  2094. android_app_import {
  2095. name: "foo",
  2096. apk: "prebuilts/apk/app.apk",
  2097. certificate: "platform",
  2098. lineage: "lineage.bin",
  2099. }
  2100. `)
  2101. variant := ctx.ModuleForTests("foo", "android_common")
  2102. // Check cert signing lineage flag.
  2103. signedApk := variant.Output("signed/foo.apk")
  2104. signingFlag := signedApk.Args["flags"]
  2105. expected := "--lineage lineage.bin"
  2106. if expected != signingFlag {
  2107. t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected, signingFlag)
  2108. }
  2109. }
  2110. func TestAndroidAppImport_DefaultDevCert(t *testing.T) {
  2111. ctx, _ := testJava(t, `
  2112. android_app_import {
  2113. name: "foo",
  2114. apk: "prebuilts/apk/app.apk",
  2115. default_dev_cert: true,
  2116. dex_preopt: {
  2117. enabled: true,
  2118. },
  2119. }
  2120. `)
  2121. variant := ctx.ModuleForTests("foo", "android_common")
  2122. // Check dexpreopt outputs.
  2123. if variant.MaybeOutput("dexpreopt/oat/arm64/package.vdex").Rule == nil ||
  2124. variant.MaybeOutput("dexpreopt/oat/arm64/package.odex").Rule == nil {
  2125. t.Errorf("can't find dexpreopt outputs")
  2126. }
  2127. // Check cert signing flag.
  2128. signedApk := variant.Output("signed/foo.apk")
  2129. signingFlag := signedApk.Args["certificates"]
  2130. expected := "build/make/target/product/security/testkey.x509.pem build/make/target/product/security/testkey.pk8"
  2131. if expected != signingFlag {
  2132. t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected, signingFlag)
  2133. }
  2134. }
  2135. func TestAndroidAppImport_DpiVariants(t *testing.T) {
  2136. bp := `
  2137. android_app_import {
  2138. name: "foo",
  2139. apk: "prebuilts/apk/app.apk",
  2140. dpi_variants: {
  2141. xhdpi: {
  2142. apk: "prebuilts/apk/app_xhdpi.apk",
  2143. },
  2144. xxhdpi: {
  2145. apk: "prebuilts/apk/app_xxhdpi.apk",
  2146. },
  2147. },
  2148. presigned: true,
  2149. dex_preopt: {
  2150. enabled: true,
  2151. },
  2152. }
  2153. `
  2154. testCases := []struct {
  2155. name string
  2156. aaptPreferredConfig *string
  2157. aaptPrebuiltDPI []string
  2158. expected string
  2159. }{
  2160. {
  2161. name: "no preferred",
  2162. aaptPreferredConfig: nil,
  2163. aaptPrebuiltDPI: []string{},
  2164. expected: "prebuilts/apk/app.apk",
  2165. },
  2166. {
  2167. name: "AAPTPreferredConfig matches",
  2168. aaptPreferredConfig: proptools.StringPtr("xhdpi"),
  2169. aaptPrebuiltDPI: []string{"xxhdpi", "ldpi"},
  2170. expected: "prebuilts/apk/app_xhdpi.apk",
  2171. },
  2172. {
  2173. name: "AAPTPrebuiltDPI matches",
  2174. aaptPreferredConfig: proptools.StringPtr("mdpi"),
  2175. aaptPrebuiltDPI: []string{"xxhdpi", "xhdpi"},
  2176. expected: "prebuilts/apk/app_xxhdpi.apk",
  2177. },
  2178. {
  2179. name: "non-first AAPTPrebuiltDPI matches",
  2180. aaptPreferredConfig: proptools.StringPtr("mdpi"),
  2181. aaptPrebuiltDPI: []string{"ldpi", "xhdpi"},
  2182. expected: "prebuilts/apk/app_xhdpi.apk",
  2183. },
  2184. {
  2185. name: "no matches",
  2186. aaptPreferredConfig: proptools.StringPtr("mdpi"),
  2187. aaptPrebuiltDPI: []string{"ldpi", "xxxhdpi"},
  2188. expected: "prebuilts/apk/app.apk",
  2189. },
  2190. }
  2191. jniRuleRe := regexp.MustCompile("^if \\(zipinfo (\\S+)")
  2192. for _, test := range testCases {
  2193. config := testAppConfig(nil, bp, nil)
  2194. config.TestProductVariables.AAPTPreferredConfig = test.aaptPreferredConfig
  2195. config.TestProductVariables.AAPTPrebuiltDPI = test.aaptPrebuiltDPI
  2196. ctx := testContext()
  2197. run(t, ctx, config)
  2198. variant := ctx.ModuleForTests("foo", "android_common")
  2199. jniRuleCommand := variant.Output("jnis-uncompressed/foo.apk").RuleParams.Command
  2200. matches := jniRuleRe.FindStringSubmatch(jniRuleCommand)
  2201. if len(matches) != 2 {
  2202. t.Errorf("failed to extract the src apk path from %q", jniRuleCommand)
  2203. }
  2204. if test.expected != matches[1] {
  2205. t.Errorf("wrong src apk, expected: %q got: %q", test.expected, matches[1])
  2206. }
  2207. }
  2208. }
  2209. func TestAndroidAppImport_Filename(t *testing.T) {
  2210. ctx, config := testJava(t, `
  2211. android_app_import {
  2212. name: "foo",
  2213. apk: "prebuilts/apk/app.apk",
  2214. presigned: true,
  2215. }
  2216. android_app_import {
  2217. name: "bar",
  2218. apk: "prebuilts/apk/app.apk",
  2219. presigned: true,
  2220. filename: "bar_sample.apk"
  2221. }
  2222. `)
  2223. testCases := []struct {
  2224. name string
  2225. expected string
  2226. }{
  2227. {
  2228. name: "foo",
  2229. expected: "foo.apk",
  2230. },
  2231. {
  2232. name: "bar",
  2233. expected: "bar_sample.apk",
  2234. },
  2235. }
  2236. for _, test := range testCases {
  2237. variant := ctx.ModuleForTests(test.name, "android_common")
  2238. if variant.MaybeOutput(test.expected).Rule == nil {
  2239. t.Errorf("can't find output named %q - all outputs: %v", test.expected, variant.AllOutputs())
  2240. }
  2241. a := variant.Module().(*AndroidAppImport)
  2242. expectedValues := []string{test.expected}
  2243. actualValues := android.AndroidMkEntriesForTest(
  2244. t, config, "", a)[0].EntryMap["LOCAL_INSTALLED_MODULE_STEM"]
  2245. if !reflect.DeepEqual(actualValues, expectedValues) {
  2246. t.Errorf("Incorrect LOCAL_INSTALLED_MODULE_STEM value '%s', expected '%s'",
  2247. actualValues, expectedValues)
  2248. }
  2249. }
  2250. }
  2251. func TestAndroidAppImport_ArchVariants(t *testing.T) {
  2252. // The test config's target arch is ARM64.
  2253. testCases := []struct {
  2254. name string
  2255. bp string
  2256. expected string
  2257. }{
  2258. {
  2259. name: "matching arch",
  2260. bp: `
  2261. android_app_import {
  2262. name: "foo",
  2263. apk: "prebuilts/apk/app.apk",
  2264. arch: {
  2265. arm64: {
  2266. apk: "prebuilts/apk/app_arm64.apk",
  2267. },
  2268. },
  2269. presigned: true,
  2270. dex_preopt: {
  2271. enabled: true,
  2272. },
  2273. }
  2274. `,
  2275. expected: "prebuilts/apk/app_arm64.apk",
  2276. },
  2277. {
  2278. name: "no matching arch",
  2279. bp: `
  2280. android_app_import {
  2281. name: "foo",
  2282. apk: "prebuilts/apk/app.apk",
  2283. arch: {
  2284. arm: {
  2285. apk: "prebuilts/apk/app_arm.apk",
  2286. },
  2287. },
  2288. presigned: true,
  2289. dex_preopt: {
  2290. enabled: true,
  2291. },
  2292. }
  2293. `,
  2294. expected: "prebuilts/apk/app.apk",
  2295. },
  2296. }
  2297. jniRuleRe := regexp.MustCompile("^if \\(zipinfo (\\S+)")
  2298. for _, test := range testCases {
  2299. ctx, _ := testJava(t, test.bp)
  2300. variant := ctx.ModuleForTests("foo", "android_common")
  2301. jniRuleCommand := variant.Output("jnis-uncompressed/foo.apk").RuleParams.Command
  2302. matches := jniRuleRe.FindStringSubmatch(jniRuleCommand)
  2303. if len(matches) != 2 {
  2304. t.Errorf("failed to extract the src apk path from %q", jniRuleCommand)
  2305. }
  2306. if test.expected != matches[1] {
  2307. t.Errorf("wrong src apk, expected: %q got: %q", test.expected, matches[1])
  2308. }
  2309. }
  2310. }
  2311. func TestAndroidTestImport(t *testing.T) {
  2312. ctx, config := testJava(t, `
  2313. android_test_import {
  2314. name: "foo",
  2315. apk: "prebuilts/apk/app.apk",
  2316. presigned: true,
  2317. data: [
  2318. "testdata/data",
  2319. ],
  2320. }
  2321. `)
  2322. test := ctx.ModuleForTests("foo", "android_common").Module().(*AndroidTestImport)
  2323. // Check android mks.
  2324. entries := android.AndroidMkEntriesForTest(t, config, "", test)[0]
  2325. expected := []string{"tests"}
  2326. actual := entries.EntryMap["LOCAL_MODULE_TAGS"]
  2327. if !reflect.DeepEqual(expected, actual) {
  2328. t.Errorf("Unexpected module tags - expected: %q, actual: %q", expected, actual)
  2329. }
  2330. expected = []string{"testdata/data:testdata/data"}
  2331. actual = entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
  2332. if !reflect.DeepEqual(expected, actual) {
  2333. t.Errorf("Unexpected test data - expected: %q, actual: %q", expected, actual)
  2334. }
  2335. }
  2336. func TestAndroidTestImport_NoJinUncompressForPresigned(t *testing.T) {
  2337. ctx, _ := testJava(t, `
  2338. android_test_import {
  2339. name: "foo",
  2340. apk: "prebuilts/apk/app.apk",
  2341. certificate: "cert/new_cert",
  2342. data: [
  2343. "testdata/data",
  2344. ],
  2345. }
  2346. android_test_import {
  2347. name: "foo_presigned",
  2348. apk: "prebuilts/apk/app.apk",
  2349. presigned: true,
  2350. data: [
  2351. "testdata/data",
  2352. ],
  2353. }
  2354. `)
  2355. variant := ctx.ModuleForTests("foo", "android_common")
  2356. jniRule := variant.Output("jnis-uncompressed/foo.apk").RuleParams.Command
  2357. if !strings.HasPrefix(jniRule, "if (zipinfo") {
  2358. t.Errorf("Unexpected JNI uncompress rule command: " + jniRule)
  2359. }
  2360. variant = ctx.ModuleForTests("foo_presigned", "android_common")
  2361. jniRule = variant.Output("jnis-uncompressed/foo_presigned.apk").BuildParams.Rule.String()
  2362. if jniRule != android.Cp.String() {
  2363. t.Errorf("Unexpected JNI uncompress rule: " + jniRule)
  2364. }
  2365. if variant.MaybeOutput("zip-aligned/foo_presigned.apk").Rule == nil {
  2366. t.Errorf("Presigned test apk should be aligned")
  2367. }
  2368. }
  2369. func TestAndroidTestImport_Preprocessed(t *testing.T) {
  2370. ctx, _ := testJava(t, `
  2371. android_test_import {
  2372. name: "foo",
  2373. apk: "prebuilts/apk/app.apk",
  2374. presigned: true,
  2375. preprocessed: true,
  2376. }
  2377. android_test_import {
  2378. name: "foo_cert",
  2379. apk: "prebuilts/apk/app.apk",
  2380. certificate: "cert/new_cert",
  2381. preprocessed: true,
  2382. }
  2383. `)
  2384. testModules := []string{"foo", "foo_cert"}
  2385. for _, m := range testModules {
  2386. apkName := m + ".apk"
  2387. variant := ctx.ModuleForTests(m, "android_common")
  2388. jniRule := variant.Output("jnis-uncompressed/" + apkName).BuildParams.Rule.String()
  2389. if jniRule != android.Cp.String() {
  2390. t.Errorf("Unexpected JNI uncompress rule: " + jniRule)
  2391. }
  2392. // Make sure signing and aligning were skipped.
  2393. if variant.MaybeOutput("signed/"+apkName).Rule != nil {
  2394. t.Errorf("signing rule shouldn't be included for preprocessed.")
  2395. }
  2396. if variant.MaybeOutput("zip-aligned/"+apkName).Rule != nil {
  2397. t.Errorf("aligning rule shouldn't be for preprocessed")
  2398. }
  2399. }
  2400. }
  2401. func TestStl(t *testing.T) {
  2402. ctx, _ := testJava(t, cc.GatherRequiredDepsForTest(android.Android)+`
  2403. cc_library {
  2404. name: "libjni",
  2405. sdk_version: "current",
  2406. stl: "c++_shared",
  2407. }
  2408. android_test {
  2409. name: "stl",
  2410. jni_libs: ["libjni"],
  2411. compile_multilib: "both",
  2412. sdk_version: "current",
  2413. stl: "c++_shared",
  2414. }
  2415. android_test {
  2416. name: "system",
  2417. jni_libs: ["libjni"],
  2418. compile_multilib: "both",
  2419. sdk_version: "current",
  2420. }
  2421. `)
  2422. testCases := []struct {
  2423. name string
  2424. jnis []string
  2425. }{
  2426. {"stl",
  2427. []string{
  2428. "libjni.so",
  2429. "libc++_shared.so",
  2430. },
  2431. },
  2432. {"system",
  2433. []string{
  2434. "libjni.so",
  2435. },
  2436. },
  2437. }
  2438. for _, test := range testCases {
  2439. t.Run(test.name, func(t *testing.T) {
  2440. app := ctx.ModuleForTests(test.name, "android_common")
  2441. jniLibZip := app.Output("jnilibs.zip")
  2442. var jnis []string
  2443. args := strings.Fields(jniLibZip.Args["jarArgs"])
  2444. for i := 0; i < len(args); i++ {
  2445. if args[i] == "-f" {
  2446. jnis = append(jnis, args[i+1])
  2447. i += 1
  2448. }
  2449. }
  2450. jnisJoined := strings.Join(jnis, " ")
  2451. for _, jni := range test.jnis {
  2452. if !strings.Contains(jnisJoined, jni) {
  2453. t.Errorf("missing jni %q in %q", jni, jnis)
  2454. }
  2455. }
  2456. })
  2457. }
  2458. }
  2459. func TestUsesLibraries(t *testing.T) {
  2460. bp := `
  2461. java_sdk_library {
  2462. name: "foo",
  2463. srcs: ["a.java"],
  2464. api_packages: ["foo"],
  2465. sdk_version: "current",
  2466. }
  2467. java_sdk_library {
  2468. name: "qux",
  2469. srcs: ["a.java"],
  2470. api_packages: ["qux"],
  2471. sdk_version: "current",
  2472. }
  2473. java_sdk_library {
  2474. name: "quuz",
  2475. srcs: ["a.java"],
  2476. api_packages: ["quuz"],
  2477. sdk_version: "current",
  2478. }
  2479. java_sdk_library {
  2480. name: "bar",
  2481. srcs: ["a.java"],
  2482. api_packages: ["bar"],
  2483. sdk_version: "current",
  2484. }
  2485. java_sdk_library {
  2486. name: "runtime-library",
  2487. srcs: ["a.java"],
  2488. sdk_version: "current",
  2489. }
  2490. java_library {
  2491. name: "static-runtime-helper",
  2492. srcs: ["a.java"],
  2493. libs: ["runtime-library"],
  2494. sdk_version: "current",
  2495. }
  2496. android_app {
  2497. name: "app",
  2498. srcs: ["a.java"],
  2499. libs: ["qux", "quuz.stubs"],
  2500. static_libs: ["static-runtime-helper"],
  2501. uses_libs: ["foo"],
  2502. sdk_version: "current",
  2503. optional_uses_libs: [
  2504. "bar",
  2505. "baz",
  2506. ],
  2507. }
  2508. android_app_import {
  2509. name: "prebuilt",
  2510. apk: "prebuilts/apk/app.apk",
  2511. certificate: "platform",
  2512. uses_libs: ["foo"],
  2513. optional_uses_libs: [
  2514. "bar",
  2515. "baz",
  2516. ],
  2517. }
  2518. `
  2519. config := testAppConfig(nil, bp, nil)
  2520. config.TestProductVariables.MissingUsesLibraries = []string{"baz"}
  2521. ctx := testContext()
  2522. run(t, ctx, config)
  2523. app := ctx.ModuleForTests("app", "android_common")
  2524. prebuilt := ctx.ModuleForTests("prebuilt", "android_common")
  2525. // Test that implicit dependencies on java_sdk_library instances are passed to the manifest.
  2526. manifestFixerArgs := app.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
  2527. for _, w := range []string{"qux", "quuz", "runtime-library"} {
  2528. if !strings.Contains(manifestFixerArgs, "--uses-library "+w) {
  2529. t.Errorf("unexpected manifest_fixer args: wanted %q in %q", w, manifestFixerArgs)
  2530. }
  2531. }
  2532. // Test that all libraries are verified
  2533. cmd := app.Rule("verify_uses_libraries").RuleParams.Command
  2534. if w := "--uses-library foo"; !strings.Contains(cmd, w) {
  2535. t.Errorf("wanted %q in %q", w, cmd)
  2536. }
  2537. if w := "--optional-uses-library bar --optional-uses-library baz"; !strings.Contains(cmd, w) {
  2538. t.Errorf("wanted %q in %q", w, cmd)
  2539. }
  2540. cmd = prebuilt.Rule("verify_uses_libraries").RuleParams.Command
  2541. if w := `uses_library_names="foo"`; !strings.Contains(cmd, w) {
  2542. t.Errorf("wanted %q in %q", w, cmd)
  2543. }
  2544. if w := `optional_uses_library_names="bar baz"`; !strings.Contains(cmd, w) {
  2545. t.Errorf("wanted %q in %q", w, cmd)
  2546. }
  2547. // Test that all present libraries are preopted, including implicit SDK dependencies, possibly stubs
  2548. cmd = app.Rule("dexpreopt").RuleParams.Command
  2549. w := `--target-classpath-for-sdk any` +
  2550. ` /system/framework/foo.jar` +
  2551. `:/system/framework/quuz.jar` +
  2552. `:/system/framework/qux.jar` +
  2553. `:/system/framework/runtime-library.jar` +
  2554. `:/system/framework/bar.jar`
  2555. if !strings.Contains(cmd, w) {
  2556. t.Errorf("wanted %q in %q", w, cmd)
  2557. }
  2558. cmd = prebuilt.Rule("dexpreopt").RuleParams.Command
  2559. if w := `--target-classpath-for-sdk any /system/framework/foo.jar:/system/framework/bar.jar`; !strings.Contains(cmd, w) {
  2560. t.Errorf("wanted %q in %q", w, cmd)
  2561. }
  2562. }
  2563. func TestCodelessApp(t *testing.T) {
  2564. testCases := []struct {
  2565. name string
  2566. bp string
  2567. noCode bool
  2568. }{
  2569. {
  2570. name: "normal",
  2571. bp: `
  2572. android_app {
  2573. name: "foo",
  2574. srcs: ["a.java"],
  2575. sdk_version: "current",
  2576. }
  2577. `,
  2578. noCode: false,
  2579. },
  2580. {
  2581. name: "app without sources",
  2582. bp: `
  2583. android_app {
  2584. name: "foo",
  2585. sdk_version: "current",
  2586. }
  2587. `,
  2588. noCode: true,
  2589. },
  2590. {
  2591. name: "app with libraries",
  2592. bp: `
  2593. android_app {
  2594. name: "foo",
  2595. static_libs: ["lib"],
  2596. sdk_version: "current",
  2597. }
  2598. java_library {
  2599. name: "lib",
  2600. srcs: ["a.java"],
  2601. sdk_version: "current",
  2602. }
  2603. `,
  2604. noCode: false,
  2605. },
  2606. {
  2607. name: "app with sourceless libraries",
  2608. bp: `
  2609. android_app {
  2610. name: "foo",
  2611. static_libs: ["lib"],
  2612. sdk_version: "current",
  2613. }
  2614. java_library {
  2615. name: "lib",
  2616. sdk_version: "current",
  2617. }
  2618. `,
  2619. // TODO(jungjw): this should probably be true
  2620. noCode: false,
  2621. },
  2622. }
  2623. for _, test := range testCases {
  2624. t.Run(test.name, func(t *testing.T) {
  2625. ctx := testApp(t, test.bp)
  2626. foo := ctx.ModuleForTests("foo", "android_common")
  2627. manifestFixerArgs := foo.Output("manifest_fixer/AndroidManifest.xml").Args["args"]
  2628. if strings.Contains(manifestFixerArgs, "--has-no-code") != test.noCode {
  2629. t.Errorf("unexpected manifest_fixer args: %q", manifestFixerArgs)
  2630. }
  2631. })
  2632. }
  2633. }
  2634. func TestEmbedNotice(t *testing.T) {
  2635. ctx, _ := testJavaWithFS(t, cc.GatherRequiredDepsForTest(android.Android)+`
  2636. android_app {
  2637. name: "foo",
  2638. srcs: ["a.java"],
  2639. static_libs: ["javalib"],
  2640. jni_libs: ["libjni"],
  2641. notice: "APP_NOTICE",
  2642. embed_notices: true,
  2643. sdk_version: "current",
  2644. }
  2645. // No embed_notice flag
  2646. android_app {
  2647. name: "bar",
  2648. srcs: ["a.java"],
  2649. jni_libs: ["libjni"],
  2650. notice: "APP_NOTICE",
  2651. sdk_version: "current",
  2652. }
  2653. // No NOTICE files
  2654. android_app {
  2655. name: "baz",
  2656. srcs: ["a.java"],
  2657. embed_notices: true,
  2658. sdk_version: "current",
  2659. }
  2660. cc_library {
  2661. name: "libjni",
  2662. system_shared_libs: [],
  2663. stl: "none",
  2664. notice: "LIB_NOTICE",
  2665. sdk_version: "current",
  2666. }
  2667. java_library {
  2668. name: "javalib",
  2669. srcs: [
  2670. ":gen",
  2671. ],
  2672. sdk_version: "current",
  2673. }
  2674. genrule {
  2675. name: "gen",
  2676. tools: ["gentool"],
  2677. out: ["gen.java"],
  2678. notice: "GENRULE_NOTICE",
  2679. }
  2680. java_binary_host {
  2681. name: "gentool",
  2682. srcs: ["b.java"],
  2683. notice: "TOOL_NOTICE",
  2684. }
  2685. `, map[string][]byte{
  2686. "APP_NOTICE": nil,
  2687. "GENRULE_NOTICE": nil,
  2688. "LIB_NOTICE": nil,
  2689. "TOOL_NOTICE": nil,
  2690. })
  2691. // foo has NOTICE files to process, and embed_notices is true.
  2692. foo := ctx.ModuleForTests("foo", "android_common")
  2693. // verify merge notices rule.
  2694. mergeNotices := foo.Rule("mergeNoticesRule")
  2695. noticeInputs := mergeNotices.Inputs.Strings()
  2696. // TOOL_NOTICE should be excluded as it's a host module.
  2697. if len(mergeNotices.Inputs) != 3 {
  2698. t.Errorf("number of input notice files: expected = 3, actual = %q", noticeInputs)
  2699. }
  2700. if !inList("APP_NOTICE", noticeInputs) {
  2701. t.Errorf("APP_NOTICE is missing from notice files, %q", noticeInputs)
  2702. }
  2703. if !inList("LIB_NOTICE", noticeInputs) {
  2704. t.Errorf("LIB_NOTICE is missing from notice files, %q", noticeInputs)
  2705. }
  2706. if !inList("GENRULE_NOTICE", noticeInputs) {
  2707. t.Errorf("GENRULE_NOTICE is missing from notice files, %q", noticeInputs)
  2708. }
  2709. // aapt2 flags should include -A <NOTICE dir> so that its contents are put in the APK's /assets.
  2710. res := foo.Output("package-res.apk")
  2711. aapt2Flags := res.Args["flags"]
  2712. e := "-A " + buildDir + "/.intermediates/foo/android_common/NOTICE"
  2713. if !strings.Contains(aapt2Flags, e) {
  2714. t.Errorf("asset dir flag for NOTICE, %q is missing in aapt2 link flags, %q", e, aapt2Flags)
  2715. }
  2716. // bar has NOTICE files to process, but embed_notices is not set.
  2717. bar := ctx.ModuleForTests("bar", "android_common")
  2718. res = bar.Output("package-res.apk")
  2719. aapt2Flags = res.Args["flags"]
  2720. e = "-A " + buildDir + "/.intermediates/bar/android_common/NOTICE"
  2721. if strings.Contains(aapt2Flags, e) {
  2722. t.Errorf("bar shouldn't have the asset dir flag for NOTICE: %q", e)
  2723. }
  2724. // baz's embed_notice is true, but it doesn't have any NOTICE files.
  2725. baz := ctx.ModuleForTests("baz", "android_common")
  2726. res = baz.Output("package-res.apk")
  2727. aapt2Flags = res.Args["flags"]
  2728. e = "-A " + buildDir + "/.intermediates/baz/android_common/NOTICE"
  2729. if strings.Contains(aapt2Flags, e) {
  2730. t.Errorf("baz shouldn't have the asset dir flag for NOTICE: %q", e)
  2731. }
  2732. }
  2733. func TestUncompressDex(t *testing.T) {
  2734. testCases := []struct {
  2735. name string
  2736. bp string
  2737. uncompressedPlatform bool
  2738. uncompressedUnbundled bool
  2739. }{
  2740. {
  2741. name: "normal",
  2742. bp: `
  2743. android_app {
  2744. name: "foo",
  2745. srcs: ["a.java"],
  2746. sdk_version: "current",
  2747. }
  2748. `,
  2749. uncompressedPlatform: true,
  2750. uncompressedUnbundled: false,
  2751. },
  2752. {
  2753. name: "use_embedded_dex",
  2754. bp: `
  2755. android_app {
  2756. name: "foo",
  2757. use_embedded_dex: true,
  2758. srcs: ["a.java"],
  2759. sdk_version: "current",
  2760. }
  2761. `,
  2762. uncompressedPlatform: true,
  2763. uncompressedUnbundled: true,
  2764. },
  2765. {
  2766. name: "privileged",
  2767. bp: `
  2768. android_app {
  2769. name: "foo",
  2770. privileged: true,
  2771. srcs: ["a.java"],
  2772. sdk_version: "current",
  2773. }
  2774. `,
  2775. uncompressedPlatform: true,
  2776. uncompressedUnbundled: true,
  2777. },
  2778. {
  2779. name: "normal_uncompress_dex_true",
  2780. bp: `
  2781. android_app {
  2782. name: "foo",
  2783. srcs: ["a.java"],
  2784. sdk_version: "current",
  2785. uncompress_dex: true,
  2786. }
  2787. `,
  2788. uncompressedPlatform: true,
  2789. uncompressedUnbundled: true,
  2790. },
  2791. {
  2792. name: "normal_uncompress_dex_false",
  2793. bp: `
  2794. android_app {
  2795. name: "foo",
  2796. srcs: ["a.java"],
  2797. sdk_version: "current",
  2798. uncompress_dex: false,
  2799. }
  2800. `,
  2801. uncompressedPlatform: false,
  2802. uncompressedUnbundled: false,
  2803. },
  2804. }
  2805. test := func(t *testing.T, bp string, want bool, unbundled bool) {
  2806. t.Helper()
  2807. config := testAppConfig(nil, bp, nil)
  2808. if unbundled {
  2809. config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true)
  2810. config.TestProductVariables.Always_use_prebuilt_sdks = proptools.BoolPtr(true)
  2811. }
  2812. ctx := testContext()
  2813. run(t, ctx, config)
  2814. foo := ctx.ModuleForTests("foo", "android_common")
  2815. dex := foo.Rule("r8")
  2816. uncompressedInDexJar := strings.Contains(dex.Args["zipFlags"], "-L 0")
  2817. aligned := foo.MaybeRule("zipalign").Rule != nil
  2818. if uncompressedInDexJar != want {
  2819. t.Errorf("want uncompressed in dex %v, got %v", want, uncompressedInDexJar)
  2820. }
  2821. if aligned != want {
  2822. t.Errorf("want aligned %v, got %v", want, aligned)
  2823. }
  2824. }
  2825. for _, tt := range testCases {
  2826. t.Run(tt.name, func(t *testing.T) {
  2827. t.Run("platform", func(t *testing.T) {
  2828. test(t, tt.bp, tt.uncompressedPlatform, false)
  2829. })
  2830. t.Run("unbundled", func(t *testing.T) {
  2831. test(t, tt.bp, tt.uncompressedUnbundled, true)
  2832. })
  2833. })
  2834. }
  2835. }
  2836. func checkAapt2LinkFlag(t *testing.T, aapt2Flags, flagName, expectedValue string) {
  2837. if expectedValue != "" {
  2838. expectedFlag := "--" + flagName + " " + expectedValue
  2839. if !strings.Contains(aapt2Flags, expectedFlag) {
  2840. t.Errorf("%q is missing in aapt2 link flags, %q", expectedFlag, aapt2Flags)
  2841. }
  2842. } else {
  2843. unexpectedFlag := "--" + flagName
  2844. if strings.Contains(aapt2Flags, unexpectedFlag) {
  2845. t.Errorf("unexpected flag, %q is found in aapt2 link flags, %q", unexpectedFlag, aapt2Flags)
  2846. }
  2847. }
  2848. }
  2849. func TestRuntimeResourceOverlay(t *testing.T) {
  2850. fs := map[string][]byte{
  2851. "baz/res/res/values/strings.xml": nil,
  2852. "bar/res/res/values/strings.xml": nil,
  2853. }
  2854. bp := `
  2855. runtime_resource_overlay {
  2856. name: "foo",
  2857. certificate: "platform",
  2858. lineage: "lineage.bin",
  2859. product_specific: true,
  2860. static_libs: ["bar"],
  2861. resource_libs: ["baz"],
  2862. aaptflags: ["--keep-raw-values"],
  2863. }
  2864. runtime_resource_overlay {
  2865. name: "foo_themed",
  2866. certificate: "platform",
  2867. product_specific: true,
  2868. theme: "faza",
  2869. overrides: ["foo"],
  2870. }
  2871. android_library {
  2872. name: "bar",
  2873. resource_dirs: ["bar/res"],
  2874. }
  2875. android_app {
  2876. name: "baz",
  2877. sdk_version: "current",
  2878. resource_dirs: ["baz/res"],
  2879. }
  2880. `
  2881. config := testAppConfig(nil, bp, fs)
  2882. ctx := testContext()
  2883. run(t, ctx, config)
  2884. m := ctx.ModuleForTests("foo", "android_common")
  2885. // Check AAPT2 link flags.
  2886. aapt2Flags := m.Output("package-res.apk").Args["flags"]
  2887. expectedFlags := []string{"--keep-raw-values", "--no-resource-deduping", "--no-resource-removal"}
  2888. absentFlags := android.RemoveListFromList(expectedFlags, strings.Split(aapt2Flags, " "))
  2889. if len(absentFlags) > 0 {
  2890. t.Errorf("expected values, %q are missing in aapt2 link flags, %q", absentFlags, aapt2Flags)
  2891. }
  2892. // Check overlay.list output for static_libs dependency.
  2893. overlayList := m.Output("aapt2/overlay.list").Inputs.Strings()
  2894. staticLibPackage := buildDir + "/.intermediates/bar/android_common/package-res.apk"
  2895. if !inList(staticLibPackage, overlayList) {
  2896. t.Errorf("Stactic lib res package %q missing in overlay list: %q", staticLibPackage, overlayList)
  2897. }
  2898. // Check AAPT2 link flags for resource_libs dependency.
  2899. resourceLibFlag := "-I " + buildDir + "/.intermediates/baz/android_common/package-res.apk"
  2900. if !strings.Contains(aapt2Flags, resourceLibFlag) {
  2901. t.Errorf("Resource lib flag %q missing in aapt2 link flags: %q", resourceLibFlag, aapt2Flags)
  2902. }
  2903. // Check cert signing flag.
  2904. signedApk := m.Output("signed/foo.apk")
  2905. lineageFlag := signedApk.Args["flags"]
  2906. expectedLineageFlag := "--lineage lineage.bin"
  2907. if expectedLineageFlag != lineageFlag {
  2908. t.Errorf("Incorrect signing lineage flags, expected: %q, got: %q", expectedLineageFlag, lineageFlag)
  2909. }
  2910. signingFlag := signedApk.Args["certificates"]
  2911. expected := "build/make/target/product/security/platform.x509.pem build/make/target/product/security/platform.pk8"
  2912. if expected != signingFlag {
  2913. t.Errorf("Incorrect signing flags, expected: %q, got: %q", expected, signingFlag)
  2914. }
  2915. androidMkEntries := android.AndroidMkEntriesForTest(t, config, "", m.Module())[0]
  2916. path := androidMkEntries.EntryMap["LOCAL_CERTIFICATE"]
  2917. expectedPath := []string{"build/make/target/product/security/platform.x509.pem"}
  2918. if !reflect.DeepEqual(path, expectedPath) {
  2919. t.Errorf("Unexpected LOCAL_CERTIFICATE value: %v, expected: %v", path, expectedPath)
  2920. }
  2921. // Check device location.
  2922. path = androidMkEntries.EntryMap["LOCAL_MODULE_PATH"]
  2923. expectedPath = []string{"/tmp/target/product/test_device/product/overlay"}
  2924. if !reflect.DeepEqual(path, expectedPath) {
  2925. t.Errorf("Unexpected LOCAL_MODULE_PATH value: %v, expected: %v", path, expectedPath)
  2926. }
  2927. // A themed module has a different device location
  2928. m = ctx.ModuleForTests("foo_themed", "android_common")
  2929. androidMkEntries = android.AndroidMkEntriesForTest(t, config, "", m.Module())[0]
  2930. path = androidMkEntries.EntryMap["LOCAL_MODULE_PATH"]
  2931. expectedPath = []string{"/tmp/target/product/test_device/product/overlay/faza"}
  2932. if !reflect.DeepEqual(path, expectedPath) {
  2933. t.Errorf("Unexpected LOCAL_MODULE_PATH value: %v, expected: %v", path, expectedPath)
  2934. }
  2935. overrides := androidMkEntries.EntryMap["LOCAL_OVERRIDES_PACKAGES"]
  2936. expectedOverrides := []string{"foo"}
  2937. if !reflect.DeepEqual(overrides, expectedOverrides) {
  2938. t.Errorf("Unexpected LOCAL_OVERRIDES_PACKAGES value: %v, expected: %v", overrides, expectedOverrides)
  2939. }
  2940. }
  2941. func TestRuntimeResourceOverlay_JavaDefaults(t *testing.T) {
  2942. ctx, config := testJava(t, `
  2943. java_defaults {
  2944. name: "rro_defaults",
  2945. theme: "default_theme",
  2946. product_specific: true,
  2947. aaptflags: ["--keep-raw-values"],
  2948. }
  2949. runtime_resource_overlay {
  2950. name: "foo_with_defaults",
  2951. defaults: ["rro_defaults"],
  2952. }
  2953. runtime_resource_overlay {
  2954. name: "foo_barebones",
  2955. }
  2956. `)
  2957. //
  2958. // RRO module with defaults
  2959. //
  2960. m := ctx.ModuleForTests("foo_with_defaults", "android_common")
  2961. // Check AAPT2 link flags.
  2962. aapt2Flags := strings.Split(m.Output("package-res.apk").Args["flags"], " ")
  2963. expectedFlags := []string{"--keep-raw-values", "--no-resource-deduping", "--no-resource-removal"}
  2964. absentFlags := android.RemoveListFromList(expectedFlags, aapt2Flags)
  2965. if len(absentFlags) > 0 {
  2966. t.Errorf("expected values, %q are missing in aapt2 link flags, %q", absentFlags, aapt2Flags)
  2967. }
  2968. // Check device location.
  2969. path := android.AndroidMkEntriesForTest(t, config, "", m.Module())[0].EntryMap["LOCAL_MODULE_PATH"]
  2970. expectedPath := []string{"/tmp/target/product/test_device/product/overlay/default_theme"}
  2971. if !reflect.DeepEqual(path, expectedPath) {
  2972. t.Errorf("Unexpected LOCAL_MODULE_PATH value: %q, expected: %q", path, expectedPath)
  2973. }
  2974. //
  2975. // RRO module without defaults
  2976. //
  2977. m = ctx.ModuleForTests("foo_barebones", "android_common")
  2978. // Check AAPT2 link flags.
  2979. aapt2Flags = strings.Split(m.Output("package-res.apk").Args["flags"], " ")
  2980. unexpectedFlags := "--keep-raw-values"
  2981. if inList(unexpectedFlags, aapt2Flags) {
  2982. t.Errorf("unexpected value, %q is present in aapt2 link flags, %q", unexpectedFlags, aapt2Flags)
  2983. }
  2984. // Check device location.
  2985. path = android.AndroidMkEntriesForTest(t, config, "", m.Module())[0].EntryMap["LOCAL_MODULE_PATH"]
  2986. expectedPath = []string{"/tmp/target/product/test_device/system/overlay"}
  2987. if !reflect.DeepEqual(path, expectedPath) {
  2988. t.Errorf("Unexpected LOCAL_MODULE_PATH value: %v, expected: %v", path, expectedPath)
  2989. }
  2990. }
  2991. func TestOverrideRuntimeResourceOverlay(t *testing.T) {
  2992. ctx, _ := testJava(t, `
  2993. runtime_resource_overlay {
  2994. name: "foo_overlay",
  2995. certificate: "platform",
  2996. product_specific: true,
  2997. sdk_version: "current",
  2998. }
  2999. override_runtime_resource_overlay {
  3000. name: "bar_overlay",
  3001. base: "foo_overlay",
  3002. package_name: "com.android.bar.overlay",
  3003. target_package_name: "com.android.bar",
  3004. }
  3005. `)
  3006. expectedVariants := []struct {
  3007. moduleName string
  3008. variantName string
  3009. apkPath string
  3010. overrides []string
  3011. targetVariant string
  3012. packageFlag string
  3013. targetPackageFlag string
  3014. }{
  3015. {
  3016. variantName: "android_common",
  3017. apkPath: "/target/product/test_device/product/overlay/foo_overlay.apk",
  3018. overrides: nil,
  3019. targetVariant: "android_common",
  3020. packageFlag: "",
  3021. targetPackageFlag: "",
  3022. },
  3023. {
  3024. variantName: "android_common_bar_overlay",
  3025. apkPath: "/target/product/test_device/product/overlay/bar_overlay.apk",
  3026. overrides: []string{"foo_overlay"},
  3027. targetVariant: "android_common_bar",
  3028. packageFlag: "com.android.bar.overlay",
  3029. targetPackageFlag: "com.android.bar",
  3030. },
  3031. }
  3032. for _, expected := range expectedVariants {
  3033. variant := ctx.ModuleForTests("foo_overlay", expected.variantName)
  3034. // Check the final apk name
  3035. outputs := variant.AllOutputs()
  3036. expectedApkPath := buildDir + expected.apkPath
  3037. found := false
  3038. for _, o := range outputs {
  3039. if o == expectedApkPath {
  3040. found = true
  3041. break
  3042. }
  3043. }
  3044. if !found {
  3045. t.Errorf("Can't find %q in output files.\nAll outputs:%v", expectedApkPath, outputs)
  3046. }
  3047. // Check if the overrides field values are correctly aggregated.
  3048. mod := variant.Module().(*RuntimeResourceOverlay)
  3049. if !reflect.DeepEqual(expected.overrides, mod.properties.Overrides) {
  3050. t.Errorf("Incorrect overrides property value, expected: %q, got: %q",
  3051. expected.overrides, mod.properties.Overrides)
  3052. }
  3053. // Check aapt2 flags.
  3054. res := variant.Output("package-res.apk")
  3055. aapt2Flags := res.Args["flags"]
  3056. checkAapt2LinkFlag(t, aapt2Flags, "rename-manifest-package", expected.packageFlag)
  3057. checkAapt2LinkFlag(t, aapt2Flags, "rename-resources-package", "")
  3058. checkAapt2LinkFlag(t, aapt2Flags, "rename-overlay-target-package", expected.targetPackageFlag)
  3059. }
  3060. }