2012-09-05 2 views
11

누구나 프로 가드로 자신의 라이오닌을 컴파일 한 우버야를 난처하게하는 경험이 있는지 궁금합니다. 나는 Google에서 해결책을 찾기 위해 최선을 다했지만 정말 답을 찾을 수 없습니다. 이것이 가능한지 궁금합니다.ProGuard로 클로저 우버러를 난독 화

저는 기본 프로젝트를 혼란스럽게 만들려고했습니다. 여기에 core.clj 파일입니다 :

(ns proguard.core 
(:gen-class)) 

(defn -main 
    "I don't do a whole lot." 
    [& args] 
    (println "Hello, World!")) 

프로젝트 파일 :

(defproject proguard "0.1.0-SNAPSHOT" 
    :description "FIXME: write description" 
    :url "http://example.com/FIXME" 
    :license {:name "Eclipse Public License" 
      :url "http://www.eclipse.org/legal/epl-v10.html"} 
    :dependencies [[org.clojure/clojure "1.4.0"]] 
    :aot :all 
    :main proguard.core) 

내 난독 설정 파일 :

-injars clojure/proguard/target/proguard-0.1.0-SNAPSHOT-standalone.jar 
-outjars clojure/test-project 

-libraryjars /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/rt.jar 

-dontshrink 
-dontoptimize 
-dontusemixedcaseclassnames 
-dontpreverify 
-dontnote 
-printseeds 

-keepclasseswithmembers public class * { 
    public static void main(java.lang.String[]); 
} 

-keep class clojure.core__init { public static void load(); } 
-keep class clojure.core_proxy__init { public static void load(); } 
-keep class clojure.core_print__init { public static void load(); } 
-keep class clojure.genclass__init { public static void load(); } 
-keep class clojure.core_deftype__init { public static void load(); } 
-keep class clojure.core.protocols__init { public static void load(); } 
-keep class clojure.gvec__init { public static void load(); } 
-keep class clojure.java.io__init { public static void load(); } 
-keep class clojure.lang__init { public static void load(); } 

-keep class proguard.core__init { 
    public static void load(); 
} 
-keep class proguard.core { 
    public *** super*(...); 
} 

나는 다음 내가 얻을 난독 항아리를 실행하려고 할 때마다 오류 :

Exception in thread "main" java.lang.ExceptionInInitializerError 
    at clojure.lang.ve.<init>(Unknown Source) 
    at clojure.lang.ve.c(Unknown Source) 
    at clojure.lang.yf.a(Unknown Source) 
    at proguard.core.<clinit>(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: clojure.lang.PersistentList, compiling:(clojure/core.clj:20) 
    at clojure.lang.at.a(Unknown Source) 
    at clojure.lang.at.b(Unknown Source) 
    at clojure.lang.at.a(Unknown Source) 
    at clojure.lang.bj.a(Unknown Source) 
    at clojure.lang.at.a(Unknown Source) 
    at clojure.lang.at.b(Unknown Source) 
    at clojure.lang.at.a(Unknown Source) 
    at clojure.lang.at.a(Unknown Source) 
    at clojure.lang.at.a(Unknown Source) 
    at clojure.lang.xh.a(Unknown Source) 
    at clojure.lang.xh.a(Unknown Source) 
    at clojure.lang.xh.b(Unknown Source) 
    at clojure.lang.xh.d(Unknown Source) 
    at clojure.lang.xh.c(Unknown Source) 
    at clojure.lang.xh.<clinit>(Unknown Source) 
    ... 4 more 
Caused by: java.lang.ClassNotFoundException: clojure.lang.PersistentList 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at clojure.lang.ec.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:247) 
    at clojure.lang.xh.h(Unknown Source) 
    at clojure.lang.bp.b(Unknown Source) 
    at clojure.lang.bp.a(Unknown Source) 
    at clojure.lang.bq.a(Unknown Source) 
    ... 19 more 

내가 여기서 뭘 잘못하고 있는지 잘 모르겠다 ... 나는 클로저가 목표로하는 proguard 튜토리얼 obfuscating with proguard을 따르려고 노력했다. 그러나 그것은 안드로이드와 개미가 특정 적이기 때문에 프로세스가 데스크탑과 완전히 다른지 궁금하다. lein을 사용하는 응용 프로그램.

미리 감사드립니다.

+0

proguard에 대한 경험이 없지만 stacktrace에서이 obfuscator가 uberjar에서 clojure 런타임을 제외 시켰습니다. 당신의 프로그램에서 작동하는 clojure.jar의 * 모든 클래스를 유지해야합니다. 단지 여러분의 설정에서 보이는 것처럼 여러 개의'__init' 클래스가 아니라 작동시켜야합니다. 나는 추측을하고'-libraryjars'의 목록에 clojure.jar를 추가해야한다고 말합니다. –

+0

안녕하세요, 올바른 방향으로 나를 가리켜 주셔서 감사합니다! 전체 clojure.jar는 집착해야 할 indded 필요 않습니다. 나는 내 자신의 질문에 곧 대답 할 것이다. [편집 : 흠, 질문은 아직 너무 어리지만, 나는 그것을 할 수없는 것 같아요 ...] – deadringer

+0

당신은 자신의 질문에 적절하게 대답해야합니다.질문 앞에 대답이 있으면 혼란 스럽습니다. – Tom

답변

13

위에서 복사 :

난독 uberjars

1. (의견, 간단한, 기본 lein 프로젝트) 여기

내 사본의 당신의 project.clj 파일 준비를 :

(defproject proguard "0.1.0-SNAPSHOT" 
    :description "FIXME: write description" 
    :url "http://example.com/FIXME" 
    :license {:name "Eclipse Public License" 
      :url "http://www.eclipse.org/legal/epl-v10.html"} 
    :dependencies [[org.clojure/clojure "1.4.0"]] 
    :main proguard.core 
    ;;; Make sure everything is aot compiled 
    :aot :all 
    ;;; Remove source .clj files from the resulting jar 
    :omit-source true 
) 

여기에 그다지 많은 것이 없습니다 ... Al 따라서 (:gen-class)이 네임 스페이스 선언에 포함되어 있는지 확인하십시오.

lein uberjar으로 uberjar를 빌드하면 다음 단계로갑니다.

2. 당신의 ProGuard에서 설정 파일

다시 한번 내 파일의 복사본을 준비 주석

# Our uberjar 
-injars clojure/proguard/target/proguard-0.1.0-SNAPSHOT-standalone.jar 
# Our output direcotry 
-outjars clojure/obfuscated 

# Link to rt.jar. I'm on a Mac so your path may differ 
-libraryjars /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/rt.jar 

# ProGuard options. Detailed explanation here http://proguard.sourceforge.net/index.html#manual/usage.html 
-dontskipnonpubliclibraryclassmembers 
-dontnote 
-printseeds 

# What we will be doing is obfuscating, shrinking and optimizing the jar. 
# If you experience any problems start out with obfuscation and add the 
# -dontoptimize and the -dontshrink flags and see if it works. 

# Tell proguard to leave the clojure runtime alone 
# You would need to add any other classes that you wish to preserve here. 
-keep class clojure.** { *; } 

# Keep our core__init class 
-keep class proguard.core__init { 
    public static void load(); 
} 

# Keep classes that contain a main method (otherwise we won't be able to run the jar) 
-keepclasseswithmembers public class * { 
    public static void main(java.lang.String[]); 
} 

그게 전부를 함께 다음과 같습니다. 이제 새 구성 파일 java -jar proguard.jar @myconfig.pro으로 proguard를 실행하십시오. -printseeds 플래그로 인해 많은 양의 출력이 표시되어야합니다 (어떤 클래스가 프로 가드에 의해 유지되는지 보지 않으려면 물론 제거 할 수 있음).