欢迎光临
我们一直在努力

Android 系统预装应用参考与常见问题汇总

本文整理了 Android 系统如何预装第三方应用的流程、目录说明、源码与无源码内置方法,以及常见问题与注意事项,适用于刷机或定制系统开发场景。

应用预装目录说明

系统开机时会进行应用加载(安装),将 APK 放置到对应目录即可:

  • system/app/:系统级应用,高权限,不可卸载(如 Phone、Contacts)。
  • system/priv-app/:Android 4.4+ 出现,核心系统应用,高权限,不可卸载(如 Settings、SystemUI)。
  • vendor/app/:厂商自带应用,不可卸载。
  • data/app/:第三方应用,可卸载。用户手动安装的应用就在此目录。

源码在 PackageManagerService 实例化时通过 scanDirTracedLI 方法进行扫描。

基础操作

在源码目录下新建 Android.mk 文件:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Neteasemusic
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_PROGUARD_ENABLED := disabled

PRODUCT_PACKAGES 追加项目名,例如:

PRODUCT_PACKAGES += Neteasemusic

差异化操作(有源码)

  1. 将 APK 源码拷贝至 DemoApp,删除 /bin 和 /gen 目录
  2. 追加以下代码:
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)

无源码内置 APK

  1. 将 APK 文件复制到 Android.mk 同级目录,并改成合法文件名(避免中文或非法字符)
  2. 追加以下代码:
LOCAL_SRC_FILES := 文件名.apk
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)

注意:BUILD_PREBUILT 会对文件签名改动,v2/v3 签名可能失效,建议保留 v1 签名。若保持原签名可直接 copy 文件,不用 BUILD_PREBUILT。

非系统应用(可卸载)

LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)

并修改 frameworks/base/services/core/java/com/android/server/pm/PackageManagerService 文件,在第一次启动系统时扫描 /data/app 目录不传入 SCAN_REQUIRE_KNOWN 标志。

系统应用(不可卸载)

  • 32 位应用需添加 LOCAL_MULTILIB := 32
  • 新建 lib 文件夹,将解压后的 so 库复制进去并引用:
LOCAL_PREBUILT_JNI_LIBS := \
lib/libijkffmpeg.so \
lib/libijkplayer.so \
lib/libijksdl.so
LOCAL_PRIVILEGED_MODULE := true

系统应用 so 库放在 /system/lib 或 /system/lib64,非系统应用无需操作。

完整示例:内置无源码网易云音乐为系统应用

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := YZXNeteasemusic
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_PROGUARD_ENABLED := disabled
include $(BUILD_PREBUILT)
# copy the nativelib to system/lib
$(shell cp $(LOCAL_PATH)/lib/armeabi/* $(TARGET_OUT)/lib/)

省事版示例

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := YZXNeteasemusic
# copy the apk to system/app/$(LOCAL_MODULE)
$(shell cp $(LOCAL_PATH)/$(LOCAL_MODULE).apk $(TARGET_OUT_APPS)/$(LOCAL_MODULE)/$(LOCAL_MODULE).apk)
# copy the nativelib to system/lib
$(shell cp $(LOCAL_PATH)/lib/* $(TARGET_OUT)/lib/)

代码说明

  • LOCAL_PATH := $(call my-dir):必需,指定源码目录查找路径。
  • include $(CLEAR_VARS):固定内容,清理上一个模块的变量。
  • LOCAL_MODULE_TAGS:模块编译标签,一般 optional 即可。
  • LOCAL_MODULE:模块名,需唯一。
  • LOCAL_CERTIFICATE:APK 签名方式(testkey/platform/shared/media/PRESIGNED)。
  • LOCAL_MODULE_CLASS:模块类型,可生成默认路径。
  • include $(BUILD_PACKAGE):生成 APK。
  • LOCAL_PROGUARD_ENABLED := disabled:是否启用混淆。
  • LOCAL_PRIVILEGED_MODULE := true:表示内置到 system/priv-app。
  • #数码日常
  • #刷机
  • #刷机资源合集
赞(0)

评论 抢沙发

评论前必须登录!

立即登录   注册