getResources returns null - java

We register a broadcast receiver to receive package installment or uninstallment event.
But some users report crash reports like this:
java.lang.RuntimeException: Unable to create application com.kc.security.MoSecurityApplication: java.lang.RuntimeException: getResources is null: dir - /data/app/com.cm.mg-1.apk, srcVal-1, srcVal-2
at android.app.LoadedApk.makeApplication(LoadedApk.java:495)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2249)
at android.app.ActivityThread.access$1600(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: getResources is null: dir - /data/app/com.cm.mg-1.apk, srcVal-1, srcVal-2
at com.kc.security.b.ab.b(UpdateManager.java:69)
at com.kc.security.b.ab.a(UpdateManager.java:112)
at com.kc.security.MoSecurityApplication.onCreate(MoSecurityApplication.java:66)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969)
at android.app.LoadedApk.makeApplication(LoadedApk.java:492)
... 11 more
It is not easy to reappear this crash. We think a lot about this problem. We receive a
uninstall event ,then the Application context Class called it's onCreate method, we do
some initial works there , when we call getResouce(), it returns null . When look deep
inside the framework codes, we find that getReource locate resources file by sourceDir
String in ApplicationInfo, and the String is "/data/app/com.cm.mg-1.apk" > it's the original apk , and it is not exists anymore.
It maybe happens when user update our application. In some way "/data/app/com.cm.mg-1.apk" is allready deleted and replace by "/data/app/com.cm.mg-2.apk" any way, but the "sourceDir" String in ApplicationInfo is not update.
I want to know what android does when doing a updating.

Encountered a similar problem, check this out.
RuntimeException: Unable to instantiate application
I think this should answer this question, maybe because the Resources has been destroyed during this uninstall event.

Related

Leaked IntentReceiver Exception using osmdroid

I have in my Android app a MapActivity, that shows map using osmdroid (Open Street Map for Android library).
When I'm in this MapActivity and I go to another activity, I get always an exception, and I cannot understand how to avoid it, because I think that it is related to something done inside the library.
As you can see in the following log, it happen after destroying of MapActivity
05-18 17:34:31.117 27073-27073/com.fpricoco.etip I/﹕ Classe 'MapActivity' ---- 'onDestroy()' ---- Stato: Distrutta
05-18 17:34:31.157 27073-27073/com.fpricoco.etip E/ActivityThread﹕ Activity com.fpricoco.etip.Activities.MapActivity has leaked IntentReceiver org.osmdroid.tileprovider.modules.MapTileFileStorageProviderBase$MyBroadcastReceiver#43d85f60 that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Activity com.fpricoco.etip.Activities.MapActivity has leaked IntentReceiver org.osmdroid.tileprovider.modules.MapTileFileStorageProviderBase$MyBroadcastReceiver#43d85f60 that was originally registered here. Are you missing a call to unregisterReceiver()?
at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:792)
at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:593)
at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1151)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1138)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1132)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:365)
at org.osmdroid.tileprovider.util.SimpleRegisterReceiver.registerReceiver(SimpleRegisterReceiver.java:21)
at org.osmdroid.tileprovider.modules.MapTileFileStorageProviderBase.<init>(MapTileFileStorageProviderBase.java:34)
at org.osmdroid.tileprovider.modules.MapTileFileArchiveProvider.<init>(MapTileFileArchiveProvider.java:57)
at org.osmdroid.tileprovider.modules.MapTileFileArchiveProvider.<init>(MapTileFileArchiveProvider.java:76)
at org.osmdroid.tileprovider.MapTileProviderBasic.<init>(MapTileProviderBasic.java:63)
at org.osmdroid.tileprovider.MapTileProviderBasic.<init>(MapTileProviderBasic.java:41)
at org.osmdroid.tileprovider.MapTileProviderBasic.<init>(MapTileProviderBasic.java:34)
at org.osmdroid.views.overlay.MinimapOverlay.<init>(MinimapOverlay.java:114)
at com.fpricoco.etip.Activities.MapActivity.onCreate(MapActivity.java:303)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2034)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2095)
at android.app.ActivityThread.access$600(ActivityThread.java:137)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:4791)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
at dalvik.system.NativeStart.main(Native Method)
Searching on Google I found that I have to "unregisterReceiver(yourReceiver)", the point is that I don't have in my case any "yourReceiver" setted in my code, I think it is done inside library.
I also found this solution "https://groups.google.com/forum/#!topic/osmdroid/wDEvFpWfTIU" , but I don't understand how to detach
Finally I also tried in this way, but it didn't work:
// .. get custom tiles off the screen
myMapView.getOverlays().remove(mMinimapOverlay);
// .. release all custom tiles' bitmaps
myMapView.getTileProvider().clearTileCache();
// .. unregister intent receiver
myMapView.getTileProvider().detach();
The library I imported is:
compile 'org.osmdroid:osmdroid-android:5.1#aar'
inside my gradle.build file.
try this:
#Override
public void onDestroy() {
myMapView.onDetach();
myMapView.getTileProvider().clearTileCache();
}

intent can not putExtra object of type XMPPTCPConnection

I read this interesting post How to pass an object from one activity to another on Android and found that i should use putExtra to send object to other activities and to receive that using getIntent().getSerializableExtra("name") is necessary. but when i use putExtra it force me to cast the XMPPTCPConection object to (java.io.Serializable).
the java android code:
XMPPTCPConnection connection;
connection= xmppConnectio.getXMPPConnectio();
if(connection.equals(null))
Log.d("","is null");
else
Log.d("","is not null");
Intent intent= new Intent(this,chat.class);
intent.putExtra("connection", (java.io.Serializable) connection);
startActivity(intent);
but it throws exception
02-21 05:00:44.733 4672-4683/passargad.ehsan D/connected﹕ yes connected successfully :
02-21 05:00:44.733 4672-4672/passargad.ehsan D/﹕ is not null
02-21 05:00:44.733 4672-4672/passargad.ehsan D/AndroidRuntime﹕ Shutting down VM
02-21 05:00:44.733 4672-4672/passargad.ehsan W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x400205a0)
02-21 05:00:44.743 4672-4672/passargad.ehsan E/AndroidRuntime﹕ FATAL EXCEPTION: main
**java.lang.ClassCastException: org.jivesoftware.smack.tcp.XMPPTCPConnection**
at passargad.ehsan.MainActivity.triger(MainActivity.java:189)
at passargad.ehsan.XMPPConnectio$connectionXMPP.onProgressUpdate(XMPPConnectio.java:125)
at passargad.ehsan.XMPPConnectio$connectionXMPP.onProgressUpdate(XMPPConnectio.java:55)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:432) at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:150)
at android.app.ActivityThread.main(ActivityThread.java:4277)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
the interesting part of story is that it was ok for 3 times correct executing. but then it broke.
thank you in advance!
The fact that you had to cast to Serializable should have told you the issue right there. I looked up the JavaDoc for XMPPTCPConnection and indeed, it does not implement Serializable.
Your app is dying at the point where you are trying to cast to Serializable, because the class doesn't implement it. The post you referenced mentioned "letting the custom class implement Serializable", and because it was a custom class, the developer could make that change. With a library class, you don't have that option.
You'll need to come up with a strategy to manage the connection, maybe with some kind of static reference (look at using WeakReference to avoid leaking the connection). You'll also have to handle the situation when the Activity is recreated (i.e. device rotation) and be able to re-establish the connection if/when you lose the reference to it.
I'm curious what the best solution would be for managing a connection like this. I don't have direct experience, but perhaps you can peruse some Smack implementations on GitHub to see how other developers have dealt with this issue.

Android java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1

i've just recived this crash log but can't understand what its caused from. Basically my app is a text editor. I have a TextWatcher on the TextView but i'm not sure if its that the problem, since the logcat dosent contain any line of my app.
java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
at java.util.ArrayList.get(ArrayList.java:304)
at android.widget.TextView.sendOnTextChanged(TextView.java:7231)
at android.widget.TextView.handleTextChanged(TextView.java:7290)
at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:8880)
at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:962)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:496)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:435)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:30)
at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:672)
at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:435)
at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:333)
at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:77)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
I'm not sure if this can help someone else, but to fix this bug I've done this:
I have an EditText, with a TextWatcher.
The error is raised by this set:
editText.setText("");
To solve this I had to first remove the listener, set the text to the empty string, and then re-add the listener.
Hope it can help someone else as well.
seems this happens if you edit the attached state of a text watcher in the text watcher itself. e.g., i see this happen if i remove the textwatcher in a watcher method itself.
to verify, move the contents of onTextChanged to afterTextChanged, and see if the new stacktrace is triggered from TextView$ChangeWatcher.afterTextChanged instead.
to work around it, move that work to a handler posted from the method, or similar.
So late, but for anyone can be useful:
Check if your EditText has the textAllCaps="true" attribute and remove it if needed.

IllegalStateException: Fragment Already Added when resuming app

Overview:
I have a fragment-based app with a single activity. On launch, I add my main fragment and all works well. When I tap on something, I call replace() to swap out to the new fragment and add the transaction to the back stack.
Problem:
When the app dies in the background (or most easily repro'd with 'Don't Keep Activities'), and I relaunch the app from the home screen, I get the exception below.
Scenario:
1. Open app
2. Navigate to a secondary fragment (this problem doesn't occur if you never leave the main fragment)
3. Background the app
4. Let the app die naturally (~24hr), or enable 'Don't Keep Activites' in the Developer Options
5. Open app from home screen
Expected:
App opens to main fragment (regardless of what fragment was displayed when backgrounded)
Actual:
Crash below
Other Requirements:
- Background app and immediately tap from home screen must return to previous fragment (assuming it wasn't destroyed in the background).
Stack Trace (note absolutely no calls from my app itself, so nowhere for me to debug):
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rcg.socialstitch/com.rcg.socialstitch.ViewStitchActivity}: java.lang.IllegalStateException: Fragment already added: ViewStitchFragment{42800520 #1 id=0x7f040030}
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2227)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2276)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5146)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
at dalvik.system.NativeStart.main(NativeStart.java)
Caused by: java.lang.IllegalStateException: Fragment already added: ViewStitchFragment{42800520 #1 id=0x7f040030}
at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1133)
at android.app.BackStackRecord.run(BackStackRecord.java:618)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
at android.app.Activity.performStart(Activity.java:5320)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2190)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2276)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5146)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
at dalvik.system.NativeStart.main(NativeStart.java)
I believe I have solved this. My .replace() calls all added to the back stack, but my initial .add() did not. When I ensured my initial fragment addition was no the back stack, this no longer seems to happen.

How do I find this RuntimeException in Android (stack trace)?

I have this strack trace from the Developer Console on Google Play so I have no way to reproduce this exception cause I don't know what triggers it. The user also didn't leave any message, so...
java.lang.RuntimeException: Binary XML file line #17: You must supply a layout_height attribute.
at android.content.res.TypedArray.getLayoutDimension(TypedArray.java:491)
at android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:5319)
at android.view.ViewGroup$LayoutParams.<init>(ViewGroup.java:5271)
at android.widget.AbsListView$LayoutParams.<init>(AbsListView.java:6398)
at android.widget.AbsListView.generateLayoutParams(AbsListView.java:6035)
at android.widget.AbsListView.generateLayoutParams(AbsListView.java:96)
at android.view.LayoutInflater.inflate(LayoutInflater.java:477)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at com.android.internal.view.menu.ListMenuPresenter$MenuAdapter.getView(ListMenuPresenter.java:253)
at android.widget.AbsListView.obtainView(AbsListView.java:2212)
at android.widget.ListView.measureHeightOfChildren(ListView.java:1244)
at android.widget.ListView.onMeasure(ListView.java:1155)
at android.view.View.measure(View.java:12863)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2256)
at android.view.View.measure(View.java:12863)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1166)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2552)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4507)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
at dalvik.system.NativeStart.main(Native Method)
How do I pinpoint the problem?
This is Android's internal error, nothing in your code. You don't even see your app's code in stack trace, and your app works on many other devices.
I'm getting similar occasional crash reports, and also similar crashes on some Android versions (using ACRA). I've seen "You must supply a layout_height attribute" unexpected crash a few times.
If you use ACRA or similar, sometimes you just get reports for which your app is not responsible at all.
Message says - "You must supply a layout_height attribute."
So, double check that all your components have layout_height attribute.
I also had mention "menu" in this stack. It is generated by system. Double check that your all menus have valid items (at least not zero items) all the time.

Categories