几个月前,在Android ICS(4.0)中,我开发了一个安卓内核模块,它拦截了"pcmC0D0p"模块以获取所有系统音频.
我的目标是通过AirPlay将所有音频(或至少播放的音乐)流式传输到远程扬声器.
内核模块工作,但有几个问题(内核版本,root权限等),所以我停止了这个.
现在,我们有Android 4.1和4.2,我有了新的希望!
谁知道如何在Android中捕获音频?
我有以下想法:
通过蓝牙连接 到同一部手机,设置路由到BT并抓住"另一端"的音频:这不应该工作
使用像以前那样的内核模块拦截音频:硬核,让它工作但不适用
JACK音频连接套件:遗憾的是Android使用"tinyALSA"而不是"ALSA".TinyALSA不支持任何像JACK这样的过滤器(但这带来了内核模块的想法)
使用PulseAudio代替AudioFlinger,但这也不适用
编辑(忘了他们):
我从tinyALSA(Android上的ALSA )编译了"tinymix"(ALSA-mixer的婴儿版)并试图将音频输出到麦克风输入 - 但没有成功(对我来说不可理解).这也需要生根:不适用
我测试了OpenSL ES,但我不是C-crack,它的结尾是"我可以录制麦克风,但没有更多"(也许我错了?)
我刚刚找到了ROUTE_TYPE_LIVE_AUDIO:
支持实时音频路由的设备将允许将媒体音频流路由到支持的目的地.这可能包括设备本身的内置扬声器或音频插孔,A2DP设备等.
一旦启动,此路由对应用程序是透明的.媒体流上播放的所有音频都将路由到所选目的地.
也许这有助于任何方式?
我的想法已经不多了但是想"破解这个坚果",也许有人可以帮助我?
编辑:
我是C和内核编码的新手(但我成功地创建了一个交叉编译的音频拦截模块) - 但是在用户空间(JAVA)发送PCM数据的时候,它是不是可以用来监听,C层?)到内核空间(tinyALSA,内核模块),没有黑客攻击和生根?
对于我的Android应用程序,我现在正在使用ABI"x86"和"armeabi".armeabi用于所有ARM设备,包括armv7a和arm64-v8a.
现在我想删除"armeabi"并继续使用"x86"和"armeabi-v7a".
我没有在文档中找到任何提示,ARMv8也与ARMv7兼容 - 任何人都可以确认我的应用程序仍然可以在运行arm64-v8a的设备上运行,如果我不提供armeabi但现在是armeabi-v7a图书馆?
我是Android 的root -app 的开发者.
可悲的是,现在在某些设备/ ROM的存在的SELinux在执行 -模式,防止我的应用程序的一些行动.
因为这是一个root-app,用户正在授予我root权限!
现在,SELinux阻止了我的一些行为,我需要为此找到解决方案.
我试图临时禁用SELinux
setenforce permissive -> no failure, but getenforce still returns "Enforcing"
cat 0 > /sys/fs/selinux/enforce -> no failure, but getenforce still returns "Enforcing"
Run Code Online (Sandbox Code Playgroud)
我想在运行时编辑sepolicy -file以允许阻塞命令并触发重新加载,但我不确定它是否以及如何工作,也不是一个好主意.
谁有更多的提示或资源给我?
在Android 4.x中,将APK文件放入/ system/priv-app就足够了,并且包管理器识别出新文件并且(取消)安装了相应的应用程序或服务.
从Android L开始,将文件放入该目录似乎还不够 - 需要重新启动系统才能强制Android识别该更改.
有谁知道如何规避这个?也许与任何setprop ctl.restart xxx或通过杀死一个专门的服务?
编辑:
以下是logcat的一些日志:
su
mount -o remount rw /system
cd /system/priv-app
mv ../AARSCService.apk . // move from /system to /system/priv-app
W/mv ( 3268): type=1400 audit(0.0:53): avc: denied { rename } for name="AARSCService.apk" dev="mmcblk0p22" ino=23041 scontext=u:r:init:s0 tcontext=u:object_r:system_file:s0 tclass=file
Run Code Online (Sandbox Code Playgroud)
(但是文件已被移动,因为Nexus 7 Android Android L P2的当前根实现禁用了SELinux的root命令!)
- > APK未加载且未在app-list中列出 - >不按预期,APK将在Android 4.4上放入priv-app文件夹后自动安装.
reboot
I/PackageManager( 567): /system/priv-app/AARSCService.apk changed; collecting certs
Run Code Online (Sandbox Code Playgroud)
- > APK已加载并在app-list中列出 - >按预期方式
我开发了一个内核模块(Android),它为我提供:
PCM
16-bit
48000 Hz
2 channel
Run Code Online (Sandbox Code Playgroud)
我想把它流式传输到Java的Apple机场快线(AEX).
AEX需要44.1 kHz PCM,因此我必须重新采样PCM流.
我有以下可能性,但哪个最好?
advantages:
high-performant due to native C
already uses libsamplerate to resample wav, mp3, ogg, flac, aac, pls
openssl as static library
usable via command-line from my java-program via Runtime.exec()
disadvantages:
I am relative new to C
overloaded: I don't need wav, mp3.. only PCM
many dependencies with GPL-libraries which I have to compile for Android
only supports PCM already with 44.1 kHz, no resampling for …Run Code Online (Sandbox Code Playgroud) 我是GPARS库的新手,目前正在我们的软件中实现它.
对我来说,使用它而不是像普通的groovy方法一样没问题
[..].each{..}
->
[..].eachParallel{..}
Run Code Online (Sandbox Code Playgroud)
但我想知道如何并行化2个返回值的任务.
没有GPARS,我会这样做:
List<Thread> threads = []
def forecastData
def actualData
threads.add(Thread.start {
forecastData = cosmoSegmentationService.getForecastSegmentCharacteristics(dataset, planPeriod, thruPeriod)
})
threads.add(Thread.start {
actualData = cosmoSegmentationService.getMeasuredSegmentCharacteristics(dataset, fromPeriod, thruPeriodActual)
})
threads*.join()
// merge both datasets
def data = actualData + forecastData
Run Code Online (Sandbox Code Playgroud)
但是(如何)可以用GparsPool完成?
我开发了一个Android应用程序,它还包含一个用C编写的本机部分(不依赖于应用程序).
如果共享库不起作用,则应用程序本身是无用的.
我想让native-part(共享库)只做它的工作,如果它已经附带了一个未经修改的应用程序版本(.apk).
对我来说最好的方法就是这样:
通过这种方式,我想保护我的应用程序免受修改和盗版.
这样做有什么提示吗?我刚刚在java中找到了检查自己签名的帖子,但是如果可以解开并重新编译应用程序,这就是无聊的.
I'm trying to intercept some native library-calls via LD_PRELOAD.
This is working fine for simple libraries written in C, but now I try to go further and override some more complex class-methods from the AOSP written in C++.
Here's my example:
#include <rs/cpp/util/RefBase.h>
namespace android {
sp<MediaCodec> MediaCodec::CreateByType(const sp<ALooper> &looper, const char *mime, bool encoder) {
// TODO this will be implemented by me
return NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
In my Application.mk, I got the following piece of code:
APP_STL := …Run Code Online (Sandbox Code Playgroud) 我是一个应用程序的开发人员,它已经可用并且运行良好大约两年了。
仅在最近的三星设备上,该应用程序会在用户通过退出按钮关闭应用程序后由系统随机启动。此退出按钮会停止所有服务和活动,并通过 Android 的“killProcess”方法终止应用程序,因此这不是简单地重新启动崩溃的应用程序。它是一个在后台运行的实用程序应用程序,如果用户关闭它,它必须停止并保持关闭状态,因为它会在后台产生大量流量。也许我可以在清单文件中添加一些内容?
三星的“PkgPredictorService:[com.samsung.android.nextapp.IPkgPredictor]”似乎默默地启动了我基于“机器学习”的应用程序:
165668 08-17 18:41:58.843 4971 5299 D PkgPredictorService-NapPreloadController: preload pkg: [] type: ml
165669 08-17 18:41:58.843 4971 5299 D PkgPredictorService-NapPreloadController: Sent pkg = eu.abc.pro type: ml
165670 08-17 18:41:58.844 4971 5665 D ActivityManager: [ML] packageName : eu.abc.pro uid : 0 type : ml
165672 08-17 18:41:58.844 4971 5665 D ActivityManager: [ML]launchEmptyProcess packageName :eu.abc.pro, userId : 0, type :ml
165674 08-17 18:41:58.847 4971 5665 I ApplicationPolicy: isApplicationExternalStorageWhitelisted:eu.abc.pro user:0
165676 08-17 18:41:58.847 4971 5665 D ActivityManager: package eu.abc.pro, …Run Code Online (Sandbox Code Playgroud) 我创建了一个 FIFO,我可以在其中以这种方式进行非阻塞写入:
// others, searching for a non-blocking FIFO-writer may copy this ;-)
mkfifo("/tmp/myfifo", S_IRWXU);
int fifo_fd = open("/tmp/myfifo", O_RDWR);
fcntl(fifo_fd, F_SETFL, fcntl(fifo_fd, F_GETFL) | O_NONBLOCK);
// and then in a loop:
LOGI("Writing into fifo.");
if (write(fifo_fd, data, count) < 0) {
LOGE("Failed to write into fifo: %s", strerror(errno));
}
Run Code Online (Sandbox Code Playgroud)
非阻塞写入工作完美。
另一方面,我打开 FIFO 进行读取并执行相同的 fcntl() 以使 read() 非阻塞。
我现在想在写入端进行几个(cpu 密集型)计算,但前提是有一个读者。
因此,我需要在写入端找到一种方法,以检测 FIFO 是否已打开以在其他地方读取。
有谁知道如何实现这一目标?
android ×6
c ×3
abi ×1
alsa ×1
android-ndk ×1
audio ×1
autostart ×1
c++ ×1
capture ×1
fifo ×1
gpars ×1
groovy ×1
java ×1
nonblocking ×1
resampling ×1
selinux ×1
signature ×1
verification ×1