当前位置: 首页 > article >正文

Android13预置应用及授权开发

在android13中,要预置一个对讲应用,从预置和授权,梳理了一下,以便后续查询使用。在此记录

一放置应用

我的apk应用放在vendor下面,

路径:projectroot/vendor/fly/package/apps/DMR/flydmr.apk (vendor/fly/package/apps下可以放置其他预装应用)

二设置权限

这里我们使用一个新的授权方式,以往我们都在framework/base/data/etc/privapp-permissions-platform.xml 下声明权限,然后再在代码中授予权限。这次我们直接使用xml文件在apk同目录下声明和授予权限

  1. 声明权限

在步骤一的DMR/目录下创建privapp-permissions-flydmr.xml文件内容如下:

data/etc/privapp-permissions-platform.xml

<?xml version="1.0" encoding="utf-8"?>
   <permissions>
      <privapp-permissions package="com.demo.dmr"> //package是应用的包名
        <permission name="android.permission.FOREGROUND_SERVICE" />
        <permission name="android.permission.KILL_BACKGROUND_PROCESSES" />
        <permission name="android.permission.RECEIVE_BOOT_COMPLETED" />
        <permission name="android.permission.READ_PHONE_STATE" />
        <permission name="android.permission.RECORD_AUDIO"/>
        <permission name="android.permission.MODIFY_AUDIO_SETTINGS"/>
        <permission name="android.permission.MODIFY_PHONE_STATE" />
        <permission name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <permission name="android.permission.READ_EXTERNAL_STORAGE" />
        <!--<permission name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />-->
     </privapp-permissions>
   </permissions>

2 授予权限

同样在DMR目录下创建default_permissions_dmr.xml文件,内容如下:

<exceptions>
   <exception package="com.demo.dmr">
        <permission name="android.permission.FOREGROUND_SERVICE" fixed="false"/>
        <permission name="android.permission.KILL_BACKGROUND_PROCESSES" fixed="false"/>
        <permission name="android.permission.RECEIVE_BOOT_COMPLETED" fixed="false"/>
        <permission name="android.permission.READ_PHONE_STATE" fixed="false"/>
        <permission name="android.permission.RECORD_AUDIO" fixed="false"/>
        <permission name="android.permission.MODIFY_AUDIO_SETTINGS" fixed="false">
        <permission name="android.permission.MODIFY_PHONE_STATE" fixed="false"/>
        <permission name="android.permission.WRITE_EXTERNAL_STORAGE" fixed="false"/>
        <permission name="android.permission.READ_EXTERNAL_STORAGE" fixed="false"/>
        <!--<permission name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" fixed="false"/>-->
   </exception>
</exceptions>

以上两个权限文件的包名和应用包名必须一致

三创建mk编译文件

在DMR目录下创建Android.mk文件,内容如下


#==================================================
# build apk
#==================================================
LOCAL_PATH:= $(call my-dir)
#dmr method.
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional

LOCAL_MODULE := DMR
LOCAL_MODULE_STEM :=FlysDmr.apk
LOCAL_MODULE_CLASS :=APPS
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT)/priv-app
LOCAL_SRC_FILES := FlysDmr.apk
LOCAL_PRIVILEGED_MODULE := true
LOCAL_ENFORCE_USES_LIBRARIES := false
LOCAL_REPLACE_PREBUILT_APK_INSTALLED := $(LOCAL_PATH)/FlysDmr.apk
include $(BUILD_PREBUILT)
#include $(call all-makefiles-under,$(LOCAL_PATH))


#==================================================
# Install priv-app default-permisison file
#==================================================
include $(CLEAR_VARS)
LOCAL_MODULE := default_permissons_dmr.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/default-permissions
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)


#==================================================
# Install priv-app permisison file
#==================================================
include $(CLEAR_VARS)
LOCAL_MODULE:=privapp-permissions-flydmr.xml
LOCAL_MODULE_TAGS:=optional
LOCAL_MODULE_CLASS:=ETC

LOCAL_MODULE_PATH:=${TARGET_OUT_ETC}/permissions
LOCAL_SRC_FILES:=${LOCAL_MODULE}
include ${BUILD_PREBUILT}



以上代码块,分三部门,第一部分是编译apk,第二部分是授权,第三部分是声明权限

四 集成编译

这个在build目录下  projectroot/build/target/product/handheld_product.mk文件中,添加如下

diff --git a/target/product/handheld_product.mk b/target/product/handheld_product.mk
index 11b09beef..cf1ff9e20 100644
--- a/target/product/handheld_product.mk
+++ b/target/product/handheld_product.mk
@@ -29,7 +29,11 @@ PRODUCT_PACKAGES += \
     Gallery2 \
     LatinIME \
+    IFlyIME \ //对应的LOCAL_MOUDEL名称
+    privapp-permissions-flyime.xml \
+    default_permissons_flyime.xml \
+    DMR \ //对应的LOCAL_MOUDEL名称
+    default_permissons_dmr.xml \
+    privapp-permissions-flydmr.xml \
     Music \
     OneTimeInitializer \
     preinstalled-packages-platform-handheld-product.xml \

然后全局编译,记得clean哈~~~~

ps:文件目录如下:

DMR目录有如下文件: (个人感觉xml文件名字无所谓,只要包名对的上就行,阅读etc/permission/下规范最好保持一致)

FlysDmr.apk
Android.mk
default_permissons_dmr.xml
privapp-permissions-flydmr.xml

问题解决:

问题1:编译刷机后,开机无法进入主页报如下错误:

这是应用没有拿到权限的问题,添加default_permissons_dmr.xml 授权

问题2:进入主页,打开应用崩溃,log如下:

这是应用没有找到so库,应用中有so库,因为应用设置为系统应用,需要指明so地址

在Android.mk中增加如下

 LOCAL_ENFORCE_USES_LIBRARIES := false
+# LOCAL_PREBUILT_JNI_LIBS:=lib/arm64-v8a/libserialport.so \
+# lib/x86_64/libserialport.so \
+# lib/x86/libserialport.so \
+# lib/armeabi-v7a/libserialport.so
+ifeq ($(TARGET_ARCH),arm64)
+LOCAL_PREBUILT_JNI_LIBS := $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/lib/arm64-v8a/*.so))
+else
+LOCAL_PREBUILT_JNI_LIBS := $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/lib/armeabi-v7a//*.so))
+endif
+
 LOCAL_REPLACE_PREBUILT_APK_INSTALLED := $(LOCAL_PATH)/FlyscaleDmr.apk
 include $(BUILD_PREBUILT)
 #include $(call all-makefiles-under,$(LOCAL_PATH))

记得将apk中的lib目录(里面有so文件)放到Android.mk同级目录下哦。(arm x86,可以根据设备cpu架构只放置必须的so库,我的是arm架构,只放置了 arm相关)


http://www.kler.cn/a/372273.html

相关文章:

  • 如何有效提升MySQL大表分页查询效率(本文以一张900万条数据体量的表为例进行详细解读)
  • 电子电气架构 --- 车载芯片现状
  • 二百七十、Kettle——ClickHouse中增量导入清洗数据错误表
  • Java Executor ThreadPoolExecutor 源码
  • Java AQS 目录
  • 群控系统服务端开发模式-应用开发-业务架构逻辑开发BaseAPI继续开发二
  • Thread类及线程的核心操作
  • Java集合常见面试题总结(5)
  • 常见的开发工具及其作用
  • [论文阅读] GPT-4 Technical Report
  • Kotlin-协程基础
  • 【面试经典150】day 9
  • PostgreSQL 清理 WAL 文件
  • 2024“源鲁杯“高校网络安全技能大赛-Misc-WP
  • 逆变器竞品分析--绿联150W方案【2024/10/30】
  • Docker搭建官方私有仓库registry及相关配置
  • 基于树莓派的安保巡逻机器人--(一、快速人脸录入与精准人脸识别)
  • DGUS屏使用方法
  • 易至狂欢购车季火热开启,EV3青春版打造年轻一代出行新选择
  • 【MMIN】缺失模态想象网络用于不确定缺失模态的情绪识别
  • 相关矩阵图——Python实现
  • 【Android】Kotlin教程(4)
  • Ubuntu20.04安装VM tools并实现主机和虚拟机之间文件夹共享
  • 基于微信小程序的小区管理系统设计与实现(lw+演示+源码+运行)
  • uniapp跨域问题,在开发环境中配置
  • Unity(四十八):Unity与Web双向交互