如何绕过Java在Android上进行GPIO

如何绕过Java在Android上进行GPIO,android,android-ndk,raspberry-pi3,android-things,Android,Android Ndk,Raspberry Pi3,Android Things,我一直在尝试使用NDK访问Raspberry Pi上Android things上的GPIO,但在尝试了几种方法之后,我总是发现某种安全墙阻止我访问它 其动机是我使用JavaAPI从GPIO获得的缓慢速度。作为一个基本的参考,我能够在大约2KHz的频率下打开和关闭它,这恰好是其中最差的频率。另请参见,到目前为止还没有答案,我在其中添加了关于java速度的评论。事实上,这项工作的动机是我在检查这个问题时得到的结果 到目前为止,最好的方法是尝试类似于Debian下sysfs的方法。从这个意义上讲,代

我一直在尝试使用NDK访问Raspberry Pi上Android things上的GPIO,但在尝试了几种方法之后,我总是发现某种安全墙阻止我访问它

其动机是我使用JavaAPI从GPIO获得的缓慢速度。作为一个基本的参考,我能够在大约2KHz的频率下打开和关闭它,这恰好是其中最差的频率。另请参见,到目前为止还没有答案,我在其中添加了关于java速度的评论。事实上,这项工作的动机是我在检查这个问题时得到的结果

到目前为止,最好的方法是尝试类似于Debian下sysfs的方法。从这个意义上讲,代码似乎是公平的,但在以root用户身份运行、以系统应用程序的形式安装应用程序(通过将其移动到/system/app)和chmod a+rw之后,
/sys/class/gpio/
/sys/class/gpio/gpio24/
以及
/dev/gpioem
这就是我得到的:

01-27 12:54:47.069  8412  8412 I NativeHelper: Call native = hello from helper java class
01-27 12:54:47.079  8412  8412 I NativeHelper: Open pin true
01-27 12:54:47.080  8412  8412 F libc    : Fatal signal 4 (SIGILL), code 1, fault addr 0xaf2e039c in tid 8412 (le.thingssample)
01-27 12:54:47.081   128   128 W         : debuggerd: handling request: pid=8412 uid=10028 gid=10028 tid=8412
01-27 12:54:47.066  8412  8412 I le.thingssample: type=1400 audit(0.0:211): avc: denied { write } for name="export" dev="sysfs" ino=854 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:sysfs:s0 tclass=file permissive=1
01-27 12:54:47.076  8412  8412 I le.thingssample: type=1400 audit(0.0:212): avc: denied { open } for path="/sys/class/gpio/export" dev="sysfs" ino=854 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:sysfs:s0 tclass=file permissive=1
01-27 12:54:47.166  8427  8427 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-27 12:54:47.166  8427  8427 F DEBUG   : Build fingerprint: 'generic/iot_rpi3/rpi3:7.0/NIF73/3565696:userdebug/test-keys'
01-27 12:54:47.166  8427  8427 F DEBUG   : Revision: '0'
01-27 12:54:47.166  8427  8427 F DEBUG   : ABI: 'arm'
01-27 12:54:47.167  8427  8427 F DEBUG   : pid: 8412, tid: 8412, name: le.thingssample  >>> com.amazingapps.sample.thingssample <<<
01-27 12:54:47.167  8427  8427 F DEBUG   : signal 4 (SIGILL), code 1 (ILL_ILLOPC), fault addr 0xaf2e039c
01-27 12:54:47.167  8427  8427 F DEBUG   :     r0 00000000  r1 b1f5e59f  r2 b1f5e59f  r3 af2e1c55
01-27 12:54:47.167  8427  8427 F DEBUG   :     r4 00000000  r5 be8e35fc  r6 acca3230  r7 be8e35d8
01-27 12:54:47.167  8427  8427 F DEBUG   :     r8 be8e36f8  r9 acc85400  sl 00000000  fp be8e3684
01-27 12:54:47.168  8427  8427 F DEBUG   :     ip be8e3590  sp be8e3598  lr ae7fbd2b  pc af2e039c  cpsr 60000030
01-27 12:54:47.170  8427  8427 F DEBUG   :
01-27 12:54:47.170  8427  8427 F DEBUG   : backtrace:
01-27 12:54:47.170  8427  8427 F DEBUG   :     #00 pc 0000139c  /data/app/com.amazingapps.sample.thingssample-1/lib/arm/libsample.so (Java_com_amazingapps_sample_thingssample_ndk_NativeHelper_doAll+59)
01-27 12:54:47.170  8427  8427 F DEBUG   :     #01 pc 002c8cb3  /data/app/com.amazingapps.sample.thingssample-1/oat/arm/base.odex (offset 0x2af000)
01-27 12:54:48.133   408  8432 W ActivityManager:   Force finishing activity com.amazingapps.sample.thingssample/.view.MainActivity
01-27 12:54:48.137   128   128 W         : debuggerd: resuming target 8412
01-27 12:54:48.138   408   427 I BootReceiver: Copying /data/tombstones/tombstone_02 to DropBox (SYSTEM_TOMBSTONE)
01-27 12:54:48.228  8433  8433 W crash_reporter: Received crash notification for app_process32[8412] sig 4, user 10028 (handling)
01-27 12:54:48.233  8433  8433 I crash_reporter: State of crashed process [8412]: S (sleeping)
01-27 12:54:48.226  8433  8433 I crash_reporter: type=1400 audit(0.0:213): avc: denied { search } for name="8412" dev="proc" ino=214991 scontext=u:r:crash_reporter:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=dir permissive=1
01-27 12:54:48.226  8433  8433 I crash_reporter: type=1400 audit(0.0:214): avc: denied { read } for name="exe" dev="proc" ino=217417 scontext=u:r:crash_reporter:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=lnk_file permissive=1
01-27 12:54:48.226  8433  8433 I crash_reporter: type=1400 audit(0.0:215): avc: denied { read } for scontext=u:r:crash_reporter:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=file permissive=1
01-27 12:54:48.226  8433  8433 I crash_reporter: type=1400 audit(0.0:216): avc: denied { open } for path="/proc/8412/status" dev="proc" ino=216902 scontext=u:r:crash_reporter:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=file permissive=1
01-27 12:54:48.226  8433  8433 I crash_reporter: type=1400 audit(0.0:217): avc: denied { getattr } for path="/proc/8412/status" dev="proc" ino=216902 scontext=u:r:crash_reporter:s0 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=file permissive=1
01-27 12:54:48.672   408   422 W ActivityManager: Activity pause timeout for ActivityRecord{f2233fb u0 com.amazingapps.sample.thingssample/.view.MainActivity t86 f}
01-27 12:54:47.069 8412 8412 I NativeHelper:Call native=hello from helper java类
01-27 12:54:47.079 8412 8412 I NativeHelper:打开pin为真
01-27 12:54:47.080 8412 8412 F libc:tid 8412中的致命信号4(信号),代码1,故障地址0xaf2e039c(le.thingssample)
01-27 12:54:47.081 128 W:调试程序D:处理请求:pid=8412 uid=10028 gid=10028 tid=8412
01-27 12:54:47.066 8412 8412 I le.thingssample:type=1400 audit(0.0:211):avc:denied{write}for name=“export”dev=“sysfs”ino=854 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object\r:sysfs:s0 tclass=file permissive=1
01-27 12:54:47.076 8412 8412 I le.thingssample:type=1400 audit(0.0:212):avc:denied{open}for path=“/sys/class/gpio/export”dev=“sysfs”ino=854 scontext=u:r:untrusted\u app:s0:c512,c768 tcontext=u:object\u r:sysfs:s0 tclass=file permissive=1
01-27 12:54:47.166 8427 8427 F调试:******************************************************
01-27 12:54:47.166 8427 8427 F调试:生成指纹:“通用/iot_rpi3/rpi3:7.0/NIF73/3565696:用户调试/测试密钥”
01-27 12:54:47.166 8427 8427 F调试:修订版:“0”
01-27 12:54:47.166 8427 8427 F调试:ABI:“arm”
01-27 12:54:47.167 8427 8427 F调试:pid:8412,tid:8412,名称:le.thingssample>>>com.amazingapps.sample.thingssample编辑:

每次运行应用程序时都要运行类似的程序(适用于pin 24,替换为首选pin):

不幸的是,调用execl返回-1,系统返回32256,因此无法替换此手动步骤。即使尝试
系统(“/system/bin/date>/storage/self/primary/now”)将给出32256

然后将一个脚本放在一起,该脚本侦听一个命名管道,并基于该管道运行上述代码。在使用
su
chmod
使其易于运行后,我编写了一个C代码,可以写入同一管道。添加300毫秒,等待管道被读取,我将从apk内部的C代码开始写入gpio23/方向和gpio/值

Led灯亮了,只要我优化C代码以实现更紧密的循环,我就会发布一些速度基准测试

这里有完整的解决方案。有关说明,请查看README.md

为了更好,我需要调试命名管道读取,因为有时我读取了错误的信息。并使脚本在启动时启动

cd /sys/class/gpio
su root chmod a+w export
echo 24 > export
su root chmod a+w gpio24/direction
su root chmod a+w gpio24/value

ls gpio24/ -l