Android 8.1预置APK

本文详细介绍了如何在Android 8.1系统中预置一个没有源码的APK,包括创建对应目录、编写Android.mk文件、修改product.mk文件、处理SO库以及解决编译问题。同时,文中还提到了如何处理预置APK闪退的问题,以及添加静态Java库的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何将一个没有源码的apk预置进系统。

1)     在 package \app\ 下面以需要预置的 APK的 名字创建一个新文件夹,以预制一个名为Test的APK 为例;

2)     将 Test APK的 拷贝到 Test 文件夹下;
3)     在 Test 目录下创建一个名为 Android.mk的文件,内容如下:
LOCAL_PATH:= $(call my-dir)
#Test
include $(CLEAR_VARS)
LOCAL_MODULE := Test
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS

LOCAL_PACKAGE_NAME := Test
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_PRIVILEGED_MODULE := true
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

include $(BUILD_PREBUILT)

4)    打开文件 build/target/product/${Project}.mk (其中 ${Project} 表示工程名),我的是core.mk;将 Test 添加到 PRODUCT_PACKAGES 里面.

如果该APK有.so的库文件,则解压出库文件,加入(其中lib/armeabi-v7a为so文件所在的目录)

LOCAL_PREBUILT_JNI_LIBS:= \
     lib/armeabi-v7a/libapcontroller_android.so \
     lib/armeabi-v7a/libapsdk.so \
     lib/armeabi-v7a/libbugsnag-ndk.so \
     lib/armeabi-v7a/libccm.so \
     lib/armeabi-v7a/libgnustl_shared.so \
     lib/armeabi-v7a/libimagepipeline.so \
     lib/armeabi-v7a/libMovePlayerController.so \
     lib/armeabi-v7a/libsgsdk.so \
     lib/armeabi-v7a/libslingnp.so \
     lib/armeabi-v7a/libstlport_shared.so \

解压库文件的方法:将apk文件重命名为.zip文件,解压缩,其中lib 下的文件就是库文件.

 

在Android8.1预置apk时,出现点击预置apk闪退,提示在该路径下找不到类的情况的,用ADB命令安装就可以使用,可把我搞的懵逼了,搜索了大量的资料说可以是系统与预置的apk的位数不同,因为在6.0的时候Android就区分了32位与64位的系统。但是最终都没有能解决我的问题,最后想着直接把apk拷贝到system目录下算了,没有想到还真可以。以下是我的做法:

(1)下载需要的apk并安装,使用命令进入安装路径,把该路径下的apk 、lib/ 、oat/文件拷贝出来;

(2)新建一个文件夹,以apk 的名字命名,再将这三个文件放入文件夹下,将该文件放在任意文件下,我是放在vendor目录下;

(3)在.mk文件中加入如下语句:

PRODUCT_COPY_FILES += \
       vendor/apps/testapk/lib/arm/libbctoolbox.so:system/app/testapk/lib/arm/libbctoolbox.so  \  #(拷贝so文件到system目录)
       vendor/apps/testapk/oat/arm/base.odex:system/app/testapk/oat/arm/base.odex  \       #(拷贝lib/文件到system目录)
       vendor/apps/testapk/oat/arm/base.vdex:system/app/testapk/oat/arm/base.vdex   \        #(拷贝lib/文件到system目录)
       vendor/apps/testapk/testapk.apk:system/app/testapk/testapk.apk                #(拷贝apk文件到system目录)
       
       (注:该方法只是拷贝apk 、lib/ 、 oat/ 到system目录下,并没有做任何的apk预编译操作)

make编译,会出现”build/core/Makefile:34: error: Prebuilt apk found in PRODUCT_COPY_FILES: vendor/partner_gms/apps/Netflix/Netflix.apk:system/app/Netflix/Netflix.apk, use BUILD_PREBUILT instance "

解决方法:

 gedit build/core/Makefile
#Tommy Delete  删除如下代码
#define check-product-copy-files
#$(if $(filter %.apk, $(1)),$(error 
#    Prebuilt apk found in PRODUCT_COPY_FILES: $(1), use BUILD_PREBUILT #instead!))
#endef

编译OK

(注:出现这种错误是由于用的谷歌官方的AOSP脚本导致 的,因为官方的build/core/makefile规则文件包含了校验,其中就有一段是校验拷贝的程序是否为apk,如果是,就被禁止。那么只需要修 改这个脚本,屏蔽掉这条命令即可,不影响系统和其他编译。)

 

 

如果需要添加jar:

(1)在Android新建一个libs文件,在libs文件下存放需要的jar文件,以android-support-v7-appcompat.jar为例;

(2)在Android.mk 文件中添加LOCAL_STATIC_JAVA_LIBRARIES 属性;例

include $(CLEAR_VARS)
LOCAL_MODULE := Test
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS

LOCAL_PACKAGE_NAME := Test
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_PRIVILEGED_MODULE := true
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

LOCAL_STATIC_JAVA_LIBRARIES := android-support-v7-appcompat 

include $(BUILD_PREBUILT)

(3)添加jar静态库的预编译规则

include $(CLEAR_VARS)
# 构建依赖的jar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := android-support-v7-appcompat :libs/android-support-v7-appcompat .jar

include $(BUILD_MULTI_PREBUILT)

 

 

完整的Android.mk 文件为:

include $(CLEAR_VARS)
LOCAL_MODULE := Test
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS

LOCAL_PACKAGE_NAME := Test
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_PRIVILEGED_MODULE := true
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

LOCAL_STATIC_JAVA_LIBRARIES := android-support-v7-appcompat 

include $(BUILD_PREBUILT)

 

include $(CLEAR_VARS)
# 构建依赖的jar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := android-support-v7-appcompat :libs/android-support-v7-appcompat .jar

include $(BUILD_MULTI_PREBUILT)

 

参考博客:https://blog.youkuaiyun.com/u011168565/article/details/52117735

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值