diff --git a/mediapipe/java/com/google/mediapipe/mediapipe_aar.bzl b/mediapipe/java/com/google/mediapipe/mediapipe_aar.bzl index 9b01e2f0..645e8b72 100644 --- a/mediapipe/java/com/google/mediapipe/mediapipe_aar.bzl +++ b/mediapipe/java/com/google/mediapipe/mediapipe_aar.bzl @@ -1,4 +1,4 @@ -# Copyright 2019-2020 The MediaPipe Authors. +# Copyright 2019-2022 The MediaPipe Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -209,9 +209,9 @@ def _mediapipe_jni(name, gen_libmediapipe, calculators = []): def mediapipe_build_aar_with_jni(name, android_library): """Builds MediaPipe AAR with jni. - Args: - name: The bazel target name. - android_library: the android library that contains jni. + Args: + name: The bazel target name. + android_library: the android library that contains jni. """ # Generates dummy AndroidManifest.xml for dummy apk usage @@ -328,19 +328,14 @@ def mediapipe_java_proto_srcs(name = ""): src_out = "com/google/mediapipe/proto/MediaPipeOptionsProto.java", )) - proto_src_list.append(mediapipe_java_proto_src_extractor( - target = "//mediapipe/framework/formats:landmark_java_proto_lite", - src_out = "com/google/mediapipe/formats/proto/LandmarkProto.java", - )) - proto_src_list.append(mediapipe_java_proto_src_extractor( target = "//mediapipe/framework/formats/annotation:rasterization_java_proto_lite", src_out = "com/google/mediapipe/formats/annotation/proto/RasterizationProto.java", )) proto_src_list.append(mediapipe_java_proto_src_extractor( - target = "//mediapipe/framework/formats:location_data_java_proto_lite", - src_out = "com/google/mediapipe/formats/proto/LocationDataProto.java", + target = "//mediapipe/framework/formats:classification_java_proto_lite", + src_out = "com/google/mediapipe/formats/proto/ClassificationProto.java", )) proto_src_list.append(mediapipe_java_proto_src_extractor( @@ -349,8 +344,18 @@ def mediapipe_java_proto_srcs(name = ""): )) proto_src_list.append(mediapipe_java_proto_src_extractor( - target = "//mediapipe/framework/formats:classification_java_proto_lite", - src_out = "com/google/mediapipe/formats/proto/ClassificationProto.java", + target = "//mediapipe/framework/formats:landmark_java_proto_lite", + src_out = "com/google/mediapipe/formats/proto/LandmarkProto.java", + )) + + proto_src_list.append(mediapipe_java_proto_src_extractor( + target = "//mediapipe/framework/formats:location_data_java_proto_lite", + src_out = "com/google/mediapipe/formats/proto/LocationDataProto.java", + )) + + proto_src_list.append(mediapipe_java_proto_src_extractor( + target = "//mediapipe/framework/formats:rect_java_proto_lite", + src_out = "com/google/mediapipe/formats/proto/RectProto.java", )) return proto_src_list diff --git a/mediapipe/tasks/java/BUILD b/mediapipe/tasks/java/BUILD index 02451073..7e628326 100644 --- a/mediapipe/tasks/java/BUILD +++ b/mediapipe/tasks/java/BUILD @@ -1 +1,15 @@ -# dummy file for tap test to find the pattern +# Copyright 2022 The MediaPipe Authors. All Rights Reserved. +# +# 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. + +licenses(["notice"]) diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/BUILD b/mediapipe/tasks/java/com/google/mediapipe/tasks/BUILD new file mode 100644 index 00000000..7e628326 --- /dev/null +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/BUILD @@ -0,0 +1,15 @@ +# Copyright 2022 The MediaPipe Authors. All Rights Reserved. +# +# 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. + +licenses(["notice"]) diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/core/BUILD b/mediapipe/tasks/java/com/google/mediapipe/tasks/core/BUILD index b4ebfe8c..cb9d6742 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/core/BUILD +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/core/BUILD @@ -36,3 +36,15 @@ android_library( "@maven//:com_google_guava_guava", ], ) + +load("//mediapipe/tasks/java/com/google/mediapipe/tasks:mediapipe_tasks_aar.bzl", "mediapipe_tasks_core_aar") + +mediapipe_tasks_core_aar( + name = "tasks_core", + srcs = glob(["*.java"]) + [ + "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:java_src", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/processors:java_src", + "//mediapipe/java/com/google/mediapipe/framework/image:java_src", + ], + manifest = "AndroidManifest.xml", +) diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/mediapipe_tasks_aar.bzl b/mediapipe/tasks/java/com/google/mediapipe/tasks/mediapipe_tasks_aar.bzl new file mode 100644 index 00000000..e0b9c79e --- /dev/null +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/mediapipe_tasks_aar.bzl @@ -0,0 +1,211 @@ +# Copyright 2022 The MediaPipe Authors. All Rights Reserved. +# +# 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. + +"""Building MediaPipe Tasks AARs.""" + +load("//mediapipe/java/com/google/mediapipe:mediapipe_aar.bzl", "mediapipe_build_aar_with_jni", "mediapipe_java_proto_src_extractor", "mediapipe_java_proto_srcs") +load("@build_bazel_rules_android//android:rules.bzl", "android_library") + +_CORE_TASKS_JAVA_PROTO_LITE_TARGETS = [ + "//mediapipe/tasks/cc/components/containers/proto:category_java_proto_lite", + "//mediapipe/tasks/cc/components/containers/proto:classifications_java_proto_lite", + "//mediapipe/tasks/cc/components/containers/proto:embeddings_java_proto_lite", + "//mediapipe/tasks/cc/components/containers/proto:landmarks_detection_result_java_proto_lite", + "//mediapipe/tasks/cc/components/processors/proto:classifier_options_java_proto_lite", + "//mediapipe/tasks/cc/core/proto:acceleration_java_proto_lite", + "//mediapipe/tasks/cc/core/proto:base_options_java_proto_lite", + "//mediapipe/tasks/cc/core/proto:external_file_java_proto_lite", +] + +_VISION_TASKS_JAVA_PROTO_LITE_TARGETS = [ + "//mediapipe/tasks/cc/vision/object_detector/proto:object_detector_options_java_proto_lite", + "//mediapipe/tasks/cc/vision/image_classifier/proto:image_classifier_graph_options_java_proto_lite", + "//mediapipe/tasks/cc/vision/gesture_recognizer/proto:gesture_classifier_graph_options_java_proto_lite", + "//mediapipe/tasks/cc/vision/gesture_recognizer/proto:gesture_embedder_graph_options_java_proto_lite", + "//mediapipe/tasks/cc/vision/gesture_recognizer/proto:gesture_recognizer_graph_options_java_proto_lite", + "//mediapipe/tasks/cc/vision/gesture_recognizer/proto:hand_gesture_recognizer_graph_options_java_proto_lite", + "//mediapipe/tasks/cc/vision/hand_detector/proto:hand_detector_graph_options_java_proto_lite", + "//mediapipe/tasks/cc/vision/hand_landmarker/proto:hand_landmarker_graph_options_java_proto_lite", + "//mediapipe/tasks/cc/vision/hand_landmarker/proto:hand_landmarks_detector_graph_options_java_proto_lite", +] + +def mediapipe_tasks_core_aar(name, srcs, manifest): + """Builds medaipipe tasks core AAR. + + Args: + name: The bazel target name. + srcs: MediaPipe Tasks' core layer source files. + manifest: The Android manifest. + """ + + mediapipe_tasks_java_proto_srcs = [] + for target in _CORE_TASKS_JAVA_PROTO_LITE_TARGETS: + mediapipe_tasks_java_proto_srcs.append( + _mediapipe_tasks_java_proto_src_extractor(target = target), + ) + + for target in _VISION_TASKS_JAVA_PROTO_LITE_TARGETS: + mediapipe_tasks_java_proto_srcs.append( + _mediapipe_tasks_java_proto_src_extractor(target = target), + ) + + mediapipe_tasks_java_proto_srcs.append(mediapipe_java_proto_src_extractor( + target = "//mediapipe/calculators/core:flow_limiter_calculator_java_proto_lite", + src_out = "com/google/mediapipe/calculator/proto/FlowLimiterCalculatorProto.java", + )) + + mediapipe_tasks_java_proto_srcs.append(mediapipe_java_proto_src_extractor( + target = "//mediapipe/calculators/tensor:inference_calculator_java_proto_lite", + src_out = "com/google/mediapipe/calculator/proto/InferenceCalculatorProto.java", + )) + + android_library( + name = name, + srcs = srcs + [ + "//mediapipe/java/com/google/mediapipe/framework:java_src", + ] + mediapipe_java_proto_srcs() + + mediapipe_tasks_java_proto_srcs, + javacopts = [ + "-Xep:AndroidJdkLibsChecker:OFF", + ], + manifest = manifest, + deps = [ + "//mediapipe/calculators/core:flow_limiter_calculator_java_proto_lite", + "//mediapipe/calculators/tensor:inference_calculator_java_proto_lite", + "//mediapipe/framework:calculator_java_proto_lite", + "//mediapipe/framework:calculator_profile_java_proto_lite", + "//mediapipe/framework:calculator_options_java_proto_lite", + "//mediapipe/framework:mediapipe_options_java_proto_lite", + "//mediapipe/framework:packet_factory_java_proto_lite", + "//mediapipe/framework:packet_generator_java_proto_lite", + "//mediapipe/framework:status_handler_java_proto_lite", + "//mediapipe/framework:stream_handler_java_proto_lite", + "//mediapipe/framework/formats:classification_java_proto_lite", + "//mediapipe/framework/formats:detection_java_proto_lite", + "//mediapipe/framework/formats:landmark_java_proto_lite", + "//mediapipe/framework/formats:location_data_java_proto_lite", + "//mediapipe/framework/formats:rect_java_proto_lite", + "//mediapipe/java/com/google/mediapipe/framework:android_framework", + "//mediapipe/java/com/google/mediapipe/framework/image", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/core/jni:model_resources_cache_jni", + "//third_party:androidx_annotation", + "//third_party:autovalue", + "@com_google_protobuf//:protobuf_javalite", + "@maven//:com_google_guava_guava", + "@maven//:com_google_flogger_flogger", + "@maven//:com_google_flogger_flogger_system_backend", + "@maven//:com_google_code_findbugs_jsr305", + ] + _CORE_TASKS_JAVA_PROTO_LITE_TARGETS + _VISION_TASKS_JAVA_PROTO_LITE_TARGETS, + ) + +def mediapipe_tasks_vision_aar(name, srcs, native_library): + """Builds medaipipe tasks vision AAR. + + Args: + name: The bazel target name. + srcs: MediaPipe Vision Tasks' source files. + native_library: The native library that contains vision tasks' graph and calculators. + """ + + native.genrule( + name = name + "tasks_manifest_generator", + outs = ["AndroidManifest.xml"], + cmd = """ +cat > $(OUTS) < + + + +EOF +""", + ) + + _mediapipe_tasks_aar( + name = name, + srcs = srcs, + manifest = "AndroidManifest.xml", + java_proto_lite_targets = _CORE_TASKS_JAVA_PROTO_LITE_TARGETS + _VISION_TASKS_JAVA_PROTO_LITE_TARGETS, + native_library = native_library, + ) + +def _mediapipe_tasks_aar(name, srcs, manifest, java_proto_lite_targets, native_library): + """Builds medaipipe tasks AAR.""" + + # When "--define EXCLUDE_OPENCV_SO_LIB=1" is set in the build command, + # the OpenCV so libraries will be excluded from the AAR package to + # save the package size. + native.config_setting( + name = "exclude_opencv_so_lib", + define_values = { + "EXCLUDE_OPENCV_SO_LIB": "1", + }, + visibility = ["//visibility:public"], + ) + + native.cc_library( + name = name + "_jni_opencv_cc_lib", + srcs = select({ + "//mediapipe:android_arm64": ["@android_opencv//:libopencv_java3_so_arm64-v8a"], + "//mediapipe:android_armeabi": ["@android_opencv//:libopencv_java3_so_armeabi-v7a"], + "//mediapipe:android_arm": ["@android_opencv//:libopencv_java3_so_armeabi-v7a"], + "//mediapipe:android_x86": ["@android_opencv//:libopencv_java3_so_x86"], + "//mediapipe:android_x86_64": ["@android_opencv//:libopencv_java3_so_x86_64"], + "//conditions:default": [], + }), + alwayslink = 1, + ) + + android_library( + name = name + "_android_lib", + srcs = srcs, + manifest = manifest, + proguard_specs = ["//mediapipe/java/com/google/mediapipe/framework:proguard.pgcfg"], + deps = java_proto_lite_targets + [native_library] + [ + "//mediapipe/java/com/google/mediapipe/framework:android_framework", + "//mediapipe/java/com/google/mediapipe/framework/image", + "//mediapipe/framework:calculator_options_java_proto_lite", + "//mediapipe/framework:calculator_java_proto_lite", + "//mediapipe/framework/formats:classification_java_proto_lite", + "//mediapipe/framework/formats:detection_java_proto_lite", + "//mediapipe/framework/formats:landmark_java_proto_lite", + "//mediapipe/framework/formats:location_data_java_proto_lite", + "//mediapipe/framework/formats:rect_java_proto_lite", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:detection", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:category", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:classification_entry", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:classifications", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/containers:landmark", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/components/processors:classifieroptions", + "//mediapipe/tasks/java/com/google/mediapipe/tasks/core", + "//third_party:autovalue", + "@maven//:com_google_guava_guava", + ] + select({ + "//conditions:default": [":" + name + "_jni_opencv_cc_lib"], + "//mediapipe/framework/port:disable_opencv": [], + "exclude_opencv_so_lib": [], + }), + ) + + mediapipe_build_aar_with_jni(name, name + "_android_lib") + +def _mediapipe_tasks_java_proto_src_extractor(target): + proto_path = "com/google/" + target.split(":")[0].replace("cc/", "").replace("//", "").replace("_", "") + "/" + proto_name = target.split(":")[-1].replace("_java_proto_lite", "").replace("_", " ").title().replace(" ", "") + "Proto.java" + return mediapipe_java_proto_src_extractor( + target = target, + src_out = proto_path + proto_name, + ) diff --git a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/BUILD b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/BUILD index 2bdcc252..5ea465d4 100644 --- a/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/BUILD +++ b/mediapipe/tasks/java/com/google/mediapipe/tasks/vision/BUILD @@ -141,3 +141,11 @@ android_library( "@maven//:com_google_guava_guava", ], ) + +load("//mediapipe/tasks/java/com/google/mediapipe/tasks:mediapipe_tasks_aar.bzl", "mediapipe_tasks_vision_aar") + +mediapipe_tasks_vision_aar( + name = "tasks_vision", + srcs = glob(["**/*.java"]), + native_library = ":libmediapipe_tasks_vision_jni_lib", +)