2017-12-14 20 views
2

좋아, 그래서 독점 대규모 네이티브 lib가 필요한 안드로이드 애플 리케이션을 개발하고 있습니다. 이것은 AS로부터의 전개 시간을 크게 증가 시키며, 이는 매우 성가시다. 공유 저장소에서 라이브러리를 동적으로로드하려면 각 다운로드에 라이브러리를 포함하는 것이 좋습니다.Android에서 프로그래밍 코드가 lib를로드하는 위치를 변경하는 방법은 무엇입니까?

그러나이 라이브러리는 독점 Java 래퍼와 함께 제공되기 때문에 System.load("/data/data/com.package.app/extraLib.so");을 사용할 수없고 해당 래퍼 내에서 System.loadLibrary("Library");이 호출되고 있습니다. 따라서 lib가 AS에 포함되어 있지 않으면 독점 코드가 UnsatisfiedLinkError과 충돌합니다.

수동으로 lib를 내 앱의 보호 된 저장소에있는 /lib 폴더로 복사하려고했습니다. 그러나 어떤 이유로 /lib 폴더가 쓰기 금지되어 있습니다. (네, 내 애플 리케이션의 Java 코드에서 파일 탐색기 응용 프로그램에서 복사했기 때문에 루트가 필요하지 않습니다.)

리버스 엔지니어링하지 않고 독점 코드가 lib를로드하는 위치를 변경할 수있는 방법이 있습니까?

답변

1

경고! 개발 용으로 만, 릴리스 앱용으로는 안됩니다!

이 방법을 사용하면 앱이 코드 삽입 공격에 취약 할 수 있습니다.


글쎄, 나는 그것을 할 방법을 찾았습니다. 나는 단지이 코드가 포함 된 더미 하나 AS의 libs와 폴더의 실제 라이브러리 대체 : 나는 .so 파일에 원래 라이브러리의 이름으로 개명 것을 컴파일 된 다음

int main() 
{ 
    return 0; 
} 

을하고 삽입 내 프로젝트의 libs 폴더에.

File fileOnSharedStorage = new File("/mnt/sdcard/libTest.so"); 
    File fileInProtectedStorage = new File("/data/data/com.package.myapp/extra/libTest.so"); 
    File folder = new File("/data/data/com.package.myapp/extra/"); 

    if (!folder.exists()) 
    { 
     folder.mkdir(); 
    } 

    if(!fileInProtectedStorage.exists()) 
    { 
     try 
     { 
     copyFile(fileOnSharedStorage, fileInProtectedStorage); 
     } catch (IOException e) 
     { 
     e.printStackTrace(); 
     } 
    } 

    System.load("/data/data/com.package.myapp/extra/libTest.so"); 

을 그리고 그것은 작동합니다

그런 다음 내 주요 활동의 onCreate() 방법, 내가 그랬어!

+0

코드 삽입 공격에 취약한 안전하지 않은 앱을 개발 한 것을 시연하신 것을 축하합니다! – CommonsWare

+1

@CommonsWare 이것은 개발 속도를 높이는 것입니다. ** 출시 앱에는 정상적인 방법이 포함됩니다 ** –

+0

@CommonsWare [완벽한 소프트웨어 및 기타 테스트에 대한 환상] (https://www.goodreads.com/book/show/4060560-perfect- 소프트웨어 및 기타 - 환상에 관한 것). 대규모 네이티브 라이브러리가 코드 삽입이나 코드 또는 코드의 다른 부분에 영향을받지 않는다는 것을 어떻게 알 수 있습니까? –