태그 보관물: android-sdcard

android-sdcard

Android에서 INSTALL_FAILED_INSUFFICIENT_STORAGE 오류에 대한 솔루션 [닫기]

INSTALL_FAILED_INSUFFICIENT_STORAGE오류는 모든 안드로이드 개발자의 삶의 베인입니다. 앱 크기 또는 사용 가능한 저장 공간에 관계없이 발생합니다. 대상 장치를 재부팅하면 문제가 잠시 해결되지만 곧 다시 나타납니다. 사람들이 문제가 발생하는 이유를 묻는 수백 개의 메시지 게시판 게시물이 있지만 Google 직원은이 문제에 대해 조용히 침묵합니다.

간단한 해결 방법이 있습니다. 테스트 장치에서 Android 2.2 이상을 실행중인 android:installLocation경우 값을 사용하여 속성을 애플리케이션의 매니페스트 파일에 추가하십시오 "preferExternal". 그러면 앱이 휴대 전화의 SD 카드와 같은 기기의 외부 저장소에 설치됩니다.

예를 들면 다음과 같습니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.andrewsmith.android.darkness"
          android:installLocation="preferExternal"

이것은 수정보다 반창고이며 완성 된 앱을 장치의 내부 메모리에 설치하려는 경우에는 이상적이지 않을 수 있습니다. 그러나 최소한 개발 과정을 훨씬 덜 좌절하게 만들 것입니다.



답변

이것은 임시 해결 방법 일 뿐이며 실제 수정 은 아닙니다 .

이것이 나에게 일어나고 현재의 응답에 만족하지 못한 후에 나는 AOSP 소스에서 그것을 알아 내려고 노력했습니다. REAL 솔루션 을 찾았습니다 .

설명

우선, 안드로이드 설치 및 업데이트 방법에 대한 약간의 단순화 된 배경

앱을 처음 설치할 때 :

  1. APK의 파일로 저장됩니다

    /data/app/<full.package.name>-1.apk  (1.apk)

앱을 업데이트 할 때 :

  1. 업데이트 된 APK 파일은 다음과 같이 저장됩니다.

    /data/app/<full.package.name>-2.apk (2.apk)
  2. 첫 번째 버전 (1.apk)이 삭제됩니다.

다음 업데이트에서 :

  1. 새 APK는 (1.apk)로 저장되고 (2.apk)는 삭제됩니다 (영원 반복).

 

우리 대부분이 겪고있는 문제는 응용 프로그램이 업데이트 될 때 발생하지만 이전 APK 삭제에 실패합니다. 아직 업데이트에 실패하지는 않았지만에 두 개의 APK 파일이 /data/app있습니다.

다음에 앱을 업데이트하려고 할 때 (1.apk)와 (2.apk)가 비어 있지 않기 때문에 시스템이 임시 파일을 이동할 수 없습니다. File # renameTo (File)은 예외를 throw하지 않고 대신 부울 PackageManager를 리턴하므로 실패가 사용 가능한 공간과 아무 관련이없는 경우에도 INSTALL_FAILED_INSUFFICIENT_STORAGE를 리턴하는 이유를 알 수있는 방법이 없습니다.

해결책

운영:

adb shell "pm uninstall <full.packge.name>"
adb shell "rm -rf /data/app/<full.package.name>-*"

또는

앱 제거

선호하는 방법을 사용하여 BOTH 를 삭제하십시오 .

/data/app/<full.package.name>-1.apk

/data/app/<full.package.name>-2.apk

유사한 방식으로 향후 설치를 차단하는 요소가 없는지 확인하십시오. 제 경우에는 /data/app-lib/<full.package.name>-1디렉토리가 남아 있었습니다 ! 이 경우 SD 카드에 설치 한 후 내부 메모리로 이동했습니다. (만들기 /data/app-lib/<full.package.name>를 빼고 -1결말.)

다른 “솔루션”이 효과가 있었던 이유

  • 외부 스토리지에 설치하기위한 코드는 크게 다르며 동일한 문제가 없습니다.

  • 앱을 제거하면에서 APK 파일의 한 버전 만 삭제됩니다 /data/app. 따라서 한 번만 다시 설치할 수 있지만 업데이트 할 수는 없습니다.

  • 이 버그가 발생할 때 에뮬레이터의 여유 공간 크기는 실제로 관련이 없습니다.


답변

Android 에뮬레이터의 메모리 용량을 늘려야합니다. 이를위한 두 가지 방법이 있습니다.

  1. Android 프로젝트의 루트를 마우스 오른쪽 단추로 클릭하고 “다음 계정으로 실행”으로 이동 한 다음 “실행 구성 …”으로 이동하십시오. 왼쪽의 트리에서 “Android Application”노드를 찾은 다음 프로젝트를 선택하고 창 오른쪽의 “Target”탭으로 이동하여 “Additional Emulator Command Line Options”필드를 찾으십시오 (때로는 ‘ 창을 더 크게 만들어야합니다) 마지막으로 “-partition-size 1024″를 붙여 넣습니다. 적용을 클릭 한 다음 실행을 클릭하여 에뮬레이터를 사용하십시오.

  2. Eclipse의 환경 설정으로 이동 한 다음 “기본 에뮬레이터 옵션”필드에서 “시작” “-파티션 크기 1024″추가를 선택하십시오. “적용”을 클릭하고 평소와 같이 에뮬레이터를 사용하십시오.


답변

이 질문을 게시 해 주셔서 감사합니다. 일부 개발자에게 도움이 될만한 추가 정보가 있습니다.

에뮬레이터가 아닌 장치에서 응용 프로그램을 디버깅하고 있습니다. 기기에 21MB의 여유 공간이 있으며 /data( “adb shell”을 수행 할 때 “df”로 표시됨) 내 앱은 5MB에 불과합니다. 그러나 휴대 전화를 재부팅하거나 adbd를 다시 시작하지 않고 장치에서 다른 앱을 삭제하면 INSTALL_FAILED_INSUFFICIENT_STORAGE가 잠시 동안 사라졌다가 다시 발견됩니다.

따라서 5MB 앱을 디버깅하려면에 20MB의 공간이 더 필요하고 앱을 디버깅 /data할 때마다 무언가가 누출되는 것 같습니다.

그래서 나는 “adb shell”을하고 ENTIRE /data디렉토리를

cd /data
ls -a -l -R

그리고 나는 모든 공간이 어디로 가고 있는지보기 위해 5000 라인 출력을 보았습니다.

몇 달 전의 디버깅 세션에서 오래된 로그 파일 형식으로 디렉토리의 장치에서 엄청난 양의 낭비되는 공간을/data/klog 발견 했습니다.

이것들은 내 로그 파일이 아니 었습니다. 그것들은 안드로이드 인프라의 일부에 의해 생성되었습니다.

나는 그것들을 삭제하고 설정 앱에서 특정 앱에 귀속되지 않은 58MB를 즉시 저장했습니다. 작은 장치가 있으므로 58MB가 매우 중요합니다 (약 40 %).

지금까지 많은 실행 후 INSTALL_FAILED_INSUFFICIENT_STORAGE를 다시 얻지 못했습니다. OP가 자신의 장치에 충분한 공간이 있음을 제안하지만 (얼마나 많은 말을하지는 않았지만) 그것이 실제 문제가 되길 바랍니다.

바라건대 여러분 중 일부는 주기적으로 삭제하여 INSTALL_FAILED_INSUFFICIENT_STORAGE를 벗어날 수도 있습니다 /data/klog/*.

또는 실제로 실제로 (숨겨진) 공간 문제가있는 경우 모든 공간이 어디로 가고 있는지 확인하기 위해 적어도 ls -a -l -R안으로 /data들어갈 수 있습니다.


답변

다음이 도움이됩니다.

  • 장치에 쉘을 엽니 다

    adb shell
  • 수신 APK가 처음 복사되는 temp 디렉토리로 이동하십시오.

    cd /data/local/tmp
  • 사용 가능한 파일을 나열하고 원하는대로 삭제

    rm * // use at your own risk, good practice to list files first

이것은 실제 장치에서 지금까지 신뢰할 수 있습니다.


편집 : 이것은 위의 솔루션만큼 신뢰할 수없는 솔루션으로 판명되었습니다.

나는 여러 가지 해결책을 시도했다. 실제로 도움이되지 않았습니다. 마지막으로 SD Maid 라는 앱을 찾았습니다 . 도움이되었습니다.

이 기능은 루팅되지 않은 장치에서만 제한됩니다. 광산은 뿌리를 내렸으므로 사람들로부터 효과적인 소식을 듣는 것이 좋을 것입니다. 그 시나리오에서 효과적이며 그것이 나를 위해 일한 우연이라면 (어쨌든 예측할 수없는 문제입니다).

참고 : 나는 응용 프로그램과 관련이 없습니다. 검색으로 찾았습니다.


답변

AndroidManifest.xml 파일에 android:installLocation="auto"내부 <manifest>태그를 포함 시켜서 해결했습니다 .


답변

응용 프로그램의 매니페스트 파일에 추가 줄을 추가했습니다 android:installLocation="preferExternal". 이 줄을 사용하면 앱을 외부 저장소에 강제로 설치합니다. 아래 예를 참조하십시오.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.nasir.phonegap"
    android:installLocation="preferExternal" >


답변

에뮬레이터의 관련 문제는 /data파티션에 남은 공간이 없을 때 입니다.

예를 들어

% adb shell df

Filesystem             Size   Used   Free   Blksize
/dev                   252M    32K   252M   4096
/mnt/asec              252M     0K   252M   4096
/mnt/obb               252M     0K   252M   4096
/system                154M   154M     0K   4096
/data                   64M    57M     6M   4096
/cache                  64M     1M    62M   4096

다음은 /data/app디렉토리 의 샘플보기입니다 .

% adb shell ls -l /data/app

-rw-r--r-- system   system      19949 2011-10-12 17:09 CubeLiveWallpapers.apk
-rw-r--r-- system   system      27670 2011-10-12 17:09 GestureBuilder.apk
-rw-r--r-- system   system      34341 2011-10-12 17:09 SoftKeyboard.apk
-rw-r--r-- system   system      20151 2011-10-12 17:09 WidgetPreview.apk

추가 APK 파일을 제거했습니다 . 설치마다 새로운 APK 파일을 얻는 것 같습니다. 추가 APK 파일을 제거하십시오.

예를 들어

adb shell rm /data/app/com.brooklynmarathon.calendarapi2-1.apk