노블의 개발이야기

[Android] Android O 기기에서 실행되는 모든 앱에 영향을 미치는 주요 변경사항 본문

Android

[Android] Android O 기기에서 실행되는 모든 앱에 영향을 미치는 주요 변경사항

더플러스 2017. 7. 12. 10:43

Android O는 Android 플랫폼을 변경한 것이며, 이러한 변경은 targetSdkVersion을 변경하지 않더라도 앱 동작에 영향을 미치거나 앱을 완전히 중단시킬 수 있습니다.

Android O 기기에서 실행되는 모든 앱에 영향을 미치는 주요 변경사항

1. 백그라운드 위치 업데이트 빈도가 더 적음

앱이 백그라운드 서비스로부터 위치 업데이트를 수신하는 경우, 이전 버전의 Android에 비해 Android O는 업데이트 수신 빈도가 더 적습니다.
* 백그라운드 서비스는 위치 업데이트를 시간당 몇 번 이상 수신할 수 없습니다.
* 앱이 포어그라운드에 있을 때는 위치 업데이트 빈도가 영향을 받지 않습니다.

백그라운드 위치 제한

2. net.hostname이 더 이상 지원되지 않음

net.hostname 시스템 속성을 쿼리하면 null 결과가 발생합니다.

public static String getHostNameFromBuildClass() {
    try {
        Method getString =Build.class.getDeclaredMethod("getString", String.class);
        getString.setAccessible(true);
        return getString.invoke(null, "net.hostname").toString();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
    return null;
}

public static String getHostNameFromSystemProperties() {
    // String str = SystemProperties.get("net.hostname");
    try {
        Class<?> clz = Class.forName("android.os.SystemProperties");
        Method get = clz.getMethod("get", String.class);
        return (String) get.invoke(clz, "net.hostname");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
    return null;
}

...
Log.d(TAG, "Host Name From Build.class: " + getHostNameFromBuildClass());
Log.d(TAG, "Host Name From SystemProperties: " + getHostNameFromSystemProperties());
...

// Android 7.0 API 24 : 
//      Host Name From Build.class: android-7b3144b3f9dafa97
//      Host Name From SystemProperties: android-7b3144b3f9dafa97
// Android O Preview :
//      Host Name From Build.class: unknown
//      Host Name From SystemProperties: 

위 두가지 메소드로 테스트해봤을 때 null 이 아닌 “unknown” 또는 “”이 리턴된다.

3. send(DatagramPacket)의 새로운 예외

connect(InetAddress, int) 메서드가 실패한 경우 send(DatagramPacket) 메서드가 SocketException을 발생시킵니다.

4. AbstractCollection 메서드의 적절한 NullPointException

AbstractCollection.removeAll(null) 및 AbstraceCollection.retainAll(null)은 항상 NullPointerException을 발생시킵니다.
이전에는 컬렉션이 비어있을 때는 NullPointException이 발생하지 않았습니다.

public class CollectionTest {
    @Test
    public void removeAll() throws Exception {
        ArrayList<String> list = new ArrayList<>();
        // list.add("a");   // list에 데이터가 있으면 API 24 이하에서는 NullPointException이 발생하지 않습니다.
        list.removeAll(null);
    }

    @Test
    public void retainAll() throws Exception {
        ArrayList<String> list = new ArrayList<>();
        // list.add("a");   // list에 데이터가 있으면 API 24 이하에서는 NullPointException이 발생하지 않습니다.
        list.retainAll(null);
    }
}
  • Android 7.0 API 24 :
    • 컬렉션이 비어있을 때 - NullPointException
    • 컬렉션이 비어있지 않을 때 - 성공
  • Android O Preview :
    • 컬렉션이 비어있을 때 - NullPointException
    • 컬렉션이 비어있지 않을 때 - NullPointException

5. Currency.getDisplayName(null)의 적절한 NullPointException

Currenty.getDisplayName(null)을 호출하면 NullPointException이 발생합니다.

Currency currency = Currency.getInstance(Locale.getDefault());
currency.getDisplayName(null);
  • Android 7.0 API 24 :
    • Result: “대한민국 원”
  • Android O Preview :
    • Result: NullPointException


'Android' 카테고리의 다른 글

[Android] Service  (0) 2017.08.01
[Android] UriMatcher  (0) 2017.07.24
Bintray(jCenter)에 Android Library(.aar)을 배포  (0) 2017.07.20
[Android] Android O - Background Execution Limits  (0) 2017.07.13
[Android] Context란?  (7) 2017.07.12
Comments