一、内置应用分为以下几种:
1.第三方合作可卸载应用
2.第三方应用不可卸载应用
3.第三方应用不可卸载并且不用动态申请危险权限应用
通常厂商内置应用会放到vendor目录下再创建自己的目录名,把需要预置的apk放入对应目录,并编写对应的mk文件。
应用是否可用卸载会根据类型最后拷贝到不同的目录下,例如system/app(不可卸载),system/ third-app(可卸载),system/priv-app(
不可卸载并启不用动态申请危险权限)。
二、如何将应用不可卸载并且不用动态申请危险权限
通常情况下我们的应用都会有自己的签名,如果这个签名和系统签名不同则不会被作为第三类应用的,所以需要和系统签名一样,
当然我们一般会编写一个mk脚本再编译的时候重新给apk签名保证和系统签名一致。
以下几步实现不可卸载并且不用动态申请危险权限应用:
- 在文件中配置android:sharedUserId=""和系统共享userid
- 将apk放到对应目录下
- 编写改apk的mk文件
-
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Module name should match apk name to be installed LOCAL_MODULE := XXXX LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(LOCAL_MODULE).apk LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_PREBUILT_JNI_LIBS := \ @lib/armeabi/ #保留原来应用自身签名 # LOCAL_CERTIFICATE := PRESIGNED #使用系统平台签名 LOCAL_CERTIFICATE := platform include $(BUILD_PREBUILT)
-
将目录mk文件添到系统编译mk文件中按照格式加就行
# 需要预置的定制应用及三方应用
PRODUCT_PACKAGES += \
SogouInput \
****
三、小结
注意:
- 如果在文件中配置android:sharedUserId=""表示该应用一定要和系统平台签名一致要不然应用无法被解析安装。
- 动态申请的危险权限还是要写动态申请方法,如果不写动态申请权限方法系统也不会将这些权限默认赋予改应用,同时也是为了保证应用在被用户手动关闭权限后被再次弹窗提示框让用户手动赋予权限。
- 默认赋予应用动态权限只会在第一次启动赋予一次,如果后续手动关闭应用权限则需要弹框提示用户手动赋予权限。