友盟 Push 集成 ResClass 未初始化異常解決-原因分析-親測

友盟 Push 集成 ResClass 未初始化異常解決-原因分析-親測

在集成友盟 Push 的時候遇到一個錯,看了網上的一些說法,雖然有能解決問題的答案,但是感覺都不是很在點子上。我這裏也給一下我的解決方案。
異常內容:

    java.lang.IllegalArgumentException: ResClass未初始化,請確保你已經添加了必要的資源。同時確保你在混淆文件中添加了com.dati.zhiduoduo.world.R$* 。 field=umeng_push_notification_default_large_icon
    at com.umeng.message.common.c.a(Res.java:223)
    at com.umeng.message.common.c.d(Res.java:152)
    at com.umeng.message.UmengMessageHandler.getLargeIcon(UmengMessageHandler.java:502)
    at com.umeng.message.UmengMessageHandler.a(UmengMessageHandler.java:437)
    at com.umeng.message.UmengMessageHandler.dealWithNotificationMessage(UmengMessageHandler.java:161)
    at com.umeng.message.UmengMessageHandler.handleMessage(UmengMessageHandler.java:71)
    at com.umeng.message.UmengMessageCallbackHandlerService.a(UmengMessageCallbackHandlerService.java:162)
    at com.umeng.message.service.JobIntentService$a.a(JobIntentService.java:235)
    at com.umeng.message.service.JobIntentService$a.doInBackground(JobIntentService.java:227)
    at android.os.AsyncTask$2.call(AsyncTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.processTask(ThreadPoolExecutor.java:1187)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:784)

出現這個問題的本質原因是因爲友盟 Push SDK 需要兩個資源文件:upush_bar_image_notification.xmlupush_notification.xml,但是在程序運行的時候沒有找到資源文件,於是通知推送到達了客戶端卻沒有顯示出來。

所以解決問題的方案就是讓 SDK 能夠找到這兩個文件,找到這兩個文件的資源文件的包名,使用如下方式設置即可:

	String resRpkg = "com.dongmodao.xxx"; // R.layout.upush_bar_image_notification 中 R 的包名路徑
	PushAgent mPushAgent = PushAgent.getInstance(appContext);
    mPushAgent.setResourcePackageName(resRpkg);

只要保證資源包名路徑設置正確即可。程序包名(applicationId)和 AndroidManifest.xml 中的 package 的值在 gradle 構建之後是一致的(因爲 AndroidManifest.xml 被 merge 處理了)。所以不需要考慮 applicationId 和 package 的值是什麼,只要關心那兩個必須的文件的資源路徑就行了。

建議混淆時使用:

# 不混淆應用程序包名下的資源文件
-keep public class [您的應用包名].R$*{
	public static final int *;
}
# 不混淆 upush_bar_image_notification 的資源路徑
-keep public class [所需資源文件的資源包名路徑].R$*{
	public static final int *;
}

總的來說,問題的關鍵就是:保留並設置 upush_bar_image_notification.xmlupush_notification.xml 對應的資源包名路徑到 PushAgent 實例,其實這句話就夠了。。。扯了半片,湊夠了字數了。。。

完。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章