Android_简单描述配置语言问题及log种类分析。

一:添加多国语言编译后导入手机,发现语言设置菜单中缺少某个已配置的语言。

例如:我在项目中添加了加利西亚语字符串,同时ini文件中配置:REVO_S_PRJ_LOCALES=gl_ES,编译后导入手机查看,

当前语言并没有在语言设置列表中。(gl_ES= gl代表的是当前语言_ES代表的是国家码)

解决方式:

查看下/frameworks/base/core/res/res/下是否存在values-gl-rES文件夹么?

若没有还请增加,并把values-gl中的srings文件都copy一份到values-gl-rES中之后删除out重新全编验证下.

二: 解决上面的问题后,加利西亚语能正确的显示在语言设置菜单中,这个时候你切换语言至加利西亚语后,简单测试下,

可能会发现进入某些菜单,会提示报错信息。(这里要说明一点,发生会报错的情况,肯定是当前应用下修改了或者添加了

加利西亚语引起的)。

解决方式:

上面的问题属于crash问题,crash 问题处理方法:

出现提示报错的信息,一般都为对应语言下strings资源字符串问题,这种问题来源为翻译公司翻译字符串时对于一些格式话字符误翻或误删造成.

对与此类问题,我们可通过如下方法自行处理解决,

1.从system log中搜索"FATAL EXCEPTION"关键字,找到crash调用堆栈,

2.从堆栈中可以一般都可以看到调用getString方法,通过代码行找到调用的是哪个字符串id

3.参看values中字符串对比values-gl中对应string的格式话字符串相关是否存在差异,改正即可

例如,此问题log中有如下crash ,找到Workspace.java:445行,中使用的是"workspace_description_format",再去按照values.中

字符串格式话写法,修改values-gl文件夹内此字符串资源即可.

01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.content.Context.getString(Context.java:356)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at com.android.launcher2.Workspace.onChildViewAdded(Workspace.java:445)

444        cl.setClickable(true);
445        cl.setContentDescription(getContext().getString(
446                R.string.workspace_description_format, getChildCount()));
447    }

------------------------------------------------------

具体system log中crash log如下

01-01 00:06:55.114  3123  3123 E AndroidRuntime: FATAL EXCEPTION: main
01-01 00:06:55.114  3123  3123 E AndroidRuntime: Process: com.android.launcher, PID: 3123
01-01 00:06:55.114  3123  3123 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.launcher/com.android.launcher2.Launcher}: java.util.UnknownFormatConversionException: Conversion: $
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2288)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2337)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.app.ActivityThread.access$800(ActivityThread.java:151)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.os.Looper.loop(Looper.java:136)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5375)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:515)

01-01 00:06:55.114  3123  3123 E AndroidRuntime:     

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:976)

01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:792)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method)
01-01 00:06:55.114  3123  3123 E AndroidRuntime: Caused by: java.util.UnknownFormatConversionException: Conversion: $

01-01 00:06:55.114  3123  3123 E AndroidRuntime:     

at java.util.Formatter$FormatToken.unknownFormatConversionException(Formatter.java:1399)

01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at java.util.Formatter$FormatToken.checkFlags(Formatter.java:1336)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at java.util.Formatter.transform(Formatter.java:1442)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at java.util.Formatter.doFormat(Formatter.java:1081)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at java.util.Formatter.format(Formatter.java:1042)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at java.util.Formatter.format(Formatter.java:1011)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at java.lang.String.format(String.java:1999)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.content.res.Resources.getString(Resources.java:375)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.content.Context.getString(Context.java:356)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at com.android.launcher2.Workspace.onChildViewAdded(Workspace.java:445)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.view.ViewGroup.onViewAdded(ViewGroup.java:3504)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.view.ViewGroup.addViewInner(ViewGroup.java:3640)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.view.ViewGroup.addView(ViewGroup.java:3443)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.view.ViewGroup.addView(ViewGroup.java:3388)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.view.ViewGroup.addView(ViewGroup.java:3364)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.view.LayoutInflater.parseInclude(LayoutInflater.java:866)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.view.LayoutInflater.rInflate(LayoutInflater.java:745)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:353)

01-01 00:06:55.114  3123  3123 E AndroidRuntime:     

at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:305)

01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.app.Activity.setContentView(Activity.java:1935)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at com.android.launcher2.Launcher.onCreate(Launcher.java:431)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.app.Activity.performCreate(Activity.java:5258)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1099)
01-01 00:06:55.114  3123  3123 E AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2228) 


android源码开发下,当遇见许多的界面性问题,都是我们软件工程师能够解决的,解决的方式有很多,最简单的就是在代码中加log也就是打断点,跟踪

应用的调用过程,还有一种最常见的就是开启抓log的工具复现该问题,从log中分析问题,像上面的问题就是从slog中分析问题。

这里简单的说一下,Android 各层中日志打印功能的应用:

1. HAL层
头文件:#include <utils/Log.h> 
对应的级别 打印方法  
VERBOSE LOGV(), DEBUG LOGD(), INFO LOGI(), WARN LOGW(), ERROR LOGE()
方法:  LOGD("%d, %s", int, char* )
2. JNI层
头文件:#include <utils/Log.h> 
对应的级别 打印方法  
VERBOSE LOGV(), DEBUG LOGD(), INFO LOGI(), WARN LOGW(), ERROR LOGE()
方法:  LOGD("%d, %s", int, char* )

3. FRAMEWORK层
import android.util.Slog;
对应的级别 打印方法
VERBOSE Slog.v(), DEBUG Slog.d(), INFO Slog.i(), WARN Slog.w(), ERROR Slog.e()
方法:  Slog.d(TAG, "something to say.");

4. JAVA层
import android.util.Log;
对应的级别 打印方法
VERBOSE Log.v(), DEBUG Log.d(), INFO Log.i(), WARN Log.w(), ERROR Log.e(),
方法: Log.d(TAG, "something to say."); 

Slog:高扩展性的android平台日志框架Slog,System log其中应该包括ap log ,也是我用的最多的调试方式。

详细可以参考:https://blog.csdn.net/s402178946/article/details/72898942

MDlog:是调试日志。后面的数字是日期和时间。

.DMP:是错误报告文件,是系统错误产生的文件。同样的,后面的数字也是表示日期和时间。

ModemLog:是调制解调器日志,Modem就是和电脑上网用的“猫”是一样的。如果你不是用拨号上网,一般用不着。

MobileLog:是移动手机日志,跟打电话、发短信等通信有关。

三  开机进入Launcher界面出现销量统计应用错误提醒,提示sales count has stop 。

这种情况一般都是能从ap log中定位问题原因。

如何抓取log呢?

1.展讯默认的抓log指令*#*#83781#*#* ,可以开启Ylog,ylog中包含了ap log。

2.复现问题,抓取log后,打开ylog文件夹中的aplog文件夹,里面存在current/抓取log时间点/android/analyzer.py文件

3.利用 python 后接该文件的名称 analyzer.py,将log信息解压出来,其中包好event.log,crash.log,radio.log,system.log,0000.log。

4.打开0000.log,搜索关键字“FATAL EXCEPTION”“AndroidRuntime”就能定位到问题原因。

例如上面说的salescount has stop问题,我在0000.log中就找到如下信息:

M00A377 07-05 20:13:59.270  2939  2939 D AndroidRuntime: Shutting down VM
C00A378 07-05 20:13:59.271  2939  2939 E AndroidRuntime: FATAL EXCEPTION: main
07-05 20:13:59.271  2939  2939 E AndroidRuntime: Process: com.revo.salescount, PID: 2939
07-05 20:13:59.271  2939  2939 E AndroidRuntime: java.lang.RuntimeException: Unable to start receiver com.revo.salescount.SalesCountBootBroadcastReceiver: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
07-05 20:13:59.271  2939  2939 E AndroidRuntime: 	at android.app.ActivityThread.handleReceiver(ActivityThread.java:3301)
07-05 20:13:59.271  2939  2939 E AndroidRuntime: 	at android.app.ActivityThread.-wrap18(Unknown Source:0)
07-05 20:13:59.271  2939  2939 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1733)
07-05 20:13:59.271  2939  2939 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:106)
07-05 20:13:59.271  2939  2939 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:164)
07-05 20:13:59.271  2939  2939 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:6719)
07-05 20:13:59.271  2939  2939 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
07-05 20:13:59.271  2939  2939 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:449)
07-05 20:13:59.271  2939  2939 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
07-05 20:13:59.271  2939  2939 E AndroidRuntime: Caused by: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
07-05 20:13:59.271  2939  2939 E AndroidRuntime: 	at com.revo.salescount.SalesCountBootBroadcastReceiver.onReceive(SalesCountBootBroadcastReceiver.java:63)
07-05 20:13:59.271  2939  2939 E AndroidRuntime: 	at android.app.ActivityThread.handleReceiver(ActivityThread.java:3291)
07-05 20:13:59.271  2939  2939 E AndroidRuntime: 	... 8 more
com.revo.salescount.SalesCountBootBroadcastReceiver: java.lang.ArrayIndexOutOfBoundsException: length=1; index=1  这就是问题的原因了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值