2011-05-23 16 views
8

मैं एक obfuscate जार फ़ाइल बनाने के बारे में कैसे जा सकते हैं? अभी तक मैं आसानी से अपने एंड्रॉइड lib प्रोजेक्ट को एक जार में निर्यात कर सकता हूं और इसका उपयोग कर सकता हूं। मैं जार फ़ाइल को कैसे रोकूं?एक obfuscated जार फ़ाइल कैसे बनाएँ?

मेरा अंतिम लक्ष्य दूसरों को उनकी परियोजनाओं में lib.jar का उपयोग करने की अनुमति देना है। मैं बस जितना कर सकता हूं उतना कोड की रक्षा करना चाहता हूं ... :)

उत्तर

15

बाहर निकलना संभव है और यह मुश्किल नहीं है। कोशिश करने के 3 घंटे बाद मैंने अंततः इसे समझ लिया! का उपयोग करते हुए जीयूआई तुम सिर्फ in.jar और out.jar चयन

Android-SDK \ उपकरण \ ProGuard

:

एंड्रॉयड के तहत एक सुविधाजनक ProGuard जीयूआई प्रदान करता है। आपको android.jar का चयन करना होगा और चयनित डिफ़ॉल्ट rt.jar को हटा देना होगा।

एक बार ऐसा करने के बाद आपको सावधानीपूर्वक झुर्रियों और Obfuscation विकल्पों का चयन करना होगा।

मुझे उम्मीद है कि किसी भी तरह से या किसी अन्य मदद करता है!

+3

rroid.jar को android.jar के साथ बदलना निश्चित रूप से उल्लेखनीय है। +1। – Dave

+0

इस उत्तर को पोस्ट करने के लिए धन्यवाद - क्या आप संभवतः जोड़ सकते हैं कि आपने लाइब्रेरी कक्षाएं कैसे रखीं ताकि वे सुलभ हो सकें? आयात करने के बाद (libs फ़ोल्डर, पथ बनाने के लिए जोड़ें) एक्लास जैसे वर्गों के साथ obfuscated लाइब्रेरी, कुछ भी पहचाना नहीं गया है और मैं अभी भी क्या रखने के लिए अटक गया है, जबकि अभी भी कोड की रक्षा – brandall

0

यदि यह बाहरी जार है, तो यदि आपके पास यह "libs" फ़ोल्डर में है और एंड्रॉइड 2.2+ एसडीके के साथ संकलित है, तो यह स्वचालित रूप से उपयोग करता है एपीके obfuscate करने के लिए proguard। यदि आप इस जार को लाइब्रेरी के रूप में चाहते हैं और इसे अपने एपीके में इस्तेमाल करने से पहले इसे खराब कर देते हैं, तो यह संभव नहीं हो सकता है। यदि आप एंड्रॉइड की तुलना में एपीके ओबफ्यूसेशन की बात कर रहे हैं तो यह 2.2 से है (मुझे प्रोजेगार्ड के साथ), और आपको इसके बारे में चिंता करने की ज़रूरत नहीं है।

+0

आपकी टिप्पणी के लिए धन्यवाद। मैं वास्तव में वास्तविक lib.jar फ़ाइल obfuscating में देख रहा हूँ। Flurry यह उनके एसडीके lib के साथ करता है। – Jona

+0

एंड्रॉइड एपीके में, उस obfuscated जार का उपयोग कर, जार उस पर proguard चलाने के रूप में सरल हो सकता है मुश्किल हो सकता है। – omermuhammed

0

आप अपनी परियोजना के लिए प्रोजेगार्ड सक्षम करने के लिए - यह बहुत आसान है। http://developer.android.com/guide/developing/tools/proguard.html

एक आम त्रुटि जो हो सकती है वह है कि प्रतिबिंब का उपयोग करते समय विधियां नहीं मिलती हैं। ऐसा इसलिए है क्योंकि obfuscation विधि नाम और कभी-कभी पूरी कक्षाओं को हटा देता है। यदि आपके पास कस्टम विचार हैं तो वही बात हो सकती है।

आप क्या वर्गों proguard.cfg में "रखें" ध्वज का उपयोग कर

यहाँ

कुछ आम लोगों को इस एक Maven निर्माण से है द्वारा रखने के लिए कॉन्फ़िगर - लेकिन अवधारणा ही

-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.view.View { 
           public <init>(android.content.Context); 
           public <init>(android.content.Context, android.util.AttributeSet); 
           public <init>(android.content.Context, android.util.AttributeSet, int); 
           public void set*(...); 
-keepclasseswithmembers class * { 
           public <init> (android.content.Context, android.util.AttributeSet); } 
-keepclasseswithmembers class * { 
           public <init> (android.content.Context, android.util.AttributeSet, int); } 
-keepclassmembers class * implements android.os.Parcelable { 
           static android.os.Parcelable$Creator *; } 
-keepclassmembers class **.R$* { public static <fields>; } 
-keepclasseswithmembernames class * { native <methods>; } 
-keepclassmembers class * extends java.lang.Enum { 
           public static **[] values(); 
           public static ** valueOf(java.lang.String); } 
-keepclassmembers class * extends android.app.Activity{ 
           public void *(android.view.View); } 
है

काफी बड़ा क्षेत्र है, लेकिन उम्मीद है कि यह मदद करता है ...

+0

वैसे यह एक संपूर्ण एंड्रॉइड प्रोजेक्ट के लिए है जो मैं पहले से ही बिना किसी समस्या के काम कर रहा हूं। मैं बस अपने कोड के साथ एक जार फ़ाइल obfuscate करना चाहता हूँ। जार एक अंतिम परियोजना से पूरी तरह से अलग है। जार में एंड्रॉइड कोड होता है। यह जार अन्य डेवलपर्स को वितरित करने का इरादा है। – Jona

0

एक obfuscated जार फ़ाइल बनाने के लिए आप इसे build.xml फ़ाइल जोड़कर और अपने proguard-project.txt फ़ाइल में परिवर्तन कर सकते हैं और कमांड लाइन से चींटी रिलीज चला रहे हैं और आप obfuscated.jar के नीचे पाएंगे

एक टर्मिनल खोलने के लिए और एंड्रॉयड/उपकरण/चींटी गुना पर जाएँ: परियोजना

कदम

  • लिनक्स में अपनी परियोजना में build.xml को जोड़ने के लिए की अपनी बिन फ़ोल्डर में ProGuard फ़ोल्डर er और run

    ./android update project -p /path_of_your_android_library_project 
    

    और आपको अपनी परियोजना रूट निर्देशिका में build.xml मिलेगा।

  • अपनी परियोजना में कहानियो को सक्षम करने के लिए: करने के लिए

    अपने संपादक में एक project.properties फ़ाइल को खोलने और

    proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 
    
  • से टिप्पणी को निकालने के अपने परिवर्तनों को जोड़ने ProGuard-project.txt फ़ाइल और टर्मिनल में अपनी परियोजना के लिए जाने के लिए और

    ant release 
    
1

figurin चलाने जी यह पता करना आसान नहीं था, लेकिन एक बार किया, चरण दोहराते है कि मुश्किल नहीं है:

  • बना सकते हैं और अपने Android पुस्तकालय परियोजना निर्माण के रूप में आप सामान्य रूप से
  • एक proguard.cfg फ़ाइल बना सकेगी (निम्नलिखित एक है नुस्खा, लेकिन कुछ महत्वपूर्ण भागों में शामिल हैं।

proguard.cfg उदाहरण

# optimization passes will allow multiple tries to strip dead code 
# if it doesn't find anything on the 2nd pass, it won't do a 3rd. 
-optimizationpasses 5 

-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 

# it would complain about my missing R stuff, and it does the right thing with this line 
-dontwarn com.mycompany.myproject.R* 

# the location of the pre-obfuscated .jar built by your project 
-injars bin/myproject.jar 

-verbose 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

# this will fake "dead-strip" calls to Log.v() & Log.d()  
-assumenosideeffects class android.util.Log { 
    public static int v(...); 
    public static int d(...); 
} 

# this will fake "dead-strip" calls to a more complex logging function i created 
-assumenosideeffects class com.mycompany.myproject.FirstPackageWithLogging { 
    private void LogR(...); 
} 

# this will fake "dead-strip" a function in which i check to see if the 
# USB-cable is connected and perform waitForDebugger(), since i don't want 
# those making use of my obfuscated library to have to wait for the debgger 
# when they won't be debugging my library 
-assumenosideeffects class com.mycompany.myproject.MyProject { 
    private void setupDebugging(); 
} 

# this will fake "dead-strip" a toast i use to measure focus 
-assumenosideeffects class com.mycompany.myproject.UXObserver { 
    private void toastFocus(); 
} 

# i don't want to obfuscate 3rd-party stuff, in case someone else 
# is using the same classes, and wants to just get mine via pass-through 
-keep class org.thirdparty.package.** 
-keep class com.licensedpackage.** 

# i want my API to be public, so i expose it 
-keep public class com.mycompany.myproject.MyAPI 

# almost all the rest are the suggestion of the proguard examples page 
-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 

-keepclassmembers public class com.mycompany.myproject.MyAPI { 
    public static <fields>; 
} 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

-keepclassmembers class * extends android.app.Activity { 
    public void *(android.view.View); 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 
    एक कमांड लाइन पर
  • (यह डार्विन की ओर उन्मुख है, लेकिन खिड़कियों

पर ज्यादातर एक ही होना चाहिए ...

$ java -jar $ANDROID_SDK/tools/proguard/lib/proguard.jar 
-libraryjars $ANDROID_SDK/platforms/android-18/android.jar @proguard.cfg 
-outjars ../MyReleaseSDK/libs/myproject.jar 

यह है। आउटपुट में आपका ओबफू होगा स्केटेड .jar फ़ाइल।

उस बिंदु से, मैं अपने प्रोजेक्ट से कुछ आइटम पर कॉपी (NDK के लिए .project फ़ाइल शून्य से बाहरी उपकरण निर्माता, रेस फ़ोल्डर, libs मेरी JNI कोड के लिए फ़ोल्डर, और project.properties और AndroidManifest.xml) MyReleaseSDK में, फिर इसके बाहर एक .zip बनाएँ। तब .zip किसी अन्य व्यक्ति द्वारा ग्रहण "आयात" परियोजना के रूप में उपयोग किया जा सकता है; यह एक खाली src फ़ोल्डर बनायेगा, संसाधनों को सही तरीके से जेन करेगा, और जो कोई भी इसे नियमित रूप से एंड्रॉइड लाइब्रेरी प्रोजेक्ट के रूप में उपयोग करना चाहता है, उसके बावजूद इसे अपनाने के बावजूद।

संबंधित मुद्दे