字节跳动面试:Android-系统预设-App,有什么难的?

Android 系统预置 APP 是做 Framework 应用开发经常会遇到的工作,预置 APP 分为两种,一种是直接预置 APK,一种是预置带有源码的 APP。

预置 apk

示例说明

以 Shadowsocks.apk 示例,在 AOSP/packages/apps 新建名为 Shadowsocks 的文件,放入 Shadowsocks.apk,再新建 Android.mk,内容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE := < your app folder name >

# 签名
LOCAL_CERTIFICATE := < desired key >

# 指定 src 目录 
LOCAL_SRC_FILES := < app apk filename >

LOCAL_MODULE_CLASS := APPS

# 该模块的后缀,不用定义
#LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

include $(BUILD_PREBUILT)

解释:

1、LOCAL_PATH := $(call my-dir)

每个 Android.mk 文件必须以定义 LOCAL_PATH 为开始,它用于在开发 tree 中查找源文件。

2、include $(CLEAR_VARS)

CLEAR_VARS 变量由 Build System 提供,并指向一个指定的 GNU Makefile,由它负责清理很多 LOCAL_xxx

例如:LOCAL_MODULELOCAL_SRC_FILESLOCAL_STATIC_LIBRARIES 等等,但不清理LOCAL_PATH

3、LOCAL_MODULE_TAGS := user eng tests optional

可选定义,表示在什么版本情况下编译该版本,默认 optional。

  • user: 指该模块只在 user 版本下才编译
  • eng: 指该模块只在 eng 版本下才编译
  • tests: 指该模块只在 tests 版本下才编译
  • optional:指该模块在所有版本下都编译

4、LOCAL_MODULE

模块名,可不用定义,默认 = $(LOCAL_PACKAGE_NAME),不能和既有模块相同,如果该变量未设置,则使用 LOCAL_PACKAGE_NAME,如果再没有,就会编译失败。

5、LOCAL_CERTIFICATE

在什么情况下签名。

  • testkey:普通 APK,默认情况下使用。
  • platform:该 APK 完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,
    这种方式编译出来的 APK 所在进程的 UID 为 system,可以参见 Settings。
  • shared:该 APK 需要和 home/contacts 进程共享数据,可以参见 Launcher。
  • media:该 APK 是 media/download 系统中的一环,可以参见 Gallery。

6、LOCAL_MODULE_CLASS

指定模块的类型,可不用定义。

# 编译 apk 文件
LOCAL_MODULE_CLASS := APPS

# 编译 jar 包
LOCAL_MODULE_CLASS := JAVA_LIBRAYIES

# 定义动态库文件
LOCAL_MODULE_CLASS := SHARED_LIBRAYIES

# 编译可执行文件
LOCAL_MODULE_CLASS := EXECUTABLES
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值