Upgrade zlib to 37d9855c8db5a130571971e78fde2740314cd98a

This project was upgraded with external_updater.
Usage: tools/external_updater/updater.sh update external/zlib
For more info, check https://cs.android.com/android/platform/superproject/+/main:tools/external_updater/README.md

Test: TreeHugger
Change-Id: I133260dbc2e106dcd1167029179554f77079b1bc
diff --git a/Android.bp b/Android.bp
new file mode 100644
index 0000000..a6d27d1
--- /dev/null
+++ b/Android.bp
@@ -0,0 +1,414 @@
+package {
+    default_applicable_licenses: ["external_zlib_license"],
+}
+
+license {
+    name: "external_zlib_license",
+    visibility: [":__subpackages__"],
+    license_kinds: [
+        "SPDX-license-identifier-BSD",
+        "SPDX-license-identifier-Zlib",
+    ],
+    license_text: [
+        "LICENSE",
+    ],
+}
+
+// These cflags are shared --- not only between all architectures,
+// but between libz and libz_stable too.
+cflags_shared = [
+    // Our compiler does support hidden visibility.
+    "-DHAVE_HIDDEN",
+    // Our compiler does support const.
+    "-DZLIB_CONST",
+    // Use the traditional Rabin-Karp rolling hash to match zlib DEFLATE output exactly.
+    "-DCHROMIUM_ZLIB_NO_CASTAGNOLI",
+    // Enable -O3 for everyone, as chromium's BUILD.gn does.
+    "-O3",
+    "-Wall",
+    "-Werror",
+    "-Wno-deprecated-non-prototype",
+    "-Wno-unused",
+    "-Wno-unused-parameter",
+]
+
+cflags_arm = [
+    // Even the NDK dropped non-neon support in r24.
+    "-DADLER32_SIMD_NEON",
+    // HWCAP_CRC32 is checked at runtime, so it's okay to enable crc32
+    // acceleration for both 64-bit and 32-bit (which may be armv7, at
+    // least for NDK users).
+    "-DCRC32_ARMV8_CRC32",
+    // TODO: DINFLATE_CHUNK_SIMD_NEON causes `atest org.apache.harmony.tests.java.util.zip.DeflaterTest` failures.
+    // "-DINFLATE_CHUNK_SIMD_NEON",
+]
+cflags_arm64 = cflags_arm + ["-DINFLATE_CHUNK_READ_64LE"]
+
+cflags_riscv64 = [
+    // TODO: test and enable these.
+    // "-DRISCV_RVV",
+    // "-DADLER32_SIMD_RVV",
+]
+
+// The *host* x86 configuration (with *lower* CPU feature requirements).
+cflags_x86 = [
+    // See ARMV8_OS_LINUX above.
+    "-DX86_NOT_WINDOWS",
+    // Android's host CPU feature requirements are *lower* than the
+    // corresponding device CPU feature requirements, so it's easier to just
+    // say "no SIMD for you" rather than specificially disable SSSE3.
+    // We should have a conversation about that, but not until we at least have
+    // data on how many Studio users have CPUs that don't make the grade...
+    // https://issuetracker.google.com/171235570
+    "-DCPU_NO_SIMD",
+]
+cflags_x86_64 = cflags_x86 + ["-DINFLATE_CHUNK_READ_64LE"]
+
+// The additional *device* x86/x86_64 configuration. Devices have *higher* CPU
+// feature requirements than the host.
+cflags_android_x86 = [
+    // Android's x86 and x86-64 ABIs both include SSE2 and SSSE3.
+    "-UCPU_NO_SIMD",
+    "-DADLER32_SIMD_SSSE3",
+    // TODO: DINFLATE_CHUNK_SIMD_SSE2 causes `atest org.apache.harmony.tests.java.util.zip.DeflaterTest` failures.
+    // "-DINFLATE_CHUNK_SIMD_SSE2",
+]
+
+libz_srcs = [
+    "adler32.c",
+    "adler32_simd.c",
+    "compress.c",
+    "cpu_features.c",
+    "crc32.c",
+    "crc32_simd.c",
+    "crc_folding.c",
+    "deflate.c",
+    "gzclose.c",
+    "gzlib.c",
+    "gzread.c",
+    "gzwrite.c",
+    "infback.c",
+    "inffast.c",
+    "inflate.c",
+    "inftrees.c",
+    "trees.c",
+    "uncompr.c",
+    "zutil.c",
+
+    // Not-yet-enabled optimizations.
+    // See https://chromium-review.googlesource.com/749732.
+    // TODO: causes `atest org.apache.harmony.tests.java.util.zip.DeflaterTest` failures.
+    //    "contrib/optimizations/inffast_chunk.c",
+    //    "contrib/optimizations/inflate.c",
+]
+
+cc_defaults {
+    name: "libz_defaults",
+
+    cflags: cflags_shared,
+    stl: "none",
+    export_include_dirs: ["."],
+
+    host_supported: true,
+    native_bridge_supported: true,
+
+    vendor_available: true,
+    product_available: true,
+    ramdisk_available: true,
+    vendor_ramdisk_available: true,
+    recovery_available: true,
+
+    arch: {
+        arm: {
+            // TODO: This is to work around b/24465209. Remove after root cause
+            // is fixed.
+            pack_relocations: false,
+            ldflags: ["-Wl,--hash-style=both"],
+
+            cflags: cflags_arm,
+        },
+        arm64: {
+            cflags: cflags_arm64,
+        },
+        riscv64: {
+            cflags: cflags_riscv64,
+        },
+        x86: {
+            cflags: cflags_x86,
+        },
+        x86_64: {
+            cflags: cflags_x86_64,
+        },
+    },
+    target: {
+        android_arm: {
+            cflags: [
+                // Since we're building for the platform, we claim to be Linux rather than
+                // Android so we use getauxval() directly instead of the NDK
+                // android_getCpuFeatures which isn't available to us anyway.
+                "-DARMV8_OS_LINUX",
+            ],
+        },
+        android_x86: {
+            cflags: cflags_android_x86,
+        },
+        android_x86_64: {
+            cflags: cflags_android_x86,
+        },
+        darwin_arm64: {
+            cflags: [
+                "-DARMV8_OS_MACOS",
+            ],
+        },
+        linux_bionic: {
+            enabled: true,
+        },
+        linux_arm64: {
+            cflags: [
+                // Since we're building for the platform, we claim to be Linux rather than
+                // Android so we use getauxval() directly instead of the NDK
+                // android_getCpuFeatures which isn't available to us anyway.
+                "-DARMV8_OS_LINUX",
+            ],
+        },
+        windows: {
+            enabled: true,
+        },
+    },
+}
+
+cc_library {
+    name: "libz",
+    defaults: ["libz_defaults"],
+
+    whole_static_libs: ["libz_static"],
+
+    unique_host_soname: true,
+    static_ndk_lib: true,
+
+    vndk: {
+        enabled: true,
+        support_system_process: true,
+    },
+
+    stubs: {
+        versions: [
+            "29",
+            "30",
+        ],
+        symbol_file: "libz.map.txt",
+    },
+
+    // When used by Vendor/Product APEX,
+    // libz should be treated like non-stable module.
+    // (Hence, should be bundled in APEX).
+    target: {
+        product: {
+            no_stubs: true,
+        },
+        vendor: {
+            no_stubs: true,
+        },
+    },
+}
+
+cc_library {
+    name: "libz_static",
+    defaults: ["libz_defaults"],
+    visibility: [
+        "//external/angle",
+        "//system/unwinding/libunwindstack",
+    ],
+
+    srcs: libz_srcs,
+
+    sdk_version: "minimum",
+    min_sdk_version: "apex_inherit",
+
+    apex_available: [
+        "com.android.art",
+        "com.android.art.debug",
+        "com.android.runtime",
+        "//apex_available:platform",
+    ],
+}
+
+// A build of libz with identical behavior between architectures.
+// Used by legacy OTA tools such as imgdiff and updater and their tests.
+// New code should not use this library, because new code should not make
+// assumptions about the _compressed_ bits, beyond the fact that they will
+// decompress to the same input bytes. The actual compressed byte sequences
+// can and do differ over time.
+cc_library {
+    name: "libz_stable",
+    visibility: [
+        "//bootable/recovery/applypatch",
+        "//bootable/recovery/tests",
+        "//bootable/recovery/updater",
+        "//bootable/deprecated-ota/applypatch",
+        "//bootable/deprecated-ota/tests",
+        "//bootable/deprecated-ota/updater",
+    ],
+    // We only use the shared flags here; the whole point is that this
+    // library behaves the same on all different architectures.
+    cflags: cflags_shared,
+    stl: "none",
+    export_include_dirs: ["."],
+    srcs: libz_srcs,
+    host_supported: true,
+    vendor_available: true,
+    recovery_available: true,
+}
+
+cc_binary {
+    name: "zlib_bench",
+    srcs: ["contrib/bench/zlib_bench.cc"],
+    cflags: [
+        "-Wall",
+        "-Werror",
+        "-Wno-deprecated-non-prototype",
+        "-Wno-unused-parameter",
+    ],
+    host_supported: true,
+    shared_libs: ["libz"],
+    // We build zlib_bench32 and zlib_bench64 so it's easy to test LP32.
+    compile_multilib: "both",
+    multilib: {
+        lib32: {
+            suffix: "32",
+        },
+        lib64: {
+            suffix: "64",
+        },
+    },
+}
+
+cc_library {
+    name: "zlib_google_compression_utils_portable",
+    defaults: ["libz_defaults"],
+    srcs: [
+        "google/compression_utils_portable.cc",
+    ],
+    export_include_dirs: ["google"],
+    host_supported: true,
+    shared_libs: ["libz"],
+    sdk_version: "minimum",
+    visibility: ["//external/angle"],
+    apex_available: [
+        "com.android.runtime",
+        "//apex_available:platform",
+    ],
+}
+
+cc_test {
+    name: "zlib_tests",
+    srcs: [
+        "contrib/tests/infcover.cc",
+        "contrib/tests/utils_unittest.cc",
+    ],
+    cflags: [
+        "-DCMAKE_STANDALONE_UNITTESTS",
+        "-Wno-unused-parameter",
+    ],
+    include_dirs: [
+        // These tests include "gtest.h" rather than the usual "gtest/gtest.h".
+        "external/googletest/googletest/include/gtest/",
+    ],
+    shared_libs: ["libz"],
+    static_libs: ["zlib_google_compression_utils_portable"],
+    host_supported: true,
+    test_suites: ["device-tests"],
+}
+
+ndk_headers {
+    name: "libz_headers",
+    from: "",
+    to: "",
+    srcs: [
+        "zconf.h",
+        "zlib.h",
+    ],
+    license: "LICENSE",
+}
+
+ndk_library {
+    name: "libz",
+    symbol_file: "libz.map.txt",
+    first_version: "9",
+    unversioned_until: "current",
+    export_header_libs: [
+        "libz_headers",
+    ],
+}
+
+// Export zlib headers for inclusion in the musl sysroot.
+genrule {
+    name: "libc_musl_sysroot_zlib_headers",
+    visibility: ["//external/musl"],
+    srcs: [
+        "LICENSE",
+        "zconf.h",
+        "zlib.h",
+    ],
+    out: ["libc_musl_sysroot_zlib_headers.zip"],
+    tools: [
+        "soong_zip",
+        "zip2zip",
+    ],
+    cmd: "$(location soong_zip) -o $(genDir)/sysroot.zip -symlinks=false" +
+        // NOTICE
+        " -j -f $(location LICENSE) " +
+        // headers
+        " -j -P include " +
+        "  -f $(location zconf.h) " +
+        "  -f $(location zlib.h) " +
+        " && " +
+        "$(location zip2zip) -i $(genDir)/sysroot.zip -o $(out) " +
+        " include/**/*:include " +
+        " LICENSE:NOTICE.zlib",
+}
+
+cc_defaults {
+    name: "zlib_fuzz_defaults",
+    static_libs: ["libz"],
+    host_supported: true,
+}
+
+cc_fuzz {
+    name: "zlib_deflate_fuzzer",
+    defaults: ["zlib_fuzz_defaults"],
+    srcs: ["contrib/tests/fuzzers/deflate_fuzzer.cc"],
+}
+
+cc_fuzz {
+    name: "zlib_deflate_set_dictionary_fuzzer",
+    defaults: ["zlib_fuzz_defaults"],
+    srcs: ["contrib/tests/fuzzers/deflate_set_dictionary_fuzzer.cc"],
+}
+
+cc_fuzz {
+    name: "zlib_inflate_fuzzer",
+    defaults: ["zlib_fuzz_defaults"],
+    srcs: ["contrib/tests/fuzzers/inflate_fuzzer.cc"],
+}
+
+cc_fuzz {
+    name: "zlib_inflate_with_header_fuzzer",
+    defaults: ["zlib_fuzz_defaults"],
+    srcs: ["contrib/tests/fuzzers/inflate_with_header_fuzzer.cc"],
+}
+
+cc_fuzz {
+    name: "zlib_streaming_inflate_fuzzer",
+    defaults: ["zlib_fuzz_defaults"],
+    srcs: ["contrib/tests/fuzzers/streaming_inflate_fuzzer.cc"],
+    fuzz_config: {
+        libfuzzer_options: ["max_len=256000"],
+    },
+}
+
+cc_fuzz {
+    name: "zlib_uncompress_fuzzer",
+    defaults: ["zlib_fuzz_defaults"],
+    srcs: ["contrib/tests/fuzzers/uncompress_fuzzer.cc"],
+}
diff --git a/BUILD.bazel b/BUILD.bazel
new file mode 100644
index 0000000..f0fc0f9
--- /dev/null
+++ b/BUILD.bazel
@@ -0,0 +1,22 @@
+# Copyright (C) 2024 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+load("@rules_pkg//pkg:mappings.bzl", "pkg_files")
+
+pkg_files(
+    name = "test_mappings",
+    srcs = ["TEST_MAPPING"],
+    prefix = package_name(),
+    visibility = ["//kernel/tests/test_mappings:__pkg__"],
+)
diff --git a/CleanSpec.mk b/CleanSpec.mk
new file mode 100644
index 0000000..b84e1b6
--- /dev/null
+++ b/CleanSpec.mk
@@ -0,0 +1,49 @@
+# Copyright (C) 2007 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# If you don't need to do a full clean build but would like to touch
+# a file or delete some intermediate files, add a clean step to the end
+# of the list.  These steps will only be run once, if they haven't been
+# run before.
+#
+# E.g.:
+#     $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
+#     $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
+#
+# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
+# files that are missing or have been moved.
+#
+# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
+# Use $(OUT_DIR) to refer to the "out" directory.
+#
+# If you need to re-do something that's already mentioned, just copy
+# the command and add it to the bottom of the list.  E.g., if a change
+# that you made last week required touching a file and a change you
+# made today requires touching the same file, just copy the old
+# touch step and add it to the end of the list.
+#
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
+
+# For example:
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
+#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
+#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
+
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
diff --git a/METADATA b/METADATA
new file mode 100644
index 0000000..28e6d50
--- /dev/null
+++ b/METADATA
@@ -0,0 +1,19 @@
+# This project was upgraded with external_updater.
+# Usage: tools/external_updater/updater.sh update external/zlib
+# For more info, check https://cs.android.com/android/platform/superproject/+/main:tools/external_updater/README.md
+
+name: "zlib"
+description: "The Chromium fork of the zlib compression library."
+third_party {
+  license_type: NOTICE
+  last_upgrade_date {
+    year: 2024
+    month: 4
+    day: 9
+  }
+  identifier {
+    type: "Git"
+    value: "https://chromium.googlesource.com/chromium/src/third_party/zlib/"
+    version: "37d9855c8db5a130571971e78fde2740314cd98a"
+  }
+}
diff --git a/MODULE_LICENSE_BSD_LIKE b/MODULE_LICENSE_BSD_LIKE
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/MODULE_LICENSE_BSD_LIKE
diff --git a/OWNERS.android b/OWNERS.android
new file mode 100644
index 0000000..7529cb9
--- /dev/null
+++ b/OWNERS.android
@@ -0,0 +1 @@
+include platform/system/core:/janitors/OWNERS
diff --git a/TEST_MAPPING b/TEST_MAPPING
new file mode 100644
index 0000000..b2c8b36
--- /dev/null
+++ b/TEST_MAPPING
@@ -0,0 +1,27 @@
+{
+  "presubmit": [
+    {
+      "name": "puffin_unittest"
+    },
+    {
+      "name": "recovery_unit_test"
+    },
+    {
+      "name": "update_engine_unittests"
+    },
+    {
+      "name": "ziparchive-tests"
+    },
+    {
+      "name": "zlib_tests"
+    },
+    {
+      "name": "CtsLibcoreTestCases",
+      "options": [
+        {
+          "include-filter": "org.apache.harmony.tests.java.util.zip"
+        }
+      ]
+    }
+  ]
+}
diff --git a/libz.map.txt b/libz.map.txt
new file mode 100644
index 0000000..850bbf8
--- /dev/null
+++ b/libz.map.txt
@@ -0,0 +1,151 @@
+# This file is copied from src/zlib.map and annotated with comments for the NDK
+# stub library generation script.
+ZLIB_1.2.0 {
+  global:
+    compressBound;
+    deflateBound;
+    inflateBack;
+    inflateBackEnd;
+    inflateBackInit_;
+    inflateCopy;
+  local:
+    deflate_copyright; # var
+    inflate_copyright; # var
+    inflate_fast;
+    inflate_table;
+    zcalloc;
+    zcfree;
+    z_errmsg; # var
+    gz_error;
+    gz_intmax;
+    _*;
+};
+
+ZLIB_1.2.0.2 {
+    gzclearerr;
+    gzungetc;
+    zlibCompileFlags;
+} ZLIB_1.2.0;
+
+ZLIB_1.2.0.8 {
+    deflatePrime;
+} ZLIB_1.2.0.2;
+
+ZLIB_1.2.2 {
+    adler32_combine;
+    crc32_combine;
+    deflateSetHeader;
+    inflateGetHeader;
+} ZLIB_1.2.0.8;
+
+ZLIB_1.2.2.3 {
+    deflateTune;
+    gzdirect;
+} ZLIB_1.2.2;
+
+ZLIB_1.2.2.4 {
+    inflatePrime;
+} ZLIB_1.2.2.3;
+
+ZLIB_1.2.3.3 {
+    adler32_combine64;
+    crc32_combine64;
+    gzopen64;
+    gzseek64;
+    gztell64;
+    inflateUndermine;
+} ZLIB_1.2.2.4;
+
+ZLIB_1.2.3.4 {
+    inflateReset2;
+    inflateMark;
+} ZLIB_1.2.3.3;
+
+ZLIB_1.2.3.5 {
+    gzbuffer;
+    gzoffset;
+    gzoffset64;
+    gzclose_r;
+    gzclose_w;
+} ZLIB_1.2.3.4;
+
+ZLIB_1.2.5.1 {
+    deflatePending;
+} ZLIB_1.2.3.5;
+
+ZLIB_1.2.5.2 {
+    deflateResetKeep;
+    gzgetc_;
+    inflateResetKeep;
+} ZLIB_1.2.5.1;
+
+ZLIB_1.2.7.1 { # introduced=19
+    inflateGetDictionary;
+    gzvprintf;
+} ZLIB_1.2.5.2;
+
+ZLIB_1.2.9 { # introduced=28
+    inflateCodesUsed;
+    inflateValidate;
+    uncompress2;
+    gzfread;
+    gzfwrite;
+    deflateGetDictionary;
+    adler32_z;
+    crc32_z;
+} ZLIB_1.2.7.1;
+
+# These were all exposed by the old NDK stub library. Unclear if they still
+# should be, but at least some of them are marked as being exported in zlib.h
+# and the tree doesn't build without them.
+ZLIB_NDK {
+    _dist_code;
+    _length_code;
+    _tr_align;
+    _tr_flush_bits; # introduced=21
+    _tr_flush_block;
+    _tr_init;
+    _tr_stored_block;
+    _tr_tally;
+    adler32;
+    compress2;
+    compress;
+    crc32;
+    deflate;
+    deflateCopy;
+    deflateEnd;
+    deflateInit2_;
+    deflateInit_;
+    deflateParams;
+    deflateReset;
+    deflateSetDictionary;
+    get_crc_table;
+    gzclose;
+    gzdopen;
+    gzeof;
+    gzerror;
+    gzflush;
+    gzgetc;
+    gzgets;
+    gzopen;
+    gzprintf;
+    gzputc;
+    gzputs;
+    gzread;
+    gzrewind;
+    gzseek;
+    gzsetparams;
+    gztell;
+    gzwrite;
+    inflate;
+    inflateEnd;
+    inflateInit2_;
+    inflateInit_;
+    inflateReset;
+    inflateSetDictionary;
+    inflateSync;
+    inflateSyncPoint;
+    uncompress;
+    zError;
+    zlibVersion;
+};
diff --git a/zconf.h b/zconf.h
index 55fe101..3df78ad 100644
--- a/zconf.h
+++ b/zconf.h
@@ -8,6 +8,10 @@
 #ifndef ZCONF_H
 #define ZCONF_H
 
+// ANDROID CHNAGE: Upstream chromium renames all the functions; we don't want
+// that.
+#define CHROMIUM_ZLIB_NO_CHROMECONF
+
 /*
  * This library is also built as a part of AOSP, which does not need to include
  * chromeconf.h. This config does not want chromeconf.h, so it can set this
diff --git a/zlib.h b/zlib.h
index f1b149b..7f7c26c 100644
--- a/zlib.h
+++ b/zlib.h
@@ -45,6 +45,49 @@
 #define ZLIB_VER_SUBREVISION 1
 
 /*
+ * In Android's NDK we have one zlib.h for all the versions.
+ * zlib users tend to use ZLIB_VERNUM to check API availability,
+ * so we need to translate __ANDROID_API__ appropriately.
+ *
+ * ZLIB_1.2.7.1 and ZLIB_1.2.9 are the only API changes in the NDK's
+ * supported range of API levels.
+ *
+ * jb-mr2-dev (18): 1.2.7 (but not 1.2.7.1, where the APIs were added!)
+ * https://android.googlesource.com/platform/external/zlib/+/refs/heads/jb-mr2-dev/src/zlib.h
+ * kitkat-dev (19): 1.2.8
+ * https://android.googlesource.com/platform/external/zlib/+/refs/heads/kitkat-dev/src/zlib.h
+ *
+ * oreo-mr1-dev (27): 1.2.8
+ * https://android.googlesource.com/platform/external/zlib/+/refs/heads/oreo-mr1-dev/src/zlib.h
+ * pie-dev (28): 1.2.11
+ * https://android.googlesource.com/platform/external/zlib/+/refs/heads/pie-dev/src/zlib.h
+ *
+ * So:
+ *  >= 28 --> 1.2.11
+ *  >= 19 --> 1.2.8
+ *   < 19 --> 1.2.7
+ */
+#if defined(__ANDROID__)
+#  if __ANDROID_API__ >= 28
+     /* Already okay. */
+#  elif __ANDROID_API__ >= 19
+#    undef ZLIB_VERSION
+#    define ZLIB_VERSION "1.2.8"
+#    undef ZLIB_VERNUM
+#    define ZLIB_VERNUM 0x1280
+#    undef ZLIB_VER_REVISION
+#    define ZLIB_VER_REVISION 8
+#  else
+#    undef ZLIB_VERSION
+#    define ZLIB_VERSION "1.2.6"
+#    undef ZLIB_VERNUM
+#    define ZLIB_VERNUM 0x1260
+#    undef ZLIB_VER_REVISION
+#    define ZLIB_VER_REVISION 6
+#  endif
+#endif
+
+/*
     The 'zlib' compression library provides in-memory compression and
   decompression functions, including integrity checks of the uncompressed data.
   This version of the library supports only one compression method (deflation)
@@ -651,9 +694,11 @@
    not perform any compression: this will be done by deflate().
 */
 
+#if !defined(__ANDROID__) || __ANDROID_API__ >= 28
 ZEXTERN int ZEXPORT deflateGetDictionary(z_streamp strm,
                                          Bytef *dictionary,
                                          uInt  *dictLength);
+#endif
 /*
      Returns the sliding dictionary being maintained by deflate.  dictLength is
    set to the number of bytes in the dictionary, and that many bytes are copied
@@ -907,9 +952,11 @@
    inflate().
 */
 
+#if !defined(__ANDROID__) || __ANDROID_API__ >= 19
 ZEXTERN int ZEXPORT inflateGetDictionary(z_streamp strm,
                                          Bytef *dictionary,
                                          uInt  *dictLength);
+#endif
 /*
      Returns the sliding dictionary being maintained by inflate.  dictLength is
    set to the number of bytes in the dictionary, and that many bytes are copied
@@ -1284,8 +1331,10 @@
    buffer with the uncompressed data up to that point.
 */
 
+#if !defined(__ANDROID__) || __ANDROID_API__ >= 28
 ZEXTERN int ZEXPORT uncompress2(Bytef *dest,   uLongf *destLen,
                                 const Bytef *source, uLong *sourceLen);
+#endif
 /*
      Same as uncompress, except that sourceLen is a pointer, where the
    length of the source is *sourceLen.  On return, *sourceLen is the number of
@@ -1421,8 +1470,10 @@
    Z_STREAM_ERROR.
 */
 
+#if !defined(__ANDROID__) || __ANDROID_API__ >= 28
 ZEXTERN z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems,
                                  gzFile file);
+#endif
 /*
      Read and decompress up to nitems items of size size from file into buf,
    otherwise operating as gzread() does.  This duplicates the interface of
@@ -1453,8 +1504,10 @@
    returns the number of uncompressed bytes written or 0 in case of error.
 */
 
+#if !defined(__ANDROID__) || __ANDROID_API__ >= 28
 ZEXTERN z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size,
                                   z_size_t nitems, gzFile file);
+#endif
 /*
      Compress and write nitems items of size size from buf to file, duplicating
    the interface of stdio's fwrite(), with size_t request and return types.  If
@@ -1708,8 +1761,10 @@
      if (adler != original_adler) error();
 */
 
+#if !defined(__ANDROID__) || __ANDROID_API__ >= 28
 ZEXTERN uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf,
                                 z_size_t len);
+#endif
 /*
      Same as adler32(), but with a size_t length.
 */
@@ -1744,8 +1799,10 @@
      if (crc != original_crc) error();
 */
 
+#if !defined(__ANDROID__) || __ANDROID_API__ >= 28
 ZEXTERN uLong ZEXPORT crc32_z(uLong crc, const Bytef *buf,
                               z_size_t len);
+#endif
 /*
      Same as crc32(), but with a size_t length.
 */
@@ -1944,8 +2001,12 @@
 ZEXTERN int            ZEXPORT inflateSyncPoint(z_streamp);
 ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table(void);
 ZEXTERN int            ZEXPORT inflateUndermine(z_streamp, int);
+#if !defined(__ANDROID__) || __ANDROID_API__ >= 28
 ZEXTERN int            ZEXPORT inflateValidate(z_streamp, int);
+#endif
+#if !defined(__ANDROID__) || __ANDROID_API__ >= 28
 ZEXTERN unsigned long  ZEXPORT inflateCodesUsed(z_streamp);
+#endif
 ZEXTERN int            ZEXPORT inflateResetKeep(z_streamp);
 ZEXTERN int            ZEXPORT deflateResetKeep(z_streamp);
 #if defined(_WIN32) && !defined(Z_SOLO)
@@ -1954,9 +2015,11 @@
 #endif
 #if defined(STDC) || defined(Z_HAVE_STDARG_H)
 #  ifndef Z_SOLO
+#    if !defined(__ANDROID__) || __ANDROID_API__ >= 19
 ZEXTERN int            ZEXPORTVA gzvprintf(gzFile file,
                                            const char *format,
                                            va_list va);
+#    endif
 #  endif
 #endif