Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2290cbf8 authored by Ying Wang's avatar Ying Wang Committed by Android (Google) Code Review
Browse files

Merge "Support to extract JNI libs from prebuilt APK"

parents 141ed582 74eb6600
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@ LOCAL_COMPRESS_MODULE_SYMBOLS:=
LOCAL_STRIP_MODULE:=
LOCAL_JNI_SHARED_LIBRARIES:=
LOCAL_JNI_SHARED_LIBRARIES_ABI:=
LOCAL_PREBUILT_JNI_LIBS:=
LOCAL_JAR_MANIFEST:=
LOCAL_INSTRUMENTATION_FOR:=
LOCAL_APK_LIBRARIES:=
+39 −3
Original line number Diff line number Diff line
@@ -5,9 +5,11 @@
#   rs_compatibility_jni_libs (from java.mk)
#   my_module_path (from base_rules.mk)
#   partition_tag (from base_rules.mk)
#   my_prebuilt_src_file (from prebuilt_internal.mk)
#
# Output variables:
#   jni_shared_libraries, jni_shared_libraries_abi, if we are going to embed the libraries into the apk.
#   jni_shared_libraries, jni_shared_libraries_abi, if we are going to embed the libraries into the apk;
#   my_extracted_jni_libs, if we extract jni libs from prebuilt apk.
#

jni_shared_libraries := \
@@ -33,6 +35,10 @@ ifeq ($(filter $(TARGET_OUT)/% $(TARGET_OUT_VENDOR)/% $(TARGET_OUT_OEM)/%, $(my_
my_embed_jni := true
endif

# App-specific lib path.
my_app_lib_path :=  $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET$(partition_tag)_OUT_SHARED_LIBRARIES)/$(basename $(LOCAL_INSTALLED_MODULE_STEM))
my_extracted_jni_libs :=

ifdef my_embed_jni
# App explicitly requires the prebuilt NDK stl shared libraies.
# The NDK stl shared libraries should never go to the system image.
@@ -74,7 +80,6 @@ my_leading_separator := ;
else
my_leading_separator :=
endif
my_app_lib_path :=  $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET$(partition_tag)_OUT_SHARED_LIBRARIES)/$(basename $(LOCAL_INSTALLED_MODULE_STEM))
$(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD += \
  $(my_leading_separator)mkdir -p $(my_app_lib_path) \
  $(foreach lib, $(my_jni_filenames), ;ln -sf ../$(lib) $(my_app_lib_path)/$(lib))
@@ -83,3 +88,34 @@ $(LOCAL_INSTALLED_MODULE): PRIVATE_POST_INSTALL_CMD += \
jni_shared_libraries :=
endif  # $(jni_shared_libraries) not empty
endif  # my_embed_jni

ifdef LOCAL_PREBUILT_JNI_LIBS
# Install prebuilt JNI libs to the app specific lib path.
# Files like @path/to/libfoo.so (path inside the apk) are JNI libs extracted from the prebuilt apk;
# Files like path/to/libfoo.so (path relative to LOCAL_PATH) are prebuilts in the source tree.
my_extracted_jni_libs := $(patsubst @%,%, \
    $(filter @%, $(LOCAL_PREBUILT_JNI_LIBS)))
ifdef my_extracted_jni_libs
ifndef my_prebuilt_src_file
$(error No prebuilt apk to extract prebuilt jni libraries $(my_extracted_jni_libs))
endif
# We use the first jni lib file as dependency.
my_installed_prebuilt_jni := $(my_app_lib_path)/$(notdir $(firstword $(my_extracted_jni_libs)))
$(my_installed_prebuilt_jni): PRIVATE_JNI_LIBS := $(my_extracted_jni_libs)
$(my_installed_prebuilt_jni): $(my_prebuilt_src_file)
	@echo "Extract JNI libs ($@ <- $<)"
	@mkdir -p $(dir $@)
	$(hide) unzip -j -o -d $(dir $@) $< $(PRIVATE_JNI_LIBS) && touch $@

$(LOCAL_INSTALLED_MODULE) : | $(my_installed_prebuilt_jni)
endif

my_prebulit_jni_libs := $(addprefix $(LOCAL_PATH)/, \
    $(filter-out @%, $(LOCAL_PREBUILT_JNI_LIBS)))
ifdef my_prebulit_jni_libs
$(foreach lib, $(my_prebulit_jni_libs), \
    $(eval $(call copy-one-file, $(lib), $(my_app_lib_path)/$(notdir $(lib)))))

$(LOCAL_INSTALLED_MODULE) : | $(addprefix $(my_app_lib_path)/, $(notdir $(my_prebulit_jni_libs)))
endif
endif  # LOCAL_PREBULT_JNI_LIBS
+3 −0
Original line number Diff line number Diff line
@@ -172,6 +172,9 @@ endif # LOCAL_DEX_PREOPT
# Sign and align non-presigned .apks.
$(built_module) : $(my_prebuilt_src_file) | $(ACP) $(ZIPALIGN) $(SIGNAPK_JAR)
	$(transform-prebuilt-to-target)
ifdef my_extracted_jni_libs
	$(hide) zip -d $@ 'lib/*.so'  # strip embedded JNI libraries.
endif
ifneq ($(LOCAL_CERTIFICATE),PRESIGNED)
	$(sign-package)
endif