1、 分析waterworld编译出现的dex2oatd工程中验证报错导致编译中断问题。
分析结果如下: A:dex2otad对bootclass做dex2oatd转换成boot.oat时发生异常,单独执行也出现报错异常。
B:继续往上分析编译日志,dex2oatd对systeminterface做校验时中断编译。若dex2oatd不对systeminterface进行oat转换则不会报错,验证结果显示
C:dex2oatd的校验代码如下。该校验代码是google 5.1升级到6.0是添加。
当前systeminterface采用类似预编译的方式,将未优化的systeminterface放置到out对应的中间文件目录,其他文件依赖systeminterface可以获取到依赖。
D:将Systeminterface的编译采用源码进行编译,解决编译报错后,该校验可以通过。初步怀疑dex2oatd需要校验bootclass jar包中文件。在后续分析waterworld项目不开机问题中,确认是Systeminterface在该环境中编译报错导致校验不通过,dex2oatd需要校验bootclass中文件的方法。 解决方案:
更新Systeminterface.jar,该Systeminterface.jar在该环境中需要确保编译通过。
2、分析
http://10.100.11.10:8080/tfs/360 OS-Collection/PUB_LEProducts/_workitems#_a=edit&id=78935
拨号盘停止运行bug。
A:分析crash.log,发现报错如下,找不到对于的class导致crash。
B:查找PhoneNumberUtil.java,该文件位于
external/libphonenumber/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java中,该文件编译到libphonenumber和libphonenumber-platform这两个静态jar包中。
C:查找模块对libphonenumber的依赖如下,ContactsCommon、Messaging应用对libphonenumber是静态依赖。
D:查看framework/base/Android.mk,ext.jar静态依赖libphonenumber.jar,最终打包到ext.jar中,查看编译出来的ext.jar中间文件,的确也是打包到ext.jar中。
E:查看Bootclasspath,bootclass包含ext.jar,按照道理是可以找到PhoneNumberUtil.java这个类的。
F:查看ext.jar,发现包名是com.android.il8n,而报错代码是找com.google.il8n包名。查看源码的包名确是com.google.il8n
G:为什么包名方式改变?查看编译libphonenumber的Android.mk。编译libphonenumber-platform时加了LOCAL_JARJAR_RULES控制。
jarjar-rules.txt的描述如下
rulecom.google.** com.android.@1
该Rule将替换com.google为com.android包名,所以libphonenumber-platform编译出来的包名发生改变。
所以QK_DailerUI应用无法找到PhoneNumberUtil.java这个类。 解决方案:
1、 参考ContactCommon应用静态依赖libphonenumber.jar,将该Jar包打包到apk中。 2、 修改QK_DailerUI应用import的包名为com.android.il8n。
3、分析qiku-framework.jar编译没有输出未做dex优化的qiku-framework.jar,该jar包需要在搭建外部编译环境中使用。
A:当前编译出来的qiku-framework.jar的中间输出文件如下
对比编译qiku-feature.jar的中间输出文件如下
对比qiku-framework和qiku-feature的编译Android.mk,为发现明显的参数区别。 B:单独编译qiku-framework模块,查看编译日志如下
通常jar包编译工程.java-->.class-->jarjar-->proguard-->dx等流程,而当前编译qiku-framework是通过jack编译器进行编译的。
C:jack(Java Android Compile Kit)是Android 6.0的新特性,参考资料如下 http://arui.me/index.php/archives/57/
Android 6.0在编译时包时默认开启jack,所以在编译工程中没有中间调试文件生成。 解决方案:
在编译qiku-framework模块式关闭jack。 LOCAL_JACK_ENABLED := disabled
4、 分析Prize Z1语言配置问题。
问题现象:
Koobee要求语言保留中文、简体中文、英语三种语言。 分析过程如下:
A:进入设置语言和输入法是包含全语言种类,通常通过Locale类获取,而Locale类在运行时通过资源管理服务获取所支持的语言。而资源管理服务读取打包的资源种类获取支持语言。aapt打包工具通过PRODUCT_AAPT_CONFIG打包相关配置资源文件夹。与语言相关配置选项是PRODUCT_LOCALES。
B:在build/core/dumpvar.mk中打印PRODUCT_LOCALES变量值。
执行编译结果如下:
PRODUCT_LOCALES
:=
en_USzh_CNzh_TWes_ESpt_BRru_RUfr_FRde_DEtr_TRvi_VNms_MYin_IDth_THit_ITar_EGhi_INbn_INur_PKfa_IRpt_PTnl_NLel_GRhu_HUtl_PHro_ROcs_CZko_KRkm_KHiw_ILmy_MMpl_PLes_USbg_BGhr_HRlv_LVlt_LTsk_SKuk_UAde_ATda_DKfi_FInb_NOsv_SEen_GBhy_AMzh_HKet_EEja_JPkk_KZsr_RSsl_SIca_ES
C:通常情况在产品makefile文件配置PRODUCT_LOCALES覆盖之前的赋值,在360os_prebuilt.mk中加PRODUCT_LOCALES:=zh_CNen_USzh_TW配置,执行步骤B,打印出PRODUCT_LOCALES依旧不变。
D:查看360os_prebuilt.mk的调用过程如下:
./prize/pri6737t_66_m0/device.mk:214:$(call inherit-product, device/360OS/360os_prebuilt.mk)
./prize/pri6737t_66_m0/full_pri6737t_66_m0.mk:18:$(call inherit-product, device/prize/$(MTK_TARGET_PROJECT)/device.mk)
full_pri6737t_66_m0.mk中PRODUCT_LOCALES覆盖了360os_prebuilt.mk中PRODUCT_LOCALE,导致360os_prebuilt.mk未生效。
E:修改full_pri6737t_66_m0.mk中PRODUCT_LOCALES配置,执行步骤B,打印PRODUCT_LOCALES的值是PRODUCT_LOCALES:=zh_CNen_USzh_TW。 F:修改该值上传到服务器启动编译后,发现修改没有生效,查看
device/prize/pri6737t_66_m0/full_pri6737t_66_m0.mk,发现该值已经还原。在全代码查找full_pri6737t_66_m0.mk,确认是
/prize_project/pcba/a5/prize_base/device/prize/pri6737t_66_m0/full_pri6737t_66_m0.mk覆盖了该值。 解决方案:
http://10.100.13.26:8080/#/c/9218/
5、 分析默认壁纸不生效问题
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库问题分析在线全文阅读。
相关推荐: