// Copyright (C) 2009 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.

package {
    // See: http://go/android-license-faq
    // A large-scale-change added 'default_applicable_licenses' to import
    // all of the 'license_kinds' from "frameworks_native_license"
    // to get the below license kinds:
    //   SPDX-license-identifier-Apache-2.0
    default_applicable_licenses: ["frameworks_native_license"],
}

cc_library_headers {
    name: "libbinder_headers",
    export_include_dirs: ["include"],
    vendor_available: true,
    host_supported: true,
    // TODO(b/153609531): remove when no longer needed.
    native_bridge_supported: true,

    header_libs: [
        "libbase_headers",
        "libbinder_headers_platform_shared",
        "libcutils_headers",
        "libutils_headers",
    ],
    export_header_lib_headers: [
        "libbase_headers",
        "libbinder_headers_platform_shared",
        "libcutils_headers",
        "libutils_headers",
    ],
    apex_available: [
        "//apex_available:platform",
        "com.android.media",
        "com.android.media.swcodec",
    ],
    min_sdk_version: "29",
    target: {
        darwin: {
            enabled: false,
        },
    },
}

// These interfaces are android-specific implementation unrelated to binder
// transport itself and should be moved to AIDL or in domain-specific libs.
//
// Currently, these are only on system android (not vendor, not host)
// TODO(b/183654927) - move these into separate libraries
libbinder_device_interface_sources = [
    "IPermissionController.cpp",
    "PermissionCache.cpp",
    "PermissionController.cpp",
]

cc_library {
    name: "libbinder",

    // for vndbinder
    vendor_available: true,
    vndk: {
        enabled: true,
    },
    double_loadable: true,
    host_supported: true,
    // TODO(b/153609531): remove when no longer needed.
    native_bridge_supported: true,

    // TODO(b/31559095): get headers from bionic on host
    include_dirs: [
        "bionic/libc/kernel/android/uapi/",
        "bionic/libc/kernel/uapi/",
    ],

    // libbinder does not offer a stable wire protocol.
    // if a second copy of it is installed, then it may break after security
    // or dessert updates. Instead, apex users should use libbinder_ndk.
    apex_available: [
        "//apex_available:platform",
    ],

    srcs: [
        "Binder.cpp",
        "BpBinder.cpp",
        "BufferedTextOutput.cpp",
        "Debug.cpp",
        "IInterface.cpp",
        "IMemory.cpp",
        "IPCThreadState.cpp",
        "IResultReceiver.cpp",
        "IServiceManager.cpp",
        "IShellCallback.cpp",
        "LazyServiceRegistrar.cpp",
        "MemoryBase.cpp",
        "MemoryDealer.cpp",
        "MemoryHeapBase.cpp",
        "Parcel.cpp",
        "ParcelableHolder.cpp",
        "ParcelFileDescriptor.cpp",
        "PersistableBundle.cpp",
        "ProcessState.cpp",
        "RpcAddress.cpp",
        "RpcConnection.cpp",
        "RpcServer.cpp",
        "RpcState.cpp",
        "Static.cpp",
        "Stability.cpp",
        "Status.cpp",
        "TextOutput.cpp",
        "Utils.cpp",
        ":packagemanager_aidl",
        ":libbinder_aidl",
    ],

    target: {
        android: {
            srcs: libbinder_device_interface_sources,

            // NOT static to keep the wire protocol unfrozen
            static: {
                enabled: false,
            },
        },
        vendor: {
            exclude_srcs: libbinder_device_interface_sources,
        },
        darwin: {
            enabled: false,
        },
    },

    aidl: {
        export_aidl_headers: true,
    },

    // TODO(b/142684679): for com.android.media which is compiled
    // as vendor and used as system code.
    use_apex_name_macro: true,

    cflags: [
        "-Wall",
        "-Wextra",
        "-Wextra-semi",
        "-Werror",
        "-Wzero-as-null-pointer-constant",
        "-DANDROID_BASE_UNIQUE_FD_DISABLE_IMPLICIT_CONVERSION",
        "-DANDROID_UTILS_REF_BASE_DISABLE_IMPLICIT_CONSTRUCTION",
    ],
    product_variables: {
        binder32bit: {
            cflags: ["-DBINDER_IPC_32BIT=1"],
        },
    },

    shared_libs: [
        "liblog",
        "libcutils",
        "libutils",
    ],

    header_libs: [
        "libbinder_headers",
    ],

    export_header_lib_headers: [
        "libbinder_headers",
    ],

    clang: true,
    sanitize: {
        misc_undefined: ["integer"],
    },
    min_sdk_version: "29",

    tidy: true,
    tidy_flags: [
        // Only check our headers
        "--header-filter=^.*frameworks/native/libs/binder/.*.h$",
    ],
    tidy_checks: [
        "-performance-no-int-to-ptr",
    ],
    tidy_checks_as_errors: [
        // Explicitly list the checks that should not occur in this module.
        "abseil-*",
        "android-*",
        "bugprone-*",
        "cert-*",
        "clang-analyzer-*",
        "google-*",
        "misc-*",
        "performance*",
        "portability*",
    ],

    pgo: {
        sampling: true,
        profile_file: "libbinder/libbinder.profdata",
    },
}

// AIDL interface between libbinder and framework.jar
filegroup {
    name: "libbinder_aidl",
    srcs: [
        "aidl/android/os/IClientCallback.aidl",
        "aidl/android/os/IServiceCallback.aidl",
        "aidl/android/os/IServiceManager.aidl",
        "aidl/android/os/ServiceDebugInfo.aidl",
    ],
    path: "aidl",
}

filegroup {
    name: "packagemanager_aidl",
    srcs: [
        "aidl/android/content/pm/IPackageChangeObserver.aidl",
        "aidl/android/content/pm/IPackageManagerNative.aidl",
        "aidl/android/content/pm/PackageChangeEvent.aidl",
    ],
    path: "aidl",
}

aidl_interface {
    name: "libbinder_aidl_test_stub",
    unstable: true,
    local_include_dir: "aidl",
    srcs: [":libbinder_aidl"],
    vendor_available: true,
    backend: {
        java: {
            enabled: false,
        },
    },
}

// libbinder historically contained additional interfaces that provided specific
// functionality in the platform but have nothing to do with binder itself. These
// are moved out of libbinder in order to avoid the overhead of their vtables.
// If you are working on or own one of these interfaces, the responsible things
// to would be:
// - give them a new home
// - convert them to AIDL instead of having manually written parceling code

cc_library {
    name: "libbatterystats_aidl",
    srcs: [
        "IBatteryStats.cpp",
    ],
    export_include_dirs: ["include_batterystats"],
    shared_libs: [
        "libbinder",
        "libutils",
    ],
}

cc_library {
    name: "libprocessinfoservice_aidl",
    srcs: [
        "IProcessInfoService.cpp",
        "ProcessInfoService.cpp",
    ],
    export_include_dirs: ["include_processinfo"],
    shared_libs: [
        "libbinder",
        "libutils",
        "liblog",
    ],
}

cc_library {
    name: "libactivitymanager_aidl",
    srcs: [
        "ActivityManager.cpp",
        "IActivityManager.cpp",
        "IUidObserver.cpp",
        ":activity_manager_procstate_aidl",
    ],
    export_include_dirs: ["include_activitymanager"],
    shared_libs: [
        "libbinder",
        "libutils",
        "liblog",
    ],
    aidl: {
        export_aidl_headers: true,
    },
}
