1. FileProvider
===============
- 앱에서 다른 앱으로 파일을 안전하게 제공하려면 파일에 보안 핸들을 콘텐츠 URI 형태로 제공하도록 앱을 구성해야 합니다.
적용방법
-------
가. 아래와 같이 xml 파일 생성
.. code-block:: javascript
프로젝트 > res > xml > mcore_provider_paths.xml
나. mcore_provider_paths.xml 에 아래 내용 추가
.. code-block:: xml
다. AndroidManifest.xml 에 아래와 같이 적용
support-v4 적용시
---------------------------
.. code-block:: xml
[AndroidManifest.xml] 파일에 적용
AndroidX 적용시
-------------------
.. code-block:: xml
[AndroidManifest.xml] 파일에 적용
androidx 변환시 build.gradle 라이브러리 적용 (참고)
-------------------------------------------------------------------------
.. code-block:: javascript
implementation fileTree(dir: 'mcoreLibs', include: '*.jar', excludes: ['android-support-v4.jar'])
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
.. note::
${applicationId} 는 package name 을 의미하며, 빌드 오류시 프로젝트에서 사용하는 packageName 을 적용하면 된다.
예: android:authorities="com.morpheus.mobile.provider"
:download:`mcore_provider_paths.xml 다운로드 <../_static/api/android/mcore_provider_paths.xml>`.
2. Proguard
===========
MADP 적용방법
---------
가. app module 의 gradle 파일 (build.gradle)
.. code-block:: javascript
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'morpheus_proguard-project.txt'
}
}
나. 프로젝트 > morpheus_proguard-project.txt 생성
.. code-block:: javascript
# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html
# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize
-dontpreverify
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
#To repackage classes on a single package
#-repackageclasses ''
#Uncomment if using annotations to keep them / generic type.
-keepattributes *Annotation*, EnclosingMethod, Signature
#안드로이드 support / apache / json 난독화를 진행하지 않는다.(모든 내용)
-keep class android.support.v4.** { *; }
-keep class com.google.** { *; }
-keep class org.apache.** { *; }
-keep class org.json.** { *; }
-keep class com.nhn.**{ *; }
#kakao 예외 처리
-keep class com.kakao.** { *; }
-keepattributes Signature
-keepclassmembers class * {
public static ;
public *;
}
-dontwarn android.support.v4.**,org.slf4j.**,com.google.android.gms.**
#상기 선언된 내용에 대한 진행 중 발생하는 문제에 대해 경고하지 않는다.
-dontwarn android.support.v4.**
-dontwarn com.google.**
-dontwarn org.apache.**
-dontwarn m.client.android.library.core.bridge.**
-dontwarn m.client.android.library.core.managers.**
-dontwarn pub.devrel.easypermissions.**
-dontwarn m.client.android.library.core.control.**
-dontwarn m.client.android.library.core.utils.**
-dontwarn m.client.android.library.core.view.**
####No obfuscation
#-dontobfuscate
#morpheus push
-dontwarn m.client.push.library.**
-dontwarn mpush.eclipse.paho.**
-dontwarn mpush.eclipse.paho.client.mqttv3.internal.ssl.SecureSocketSslContextFactory
#android
-dontnote android.net.http.*
-dontnote org.apache.http.**
-dontnote org.json.**
-dontnote com.google.**
#Keep classes that are referenced on the AndroidManifest
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.support.v4.app.Fragment
#라이센스 관련 정보가 들어가 있을때는 아래의 주석을 제거한다.
#-keep public class com.google.vending.licensing.ILicensingService
#-keep public class com.android.vending.licensing.ILicensingService
#To maintain custom components names that are used on layouts XML.
#Uncomment if having any problem with the approach below
#-keep public class custom.components.package.and.name.**
# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
#To remove debug logs:
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
public static *** w(...);
}
#To avoid changing names of methods invoked on layout's onClick.
# Uncomment and add specific method names if using onClick on layouts
#-keepclassmembers class * {
# public void onClickButton(android.view.View);
#}
#Maintain java native methods
-keepclasseswithmembernames class * {
native ;
}
#keep android class using context
-keepclassmembers class * extends android.content.Context {
public void *(android.view.View);
public void *(android.view.MenuItem);
}
#To maintain custom components names that are used on layouts XML:
-keep public class * extends android.view.View {
public (android.content.Context);
public (android.content.Context, android.util.AttributeSet);
public (android.content.Context, android.util.AttributeSet, int);
public void set*(...);
}
#Maintain enums
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
#To keep parcelable classes (to serialize - deserialize objects to sent through Intents)
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
#Keep the R
-keepclassmembers class **.R$* {
public static ;
}
###### ADDITIONAL OPTIONS NOT USED NORMALLY
#To keep callback calls. Uncomment if using any
#http://proguard.sourceforge.net/index.html#/manual/examples.html#callback
#-keep class mypackage.MyCallbackClass {
# void myCallbackMethod(java.lang.String);
#}
#Uncomment if using Serializable
-keepclassmembers class * implements java.io.Serializable {
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
#dynamic class loading에 관련된 클래스 들은 난독화를 진행하지 않는다.
-keep public class m.client.android.library.core.managers.WNInterfaceManager
-keep public class m.client.android.library.core.utils.ClassManager
-keep public class m.client.android.library.core.bridge.InterfaceJavascript
-keep public class m.client.android.library.core.common.MorpheusApplication
#callback 함수들을 사용하는 클래스들은 난독화를 진행하지 않는다.
-keep public class * extends m.client.android.library.core.networks.http.AsyncHttpNetwork {
public protected *;
}
-keep public class * extends m.client.android.library.core.networks.socket.AsyncSocketNetwork {
public protected *;
}
#native <-> script interface 함수들은 난독화 하지 않는다.
-keep public class * extends m.client.android.library.core.control.AbstractInterface {
public protected *;
}
-keep class android.support.multidex.MultiDexApplication {
();
void attachBaseContext(android.content.Context);
}
:download:`morpheus_proguard-project.txt 다운로드 <../_static/api/android/morpheus_proguard-project.txt>`.
Plug-In QR 적용
--------------------
가. morpheus_proguard-project.txt 에 아래 코드를 추가합니다.
.. code-block:: javascript
-keep class net.sourceforge.zbar.** { *; }
PUSH 적용방법
-----
가. app module 의 gradle 파일 (build.gradle)
.. code-block:: javascript
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'mpush_proguard.txt'
}
}
나. 프로젝트 > mpush_proguard.txt 생성
.. code-block:: javascript
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
#상기 선언된 내용에 대한 진행 중 발생하는 문제에 대해 경고하지 않는다.
-dontwarn android.support.v4.**
-dontwarn com.google.**
-dontwarn org.apache.**
-dontwarn m.client.push.library.**
-dontwarn mpush.eclipse.paho.**
-downwarn mpush.eclipse.paho.client.mqttv3.internal.ssl.SecureSocketSslContextFactory
-downwarn mpush.eclipse.paho.client.mqttv3.internal.ssl.SecureSocketSslContextFactory
#Keep classes that are referenced on the AndroidManifest
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class * extends android.support.v4.app.Fragment
:download:`mpush_proguard.txt 다운로드 <../_static/api/android/mpush_proguard.txt>`.
3. Apache Http Library
================
- api level 28 이상부터 apache 라이브러리를 공식지원하지 않는다. 이에 apache 라이브러리를 적용하는 방법이다.
가. AndroidManifest.xml 에 아래 속성 추가
.. code-block:: xml
나. build.gradle 에 useLibrary 추가
.. code-block:: javascript
android {
...
useLibrary 'org.apache.http.legacy'
}
4. Scope Storage
=======================
- Android 10 (api level 29) 이상을 타겟팅하는 앱은 외부 저장소로 범위가 지정된 액세스 또는 범위 지정 저장소가 기본적으로 부여
가. 하위 호환성을 위해, 아래와 같이 처리한다.
.. code-block:: xml
...
- `자세히 알아보기 `_
5. MultiDex 적용하기
===============================
- **build.gradle 수정**
가. android defaultConfig 에 multiDexEnabled 를 true 로 선언
.. code-block:: javascript
android {
defaultConfig {
minSdkVersion 16
targetSdkVersion 29
multiDexEnabled true
}
}
나. dependencies 적용
.. code-block:: javascript
// androidx 기준 적용 시
dependencies {
def multidex_version = "2.0.1"
implementation 'androidx.multidex:multidex:$multidex_version'
}
.. code-block:: javascript
// 이전 버전
dependencies {
implementation 'com.android.support:multidex:1.0.3'
}
- **ExtendApplication 수정**
가. attachBaseContext method 추가
.. code-block:: javascript
public class ExtendApplication extends MorpheusApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
6. cleartextTrafficPermitted 오류 관련
=============================================
Android의 경우, HTTPS 프로토콜만 사용하도록 되어 있으나, 라이브러리의 기능 중, HTTP 를 통한 일반 텍스트를 지원하는 기능을 사용하는 경우에 발생합니다.
가. 프로젝트 > res > xml > network_security_config.xml 파일 생성
나. 아래 코드를 생성된 파일에 적용
.. code-block:: xml
127.0.0.1
다. AndroidManifest.xml 의 application 에 networkSecurityConfig 속성 추가
.. code-block:: xml
:download:`network_security_config.xml 다운로드 <../_static/api/android/network_security_config.xml>`.
.. note:: android 9 이상은, 보안상의 이유로 HTTP 통신을 차단합니다. 따라서 예외 처리를 하고자 하는 domain 은 위 포멧에서 을 추가로 등록하여 사용합니다.
.. code-block:: xml
127.0.0.1
추가할 domain 정보
예시 :
.. code-block:: xml
127.0.0.1
morpheus.co.kr
7. libMCrypt.so CPU TYPE 별 JNI 파일 다운로드
=============================================
:download:`다운로드 <../_static/api/mcrypt/mcrypt_jni.zip>`.