1

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.

Antwort

1

Ich habe keine Antwort von Google erhalten (sie arbeiten am 25. Januar arbeiten), also musste ich umgehen es vollen ausführbaren Pfad wie in Kommentar übergeben (3).

+0

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

Verwandte Themen