本文整理了 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
差异化操作(有源码)
- 将 APK 源码拷贝至 DemoApp,删除 /bin 和 /gen 目录
- 追加以下代码:
LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE)
无源码内置 APK
- 将 APK 文件复制到 Android.mk 同级目录,并改成合法文件名(避免中文或非法字符)
- 追加以下代码:
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。
- #数码日常
- #刷机
- #刷机资源合集








评论前必须登录!
立即登录 注册