小编Mar*_* L.的帖子

Android> 4.0:想法如何录制/捕获内部音频(例如STREAM_MUSIC)?

几个月前,在Android ICS(4.0)中,我开发了一个安卓内核模块,它拦截了"pcmC0D0p"模块以获取所有系统音频.

我的目标是通过AirPlay将所有音频(或至少播放的音乐)流式传输到远程扬声器.

内核模块工作,但有几个问题(内核版本,root权限等),所以我停止了这个.

现在,我们有Android 4.1和4.2,我有了新的希望!

谁知道如何在Android中捕获音频?

我有以下想法:

  1. 通过蓝牙连接 到同一部手机,设置路由到BT并抓住"另一端"的音频:这不应该工作

  2. 使用像以前那样的内核模块拦截音频:硬核,让它工作但不适用

  3. JACK音频连接套件:遗憾的是Android使用"tinyALSA"而不是"ALSA".TinyALSA不支持任何像JACK这样的过滤器(但这带来了内核模块的想法)

  4. 使用PulseAudio代替AudioFlinger,但这也不适用


编辑(忘了他们):

  1. 我从tinyALSA(Android上的ALSA )编译了"tinymix"(ALSA-mixer的婴儿版)并试图将音频输出到麦克风输入 - 但没有成功(对我来说不可理解).这也需要生根:不适用

  2. 我测试了OpenSL ES,但我不是C-crack,它的结尾是"我可以录制麦克风,但没有更多"(也许我错了?)


我刚刚找到了ROUTE_TYPE_LIVE_AUDIO:

支持实时音频路由的设备将允许将媒体音频流路由到支持的目的地.这可能包括设备本身的内置扬声器或音频插孔,A2DP设备等.

一旦启动,此路由对应用程序是透明的.媒体流上播放的所有音频都将路由到所选目的地.

也许这有助于任何方式?

我的想法已经不多了但是想"破解这个坚果",也许有人可以帮助我?

编辑:

我是C和内核编码的新手(但我成功地创建了一个交叉编译的音频拦截模块) - 但是在用户空间(JAVA)发送PCM数据的时候,它是不是可以用来监听,C层?)到内核空间(tinyALSA,内核模块),没有黑客攻击和生根?

audio android alsa capture

39
推荐指数
1
解决办法
2万
查看次数

arm64-v8a与armeabi-v7a兼容吗?

对于我的Android应用程序,我现在正在使用ABI"x86"和"armeabi".armeabi用于所有ARM设备,包括armv7a和arm64-v8a.

现在我想删除"armeabi"并继续使用"x86"和"armeabi-v7a".

我没有在文档中找到任何提示,ARMv8也与ARMv7兼容 - 任何人都可以确认我的应用程序仍然可以在运行arm64-v8a的设备上运行,如果我不提供armeabi但现在是armeabi-v7a图书馆?

compatibility android abi

39
推荐指数
1
解决办法
4万
查看次数

在Android上临时禁用或修改SELinux

我是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 selinux

18
推荐指数
2
解决办法
4万
查看次数

Android 5.0/Lollipop:强制重新扫描/ system/priv-app

在Android 4.x中,将APK文件放入/ system/priv-app就足够了,并且包管理器识别出新文件并且(取消)安装了相应的应用程序或服务.

从Android L开始,将文件放入该目录似乎还不够 - 需要重新启动系统才能强制Android识别该更改.

有谁知道如何规避这个?也许与任何setprop ctl.restart xxx或通过杀死一个专门的服务?

编辑:

以下是logcat的一些日志:

1.将APK从/ system移动到/ system/priv-app(=安装)

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文件夹后自动安装.

2.重启设备,有APK内部/ system/priv-app

reboot

I/PackageManager(  567): /system/priv-app/AARSCService.apk changed; collecting certs
Run Code Online (Sandbox Code Playgroud)

- > APK已加载并在app-list中列出 - >按预期方式

3.将APK从/ system/priv-app移动到/ system(= …

android android-5.0-lollipop

13
推荐指数
1
解决办法
2万
查看次数

最佳实践:在哪里重新采样PCM和哪种工具?

我开发了一个内核模块(Android),它为我提供:

PCM
16-bit
48000 Hz
2 channel
Run Code Online (Sandbox Code Playgroud)

我想把它流式传输到Java的Apple机场快线(AEX).

AEX需要44.1 kHz PCM,因此我必须重新采样PCM流.

我有以下可能性,但哪个最好?

1.使用C程序"raop_play"(raop-play的一部分)

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)

c java java-native-interface kernel-module resampling

9
推荐指数
1
解决办法
1753
查看次数

Groovy/Grails GPARS:如何并行执行2次计算?

我是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完成?

parallel-processing groovy gpars

7
推荐指数
1
解决办法
3080
查看次数

检查C /本机代码中的.apk-signature

我开发了一个Android应用程序,它还包含一个用C编写的本机部分(不依赖于应用程序).

如果共享库不起作用,则应用程序本身是无用的.

我想让native-part(共享库)只做它的工作,如果它已经附带了一个未经修改的应用程序版本(.apk).

对我来说最好的方法就是这样:

  1. 应用程序已安装
  2. 共享库检查应用程序/ .apk的签名/哈希
  3. 只有在签名与已知签名匹配时才能正常工作

通过这种方式,我想保护我的应用程序免受修改和盗版.

这样做有什么提示吗?我刚刚在java中找到了检查自己签名的帖子,但是如果可以解开并重新编译应用程序,这就是无聊的.

c verification android signature

6
推荐指数
1
解决办法
4570
查看次数

Use "sp" in Android NDK

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)

c++ android-ndk

6
推荐指数
1
解决办法
7249
查看次数

由于“机器学习”,防止 Android 应用程序自动启动(三星的 PkgPredictorService)

我是一个应用程序的开发人员,它已经可用并且运行良好大约两年了。

仅在最近的三星设备上,该应用程序会在用户通过退出按钮关闭应用程序后由系统随机启动。此退出按钮会停止所有服务和活动,并通过 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)

android autostart samsung-galaxy

6
推荐指数
0
解决办法
583
查看次数

非阻塞 FIFO:检测读取器是否存在?

我创建了一个 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 是否已打开以在其他地方读取。

有谁知道如何实现这一目标?

c nonblocking fifo

5
推荐指数
1
解决办法
3689
查看次数