我正在编写一个新的Android Audio HAL,让我的应用程序将音频提供给其他应用程序,以允许我的掌上电脑远程麦克风输入到达Google应用程序.基本上,虚拟音频线.
它正在进行中.我可能会重写AUDIO_DEVICE_IN_BACK_MIC,但这是有建议的.
我对如何确保Android使用此HAL进行输入有疑问.
我需要替换audio.primary.default.so还是应该将其保留为audio.vcable.default.so?
更具体地说:如果我不替换主要内容,Android将如何知道使用我的HAL而不是主要?
更新:
我真的可以在这项工作中使用任何帮助.任何指针都有帮助.
我写过一个Audio HAL模块.我在audio_policy.conf中添加了以下(粗体项):
全球:
global_configuration {
attached_output_devices AUDIO_DEVICE_OUT_SPEAKER|**AUDIO_DEVICE_OUT_LINE**
default_output_device AUDIO_DEVICE_OUT_SPEAKER
attached_input_devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_BACK_MIC|AUDIO_DEVICE_IN_REMOTE_SUBMIX|**AUDIO_DEVICE_IN_LINE**
}
Run Code Online (Sandbox Code Playgroud)
并在audio_hw_modules下
vloop {
inputs {
vloop {
sampling_rates 16000
channel_masks AUDIO_CHANNEL_IN_MONO
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_IN_LINE
}
}
outputs {
vloop {
sampling_rates 16000
channel_masks AUDIO_CHANNEL_OUT_STEREO
formats AUDIO_FORMAT_PCM_16_BIT
devices AUDIO_DEVICE_OUT_LINE
flags AUDIO_OUTPUT_FLAG_DIRECT
}
}
}
Run Code Online (Sandbox Code Playgroud)
我还在AudioFlinger.cpp中添加了以下(粗体)
static const char * const audio_interfaces[] = {
AUDIO_HARDWARE_MODULE_ID_PRIMARY,
AUDIO_HARDWARE_MODULE_ID_A2DP,
AUDIO_HARDWARE_MODULE_ID_USB,
**AUDIO_HARDWARE_MODULE_ID_VLOOP**
};
Run Code Online (Sandbox Code Playgroud)
我可以看到,在启动过程中,我的HAL被加载,我得到这些日志:
10-06 06:14:40.365 194-194/? I/AudioFlinger: Using default 3000 mSec as standby …Run Code Online (Sandbox Code Playgroud) 我之前写过一个独立的守护进程来访问自定义设备(/ dev/mydev0).看看AOSP源代码,我认为我需要在以下文件中设置策略才能使其工作:
新文件device.te包含:
type mydev_device, dev_type;
Run Code Online (Sandbox Code Playgroud)
新文件mydevsrvc.te包含
# service flash_recovery in init.rc
type mydevsrvc_type, domain;
type mydevsrvc_type_exec, exec_type, file_type;
init_daemon_domain(mydevsrvc_type)
allow mydevsrvc_type mydev_device:chr_file rw_file_perms;
Run Code Online (Sandbox Code Playgroud)
编辑file_contexts添加:
/dev/mydev[0-9]* u:object_r:mydev_device:s0
Run Code Online (Sandbox Code Playgroud)
编辑service_contexts添加:
mydevsrvc u:object_r:mydevsrvc_type:s0
Run Code Online (Sandbox Code Playgroud)
并通过编辑init.flo.rc来启动守护进程以包含以下行:
service mydevsrvc /system/bin/mydevsrvc
class main
user system
group system
seclabel u:r:mydevsrvc_type:s0
oneshot
Run Code Online (Sandbox Code Playgroud)
现在,我需要访问Android应用程序中的设备,所以我必须将守护进程更改为Android系统服务.
我可以使用BOOT_COMPLETED意图启动服务(线程),如前一个问题中所述
我无法弄清楚如何设置SELinux策略,以便此java服务也能够访问dev文件.
[更新]为此,我继续使用特权守护进程.我的java服务通过套接字连接到守护进程.我没有更好的解决方案.
我尝试按照 Google 在此页面上的说明为 Nexus 5X 构建新内核
我执行的命令的确切顺序是:
$ git clone https://android.googlesource.com/kernel/msm
$ export ARCH=arm64
$ export CROSS_COMPILE=aarch64-linux-android-
$ cd msm
$ git checkout -b android-msm-bullhead-3.10-marshmallow-mr1 origin/android-msm-bullhead-3.10-marshmallow-mr1
$ make bullhead_defconfig
$ make
Run Code Online (Sandbox Code Playgroud)
在最后一个命令后,我收到以下错误:
Makefile:796: *** multiple target patterns. Stop.
Run Code Online (Sandbox Code Playgroud)
调查:
现在 makefile 中的第 796 行是:
vmlinux: scripts/link-vmlinux.sh $(vmlinux-deps) FORCE
Run Code Online (Sandbox Code Playgroud)
和其他相关线路是:
vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)
export KBUILD_VMLINUX_INIT := $(head-y) $(init-y)
export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y) $(drivers-y) $(net-y)
export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds
Run Code Online (Sandbox Code Playgroud)
我发现如果我 …
我有一个蓝牙HID设备,我需要得到工作与在Android 5.0分叉一台Nexus 7平板电脑2013运行自定义生成运行我的应用程序。所以:
@hide 不是约束现在我的设备有一个键盘,并且发送和接受一些供应商特定的 HID 报告。通过工作,我的意思是发送和接收所有 HID 报告
基于我所做的 AOSP 源代码探索,似乎:
该HidService服务广播BluetoothInputDevice.ACTION_REPORT所有输入 HID 报告的意图 [我的应用程序有一个BroadcastReceiver接收ACTION_REPORT意图]
BluetoothInputDevice提供了其他的接口等setReport(),sendData(),connect()通过等HidService。
BluetoothInputDevice用于HidService提供 HID 设备接口。
HidService.java 是一个 JNI 包装器 com_android_bluetooth_hid.cpp
com_android_bluetooth_hid.cpp,在 初始化时HidService,将自己的回调注册到 Bluedroid
我已将日志添加到 AOSP 以跟踪调用,似乎以上所有内容都是正确的。
但
在get_report_callback()中com_android_bluetooth_hid.cpp不会被调用,因此,我的应用程序不接收ACTION_REPORT意向。
如果我ACTION_REPORT从我的应用程序发送虚拟意图,那么我BroadcastReceiver …
由于原因,我不得不重新安装ubuntu-14.04-64.
重新安装之后,当我尝试构建我的android项目时,我在输出中得到了一堆这些行(以及其他行):
java.io.IOException: Cannot run program "/home/gps/Android/Sdk/build-tools/23.0.2/aapt": error=2, No such file or directory
Run Code Online (Sandbox Code Playgroud)
现在,我知道我的设置中存在此文件,因为:
gps@gps-HP-ProBook-4540s:~$ ls -l /home/gps/Android/Sdk/build-tools/23.0.2/aapt
-rwxrwxr-x 1 gps gps 1146608 Jan 4 18:47 /home/gps/Android/Sdk/build-tools/23.0.2/aapt
gps@gps-HP-ProBook-4540s:~$ file /home/gps/Android/Sdk/build-tools/23.0.2/aapt
/home/gps/Android/Sdk/build-tools/23.0.2/aapt: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=fc8aded5418584519d59f2133e81184fe3d4bdfd, not stripped
gps@gps-HP-ProBook-4540s:~$
Run Code Online (Sandbox Code Playgroud)
我从v19开始安装了所有sdk工具.将项目设置更改为任何一个都显示相同的错误.
此外,尝试直接执行文件会产生同样的错误:
gps@gps-HP-ProBook-4540s:~$ /home/gps/Android/Sdk/build-tools/23.0.2/aapt
bash: /home/gps/Android/Sdk/build-tools/23.0.2/aapt: No such file or directory
Run Code Online (Sandbox Code Playgroud)
有人可以建议解决这个问题吗?