艺龙旅行闪退问题分析

三方app闪退其实一般来说就是crash,常见的crash应该是弹窗提示的,但是目前国内三方app一般不会弹窗的,而是直接退出。

这个就是用到了UncaughtExceptionHandler,这个可以处理java未捕获的全局异常。

为了验证这个想法,可以用apktool反编译apk来查看

java -jar apktool_2.2.1.jar d yilonglvxing_9282.apk
果不其然搜索关键字发现了

yilonglvxing_9282/smali/com/dp/android/elong/crash/ActivityCrashHandler.smali
具体查看smali代码可以发现这么一行

    .line 88
    :cond_1
    const-string v5, "/data/data/com.dp.android.elong/cache/crash.log"
这个位置就存储了crash的信息,这个文件不是标准的utf-8格式编码,且用到了自定义的分隔符,看起来很头疼,不过好歹还是可读取的,截取片段如下

Caused by: java.lang.reflect.InvocationTargetException\\n\\tat 
java.lang.reflect.Constructor.newInstance(Native Method)\\n\\tat 
com.elong.mobile.plugin.utils.PluginResInflateFactory.onCreateView(PluginResInflateFactory.java:45)\\n\\t... 38 more
\\nCaused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 5: TypedValue{t=0x2/d=0x1010351 a=1}\\n\\tat 
android.content.res.TypedArray.getColorStateList(TypedArray.java:493)\\n\\tat 
android.widget.TextView.<init>(TextView.java:1065)\\n\\tat 
android.widget.EditText.<init>(EditText.java:71)\\n\\tat 
android.widget.EditText.<init>(EditText.java:66)\\n\\tat
android.widget.EditText.<init>(EditText.java:62)\\n\\t... 
40 more\\nandroid.view.InflateException: Binary XML file line #61: Binary XML file line #61: Error inflating class android.widget.EditText\\n\\tat 
android.view.LayoutInflater.inflate(LayoutInflater.java:539)\\n\\tat 
android.view.LayoutInflater.inflate(LayoutInflater.java:394)\\n\\tat 
com.elong.android.home.dialogutils.BaseHttpDialog.init(BaseHttpDialog.java:61)\\n\\tat 
com.elong.android.home.dialogutils.BaseHttpDialog.<init>(BaseHttpDialog.java:31)\\n\\tat 
com.elong.android.home.dialogutils.HttpVerifyCodeDialog.<init>(HttpVerifyCodeDialog.java:33)\\n\\tat 
com.elong.android.home.BaseNetFragment.initDialog(BaseNetFragment.java:44)\\n\\tat 
com.elong.android.home.RevisionHomeActivity.onCreateView(RevisionHomeActivity.java:246)\\n\\tat 
android.app.Fragment.performCreateView(Fragment.java:2236)\\n\\tat 
android.app.FragmentManagerImpl.moveToState(FragmentManager.java:978)\\n\\tat 
android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1153)\\n\\tat 
android.app.BackStackRecord.run(BackStackRecord.java:800)\\n\\tat 
android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1562)\\n\\tat 
android.app.FragmentController.execPendingActions(FragmentController.java:325)\\n\\tat 
android.app.Activity.performStart(Activity.java:6285)\\n\\tat 
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2510)\\n\\tat 
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2613)\\n\\tat 
android.app.ActivityThread.-wrap11(ActivityThread.java)\\n\\tat 
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1469)\\n\\tat 
android.os.Handler.dispatchMessage(Handler.java:111)\\n\\tat 
android.os.Looper.loop(Looper.java:207)\\n\\tat 
android.app.ActivityThread.main(ActivityThread.java:5692)\\n\\tat 
java.lang.reflect.Method.invoke(Native Method)\\n\\tat 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:891)\\n\\tat 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:752)\\n
可以看出是EditText出了问题,这个归根到底是系统控件修改出的问题。
 

这个是apk比较好心,预留了log在存储中,如果apk没有保留,或者是apk还专门加密反调试之类的,那么crash日志该如何获取?

这个对手机厂商来说有个更方便的方法,修改libart.so的代码,加入日志。

art/runtime/thread.cc

void Thread::HandleUncaughtExceptions(ScopedObjectAccess& soa) {
   ...

  // Get and clear the exception.
  ScopedLocalRef<jthrowable> exception(tlsPtr_.jni_env, tlsPtr_.jni_env->ExceptionOccurred());

  LOG(INFO) << "lgy HandleUncaughtExceptions reset";
  mirror::Throwable* exception1 = GetException();
  if(exception1 != nullptr){
    LOG(INFO) << "lgy HandleUncaughtException = " << exception1 -> Dump();
  }
  ...
}
加入的代码如上所示,有闪退的问题可以先用这个查看并排除问题。

注意目前虽然大部分机器都已经是64位机器了,但是三方app为了兼容还是只编译32位的app,这样32位和64位的机器都可以跑。所以编译的libart.so要替换system/lib下的,替换system/lib64可能没有效果。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值