Ich habe Android App, die einige native ausführbare Datei beim ersten Lauf extrahiert und verwendet es, um etwas Arbeit zu tun. Es funktionierte vor Nougat und hörte auf zu arbeiten. Nach ein paar Tagen oder Nachforschungen habe ich festgestellt, dass die Umgebungsvariable PATH akzeptiert, aber nicht berücksichtigt wurde! Ich versuche es, wenn es ein Feature oder ein Bug ist.Android Nougat ProcessBuilder ignoriert PATH env Variable - Fehler/Problem?
Lassen Sie uns zunächst sehen, was wir haben und ob wir dasselbe mit cmd machen können. Ich habe das aktuelle Android-App-Paket durch 'my.app.package' und nicht verwandte Ausgabe mit '...' für SO ersetzt.
ZTE_BLADE_V0800:/ $ run-as my.app.package
ZTE_BLADE_V0800:/data/data/my.app.package $ whoami
u0_a129
ZTE_BLADE_V0800:/data/data/my.app.package $ ls -l
total 56
drwxrwx--x 2 u0_a129 u0_a129 4096 2017-03-14 16:15 app_build
drwxrwx--x 2 u0_a129 u0_a129 4096 2017-03-15 13:15 app_buildSources
drwxrwx--x 2 u0_a129 u0_a129 4096 2017-03-14 16:15 app_downloads
-rw------- 1 u0_a129 u0_a129 35 2017-03-14 16:16 app_repository
drwxrwx--x 14 u0_a129 u0_a129 4096 2017-03-14 16:16 app_sdk
drwxrwx--x 3 u0_a129 u0_a129 4096 2017-03-14 16:15 app_temp
drwxrwx--x 2 u0_a129 u0_a129 4096 2017-03-14 16:15 cache
lrwxrwxrwx 1 root root 54 2017-03-15 13:15 lib -> /data/app/my.app.package-2/lib/arm
ZTE_BLADE_V0800:/data/data/my.app.package $ ls -l ./app_sdk/
total 96
...
drwx------ 4 u0_a129 u0_a129 4096 2017-03-14 16:16 cppcheck#1.64#1
...
ZTE_BLADE_V0800:/data/data/my.app.package $ ls -l ./app_sdk/cppcheck\#1.64\#1/
total 16
...
drwx------ 3 u0_a129 u0_a129 4096 2017-03-14 16:16 bin
-rw------- 1 u0_a129 u0_a129 0 2017-03-14 16:16 init.done
ZTE_BLADE_V0800:/data/data/my.app.package $ ls -l ./app_sdk/cppcheck\#1.64\#1/bin
total 6960
drwx------ 2 u0_a129 u0_a129 4096 2017-03-14 16:16 cfg
-rwxr-xr-x 1 u0_a129 u0_a129 2345332 2017-03-14 16:16 cppcheck
-rwxr-xr-x 1 u0_a129 u0_a129 1211424 2017-03-14 16:16 libgnustl_shared.so
ZTE_BLADE_V0800:/data/data/my.app.package $ export PATH=$PATH:./app_sdk/cppcheck#1.64#1/bin
ZTE_BLADE_V0800:/data/data/my.app.package $ export LD_LIBRARY_PATH=./app_sdk/cppcheck#1.64#1/bin
ZTE_BLADE_V0800:/data/data/my.app.package $ cppcheck --version
Cppcheck 1.65 dev
ZTE_BLADE_V0800:/data/data/my.app.package $
Nun wollen wir versuchen, das gleiche in Runtime zu tun:
ProcessBuilder processBuilder = new ProcessBuilder();
String path =
System.getenv("PATH") +
":./app_sdk/cppcheck#1.64#1/bin";
processBuilder.command(new String[] {
// "sh", "-c", "echo $PATH", // (1) working
// "sh", "-c", "echo $LD_LIBRARY_PATH", // (2) working
"./app_sdk/cppcheck#1.64#1/bin/cppcheck", "--version" // (3) working
// "cppcheck", "--version" // (4) NOT working even with PATH env variable passed
});
processBuilder.directory(new File("/data/data/my.app.package/"));
Map<String, String> env = processBuilder.environment();
env.put("PATH", path);
env.put("LD_LIBRARY_PATH", "./app_sdk/cppcheck#1.64#1/bin");
process = processBuilder.start();
und ich bekomme IOException
geworfen:
Ursache: Fehler = 13, Permission verweigert Kann nicht Programm ausführen „cppcheck "(im Verzeichnis " /data/data/my.app.package "): Fehler = 13
Mal sehen, ob PATH korrekt übergeben wird. Kommentar- Kommentar (1) und kommentieren die anderen Befehlszeilen, bestätigen es gesetzt:
/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin:./app_sdk/ cppcheck # 1.64 # 1/bin
Mal sehen, ob LD_LIBRARY_PATH korrekt übergeben wird. Kommentar- Kommentar (2) und kommentieren die anderen Befehlszeilen, bestätigen es gesetzt:
./app_sdk/cppcheck#1.64#1/bin
Nun wollen wir sehen, ob ich in der Lage bin zu laufen das Werkzeug, das vollen Weg überschreitet. Kommentar- Kommentar (3) und kommentieren die anderen Befehlszeilen finden es funktioniert jetzt:
cppcheck 1.65 dev
Wow, sogar mit PATH geben i vollständigen Pfad für die ausführbare Datei übergeben. Wenn ich einen kurzen Werkzeugnamen verwende, bekomme ich Permission denied
Fehler.
Ist es Nougat (seit ich es nur mit Nougat habe) Feature oder Problem oder ich habe etwas verpasst?
Ich weiß, Nougat eingeführt strengere Sicherheitsrichtlinien, aber ich sehe keinen Grund dafür in meinem Fall zu arbeiten aufhören, da alle Dateien in App Sandbox (internes Verzeichnis in meinem App-Verzeichnis) sind.
PS. Ich kann nicht einfach alle kurzen ausführbaren Namen in Befehlszeilen ersetzen, da die ausführbare Datei auch eine andere ausführbare Datei mit einem kurzen ausführbaren Namen ausführen kann. Daher muss die PATH-Variable eventuell berücksichtigt werden.
tatsächlich bekam ich Antwort von Google, und es war ein Fehler vor Nougat und es soll nicht auf diese Weise arbeitet, noch bevor Nougat – 4ntoine