2016-07-01 5 views
1

ProGuard를 사용하여 응용 프로그램을 난독 화하려고했습니다. obfuscate에 대한 모든 옵션 예외를 비활성화했습니다. 로더가 저의 주요 수업입니다.Proguard - 오류 : JNI 오류가 발생했습니다.

아래의 스크린 샷은 난독 화 된 병을 실행하려고 할 때의 결과입니다. 난독 처리 중 오류가 발생하지 않았습니다.

enter image description here

내 설정

-injars 'C:\Users\Corsair\Desktop\obfuscate\Example.jar' 
-outjars 'C:\Users\Corsair\Desktop\obfuscate\ExampleOut.jar' 

-libraryjars 'C:\Program Files\Java\jre1.8.0_91\lib\rt.jar' 

-dontskipnonpubliclibraryclassmembers 
-dontshrink 
-dontoptimize 
-dontusemixedcaseclassnames 
-dontpreverify 
-dontnote 
-dontwarn 

-verbose 

-keep class Loader 

답변

5

이 사용하는 전용 구성 인 경우는, 네이티브 메소드는 난독 얻을 것이다. 결과적으로 이름이 기본 라이브러리의 이름과 더 이상 일치하지 않으므로 System.loadLibrary을 사용하여 라이브러리를로드하려고 할 때 이와 같은 오류가 표시됩니다.

는이 같은 적어도 규칙을 추가해야합니다

-keepclasseswithmembernames,includedescriptorclasses class * { 
    native <methods>; 
} 

이 그것을 처리하는 모든 클래스의 모든 네이티브 메소드를 유지하는 ProGuard를 지시합니다.

편집 :이 작업을 얻을하는 데 필요한

추가 규칙 :

  • -dontpreverify 제거는 preverify는
  • 의 주요 방법

이 유지 자바 7+ 필요하다 주요 방법을 유지할 것이다 :

-keep class Loader { 
    public static void main(...); 
} 
+0

안녕에 대한 전체 가이드에 감사를 참조하십시오, 나는 그것을 추가하지만 난 여전히 오류가 발생 해요! 여기 내 설정은 http://pastebin.com/bnhvYGaT – SJ19

+0

어쩌면 출력 용기를 어딘가에 붙여 넣어 검사 할 수 있습니다. –

+0

분명히, 나는 Github에 올려 놓을 정도로 어디에서 업로드 할 것인지 정말로 모른다. https://github.com/SJ19/ProGuardTest – SJ19

4

빈 클래스, 콜백 클래스 및 기본 클래스와 같이 특정 클래스를 난독 화하지 못하도록 제외해야합니다. 공식 예에서 다음 사항이 언급되어

처리 네이티브 메소드

응용 프로그램, 애플릿, 서블릿, 도서관, 등, 네이티브 메소드가 포함되어있는 경우, 당신은 자신의 이름과 클래스를 보존 할 수 있습니다을 '이름을 사용하므로 여전히 기본 라이브러리에 연결할 수 있습니다.

-keepclasseswithmembernames,includedescriptorclasses class * { 
    native <methods>; 
} 

참고 : 우리는 모든 클래스 또는 모든 네이티브 메소드를 보존하지 않으; 우리는 관련 이름이 난독 화되지 않도록하고 싶습니다.

처리 콜백 메소드

등 응용 프로그램, 애플릿, 서블릿, 라이브러리, 외부 코드 (네이티브 코드, 스크립트, ...)에서 호출되는 콜백 메소드가 포함 된 경우, 당신은거야 그들과 아마 그들의 수업도 보존하고 싶습니다. 그것들은 코드의 시작점 일뿐입니다. 말하자면, 애플리케이션의 주요 메소드와 같습니다.

-keep class mypackage.MyCallbackClass { 
    void myCallbackMethod(java.lang.String); 
} 

처리 빈 클래스 다음

응용 프로그램, 애플릿, 서블릿, 도서관, 등, 콩 편집기 클래스, 또는 getter 및 setter 메소드를 찾기 위해 빈 클래스에 반성을 광범위하게 사용하는 경우, 구성이 어려워 질 수 있습니다. 거기는 빈 클래스 이름을 확인하는 것보다 할 수있는 다른 많은 아니에요, 또는 getter 및 setter 이름은

도움이 변경되지 않습니다 : 클래스 이름에 와일드 카드 및 방법 서명을 사용하는

-keep class mybeans.** { 
    void set*(***); 
    void set*(int, ***); 

    boolean is*(); 
    boolean is*(int); 

    *** get*(); 
    *** get*(int); 
} 
또한

다른 시나리오 (Ressources, Serialization 클래스)는 문제를 일으킬 수 있습니다. 도움을 위해 많이,이

ProGuard Official: Examples

+0

여전히 같은 오류가 발생하지만 도움을 주셔서 감사합니다. 여기 내 설정이야. http://pastebin.com/bnhvYGaT – SJ19

+0

이미 해결 된 것 같아 .. 위대한 :) –

관련 문제