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

Android在不同层面增加应用

1 App

应用代码一般在开发者的项目目录下,packages/apps/YourApp/,比如app/src/main/java目录下

对于系统应用,源代码可能位于packages/apps/目录下,例如packages/apps/Settings

用户安装的应用(从Google Play或其他来源安装的APK)位于设备的/data/app/目录

系统应用(预装应用)位于/system/app//system/priv-app/目录

应用在Dalvik或ART虚拟机上运行

直接使用Framework服务

import android.myframeworkservice.IMyFrameworkService;
import android.os.ServiceManager;
import android.os.RemoteException;public class MyActivity extends Activity {private IMyFrameworkService mFrameworkService;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mFrameworkService = IMyFrameworkService.Stub.asInterface(ServiceManager.getService("myframeworkservice"));if (mFrameworkService != null) {try {mFrameworkService.myFrameworkMethod();} catch (RemoteException e) {e.printStackTrace();}}}
}

2 Framework层

Framework服务的源代码主要位于frameworks/base/services/目录

Framework服务的代码编译后成为framework.jar和其他相关JAR文件,位于设备的/system/framework/目录

Framework服务在system_server进程中运行。system_server是由Zygote进程启动的,它包含了大部分系统服务,如ActivityManagerServicePackageManagerService等。

首先增加aidl

// IMyFrameworkService.aidl
package android.myframeworkservice;interface IMyFrameworkService {void myFrameworkMethod();
}

用Java实现

// MyFrameworkService.java
package com.android.server;import android.content.Context;
import android.hardware.myhal.IMyHalService;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
import android.myframeworkservice.IMyFrameworkService;
import android.os.ServiceManager;public class MyFrameworkService extends IMyFrameworkService.Stub {private static final String TAG = "MyFrameworkService";private final Context mContext;private final IMyHalService mHalService;public MyFrameworkService(Context context) {mContext = context;mHalService = IMyHalService.Stub.asInterface(ServiceManager.getService("myhalservice"));}@Overridepublic void myFrameworkMethod() throws RemoteException {if (mHalService != null) {mHalService.myHalMethod();} else {Slog.e(TAG, "HAL service not available");}}
}

在system manager中注册

import com.android.server.MyFrameworkService;public class SystemServer {// Existing code...private void startOtherServices() {// Existing code...try {Slog.i("SystemServer", "MyFrameworkService");ServiceManager.addService("myframeworkservice", new MyFrameworkService(context));} catch (Throwable e) {reportWtf("starting MyFrameworkService", e);}// Existing code...}// Existing code...
}

3 HAL层

HAL服务的源代码通常位于hardware/interfaces/vendor/目录

HAL模块通常以共享库(.so文件)的形式存在,位于/vendor/lib/hw//system/lib/hw/目录中。

定义服务

package android.hardware.myhal;interface IMyHalService {void myHalMethod();
}

实现HAL服务,用C++

// MyHalService.cpp
#include <android/hardware/myhal/IMyHalService.h>
#include <hidl/LegacySupport.h>
#include <log/log.h>using android::hardware::myhal::V1_0::IMyHalService;
using android::hardware::configureRpcThreadpool;
using android::hardware::joinRpcThreadpool;
using android::sp;struct MyHalService : public IMyHalService {Return<void> myHalMethod() override {ALOGI("myHalMethod called");return Void();}
};int main() {configureRpcThreadpool(1, true /*callerWillJoin*/);android::sp<IMyHalService> service = new MyHalService();if (service->registerAsService() != android::OK) {ALOGE("Failed to register MyHalService");return 1;}joinRpcThreadpool();return 0;
}

其实HAL也可以不封成AIDL。直接使用JNI,貌似也是可以的,各有利弊。

例子:

https://www.cnblogs.com/linhaostudy/p/12002068.html

相关文章:

Android在不同层面增加应用

1 App 应用代码一般在开发者的项目目录下&#xff0c;packages/apps/YourApp/&#xff0c;比如app/src/main/java目录下 对于系统应用&#xff0c;源代码可能位于packages/apps/目录下&#xff0c;例如packages/apps/Settings。 用户安装的应用&#xff08;从Google Play或其…...

【Pycharm】功能介绍

1.Code Reformat Code 格式化代码&#xff0c;可以帮助我们去自动调整空格等&#xff0c;根据python语法规范自动调整 2.Settings 1.创建py文件默认填充模版 3.读写py文件编码格式一致性 顶部代码指定的编码方式作用&#xff1a; 可以保证python2/3解释器在读取文件的时候按…...

安卓手机平板使用JuiceSSH无公网IP远程连接本地服务器详细流程

文章目录 前言1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 前言 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? 本文就和大家分享一下如何使用 cpolarJuiceSSH 实现手机端远程连接Linux…...

告别冗长代码:Java Lambda 表达式如何简化你的编程

在现代软件开发中&#xff0c;高效和简洁的代码变得越来越重要。Java作为一门成熟而广泛使用的编程语言&#xff0c;一直在不断进化&#xff0c;以满足开发者的需求。Java 8的推出标志着一次重要的飞跃&#xff0c;其中最引人注目的特性之一便是Lambda表达式。 Lambda表达式为J…...

不同生成式AI模型的优缺点(GAN,VAE,FLOW)

不同生成式人工智能模型的优缺点 近年来&#xff0c;生成式 AI 模型因其能够创建新的原创内容而备受关注。这些模型旨在生成类似于给定训练数据集的数据&#xff0c;从而产生逼真且富有创意的输出。了解不同类型的生成式 AI 模型及其优缺点对于研究人员、开发人员和用户做出明…...

VMware ESXi 8.0U2c macOS Unlocker OEM BIOS 集成网卡驱动 Marvell AQC 网卡定制版

VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS 集成网卡驱动 Marvell AQC 网卡定制版 VMware ESXi 8.0U2c macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0U2 集成驱动版&#xff0c;在个人电脑上运行企业级工作负载 请访问原文链…...

SpringCloud Consul基础入门与使用实践总结

【1】Consul简介 官网地址&#xff1a;https://www.consul.io/intro/index.html 下载地址&#xff1a;https://www.consul.io/downloads.html 中文文档&#xff1a;https://www.springcloud.cc/spring-cloud-consul.html ① 基础概念 Consul 是一套开源的分布式服务发现和…...

pdf拆分成有图和无图的pdf(方便打印)

pdf拆分成有图和无图的pdf(方便打印) 原因 打印图片要彩印&#xff0c;每次都要手动弄&#xff0c;打印的时候很麻烦&#xff1b; 随着打印次数的增加&#xff0c;时间就越来越多 为解决此问题&#xff0c;使用python写一个exe解决这个问题 历程 找一个python的GUI界面找到 t…...

通用树查找算法

想要一个树形控件来显示数据&#xff0c;却发现Racket的GUI库竟然没有提供这个控件。既然没有&#xff0c;那就自己手搓一个吧。没想到&#xff0c;在做这个控件中竟然有了新发现&#xff01; 树形控件有一个功能是查找树中指定的节点。这就是接下来的故事的起点。 1 找外援 不…...

Flutter 中的 TableCell 小部件:全面指南

Flutter 中的 TableCell 小部件&#xff1a;全面指南 Flutter 是一个功能强大的 UI 框架&#xff0c;由 Google 开发&#xff0c;允许开发者使用 Dart 语言构建跨平台的移动、Web 和桌面应用。在 Flutter 的丰富组件库中&#xff0c;TableCell 是一个用于创建表格单元格的组件…...

clickhouse学习笔记(一)入门与安装

目录 一 、入门 简介 核心特性包括 1.1 列式存储 1.2 原生压缩 1.3 向量化执行引擎 1.4 DBMS 功能 1.5 分布式处理 1.6 高吞吐写入能力 1.7 实时分析 1.8 SQL支持 1.9 高度可扩展 1.10 数据分区与线程级并行 1.11 应用场景 1.12 不适用场景 二、ClickHouse单机版…...

【JavaEE精炼宝库】多线程(4)深度理解死锁、内存可见性、volatile关键字、wait、notify

目录 一、死锁 1.1 出现死锁的常见场景&#xff1a; 1.2 产生死锁的后果&#xff1a; 1.3 如何避免死锁&#xff1a; 二、内存可见性 2.1 由内存可见性产生的经典案例&#xff1a; 2.2 volatile 关键字&#xff1a; 2.2.1 volatile 用法&#xff1a; 2.2.2 volatile 不…...

使用Ollama+OpenWebUI部署和使用Phi-3微软AI大模型完整指南

&#x1f3e1;作者主页&#xff1a; 点击&#xff01; &#x1f916;AI大模型部署与应用专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月6日23点50分 &#x1f004;️文章质量&#xff1a;96分 欢迎来到Phi-3模型的奇妙世界&#xff01;Phi-3是由微软…...

k8s的ci/cd实践之旅

书接上回k8s集群搭建完毕&#xff0c;来使用它强大的扩缩容能力帮我们进行应用的持续集成和持续部署&#xff0c;整体的机器规划如下&#xff1a; 1.192.168.8.156 搭建gitlab私服 docker pull gitlab/gitlab-ce:latest docker run --detach --hostname 192.168.8.156 --publ…...

笔记96:前馈控制 + 航向误差

1. 回顾 对于一个 系统而言&#xff0c;结构可以画作&#xff1a; 如果采用 这样的控制策略&#xff0c;结构可以画作&#xff1a;&#xff08;这就是LQR控制&#xff09; 使用LQR控制器&#xff0c;可以通过公式 和 构建一个完美的负反馈系统&#xff1b; a a 但是有上…...

延时任务工具类

自定义工具类 package com.sxfoundation.task;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.task.TaskRejectedException; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.spri…...

springboot下载grpc编译文件,报错缺少protoc-gen-grpc-java:1.34.1:exe不存在

报错如图所示 [ERROR] Then, install it using the command: [ERROR] mvn install:install-file -DgroupIdio.grpc -DartifactIdprotoc-gen-grpc-java -Dversion1.34.1 -Dclassifierwindows-x86_64 -Dpackagingexe -Dfile/path/to/file [ERROR] [ERROR] Alternatively, if yo…...

【面试干货】 非关系型数据库(NoSQL)与 关系型数据库(RDBMS)的比较

【面试干货】 非关系型数据库&#xff08;NoSQL&#xff09;与 关系型数据库&#xff08;RDBMS&#xff09;的比较 一、引言二、非关系型数据库&#xff08;NoSQL&#xff09;2.1 优势 三、关系型数据库&#xff08;RDBMS&#xff09;3.1 优势 四、结论 &#x1f496;The Begin…...

JAVA学习-练习试用Java实现“简化路径”

问题&#xff1a; 给定一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 / 开头&#xff09;&#xff0c;请将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff0c;一个点&#xff08;.&#xff09;表示当前目录本身…...

STM32——ADC篇(ADC的使用)

一、ADC的介绍 1.1什么是ADC ADC&#xff08;Analogto-Digital Converter&#xff09;模拟数字转换器&#xff0c;是将模拟信号转换成数字信号的一种外设。比如某一个电阻两端的是一个模拟信号&#xff0c;单片机无法直接采集&#xff0c;此时需要ADC先将短租两端的电…...

用Asian Beauty Z-Image Turbo做古风头像:简单三步生成独一无二的东方美学作品

用Asian Beauty Z-Image Turbo做古风头像&#xff1a;简单三步生成独一无二的东方美学作品 想象一下&#xff0c;你的社交媒体头像不再是一张普通的自拍或卡通形象&#xff0c;而是一幅充满东方韵味的古风艺术作品——可能是唐代仕女的温婉&#xff0c;宋代文人的儒雅&#xf…...

Qt, C++数据类型扩展问题

Qt项目中ObjectDic类的类型扩展与代码优化 前言 在Qt项目开发中&#xff0c;我们经常会遇到需要处理不同类型数据的情况&#xff0c;尤其是当涉及到负数时&#xff0c;类型的选择就显得尤为重要。本文将详细介绍如何在Qt项目中扩展ObjectDic类的类型支持&#xff0c;从无符号整…...

DeerFlow2.0 Docker + 本地 Ollama qwen3.5:9b 部署指南

DeerFlow2.0 Docker 本地 Ollama qwen3.5:9b 部署指南 实现 Token 自由&#xff01;&#xff01;&#xff01;本地模型免费 &#xff1a;&#xff09; 1. 前提条件 Windows 11 家庭版&#xff08;版本号 25H2&#xff09;Docker Desktop 已安装并运行WSL2 已安装并配置Olla…...

从黑客攻防角度看网络命令:如何用ping/tracert/nslookup发现网络安全隐患

网络命令的攻防实战&#xff1a;用基础工具发现隐藏的安全威胁 当大多数人还在把ping、tracert这些基础网络命令当作简单的连通性测试工具时&#xff0c;安全工程师已经将它们变成了发现网络威胁的"显微镜"。这些看似简单的命令行工具&#xff0c;在专业的安全分析场…...

多任务学习进阶:从MMoE到PLE的模型演进与实战解析

1. 多任务学习基础与核心挑战 多任务学习&#xff08;Multi-Task Learning, MTL&#xff09;是机器学习领域的一个重要分支&#xff0c;它让单个模型同时学习多个相关任务。想象一下&#xff0c;你正在教一个学生同时学习数学和物理。如果这两个学科有共同的基础概念&#xff0…...

fft npainting lama图像修复系统:5分钟上手,轻松去除图片水印和杂物

FFT Npainting Lama图像修复系统&#xff1a;5分钟上手&#xff0c;轻松去除图片水印和杂物 1. 系统概述 1.1 什么是FFT Npainting Lama FFT Npainting Lama是一款基于深度学习的图像修复工具&#xff0c;能够智能移除图片中的水印、杂物和不需要的物体。它结合了快速傅里叶…...

Czkawka:智能存储管理的5个核心解决方案

Czkawka&#xff1a;智能存储管理的5个核心解决方案 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka 1.0 现象剖析&#xff1a;数字存储管理的现实困…...

避坑指南:用高德DistrictSearch获取精准行政边界时遇到的5个典型问题(含最新GeoJson处理技巧)

高德DistrictSearch深度避坑&#xff1a;5个实战难题与GeoJson优化方案 当你在深夜调试地图边界数据时&#xff0c;突然发现某个街道的轮廓出现了诡异的锯齿状变形——这不是恐怖片情节&#xff0c;而是使用高德DistrictSearch时可能遇到的真实场景。作为经历过数十个地图项目…...

5个维度深度评估:哪款内容解锁工具真正值得投入时间?

5个维度深度评估&#xff1a;哪款内容解锁工具真正值得投入时间&#xff1f; 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在数字信息时代&#xff0c;付费墙已成为内容获取的主要障…...

RMBG-2.0在YOLOv8项目中的应用:目标检测与背景去除联合处理

RMBG-2.0在YOLOv8项目中的应用&#xff1a;目标检测与背景去除联合处理 1. 为什么需要把目标检测和背景去除连在一起做 你有没有遇到过这样的场景&#xff1a;电商团队要批量处理上千张商品图&#xff0c;先用YOLOv8框出产品位置&#xff0c;再手动抠图换背景&#xff0c;最后…...