android源码预置apk

来源:互联网 发布:java基础看不懂 编辑:程序博客网 时间:2024/06/05 02:17

本次实践基于android N原生代码,其实没有多大卵用,因为基本每个ROM厂商都有自己的定制方式,但话又说回来,会了总归是好的。

这里我们可以预置包含源码的应用,也可以直接预置第三方apk

增加有源码的应用

Precondition

  • 删除bin目录和gen目录
  • 需要注意,由于android编译的时候,强制检查语言适配,所以,不能直接在布局中使用字符串,而是需要将其写入到strings.xml文件中,然后在布局中引用,否则编译的时候会出现下面的错误
Error: This attribute must be localized

拷贝源码到/package/apps/目录下

添加Android.mk文件

首先在需要添加的应用的根目录下添加Android.mk文件,内容如下:

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_PACKAGE_NAME := AndroidSecurityLOCAL_CERTIFICATE := platform    # platform 表示使用平台签名LOCAL_PRIVILEGED_MODULE := true  # 这里是true,就会预置到/system/priv-app底下LOCAL_SDK_VERSION := currentinclude $(BUILD_PACKAGE)

这里我是拷贝了一份dialer的Android.mk文件,只保留了最基本的需要的

另外还需要在系统源码 /build/target目录对应的文件中增加我们的模块,那么到底是那个文件呢? 这就要根据我们是编译代码的时候lunch的哪一个模拟器了,我在这里选择的是”1. aosp_arm-eng”
所以一定和/build/target/product/aosp_arm.mk文件相关,aosp_arm.mk内容如下:

include $(SRC_TARGET_DIR)/product/full.mkPRODUCT_NAME := aosp_arm

可以看到,这里引用了当前product目录下的full.mk文件,full.mk内容如下

$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk)$(call inherit-product, $(SRC_TARGET_DIR)/board/generic/device.mk)include $(SRC_TARGET_DIR)/product/emulator.mk# OverridesPRODUCT_NAME := fullPRODUCT_DEVICE := genericPRODUCT_BRAND := AndroidPRODUCT_MODEL := AOSP on ARM Emulator

ok,到这里终于找到互联网上说的文件了。

更改device.mk文件

/build/target/board/generic/device.mk文件
在该文件中增加或者更新PRODUCT_PACKAGES的值

PRODUCT_PACKAGES += \    AndroidSecurity \

AndroidSecurity就是我们之前在Android.mk文件中定义的需要编译的模块名称

现在,使用make -j4开启四个线程来全编即可,编译完成之后,使用emulator开启模拟器,然后使用pm list packages来查看我们的应用是否已经在系统里了

内置apk到系统中

这里以”最右”为例,在packages/apps目录下创建”zuiyou”目录,将zuiyou.apk文件拷贝到该目录下,编写Android.mk文件

Android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := zuiyouLOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := $(LOCAL_MODULE).apkLOCAL_MODULE_CLASS := APPSLOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)LOCAL_CERTIFICATE := PRESIGNEDinclude $(BUILD_PREBUILT)

在/build/target/board/generic/device.mk文件中,指定我们的模块即可

批量添加apk

有时候需要内置很多apk文件,下面这种方法极其的简单。

  • 在system目录或者vendor目录下新创建一个目录,这里我创建/system/thirdapk
  • 将需要内置的apk拷贝到/system/thirdapk目录

然后需要在/build/target/product/aosp_arm.mk文件中增加如下内容:

PRODUCT_COPY_FILES +=system/thirdapk/second.apk:/system/app/second/second.apk\        system/thirdapk/third.apk:/system/app/third/third.apk\        system/thirdapk/zuiyou.apk:/system/app/zuiyou/zuiyou.apk include $(SRC_TARGET_DIR)/product/full.mkPRODUCT_NAME := aosp_arm

使用PRODUCT_COPY_FILES的定义,将这三个apk文件在编译生成img文件的时候,拷贝到对应的目录下。

有可能会遇到这样的错误

build/core/Makefile:34: *** Prebuilt apk found in PRODUCT_COPY_FILES: system/thirdapk/second.apk:/system/app/second/second.apk, use BUILD_PREBUILT instead!.

此时gedit build/core/Makefile打开Makefile文件,注释掉该检查,重新编译即可

#define check-product-copy-files#$(if $(filter %.apk, $(call word-colon, 2, $(1))),$(error \#    Prebuilt apk found in PRODUCT_COPY_FILES: $(1), use BUILD_PREBUILT instead!))#endef# filter out the duplicate <source file>:<dest file> pairs.

完成之后可以首先adb shell cd 到system/app目录下,查看是否有我们对应的目录,然后检查内置的apk是否可以正常运行.

0 0
原创粉丝点击