1

나는 처음 실행시 네이티브 실행 파일을 추출한 앤드 로이드 앱을 가지고 있으며,이를 사용하여 작업을 수행합니다. 그것은 누가 이전에 일했고 일을 그만 두었습니다. 며칠이나 수사 후 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 변수를 고려해야합니다.

답변

1

Google에서 응답을받지 못했기 때문에 (1 월 25 일부터 작업 중이므로) 전체 실행 경로 (3)과 같이 전달해야했습니다.

+0

실제로 Google에서 응답을 받았으며 Nougat 이전의 버그였으며 Nougat 이전에도이 방법으로 작동해서는 안됩니다. – 4ntoine