当前位置: 首页 > 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

http://www.lryc.cn/news/365766.html

相关文章:

  • 【Pycharm】功能介绍
  • 安卓手机平板使用JuiceSSH无公网IP远程连接本地服务器详细流程
  • 告别冗长代码:Java Lambda 表达式如何简化你的编程
  • 不同生成式AI模型的优缺点(GAN,VAE,FLOW)
  • VMware ESXi 8.0U2c macOS Unlocker OEM BIOS 集成网卡驱动 Marvell AQC 网卡定制版
  • SpringCloud Consul基础入门与使用实践总结
  • pdf拆分成有图和无图的pdf(方便打印)
  • 通用树查找算法
  • Flutter 中的 TableCell 小部件:全面指南
  • clickhouse学习笔记(一)入门与安装
  • 【JavaEE精炼宝库】多线程(4)深度理解死锁、内存可见性、volatile关键字、wait、notify
  • 使用Ollama+OpenWebUI部署和使用Phi-3微软AI大模型完整指南
  • k8s的ci/cd实践之旅
  • 笔记96:前馈控制 + 航向误差
  • 延时任务工具类
  • springboot下载grpc编译文件,报错缺少protoc-gen-grpc-java:1.34.1:exe不存在
  • 【面试干货】 非关系型数据库(NoSQL)与 关系型数据库(RDBMS)的比较
  • JAVA学习-练习试用Java实现“简化路径”
  • STM32——ADC篇(ADC的使用)
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • 深度评价GPT-4o:探索人工智能的新里程碑
  • Linux命令篇(六):vi/vim专项
  • Java 还能不能继续搞了?
  • 【日记】遇到了一个很奇怪的大爷(845 字)
  • Python 机器学习 基础 之 处理文本数据 【处理文本数据/用字符串表示数据类型/将文本数据表示为词袋】的简单说明
  • GAT1399协议分析(10)--视频定义及解析
  • 【C语言】学生管理系统:完整模拟与实现
  • pypi 发布自己的包
  • 关闭windows11磁盘地址栏上的历史记录
  • DDS自动化测试落地方案 | 怿星科技携最新技术亮相是德科技年度盛会