车机 Android 环境下利用 CarAudioService 实现自定义 Java 服务自启动

这篇具有很好参考价值的文章主要介绍了车机 Android 环境下利用 CarAudioService 实现自定义 Java 服务自启动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

注意:本文基于 Android 11/R 进行分析
Qidi 2023.11.28 (MarkDown & Haroopad)


0. 简介 Android RO (Resource Overlay) 机制

Overlay 实现的效果正如其字面意思,就是“在原有效果的基础上再叠加一些效果”。

Android 提供了两种实现方式:

  • 编译时:https://source.android.com/docs/setup/create/new-device#use-resource-overlays
  • 运行时:https://source.android.com/docs/core/runtime/rros

通过 RO 机制,我们就可以将自己编写的 Java 服务在系统启动时运行起来。


1. 实现自定义 Java 服务

假设我们要实现的自定义服务名叫 myService,为了使它可以正常被 CarAudioService 拉起,需要在myServiceAndroidManifest.xml 中添加 directBootAware 属性:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    coreApp="true"
    tools:ignore="MissingVersion"
    package="com.your_company_name.myService"
    android:sharedUserId="android.uid.system">
    ......
    <application
        android:allowBackup="true"
        tools:ignore="All"
        android:label="myService"
        android:persistent="true"
        android:directBootAware="true"
        android:supportsRtl="true" >

        <service
            android:name=".myService"
            android:singleUser="true"
            android:exported="true"
            android:permission="android.car.permission.CAR_CONTROL_AUDIO_SETTINGS"
            tools:ignore="All"
            android:enabled="true">
            <intent-filter>
                <action android:name="com.your_company_name.myService"/>
            </intent-filter>
        </service>

        <!-- functionalities of myService depend on calls to below libraries -->
        <uses-library
            android:name="com.your_company_name.audio"
            android:required="true"/>
        <uses-library
            android:name="com.your_company_name.effect"
            android:required="true"/>
    </application>
</manifest>

随后实现 myService 代码,和实现普通 service 没有区别,示例 vendor/your_company_name/packages/src/com/your_company_name/myService.java 如下:

package com.your_company_name.myService;

// some dependent packages
import android.util.Log;
import xxxx;

public class myService extends Service {

	private static final String TAG = "myService";

	......

    @Override
    public IBinder onBind(Intent intent) {
        // return a binder object to caller
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @Override
    public void onCreate() {
    	Log.i(TAG, "Creating myService...");
        super.onCreate();
        // creating and initializing myService
    }


	// implementation of some myService methods here
    ......


    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
    }
}

如此,自定义服务 myService 就编写完成了。接下来我们还要做一些改动,让 myService 在系统启动时能自动被 CarAudioService 拉起。


2. 对 CarAudioService 配置文件进行编译时 Overlay

CarAudioService 新建 Overlay 配置文件device/your_company_name/qcom/lunch_target_name/overlay/packages/services/Car/service/res/values/config.xml

<resources>
    <!-- The services that needs to be started earlier in the boot sequence and in particular order.
         Every item in this array contains a flatten component name of a service that needs to be
         started and a list of parameters after hashtag symbol. Here's the format:

         <item>com.bar.foo/.Service#bind={bind|start|startForeground},user={all|system|foreground},
         trigger={asap,userUnlocked}</item>

         bind: bind - start service with Context#bindService
               start - start service with Context#startService
               startForeground - start service with Context#startForegroundService
               If service was bound it will be restarted unless it is constantly crashing.
               The default value is 'start'
         user: all - the service will be bound/started for system and all foreground users
               system - the service will be started/bound only for system user (u0)
               foreground - the service will be bound/started only for foreground users
               The default value is 'all'
         trigger: indicates when the service needs to be started/bound
               asap - the service might be bound when user is not fully loaded, be careful with
                      this value, the service also needs to have directBootAware flag set to true
               userUnlocked - start service when user unlocked the device
               The default value is 'userUnlocked'

         If the service bound/started for foreground user it will be unbound/stopped when user
         is no longer foreground.
     -->
    <string-array translatable="false" name="config_earlyStartupServices">
        <item>com.your_company_name.myService/.myService#bind=start,user=system,trigger=asap</item>
    </string-array>
</resources>

然后在 makefile 中将上述 overlay 文件路径添加到环境变量 PRODUCT_PACKAGE_OVERLAYS 中。以我使用的代码环境为例,在 device/your_company_name/qcom/lunch_target_name/lunch_target_name.mk 中添加以下语句(当然你也可以添加到别的 makefile 中,比如 device.mk):

PRODUCT_PACKAGE_OVERLAYS += device/your_company_name/qcom/$(TARGET_PRODUCT)/overlay

至此,所有需要的改动都已完成。接下来只要确保编译通过,并烧写到板子上,就能在开机日志中看到 myService 被拉起来的打印了。文章来源地址https://www.toymoban.com/news/detail-750642.html

到了这里,关于车机 Android 环境下利用 CarAudioService 实现自定义 Java 服务自启动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一文了解 Android 车机如何处理中控的旋钮输入?

    上篇文章《从实体按键看 Android 车载的自定义事件机制》带大家了解了 Android 车机支持自定义输入的机制 CustomInputService 。事实上,除了支持自定义事件,对于中控上常见的音量控制、焦点控制的旋钮事件,Android 车机也是支持的。 那本篇文章带大家看下 Android 车机处理旋钮

    2024年02月15日
    浏览(44)
  • 车机 Android 调节音量的三种方式及底层代码逻辑

    注意:本文基于 Android 12/S 进行分析 Qidi 2023.07.20 (MarkDown EnterpriseArchitect Haroopad) 车机环境下的音频使用场景,相较于原始 Android 的音频使用场景,存在这些特殊性: 使用专门的 aDSP 芯片进行音效处理; 需要播放/控制原始 Android 预设之外的音源(AudioUsage); 音源间交互行为更

    2024年02月05日
    浏览(52)
  • 如何在 Windows上使用桌面车机(DHU)测试 Android Auto

    如果你想在购买支持 Android Auto 的汽车之前尝试 Android Auto,那么就可以使用 Android Studio 在模拟器中试用 Android Auto,使用 Android Studio 即可模拟一个车机的Android Auto,你只需要通过USB连接线把手机连接到电脑,即可在电脑上使用Android Auto。 Desktop Head Unit(DHU) 是一种Android模拟

    2024年02月21日
    浏览(37)
  • 榨干Pixel5最后的价值:编译刷写Android12L车机系统

    去年2022年中的时候,突然迷上了小屏手机,当时小屏的选择很有限,所以左挑右选网购了一台Pixel 5的库存机。酷安各个机主都称呼其为小五,小巧机身,这台鼠尾草绿的颜色很好看。 原生安卓系统的人机交互里有很多让人惊喜的细节,比如我开睡眠模式的时候,整个屏幕的

    2024年01月22日
    浏览(51)
  • android车机手机黑屏闪黑终结者-Winscope工具使用介绍

    设想一下,假如我们又如下场景,一个闪黑一瞬间的问题,正常我们看到黑屏冻屏问题,是不是时刻想到是要来dumpsys SurfaceFlinger和dumpsys window windows相关的信息来辅助我们分析问题,但奈何这个是个瞬时问题。。。我们dumpsys很难抓住那一瞬间,而且即使抓到了黑一瞬间的,我

    2024年02月08日
    浏览(37)
  • Android Framework最难模块WMS实战作业-手机车机系统开发必备

    0-整体介绍 1-window-container.mp4 窗口层级树实战启动篇 2-displayarea-feature.mp4 窗口层级树源码分析相关 3-displayarea-draw-feature.mp4 窗口层级树绘制实战1 4-displayarea-draw-leaf.mp4 窗口层级树绘制实战2 5-displayarea-draw-leaf-2.mp4 窗口层级树绘制实战3 6-displayarea-surfacelayer.mp4 窗口层级树相关sur

    2024年02月12日
    浏览(46)
  • linux环境下docker中搭建 jenkins 及自定义访问路径,利用nginx反向代理

    前两天发布了完整的 linux服务器上Docker中安装jenkins 在实际的开发中,可能我们并不能直接开放8081或者8080端口给jenkins使用,常常是通过nginx方向代理来实现的,这里我们来配置一下。 如果你还没有安装 可以参考我这篇文章 linux服务器上Docker中安装jenkins 看到目录: 创建一个

    2024年02月16日
    浏览(56)
  • android多屏触摸相关的详解方案-安卓framework开发手机车载车机系统开发课程

    直播免费视频课程地址:https://www.bilibili.com/video/BV1hN4y1R7t2/ 在做双屏相关需求开发过程中,经常会有对两个屏幕都要求可以正确触摸的场景。但是目前我们模拟器默认创建的双屏其实是没有办法进行触摸的 静态修改方案 使用命令查看display2即副屏的信息情况 adb shell dumpsys d

    2024年02月11日
    浏览(46)
  • android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程

    官网参考链接:https://developer.android.google.cn/develop/ui/views/appwidgets/overview App widgets are miniature application views that can be embedded in other applications (such as the home screen) and receive periodic updates。 通俗解释:一个能够定期刷新并且加到其他应用上的微型视图。 更多android framework干货内容请

    2024年02月09日
    浏览(52)
  • 第二节-安卓多屏双屏实战车载车机智能驾驶舱开发/千里马android framwork开发

    hi,粉丝朋友们! 上一节已经对车载的多屏互动进行了相关的技术方案介绍,以及相关的核心方法 moveRootTaskToDisplay的讲解和使用。 具体可以参考链接:https://blog.csdn.net/learnframework/article/details/130461689 本节就来进行代码实战 要实现双屏互动,主要就只需要两个步骤: 1、手指动

    2024年02月09日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包