کرش کردن apk برنامه بعد از استفاده از Reflection برای تعریف کنترل های layout ها
با عرض سلام ،
من فیلم های سری جدید اموزش اندروید رو دیدم و طبق فیلمهای مربوط به طراحی فریمورک اختصاصی و قسمت آخر که کنترلهای layout ها با reflection و به وسیله ی extarct ui مقداردهی می شد ، من هم در پروژهام از همین روش برای تعریف کنترلها استفاده کردم ،
ولی مشکلی که وجود داره اینه که برنامه به خوبی روی شبیهساز اجرا میشه و همچنین وقتی گوشی رو با کابل متصل میکنم هم، باز به درستی برنامه کار میکنه ولی زمانی که apk تولید شده رو روی گوشی نصب میکنم برنامه کرش میکنه و force close میشه و وقتی گوشی متصل هست به لبتاب علت کرش رو پیدانکردن منبع درست برای کنترلهای ui عنوان میکنه و NullPoint Exeption میده .
من برای اطمینان بیشتر (با این احتمال که شاید جایی از کدم رو اشتباه زدم) سورس کد پروژهی آخر مربوط به reflection آموزش ها رو هم اجرا کردم و در آن برنامه هم همین مشکل وجود داره ، یعنی برنامه رو شبیه ساز درست اجرا میشه ولی فایل apk رو که میگیرم و نصب مکینم روی گوشی اونم کرش میکنه.
کسی میدونه علت این مشکل چیه ؟
برای تولید apk چند مرتبه هم پروژه رو clean و rebuild کردم و دوباره با Build apk فایل نصبی رو ایجاد کردم ولی باز همون مشکل وجود داشت ، حتی برخی استفاده از generate signed apk رو پیشنهاد کردند ولی این کار هم بی نتیجه بود.
سلام، علت مشکل رو بالاخره متوجه شدم .
مشکل مربوط میشه به خوندن یک فیلد Private بدون دسترسی ، که برای رفع مشکل باید خط زیر برای دسترسی دادن به اون فیلد نوشته بشه :
field.setAccessible(true);
با این خط کد مشکل من حل شد و دیگه برنامه کرش نمیکنه .
کد قسمت مربوط به reflection بعد از این تغییر :
// reflect ui elements
{
Class clazz = this.ui.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
String name = field.getName();
Class type = field.getType();
if (name.contains("$")) {
continue;
}
int id = UBase.get().getResources().getIdentifier(name, "id", UBase.get().getPackageName());
try {
field.set(this.ui, activity.findViewById(id));
} catch (IllegalAccessException e) {
Log.i("LOG", "Error");
e.printStackTrace();
}
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .