我是否用这个:
process = Runtime.getRuntime().exec("logcat -d time");
Run Code Online (Sandbox Code Playgroud)
或者那个:
process = new ProcessBuilder()
.command("logcat", "-d", "time")
.redirectErrorStream(true)
.start();
Run Code Online (Sandbox Code Playgroud)
我得到了相同的结果:它经常挂在exec()或start()调用中,无论我试图做什么!运行它的线程甚至不能被Thread.interrupt()中断!子进程肯定已启动,如果被杀死,则返回上述命令.
这些调用可能在第一次尝试时失败,所以没有办法阅读他们的输出!我也可以用一个简单的"su -c kill xxx"命令行,结果相同!
编辑:开始使用一些调试日志调试NDK项目中的java_lang_ProcessManager.cpp文件!所以这是我到目前为止找到的,在fork()之后父进程执行此操作:
int result;
int count = read(statusIn, &result, sizeof(int)); <- hangs there
close(statusIn);
Run Code Online (Sandbox Code Playgroud)
虽然子进程不应该阻止它:这就是孩子所做的事情(如果开始的话!):
// Make statusOut automatically close if execvp() succeeds.
fcntl(statusOut, F_SETFD, FD_CLOEXEC); <- make the parent will not block
// Close remaining unwanted open fds.
closeNonStandardFds(statusOut, androidSystemPropertiesFd); <- hangs here sometimes
...
execvp(commands[0], commands);
// If we got here, execvp() failed or the working …Run Code Online (Sandbox Code Playgroud) 很长一段时间以来(一年或更长时间),我看到 Play Console 中报告的应用程序崩溃(生产和预发布报告)以及调试有关 Google Play 服务的炸药测量时的一些错误消息,例如:
W/02:14:21.497 at dx.run(:com.google.android.gms.dynamite_measurementdynamite@201817081@20.18.17 (120400-0):2)
W/02:14:21.497 at kx.a(:com.google.android.gms.dynamite_measurementdynamite@201817081@20.18.17 (120400-0):3)
W/02:14:21.497 at lm.A(:com.google.android.gms.dynamite_measurementdynamite@201817081@20.18.17 (120400-0):10)
W/02:14:21.497 at ce.a(:com.google.android.gms.dynamite_measurementdynamite@201817081@20.18.17 (120400-0):5)
W/02:14:21.497 at ce.b(:com.google.android.gms.dynamite_measurementdynamite@201817081@20.18.17 (120400-0):1)
W/02:14:21.497 at android.content.ContextWrapper.unbindService(ContextWrapper.java:755)
W/02:14:21.497 at android.app.ContextImpl.unbindService(ContextImpl.java:1848)
W/02:14:21.497 at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:1870)
W/02:14:21.497 java.lang.IllegalArgumentException: Service not registered: ll@e97c861
Run Code Online (Sandbox Code Playgroud)
我不使用任何分析包。只有广告,我理解包括分析。
所以我在 AdMob 的控制台中禁用了我的所有广告分析,但我仍然可以看到这些。崩溃有时占我所有应用程序崩溃的 90%。
由于它没有帮助,我试图用各种方法摆脱这些包:
混淆器:
-assumenosideeffects class com.google.android.gms.dynamite.** {}
Run Code Online (Sandbox Code Playgroud)
摇篮:
all*.exclude group: 'com.google.android.gms', module: ''
Run Code Online (Sandbox Code Playgroud)
最后一个应该摆脱所有的播放服务,但它根本没有。
最后但并非最不重要的一点是,由于 Google 的跟踪,许多用户不想安装我的应用程序!
关于如何摆脱这种情况的任何想法?
编辑:在此处开启了关于 Google 小组的讨论:https : //groups.google.com/d/msg/google-admob-ads-sdk/MPaM8ZsK3uE/gupfpLPtAwAJ
此外,这种行为似乎不太符合 GDPR,并且 SDK 无法提供。
我有一个 C 二进制文件,在 Android 中使用 root 用户(su -c binary_path)运行。
一切正常,直到二进制文件尝试 exec*() 另一个二进制文件。它实际上适用于大多数设备,但是在某些设备上我收到 EACCES 错误。
C 二进制文件实际上是使用以下命令启动的:
execlp("su","su","-c",binary_path,NULL);
Run Code Online (Sandbox Code Playgroud)
在某些时候,二进制文件将尝试进行这些调用(简化):
fork();
...
// child here
execlp("sh","sh","-c",script,NULL);
Run Code Online (Sandbox Code Playgroud)
实际上在不同的 Android 6.0 设备(Nexus 9 和 S7)上进行了测试。Nexus 9 正常,S7 失败。
所以我检查了以下所有权限和安全上下文,没有发现任何区别:
/system/bin
/system/bin/sh
/system/bin/ls
<library_path>
/su/bin/su
Run Code Online (Sandbox Code Playgroud)
还检查了二进制文件是否在 UID/GID = 0 的情况下运行,在两个设备上均为 true。
在 logcat 中,我没有看到任何针对缺少权限或违反安全策略的审核。
编辑:刚刚验证了二进制文件运行时的安全上下文:
$ps -Z
u:r:init:s0 root ...
Run Code Online (Sandbox Code Playgroud)
无论 exec() 是否有效,这两种设备都相同。
EDIT2:在设备上失败,/proc/kmsg 在尝试 exec() 时包含此内容:
Restricted making process. PID = 8868(<binary>) PPID = 8340(<binary>)
Run Code Online (Sandbox Code Playgroud)
selinux 中没有 avc,并且在 AOSP 源代码中找不到此文本。