آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

کرش کردن apk برنامه بعد از استفاده از Reflection برای تعریف کنترل های layout ها

سلطانی  6 سال پیش  5 سال پیش
+1 0

با عرض سلام ،
من فیلم های سری جدید اموزش اندروید رو دیدم و طبق فیلم‌های مربوط به طراحی فریمورک اختصاصی و قسمت آخر که کنترل‌های layout ها با reflection  و به وسیله ی extarct ui مقداردهی می شد ، من هم در پروژه‌ام از همین روش برای تعریف کنترل‌ها استفاده کردم ،
ولی مشکلی که وجود داره اینه که برنامه به خوبی روی شبیه‌ساز اجرا میشه و همچنین وقتی گوشی رو با کابل متصل میکنم هم، باز به درستی برنامه کار میکنه ولی زمانی که apk تولید شده رو روی گوشی نصب میکنم برنامه کرش میکنه و force close میشه و وقتی گوشی متصل هست به لب‌تاب علت کرش رو پیدانکردن منبع درست برای کنترل‌های ui عنوان میکنه و NullPoint Exeption میده .


من برای اطمینان بیشتر (با این احتمال که شاید جایی از کدم رو اشتباه زدم) سورس کد پروژه‌ی آخر مربوط به reflection آموزش ها رو هم اجرا کردم و در آن برنامه هم همین مشکل وجود داره ، یعنی برنامه رو شبیه ساز درست اجرا میشه ولی فایل apk رو که میگیرم و نصب مکینم روی گوشی اونم کرش میکنه.


کسی میدونه علت این مشکل چیه ؟

برای تولید apk چند مرتبه هم پروژه رو clean و  rebuild کردم و دوباره با Build apk فایل نصبی رو ایجاد کردم ولی باز همون مشکل وجود داشت ، حتی برخی استفاده از generate signed apk رو پیشنهاد کردند ولی این کار هم بی نتیجه بود.

0 0
اگر پروگارد فعال باشه، احتمالا مشکل از اون هست. (6 سال پیش)
+1 0
نه متاسفانه مشکل از پروگارد نبود ، use proguard رو false کردم تو gradle ولی باز همون مشکل وجود داره و برنامه رو تا روگوشی باز میکنم کرش میکنه (6 سال پیش)
0 0
چیزی که اینجا هست میگه ui.texthello در واقع null هست و مقدار دهی نشده. (6 سال پیش)
+1 0
بله میدونم میگه مقداردهی نشده، ولی همین برنامه به درستی روی شبیه ساز اجرا میشه و همچنین روی گوشی که به عنوان شبیه ساز با کابل متصل شده باشه ، و این اروری هست که به سورس کد مربوط به جلسه آخر طراحی فریمورک اختصاصی یعنی کار با reflection که بدون تغییر از آن apk گرفته شد ولی برنامه کرش میکنه ، یعنی نمیتونه توسط متد extract ui که در ویدیو آموزش داده شده مقداردهی بشه ، حالا نمیدونم مشکل برای چی هست و چرا روی شبیه ساز به درستی کار میکنه (6 سال پیش)
0 0
سلام منم دقیقا همین مشکل رو دارم یه سوال هم دارم اینکه اگه بخوایم از این روش برای دیالوگ ها استفاده کنیم باید چیکار کنیم ؟ (6 سال پیش)
+1 0
مثل اینکه اینجا لینک هم این مشکل مطرح شده، کسی نمیدونه مشکل چیه ؟ (6 سال پیش)
 برای این سوال 1 پاسخ وجود دارد. مشاهده پاسخ صحیح
پاسخ به سوال 
سلطانی  6 سال پیش
+4 0

 پاسخ صحیح

سلام، علت مشکل رو بالاخره متوجه شدم .

مشکل مربوط میشه به خوندن یک فیلد 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();
}
}
}

 

+1 0
آقا دم شما گرم حل شد (6 سال پیش)
0 0
چند ساعتی درگیرش بودم تویه سایت های خارجی سرچ کردم چیزی پیدا نکردم گفتم اینجا هم یه سرچی بزنم که دیدم شما جوابش رو پیدا کردید.خدا خیرت بده (5 سال پیش)
0 0
به علاوه ی این مشکلی که گفتید یه مشکل دیگه ای هم وجود داره که تویه این تاپیک بهش اشاره کردم لینک (5 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .