문제점 : 내가 만드는 앱에서 공통으로 자주 쓰이는 클래스들을 library로 빌드하여 사용하는데
library 빌드 후 app project에 libs/xxxx.aar 형태로 추가하여  library의 interface를 사용할 때
parameter들이 모두 이상한 이름으로 작성되는 문제가 있었다.

예를 들어 라이브러리 소스에는 아래와 같이 정상적인 parameter 이름이 표시되지만,

Http.get("google.com", new HttpCallback() {
    @Override
    public void onResult(int responseCode, String response) {
       
    }

    @Override
    public void onFailed() {

    }
}); 


이를 App에서 사용하면 아래의 붉은 색 부분과 같이 parameter 이름이 의미를 알수 없게 되었다.

Http.get("google.com", new HttpCallback() {
    @Override
    public void onResult(int i, String s) {
       
    }

    @Override
    public void onFailed() {

    }
}); 


구글링 하면서 여러가지 해결 방법들을 찾았지만.. 나에게는 아무 것도 소용이 없었다.(관련이 없다는 말이 아니다.)

문제는 Library project에 있었다. App Project는 아무 상관이 없다. Decompiler와는 전혀.. 상관이 없다.


아래에는 최종적으로 해결된 빌드 환경을 주황색으로 추가한다.

나에게 핵심적인 문제 해결 점은 build.gradle에 추가한 이 부분이다.

당연한 말이지만 interface의 인자를 외부 앱에서 정상적으로 사용하기 위해서는 proguard(proguard-rules.pro)에도 설정이 필요하다.

이 해결방법은 JAVA8  사용시 -parameters 옵션이 있어야 한다는 내용을 보고 적용한 것이다.

Android Studio에는 이전에는 있던 Java Compiler options 입력부가 없어졌다.

그래서 Gradle에 아래와 같은 옵션을 추가해서 해결하였다.

관련 링크 1 : https://stackoverflow.com/questions/49081856/how-does-fernflower-decompiler-in-intellij-manage-to-get-parameter-names-when

관련 링크 2 : https://stackoverflow.com/questions/27274526/how-to-add-java-compiler-options-when-compiling-with-android-gradle-plugin



gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
        options.compilerArgs = ["-parameters"]
    }
}

 



[build.gradle]

apply plugin: 'com.android.library'

android {
    compileSdkVersion 27
    buildToolsVersion '27.0.3'
    defaultConfig {
        minSdkVersion 18
        targetSdkVersion 27
        versionCode 2
        versionName '2.0'
        multiDexEnabled false
        ndk {
            abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
        }
        externalNativeBuild {
            cmake {
                arguments '-DANDROID_TOOLCHAIN=clang'
            }
        }
        consumerProguardFiles 'proguard-rules.pro'
    }
    buildTypes {
        debug {
            minifyEnabled false
            useProguard false //https://developer.android.com/studio/build/shrink-code?hl=ko
            buildConfigField "boolean", "TraceEnable", "true"
            buildConfigField "boolean", "TraceVerbose", "true"
            buildConfigField "java.util.Date", "buildTime", "new java.util.Date(" + System.currentTimeMillis() + "L)"
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        release {
            minifyEnabled false
            buildConfigField "boolean", "TraceEnable", "false"
            buildConfigField "boolean", "TraceVerbose", "false"
            buildConfigField "java.util.Date", "buildTime", "new java.util.Date(" + System.currentTimeMillis() + "L)"
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    productFlavors {
    }
}

configurations {
    all*.exclude group: 'com.google.firebase', module: 'firebase-core'
    all*.exclude group: 'com.google.firebase', module: 'firebase-iid'
}

repositories {
    google()
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support:support-v4:27.1.1'
}

gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
        options.compilerArgs = ["-parameters"]
    }
}

 




[proguard-rules.pro]

# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\dev_tool\android_sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# 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 *;
#}

#Refer document
#https://developer.android.com/studio/build/shrink-code?hl=ko
#http://www.androidhuman.com/lecture/proguard/2016/07/23/proguard_for_library_project/
#https://gist.github.com/nisrulz/64dd09e0922aa48351c0
#https://www.guardsquare.com/en/proguard/manual/refcard
#https://www.guardsquare.com/en/proguard/manual/attributes
#https://www.guardsquare.com/en/proguard/manual/examples
#http://wiki.davepang.com/doku.php?id=develop:android:tips:use_proguard
#아래의 3가지 것들은 default 요소들이지만 중요한 option이라 설명한다.
-dontobfuscate #없애면 난독화 X
#-dontoptimize #없애면 최적화 X
#-keepresourcexmlattributenames manifest/** #없애면 manifest 난독화 X
-dontshrink #사용하지 않는 메소드 유지
-keepparameternames
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod,MethodParameters,LocalVariableTable,LocalVariableTypeTable
-dontwarn android.support.v4.**,org.slf4j.**,com.google.android.gms.**
-dontskipnonpubliclibraryclasses

# com.test의 하위 클래스를 전부 난독화하지 않음
#-keep class com.test.**

# com.ocsoosoo.lib의 하위 인터페이스를 전부 난독화하지 않음
#-keep interface * {
  #<methods>;
  #<fields>;
#}
#-keep interface com.ocsoosoo.lib.**

# com.test 하위 클래스 중 public 메소드만 난독화하지 않음
#-keep class com.test.** {
    #public *;
#}

-keepclassmembers class * {
  public static <fields>;
  public *;
}

-keep interface com.ocsoosoo.lib.** { *; }
-keep class no.nordicsemi.android.dfu.** { *; }

#빌드 후 mapping seed usage cofing 파일을 만들어주는 옵션
#-printmapping map.txt
#-printseeds seed.txt
#-printusage usage.txt
#-printconfiguration config.txt

#소스 파일의 라인을 섞지 않는 옵션 (이거 안해주면 나중에 stacktrace보고 어느 line에서 오류가 난 것인지 확인 불가)
#-keepattributes SourceFile,LineNumberTable

#소스 파일 변수 명 바꾸는 옵션
#-renamesourcefileattribute SourceFile

#보통 라이브러리는 딱히 난독화 할 필요없을 때 이렇게 적어준다.
#-keep class 라이브러리패키지명.** { *; }

#워닝뜨는거 무시할때
-ignorewarnings
#지정해서 워닝 무시할 때
#-dontwarn 패키지명.**
 





-----------------------------------------------------------------------------------------------------------------------

--Update : 2018.06.07

VM option을 수정하는 다른 하나의 방법.


안드로이드 스튜디오 실행시 JVM 경로 에러 팝업이 뜨고 안드로이드 스튜디오가 아예 실행이 안되는 문제가 발생하여 설정 부분을 찾다가 발견한 것으로...

이 파일이 있는 경우 안드로이드 스튜디오 실행시 JVM 경로 에러 팝업이 뜨고 안드로이드 스튜디오가 아예 실행이 안되는 문제가 발생한다.

이 파일을 지우면 문제 해결...


윈도 사용자 폴더의 vmoptions 파일에 아래와 같이 추가하는 방법.. 실제 추가한 것은 아니고 추가한 적이 없는 저 옵션이 저기에 들어 있었다.


파일 경로: 어느 것이 먼저 인지...

C:\Users\윈도사용자아이디\.AndroidStudio3.1\config\studio64.exe.vmoptions

Android Studio 설치 경로\bin\studio64.exe.vmoptions

Android Studio 설치 경로\bin\studio.exe.vmoptions


# custom Android Studio VM options, see https://developer.android.com/studio/intro/studio-config.html
-parameters

 








+ Recent posts