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 := optionalLOCAL_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:=ETCLOCAL_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.apkinclude $(BUILD_PREBUILT)#include $(call all-makefiles-under,$(LOCAL_PATH))

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

-------------------------2024-11-01补充----------------

突然发现以上只是集成了输入法,但是没有默认为系统输入法,若需要设置默认系统输入法做以下修改

操作1:

diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index 2203863b5028..e4e896c955ea 100755
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -18,9 +18,14 @@--><resources><string name="def_system_locales" translatable="false">zh-Hans-CN,en-US</string>
+    <!-- 置触宝默认输入法 -->
+    <!-- <string name="config_enabled_input_methods" translatable="false">com.emoji.keyboard.touchpal.go:com.cootek.smartinput5.TouchPalIME:com.android.inputmethod.latin/.LatinIME</string>           
+    <string name="config_default_input_method" translatable="false">com.emoji.keyboard.touchpal.go/com.cootek.smartinput5.TouchPalIME</string> -->                                                     <!-- 设置默认输入法 -->                                                                        
-    <string name="config_enabled_input_methods" translatable="false">com.emoji.keyboard.touchpal.go:com.cootek.smartinput5.TouchPalIME:com.android.inputmethod.latin/.LatinIME</string>                
-    <string name="config_default_input_method" translatable="false">com.emoji.keyboard.touchpal.go/com.cootek.smartinput5.TouchPalIME</string>                                                         
+<string name="enabled_input_methods" translatable="false">com.iflytek.inputmethod/.FlyIME</string> 
+                                                                                                   
+<string name="default_input_method" translatable="false">com.iflytek.inputmethod/.FlyIME</string>  
+  

操作2:然后在SettingProvider模块里面添加如下

diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java                        
index 54836523e5da..ca7454f4b600 100755                                                             
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java              
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java              
@@ -2345,6 +2345,13 @@ class DatabaseHelper extends SQLiteOpenHelper {                              loadSecure35Settings(stmt);                                                            +                                                                                                   
+             loadStringSetting(stmt, Settings.Secure.ENABLED_INPUT_METHODS,                        
+                R.string.config_enabled_input_methods);                                            
+                                                                                                   
+            loadStringSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD,                          
+                    R.string.config_default_input_method);                                         
+                                                                                                   loadBooleanSetting(stmt, Settings.Secure.MOUNT_PLAY_NOTIFICATION_SND,                  R.bool.def_mount_play_notification_snd); 

以上加载的配置是在操作1里面设置的。

over~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/59069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【密码学】全同态加密基于多项式环计算的图解

全同态加密方案提供了一种惊人的能力 —— 能够在不知道数据具体内容的情况下对数据进行计算。这使得你可以在保持潜在敏感源数据私密的同时&#xff0c;得出问题的答案。 这篇文章的整体结构包括多项式环相关的数学介绍&#xff0c;基于多项式环的加密和解密是如何工作的&…

[java][框架]springMVC(1/2)

目标 知道SpringMVC的优点编写SpringMVC入门案例使用PostMan发送请求掌握普通类型参数传递掌握POJO类型参数传递掌握json数据参数传递掌握响应json数据掌握rest风格快速开发 一、SpringMVC简介 1 SpringMVC概述 问题导入 SpringMVC框架有什么优点&#xff1f; 1.1 Spring…

基于STM32健康监控系统/智能手环/老人健康检测系统/心率血氧血压

基于STM32健康监控系统/智能手环/老人健康检测系统/心率血氧血压 持续更新&#xff0c;欢迎关注!!! 基于STM32健康监控系统/智能手环/老人健康检测系统/心率血氧血压 随着人民生活质量的提高和生活节奏的加快&#xff0c;人体健康监测成为全球关注的焦点之一。基于物联网的人体…

百度文心智能体:巧用汉字笔画生成与汉字搜索插件,打造一个学习汉字的教育类智能体

这篇文章&#xff0c;主要介绍如何巧用汉字笔画生成与汉字搜索插件&#xff0c;打造一个学习汉字的教育类智能体。 目录 一、教育类智能体 1.1、智能体演示 1.2、智能体插件 1.3、智能体prompt &#xff08;1&#xff09;角色和目标 &#xff08;2&#xff09;思考路径 …

Efficient Cascaded Multiscale Adaptive Network for Image Restoration 论文阅读笔记

Efficient Cascaded Multiscale Adaptive Network for Image Restoration 论文阅读笔记 这是新国立和新加坡管理大学发表在ECCV2024上的一篇image restoration的文章&#xff0c;提出了一个新的网络结构ECMA&#xff0c;从实验结果上看在超分&#xff0c;去噪&#xff0c;去模糊…

Python | Leetcode Python题解之第525题连续数组

题目&#xff1a; 题解&#xff1a; class Solution:def findMaxLength(self, nums: List[int]) -> int:# 前缀和字典: key为1的数量和0的数量的差值,value为对应坐标hashmap {0:-1}# 当前1的数量和0的数量的差值counter ans 0for i,num in enumerate(nums):# 每多一个1…

微服务架构深入理解 | 技术栈

微服务架构深入理解 | 技术栈 服务网关 服务网关是在微服务架构中扮演重要角色的组件&#xff0c;它是系统对外的入口&#xff0c;负责接收和处理客户端的请求&#xff0c;并将请求路由到相应的微服务。服务网关常常与API管理、负载均衡、安全认证、流量控制等功能结合&#xf…

Java日志脱敏——基于logback MessageConverter实现

背景简介 日志脱敏 是常见的安全需求&#xff0c;最近公司也需要将这一块内容进行推进。看了一圈网上的案例&#xff0c;很少有既轻量又好用的轮子可以让我直接使用。我一直是反对过度设计的&#xff0c;而同样我认为轮子就应该是可以让人拿去直接用的。所以我准备分享两篇博客…

目标追踪DeepSort

一、卡尔曼滤波 你可以在任何对某个动态系统有 “不确定信息” 的地方使用卡尔曼滤波器&#xff0c;并且可以对系统下一步的行为做出 “有根据的猜测”。即使混乱的现实干扰了你所猜测的干净运动&#xff0c;卡尔曼滤波器通常也能很好地确定实际发生了什么。它还可以利用你可能…

数据结构与算法——Java实现 53.力扣938题——二叉搜索树的范围和

生命的意义 在于活出自我 而不是成为别人眼中的你 —— 24.11.3 938. 二叉搜索树的范围和 给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1&#xff1a; 输入&#xff1a;root [10,5,15,3,7,null,18], low 7, high 15 …

微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖、z-index应用及性能分析

微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖、z-index应用及性能分析 目录 微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖、z-index应用及性能分析 1、iOS在scroll-view内部上下滑动吸顶的现象 正常的上下滑动吸顶…

免费好用又好看且多端自动同步第三方终端工具Termius你值得拥有

使用目的&#xff1a; 本地终端功能一样&#xff0c;都是为了登录服务器查看日志等操作。 本地终端 优点&#xff1a;方便简单&#xff0c;无需额外下载安装、免费。 缺点&#xff1a;每次都需要重新登陆输入命令&#xff0c;步骤繁琐无法简化&#xff1b;不能跨端同步。 第…

Unity引擎材质球残留贴图引用的处理

大家好&#xff0c;我是阿赵。   这次来分享一下Unity引擎材质球残留贴图引用的处理 一、 问题 在使用Unity调整美术效果的时候&#xff0c;我们很经常会有这样的操作&#xff0c;比如&#xff1a; 1、 同一个材质球切换不同的Shader、 比如我现在有2个Shader&#xff0c;…

【electron+vue3】使用JustAuth实现第三方登录(前后端完整版)

实现过程 去第三方平台拿到client-id和client-secret&#xff0c;并配置一个能够外网访问回调地址redirect-uri供第三方服务回调搭建后端服务&#xff0c;引入justauth-spring-boot-starter直接在配置文件中定义好第一步的三个参数&#xff0c;并提供获取登录页面的接口和回调…

Jetson OrinNX平台CSI相机导致cpu load average升高问题调试

1. 前言 硬件: Orin NX JP: 5.1.2, R35.4.1 用v4l2-ctl --stream-mmap -d0 命令去获取相机数据时, 用top查看cpu使用情况, CPU占用率很低,但load average在1左右, 无任何程序运行时,load average 为0 用ps -aux 查看当前进程情况,发现有两个系统进程vi-output, …

第六十三周周报 GGNN

文章目录 week63 GGNN摘要Abstract一、文献阅读1. 题目2. abstract3. 网络架构3.1 数据处理部分3.2 门控图神经网络3.3 掩码操作 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 传感器设置策略4.3.2 数据集4.3.3 实验设置4.3.4 模型参数设置4.3.5 实验结果 5. 结论总…

【Linux】从零开始使用多路转接IO --- poll

碌碌无为&#xff0c;则余生太长&#xff1b; 欲有所为&#xff0c;则人生苦短。 --- 中岛敦 《山月记》--- 从零开始使用多路转接IO 1 前言1 poll接口介绍3 代码编写4 总结 1 前言 上一篇文章我们学习了多路转接中的Select&#xff0c;其操作很简单&#xff0c;但有一些缺…

Verilog实现的莫尔斯电码发生器

莫尔斯或者摩尔斯电码(Morse Code)&#xff0c;发明于1837年(另有一说是1836年)&#xff0c;通过不同的排列顺序来表达不同的英文字母、数字和标点符号&#xff0c;在这里作一简单处理&#xff0c;仅产生点(Dit)和划(Dah)&#xff0c;时长在0.25秒之内为点&#xff0c;超过为划…

Maven介绍,IDEA集成方式

概述 什么是Maven&#xff1f; Maven 的正确发音是[ˈmevən],Maven在美国是一个口语化的词语&#xff0c;代表专家、内行的意思。 一个对 Maven 比较正式的定义是这么说的&#xff1a; Maven 是一个项目管理工具&#xff0c;它包含了一个项目对象模型 (POM&#xff1a;Proj…

stl_stack/queue

一.适配器 stack和queue实际上并不能算是一种容器&#xff0c;而是一种容器适配器。而适配器作为stl的6大组件之一&#xff0c;其实是一种设计模式。适配器模式其实就是将一个类的接口&#xff08;该接口无法直接满足客户的需求&#xff09;转换成客户希望的另一个接口&#x…