These scripts help generate the libcore TEST_MAPPING smoke tests, i.e. a set of tests to run on every change, chosen to run as many as possible in less than some time limit. The process is as follows. 1. Do `source build/envsetup.sh` and `lunch ` as normal. 2. Run the CtsLibcoreTestCases tests to generate logs to extract timings from. This can be done with `atest CtsLibcoreTestCases` as normal. Make sure to use an appropriate device (virtual or physical). 3. Do that two more times. We'll use best-of-three timings, since sometimes a test takes an unusual amount of time (perhaps because of GC pause or other jank) and it should not be excluded for that. 4. Run the save_logs.py script to copy the logs from out/ to libcore/smoketest. (Empty that directory if it exists already). This is interactive and allows you to pick the runs you want. (If you prefer, you can run this after each run, rather than once after all three runs.) 5. Run the gen_smoke_tests.py script to generate libcore/TEST_MAPPING. 6. Check stdout from the script looks okay (not too many warnings, sensible numbers, etc.). 7. Check the generated TEST_MAPPING looks okay. 8. Do e.g. `time atest --test-mapping libcore` to check it runs okay. 9. Delete libcore/smoketest/ once you're happy. 10. Submit the new TEST_MAPPING. The scripts take no options. There are some constants at the start you can adjust. (These could be converted to command-line options if convenient.) See comments in the scripts for more on how they work. At time of writing, with the current configuration, this generates a sensible number of classes to exclude, so the TEST_MAPPING looks reasonable. If this list becomes too long, we'll have to find a way to simplify it, by rolling up to a higher granularity. Given the way that atest et al are configured, that will probably mean excluding more things. TODO(peteg): What about PTS?