Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Introduction

전제

항목

내용

앱 간 사이닝이 다른 경우

  • 이 경우 protectionLevel="signature" 을 이용할 수 없습니다.

  • 커스텀 퍼미션이 정의된 앱을 이미 설치한 상태라면 동일한 커스텀 퍼미션의 다른 앱을 설치할 수 없습니다.

앱 간 사이닝이 다르고, M 앱이 기기에 Preload될 경우

  • 이 경우 커스텀 퍼미션을 사용하는 컴포넌트들이 일부 제조사의 보안 관련 체크 툴에 걸리므로, 커스텀 퍼미션을 사용하는 컴포넌트들의 초기 설정은 enabled="false" 상태로 되어야 합니다.

  • 아래 코드 예시 참조 : M, L 앱의 AndroidManifest.xml

적용 방법

항목

내용

앱 간 사이닝을 다르게 하기 위한 설정

  1. 퍼미션 이름을 다음과 같이 서로 다르게 정의합니다.

    1. M 앱 : "com.buzzvil.buzzscreen.permission.USE_BRIDGE${buzzScreenAppKey}.MAIN"

    2. L 앱 : "com.buzzvil.buzzscreen.permission.USE_BRIDGE${buzzScreenAppKey}.LOCK"

  2. Manifest merge rule marker 를 이용해서 bridge 모듈에서 미리 정의한 공통 permission을 제거합니다. (install error 가 발생하지 않게 하기 위함)

  3. bridge 모듈에서 정의한 컴포넌트들의 permission 제한은 M앱에서는 L앱 퍼미션을 replace해서 적용하고, L앱에서는 M으로 적용합니다.

M 앱을 기기에 Preload 시 발생하는 문제를 위한 설정

  1. M 앱이 기기에 Preload될 경우, 초기 설정은 bridge모듈의 컴포넌트들이 enabled="false" 상태로 되어야 합니다.

    1. 아래 코드 예시 참조 : M, L 앱의 AndroidManifest.xml

  2. 그 이후 M 앱 실행 시 또는 checkAvailibility 호출 시 등 bridge모듈이 필요한 조건에서 L 앱 설치여부와 signature 일치여부를 체크한 뒤 컴포넌트들을 enable="true"상태로 변경합니다.

    1. 가이드를 참조, M앱과 L앱에 일부 코드 추가를 하면 extension library에서 자체적으로 처리합니다.

...

Basic Usage

진행 순서

Table of Contents
include^[0-9].*$

0. SDK 버전 업데이트

BuzzScreen Host/Client 버전을 1.0.3.3 이상 버전으로 업데이트 해야 합니다. (아래 L앱 예시 참고)

Note

각 라이브러리 버전은 대응되는 extension-host/client 와 버전이 일치해야 합니다.

M앱과 동일한 버즈스크린 연동

...

Code Block
languagegroovy
dependencies {
    implementation 'com.buzzvil:buzzscreen:4.15.+'
}

L앱을 위한 마이그레이션 라이브러리 연동

Code Block
languagejava
repositories {
    maven { url "https://dl.buzzvil.com/public/maven" }
}

...

dependencies {
    // buzzscreen-host 와 버전이 반드시 일치해야 합니다.
    implementation 'com.buzzvil.buzzscreen.ext:buzzscreen-client:1.78.1+'

    // (optional) Extension SDK에서 제공하는 암호화를 사용하는 경우, 아래의 library를 추가해 주어야 합니다.
    // implementation 'com.github.joshjdevl.libsodiumjni:libsodium-jni-aar:1.0.8'
}

1. L앱의 Signature 찾기

본 Project 내 Extractor.jar 파일을 다운로드 받은 뒤, 아래 두 가지 방식 중 하나를 사용하여 signature string을 추출합니다. signature string은 약 1500자의 hex string 으로 표시됩니다.

Note

Extractor.jar은 JDK 1.8이상에서 정상적으로 동작합니다.

방법 1. keystore 파일에서 추출하기

  1. cli를 통해 아래의 순서대로 수행

    1. Extractor.jar 파일을 다운받은 위치로 이동

    2. java -jar Extractor.jar keystore 입력

    3. keystore 파일 위치 입력

      1. ex) ./YourProject/keystore.jks

    4. keystore password 입력

  2. 출력으로 alias name들과 그에 맞는 signature string들이 표시됨 (일반적으로는 하나만 표시됨)

  3. 표시되는 signature string 중 해당 L앱 signing 시 사용한 alias에 맞는 string을 찾아 저장

방법 2. signed apk 내 cert정보 에서 추출

  1. cli를 통해 아래의 순서대로 수행

    1. signed apk의 확장자를 zip으로 변경 후 압축 해제

    2. 해제된 파일들 중 META-INF/CERT.RSA 파일 존재 및 위치 확인

    3. Extractor.jar 파일 다운받은 위치로 이동

    4. java -jar Extractor.jar cert 입력

    5. 위에서 확인한 CERT.RSA 파일 위치 입력

      1. ex) ./YourProject/apks/app/META-INF/CERT.RSA

    6. 표시되는 signature string 저장

2. M앱 Application 클래스에 코드 추가

하단 코드를 참조해서 BuzzScreenHost.init() 호출 전에 BuzzScreenHost.setLockScreenAppSignature()를 호출해줘야 합니다.

...

Code Block
languagejava
public class App extends Application {

    // L 앱의 package name
    public static final String LOCKSCREEN_APP_PACKAGE = "L app package name";

    @Override
    public void onCreate() {
        super.onCreate();
        //BuzzScreenHost.init 호출 전에 아래 함수를 호출해줘야 한다.
        BuzzScreenHost.setLockScreenAppSignature("L 앱에서 얻어낸 signature string");

        BuzzScreenHost.init(this, LOCKSCREEN_APP_PACKAGE);
    }
}

3. M앱 AndroidManifest.xml

아래 코드 내용을 참조, 퍼미션과 컴포넌트들을 추가합니다.

Code Block
languagexml
<permission
    android:name="com.buzzvil.buzzscreen.permission.USE_BRIDGE${buzzScreenAppKey}"
    tools:node="remove"/>

<permission
    android:name="com.buzzvil.buzzscreen.permission.USE_BRIDGE${buzzScreenAppKey}.MAIN"
    android:protectionLevel="normal"/>

<uses-permission
    android:name="com.buzzvil.buzzscreen.permission.USE_BRIDGE${buzzScreenAppKey}"
    tools:node="remove"/>

<uses-permission
    android:name="com.buzzvil.buzzscreen.permission.USE_BRIDGE${buzzScreenAppKey}.MAIN"/>

<application>

        <provider
            android:name="com.buzzvil.buzzscreen.bridge.DataProvider"
            android:authorities="${applicationId}.DataProvider"
            android:permission="com.buzzvil.buzzscreen.permission.USE_BRIDGE${buzzScreenAppKey}.LOCK"
            android:enabled="false"
            tools:replace="android:permission"/>

        <receiver
            android:name="com.buzzvil.buzzscreen.bridge.EventReceiver"
            android:permission="com.buzzvil.buzzscreen.permission.USE_BRIDGE${buzzScreenAppKey}.LOCK"
            android:enabled="false"
            tools:replace="android:permission"/>

        <service
            android:name="com.buzzvil.buzzscreen.bridge.MessengerService"
            android:permission="com.buzzvil.buzzscreen.permission.USE_BRIDGE${buzzScreenAppKey}.LOCK"
            android:enabled="false"
            tools:replace="android:permission"/>

</application>

4. L앱 Application 클래스에 코드 추가

하단 코드를 참조해서 BuzzScreenClient.init() 호출 전에 BuzzScreenClient.setMainAppPreloaded(true)를 호출해줘야 합니다.

Code Block
languagejava
public class App extends Application {

    public static final String MAIN_APP_PACKAGE = "M app package name";

    @Override
    public void onCreate() {
        super.onCreate();

        BuzzScreen.init("APP_ID", this, SimpleLockerActivity.class, R.drawable.image_on_fail);

        BuzzScreenClient.setMainAppPreloaded(true);
        BuzzScreenClient.init(this, App.MAIN_APP_PACKAGE);
}

5. L앱 AndroidManifest.xml

아래 코드 내용을 참조, 퍼미션과 컴포넌트들을 추가합니다.

...