Android 不同版本通过mk拷贝并安装APK

目录

前景

解决思路

注意事项

Android 11

Android 9


前景

工作中,有时APK通过系统编译的方式包进系统会丢失so库或者lib包,导致APK无法正常运行;

但手动安装就不会出现这个问题.

解决思路

可以使用一个取巧的方式解决这个问题.

①在系统编译中只进行拷贝,不直接安装Demo.apk.

PRODUCT_COPY_FILES += \vendor/apps/Demo.apk:vendor/Demo.apk

②在开机阶段任意 .rc 文件中通过 pm 指令安装Demo.apk.

on property:sys.boot_completed=1 
    exec u:r:shell:s0  root  root -- /system/bin/pm install /vendor/Demo.apk

注意事项

①Android 系统在默认情况下,是不允许拷贝Apk文件的!!!会有以下的错误信息.

build/make/core/Makefile:49: 
error: Prebuilt apk found in PRODUCT_COPY_FILES: vendor/Demo.apk:vendor/Demo.apk, 
use BUILD_PREBUILT instead!.

出现此问题的原因是Android不允许使用mk拷贝APK文件,推荐的方式是使用Android.mk直接安装.

但是如何跳过此权限,在mk中拷贝APK文件进而在rc文件中安装呢?

Android 11

diff --git a/build/make/core/Makefile b/build/make/core/Makefile
old mode 100644
new mode 100755
index d0ecf262b6..670b65d96c
--- a/build/make/core/Makefile
+++ b/build/make/core/Makefile
@@ -13,32 +13,32 @@ LOCAL_PATH := $(BUILD_SYSTEM)
 # src:dest pair is the first one to match the same dest"
 #$(1): the src:dest pair
 #$(2): the dest
-define check-product-copy-files
-$(if $(filter-out $(TARGET_COPY_OUT_SYSTEM_OTHER)/%,$(2)), \
-  $(if $(filter %.apk, $(2)),$(error \
-     Prebuilt apk found in PRODUCT_COPY_FILES: $(1), use BUILD_PREBUILT instead!))) \
-$(if $(filter true,$(BUILD_BROKEN_VINTF_PRODUCT_COPY_FILES)),, \
-  $(if $(filter $(TARGET_COPY_OUT_SYSTEM)/etc/vintf/% \
-                $(TARGET_COPY_OUT_SYSTEM)/manifest.xml \
-                $(TARGET_COPY_OUT_SYSTEM)/compatibility_matrix.xml,$(2)), \
-    $(error VINTF metadata found in PRODUCT_COPY_FILES: $(1), use vintf_fragments instead!)) \
-  $(if $(filter $(TARGET_COPY_OUT_PRODUCT)/etc/vintf/%,$(2)), \
-    $(error VINTF metadata found in PRODUCT_COPY_FILES: $(1), \
-      use PRODUCT_MANIFEST_FILES / DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE / vintf_compatibility_matrix / vintf_fragments instead!)) \
-  $(if $(filter $(TARGET_COPY_OUT_SYSTEM_EXT)/etc/vintf/%,$(2)), \
-    $(error VINTF metadata found in PRODUCT_COPY_FILES: $(1), \
-      use vintf_compatibility_matrix / vintf_fragments instead!)) \
-  $(if $(filter $(TARGET_COPY_OUT_VENDOR)/etc/vintf/% \
-                $(TARGET_COPY_OUT_VENDOR)/manifest.xml \
-                $(TARGET_COPY_OUT_VENDOR)/compatibility_matrix.xml,$(2)), \
-    $(error VINTF metadata found in PRODUCT_COPY_FILES: $(1), \
-      use DEVICE_MANIFEST_FILE / DEVICE_MATRIX_FILE / vintf_compatibility_matrix / vintf_fragments instead!)) \
-  $(if $(filter $(TARGET_COPY_OUT_ODM)/etc/vintf/% \
-                $(TARGET_COPY_OUT_ODM)/etc/manifest%,$(2)), \
-    $(error VINTF metadata found in PRODUCT_COPY_FILES: $(1), \
-      use ODM_MANIFEST_FILES / vintf_fragments instead!)) \
-)
-endef
+# define check-product-copy-files
+# $(if $(filter-out $(TARGET_COPY_OUT_SYSTEM_OTHER)/%,$(2)), \
+  # $(if $(filter %.apk, $(2)),$(error \
+     # Prebuilt apk found in PRODUCT_COPY_FILES: $(1), use BUILD_PREBUILT instead!))) \
+# $(if $(filter true,$(BUILD_BROKEN_VINTF_PRODUCT_COPY_FILES)),, \
+  # $(if $(filter $(TARGET_COPY_OUT_SYSTEM)/etc/vintf/% \
+                # $(TARGET_COPY_OUT_SYSTEM)/manifest.xml \
+                # $(TARGET_COPY_OUT_SYSTEM)/compatibility_matrix.xml,$(2)), \
+    # $(error VINTF metadata found in PRODUCT_COPY_FILES: $(1), use vintf_fragments instead!)) \
+  # $(if $(filter $(TARGET_COPY_OUT_PRODUCT)/etc/vintf/%,$(2)), \
+    # $(error VINTF metadata found in PRODUCT_COPY_FILES: $(1), \
+      # use PRODUCT_MANIFEST_FILES / DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE / vintf_compatibility_matrix / vintf_fragments instead!)) \
+  # $(if $(filter $(TARGET_COPY_OUT_SYSTEM_EXT)/etc/vintf/%,$(2)), \
+    # $(error VINTF metadata found in PRODUCT_COPY_FILES: $(1), \
+      # use vintf_compatibility_matrix / vintf_fragments instead!)) \
+  # $(if $(filter $(TARGET_COPY_OUT_VENDOR)/etc/vintf/% \
+                # $(TARGET_COPY_OUT_VENDOR)/manifest.xml \
+                # $(TARGET_COPY_OUT_VENDOR)/compatibility_matrix.xml,$(2)), \
+    # $(error VINTF metadata found in PRODUCT_COPY_FILES: $(1), \
+      # use DEVICE_MANIFEST_FILE / DEVICE_MATRIX_FILE / vintf_compatibility_matrix / vintf_fragments instead!)) \
+  # $(if $(filter $(TARGET_COPY_OUT_ODM)/etc/vintf/% \
+                # $(TARGET_COPY_OUT_ODM)/etc/manifest%,$(2)), \
+    # $(error VINTF metadata found in PRODUCT_COPY_FILES: $(1), \
+      # use ODM_MANIFEST_FILES / vintf_fragments instead!)) \
+# )
+# endef
 # filter out the duplicate <source file>:<dest file> pairs.
 unique_product_copy_files_pairs :=
 $(foreach cf,$(PRODUCT_COPY_FILES), \

Android 9

#define check-product-copy-files
#$(if $(filter-out $(TARGET_COPY_OUT_SYSTEM_OTHER)/%,$(2)), \
#  $(if $(filter %.apk, $(2)),$(error \
#     Prebuilt apk found in PRODUCT_COPY_FILES: $(1), use BUILD_PREBUILT instead!)))
#endef

综上,主要是 buil/make/core/Makefile 文件中定义了.mk文件的执行规则,只需要注释掉  check-product-copy-files  中的 如下判断即可成功拷贝.

$(if $(filter %.apk, $(2)),$(error \
#     Prebuilt apk found in PRODUCT_COPY_FILES: $(1), use BUILD_PREBUILT instead!)))

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brave & Real

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值