안드로이드 FFMPEG 64bit 지원

2019. 8. 1. 20:04 개발 이야기/android

아는 사람들은 알 것이다. 

 

2019년 8월 1일부터 Google Play에 게시되는 앱에서는 64비트 아키텍처를 지원해야 합니다.
64비트 CPU는 사용자에게 더 빠르고 풍부한 환경을 제공합니다.
앱의 64비트 버전을 추가하면 성능이 향상되고 향후 혁신을
이룰 가능성이 높아지며 64비트 전용 하드웨어가 장착된 기기에 대응할 수 있습니다.

https://developer.android.com/distribute/best-practices/develop/64-bit?hl=ko 참조

구글에서 이제는 NDK를 사용하는 앱은 무조건 64비트가 지원되도록

 

강제화 하기로 했다.

 

앱 안에서 네이티브 코드를 사용한다면?

1. 앱에서 C/C++(네이티브) 코드를 사용합니다.
2. 타사 네이티브 라이브러리와 연결됩니다.
3. 네이티브 라이브러리를 사용하는 타사 앱 빌더로 빌드했습니다.

 

여기에 해당이 된다면 무조건 64비트가 지원되는지 확인을 해야한다.

 

가장 빠르게 확인하는 방법은 하애 그림과 같은 폴더에 네이티브 라이브러리가 있는지 확인한다.

구글 개발자 사이트(developer.android.com)

 

구글 개발자 사이트(developer.android.com)

 

 

이런 식으로 확인을 할 수 있으며, 자신의 소스코드에서

 

 

NDK를 사용한다면 

구글 개발자 사이트(developer.android.com)

이런 식으로 빌드 옵션을 추가할 수 있다.

 

내가 하고 있는 프로젝트에도 서드파티 라이브러리 중에 이런 경우가 있는데

 

지원이 끊긴 상태라 

 

직접 소스코드를 추가해야 했다.

 

사용한 라이브러리는 FFMPEG 이라는 멀티미디어 관련 라이브러리인데,

 

기존에는 gradle에 추가해서 사용을 했었기 때문에 직접적으로 소스코드가 다운로드 되어있진 않았지만,

 

라이브러리를 다운로드 받고 64bit를 지원하도록 수정하였다.

 

이런식으로 빌드한 바이너리를 넣고

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
추가 부분 FFmpeg.java
        switch (CpuArchHelper.getCpuArch()) {
            case x86:
                Log.i("Loading FFmpeg for x86 CPU");
                cpuArchNameFromAssets = "x86";
                break;
            case ARMv7:
                Log.i("Loading FFmpeg for armv7 CPU");
                cpuArchNameFromAssets = "armeabi-v7a";
                break;
            case ARMv8:
                Log.i("Loading FFmpeg for arm64-v8a CPU");
                cpuArchNameFromAssets = "arm64-v8a";
                break;
 
            case x86_64:
                Log.i("Loading FFmpeg for x86_64 CPU");
                cpuArchNameFromAssets = "x86_64";
                break;
            case NONE:
                throw new FFmpegNotSupportedException("Device not supported");
        }
        
 
추가 부분 CpuArchHelper.java
 
    static CpuArch getCpuArch() {
        Log.d("Build.CPU_ABI : " + Build.CPU_ABI);
        // check if device is x86 or x86_64
        if (Build.CPU_ABI.equals(getx86CpuAbi())) {
            return CpuArch.x86;
        } else if (Build.CPU_ABI.equals(getx86_64CpuAbi())) {
            return CpuArch.x86_64;
        } else {
            try {
                // check if device is armeabi
                if (Arrays.toString(Build.SUPPORTED_ABIS).contains(getArm64CpuAbi())) {
                    // check if device is arm64 which is supported by ARMV8
                    return CpuArch.ARMv8;
                } else if (Arrays.toString(Build.SUPPORTED_ABIS).contains(getArmeabiv7CpuAbi())) {
                    // check if device is arm64 which is supported by ARMV7
                    return CpuArch.ARMv7;
                }
            } catch (Exception e) {
                if (Build.CPU_ABI.equals(getArmeabiv7CpuAbi())) {
                    // check if device is arm64 which is supported by ARMV7
                    return CpuArch.ARMv7;
                } else if (Build.CPU_ABI.equals(getArm64CpuAbi())) {
                    return CpuArch.ARMv8;
                }
            }
        }
        return CpuArch.NONE;
    }
    
    
이 외에도 +++
cs

 

이런식으로 대응을 해주었다.

 

안드로이드에서 강제 하는 만큼.

 

서비스에 지장이 생기는 일이 없도록 하자!

 

관련 소스코드는 아래와 같다.

 

https://github.com/bourbonkk/android-ffmpeg64bit-example