atVSG

0011001000110100

وحید امیری مطلق

توسعه دهنده وب و موبایل

رفع احتمالی مشکلات عجیب و به ظاهر غیر منطقی در Android


android weird issues

چندین ماه بود که یکی از اپ هایی که در دست توسعه داشتم داشت مشکلات عجیب و غریبی رو تجربه میکرد. اولیش این بود که هیچ سرویس push notification در برنامه کار نمیکرد. هیچ یعنی به واقع هیچکدوم از سرویس هایی که میشد استفاده کرد مثلا OneSignal یا Pushwoosh یا حتی سرویس ایرانی پوشه. تنها سرویسی هم که حداقل یه خطایی از طریق logcat میداد همین OneSignal بود. خطاش هم OneSignal AppId format is invalid بود.

گوگل کردن خطا هم متاسفانه هیچ کمکی نمیکرد. در بهترین حالت یه issue در github پیدا میشد که [تقریبا] مثل همیشه با پست های بی معنی و راه حل های تخیلی پر شده بود. چون این مساله push notification خیلی هم برای این برنامه حیاتی نبود من زیاد اهمیت ندادم ولی اخیرا متوجه شدم که هیچکدوم از library هایی که برای آپلود فایل استفاده میشن هم کار نمیکنن! در ادامه توضیح میدم مشکل چی بود و چطوری برطرفش کردم.

دیگه زدم به سیم آخر و یه پروژه جدید ایجاد کردم و فقط OneSignal و این library مربوط به آپلود فایل رو روش نصب کردم.

کامپایل کردم و با کمال تعجب هم push notification و هم file upload کار میکردند! در واقع OneSignal رو با همون تنظیمات و AppId قبلی توی پروژه جدید استفاده کردم. پس مشخص شد مشکل از OneSignal یا تنظیماتش نیست. برای آپلود فایل هم دلیل منطقی پیدا نکردم که چرا کار نمیکرد. نکته ایی که هم OneSignal هم این کتابخونه آپلود فایل با هم داشتن این بود که هر دوی اون ها وابسته به تغییرات فایل androidmanifest.xml بودند. حالا دیگه سعی کردم تموم فایل های پروژه قبلی رو به پروژه جدید منتقل کنم به جز androidmanifest.xml که قرار شد قدم به قدم تغییرات فایل قدیمی رو روی فایل جدید اعمال کنم.

برای اینکه لزومی به تغییر package name داخل هر فایل نباشه (مخصوصا داخل import ها) رفتم و attribute مربوط به package name رو به اسم package داخل تگ manifest که بالای فایل هست رو تغییر دادم. حالا تمام تگ های uses-permission و activity رو منتقل کردم و سعی کردم برنامه رو کامپایل کنم که خطایی شبیه خطای زیر داد:

 

Error:Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed : Attribute [email protected] value=(@string/app_name_eng) from AndroidManifest.xml:19:9-52
	is also present at [com.somecorp.somelib:library:1.1.0] AndroidManifest.xml:13:9-41 value=(@string/app_name).
	Suggestion: add 'tools:replace="android:label"' to  element at AndroidManifest.xml:15:5-141:19 to override.

 

خطا واضحه. هر کتابخونه اندروید خودش دارای یک فایل AndroidManifest.xml هست که شامل تنظیمات و بقیه چیزهای معمول مربوط به اون library هست. در نهایت موقع کامپایل شدن برنامه شما، این فایل ها با فایل AndroidManifest.xml برنامه شما merge (یکی) میشه. ولی در صورتی که یک attribute یا یک تگ+اسم یکسان در 2 جا یا بیشتر وجود داشته باشند عمل merge انجام نمیشه و خطا میگیرید. راهش اینه که تگ های خودتون رو جایگزین تگ های کتابخونه ها بکنید. این کار رو از 2 روش میشه انجام داد. اولش اینه که خط زیر رو به تگ application اضافه کنید:

tools:node="replace"

طبق توضیحات Android Studio:

Replace the lower-priority element completely. That is, if there is a matching element in the lower-priority manifest, ignore it and use this element exactly as it appears in this manifest.

راه دوم اینه که تک تک تگ هایی رو که میخواید replace بشن رو به صورت واضح مشخص کنید. مثل:

tools:replace="android:label, android:theme"

من قبلا از روش اول استفاده کرده بودم بعد از تمام اون مشکلات تصمیم گرفتم روش دوم رو هم امتحان کنم. پس دقیقا کد بالا رو جایگزین قبلی کردم و برنامه با موفقیت کامپایل شد و بعد از اجرا هیچ مشکلی نداشت و هم OneSignal و هم آپلود فایل کار میکردند.

امیدوارم این پست به شما در رفع این مشکل کمک کرده باشه.



 برچسب ها: ، ، ، ، ، ،

 دیدگاه ها:
سوال یا دیدگاه؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *