2014-06-17 2 views
0

내 JNI .so 라이브러리가 apkbuilder를 사용하여 apk로 압축하는 데 8-10 초가 걸립니다. 라이브러리는 약 8MB이며 주로 C++로 작성되었습니다.apkbuilder가 특정 파일에서 너무 느림

문제를 명확히하기 위해 다음 테스트를 수행했습니다.

1) 기타 .so를 라이브러리

나는 약 10MB이며, 대부분 C로 작성된 다른 .so를 가진 .so는 라이브러리를 교체했다. 놀랍게도 동일한 CPU 아키텍처를위한 JNI 라이브러리 인 새로운 .so를 사용하면 1.5 초가 소요됩니다.

2) 더미 파일은 내 libs와의 xxx.so의 이름/armabi-V7A 디렉토리와 더미 파일을 넣어. 1 초가 걸립니다. 팔/86/MIPS에 대한

3) 다른 CPU 아키텍처

내 모든 .so를 라이브러리는 8 ~ 10 초 소요됩니다.

단조

4) 나는 임의의 값을 갖는 임의의 장소에서 16 진수 편집기 내 .so는 라이브러리를 편집했다. 그것은 또한 8-10 초를 필요로한다.

내 .so 라이브러리 만 apkbuilder로 apk로 압축되는 데 너무 오래 걸리는 이유는 무엇입니까? .so 라이브러리에서이 프로세스를 빠르게 진행할 수있는 방법이 있습니까?

답변

2

APK 파일은 본질적으로 단지 ZIP 파일이며 .so 파일은 APK 전용 처리없이 추가됩니다. 그래서 가장 큰 원인은 apkbuilder가 .so 파일을 압축 해제하려고 시도하는데 다른 .so 파일을 압축 할 수없는 것으로 간주하고 저장하는 데 시간이 걸리는 것입니다.

AFAICS이 속도를 향상시키는 유일한 방법은 apkbuilder 소스를 항상 저장하고 .so 파일을 압축하지 않도록 변경하는 것입니다.

+0

을하지만,이 'libs' 폴더와 같은 계약 상 의무는 없습니다. –

+0

한스, apkbuilder에 대한 내 .so를 수축시키지 않는 옵션 플래그가 있습니까? –

+0

불행히도 이러한 플래그가 없습니다. apkbuilder의 소스 코드를 수정해야합니다. 가장 최신 소스 코드는 https://android.googlesource.com/platform/tools/base/+/master/sdklib/src/main/java/com/android/sdklib/build/ –

0

나는 대부분의 시간이 .so 파일을 압축하기 위해 ZipOutputStream에 소비되었다는 것을 발견했다.

Android ApkBuilder는 가장 압축률은 높지만 성능이 가장 낮은 압축 수준 9를 사용합니다. 이 레벨을 3으로 변경하면 약간의 압축 비율 손실로 전체 성능이 크게 향상됩니다.

이 수준을 변경하여 sdklib 소스 코드를 수정할 수 있습니다. SignedjarBuilder.java (com.android.sdklib.internal.build)에서 'mOutputJar.setLevel'을 찾고 원하는 수준을 변경하십시오. 그런 다음 sdklib.jar를 작성하고 안드로이드 SDK 디렉토리에이 복사 (android_sdk/도구/lib에)

당신은 여기에 소스 코드를 다운로드 할 수 있습니다 : 어떤 자원이 APK에 압축 저장하는 약속 https://android.googlesource.com/platform/tools/base/+/master/sdklib/src/main/java/com/android/sdklib/build/