WalkerXu

WalkerXu 查看完整档案

珠海编辑  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

WalkerXu 发布了文章 · 2019-02-24

为什么要做短视频秒播优化

最近在整理资料,翻到之前项目答辩ppt,盘了一下。

幸好有个记录,有时候一个事做完后就埋在记忆深处“忘得差不多了”。

记录和复盘是个好习惯,好处多多:

1.初衷,事情多了,你就忘了做这件事的初衷是啥,复盘可以帮助你回忆初心。
2.总结好的经验和思路。
3.也可能会发现当时察觉不到的局限或缺陷,进行修补或重构,得到进一步完善。

clipboard.png
clipboard.png
clipboard.png
clipboard.png
clipboard.png
clipboard.png
clipboard.png
clipboard.png
clipboard.png
clipboard.png
clipboard.png
clipboard.png
clipboard.png
clipboard.png

查看原文

赞 1 收藏 0 评论 0

WalkerXu 发布了文章 · 2019-02-22

来,膜拜下android roadmap,强大的执行力

最近整理资料,发现了这张图roadmap
看看都实现了吗
膜拜一下吧

clipboard.png

查看原文

赞 0 收藏 0 评论 0

WalkerXu 发布了文章 · 2019-02-22

线程很闲,cpu很忙

前两天跟一个同学讨论他的一个线程设计问题。
这个线程设计大概是这样的:“如果一段时间内没有工作,比如20秒内没有请求,才让线程进入idle状态(wait),其它时候线程处于活跃状态”。
这样设计是有问题的。
因为在这个情况里线程在工作状态的时候也不是100%满负荷的,而是间隙性的处理一个一个工作,所以在线程处理一个工作后就应该让他进入wait状态,下一个工作来了再进入活跃状态,而不是让线程处于一段活跃时间。
否则会造成线程空跑,占有cpu过高,带来性能和功耗问题。在多核cpu上也是一样,会占住某个核心。
这样的情况用top -H -m 10就可以看到这个线程一直处在前边。
这里涉及到操作系统一些知识,非cs等相关专业出身的同学一开始从事开发工作可能会遇到,尤其是做一些比较底层的原始设计的时候,上层的开发高级语言或者平台sdk会提供一些相关机制比如handler,looperthread等等,这些也是很好的学习范例在做原始设计的时候。

画了个图说明讲解。
做线程不要太自私,占住所有cpu时间,cpu很忙它要照顾多个线程。

clipboard.png

查看原文

赞 0 收藏 0 评论 0

WalkerXu 发布了文章 · 2019-02-22

android app内置webview,随android版本升级进程关系的变化

Q

最近遇到一个问题:多个应用打不开,闪退。

A

调查发现闪退的应用都在首屏加载了webview,而在android p上webview的渲染是在另外一个进程上进行的,进程名字类似webview:sandboxed_process0,这个进程是由webview_zygote这样一个进程fork出来的,而webview_zygote由于缺少权限runtime崩溃,从而导致webview加载失败,应用闪退。

S

增加相应权限
webview_zygote.te
allow webview_zygote ion_device:chr_file r_file_perms;

简单调查了下加载webview的应用,随android版本升级进程关系的变化

1.在android o以前

webview运行在app进程里

2.android o

webview运行在单独的进程里com.android.webview:sandboxed_process(n)
webview进程是由webview_zygote进程fork出来的
而webview_zygote进程是由1号进程init进程forkc出来的
能看出不管应用进程运行时是32bit还是64bit,wevview进程的运行时应该是32bit,因为webview_zygote是32bit的,它只能fork 32bit进程出来,生不出别的孩子
可以看到32bit,64bit运行时应用的祖宗zygote和zygote64也是init进程fork出来的
USER PID PPID VSZ RSS WCHAN ADDR S NAME
root 1 0 60588 1576 0 0 S init
root 983 1 4287904 19896 0 0 S zygote64
root 984 1 1618076 18836 0 0 S zygote
webview_zygote 1943 1 1396420 11180 0 0 S webview_zygote32
u0_i188 3756 1943 1474636 20108 0 0 S com.android.webview:sandboxe
u0_i185 29184 1943 1474636 18096 0 0 S com.android.webview:sandboxe

3.android p总体上和android o一样,但是有些区别

webview运行在单独的进程里com.android.webview:sandboxed_process(n)
webview进程是由webview_zygote进程fork出来的
这里稍有不同webview_zygote进程是由zygote fork出来的,当然它也只能是32bit的运行时,它儿子孙子都是
USER PID PPID VSZ RSS WCHAN ADDR S NAME
root 1 0 60588 1576 0 0 S init
root 572 1 4316640 133916 poll_schedule_timeout 0 S zygote64
root 573 1 1628984 120228 poll_schedule_timeout 0 S zygote
webview_zygote 2003 573 1631044 58384 poll_schedule_timeout 0 S webview_zygote
u0_i1 6247 2003 1181360 18528 ep_poll 0 S com.android.webview:sandboxed_process0

4.不但如此android o和android p编译链接关系上有不同

zygote,webview_zygote编译链接关系发生了变化,链接了不同的库

问题错误栈

I WebViewFactory: Loading com.android.webview version 66.0.3359.158 (code 336015855)
W cr_ChildProcLH: Create a new ChildConnectionAllocator with package name = com.android.webview, sandboxed = true
W libprocessgroup: kill(-4305, 9) failed: No such process
I libprocessgroup: Successfully killed process cgroup uid 10064 pid 4305 in 95ms
I cr_BrowserStartup: Initializing chromium process, singleProcess=false
I cr_base : Android Locale: en_US requires .pak files: []
E webview_zygote: Unable to restat fd 28: Permission denied
F webview_zygote: jni_internal.cc:616] JNI FatalError called: (com.android.webview:sandboxed_process0) Unable to stat 28
W webview_zygote: type=1400 audit(0.0:27): avc: denied { getattr } for path="/dev/ion" dev="tmpfs" ino=12718 scontext=u:r:webview_zygote:s0 tcontext=u:object_r:ion_device:s0 tclass=chr_file permissive=0
W webview_zygote: type=1400 audit(0.0:28): avc: denied { getattr } for path="/dev/ion" dev="tmpfs" ino=12718 scontext=u:r:webview_zygote:s0 tcontext=u:object_r:ion_device:s0 tclass=chr_file permissive=0
W webview_zygote: type=1400 audit(0.0:29): avc: denied { read } for name="app_process32" dev="mmcblk0p25" ino=467 scontext=u:r:webview_zygote:s0 tcontext=u:object_r:zygote_exec:s0 tclass=file permissive=0
F webview_zygote: runtime.cc:558] Runtime aborting...
F webview_zygote: runtime.cc:558] Dumping all threads without appropriate locks held: thread list lock mutator lock
F webview_zygote: runtime.cc:558] All threads:
F webview_zygote: runtime.cc:558] DALVIK THREADS (1):
F webview_zygote: runtime.cc:558] "main" prio=5 tid=1 Runnable
F webview_zygote: runtime.cc:558] | group="" sCount=0 dsCount=0 flags=0 obj=0x74d7cf48 self=0xf2f73000
F webview_zygote: runtime.cc:558] | sysTid=2332 nice=0 cgrp=default sched=0/0 handle=0xf6b54494
F webview_zygote: runtime.cc:558] | state=R schedstat=( 80557599 15727867 94 ) utm=5 stm=3 core=5 HZ=100
F webview_zygote: runtime.cc:558] | stack=0xff72b000-0xff72d000 stackSize=8MB
F webview_zygote: runtime.cc:558] | held mutexes= "abort lock" "mutator lock"(shared held)
F webview_zygote: runtime.cc:558] native: #00 pc 002d975f /system/lib/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, int, BacktraceMap, char const, art::ArtMethod, void, bool)+134)
F webview_zygote: runtime.cc:558] native: #01 pc 0036e98b /system/lib/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool, BacktraceMap*, bool) const+210)
F webview_zygote: runtime.cc:558] native: #02 pc 0036b143 /system/lib/libart.so (art::Thread::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool, BacktraceMap*, bool) const+34)
F webview_zygote: runtime.cc:558] native: #03 pc 00383df9 /system/lib/libart.so (art::DumpCheckpoint::Run(art::Thread*)+624)
F webview_zygote: runtime.cc:558] native: #04 pc 0037e0df /system/lib/libart.so (art::ThreadList::RunCheckpoint(art::Closure, art::Closure)+314)
F webview_zygote: runtime.cc:558] native: #05 pc 0037d7d7 /system/lib/libart.so (art::ThreadList::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool)+758)
F webview_zygote: runtime.cc:558] native: #06 pc 0034d8fb /system/lib/libart.so (art::Runtime::Abort(char const*)+314)
F webview_zygote: runtime.cc:558] native: #07 pc 000071b3 /system/lib/libbase.so (android::base::LogMessage::~LogMessage()+494)
F webview_zygote: runtime.cc:558] native: #08 pc 00265a0f /system/lib/libart.so (art::JNI::FatalError(_JNIEnv, char const)+122)
F webview_zygote: runtime.cc:558] native: #09 pc 0010b4d5 /system/lib/libandroid_runtime.so (_ZZN12_GLOBAL__N_123ForkAndSpecializeCommonEP7_JNIEnvjjP10_jintArrayiP13_jobjectArrayxxiP8_jstringS7_bS3_S3_bS7_S7_ENK3$_0clERKNSt3__112basic_stringIcNS9_11char_traitsIcEENS9_9allocatorIcEEEE+92)
F webview_zygote: runtime.cc:558] native: #10 pc 0010b28f /system/lib/libandroid_runtime.so ((anonymous namespace)::ForkAndSpecializeCommon(_JNIEnv, unsigned int, unsigned int, _jintArray, int, _jobjectArray, long long, long long, int, _jstring, _jstring, bool, _jintArray, _jintArray, bool, _jstring, _jstring*)+4958)
F webview_zygote: runtime.cc:558] native: #11 pc 001097f1 /system/lib/libandroid_runtime.so (android::com_android_internal_os_Zygote_nativeForkAndSpecialize(_JNIEnv, _jclass, int, int, _jintArray, int, _jobjectArray, int, _jstring, _jstring, _jintArray, _jintArray, unsigned char, _jstring, _jstring)+476)
F webview_zygote: runtime.cc:558] at com.android.internal.os.Zygote.nativeForkAndSpecialize(Native method)
W VideoCapabilities: Unrecognized profile/level 0/3 for video/mpeg2
F webview_zygote: runtime.cc:558] at com.android.internal.os.Zygote.forkAndSpecialize(Zygote.java:139)
F webview_zygote: runtime.cc:558] at com.android.internal.os.ZygoteConnection.processOneCommand(ZygoteConnection.java:234)
E chromium: [ERROR:devtools_http_handler.cc(292)] Cannot start http server for devtools. Stop devtools.
F webview_zygote: runtime.cc:558] at com.android.internal.os.ZygoteServer.runSelectLoop(ZygoteServer.java:204)
F webview_zygote: runtime.cc:558] at com.android.internal.os.WebViewZygoteInit.main(WebViewZygoteInit.java:160)
F webview_zygote: runtime.cc:558] at java.lang.reflect.Method.invoke(Native method)
F webview_zygote: runtime.cc:558] at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
D AutofillManagerServiceImpl: Reset component for user 0 ()
F webview_zygote: runtime.cc:558] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
F webview_zygote: runtime.cc:558]
F webview_zygote: runtime.cc:558] Aborting thread:
F webview_zygote: runtime.cc:558] "main" prio=5 tid=1 Native
F webview_zygote: runtime.cc:558] | group="" sCount=0 dsCount=0 flags=0 obj=0x74d7cf48 self=0xf2f73000
F webview_zygote: runtime.cc:558] | sysTid=2332 nice=0 cgrp=default sched=0/0 handle=0xf6b54494
F webview_zygote: runtime.cc:558] | state=R schedstat=( 102025203 15767659 98 ) utm=7 stm=3 core=6 HZ=100
F webview_zygote: runtime.cc:558] | stack=0xff72b000-0xff72d000 stackSize=8MB
F webview_zygote: runtime.cc:558] | held mutexes= "abort lock"
F webview_zygote: runtime.cc:558] native: #00 pc 002d975f /system/lib/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, int, BacktraceMap, char const, art::ArtMethod, void, bool)+134)
F webview_zygote: runtime.cc:558] native: #01 pc 0036e98b /system/lib/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool,BacktraceMap*, bool) const+210)
F webview_zygote: runtime.cc:558] native: #02 pc 0036b143 /system/lib/libart.so (art::Thread::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool, BacktraceMap*, bool) const+34)
F webview_zygote: runtime.cc:558] native: #03 pc 003598b3 /system/lib/libart.so (art::AbortState::DumpThread(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, art::Thread*) const+30)
F webview_zygote: runtime.cc:558] native: #04 pc 0034d953 /system/lib/libart.so (art::Runtime::Abort(char const*)+402)
F webview_zygote: runtime.cc:558] native: #05 pc 000071b3 /system/lib/libbase.so (android::base::LogMessage::~LogMessage()+494)
F webview_zygote: runtime.cc:558] native: #06 pc 00265a0f /system/lib/libart.so (art::JNI::FatalError(_JNIEnv, char const)+122)
F webview_zygote: runtime.cc:558] native: #07 pc 0010b4d5 /system/lib/libandroid_runtime.so (_ZZN12_GLOBAL__N_123ForkAndSpecializeCommonEP7_JNIEnvjjP10_jintArrayiP13_jobjectArrayxxiP8_jstringS7_bS3_S3_bS7_S7_ENK3$_0clERKNSt3__112basic_stringIcNS9_11char_traitsIcEENS9_9allocatorIcEEEE+92)
F webview_zygote: runtime.cc:558] native: #08 pc 0010b28f /system/lib/libandroid_runtime.so ((anonymous namespace)::ForkAndSpecializeCommon(_JNIEnv, unsigned int, unsigned int, _jintArray, int, _jobjectArray, long long, long long, int, _jstring, _jstring, bool, _jintArray, _jintArray, bool, _jstring, _jstring*)+4958)
F webview_zygote: runtime.cc:558] native: #09 pc 001097f1 /system/lib/libandroid_runtime.so (android::com_android_internal_os_Zygote_nativeForkAndSpecialize(_JNIEnv, _jclass, int, int, _jintArray, int, _jobjectArray, int, _jstring, _jstring, _jintArray, _jintArray, unsigned char, _jstring, _jstring)+476)
F webview_zygote: runtime.cc:558] native: #10 pc 003cb633 /system/framework/arm/boot-framework.oat (offset 3ab000) (com.android.internal.os.Zygote.nativeForkAndSpecialize+338)
F webview_zygote: runtime.cc:558] native: #11 pc 00a0ba7f /system/framework/arm/boot-framework.oat (offset 3ab000) (com.android.internal.os.Zygote.forkAndSpecialize+198)
F webview_zygote: runtime.cc:558] native: #12 pc 00a0eb0d /system/framework/arm/boot-framework.oat (offset 3ab000) (com.android.internal.os.ZygoteConnection.processOneCommand+1388)
F webview_zygote: runtime.cc:558] native: #13 pc 00a13675 /system/framework/arm/boot-framework.oat (offset 3ab000) (com.android.internal.os.ZygoteServer.runSelectLoop+780)
F webview_zygote: runtime.cc:558] native: #14 pc 0040d575 /system/lib/libart.so (art_quick_invoke_stub_internal+68)
F webview_zygote: runtime.cc:558] native: #15 pc 003e6b79 /system/lib/libart.so (art_quick_invoke_stub+224)
F webview_zygote: runtime.cc:558] native: #16 pc 000a1015 /system/lib/libart.so (art::ArtMethod::Invoke(art::Thread, unsigned int, unsigned int, art::JValue, char const)+136)
F webview_zygote: runtime.cc:558] native: #17 pc 001e5ae9 /system/lib/libart.so (art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread, art::ArtMethod, art::ShadowFrame, unsigned short, art::JValue)+236)
F webview_zygote: runtime.cc:558] native: #18 pc 001e05d7 /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod, art::Thread, art::ShadowFrame&, art::Instruction const, unsigned short, art::JValue)+814)
F webview_zygote: runtime.cc:558] native: #19 pc 003e3c1d /system/lib/libart.so (MterpInvokeVirtualQuick+428)
F webview_zygote: runtime.cc:558] native: #20 pc 00404094 /system/lib/libart.so (ExecuteMterpImpl+29972)
F webview_zygote: runtime.cc:558] native: #21 pc 00dc4ff8 /system/framework/boot-framework.vdex (com.android.internal.os.WebViewZygoteInit.main+198)
F webview_zygote: runtime.cc:558] native: #22 pc 001c4d53 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.2471763592+378)
F webview_zygote: runtime.cc:558] native: #23 pc 001c937f /system/lib/libart.so (art::interpreter::EnterInterpreterFromEntryPoint(art::Thread, art::CodeItemDataAccessor const&, art::ShadowFrame)+82)
F webview_zygote: runtime.cc:558] native: #24 pc 003d52b9 /system/lib/libart.so (artQuickToInterpreterBridge+880)
F webview_zygote: runtime.cc:558] native: #25 pc 00411aff /system/lib/libart.so (art_quick_to_interpreter_bridge+30)
I WifiService: acquireMulticastLock uid=10087
F webview_zygote: runtime.cc:558] native: #26 pc 0040d575 /system/lib/libart.so (art_quick_invoke_stub_internal+68)
F webview_zygote: runtime.cc:558] native: #27 pc 003e6c7b /system/lib/libart.so (art_quick_invoke_static_stub+222)
F webview_zygote: runtime.cc:558] native: #28 pc 000a1027 /system/lib/libart.so (art::ArtMethod::Invoke(art::Thread, unsigned int, unsigned int, art::JValue, char const)+154)
F webview_zygote: runtime.cc:558] native: #29 pc 00347ac5 /system/lib/libart.so (art::(anonymous namespace)::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable const&, art::ArtMethod, art::(anonymous namespace)::ArgArray, art::JValue, char const)+52)
F webview_zygote: runtime.cc:558] native: #30 pc 00348f15 /system/lib/libart.so (art::InvokeMethod(art::ScopedObjectAccessAlreadyRunnable const&, _jobject, _jobject, _jobject*, unsigned int)+1024)
F webview_zygote: runtime.cc:558] native: #31 pc 002fb0c5 /system/lib/libart.so (art::Method_invoke(_JNIEnv, _jobject, _jobject, _jobjectArray)+40)
F webview_zygote: runtime.cc:558] native: #32 pc 0011226f /system/framework/arm/boot.oat (offset 10c000) (java.lang.Class.getDeclaredMethodInternal [DEDUPED]+110)
W ctxmgr : [PendingIntentCompat]Timed out delivering to pendingIntent=PendingIntent{8dc1703: android.os.BinderProxy@4c24eee}, intent=Intent { (has extras) }, permission=null
F webview_zygote: runtime.cc:558] native: #33 pc 00a0a95b /system/framework/arm/boot-framework.oat (offset 3ab000) (com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run+114)
F webview_zygote: runtime.cc:558] native: #34 pc 00a10845 /system/framework/arm/boot-framework.oat (offset 3ab000) (com.android.internal.os.ZygoteInit.main+2836)
F webview_zygote: runtime.cc:558] native: #35 pc 0040d575 /system/lib/libart.so (art_quick_invoke_stub_internal+68)
F webview_zygote: runtime.cc:558] native: #36 pc 003e6c7b /system/lib/libart.so (art_quick_invoke_static_stub+222)
F webview_zygote: runtime.cc:558] native: #37 pc 000a1027 /system/lib/libart.so (art::ArtMethod::Invoke(art::Thread, unsigned int, unsigned int, art::JValue, char const)+154)
F webview_zygote: runtime.cc:558] native: #38 pc 00347ac5 /system/lib/libart.so (art::(anonymous namespace)::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable const&, art::ArtMethod, art::(anonymous namespace)::ArgArray, art::JValue, char const)+52)
F webview_zygote: runtime.cc:558] native: #39 pc 003478ef /system/lib/libart.so (art::InvokeWithVarArgs(art::ScopedObjectAccessAlreadyRunnable const&, _jobject, _jmethodID, std::__va_list)+310)
F webview_zygote: runtime.cc:558] native: #40 pc 0028eb11 /system/lib/libart.so (art::JNI::CallStaticVoidMethodV(_JNIEnv, _jclass, _jmethodID*, std::__va_list)+444)
F webview_zygote: runtime.cc:558] native: #41 pc 0006c99b /system/lib/libandroid_runtime.so (_JNIEnv::CallStaticVoidMethod(_jclass, _jmethodID, ...)+30)
F webview_zygote: runtime.cc:558] native: #42 pc 0006ebf3 /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, android::Vector<android::String8>

F webview_zygote: runtime.cc:558] native: #43 pc 00001989 /system/bin/app_process32 (???)
F webview_zygote: runtime.cc:558] native: #44 pc 0008b89d /system/lib/libc.so (__libc_init+48)
F webview_zygote: runtime.cc:558] native: #45 pc 0000166f /system/bin/app_process32 (???)
F webview_zygote: runtime.cc:558] native: #46 pc 00000306 <anonymous:f6b51000> (???)
F webview_zygote: runtime.cc:558] at com.android.internal.os.Zygote.nativeForkAndSpecialize(Native method)
F webview_zygote: runtime.cc:558] at com.android.internal.os.Zygote.forkAndSpecialize(Zygote.java:139)
F webview_zygote: runtime.cc:558] at com.android.internal.os.ZygoteConnection.processOneCommand(ZygoteConnection.java:234)
F webview_zygote: runtime.cc:558] at com.android.internal.os.ZygoteServer.runSelectLoop(ZygoteServer.java:204)
F webview_zygote: runtime.cc:558] at com.android.internal.os.WebViewZygoteInit.main(WebViewZygoteInit.java:160)
F webview_zygote: runtime.cc:558] at java.lang.reflect.Method.invoke(Native method)
F webview_zygote: runtime.cc:558] at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
F webview_zygote: runtime.cc:558] at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
F webview_zygote: runtime.cc:558]
E libc : failed to connect to tombstoned: Permission denied
W webview_zygote: type=1400 audit(0.0:30): avc: denied { write } for name="tombstoned_crash" dev="tmpfs" ino=16442 scontext=u:r:webview_zygote:s0 tcontext=u:object_r:tombstoned_crash_socket:s0 tclass=sock_file permissive=0

F DEBUG :
F DEBUG : ABI: 'arm'
F DEBUG : pid: 2332, tid: 2332, name: webview_zygote >>> webview_zygote <<<
F DEBUG : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
F DEBUG : Abort message: 'jni_internal.cc:616] JNI FatalError called: (com.android.webview:sandboxed_process0) Unable to stat 28'
F DEBUG : r0 00000000 r1 0000091c r2 00000006 r3 00000008
F DEBUG : r4 0000091c r5 0000091c r6 fff24e2c r7 0000010c
F DEBUG : r8 0000000d r9 f2f1c720 r10 fff24f80 r11 f2e2763e
F DEBUG : ip fff24dc8 sp fff24e18 lr f502cdd9 pc f5024c7a
D Fabric : Using AdvertisingInfo from Preference Store
I Gecko : 1538430036192 addons.xpi WARN List of valid built-in add-ons could not be parsed.: [Exception... "Component returned failure code: 0x80520001 (NS_ERROR_FILE_UNRECOGNIZED_PATH) [nsIXPCComponents_Utils.readUTF8URI]" nsresult: "0x80520001 (NS_ERROR_FILE_UNRECOGNIZED_PATH)" location: "JS frame :: resource://gre/modules/addons/XPIProvider.jsm :: startup :: line 197" data: no] Stack trace: startup()@resource://gre/modules/addons/XPIProvider.jsm:197
W webview_zygote: type=1400 audit(0.0:31): avc: denied { read } for name="app_process32" dev="mmcblk0p25" ino=467 scontext=u:r:webview_zygote:s0 tcontext=u:object_r:zygote_exec:s0 tclass=file permissive=0
I unwind : Malformed section header found, ignoring...
F DEBUG :
F DEBUG : backtrace:
F DEBUG : #00 pc 0001cc7a /system/lib/libc.so (abort+58)
F DEBUG : #01 pc 0034db4f /system/lib/libart.so (art::Runtime::Abort(char const*)+910)
F DEBUG : #02 pc 000071b3 /system/lib/libbase.so (android::base::LogMessage::~LogMessage()+494)
F DEBUG : #03 pc 00265a0f /system/lib/libart.so (art::JNI::FatalError(_JNIEnv, char const)+122)
F DEBUG : #04 pc 0010b4d5 /system/lib/libandroid_runtime.so (_ZZN12_GLOBAL__N_123ForkAndSpecializeCommonEP7_JNIEnvjjP10_jintArrayiP13_jobjectArrayxxiP8_jstringS7_bS3_S3_bS7_S7_ENK3$_0clERKNSt3__112basic_stringIcNS9_11char_traitsIcEENS9_9allocatorIcEEEE+92)
F DEBUG : #05 pc 0010b28f /system/lib/libandroid_runtime.so ((anonymous namespace)::ForkAndSpecializeCommon(_JNIEnv, unsigned int, unsigned int, _jintArray, int, _jobjectArray, long long, long long, int, _jstring, _jstring, bool, _jintArray, _jintArray, bool, _jstring, _jstring*)+4958)
F DEBUG : #06 pc 001097f1 /system/lib/libandroid_runtime.so (android::com_android_internal_os_Zygote_nativeForkAndSpecialize(_JNIEnv, _jclass, int, int, _jintArray, int, _jobjectArray, int, _jstring, _jstring, _jintArray, _jintArray, unsigned char, _jstring, _jstring)+476)
F DEBUG : #07 pc 003cb633 /system/framework/arm/boot-framework.oat (offset 0x3ab000) (com.android.internal.os.Zygote.nativeForkAndSpecialize+338)
F DEBUG : #08 pc 00a0ba7f /system/framework/arm/boot-framework.oat (offset 0x3ab000) (com.android.internal.os.Zygote.forkAndSpecialize+198)
F DEBUG : #09 pc 00a0eb0d /system/framework/arm/boot-framework.oat (offset 0x3ab000) (com.android.internal.os.ZygoteConnection.processOneCommand+1388)
F DEBUG : #10 pc 00a13675 /system/framework/arm/boot-framework.oat (offset 0x3ab000) (com.android.internal.os.ZygoteServer.runSelectLoop+780)
F DEBUG : #11 pc 0040d575 /system/lib/libart.so (art_quick_invoke_stub_internal+68)
F DEBUG : #12 pc 003e6b79 /system/lib/libart.so (art_quick_invoke_stub+224)
F DEBUG : #13 pc 000a1015 /system/lib/libart.so (art::ArtMethod::Invoke(art::Thread, unsigned int, unsigned int, art::JValue, char const)+136)
F DEBUG : #14 pc 001e5ae9 /system/lib/libart.so (art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread, art::ArtMethod, art::ShadowFrame, unsigned short, art::JValue)+236)
F DEBUG : #15 pc 001e05d7 /system/lib/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod, art::Thread, art::ShadowFrame&, art::Instruction const, unsigned short, art::JValue)+814)
F DEBUG : #16 pc 003e3c1d /system/lib/libart.so (MterpInvokeVirtualQuick+428)
F DEBUG : #17 pc 00404094 /system/lib/libart.so (ExecuteMterpImpl+29972)
F DEBUG : #18 pc 00dc4ff8 /system/framework/boot-framework.vdex (com.android.internal.os.WebViewZygoteInit.main+198)
F DEBUG : #19 pc 001c4d53 /system/lib/libart.so (_ZN3art11interpreterL7ExecuteEPNS_6ThreadERKNS_20CodeItemDataAccessorERNS_11ShadowFrameENS_6JValueEb.llvm.2471763592+378)
F DEBUG : #20 pc 001c937f /system/lib/libart.so (art::interpreter::EnterInterpreterFromEntryPoint(art::Thread, art::CodeItemDataAccessor const&, art::ShadowFrame)+82)
F DEBUG : #21 pc 003d52b9 /system/lib/libart.so (artQuickToInterpreterBridge+880)
F DEBUG : #22 pc 00411aff /system/lib/libart.so (art_quick_to_interpreter_bridge+30)
F DEBUG : #23 pc 0040d575 /system/lib/libart.so (art_quick_invoke_stub_internal+68)
F DEBUG : #24 pc 003e6c7b /system/lib/libart.so (art_quick_invoke_static_stub+222)
F DEBUG : #25 pc 000a1027 /system/lib/libart.so (art::ArtMethod::Invoke(art::Thread, unsigned int, unsigned int, art::JValue, char const)+154)
F DEBUG : #26 pc 00347ac5 /system/lib/libart.so (art::(anonymous namespace)::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable const&, art::ArtMethod, art::(anonymous namespace)::ArgArray, art::JValue, char const)+52)
F DEBUG : #27 pc 00348f15 /system/lib/libart.so (art::InvokeMethod(art::ScopedObjectAccessAlreadyRunnable const&, _jobject, _jobject, _jobject*, unsigned int)+1024)
F DEBUG : #28 pc 002fb0c5 /system/lib/libart.so (art::Method_invoke(_JNIEnv, _jobject, _jobject, _jobjectArray)+40)
F DEBUG : #29 pc 0011226f /system/framework/arm/boot.oat (offset 0x10c000) (java.lang.Class.getDeclaredMethodInternal [DEDUPED]+110)
F DEBUG : #30 pc 00a0a95b /system/framework/arm/boot-framework.oat (offset 0x3ab000) (com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run+114)
F DEBUG : #31 pc 00a10845 /system/framework/arm/boot-framework.oat (offset 0x3ab000) (com.android.internal.os.ZygoteInit.main+2836)
F DEBUG : #32 pc 0040d575 /system/lib/libart.so (art_quick_invoke_stub_internal+68)
F DEBUG : #33 pc 003e6c7b /system/lib/libart.so (art_quick_invoke_static_stub+222)
F DEBUG : #34 pc 000a1027 /system/lib/libart.so (art::ArtMethod::Invoke(art::Thread, unsigned int, unsigned int, art::JValue, char const)+154)
F DEBUG : #35 pc 00347ac5 /system/lib/libart.so (art::(anonymous namespace)::InvokeWithArgArray(art::ScopedObjectAccessAlreadyRunnable const&, art::ArtMethod, art::(anonymous namespace)::ArgArray, art::JValue, char const)+52)
F DEBUG : #36 pc 003478ef /system/lib/libart.so (art::InvokeWithVarArgs(art::ScopedObjectAccessAlreadyRunnable const&, _jobject, _jmethodID, std::__va_list)+310)
F DEBUG : #37 pc 0028eb11 /system/lib/libart.so (art::JNI::CallStaticVoidMethodV(_JNIEnv, _jclass, _jmethodID*, std::__va_list)+444)
F DEBUG : #38 pc 0006c99b /system/lib/libandroid_runtime.so (_JNIEnv::CallStaticVoidMethod(_jclass, _jmethodID, ...)+30)
F DEBUG : #39 pc 0006ebf3 /system/lib/libandroid_runtime.so (android::AndroidRuntime::start(char const*, android::Vector<android::String8> const&, bool)+458)
F DEBUG : #40 pc 00001989 /system/bin/app_process32
F DEBUG : #41 pc 0008b89d /system/lib/libc.so (__libc_init+48)
F DEBUG : #42 pc 0000166f /system/bin/app_process32
F DEBUG : #43 pc 00000306 <anonymous:f6b51000>
W webview_zygote: type=1400 audit(0.0:32): avc: denied { read } for name="app_process32" dev="mmcblk0p25" ino=467 scontext=u:r:webview_zygote:s0 tcontext=u:object_r:zygote_exec:s0 tclass=file permissive=0
E ZygoteProcess: Starting VM process through Zygote failed
I Zygote : Process 2332 exited due to signal (6)
E ActivityManager: Failure starting process com.android.webview:sandboxed_process0
E ActivityManager: java.lang.RuntimeException: Starting VM process through Zygote failed
E ActivityManager: at android.os.ZygoteProcess.start(ZygoteProcess.java:239)
E ActivityManager: at android.os.Process.startWebView(Process.java:507)
E ActivityManager: at com.android.server.am.ActivityManagerService.startProcess(ActivityManagerService.java:4478)
E ActivityManager: at com.android.server.am.ActivityManagerService.lambda$startProcessLocked$0(ActivityManagerService.java:4432)
E ActivityManager: at com.android.server.am.-$$Lambda$ActivityManagerService$UgpguyCBuObHjnmry_xkrJGkFi0.run(Unknown Source:20)
E ActivityManager: at android.os.Handler.handleCallback(Handler.java:873)
E ActivityManager: at android.os.Handler.dispatchMessage(Handler.java:99)
E ActivityManager: at android.os.Looper.loop(Looper.java:193)
E ActivityManager: at android.os.HandlerThread.run(HandlerThread.java:65)
E ActivityManager: at com.android.server.ServiceThread.run(ServiceThread.java:44)
E ActivityManager: Caused by: android.os.ZygoteStartFailedEx: java.io.EOFException
E ActivityManager: at android.os.ZygoteProcess.zygoteSendArgsAndGetResult(ZygoteProcess.java:332)
E ActivityManager: at android.os.ZygoteProcess.startViaZygote(ZygoteProcess.java:438)
E ActivityManager: at android.os.ZygoteProcess.start(ZygoteProcess.java:232)
E ActivityManager: ... 9 more
E ActivityManager: Caused by: java.io.EOFException
E ActivityManager: at java.io.DataInputStream.readFully(DataInputStream.java:200)
E ActivityManager: at java.io.DataInputStream.readInt(DataInputStream.java:389)
E ActivityManager: at android.os.ZygoteProcess.zygoteSendArgsAndGetResult(ZygoteProcess.java:323)
E ActivityManager: ... 11 more
I ActivityManager: Force stopping com.google.android.gm appid=99000 user=0: start failure
I ActivityManager: Force finishing activity ActivityRecord{ad8615d u0 com.google.android.gm/.ConversationListActivityGmail t116}
E ActivityManager: Found activity ActivityRecord{ad8615d u0 com.google.android.gm/.ConversationListActivityGmail t116 f} in proc activity list using null instead of expected ProcessRecord{f4179d8 4833:com.google.android.gm/u0a49}

查看原文

赞 0 收藏 0 评论 0

WalkerXu 发布了文章 · 2019-02-15

【随笔】工程师都是性情中人

it行业工程师往往给人很木的感觉,实际上个个都是性情中人,心里藏着一团火。
从代码或工程命名可以看出很多工程师都是性情中人。
比如有拿地名做名字的,有拿吃的做名字的,有的给项目起的名字像外号等等。
拿android来说。
1.android的版本,cupcake, donut, froyo,以及让android名声大噪的2.3 Gingerbread, 里程碑4.0 Ice Cream Sandwich,kitkat,5.0是lollipop,以及后边的棉花糖,牛轧糖,oreo等,9.0是pie。明显都是吃货。可能就是因为这一天的免费零食是pie,而这一天正好项目立项,pie很好吃,代号就是pie了。
normandie播放框架的命名也是由于立项正好赶上二战胜利周年纪念,normandie登陆使二战欧洲战场态势发生了转变。
2.android里的播放器命名为awesome(牛b)player, nu(乐队走电子迷幻路线)player,基于alooper,ahanlder,amessage实现的线程,异步等机制很大程度上解决了框架api实现里的耗时操作比较容易引起的应用anr等问题比如访问网络或弱网络下请求播放数据等情况。
normandie播放框架参考了这套机制基于looper,handler,thread,event实现了自己的线程模型,在多核cpu上运行可以获得更高的效率,异步机制,为网络请求耗时比较容易引起anr做了大量优化,比如nuplayer没有的abort机制,可以随时中断请求线程避免在快速退出切换等场景下网络请求线程阻塞等等。
3.android里引入的开源openssl改名boring(无聊烦人)ssl。
normandie播放框架支持https的时候折腾过一段时间openssl内嵌到ffmpeg,版本兼容问题很麻烦,版本稍有变化就不兼容了,确实够boring的。

还有哪些欢迎跟帖。

查看原文

赞 0 收藏 0 评论 0

WalkerXu 评论了文章 · 2019-01-25

normandie出错重试与缓存机制对交互的影响,开发者注意

用户通过交互和产品对话,好的交互非常重要。
“错误提醒”在产品交互中也是非常重要的一部分,所以某些情况下app的错误提醒不能只依赖框架的回调。

如果错误提醒只依赖框架回调,在normandie中有一个设计会影响到错误提醒的交互。
这个机制在底层拉取数据某些指定报错后(不是普通的重试,普通重试是没有数据返回但不报错),且缓存中还有数据时,会去重试拉取数据,目的是防止网络非常不稳定的情况造成的播放断开。
如果重试拉取数据持续报错就会将错误报告附加在缓存数据的末尾,待缓存数据消耗到末尾,错误被上报。
这里的问题是,这个错误上报会有延迟,延迟的时间就是缓存数据播放的时间。

在一些场景下需要app干预提早报告。
比如同时开着wifi和4g,播放,然后断开wifi。
这种情况下,播放当时选择的数据链路是wifi(系统里wifi优先),虽然有4g alive但是播放仍然会断掉,但是因为框架的重试机制报错会延迟通知到用户。所以这里app要干预,监听到wifi断开,有所提示,并为用户做好在4g下重新发起播放的准备。

clipboard.png

查看原文

WalkerXu 发布了文章 · 2019-01-25

normandie出错重试与缓存机制对交互的影响,开发者注意

用户通过交互和产品对话,好的交互非常重要。
“错误提醒”在产品交互中也是非常重要的一部分,所以某些情况下app的错误提醒不能只依赖框架的回调。

如果错误提醒只依赖框架回调,在normandie中有一个设计会影响到错误提醒的交互。
这个机制在底层拉取数据某些指定报错后(不是普通的重试,普通重试是没有数据返回但不报错),且缓存中还有数据时,会去重试拉取数据,目的是防止网络非常不稳定的情况造成的播放断开。
如果重试拉取数据持续报错就会将错误报告附加在缓存数据的末尾,待缓存数据消耗到末尾,错误被上报。
这里的问题是,这个错误上报会有延迟,延迟的时间就是缓存数据播放的时间。

在一些场景下需要app干预提早报告。
比如同时开着wifi和4g,播放,然后断开wifi。
这种情况下,播放当时选择的数据链路是wifi(系统里wifi优先),虽然有4g alive但是播放仍然会断掉,但是因为框架的重试机制报错会延迟通知到用户。所以这里app要干预,监听到wifi断开,有所提示,并为用户做好在4g下重新发起播放的准备。

clipboard.png

查看原文

赞 0 收藏 0 评论 1

WalkerXu 发布了文章 · 2019-01-24

Android VNDK限制下的解决方案

你有没有遇到过这个错误呢?

F linker: CANNOT LINK EXECUTABLE "/system/bin/xxx": library "libxxx.so" not found

首先在android生态里,一般的应用开发者,不会遇到这个问题。
系统开发者也只有在某些情况下会遇到这个问题。什么情况呢?

我们先来了解下什么是vndk以及其规则。

VNDK就是vendor NDK

SDK(software development kit),NDK(native development kit)都不陌生吧,尤其是android应用开发者来说,就是某某开发包包含了api及其规范等等使得你开发的apk可以在android上运行。
那么怎么理解,vendor native development kit呢,这要从android整个软硬件框架及其生态说起,开发者常说的android其实指的是AOSP,而一个完整的android生态,至少包含四个个部分,一个是android,一个是硬件厂家芯片,屏幕,整机等等,一个是应用开发者,一个是消费者(是硬件消费者同时也是软件,内容消费者)。
可以看到android在产品架构上起了一个承上启下的作用,将硬件厂家和开发者连接在一起。
这里有一个看似矛盾的地方,android是谷歌开源的,而谷歌是一个商业公司不是慈善机构。谷歌开源的目的是推广它的广告系统从中得利,但是太开放版本混乱体验不一致反过来会损害它的利益。所以需要在开放的同时进行控制。
如果SDK,NDK是应用开发者的开发规范,那VNDK是针对硬件厂家的开发规范。

谷歌是这样介绍VNDK的

在理想的 Android 8.0 及更高版本环境中,框架进程不加载供应商共享库,所有供应商进程仅加载供应商共享库(和一部分框架共享库),而框架进程与供应商进程之间的通信由 HIDL 和硬件 binder 控制。
主要意思是,系统分区和vendor分区隔离,尤其系统分区内的框架进程不要链接加载vendor下的so库,规则不允许这样做,强行加载会报错,就是文章开头贴的错误。谷歌以这种方式保持系统对底层的统一,限制每个硬件厂家在底层对系统的不统一的修改。
所以系统开发者如果用框架进程无论是已经存在的还是新增的去加载vendor下的库都会遇到这个问题。
可能有人会说,android是开源的,我把这个限制在源码里去掉就可以了啊,别忘了我们在之前一篇文章里说过谷歌会考试,这么做考试会不及格的。不及格就拿不到谷歌的印章,没有印章,产品想上市麻烦事有很多,所以这几行代码代价太高了,不能这么做。

如何满足VNDK的规则呢?

VNDK给出了解决方案
方案1.把vendor下的资源通过供应商进程的方式暴露出来,框架进程通过hidl或者硬件binder的方式与供应商进程通信达到访问vendor资源的目的。
方案2.如果vendor下的资源比如so库,能够从vendor下彻底脱离,也可以拷贝一份到system下,这样合理的避开了这个问题,而且还省掉了开发供应商进程的成本,以及hidl或binder通信的消耗。

在框架进程必须要加载这个库的情况下,如果vendor下的so库能彻底脱离vendor,拷贝一份在system是最佳的方案。
为什么不是直接挪到system下,而是要拷贝一份呢?因为so放在vendor下就是因为vendor要用,而vendor进程只能加载一部分谷歌允许的框架so,所以这个库如果不是谷歌允许的so只放在system下那vendor也加载不到了。这种情况两边都要放。

前几天也遇到了类似的问题

用框架进程去加载一个vendor下的共享库,vendor/lib/libxxx.so, vendor/lib64/libxxx.so,这个库是芯片厂家提供的。
报告错误,F linker: CANNOT LINK EXECUTABLE "/system/bin/xxx": library "libxxx.so" not found。
正准备将vendor下的libxxx.so拷贝到system下,修改脚本的时候注意到一个叫libxxx_system.so被拷贝到了system下,libxxx_system.so与libxxx.so同名,只是多了_system后缀。
突然一个想法闪过“libxxx_system.so就是libxxx.so在system的拷贝”,初步通过3个步骤得到了确认
1.看大小两个差不多
2.看链接的库,两个so链接的库一样,而且都是谷歌允许的框架的so
3.看符号表基本一样
然后框架进程改成链接system/lib/libxxx_system.so和system/lib64/libxxx_system.so编译通过,运行通过,问题解决。看来芯片厂家已经做了相关的预案。

仅献给遇到此问题的朋友,F linker: CANNOT LINK EXECUTABLE "/system/bin/xxx": library "libxxx.so" not found。

VNDK详细介绍:https://source.android.com/de...

查看原文

赞 1 收藏 0 评论 0

WalkerXu 发布了文章 · 2019-01-17

normandie为什么不碰videoview

normandie是一套播放框架及其实现,并且90%的接口与android mediaplayer一致,包括生命周期状态机的实现等等。方便原来android框架的开发者迁移。

在android上做音视频开发的同学应该比较清楚,除了mediaplayer,android还提供了其它播放音视频的类,比如视频播放的还有videoview。
normandie在设计之初,就没有打算实现类似videoview这样的类。
videoview的优点是接口更简单,但它的缺点也是接口太简单,这里简单的意思是不够灵活。

音视频播放尤其是在线音视频播放的情况更为复杂,mediaplayer可以为开发者提供更为灵活的接口,更贴近底层框架的能力,让开发者去发挥,videoview大大的限制了开发者可以利用底层框架的能力。

下图是mediaplayer的状态机,设计的比较灵活
https://developer.android.com...
clipboard.png

android mediaplayer
https://developer.android.com...

android videoview
https://developer.android.com...

1.开发者可以基于normandie的mediaplayer api自己根据需要定制,videoview,baseplayerview都可以。
2.有开发者这么做了,并且将这个定制提供给其它业务使用,扩大了normandie的覆盖范围。但是之后随着一些业务的发展,这个定制就出现了之前提到的类似videoview不能满足业务需求的问题。
举两个例子:
(1).类似videoview的定制不容易实现预加载,因为它提供的接口不能让开发者知道更多状态信息。
预加载:同时多个palyer进行加载,但只有一个在前台播放。
(2).开发者想关心,拉取的内容的一些信息,比如分辨率等,类似videoview定制没有接口可以做。

有时候少即是多。

查看原文

赞 0 收藏 0 评论 0

WalkerXu 发布了文章 · 2019-01-15

新闻客户端短视频同一资源重新播放画面概率变模糊的问题定位分析

之前在总结2018年工作的时候,提醒开发者,除了关注需求外,也要关注下使用的api背后的逻辑以原理。
很多开发者要关注一下这方面,出问题之后,多少有点概念或想法,知道从哪里开始查找问题。

今天遇到一个类似的情况,很简单的一个问题,开发者没有正确的分析思路,盲目的无依据的怀疑框架。

问题是这样的“新闻客户端的短视频同一个内容,重新播放退出再播放,画面有时候清晰,有时候模糊”。

先看问题描述,以及现场应该可以得出重新开始之后视频质量不一样的结论,至于为什么不一样,是后边调查的事情。
再看log,可以肯定重新播放后请求的视频的质量是不一样的,虽然内容一样但是视频质量或文件不同。
qos002.png
clipboard.png
看到这里,再确认下url是否有变化,就很清楚了。

最终结论,服务端对一个内容配置了不同质量的资源,重复播放拿url的时候,没有固定拿某个质量url,出现了随机情况(可能没有使用好内容平台的api或没有协调好,比如是不是忽略了jason里的其它key),可以采取固定或根据网络情况来决定,拉取什么质量的资源。

作为开发者需求之外多了解些专业业务知识,会让你如鱼得水,拒绝做java的搬运工。

查看原文

赞 0 收藏 0 评论 0

认证与成就

  • 获得 39 次点赞
  • 获得 1 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 1 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2017-12-16
个人主页被 1.6k 人浏览