본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android 10] Q target 하는 앱의 동작 변화

by 돼지왕왕돼지 2020. 3. 15.

[android Q] Q target 하는 앱의 동작 변화


https://developer.android.com/about/versions/10/behavior-changes-10


non-SDK interface 제한 업데이트


-

앱의 안정성과 호환성 문제 해결을 위해 non-SDK interface 제약이 Pie 에서 도입되었다.

Q 에서는 관련 list 가 업데이트 되었다.


앱이 Q 를 target 하지 않으면, 이 변화는 바로 영향을 미치지 않겠지만 결국 high risk 로 다가올 것이다.




공유 메모리


-

ashmem 이 dalvik map (/proc/<pid>/maps) 형태로 변화되었다. 

앱이 dalvik map format 에 의존하고 있었다면, 앱 개발자는 새로운 /proc/<pid>maps 포맷을 단말에서 테스트해야 한다.



-

Q target 하는 앱은 더 이상 직접적으로 ashmem (/dev/ashmem) 을 사용할 수 없고, 반드시 NDK 의 AsharedMemory class 를 통해 접근해야 한다.




app home dir 에서의 execute permission 제거


-

신뢰되지 않은 앱은 앱의 home dir 에서도 exec 를 수행할 수 없다.

W^X 공격에 대한 방어를 위해서이다.

App 은 app 의 APK file 안에 embed 된 binary code 를 load 해야만 한다.



-

dlopen() 으로 열려 있는 file 의 in-memory executable code 를 변경할 수 없다.

.so 도 마찬가지다.




Android runtime 은 system-generated OAT 파일만을 수용한다.


-

ART 는 더 이상 dex2oat 를 앱 process 에서 invoke 하지 않는다.

이것은 OAT 파일을 시스템이 만든 것만 받아들인다는 의미이다.




ART 에서의 AOT 정합성 강화


-

과거에는 AOT (ahead-of-time) 컴파일이 ART 에 의해 수행되었고, 이것이 runtime crash 를 야기할 수 있었다.

만약 classpath 환경이 compile time 과 runtime 에 다르다면..

Q 에서는 이런 환경 context 가 같아질 것이다. 다음과 같은 동작변화와 함께

….






FullScreen intents 에 대한 권한 변경


-

Q 이상을 target 한 경우 fullscreen intents 는 반드시 USE_FULL_SCREEN_INTENT 권한이 필요하다.

이는 normal 권한으로 manifest 에 명시만 하면 된다.



-

Q 이상 target 한 앱에서 권한없이 fullscreen intent 와 함께 noti 를 만들면, system 은 해당 intent 를 무시하고, log msg 만 출력한다.

Package [pkg]: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission




폴더블에 대한 지원


-

onResume() 과 onPause() 가 다르게 작동한다.

multi-window 나 multi-display mode 로 앱이 여러개가 한번에 보여진다면, 모든 보여지는 focusable top activity 들은 resume 상태이다. 그러나 그 중 topmost resumed activity 만 focus 를 갖는다.



-

onTopResumedActivityChanged() callback 을 통해 topmost 인지 알 수 있다.



-

resizeableActivity attribute 의 동작이 변경되었다.

false 라면, 호환성 모드로 작동한다.



-

새로 등장한 minAspectRatio 를 사용하여 앱이 지원하는 screen ratio 를 명시할 수 있다.




java.io.FileChannel.map() 변화


-

FileChannel.map() 이 non-standard file 에 대해 지원되지 않는다. ( 예를 들면 dev/zero 인데 이는 truncate 를 통해 size 가 변화되지 않는다. )

기존에는 truncate() 에 의한 errno 가 무시되었는데, Android 10 에서는 IOException 을 던진다.

기존동작이 필요하면 native code 를 사용해야만 한다.




댓글0