Android의 상위버전을 개발하는 과정에서 OTA Update에 대해 자세히 공부하고

직접 시나리오를 적용하여 앱을 개발할 수 있는 기회가 생겼다 😎😎 

처음에는 OTA Update의 process를 이해하는 것 부터도 어려웠는데, 

A/B Update방식을 사용한 Update App 개발을 마무리해가는 시점에 차근차근 정리해보려고한다 :)

(사실 아직 할거 짱많음 내일만 운동하고 모레부터 야근각임)

 

1. 비 A/B OTA Update 

기존 A/B Update방식은 복구모드로 부팅하여  Update를 진행하고 다시 재부팅하여 업데이트 하는데, A/B Update가 주제니까 간단히 process만 짚고 넘어가는걸로!!

기존 방식의 비 A/B OTA 업데이트에는 다음 단계로 이루어집니다.

  1. 기기는 OTA 서버를 통해 정기적으로 체크인하고 업데이트 패키지의 URL 및 사용자에게 표시할 설명 문자열을 포함하여 업데이트 사용 가능 여부를 알립니다.
  2. 다운로드를 캐시나 데이터 파티션으로 업데이트하고 암호화 서명을 /system/etc/security/otacerts.zip의 인증서와 비교하여 확인합니다. 사용자에게 업데이트를 설치하라는 메시지가 표시됩니다.
  3. 부팅 파티션의 커널 대신 복구 파티션의 커널과 시스템이 부팅되는 복구 모드로 기기가 재부팅됩니다.
  4. 복구 바이너리는 init로 시작됩니다. 다운로드한 패키지를 가리키는 명령줄 인수를 /cache/recovery/command에서 찾습니다.
  5. 복구는 복구 파티션에 포함된 RAM 디스크의 일부인 /res/keys의 공개 키를 기준으로 패키지의 암호화 서명을 확인합니다.
  6. 데이터는 패키지에서 가져와 필요에 따라 부팅, 시스템 및 공급업체 파티션을 업데이트하는 데 사용됩니다. 시스템 파티션에 남아 있는 새 파일 중 하나에는 새 복구 파티션의 콘텐츠가 포함되어 있습니다.
  7. 기기를 정상적으로 재부팅합니다.
    1. 새로 업데이트된 부팅 파티션이 로드되어 마운트되고 새로 업데이트된 시스템 파티션의 바이너리 실행을 시작합니다.
    2. 정상적인 시작의 일부로 시스템은 복구 파티션의 콘텐츠를 원하는 콘텐츠(이전에 /system에 파일로 저장된 콘텐츠)와 비교하여 확인합니다. 콘텐츠가 다르므로 복구 파티션은 원하는 콘텐츠로 다시 플래시됩니다. 후속 부팅 시에는 복구 파티션에 이미 새 콘텐츠가 포함되어 있으므로 다시 플래시할 필요가 없습니다.

 

https://source.android.com/docs/core/ota/nonab?hl=ko

 

비 A/B 시스템 업데이트  |  Android 오픈소스 프로젝트  |  Android Open Source Project

비 A/B 시스템 업데이트 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. A/B 파티션이 없는 이전 Android 기기의 경우 일반적으로 플래시 공간에 다음 파티션이

source.android.com

공식문서에 서술되어있듯 비 A/B OTA Update에서는 총 2번의 재부팅 과정을 거친다.

때문에 업데이트 시나리오를 개선하면서 시간적인면에서 단축이 가장 눈에 띄었다.

 


 

2. A/B OTA Update

A/B OTA Update는 복구모드로 부팅하지 않고 시스템이 실행되는동안 OTA가 진행될 수 있기 때문에, 한 번의 재부팅만으로 Update를 완료할 수 있고 아래와 같은 이점들이 있다.

  • 시스템이 실행되는 동안 사용자를 방해하지 않고도 OTA 업데이트가 진행될 수 있습니다. 사용자는 OTA 도중 계속해서 기기를 사용할 수 있으며, 업데이트 도중의 유일한 다운타임은 기기가 업데이트된 디스크 파티션으로 재부팅되는 순간뿐입니다
  • 업데이트 이후에는 재부팅 시간이 일반 재부팅 시간보다 오래 걸리지 않습니다.
  • 플래시 불량 등으로 인해 OTA 적용에 실패하더라도 사용자에게 미치는 영향은 없습니다. 사용자는 계속해서 기존 OS를 실행하고, 클라이언트는 자유롭게 업데이트를 재시도할 수 있습니다.
  • OTA 업데이트가 적용되었지만 부팅에는 실패한 경우에는 기기가 기존 파티션으로 재부팅되고 가용성을 유지합니다. 클라이언트는 자유롭게 업데이트를 재시도할 수 있습니다.
  • I/O 오류를 비롯한 모든 오류는 설정된 미사용 파티션에만 영향을 미치며 재시도 가능합니다. I/O 로드가 사용자 환경 저하를 피할 수 있도록 의도적으로 낮게 설정되었기 때문에 이러한 오류가 발생할 확률도 감소합니다.
  • 업데이트는 A/B 기기로 스트리밍할 수 있습니다. 따라서 설치 전에 패키지를 다운로드할 필요가 없습니다. 스트리밍 덕분에 사용자에게는 /data 또는 /cache에 업데이트 패키지를 저장할 여유 공간이 충분하지 않아도 됩니다.
  • 캐시 파티션이 더 이상 OTA 업데이트 패키지를 저장하는 데 사용되지 않으므로 캐시 파티션이 향후 업데이트를 저장할 수 있을 정도로 큰지 확인할 필요도 없습니다.
  • dm-verity는 기기가 손상되지 않은 이미지를 부팅하도록 보장합니다. OTA 불량 또는 dm-verity 문제로 인해 기기가 부팅되지 않는 경우에는 기기를 기존 이미지로 재부팅할 수 있습니다. Android 자체 검사 부팅에는 A/B 업데이트가 요구되지 않습니다.

https://source.android.com/docs/core/ota/ab?hl=ko 

 

A/B(원활한) 시스템 업데이트  |  Android 오픈소스 프로젝트  |  Android Open Source Project

A/B(원활한) 시스템 업데이트 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 원활한 업데이트라고도 불리는 A/B 시스템 업데이트는 OTA(무선) 업데이트가 진행

source.android.com

 

그래서 왜 A/B Update냐면 기존에 사용하고 있는 슬롯과 업데이트를 한 슬롯 두개로 업데이트를 진행할 수 있기 때문에 (A slot과 B slot) 붙여진 이름(이라고 생각합니다만 맞을...껄?)인데, process를 보면 왜인지 이해가 자연스레 가능합니다!

 


 

실제 A/B OTA Update 방식은 참고자료와 함께 자세히 정리해보겠습니다! 

공식문서도 너무 잘 되어있어서 충분한데, 처음 접할때 이것저것 찾아보면서 만든 자료가 있어서 공유하고 기록하고자 합니다 :)

근데 그게 회사 컴퓨터에 있그든요 ㅎㅎㅎ... 내일 옮겨두고 시간되는대로 작성하기 !! 꼮꼮!!

1. 빌드 환경 세팅

$ rm -rf .idea

$ source ~~~ // 환경설정하기

$ lunch ~~~ // 환경설정하기

 

2. idegen 빌드 후 실행

$ mmm development/tools/idegen -j($nproc)

$ develop/tools/idegen/idegen.sh

 

3.  Android.ipr 실행

Root  Directory로 이동하면 Android.ipr 파일이 생김.

AndroidStudio를 열어 Android.ipr을 Open!

 

참고

https://stackoverflow.com/questions/16727607/can-we-use-android-studio-for-aosp-development

'Develop > Android OS' 카테고리의 다른 글

[Android OS] A/B OTA Update: OTA의 진화!  (0) 2023.02.21
[Android OS] 일부만 빌드 후 적용  (0) 2022.10.14

Git Repository에  Upload하면 안되는 파일/폴더를 Upload한 상황 (ex. 보안키, Build output 등...)

나는 Build Output을 업로드 하는 바람에 object파일들과 그외 의존성파일들이 함께 업로드 되었다😢

gitignore파일을 같이올리면 원본 코드도 안올라갈까봐 제외하고 올린후에 나중에 한번에 올렸는데,

gitignore에서 무시해야했던 빌드 결과들이 이미 올라가버린것;;; 

이럴거면 gitignore을 먼저 올리고 나중에 원본코드를 올리는게 맞았던것같다...

 

git filter-branch

git filter-branch --tree-filter 를 사용하여 Git(history에서도)과 Local에서 삭제할수있다.

 

$ git filter-branch --tree-filter 'rm -f 경로' HEAD

$ git push -f origin master

++ 삭제해야할 내용이 '폴더'이면 rm -f에 'r'옵션을 추가한다.

 

push 해야 하는 파일이 큰 경우

그러나 커밋하나당 5GB를 꽉꽉 채워서 Upload했었기 때문에 한번에 push하는데 Error 발생

remote: Analyzing objects... (498974/863067)
error: 리모트 묶음 풀기 실패: error TF402462: This push was rejected because its size is greater than the 5120 MB limit for pushes in this repository. 
Learn more at https://aka.ms/gitlimit To https://~~~
![remote rejected]       master -> master (TF402462: This push was rejected because its size is greater than the 5120 MB limit for pushes in this repository. Learn more at https://aka.ms/gitlimit)
error: 레퍼런스를 'https://~~'에 푸시하는데 실패했습니다

 

push 작업을 commit 하나하나를 단계적으로 하는 방법으로 했다. (시간이 굉장히 오래걸렸..걸리는중이다.)

$ git push <remotename> <commit SHA>:<remotebranchname>

https://stackoverflow.com/questions/3230074/how-can-i-push-a-specific-commit-to-a-remote-and-not-previous-commits

 

How can I push a specific commit to a remote, and not previous commits?

I have made several commits on different files, but so far I would like to push to my remote repository only a specific commit. Is that possible?

stackoverflow.com

 

git filter-branch 되돌리기

git filter-branch 명령어는 자동으로 backup을 수행한다 👍

$ git reset --hard refs/original/refs/heads/master

 

참고 사이트

https://www.dsaint31.me/etc/etc-git-filter-branch/

 

[Etc] Git에서 파일 완전삭제

파일의 모든 commit에서 영구적 삭제@(Computer)

www.dsaint31.me

 

레포지토리에서 내려받은 파일이 있고, 하나 더 같은 파일을 내려받고 싶을 떄 (ex.사본 만들기)

clone이 빠를때도 있지만 대용량인 경우에는 오히려 .git 폴더에서 checkout하는것이 훨씬 빠르다.

 

1. 새로 만들 directory 생성 후, 이미 내려받은 파일의  .git 복사해오기

2. $ git branch  현재 branch확인 

3. $ git checkout -f 

4. $ git pull (필요한 경우 사용. Git Directory의 가장 최근 commit을 불러옴)

1. 터미널에서 빌드 셋업
    Move to the BSP root directory.
    Set up the development environment.
    $ source env.rc // export path
    $ source build/envsetup.sh
    $ lunch 

2. 수정한 파일의 상위 폴더로 이동
3. 수정한 파일의 상위 경로 Android.bp 참고하여 java library name 확인
    ex)
    cc_binary {
        name: "update_engine", 

4. mm 빌드 
    ex) mm update_engine

5. out 폴더로 이동
    cd $OUT

6. 확인한 library name을 find 명령어로 검색
    $ find -iname services*
    ->  ./system/framework/oat/arm/services.odex
        ./system/framework/oat/arm/services.vdex
        ./system/framework/oat/arm/services.art
        ./system/framework/services.jar

    $ find -iname update_engine
    ->  ./system/bin/update_engine

7. adb root && adb remount

8. 검색한 파일들을 adb push
    adb push system/framework/services.jar /system/framework/
    ...

10. adb shell sync && adb reboot

+ Recent posts