Android 애플리케이션에서이 매우 이상한 동작을 관찰했습니다. 대략적인 시나리오 :
- 장치에 설치된 버전 A
- 응용 프로그램 괜찮아요
- 장치에 설치된 버전 B (B> A)
- 응용 프로그램 괜찮아요
- 배터리 방전으로 인해 장치가 종료 됨
- 장치가 켜졌습니다
- 응용 프로그램의 버전 A가 장치에서 다시 실행됩니다.
추가 정보:
- 애플리케이션은 Google Play를 통해 배포되지 않지만 USB 연결을 통해 온 프레미스에 설치됩니다 (참고 : 애플리케이션은 프로덕션에서 실행되며 AndroidStudio를 통해 설치되지 않음).
- 정자
- 안드로이드 5.1 (API 22)
두 가지 질문이 있습니다.
- 기기가 이전 버전의 APK를 캐시 한 이유는 무엇이며 어디에 캐시 했습니까?
- 어떤 상황에서 애플리케이션이 이전 버전으로 롤백 할 수 있습니까?
편집 (자세한 정보) :
- APK가 롤백 된 후 애플리케이션이 일부 권한을 잃어버린 것 같습니다 (아마도 모두). Android API에서 SecurityException이 발생하여 롤백 이전에 작동 한 기능입니다. 이 버전의 Android에 아직 런타임 권한이없는 경우에도 발생합니다!
- : 태블릿의 파일 시스템을 검색 후, 나는 참으로 여러 응용 프로그램의 APK가 비슷한 경로 아래에 존재하는 참조
/data/app/com.myapp-2/base.apk
,/data/app/com.myapp-3/base.apk
등
나의 현재 가설은 배터리 소모로 인해 태블릿이 상태를 “재설정”하게하고 (예 : 시계도 재설정 됨) 다시 전원을 켜면 앱의 APK간에 혼동되어 잘못된 것을로드한다는 가설입니다.
그러나 나는 왜 그렇게 할 것인지, 또는이 행동을 막는 방법에 대한 단서가 없습니다.
답변
Android Studio 3.5 이상을 사용하는 경우 즉시 실행 대신 변경 사항 적용을 사용하고있을 가능성이 있습니다.
이것은 APK를 다시 쓰지 않고 장치에 변경 사항을 전달하는 다른 방법이 있으므로 재부팅 후 장치에서 직접 앱을 실행하면 실행되는 APK가 apk와 관련이 없다는 것을 이해하십시오. 그 전에 실행
변경 승인
즉각적인 실행 및 재 설계 및 변경 사항 적용이라는 Android Studio 3.5의보다 실용적인 접근 방식을 기초로 구현했습니다. Apply Changes는 Android Oreo 이상의 플랫폼 별 API를 사용하여 안정적이고 일관된 동작을 보장합니다. Instant Run과 달리 Apply Changes는 APK를 수정하지 않습니다.
https://android-developers.googleblog.com/2019/08/android-studio-35-project-marble-goes.html
답변
다음은 사용자 설치 패키지 목록입니다.
adb shell cmd package help
pm list packages -f -U -3 --show-versioncode
그런 다음 다시 설치하기 전에 완전히 제거하십시오.
adb uninstall com.myapp
즉시 실행하고 패치 APK를 적용하지 않으면 ( pm
도움말 출력 참조 ) 기본 APK가 실행될 수 있습니다. 이것은 롤백하지 않지만 다른 하나의 APK가 과부하되지 않은 하나의 APK 일 가능성이 높습니다 (Android Studio는 핫 패치 응용 프로그램을 자동화 할 수 있지만 부팅시에는 그렇지 않습니다). 즉시 실행을 사용하지 않으면 이러한 패치 업데이트 APK가 제거됩니다. APK가 하나만 있으면 실행할 다른 것이 없습니다.
답변
기기가 이전 버전의 APK를 캐시 한 이유는 무엇이며 어디에 캐시 했습니까?
트릭은 버전 코드에 있습니다. 새 버전을 설치할 때 새 버전의 버전 코드가 다른지 확인하십시오 . Android OS는 버전 코드를 사용하여 동일한 APK의 다른 버전을 구별하므로 작동합니다.
이 롤백이 발생하는 이유는 확실하지 않습니다. 이것은 분명히 이상한 장치 관련 문제이지만 그럼에도 불구하고 장치의 기본 설치 프로그램, 저장소 / 캐시 설정, 장치 메모리, 바이러스 등을 포함한 많은 요인이 원인이 될 수 있습니다.
이게 도움이 되길 바란다. 메리 코딩!