[SuperSize] Add DEX aggregate string symbols for {type, {method, field}, prototype}.

Previously "code strings", i.e., DEX strings used by
  class -> method -> code
were extracted into separate symbols (aliased among classes). This
omitted strings that were used as identifiers (or ShortyDescriptor) for
{type, method, field, prototype}. These strings were counted in
"** .dex (unattributed)" symbols.

This CL updates SuperSize to create "aggregate symbols" to attribute
bytes for the aforementioned strings. Specifically:
* Type strings for type_id_item[].descriptor_idx as "** .dex (type)".
* Method strings for method_id_item[].name_idx as "** .dex (method)".
* Field strings for field_id_item[].name_idx as "** .dex (field)".
* Prototype strings for proto_id_item[].shorty_idx as
  "** .dex (prototype)".

A string can fall into multiple categories. To address these:
* {Method, field} strings are put into the same aggregate symbol due to
  frequent overlap.
* To avoid double-counting, apply the following prioritization among
  DEX strings:
    code (separate symbols) > type > {method, field} > prototype,
  i.e., code strings are excluded from aggregate string symbols;
  type strings are excluded from {{method, field}, prototype} string
  aggregate symbols, etc.

Details: In apkanalyzer.py:
* _GenDexStringsUsedByClasses(): Also yield |string_idx|, which is used
  to exclude code string symbols are not counted in aggregate symbols.
* _StringSymbolsFromDexFile(): Add the 3 aggregate symbols, using new
  inner helper _AddAggregateStringSymbol().

Bug: 1408543
Change-Id: I38a351b72630705247723f5848d9b0b71de905c0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4183117
Commit-Queue: Samuel Huang <huangs@chromium.org>
Reviewed-by: Andrew Grieve <agrieve@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1095818}
4 files changed
tree: e10282d099e2b1f586ed50afb038fe1d11a11b00
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. codelabs/
  13. components/
  14. content/
  15. courgette/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia_web/
  22. gin/
  23. google_apis/
  24. google_update/
  25. gpu/
  26. headless/
  27. infra/
  28. ios/
  29. ipc/
  30. media/
  31. mojo/
  32. native_client_sdk/
  33. net/
  34. pdf/
  35. ppapi/
  36. printing/
  37. remoting/
  38. rlz/
  39. sandbox/
  40. services/
  41. skia/
  42. sql/
  43. storage/
  44. styleguide/
  45. testing/
  46. third_party/
  47. tools/
  48. ui/
  49. url/
  50. weblayer/
  51. .clang-format
  52. .clang-tidy
  53. .eslintrc.js
  54. .git-blame-ignore-revs
  55. .gitattributes
  56. .gitignore
  57. .gn
  58. .mailmap
  59. .rustfmt.toml
  60. .vpython3
  61. .yapfignore
  62. ATL_OWNERS
  63. AUTHORS
  64. BUILD.gn
  65. CODE_OF_CONDUCT.md
  66. codereview.settings
  67. DEPS
  68. DIR_METADATA
  69. LICENSE
  70. LICENSE.chromium_os
  71. OWNERS
  72. PRESUBMIT.py
  73. PRESUBMIT_test.py
  74. PRESUBMIT_test_mocks.py
  75. README.md
  76. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure .

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.

If you found a bug, please file it at https://crbug.com/new.