• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright (C) 2019 The Android Open Source Project
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
15// Build rules to build shim apexes.
16
17package {
18    default_applicable_licenses: ["Android-Apache-2.0"],
19}
20
21genrule {
22  name: "com.android.apex.cts.shim.pem",
23  out: ["com.android.apex.cts.shim.pem"],
24  cmd: "openssl genrsa -out $(out) 4096",
25}
26
27genrule {
28  name: "com.android.apex.cts.shim.pubkey",
29  srcs: [":com.android.apex.cts.shim.pem"],
30  out: ["com.android.apex.cts.shim.pubkey"],
31  tools: ["avbtool"],
32  cmd: "$(location avbtool) extract_public_key --key $(in) --output $(out)",
33}
34
35apex_key {
36  name: "com.android.apex.cts.shim.key",
37  private_key: ":com.android.apex.cts.shim.pem",
38  public_key: ":com.android.apex.cts.shim.pubkey",
39  installable: false,
40}
41
42genrule {
43  name: "com.android.apex.cts.shim.debug.pem",
44  out: ["com.android.apex.cts.shim.debug.pem"],
45  cmd: "openssl genrsa -out $(out) 4096",
46}
47
48genrule {
49  name: "com.android.apex.cts.shim.debug.pubkey",
50  srcs: [":com.android.apex.cts.shim.debug.pem"],
51  out: ["com.android.apex.cts.shim.debug.pubkey"],
52  tools: ["avbtool"],
53  cmd: "$(location avbtool) extract_public_key --key $(in) --output $(out)",
54}
55
56apex_key {
57  name: "com.android.apex.cts.shim.debug.key",
58  private_key: ":com.android.apex.cts.shim.debug.pem",
59  public_key: ":com.android.apex.cts.shim.debug.pubkey",
60  installable: false,
61}
62
63genrule {
64  name: "generate_hash_of_dev_null",
65  out: ["hash.txt"],
66  cmd: "sha512sum -b /dev/null | cut -d' ' -f1 | tee $(out)",
67}
68
69prebuilt_etc {
70  name: "hash_of_dev_null",
71  src: ":generate_hash_of_dev_null",
72  filename: "hash.txt",
73  installable: false,
74}
75
76apex {
77  name: "com.android.apex.cts.shim.v3",
78  manifest: "manifest_v3.json",
79  androidManifest: "AndroidManifest.xml",
80  file_contexts: ":apex.test-file_contexts",
81  key: "com.android.apex.cts.shim.key",
82  prebuilts: ["hash_of_dev_null"],
83  apps: ["CtsShim", "CtsShimPriv"],
84  installable: false,
85  allowed_files: "default_shim_allowed_list.txt",
86  updatable: false,
87}
88
89apex {
90  name: "com.android.apex.cts.shim.v2",
91  manifest: "manifest_v2.json",
92  androidManifest: "AndroidManifest.xml",
93  file_contexts: ":apex.test-file_contexts",
94  key: "com.android.apex.cts.shim.key",
95  prebuilts: ["hash_of_dev_null"],
96  apps: ["CtsShim", "CtsShimPriv"],
97  installable: false,
98  allowed_files: "default_shim_allowed_list.txt",
99  updatable: false,
100}
101
102apex {
103  name: "com.android.apex.cts.shim.v2_sign_payload_with_different_key",
104  // Use manifest_v2_rebootless to also re-use this APEX in the rebootless update test case.
105  manifest: "manifest_v2_rebootless.json",
106  androidManifest: "AndroidManifest.xml",
107  file_contexts: ":apex.test-file_contexts",
108  key: "com.android.apex.cts.shim.debug.key",
109  prebuilts: ["hash_of_dev_null"],
110  installable: false,
111  allowed_files: "default_shim_allowed_list.txt",
112  updatable: false,
113}
114
115apex {
116  name: "com.android.apex.cts.shim.v2_without_apk_in_apex",
117  manifest: "manifest_v2.json",
118  androidManifest: "AndroidManifest.xml",
119  file_contexts: ":apex.test-file_contexts",
120  key: "com.android.apex.cts.shim.key",
121  prebuilts: ["hash_of_dev_null"],
122  installable: false,
123  allowed_files: "default_shim_allowed_list.txt",
124  updatable: false,
125}
126
127apex {
128  name: "com.android.apex.cts.shim.v2_no_hashtree",
129  manifest: "manifest_v2.json",
130  androidManifest: "AndroidManifest.xml",
131  file_contexts: ":apex.test-file_contexts",
132  key: "com.android.apex.cts.shim.key",
133  prebuilts: ["hash_of_dev_null"],
134  apps: ["CtsShim", "CtsShimPriv"],
135  installable: false,
136  allowed_files: "default_shim_allowed_list.txt",
137  generate_hashtree: false,
138  updatable: false,
139}
140
141apex {
142  name: "com.android.apex.cts.shim.v2_unsigned_payload",
143  // Use manifest_v2_rebootless to also re-use this APEX in the rebootless update test case.
144  manifest: "manifest_v2_rebootless.json",
145  androidManifest: "AndroidManifest.xml",
146  file_contexts: ":apex.test-file_contexts",
147  key: "com.android.apex.cts.shim.key",
148  prebuilts: ["hash_of_dev_null"],
149  apps: ["CtsShim", "CtsShimPriv"],
150  installable: false,
151  allowed_files: "default_shim_allowed_list.txt",
152  test_only_unsigned_payload: true,
153  updatable: false,
154}
155
156override_apex {
157    name: "com.android.apex.cts.shim.v2_different_package_name",
158    package_name: "com.android.apex.cts.shim.different",
159    // Use rebootless APEX to re-use this APEX in the rebootless update test case.
160    base: "com.android.apex.cts.shim.v2_rebootless",
161}
162
163genrule {
164  name: "generate_empty_hash",
165  out: ["hash.txt"],
166  cmd: "touch $(out)",
167}
168
169prebuilt_etc {
170  name: "empty_hash",
171  src: ":generate_empty_hash",
172  filename: "hash.txt",
173  installable: false,
174}
175
176// Use empty hash.txt to make sure that this apex has wrong SHA512, hence trying
177// to stage it should fail.
178apex {
179  name: "com.android.apex.cts.shim.v2_wrong_sha",
180  // Use manifest_v2_rebootless to also re-use this APEX in the rebootless update test case.
181  manifest: "manifest_v2_rebootless.json",
182  androidManifest: "AndroidManifest.xml",
183  file_contexts: ":apex.test-file_contexts",
184  key: "com.android.apex.cts.shim.key",
185  prebuilts: ["empty_hash"],
186  installable: false,
187  updatable: false,
188}
189
190prebuilt_etc {
191  name: "apex_shim_additional_file",
192  src: "additional_file",
193  filename: "additional_file",
194  installable: false,
195}
196
197apex {
198  name: "com.android.apex.cts.shim.v2_additional_file",
199  // Use manifest_v2_rebootless to also re-use this APEX in the rebootless update test case.
200  manifest: "manifest_v2_rebootless.json",
201  androidManifest: "AndroidManifest.xml",
202  file_contexts: ":apex.test-file_contexts",
203  key: "com.android.apex.cts.shim.key",
204  prebuilts: ["hash_of_dev_null", "apex_shim_additional_file"],
205  installable: false,
206  updatable: false,
207}
208
209prebuilt_etc {
210  name: "apex_shim_additional_folder",
211  src: "additional_file",
212  filename: "additional_file",
213  sub_dir: "additional_folder",
214  installable: false,
215}
216
217apex {
218  name: "com.android.apex.cts.shim.v2_additional_folder",
219  // Use manifest_v2_rebootless to also re-use this APEX in the rebootless update test case.
220  manifest: "manifest_v2_rebootless.json",
221  androidManifest: "AndroidManifest.xml",
222  file_contexts: ":apex.test-file_contexts",
223  key: "com.android.apex.cts.shim.key",
224  prebuilts: ["hash_of_dev_null", "apex_shim_additional_folder"],
225  installable: false,
226  updatable: false,
227}
228
229apex {
230  name: "com.android.apex.cts.shim.v2_with_pre_install_hook",
231  manifest: "manifest_v2_with_pre_install_hook.json",
232  androidManifest: "AndroidManifest.xml",
233  file_contexts: ":apex.test-file_contexts",
234  key: "com.android.apex.cts.shim.key",
235  prebuilts: ["hash_of_dev_null"],
236  installable: false,
237  updatable: false,
238}
239
240apex {
241  name: "com.android.apex.cts.shim.v2_with_post_install_hook",
242  manifest: "manifest_v2_with_post_install_hook.json",
243  androidManifest: "AndroidManifest.xml",
244  file_contexts: ":apex.test-file_contexts",
245  key: "com.android.apex.cts.shim.key",
246  prebuilts: ["hash_of_dev_null"],
247  installable: false,
248  updatable: false,
249}
250
251genrule {
252  name: "generate_hash_v1",
253  srcs: [
254    ":com.android.apex.cts.shim.v2",
255    ":com.android.apex.cts.shim.v2_without_apk_in_apex",
256    ":com.android.apex.cts.shim.v2_additional_file",
257    ":com.android.apex.cts.shim.v2_additional_folder",
258    ":com.android.apex.cts.shim.v2_different_certificate",
259    ":com.android.apex.cts.shim.v2_different_package_name",
260    ":com.android.apex.cts.shim.v2_no_hashtree",
261    ":com.android.apex.cts.shim.v2_signed_bob",
262    ":com.android.apex.cts.shim.v2_signed_bob_rot",
263    ":com.android.apex.cts.shim.v2_signed_bob_rot_rollback",
264    ":com.android.apex.cts.shim.v2_with_pre_install_hook",
265    ":com.android.apex.cts.shim.v2_with_post_install_hook",
266    ":com.android.apex.cts.shim.v2_sdk_target_p",
267    ":com.android.apex.cts.shim.v2_apk_in_apex_sdk_target_p",
268    ":com.android.apex.cts.shim.v2_rebootless",
269    ":com.android.apex.cts.shim.v3",
270    ":com.android.apex.cts.shim.v3_rebootless",
271    ":com.android.apex.cts.shim.v3_signed_bob",
272    ":com.android.apex.cts.shim.v3_signed_bob_rot",
273  ],
274  out: ["hash.txt"],
275  cmd: "sha512sum -b $(in) | cut -d' ' -f1 | tee $(out)",
276}
277
278prebuilt_etc {
279  name: "hash_v1",
280  src: ":generate_hash_v1",
281  filename: "hash.txt",
282  installable: false,
283}
284
285apex {
286  name: "com.android.apex.cts.shim.v1",
287  manifest: "manifest.json",
288  androidManifest: "AndroidManifest.xml",
289  file_contexts: ":apex.test-file_contexts",
290  key: "com.android.apex.cts.shim.key",
291  prebuilts: ["hash_v1"],
292  apps: ["CtsShim", "CtsShimPriv"],
293  allowed_files: "default_shim_allowed_list.txt",
294  updatable: false,
295}
296
297// This is to install the flattened version of com.android.apex.cts.shim.
298// Because com.android.apex.cts.shim is provided as prebuilt and the build system
299// doesn't support install "flattened" version from "prebult" yet, GSI, which should
300// have both "flatttened" and "unflattened" APEXes, is missing the flattened version
301// of com.android.apex.cts.shim.
302// TODO(b/159426728):  When the build system can install "flattened" from "prebuilts",
303// this can be removed.
304override_apex {
305  name: "com.android.apex.cts.shim.v1_with_prebuilts",
306  base: "com.android.apex.cts.shim.v1",
307  apps: ["CtsShimPrebuilt", "CtsShimPrivPrebuilt"],
308  allowed_files: "prebuilts_shim_allowed_list.txt",
309}
310
311genrule {
312  name: "com.android.apex.cts.shim_not_pre_installed.pem",
313  out: ["com.android.apex.cts.shim_not_pre_installed.pem"],
314  cmd: "openssl genrsa -out $(out) 4096",
315}
316
317genrule {
318  name: "com.android.apex.cts.shim_not_pre_installed.pubkey",
319  srcs: [":com.android.apex.cts.shim_not_pre_installed.pem"],
320  out: ["com.android.apex.cts.shim_not_pre_installed.pubkey"],
321  tools: ["avbtool"],
322  cmd: "$(location avbtool) extract_public_key --key $(in) --output $(out)",
323}
324
325apex_key {
326  name: "com.android.apex.cts.shim_not_pre_installed.key",
327  private_key: ":com.android.apex.cts.shim_not_pre_installed.pem",
328  public_key: ":com.android.apex.cts.shim_not_pre_installed.pubkey",
329  installable: false,
330}
331
332apex {
333  name: "com.android.apex.cts.shim_not_pre_installed",
334  manifest: "manifest_not_pre_installed.json",
335  androidManifest: "AndroidManifestNotPreInstalled.xml",
336  file_contexts: ":apex.test-file_contexts",
337  key: "com.android.apex.cts.shim_not_pre_installed.key",
338  prebuilts: ["hash_of_dev_null"],
339  installable: false,
340  updatable: false,
341}
342
343apex {
344  name: "com.android.apex.cts.shim.v2_different_certificate",
345  // Use manifest_v2_rebootless to also re-use this APEX in the rebootless update test case.
346  manifest: "manifest_v2_rebootless.json",
347  androidManifest: "AndroidManifest.xml",
348  file_contexts: ":apex.test-file_contexts",
349  key: "com.android.apex.cts.shim.key",
350  prebuilts: ["hash_of_dev_null"],
351  installable: false,
352  certificate: ":com.android.apex.cts.shim.debug.cert",
353  updatable: false,
354}
355
356android_app_certificate {
357  name: "com.android.apex.cts.shim.debug.cert",
358  certificate: "com.android.apex.cts.shim.debug.cert",
359}
360
361// Build rules to build shim apex with rotated keys
362
363// We name the original key used to sign cts.shim.v1 package as alice.
364// We then create a second key called bob. The second key bob is used to rotate the
365// original key alice.
366
367// Create private key bob in pem format
368genrule {
369  name: "com.android.apex.rotation.key.bob.pem",
370  out: ["bob.pem"],
371  cmd: "openssl req -x509 -newkey rsa:4096 -nodes -days 999999 -subj '/DN=/EMAILADDRESS=android@android.com/CN=Android/OU=Android/O=Android/L=Mountain View/ST=California/C=US' -keyout $(out)",
372}
373
374// Converts bob's private key to pk8 format
375genrule {
376  name: "com.android.apex.rotation.key.bob.pk8",
377  srcs: [":com.android.apex.rotation.key.bob.pem"],
378  out: ["bob.pk8"],
379  cmd: "openssl pkcs8 -topk8 -inform PEM -outform DER -in $(in) -out $(out) -nocrypt",
380}
381
382// Extract bob's public key from its private key
383genrule {
384    name: "com.android.apex.rotation.key.bob.x509.pem",
385    srcs: [":com.android.apex.rotation.key.bob.pem"],
386    out: ["bob.x509.pem"],
387    cmd: "openssl req -x509 -key $(in) -newkey rsa:4096 -nodes -days 999999 -subj '/DN=/EMAILADDRESS=android@android.com/CN=Android/OU=Android/O=Android/L=Mountain View/ST=California/C=US' -out $(out)",
388}
389
390// Create lineage file for rotating alice to bob
391genrule {
392  name: "com.android.apex.rotation.key.bob.rot",
393  srcs: [
394    "alice.pk8",
395    "alice.x509.pem",
396    ":com.android.apex.rotation.key.bob.pk8",
397    ":com.android.apex.rotation.key.bob.x509.pem",
398  ],
399  out: ["bob.rot"],
400  tools: [":apksigner"],
401  cmd: "$(location :apksigner) rotate --out $(out) --old-signer --key $(location alice.pk8) --cert $(location alice.x509.pem) --new-signer --key $(location :com.android.apex.rotation.key.bob.pk8) --cert $(location :com.android.apex.rotation.key.bob.x509.pem)",
402}
403
404// Create lineage file for rotating alice to bob with rollback capability
405genrule {
406  name: "com.android.apex.rotation.key.bob.rot.rollback",
407  srcs: [
408    "alice.pk8",
409    "alice.x509.pem",
410    ":com.android.apex.rotation.key.bob.pk8",
411    ":com.android.apex.rotation.key.bob.x509.pem",
412  ],
413  out: ["bob.rot"],
414  tools: [":apksigner"],
415  cmd: "$(location :apksigner) rotate --out $(out) --old-signer --key $(location alice.pk8) --cert $(location alice.x509.pem) --set-rollback true --new-signer --key $(location :com.android.apex.rotation.key.bob.pk8) --cert $(location :com.android.apex.rotation.key.bob.x509.pem)",
416}
417
418// v2 cts shim package signed by bob, without lineage
419genrule {
420  name: "com.android.apex.cts.shim.v2_signed_bob",
421  out: ["com.android.apex.cts.shim.v2_signed_bob"],
422  tools: [":apksigner"],
423  srcs: [
424    ":com.android.apex.cts.shim.v2",
425    ":com.android.apex.rotation.key.bob.x509.pem",
426    ":com.android.apex.rotation.key.bob.pk8",
427  ],
428  dist: {
429    targets: ["com.android.apex.cts.shim.v2_signed_bob"],
430    dest: "com.android.apex.cts.shim.v2_signed_bob.apex",
431  },
432  cmd: "$(location :apksigner) sign --v1-signing-enabled false --v2-signing-enabled false --key $(location :com.android.apex.rotation.key.bob.pk8) --cert $(location :com.android.apex.rotation.key.bob.x509.pem) --out $(out) $(location :com.android.apex.cts.shim.v2)",
433}
434
435// v2 cts shim package signed by bob + lineage
436genrule {
437  name: "com.android.apex.cts.shim.v2_signed_bob_rot",
438  out: ["com.android.apex.cts.shim.v2_signed_bob_rot"],
439  tools: [":apksigner"],
440  srcs: [
441    ":com.android.apex.cts.shim.v2",
442    ":com.android.apex.rotation.key.bob.x509.pem",
443    ":com.android.apex.rotation.key.bob.pk8",
444    ":com.android.apex.rotation.key.bob.rot",
445  ],
446  dist: {
447    targets: ["com.android.apex.cts.shim.v2_signed_bob_rot"],
448    dest: "com.android.apex.cts.shim.v2_signed_bob_rot.apex",
449  },
450  cmd: "$(location :apksigner) sign --v1-signing-enabled false --v2-signing-enabled false --key $(location :com.android.apex.rotation.key.bob.pk8) --cert $(location :com.android.apex.rotation.key.bob.x509.pem) --lineage $(location :com.android.apex.rotation.key.bob.rot) --out $(out) $(location :com.android.apex.cts.shim.v2)",
451}
452
453// v2 cts shim package signed by bob + lineage + rollback capability
454genrule {
455  name: "com.android.apex.cts.shim.v2_signed_bob_rot_rollback",
456  out: ["com.android.apex.cts.shim.v2_signed_bob_rot_rollback"],
457  tools: [":apksigner"],
458  srcs: [
459    ":com.android.apex.cts.shim.v2",
460    ":com.android.apex.rotation.key.bob.x509.pem",
461    ":com.android.apex.rotation.key.bob.pk8",
462    ":com.android.apex.rotation.key.bob.rot.rollback",
463  ],
464  dist: {
465    targets: ["com.android.apex.cts.shim.v2_signed_bob_rot_rollback"],
466    dest: "com.android.apex.cts.shim.v2_signed_bob_rot_rollback.apex",
467  },
468  cmd: "$(location :apksigner) sign --v1-signing-enabled false --v2-signing-enabled false --key $(location :com.android.apex.rotation.key.bob.pk8) --cert $(location :com.android.apex.rotation.key.bob.x509.pem) --lineage $(location :com.android.apex.rotation.key.bob.rot.rollback) --out $(out) $(location :com.android.apex.cts.shim.v2)",
469}
470
471// v3 cts shim package signed by bob
472genrule {
473  name: "com.android.apex.cts.shim.v3_signed_bob",
474  out: ["com.android.apex.cts.shim.v3_signed_bob"],
475  tools: [":apksigner"],
476  srcs: [
477    ":com.android.apex.cts.shim.v3",
478    ":com.android.apex.rotation.key.bob.x509.pem",
479    ":com.android.apex.rotation.key.bob.pk8",
480  ],
481  dist: {
482    targets: ["com.android.apex.cts.shim.v3_signed_bob"],
483    dest: "com.android.apex.cts.shim.v3_signed_bob.apex",
484  },
485  cmd: "$(location :apksigner) sign --v1-signing-enabled false --v2-signing-enabled false --key $(location :com.android.apex.rotation.key.bob.pk8) --cert $(location :com.android.apex.rotation.key.bob.x509.pem) --out $(out) $(location :com.android.apex.cts.shim.v3)",
486}
487
488// v3 cts shim package signed by bob + lineage
489genrule {
490  name: "com.android.apex.cts.shim.v3_signed_bob_rot",
491  out: ["com.android.apex.cts.shim.v3_signed_bob_rot"],
492  tools: [":apksigner"],
493  srcs: [
494    ":com.android.apex.cts.shim.v3",
495    ":com.android.apex.rotation.key.bob.x509.pem",
496    ":com.android.apex.rotation.key.bob.pk8",
497    ":com.android.apex.rotation.key.bob.rot",
498  ],
499  dist: {
500    targets: ["com.android.apex.cts.shim.v3_signed_bob_rot"],
501    dest: "com.android.apex.cts.shim.v3_signed_bob_rot.apex",
502  },
503  cmd: "$(location :apksigner) sign --v1-signing-enabled false --v2-signing-enabled false --key $(location :com.android.apex.rotation.key.bob.pk8) --cert $(location :com.android.apex.rotation.key.bob.x509.pem) --lineage $(location :com.android.apex.rotation.key.bob.rot) --out $(out) $(location :com.android.apex.cts.shim.v3)",
504}
505
506// This one is only used in ApexdHostTest and not meant to be installed
507// and hence shouldn't be allowed in hash.txt of v1 shim APEX.
508apex {
509  name: "com.android.apex.cts.shim.v2_legacy",
510  manifest: "manifest_v2.json",
511  androidManifest: "AndroidManifest.xml",
512  file_contexts: ":apex.test-file_contexts",
513  key: "com.android.apex.cts.shim.key",
514  prebuilts: ["hash_of_dev_null"],
515  apps: ["CtsShim", "CtsShimPriv"],
516  installable: false,
517  min_sdk_version: "29",
518  updatable: false,
519}
520
521genrule {
522  name: "com.android.apex.cts.shim.v2_no_pb",
523  srcs: [":com.android.apex.cts.shim.v2_legacy"],
524  out: ["com.android.apex.cts.shim.v2_no_pb.apex"],
525  tools: ["zip2zip"],
526  cmd: "$(location zip2zip) -i $(in) -x apex_manifest.pb -o $(out)",
527}
528
529// Apex shim that targets an old sdk (P)
530apex {
531  name: "com.android.apex.cts.shim.v2_sdk_target_p",
532  // Use manifest_v2_rebootless to also re-use this APEX in the rebootless update test case.
533  manifest: "manifest_v2_rebootless.json",
534  androidManifest: "AndroidManifestSdkTargetP.xml",
535  file_contexts: ":apex.test-file_contexts",
536  key: "com.android.apex.cts.shim.key",
537  prebuilts: ["hash_of_dev_null"],
538  installable: false,
539  apps: ["CtsShim", "CtsShimPriv"],
540  updatable: false,
541}
542
543// Apex shim with apk-in-apex that targets sdk P
544apex {
545  name: "com.android.apex.cts.shim.v2_apk_in_apex_sdk_target_p",
546  manifest: "manifest_v2.json",
547  androidManifest: "AndroidManifest.xml",
548  file_contexts: ":apex.test-file_contexts",
549  key: "com.android.apex.cts.shim.key",
550  prebuilts: ["hash_of_dev_null"],
551  apps: ["CtsShimTargetPSdk"],
552  installable: false,
553  updatable: false,
554}
555
556// Apex shim with unsigned apk
557genrule {
558  name: "com.android.apex.cts.shim.v2_unsigned_apk_container",
559  // Use shim.v2_rebootless to re-use same APEX in the rebootless update test case.
560  srcs: [":com.android.apex.cts.shim.v2_rebootless"],
561  out: ["com.android.apex.cts.shim.v2_unsigned_apk_container.apex"],
562  cmd: "cp -v $(in) $(out) && zip -d $(out) META-INF*",
563}
564
565// Apex shim for testing rebootless updates
566apex {
567  name: "com.android.apex.cts.shim.v2_rebootless",
568  manifest: "manifest_v2_rebootless.json",
569  file_contexts: ":apex.test-file_contexts",
570  key: "com.android.apex.cts.shim.key",
571  prebuilts: ["hash_of_dev_null"],
572  installable: false,
573  updatable: false,
574}
575
576apex {
577  name: "com.android.apex.cts.shim.v3_rebootless",
578  manifest: "manifest_v3_rebootless.json",
579  file_contexts: ":apex.test-file_contexts",
580  key: "com.android.apex.cts.shim.key",
581  prebuilts: ["hash_of_dev_null"],
582  installable: false,
583  updatable: false,
584}
585