提示:MTK-Android12拷贝apk文件到指定目录-如system目录下
文章目录
前言
这里讲一个拷贝操作,就是拷贝apk 文件到指定目录或者拷贝到自定义的目录
一、需求
MTK-Android12拷贝apk文件到指定目录-如system目录下。 最终关联的需求是:预制apk 到指定目录,
- 是为了给客户准备资源,客户上层应用端有自己的业务逻辑。
- 大多数情况下就是为了实现预安装、引用自己点击点击安装。
为什么不做预安装,直接内置到系统里面去不就行了嘛,问题是:很多app ,特别是低版本、签名等各种原因导致 内置不成功,又不愿意仔细核查问题解决或者解决困难,那么就直接模拟adb install ;pm install直接命令安装了。
二、困难点
以前搞过那么多也总结过那么多的笔记,核心点:
- 搞清楚Android、Linux 体系下的分区的概念,每个分区是做什么的。搞清楚分区基本的概念、作用、创建时机 等基础知识点。 不然 总觉得自己没问题,实际操作下来就是看不到想要的结果,徒劳。
- 搞清楚普通文件和特殊文件(apk、可执行文件)等对于Android体系下它就判定你是特殊文件,特殊文件在高版本Android11 之后基本上就因为安全机制不允许作为普通拷贝机制来实现了。 所以,要了解并理解这些基本知识点,不然又是徒劳。
对于 分区概念,参考之前笔记:系统拷贝文件到data分区-/data/system目录-实战拷贝资源到vendor分区

三、参考资料-关联资料
参考资料
如下是之前的一些 拷贝相关的笔记,
- 有必要了解一下,特别是分区;
- 可以参考然后有个思路,实际还是得实践;
- 相关的拷贝需求,可以拿来即用的,思想永远不会变的。
开机内置拷贝二进制文件到/system/bin目录-并实现开机自启二进制脚本服务
预制资源-拷贝文件-/system/lib/ 目录-拷贝可执行文件/system/bin/-拷贝文件到/system/etc/permissions目录
系统拷贝文件到data分区-/data/system目录-实战拷贝资源到vendor分区
Rk-内置应用作为系统Launcher-内置APK-拷贝文件-替换开机动画
拷贝预置资源到vendor分区-/vendor/lib目录/vendor/lib/hw目录-vendor/etc目录-拷贝可执行文件配置
系统拷贝预置资源-拷贝到/system/bin目录-拷贝可执行文件并启动-拷贝到product/etc分区-拷贝到system/etc分区
实现需求思路
如上参考资料还是有必要看的,特别是基础比较弱的,有基础的可以直接略过。
那么基本思路:
- 直接预编译的方式实现
- 在编译的过程中拷贝特殊文件
apk格式的文件
具体来说:如下,写成模块方式,然后在系统配置文件中配置文件


四、实现方案
配置copy脚本-模块

java
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := preinstall_apk
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := 2_37a55513dd063cbc9527e73f7c0603d1.apk
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT)/preloadapp
LOCAL_INSTALLED_MODULE_STEM := 2_37a55513dd063cbc9527e73f7c0603d1.apk
include $(BUILD_PREBUILT)
配置的另外一个拷贝脚本模块,如下:

java
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := copy_apk_folder
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := 2_a7d8ca7072b82c5d927eadb352510166.apk
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT)/preloadapp
LOCAL_INSTALLED_MODULE_STEM := 2_a7d8ca7072b82c5d927eadb352510166.apk
include $(BUILD_PREBUILT)
配置预编译模块到系统
路径:/device/mediatek/system/common/device.mk,其实就是配置预编译的模块
java
PRODUCT_PACKAGES += preinstall_apk
PRODUCT_PACKAGES += copy_apk_folder

五、实验结果验证
1、源码验证-编译结果验证
源文件如红色标记,编译后生成对应到对应的目录如黄色标记。

生成的文件路径:
java
/out_sys/target/product/mssi_64_cn/obj/PACKAGING/target_files_intermediates/sys_mssi_64_cn-target_files-1rck61v164bspP17/SYSTEM/preloadapp/
/out_sys/target/product/mssi_64_cn/obj/PACKAGING/system_target_files_intermediates/sys_mssi_64_cn-system_target_files/SYSTEM/preloadapp/
/out_sys/target/product/mssi_64_cn/system/preloadapp/
2、源码验证-避坑指南
如上,看编译后拷贝的文件目录,是 out_sys,并不是out 目录, 这个跟分区有关系,我们是直接拷贝到system 目录下,然后自动创建了一个preloadapp文件夹,所以切不可在out 目录里面找呀找,怎么都找不到,位置搞错了。
3、机器开机后-验证结果
java
C:\Users\Administrator>adb shell
k69v1_64_k419:/ $ su
k69v1_64_k419:/ # cd /system/preloadapp
k69v1_64_k419:/system/preloadapp # ls -l
total 275348
-rw-r--r-- 1 root root 154939703 2009-01-01 08:00 2_37a55513dd063cbc9527e73f7c0603d1.apk
-rw-r--r-- 1 root root 127045232 2009-01-01 08:00 2_a7d8ca7072b82c5d927eadb352510166.apk

总结
- 这篇知识点实际上还是一个拷贝的技能点,在实际需求中常见,但是这里拷贝的是特殊的文件
apk文件,需要对特殊文件拷贝有一定的概念和掌握 - 实际的拷贝知识点涉及到分区知识点、拷贝文件格式、拷贝位置、拷贝方式的一些必备知识点,需要掌握
- 拿来主义,拿着直接用,遇到问题自己多思考,然后掌握基本技能