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