অগ্রগতি ব্যবহার করার সময় কোনও নির্দিষ্ট প্যাকেজ পাথ কীভাবে রাখা / বাদ দেওয়া যায়?


110

আমি প্রোগার্ড থেকে কিছু ফাইল পাথ বাদ দিতে চাই। উদাহরণcom.myapp.customcomponents

কিভাবে আমি এটি করতে পারব? আমার এই ডিরেক্টরিতে থাকা প্রতিটি কাস্টম উপাদান ফাইলের জন্য পতাকা রাখার জন্য আমি ঘৃণা করি।

আমি নিম্নলিখিত চেষ্টা করেছিলাম কিন্তু এটি কার্যকর হয় না:

-keep public class com.myapp.customcomponents.*

উত্তর:


241

কীভাবে এটি কাজ করে না তা আপনি নির্দিষ্ট করবেন না। আপনার কনফিগারেশনটি নির্দিষ্ট প্যাকেজে সমস্ত পাবলিক ক্লাসের নাম রাখে:

-keep public class com.myapp.customcomponents.*

নিম্নলিখিত কনফিগারেশনটি সমস্ত সর্বজনীন শ্রেণীর নাম নির্দিষ্ট প্যাকেজ এবং এর উপ-প্যাকেজে রাখে:

-keep public class com.myapp.customcomponents.**

নিম্নলিখিত কনফিগারেশনটি সমস্ত সর্বজনীন / সুরক্ষিত শ্রেণি / ক্ষেত্র / পদ্ধতির নাম নির্দিষ্ট প্যাকেজ এবং এর উপ-প্যাকেজে রাখে:

-keep public class com.myapp.customcomponents.** {
  public protected *;
}

6
ডাবল অস্ট্রিস্ক (**) আর সংকলন করে না (অ্যান্ড্রয়েড স্টুডিও 4.0.০)
ড্যানিয়েল

1
অ্যান্ড্রয়েড স্টুডিও x.x ডাবল অ্যাসিরিস্টস (**) এর জন্য "অমীমাংসিত শ্রেণির নাম" ইত্যাদির মতো ত্রুটি প্রদর্শন করবে, তবে এটি প্রত্যাশার মতো কাজ করবে।
মাহমুদুল হাসান শোহাগ


55

আপনার প্রোগার্ড কনফিগারেশনের নীচে নিম্নলিখিত লাইনটি যুক্ত করুন:

-keep class com.facebook.** { *; }

সেই অনুযায়ী প্যাকেজের নাম প্রতিস্থাপন করুন, এখানে প্যাকেজটি com.facebookপ্রোগুয়ার্ড থেকে বাদ দেওয়া হবে।


13
কেন রাখুন এবং একসাথে ব্যবহার
নিষিদ্ধ করবেন

@ জংজ পুয়াংপুট, যদি আমি সঠিকভাবে বলি - যদি অ্যাপ্লিকেশন com.facebook প্যাকেজটি ব্যবহার না করে, তবে বিল্ড করার সময় নোটটি দেখানো হবে "কনফিগারেশনটি অজানা শ্রেণিকে বোঝায় ..."। -ড্যান্ট ওয়ার্ন এই নোটটি অক্ষম করুন।
ইউরা শিংকারেভ

14
{ *; }মানে কি ?
মুহাম্মদ বাবর

15
@ মুহাম্মাদবাবার মানে প্রতিটি সদস্য, পদ্ধতি, প্রতিটি ক্ষেত্রের ক্লাস, সংক্ষিপ্তভাবে!
ওমর এল ডন

1

প্রচুর লোকেরা -keep class com.myapp.customcomponents.** { *; }প্রক্রিয়াজাতকরণ থেকে কোনও পথকে বাদ দেওয়ার উপায় হিসাবে প্রস্তাবিত বলে মনে হয় । এখানে দেখো:

  1. অগ্রগতি থেকে প্যাকেজ বাদ দিন
  2. প্রোগার্ড সম্পূর্ণ প্যাকেজ উপেক্ষা করুন
  3. অগ্রগতি অবসন্নতা থেকে একটি ডিরেক্টরি প্রতিরোধ করুন

এই সমাধানটির সাথে সমস্যাটি হ'ল এখনও কিছু স্তরের উদ্বিগ্নতা ঘটছে যা আপনার কোডটি ভেঙে দিতে পারে। আপনি ম্যাপিং প্রিন্ট মধ্যে ম্যাপিং দেখতে পারেন:

java.lang.String toString() -> toString
int getMemoizedSerializedSize() -> getMemoizedSerializedSize
void setMemoizedSerializedSize(int) -> setMemoizedSerializedSize
int getSerializedSize() -> getSerializedSize
boolean equals(java.lang.Object) -> equals
int hashCode() -> hashCode

আমি যে সমাধানটি বেছে নিয়েছি তা হ'ল দুটি পদক্ষেপের প্রক্রিয়া। প্রথমে, injarsআমি যে প্যাকেজটি প্রক্রিয়া করতে চাই তার চয়ন করতে ফিল্টারটি ব্যবহার করুন। অন্যান্য প্যাকেজ প্যাথগুলি গ্রন্থাগার হিসাবে যুক্ত করা সম্ভব।

-injars       artifacts/in.jar(org/toprocess/**.class)
-outjars      out/processed.jar
-libraryjars  artifacts/in.jar(org/skipped/**.class)
-libraryjars  artifacts/in.jar(org/moreskipped/**.class)

দ্বিতীয়ত, প্রক্রিয়াজাত জারটিকে মূল জারের সাথে একীভূত করুন, তবে কেবলমাত্র সেই পথগুলি বাদ দেওয়া হয়েছে।

-injars  out/processed.jar
-injars  artifacts/in.jar(org/skipped/**.class)
-injars  artifacts/in.jar(org/moreskipped/**.class)
-outjars out/merged.jar

-dontshrink
-dontoptimize
-dontobfuscate

ফলাফলটি একত্রীভূত জার যা প্রক্রিয়াজাত প্যাকেজ পাথ এবং এড়িয়ে যাওয়া পাথের সংমিশ্রণ। এই অনুশীলনটি অবৈধ, যদি কেউ নির্দিষ্ট কিছু পাথের প্রক্রিয়া সম্পূর্ণভাবে এড়িয়ে যাওয়ার কোনও উপায় সরবরাহ করতে পারে (যা আমি পাই না)।


1

অ্যান্ড্রয়েড স্টুডিও 4.0 ব্যবহার করে আমার জন্য যা কাজ করেছে তা হ'ল:

-keepclassmembers class com.myapp.customcomponents.* {
    <fields>;
    <init>();
    <methods>;
}

অন্যান্য উত্তরে ডাবল অ্যাস্টারিস্ক (**) আমার পক্ষে কাজ করে না। আমি আর 8 এর সাথে উপরের কনফিগারেশনটিও চেষ্টা করেছি, সূক্ষ্মভাবে কাজ করে।


আমি মনে করি এই উত্তরটি সর্বশেষতম উত্তর। ধন্যবাদ.
গোগো-দ্য ক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.