나는 처음 실행시 네이티브 실행 파일을 추출한 앤드 로이드 앱을 가지고 있으며,이를 사용하여 작업을 수행합니다. 그것은 누가 이전에 일했고 일을 그만 두었습니다. 며칠이나 수사 후 PATH 환경 변수가 받아 들여졌지만 고려되지 않은 것을 발견했습니다! 나는 그것이 특징인지 버그인지 시험해보고있다.Android Nougat ProcessBuilder가 PATH 환경 변수 (버그/문제)를 무시합니까?
먼저 우리가 가지고있는 것을보고 우리가 cmd에서 동일하게 할 수 있는지 알아 봅시다. 저는 실제 Android 패키지를 'my.app.package'패키지로 대체했으며 관련 출력은 '...'로 대체하지 않았습니다.
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();
을하고 난 던져 IOException
를 얻을 : : 이제
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 $
의가 런타임에 동일한 작업을 수행하려고하자
원인 : = 13, 권한이 프로그램을 실행할 수 없습니다 를 거부 오류 "cppcheck "(디렉토리 에서 /data/data/my.app.package") : 오류 = 13
PATH가 올바르게 전달되는지 봅시다. 의 주석 주석 (1)와, 다른 명령 줄을 주석이 설정되어 확인 :
/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin:./app_sdk/을 cppcheck # 1.64 # 1/bin
LD_LIBRARY_PATH가 올바르게 전달되는지 봅시다. 의 주석 주석 (2)와, 다른 명령 줄을 주석이 설정되어 확인 :
./app_sdk/cppcheck#1.64#1/bin 난 실행할 수있어 경우에 보자 공구 패스 전체 경로. PATH 내가 실행 파일에 대한 전체 경로를 통과해야 통과도 함께이제
Cppcheck 1.65 dev에
와우 : 의 주석 코멘트 (3)와, 다른 명령 줄을 주석 지금 일하고있어 참조하십시오. 짧은 공구 이름을 사용하면 Permission denied
오류가 발생합니다.
Nougat (Nougat 만 시작한 이래로) 기능 또는 문제가 있습니까?
Nougat이 더 엄격한 보안 정책을 도입 했음에도 불구하고 모든 경우에 해당 파일이 응용 프로그램 샌드 박스 (내 응용 프로그램 디렉토리의 내부 디렉토리)에있는 것처럼 작동하는 것을 막을 이유가 없습니다.
추신. 실행 파일이 짧은 실행 파일 이름을 사용하여 다른 실행 파일을 실행할 수 있으므로 명령 줄에서 모든 짧은 실행 파일 이름을 바꿀 수는 없습니다. 따라서 결국 PATH 변수를 고려해야합니다.
실제로 Google에서 응답을 받았으며 Nougat 이전의 버그였으며 Nougat 이전에도이 방법으로 작동해서는 안됩니다. – 4ntoine