본문 바로가기

게임개발/Unity

[Unity] 안드로이드 플러그인 (Android Plugin JAR, AAR)

유니티에서 사용하는 안드로이드 플러그인 파일은 두가지로 구분된다. JAR과 AAR이다.

 

JAR은 class만 포함된 파일이고, AAR은 class + manifest + resource가 전부 포함된 파일이다.

 

class만 사용할 경우 JAR 파일만 분리해서 plugins 폴더에 넣어주면 되고

 

manifest와 resource가 필요하다면 AAR 파일 그대로 plugins 폴더에 넣어주면 된다.

 

 

우선 안드로이드 프로젝트를 생성한다.

 

  • 어차피 새 모듈을 추가할 것이므로 Template은 아무거나 선택한다.
  • 프로젝트 이름도 편한대로 아무거나 입력한다.
  • SDK 버전은 유니티에서 기본값으로 API 19: Android 4.4로 설정되어 있기에 같은 버전으로 하였다. 그 이상 버전으로 설정하면 유니티에서도 Project Settings에서 맞춰주어야 한다. 그렇지 않으면 유니티 빌드시 에러난다.

 

 

 

 

 

 

프로젝트가 생성되면 File -> New -> New Module 로 모듈을 추가한다.

 

 

 

 

Android Libray를 선택하고, 원하는 이름으로 모듈을 생성한다.

 

 

 

 

 

 

이제 Unity 폴더에서 classes.jar 파일을 찾아서, 안드로이드 프로젝트의 plugin/libs 폴더에 복사한다.

 

- 유니티 classes.jar 파일경로 (참 길기도 하다..)

C:\유니티폴더\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes
(windows 유니티폴더: C:\Program Files\Unity\Hub\Editor\2019.4.16f1)

 

(app/libs 폴더에 넣지않도록 주의한다.)

 

 

 

 

그 다음 build.gradle (Module: UnityPlugin.plugin) 파일을 열어서 

 

(Module: UnityPlugin.app을 열지않도록 주의한다.)

 

dependencies에 compileOnly fileTree()를 추가하고, 우측 상단의 Sync Now를 클릭한다.

 

(libs 폴더의 유니티 classes.jar을 사용하기 위함이다. sync가 되면 com.unity3d.player.UnityPlayer 클래스를 사용할 수 있다.)

 

 

1
2
3
dependencies {
    compileOnly fileTree(dir: 'libs'include: ['*.jar'])
}
cs

 

 

 

 

기본 준비가 끝났다.

 

이제 plugin 모듈에 UnityPlugin 클래스를 생성하고 코드를 작성한다.

 

(class 이름이 빨간색으로 나오는 경우, 그 위치에 커서를 놓고 Alt + Enter를 하면 네임스페이스가 자동 추가된다.)

 

 

 

 

 

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
public class UnityPlugin
{
    private static UnityPlugin _instance;
 
    private static Activity _context;
 
    public static UnityPlugin instance()
    {
        if (_instance == null) {
            _instance = new UnityPlugin();
            _context = UnityPlayer.currentActivity;
        }
        return _instance;
    }
 
    public String getPackageName()
    {
        return _context.getPackageName();
    }
 
    public void showToast(String text)
    {
        _context.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(_context, text, Toast.LENGTH_LONG).show();
            }
        });
    }
 
    public void unitySendMessage(String objectName, String methodName, String param)
    {
        UnityPlayer.UnitySendMessage(objectName, methodName, param);
    }
}
 
cs

 

 

코드 작성을 마치면 우측 Gradle탭을 클릭하고, plugin/Tasks/build/assemble을 더블클릭하여 빌드한다.

 

(app/.../assemble로 빌드하지 않도록 주의한다.)

 

빌드가 완료되면 plugin/build/outputs/aar 폴더에 AAR 파일이 생성된것을 확인할 수 있다.

 

 

 

 

 

 

AAR 파일은 (APK처럼) 사실 ZIP 압축파일이다. 

 

따라서 윈도우 탐색기에서 확장자를 zip으로 변경한 후 압축을 풀어줄 수 있다.

 

 

 

 

압축을 풀어 나온 폴더를 열어보면

 

  • AndroidManifest.xml
  • classes.jar
  • R.txt

파일들이 포함된 것을 확인할 수 있다.

 

 

 

 

현재 빌드된 라이브러리에는 리소스가 없어 리소스 파일이 포함되지 않았지만

 

라이브러리에 리소스를 추가하여 빌드하면 리소스 파일도 AAR 파일에 포함된다.

 

이제 유니티의 plugins 폴더에 classes.jar 파일이나 plugin-release.aar 파일을 복붙한다.

 

(플러그인에서 Manifest나 Resource를 사용하지 않는다면 classes.jar 파일만 가져오면 되지만

이래저래 번거롭다 싶으면 그냥 AAR파일을 가져오면 된다.)

 

 

 

 

테스트를 위해 Text, Button UI를 만들고 스크립트를 작성하여 참조한다.

 

 

 

 

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
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
 
public class AndroidPluginSample : MonoBehaviour
{
    [SerializeField] Text _text;
 
    [SerializeField] Button _button;
 
    AndroidJavaObject _pluginInstance;
 
    void Awake()
    {
        var pluginClass = new AndroidJavaClass("com.example.plugin.UnityPlugin");
 
        _pluginInstance = pluginClass.CallStatic<AndroidJavaObject>("instance");
 
        _text.text = _pluginInstance.Call<string>("getPackageName");
 
        _button.onClick.AddListener(() =>
        {
            _pluginInstance.Call("unitySendMessage", gameObject.name, "CallByAndroid""Hello Android Plugin!");
        });
    }
 
    void CallByAndroid(string message)
    {
        _pluginInstance.Call("showToast", message);
    }
}
cs

 

 

이제 APK를 빌드하여 폰에 설치하고 실행하면..

 

 

 

 

MISSION COMPLETE!