xref: /aosp_15_r20/development/vndk/tools/header-checker/README.md (revision 90c8c64db3049935a07c6143d7fd006e26f8ecca)
1*90c8c64dSAndroid Build Coastguard WorkerHeader ABI Checker
2*90c8c64dSAndroid Build Coastguard Worker===================
3*90c8c64dSAndroid Build Coastguard Worker
4*90c8c64dSAndroid Build Coastguard WorkerThe header ABI checker consists of 3 tools:
5*90c8c64dSAndroid Build Coastguard Worker[header-abi-dumper](#Header-ABI-Dumper),
6*90c8c64dSAndroid Build Coastguard Worker[header-abi-linker](#Header-ABI-Linker), and
7*90c8c64dSAndroid Build Coastguard Worker[header-abi-diff](#Header-ABI-Diff).  The first two commands generate ABI dumps
8*90c8c64dSAndroid Build Coastguard Workerfor shared libraries.  The third command compares the ABI dumps with the
9*90c8c64dSAndroid Build Coastguard Workerprebuilt reference ABI dumps.
10*90c8c64dSAndroid Build Coastguard Worker
11*90c8c64dSAndroid Build Coastguard Worker## Header ABI Dumper
12*90c8c64dSAndroid Build Coastguard Worker
13*90c8c64dSAndroid Build Coastguard Worker`header-abi-dumper` dumps the ABIs (including classes, functions, variables,
14*90c8c64dSAndroid Build Coastguard Workeretc) defined in a C/C++ source file.
15*90c8c64dSAndroid Build Coastguard Worker
16*90c8c64dSAndroid Build Coastguard WorkerThe `-I` command line option controls the scope of ABIs that must be dumped.
17*90c8c64dSAndroid Build Coastguard WorkerIf `-I <path-to-export-include-dir>` is specified, the generated ABI dump will
18*90c8c64dSAndroid Build Coastguard Workeronly include the classes, the functions, and the variables that are defined in
19*90c8c64dSAndroid Build Coastguard Workerthe header files under the exported include directories.
20*90c8c64dSAndroid Build Coastguard Worker
21*90c8c64dSAndroid Build Coastguard Worker### Usage
22*90c8c64dSAndroid Build Coastguard Worker
23*90c8c64dSAndroid Build Coastguard Worker```
24*90c8c64dSAndroid Build Coastguard Workerheader-abi-dumper -o <dump-file> <source_file> \
25*90c8c64dSAndroid Build Coastguard Worker    -I <export-include-dir-1> \
26*90c8c64dSAndroid Build Coastguard Worker    -I <export-include-dir-2> \
27*90c8c64dSAndroid Build Coastguard Worker    ... \
28*90c8c64dSAndroid Build Coastguard Worker    -- \
29*90c8c64dSAndroid Build Coastguard Worker    <cflags>
30*90c8c64dSAndroid Build Coastguard Worker```
31*90c8c64dSAndroid Build Coastguard Worker
32*90c8c64dSAndroid Build Coastguard WorkerFor more command line options, run `header-abi-dumper --help`.
33*90c8c64dSAndroid Build Coastguard Worker
34*90c8c64dSAndroid Build Coastguard Worker
35*90c8c64dSAndroid Build Coastguard Worker## Header ABI Linker
36*90c8c64dSAndroid Build Coastguard Worker
37*90c8c64dSAndroid Build Coastguard Worker`header-abi-linker` links several ABI dumps produced by `header-abi-dumper`.
38*90c8c64dSAndroid Build Coastguard WorkerThis tool combines all the ABI information present in the input ABI dump files
39*90c8c64dSAndroid Build Coastguard Workerand prunes the irrelevant ABI dumps.
40*90c8c64dSAndroid Build Coastguard Worker
41*90c8c64dSAndroid Build Coastguard Worker### Usage
42*90c8c64dSAndroid Build Coastguard Worker
43*90c8c64dSAndroid Build Coastguard Worker```
44*90c8c64dSAndroid Build Coastguard Workerheader-abi-linker -o <linked-abi-dump> \
45*90c8c64dSAndroid Build Coastguard Worker    <abi-dump1> <abi-dump2> <abi-dump3> ... \
46*90c8c64dSAndroid Build Coastguard Worker    -so <path to so file> \
47*90c8c64dSAndroid Build Coastguard Worker    -v <path to version script>
48*90c8c64dSAndroid Build Coastguard Worker```
49*90c8c64dSAndroid Build Coastguard Worker
50*90c8c64dSAndroid Build Coastguard WorkerFor more command line options, run `header-abi-linker --help`.
51*90c8c64dSAndroid Build Coastguard Worker
52*90c8c64dSAndroid Build Coastguard Worker
53*90c8c64dSAndroid Build Coastguard Worker## Header ABI Diff
54*90c8c64dSAndroid Build Coastguard Worker
55*90c8c64dSAndroid Build Coastguard Worker`header-abi-diff` compares two header ABI dumps produced by
56*90c8c64dSAndroid Build Coastguard Worker`header-abi-dumper`.  It produces a report outlining all the differences
57*90c8c64dSAndroid Build Coastguard Workerbetween the ABIs exposed by the two dumps.
58*90c8c64dSAndroid Build Coastguard Worker
59*90c8c64dSAndroid Build Coastguard Worker### Usage
60*90c8c64dSAndroid Build Coastguard Worker
61*90c8c64dSAndroid Build Coastguard Worker```
62*90c8c64dSAndroid Build Coastguard Workerheader-abi-diff -old <old-abi-dump> -new <new-abi-dump> -o <report>
63*90c8c64dSAndroid Build Coastguard Worker```
64*90c8c64dSAndroid Build Coastguard Worker
65*90c8c64dSAndroid Build Coastguard WorkerFor more command line options, run `header-abi-diff --help`.
66*90c8c64dSAndroid Build Coastguard Worker
67*90c8c64dSAndroid Build Coastguard Worker### Return Value
68*90c8c64dSAndroid Build Coastguard Worker
69*90c8c64dSAndroid Build Coastguard Worker* `0`: Compatible
70*90c8c64dSAndroid Build Coastguard Worker* `1`: Changes to APIs unreferenced by symbols in the `.dynsym` table
71*90c8c64dSAndroid Build Coastguard Worker* `4`: Compatible extension
72*90c8c64dSAndroid Build Coastguard Worker* `8`: Incompatible
73*90c8c64dSAndroid Build Coastguard Worker* `16`: ELF incompatible (Some symbols in the `.dynsym` table, not exported by
74*90c8c64dSAndroid Build Coastguard Worker  public headers, were removed.)
75*90c8c64dSAndroid Build Coastguard Worker
76*90c8c64dSAndroid Build Coastguard Worker### Configuration
77*90c8c64dSAndroid Build Coastguard Workerheader-abi-diff reads a config file named `config.json`. The config file must
78*90c8c64dSAndroid Build Coastguard Workerbe placed in the dump directory, such as
79*90c8c64dSAndroid Build Coastguard Worker`prebuilts/abi-dumps/platform/33/64/x86_64/source-based/config.json`.
80*90c8c64dSAndroid Build Coastguard WorkerThe file consists of multiple sections. There are two types of sections: global
81*90c8c64dSAndroid Build Coastguard Workerconfig section and library config section. Each library config section contains
82*90c8c64dSAndroid Build Coastguard Workerflags for a specific version and a library. header-abi-diff chooses the library
83*90c8c64dSAndroid Build Coastguard Workerconfig section by command line options `-target-version` and `-lib`.
84*90c8c64dSAndroid Build Coastguard Worker
85*90c8c64dSAndroid Build Coastguard Worker#### Format
86*90c8c64dSAndroid Build Coastguard WorkerHere is an example of a config.json.
87*90c8c64dSAndroid Build Coastguard Worker```json
88*90c8c64dSAndroid Build Coastguard Worker{
89*90c8c64dSAndroid Build Coastguard Worker  "global": {
90*90c8c64dSAndroid Build Coastguard Worker    "flags": {
91*90c8c64dSAndroid Build Coastguard Worker      "allow_adding_removing_weak_symbols": true,
92*90c8c64dSAndroid Build Coastguard Worker    },
93*90c8c64dSAndroid Build Coastguard Worker  },
94*90c8c64dSAndroid Build Coastguard Worker  "libfoo": [
95*90c8c64dSAndroid Build Coastguard Worker    {
96*90c8c64dSAndroid Build Coastguard Worker      "target_version": "current",
97*90c8c64dSAndroid Build Coastguard Worker      "flags": {
98*90c8c64dSAndroid Build Coastguard Worker        "check_all_apis": true,
99*90c8c64dSAndroid Build Coastguard Worker      },
100*90c8c64dSAndroid Build Coastguard Worker    },
101*90c8c64dSAndroid Build Coastguard Worker    {
102*90c8c64dSAndroid Build Coastguard Worker      "target_version": "34",
103*90c8c64dSAndroid Build Coastguard Worker      "ignore_linker_set_keys": [
104*90c8c64dSAndroid Build Coastguard Worker        "_ZTI14internal_state",
105*90c8c64dSAndroid Build Coastguard Worker      ],
106*90c8c64dSAndroid Build Coastguard Worker      "flags": {
107*90c8c64dSAndroid Build Coastguard Worker        "allow_extensions": true,
108*90c8c64dSAndroid Build Coastguard Worker      }
109*90c8c64dSAndroid Build Coastguard Worker    }
110*90c8c64dSAndroid Build Coastguard Worker  ]
111*90c8c64dSAndroid Build Coastguard Worker}
112*90c8c64dSAndroid Build Coastguard Worker```
113*90c8c64dSAndroid Build Coastguard Worker
114*90c8c64dSAndroid Build Coastguard Worker#### Library Config Section
115*90c8c64dSAndroid Build Coastguard WorkerA library config section includes members: "target_version",
116*90c8c64dSAndroid Build Coastguard Worker"ignore_linker_set_keys" and "flags". header-abi-diff selects the config
117*90c8c64dSAndroid Build Coastguard Workersection that matches the target version given by CLI.
118*90c8c64dSAndroid Build Coastguard WorkerTake above config as an example, if `-target-version 34` and `-lib libfoo` are
119*90c8c64dSAndroid Build Coastguard Workerspecified, the selected config section is:
120*90c8c64dSAndroid Build Coastguard Worker```json
121*90c8c64dSAndroid Build Coastguard Worker{
122*90c8c64dSAndroid Build Coastguard Worker  "target_version": "34",
123*90c8c64dSAndroid Build Coastguard Worker  "ignore_linker_set_keys": [
124*90c8c64dSAndroid Build Coastguard Worker    "_ZTI14internal_state",
125*90c8c64dSAndroid Build Coastguard Worker  ],
126*90c8c64dSAndroid Build Coastguard Worker  "flags": {
127*90c8c64dSAndroid Build Coastguard Worker    "allow_extensions": true,
128*90c8c64dSAndroid Build Coastguard Worker  }
129*90c8c64dSAndroid Build Coastguard Worker}
130*90c8c64dSAndroid Build Coastguard Worker```
131*90c8c64dSAndroid Build Coastguard Worker
132*90c8c64dSAndroid Build Coastguard Worker#### Flags
133*90c8c64dSAndroid Build Coastguard Worker
134*90c8c64dSAndroid Build Coastguard WorkerThe config file and the header-abi-diff CLI support the same set of `flags`. If
135*90c8c64dSAndroid Build Coastguard Workera flag is present in both CLI and config sections, the library config section
136*90c8c64dSAndroid Build Coastguard Workertakes priority, then the global config section and the CLI.
137*90c8c64dSAndroid Build Coastguard Worker
138*90c8c64dSAndroid Build Coastguard Worker## Opt-in ABI check
139*90c8c64dSAndroid Build Coastguard Worker
140*90c8c64dSAndroid Build Coastguard WorkerAndroid build system runs the ABI checker automatically when it builds
141*90c8c64dSAndroid Build Coastguard Workerparticular libraries, such as NDK and VNDK. Developers can enable the ABI
142*90c8c64dSAndroid Build Coastguard Workercheck for common libraries by the following steps:
143*90c8c64dSAndroid Build Coastguard Worker
144*90c8c64dSAndroid Build Coastguard Worker1. Set the ABI checker properties in Android.bp. For example,
145*90c8c64dSAndroid Build Coastguard Worker
146*90c8c64dSAndroid Build Coastguard Worker   ```
147*90c8c64dSAndroid Build Coastguard Worker   cc_library {
148*90c8c64dSAndroid Build Coastguard Worker       name: "libfoo",
149*90c8c64dSAndroid Build Coastguard Worker       ...
150*90c8c64dSAndroid Build Coastguard Worker       target: {
151*90c8c64dSAndroid Build Coastguard Worker           vendor: {
152*90c8c64dSAndroid Build Coastguard Worker               header_abi_checker: {
153*90c8c64dSAndroid Build Coastguard Worker                   enabled: true,
154*90c8c64dSAndroid Build Coastguard Worker                   symbol_file: "map.txt",
155*90c8c64dSAndroid Build Coastguard Worker                   ref_dump_dirs: ["abi-dumps"],
156*90c8c64dSAndroid Build Coastguard Worker               },
157*90c8c64dSAndroid Build Coastguard Worker           },
158*90c8c64dSAndroid Build Coastguard Worker       },
159*90c8c64dSAndroid Build Coastguard Worker   }
160*90c8c64dSAndroid Build Coastguard Worker   ```
161*90c8c64dSAndroid Build Coastguard Worker
162*90c8c64dSAndroid Build Coastguard Worker   `cc_library` modules and their `platform`, `product`, and `vendor` variants
163*90c8c64dSAndroid Build Coastguard Worker   support `header_abi_checker`. The following are the commonly used
164*90c8c64dSAndroid Build Coastguard Worker   properties of `header_abi_checker`:
165*90c8c64dSAndroid Build Coastguard Worker
166*90c8c64dSAndroid Build Coastguard Worker   - `enabled` explicitly enables or disables the check.
167*90c8c64dSAndroid Build Coastguard Worker   - `symbol_file` is the file containing the exported symbols.
168*90c8c64dSAndroid Build Coastguard Worker   - `diff_flags` are the command line options for header-abi-diff.
169*90c8c64dSAndroid Build Coastguard Worker   - `ref_dump_dirs` are the directories containing the dumps and
170*90c8c64dSAndroid Build Coastguard Worker     [config files](#Configuration).
171*90c8c64dSAndroid Build Coastguard Worker
172*90c8c64dSAndroid Build Coastguard Worker2. Follow the instructions in
173*90c8c64dSAndroid Build Coastguard Worker   [Update Opt-in Reference ABI Dumps](#Update-Opt_in-Reference-ABI-Dumps)
174*90c8c64dSAndroid Build Coastguard Worker   to generate ABI dumps in the `ref_dump_dirs`.
175*90c8c64dSAndroid Build Coastguard Worker
176*90c8c64dSAndroid Build Coastguard Worker3. Verify that the ABI check is working.
177*90c8c64dSAndroid Build Coastguard Worker
178*90c8c64dSAndroid Build Coastguard Worker   ```
179*90c8c64dSAndroid Build Coastguard Worker   $ make libfoo.vendor
180*90c8c64dSAndroid Build Coastguard Worker   $ find $ANDROID_BUILD_TOP/out/soong/.intermediates \
181*90c8c64dSAndroid Build Coastguard Worker     -name libfoo.so.opt0.abidiff
182*90c8c64dSAndroid Build Coastguard Worker   ```
183*90c8c64dSAndroid Build Coastguard Worker
184*90c8c64dSAndroid Build Coastguard Worker## FAQ
185*90c8c64dSAndroid Build Coastguard Worker
186*90c8c64dSAndroid Build Coastguard Worker### How to Resolve ABI Difference
187*90c8c64dSAndroid Build Coastguard Worker
188*90c8c64dSAndroid Build Coastguard WorkerThe build system compares the source code with three sets of reference dumps:
189*90c8c64dSAndroid Build Coastguard Worker**current version**, **opt-in**, and **previous version**. The ABI difference
190*90c8c64dSAndroid Build Coastguard Workeris propagated as build errors. This section describes the common methods to
191*90c8c64dSAndroid Build Coastguard Workerresolve them.
192*90c8c64dSAndroid Build Coastguard Worker
193*90c8c64dSAndroid Build Coastguard Worker#### Update Reference ABI Dumps for Current Version
194*90c8c64dSAndroid Build Coastguard Worker
195*90c8c64dSAndroid Build Coastguard WorkerWhen the build system finds difference between the source code and the ABI
196*90c8c64dSAndroid Build Coastguard Workerreference dumps for the **current version**, it instructs you to run
197*90c8c64dSAndroid Build Coastguard Worker`create_reference_dumps.py` to update the dumps.
198*90c8c64dSAndroid Build Coastguard Worker
199*90c8c64dSAndroid Build Coastguard WorkerThe command below updates the reference ABI dumps for all monitored libraries
200*90c8c64dSAndroid Build Coastguard Workeron arm, arm64, x86, and x86_64 architectures:
201*90c8c64dSAndroid Build Coastguard Worker
202*90c8c64dSAndroid Build Coastguard Worker```
203*90c8c64dSAndroid Build Coastguard Worker$ python3 utils/create_reference_dumps.py
204*90c8c64dSAndroid Build Coastguard Worker```
205*90c8c64dSAndroid Build Coastguard Worker
206*90c8c64dSAndroid Build Coastguard WorkerTo update reference ABI dumps for a specific library, `libfoo` for example,
207*90c8c64dSAndroid Build Coastguard Workerrun the command below:
208*90c8c64dSAndroid Build Coastguard Worker
209*90c8c64dSAndroid Build Coastguard Worker```
210*90c8c64dSAndroid Build Coastguard Worker$ python3 utils/create_reference_dumps.py -l libfoo
211*90c8c64dSAndroid Build Coastguard Worker```
212*90c8c64dSAndroid Build Coastguard Worker
213*90c8c64dSAndroid Build Coastguard WorkerFor more command line options, run:
214*90c8c64dSAndroid Build Coastguard Worker
215*90c8c64dSAndroid Build Coastguard Worker```
216*90c8c64dSAndroid Build Coastguard Worker$ utils/create_reference_dumps.py --help
217*90c8c64dSAndroid Build Coastguard Worker```
218*90c8c64dSAndroid Build Coastguard Worker
219*90c8c64dSAndroid Build Coastguard Worker#### Update Opt-in Reference ABI Dumps
220*90c8c64dSAndroid Build Coastguard Worker
221*90c8c64dSAndroid Build Coastguard WorkerWhen the build system finds difference between the source code and the
222*90c8c64dSAndroid Build Coastguard Worker**opt-in** ABI reference dumps, it instructs you to run
223*90c8c64dSAndroid Build Coastguard Worker`create_reference_dumps.py` with `--ref-dump-dir` to update the dumps.
224*90c8c64dSAndroid Build Coastguard Worker
225*90c8c64dSAndroid Build Coastguard WorkerThe command below updates the reference ABI dumps for a specific library:
226*90c8c64dSAndroid Build Coastguard Worker
227*90c8c64dSAndroid Build Coastguard Worker```
228*90c8c64dSAndroid Build Coastguard Worker$ python3 utils/create_reference_dumps.py -l libfoo \
229*90c8c64dSAndroid Build Coastguard Worker  --ref-dump-dir /path/to/abi-dumps
230*90c8c64dSAndroid Build Coastguard Worker```
231*90c8c64dSAndroid Build Coastguard Worker
232*90c8c64dSAndroid Build Coastguard WorkerYou may specify `--product` if you don't want to create the ABI dumps for
233*90c8c64dSAndroid Build Coastguard Workerall architectures. For example, with `--product aosp_arm`, the command creates
234*90c8c64dSAndroid Build Coastguard Workerdumps for 32-bit arm only.
235*90c8c64dSAndroid Build Coastguard Worker
236*90c8c64dSAndroid Build Coastguard Worker#### Configure Cross-Version ABI Check
237*90c8c64dSAndroid Build Coastguard Worker
238*90c8c64dSAndroid Build Coastguard WorkerWhen the build system finds incompatibility between the source code and the ABI
239*90c8c64dSAndroid Build Coastguard Workerof the **previous version**, it instructs you to follow this document to
240*90c8c64dSAndroid Build Coastguard Workerresolve it.
241*90c8c64dSAndroid Build Coastguard Worker
242*90c8c64dSAndroid Build Coastguard WorkerIf the ABI difference is intended, you may configure the ABI tools to ignore
243*90c8c64dSAndroid Build Coastguard Workerit. The following example shows how to make an exception for the ABI difference
244*90c8c64dSAndroid Build Coastguard Workerin `libfoo` between the current source and the previous version, `33`:
245*90c8c64dSAndroid Build Coastguard Worker
246*90c8c64dSAndroid Build Coastguard Worker1. Open `libfoo.so.33.abidiff` which is located in
247*90c8c64dSAndroid Build Coastguard Worker   `$OUT_DIR/soong/.intermediates` or `$DIST_DIR/abidiffs`. Find out the
248*90c8c64dSAndroid Build Coastguard Worker   `linker_set_key` of the type that has ABI difference. Here is a sample
249*90c8c64dSAndroid Build Coastguard Worker   abidiff file:
250*90c8c64dSAndroid Build Coastguard Worker
251*90c8c64dSAndroid Build Coastguard Worker   ```
252*90c8c64dSAndroid Build Coastguard Worker   lib_name: "libfoo"
253*90c8c64dSAndroid Build Coastguard Worker   arch: "x86_64"
254*90c8c64dSAndroid Build Coastguard Worker   record_type_diffs {
255*90c8c64dSAndroid Build Coastguard Worker     name: "bar"
256*90c8c64dSAndroid Build Coastguard Worker     ...
257*90c8c64dSAndroid Build Coastguard Worker     linker_set_key: "_ZTI3bar"
258*90c8c64dSAndroid Build Coastguard Worker   }
259*90c8c64dSAndroid Build Coastguard Worker   compatibility_status: INCOMPATIBLE
260*90c8c64dSAndroid Build Coastguard Worker   ```
261*90c8c64dSAndroid Build Coastguard Worker
262*90c8c64dSAndroid Build Coastguard Worker2. Find the reference dump directories by
263*90c8c64dSAndroid Build Coastguard Worker
264*90c8c64dSAndroid Build Coastguard Worker   `find $ANDROID_BUILD_TOP/prebuilts/abi-dumps/*/33 -name libfoo.so.lsdump -exec dirname {} +`
265*90c8c64dSAndroid Build Coastguard Worker
266*90c8c64dSAndroid Build Coastguard Worker   The command should show 6 directories for different architectures.
267*90c8c64dSAndroid Build Coastguard Worker
268*90c8c64dSAndroid Build Coastguard Worker3. Create or edit `config.json` in every directory, for instance,
269*90c8c64dSAndroid Build Coastguard Worker
270*90c8c64dSAndroid Build Coastguard Worker   `prebuilts/abi-dumps/ndk/33/64/x86_64/source-based/config.json`
271*90c8c64dSAndroid Build Coastguard Worker
272*90c8c64dSAndroid Build Coastguard Worker   ```
273*90c8c64dSAndroid Build Coastguard Worker   {
274*90c8c64dSAndroid Build Coastguard Worker     "libfoo": [
275*90c8c64dSAndroid Build Coastguard Worker       {
276*90c8c64dSAndroid Build Coastguard Worker         "target_version": "34",
277*90c8c64dSAndroid Build Coastguard Worker         "ignore_linker_set_keys": [
278*90c8c64dSAndroid Build Coastguard Worker           "_ZTI3bar",
279*90c8c64dSAndroid Build Coastguard Worker         ],
280*90c8c64dSAndroid Build Coastguard Worker       },
281*90c8c64dSAndroid Build Coastguard Worker     ],
282*90c8c64dSAndroid Build Coastguard Worker   }
283*90c8c64dSAndroid Build Coastguard Worker   ```
284*90c8c64dSAndroid Build Coastguard Worker
285*90c8c64dSAndroid Build Coastguard Worker   The config above makes the ABI tools ignore the difference in type
286*90c8c64dSAndroid Build Coastguard Worker   `_ZTI3bar` in `libfoo`. If the API level of this branch has been finalized
287*90c8c64dSAndroid Build Coastguard Worker   (i.e., PLATFORM_VERSION_CODENAME=REL), `target_version` must be set to the
288*90c8c64dSAndroid Build Coastguard Worker   API level. Otherwise, `target_version` must be set to
289*90c8c64dSAndroid Build Coastguard Worker   **the previous finalized API level + 1** so that the config will continue
290*90c8c64dSAndroid Build Coastguard Worker   being effective after finalization.
291*90c8c64dSAndroid Build Coastguard Worker
292*90c8c64dSAndroid Build Coastguard WorkerFor more information about the config files, please refer to
293*90c8c64dSAndroid Build Coastguard Worker[Configuration](#Configuration).
294*90c8c64dSAndroid Build Coastguard Worker
295*90c8c64dSAndroid Build Coastguard Worker### How to Ignore Weak Symbol Difference
296*90c8c64dSAndroid Build Coastguard Worker
297*90c8c64dSAndroid Build Coastguard WorkerIf you compile Android with a customized toolchain, it may produce different
298*90c8c64dSAndroid Build Coastguard Workerweak symbols. You may make header-abi-diff ignore the weak symbols by adding
299*90c8c64dSAndroid Build Coastguard Worker`config.json` to each reference dump directory. For example, the following
300*90c8c64dSAndroid Build Coastguard Workerconfiguration makes header-abi-diff ignore weak symbols for all x86_64 NDK
301*90c8c64dSAndroid Build Coastguard Workerlibraries at API level 33:
302*90c8c64dSAndroid Build Coastguard Worker
303*90c8c64dSAndroid Build Coastguard Worker`prebuilts/abi-dumps/ndk/33/64/x86_64/source-based/config.json`
304*90c8c64dSAndroid Build Coastguard Worker
305*90c8c64dSAndroid Build Coastguard Worker```
306*90c8c64dSAndroid Build Coastguard Worker{
307*90c8c64dSAndroid Build Coastguard Worker  "global": {
308*90c8c64dSAndroid Build Coastguard Worker    "flags": {
309*90c8c64dSAndroid Build Coastguard Worker      "allow_adding_removing_weak_symbols": true,
310*90c8c64dSAndroid Build Coastguard Worker    },
311*90c8c64dSAndroid Build Coastguard Worker  },
312*90c8c64dSAndroid Build Coastguard Worker}
313*90c8c64dSAndroid Build Coastguard Worker```
314*90c8c64dSAndroid Build Coastguard Worker
315*90c8c64dSAndroid Build Coastguard WorkerTo ignore weak symbols for a specific library, you can add extra flags to its
316*90c8c64dSAndroid Build Coastguard WorkerAndroid.bp. For example,
317*90c8c64dSAndroid Build Coastguard Worker
318*90c8c64dSAndroid Build Coastguard Worker```
319*90c8c64dSAndroid Build Coastguard Workercc_library {
320*90c8c64dSAndroid Build Coastguard Worker    header_abi_checker: {
321*90c8c64dSAndroid Build Coastguard Worker        diff_flags: ["-allow-adding-removing-weak-symbols"],
322*90c8c64dSAndroid Build Coastguard Worker    },
323*90c8c64dSAndroid Build Coastguard Worker}
324*90c8c64dSAndroid Build Coastguard Worker```
325*90c8c64dSAndroid Build Coastguard Worker
326*90c8c64dSAndroid Build Coastguard Worker### How to Disable the ABI Check
327*90c8c64dSAndroid Build Coastguard Worker
328*90c8c64dSAndroid Build Coastguard WorkerYou can disable the ABI check entirely by setting the environment variable
329*90c8c64dSAndroid Build Coastguard Worker`SKIP_ABI_CHECKS`. For example,
330*90c8c64dSAndroid Build Coastguard Worker
331*90c8c64dSAndroid Build Coastguard Worker`$ SKIP_ABI_CHECKS=true make`
332*90c8c64dSAndroid Build Coastguard Worker
333*90c8c64dSAndroid Build Coastguard WorkerYou can disable the ABI check for a specific library by using the property
334*90c8c64dSAndroid Build Coastguard Worker`enabled` in its Android.bp. For example,
335*90c8c64dSAndroid Build Coastguard Worker
336*90c8c64dSAndroid Build Coastguard Worker```
337*90c8c64dSAndroid Build Coastguard Workercc_library {
338*90c8c64dSAndroid Build Coastguard Worker    header_abi_checker: {
339*90c8c64dSAndroid Build Coastguard Worker        enabled: false,
340*90c8c64dSAndroid Build Coastguard Worker    },
341*90c8c64dSAndroid Build Coastguard Worker}
342*90c8c64dSAndroid Build Coastguard Worker```
343