+2 امتیاز
قبل در برنامه نویسی توسط (193 امتیاز)
ویرایش شده قبل توسط

من یک سری ویو دارم که به صورت کلاس توی پروژه ساخته شده و در لایوت ها از آنها استفاده کرده ام

package net.myPackage.Util;
public class ResizableImageView extends ImageView {
.
.
.
}

 

   <net.myPackage.Util.ResizableImageView
                android:id="@+id/imgSearchImage"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:contentDescription="@string/Search"
                android:src="@drawable/home_search_cars" />

 

وقتی ProGuard را فعال میکنم این ویو را پیدا نمیکند.

چطور باید در ProGuard مشخص کنیم که  View های custom شده  تغییر نکند؟

1 پاسخ

0 امتیاز
قبل توسط (2.2هزار امتیاز)
ویرایش شده قبل توسط

ProGuard یک ابزار رایگان و اوپن سورس است، که برای فشرده (Shrink)، بهینه (Optimize) و ناخوانا (Obfuscate) کردن کلاس‌های جاوا مورد استفاده قرار می‌گیرد. اما همونطور که به عنوان یک توسعه دهنده اندروید، اطلاع دارید، به طور معمول تنظیمات مربوط به Rule‌های ProGuard، کار چندان ساده‌ای نیست و احتمالا تا به حال برای شما نیر اتفاق افتاده که بعد از Build نسخه ریلیز به مشکلاتی در رابطه با تغییرات اعمال شده توسط آن برخورده باشید.

در ادامه قصد دارم کتابخانه‌ای را به شما معرفی کنم که امکان استفاده از ProGuard را برای شما بسیار ساده‌تر خواهد کرد، این کتابخوانه با استفاده از دو انوتیشن @Keep و @KeepName این امکان را برای شما فراهم می‌کند که به سادگی از اعمال تغییرات توسط ProGuard مصون نگه دارید.

کتابخانه‌ای که در بالا به آن اشاره شد Squad Leader نام دارد و در مخزن Maven Central در دسترس هست و به سادگی با اضافه کردن آن مطابق کد زیر به پیش نیازهای پروژه خود می‌توانید آن را در دسترس داشته باشید.

dependencies {
    compile 'nl.littlerobots.squadleader:squadleader:1.2'
}

بعد از اضافه کردن کد بالا در تنظیمات Gradle و دوباره سازی و Rebuild پروژه به سادگی و با استفاده از Annotation های فوق الذکر به شکلی که در ادامه مشاهده می‌کنید، قادر به جلوگیری از اعمال تغییرات توسط ProGuard خواهید بود.

import nl.littlerobots.squadleader.Keep;
import nl.littlerobots.squadleader.KeepName;

public class Example {
    @KeepName
    // this field will be stripped if it's unused in your code
    public String stringTheory;
    @Keep
    // this field will be kept, even if it's unused
    public boolean myBool;
}

همانطور که در کد بالا مشاهده می‌کنید تفاوت @Keep و @KeepName در این است که در هنگام استفاده از @Keep حتی اگر کلاس، پروپرتی یا متود مورد نظر در جایی استفاده نشده باشد، توسط ProGuard حذف نخواهد شد، در حالی که با ستفاده از @KeepName شما این اجازه را به ProGuard می‌دهید تا در صورت عدم استفاده، کلاس، پروپرتی یا متود مربوطه را خذف یا ناخوانا کند. همانطور که در مثال زیر می‌بینید شما قادر به استفاده از این انوتیشن‌ها بر روی کل یک کلاس نیز خواهید بود.

@Keep
// this class is not stripped or obfuscated
public class Example {
    public String stringTheory;
    public boolean myBool;
}

منبع

قبل توسط (193 امتیاز)
ممنون بابت پاسختون
آیا در اکلیپس هم میشه از Squad Leader استفاده کرد؟ من از اکلیپس استفاده میکنم
قبل توسط (2.2هزار امتیاز)
اینطور که دیدم و خوندم الان تو سایتهای مختلف، شاید بشه از کتابخانه های دیگه استفاده کنید برای حل این مشکل. اینجاها رو بخونید ان شاء الله که مشکلتون حل بشه.

proguard در اکلیپس
http://p30droid.com/Thread-proguard-%D8%AF%D8%B1-%D8%A7%DA%A9%D9%84%DB%8C%D9%BE%D8%B3

محافظت از سورس برنامه
http://barnamenevis.org/archive/index.php/t-434118.html

کتابخانه ActionBarSherlock
http://www.kelidestan.com/forum/printthread.php?tid=5430

سوالات مشابه

0 امتیاز
1 پاسخ 356 بازدید
0 امتیاز
1 پاسخ 1.4هزار بازدید
0 امتیاز
1 پاسخ 359 بازدید
0 امتیاز
1 پاسخ 878 بازدید
+1 امتیاز
0 پاسخ 399 بازدید
0 امتیاز
0 پاسخ 745 بازدید
...