(ver 1.9.x) M, L 앱 간 사이닝이 다르고, M 앱이 기기에 Preload될 경우 연동 방법 (Ext)

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

진행 순서

0. SDK 버전 업데이트

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

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

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

repositories { maven { url "https://dl.buzzvil.com/public/maven" } } ... dependencies { // buzzvil-bom은 M앱과 동일한 버전을 사용해야 합니다. 최신 버전을 권장합니다. implementation platform("com.buzzvil:buzzvil-bom:$yourBuzzvilBomVersion") implementation "com.buzzvil:buzzscreen" implementation "com.buzzvil.buzzscreen.ext:buzzscreen-client" // L앱을 위한 BuzzScreenClient 라이브러리 // buzzvil-bom 5.15 미만 버전을 사용하는 경우 버전을 명시해야 하며, M앱과 동일한 버전을 사용해야 합니다. // implementation 'com.buzzvil.buzzscreen.ext:buzzscreen-client:1.9.+' // (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 으로 표시됩니다.

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()를 호출해줘야 합니다.

  • setLockScreenAppSignature의 인자값으로는 앞 1번에서 얻어낸 L앱의 signature string을 넘깁니다.

L앱의 signature string 에 정확한 값이 들어가도록 주의

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

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

<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)를 호출해줘야 합니다.

 

5. L앱 AndroidManifest.xml

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