最近发现客户端中android4.3上GS4手机上的WebApp应用特别容易crash。分析了源代码之后发现,在ActivityThread中回收内存时会调用EGLImpl里边去,回收RenderThread,进而调用到计算CPU FPS的逻辑,进而crash: java.lang.Error: signal 11 (Address not mapped to object) at address 0xbe59dff0 [at libPowerStretch.so:0x2d4c (_ZN11LucidConfig13calcTargetFPSEi+0x1b)] at system.lib.libPowerStretch_so.0x2d4c(LucidConfig::calcTargetFPS(int):0x1b:0) at system.lib.libPowerStretch_so.0x2f23(LucidConfig::isLucidActive(bool):0x86:0) 因为在问题出在系统层而android应用回收内存这个message是ActivityManager发出,为正....
异常的堆栈如下: java.lang.IllegalArgumentException: bad parameter at org.apache.http.client.utils.URLEncodedUtils.parse(URLEncodedUtils.java:139) at org.apache.http.client.utils.URLEncodedUtils.parse(URLEncodedUtils.java:76) at android.webkit.AccessibilityInjector.getAxsUrlParameterValue(AccessibilityInjector.java:412) at android.webkit.AccessibilityInjector.shouldInjectJavaScript(AccessibilityInjector.java:327) at android.webkit.AccessibilityInjector.onPageFinished(AccessibilityInjector.java:286) at a....
android在Java层对 utf 编码是支持得很好了,非常全面;但当你从事一些c/c++工程的开发时可就没有这么幸运了。 笔者最近在使用v8 javascript 引擎时便碰到了一个问题: 有些用户在昵称中使用了 emoji 表情,v8 引擎内部默认会使用utf-16编码,通过 v8 API 取到这个值之后转为utf-8的字符串,进而通过 JNI 的 API JNIEnv->NewStringUTF 往 Java 传递时会被系统的 checkJNI 给拦截住而报错。原因在为了让字符串中不包含任何 null 字节,JNI 以及 Java VM 内部都是使用的Modified UTF-8格式来编码字符串。 后来找到一个办法可以通过将字符串转为 utf-16 编码后传递给 JNI API JNIEnv->NewString 解决之: 使用 v8 API 将 utf-8 的字符串转为 utf-16 编码 size_t utf8_to_utf16(const char *src, const uint16_t **dest) { if (src == NULL || dest =....
由于容纳 RN view 的外围控件不确定,同时又要与其他view协调好尺寸和布局。 所以 RN 对 RootView(包含了一个模块的所有布局)的处理挺有技巧,RN 中有如下调用逻辑: ReactActivity.createRootView -> setContentView(mReactRootView) ReactRootView.onMeasure() ReactInstanceManagerImpl.attachMeasuredRootViewToInstance UIManagerModule.addMeasuredRootView 得到宽高: final int width; final int height; // If LayoutParams sets size explicitly, we can use that. Otherwise get the size from the view. if (rootView.getLayoutParams() != null && rootView.getLayoutParams().width ....
这属于android中最常见的TransactionTooLargeException的后果表现之一。 该问题较多出现在使用PackageManager查询系统的应用的信息,通过Intent来过滤匹配目标应用组件(android四大组件)时,典型堆栈如下: java.lang.RuntimeException: Package manager has died at android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.java:78) ...... Caused by: android.os.TransactionTooLargeException at android.os.BinderProxy.transact(Native Method) at android.content.pm.IPackageManager$Stub$Proxy.getPackageInfo(IPackageManager.java:1393) at android.app.ApplicationPa....
在开发包含c/c++本地代码的android项目中,通过gdb来调试代码是必不可少的前提。 android官方为此提供了ndk-gdb,看起来非常之nice。但个人在实践中发现还是有一系列问题需要记载下(ndk版本:r10e): ndk-build NDK_DEBUG=1这个选项编译时要加上,一般将之定制在你的c/c++ builder中 即便你按照1)做了,在项目根目录运行ndk-gdb的时候还是会报以下错误: ERROR: Package faywong.github.io.mediakit is not debuggable ! You can fix that in two ways: Rebuilt with the NDK_DEBUG=1 option when calling 'ndk-build'. Modify your manifest to set android:debuggable attribute to "true", then rebuild normally. After one of these, re-install to the device! ....
这台红米Note1W上会有系统资源(res/drawable/btn_check_holo_light.xml)找不到的问题。备忘下。 0x10800de java.lang.NullPointerException at android.graphics.drawable.DrawableContainer$DrawableContainerState.addChild(DrawableContainer.java:584) at android.graphics.drawable.StateListDrawable$StateListState.addStateSet(StateListDrawable.java:291) at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:189) at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:937) at android.graphics.dra....
最近踩了一个坑,有个非全屏的dialog遮住我的WebApp容器时,WebApp容器中JS代码操纵dom对象显示文本(input框中)巨慢(俗话描述就是“软键盘中输入了字,但是上屏很慢”)。 debug了一天之后发现。在WebView的onPause方法调用后,其内部JS引擎执行JS代码会慢好几倍。所以是否需要跟随Activity的生命周期调用onPause方法需要根据应用场景来区分: 若是应用中严格依赖JS做一些比较紧要的事情,则不应该onPause WebView。否则应该onPause WebView以释放一部分系统资源。
mView是我们期望有动画效果的目标View FrameLayout.LayoutParams mParams = ... // 我们的目标 layout params if (mTransitionTime > 0) { ValueAnimator widthAnim = ValueAnimator.ofInt(0, mParams.width); // 从0变化到期望的宽度 widthAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { // 在回调里我们踩着节拍来修改 view 的 layout params int val = (Integer) valueAnimator.getAnimatedValue(); mParams.width = val; if (mView != null) { mView.setLayoutParams(mParam....
在android的开发中,我们不时需要客观的测量和评估android应用程序的帧率。这篇文章我打算分享下这几天我在这方面的尝试: 1) fps meter 这个软件是我使用最早的,但是对手机的要求很高。第一是root,root完毕也不是每个手机上都能很好的工作。现在小米的MIUI对于root这件事是越来越不大方了,所以也更加添加了使用的难度。 root成本高昂,root完毕仍然不一定适用于所有的手机。所以只能忽略之。 dumpsys dumpsys是android系统提供的用于dump系统服务的状态信息的命令行工具。 给它提供gfxinfo参数时,它能在Logcat输出中给出UI相关的性能数据。但是M以前版本的android自带的dumpsys工具只能给出120帧的时序信息。且需要手动合并时间值。 例如systemui模块的UI方面的信息如下: ** Graphics info for pid 1269 [com.android.systemui] ** Recent DisplayList operations DrawRenderNode DrawRenderNode DrawRe....
在Java中经常会遇到通过外部语言扩展Java本身的需要,此时就需要使用到JNI这门技术(规范)。 在c/c++中,java层的数据类型需要转化成类型签名,如在google中被收录在最前边的官方文档中Table 3-2所示。 问题来了,那么void类型在c/c++用什么来映射呢。这份表格里边是没有的(对应java 7的JNI规范里边也没有)。今天在其他文档里边间接查到void类型的类型签名是V: Type Chararacter boolean Z byte B char C double D float F int I long J object L short S void V array [ 比如Java方法: public static void jsDebugDetachCallback(long udata) 的类型签名为(其中返回值类型V不可省略): "(J)V" 在c中获取该方法id的方式为: jsDebugDetachCallbackMethod = (*env)->GetStaticMethodID(env, someClz, "jsDebugDetac....