这篇文章将通过场景分析的方式讲解一些git的实用技巧。这些技巧的使用频率或许不是很高,但真正需要用到的时候,你可能会感慨相见恨晚。
阅读全文
做Android开发时,有时出于对程序运行效率或者跨平台的考虑,会使用NDK创建so
共享库。由于共享库是用C
以及jni
进行开发,所以发生在底层共享库中的crash会比发生在Java
层的crash更难抓取。这篇文章将介绍一下如何抓取共享库中的crash以及背后涉及的一些编译和链接的知识点。
阅读全文
在Android的世界里,我们可以通过WindowManager
将一个视图添加到屏幕上。下面就是实现此需求的两条关键语句:
WindowManager wm = (WindowManager) contex.getSystemService(Context.WINDOW_SERVICE);
...
wm.addView(view, layoutParam);
这篇文章将以这两条语句作为切入点,探究一下与WindowManager
相关的源码(基于5.1.1系统)。
阅读全文
最近触宝电话的crash日志中出现了如下较多的一个crash:
java.lang.SecurityException: Unable to find app for caller android.app.ApplicationThreadProxy@xxxxxxxx (pid=xxxx) when getting content provider XXXXXX
at android.os.Parcel.readException(Parcel.java:1472)
at android.os.Parcel.readException(Parcel.java:1426)
at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2865)
at android.app.ActivityThread.acquireProvider(ActivityThread.java:4445)
at android.app.ContextImpl$ApplicationContentResolver.acquireProvider(ContextImpl.java:2221)
at android.content.ContentResolver.acquireProvider(ContentResolver.java:1409)
at android.provider.Settings$NameValueCache.lazyGetProvider(Settings.java:890)
at android.provider.Settings$NameValueCache.getStringForUser(Settings.java:937)
at android.provider.Settings$System.getStringForUser(Settings.java:1142)
at android.provider.Settings$System.getIntForUser(Settings.java:1212)
at android.provider.Settings$System.getInt(Settings.java:1207)
at android.media.AudioManager.querySoundEffectsEnabled(AudioManager.java:1859)
at android.media.AudioManager.playSoundEffect(AudioManager.java:1811)
at android.view.ViewRootImpl.playSoundEffect(ViewRootImpl.java:5164)
at android.view.View.playSoundEffect(View.java:16954)
at android.view.View.performClick(View.java:4443)
at android.view.View$PerformClick.run(View.java:18457)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5049)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
at dalvik.system.NativeStart.main(Native Method)
阅读全文
Android中的ContentProvider实现了对数据存储的封装,通过query、update、insert、delete等接口对外提供数据的查询和增删改等操作。假设现在有一个app实现了一个ContentProvider,
那么当其他线程或进程通过ContentResolver请求此ContentProvider进行数据操作时,ContentProvider中响应请求的代码会运行在哪个线程中呢?可以分两种情况来回答这个问题。
阅读全文