上班第三周

任务

  1. 解决调试热修复框架生成补丁失败的问题
  2. 还是解决项目的ANR问题
  3. WebView嵌套ScrollView滑动冲突

热修复框架

热修复生成补丁失败,报错如下:

"org.jf.util.ExceptionWithContext: Exception occurred while writing code_item for method Activity路径;->init()V"
"\tat org.jf.dexlib2.writer.DexWriter.writeDebugAndCodeItems(DexWriter.java:825)"
"\tat org.jf.dexlib2.writer.DexWriter.writeTo(DexWriter.java:268)"
"\tat org.jf.dexlib2.writer.DexWriter.writeTo(DexWriter.java:246)"
"\tat org.jf.smali.Smali.assemble(Smali.java:130)"
"\tat com.taobao.sophix.impl.PatchCommand.start(PatchCommand.java:373)"
"\tat com.taobao.sophix.Main.main(Main.java:34)"
"Caused by: org.jf.util.ExceptionWithContext: Error while writing instruction at code offset 0x12"
"\tat org.jf.dexlib2.writer.DexWriter.writeCodeItem(DexWriter.java:1098)"
"\tat org.jf.dexlib2.writer.DexWriter.writeDebugAndCodeItems(DexWriter.java:821)"
"\t... 5 more"
"Caused by: org.jf.util.ExceptionWithContext: Unsigned short value out of range: 143796"
"\tat org.jf.dexlib2.writer.DexDataWriter.writeUshort(DexDataWriter.java:116)"
"\tat org.jf.dexlib2.writer.InstructionWriter.write(InstructionWriter.java:236)"
"\tat org.jf.dexlib2.writer.DexWriter.writeCodeItem(DexWriter.java:1025)"
"\t... 6 more"

花了三天时间,总算把这个问题解决了,自己总结了大概的流程:

首先公司有两个项目:项目A和项目B,在项目A上可以正常生成补丁,但是项目B就会生成补丁失败,对比了两个项目的配制文件大部分都是一样的,自己网上搜了一下,都没有遇到过类似的问题,后面就请教阿里的工程师了,记录如下:

image

阿里给的回复可能是插件住代码中插入不同的代码了,导致两次编译出来的apk差别很大,项目是用到AspectJ插入代码,但是两个项目都有用到了,也排除了不是这个问题引用的

这里注意通过使用Android Studio自带的工具来对比两个apk的差别是不准的,后面使用apktool反编译apk,然后再对比两个apk的区别(这一步是关键,后面一步步分析最终找到问题所在)

反编译的apk对比如下:

image

这里看出虽然我只改一项目的一点代码,但是再次打包的时候资源文件也会不一样,搜了一下资源文件,发现不同的模块都用引用到相同的资源名称,所以想到就是不同的模块在合并相同资源文件的时候会导致每次合并的结果会不一样

对比每次打包出来的依赖列表,发现每次打包出来的依赖顺序都会不一样,项目是使用自己写的一个插件进行模块化管理的,代码是使用HashSet来保存的,而HashSet是无序的,就导致读取出来的依赖列表也是无序的,改用LinkedHashSet就解决了

image

反思: 自己在解决这个问题上效率不太高,主要原因还是方法不对,生成补丁不成功,第一时间想着是项目配制或者是代码的问题引起的,但是当一个项目很大的时候,很难快速定位到问题,这里浪费了很多的时间,后面还是要从结束出来,生成补丁失败了,直接反编译apk看具体的差别,这个就能很快定位问题了

ANR问题

从bugly上日记分析太难定位到问题,只知道哪个模块会有问题,但是具体是哪一块引起的就不清楚了,联系了测试的小姐姐,看后面出现了ANR的问题,第一时间保留现场,拿过来分析解决

WebView嵌套ScrollView滑动冲突

项目中出现个滑动冲突的问题,布局大概如下:

<ScrollView
   <LinearLayout
      <LinearLayout
      <WebView
      <LinearLayout

这里ScrollView处理了滑动事件,导致滑动的时候WebView不能加载下一页的内容
思路如下:

  1. 当ScrollView整体向上滑动的时候,监听WebView在屏幕中的位置,如果超出屏幕的时候,不让ScrollView处理滑动事件,而交给WebView处理,这样WebView就可以正常加载下页内容
  2. 当WebView滑动到最下面的时候,并且所以页数都加载完了之后就把事件又还给ScrollView处理,这样整体又可以正常滑动了

ps:考虑到性能的问题,还需要固定一下WebView的高度,不能一直往上加

遇到的问题

  1. apktool反编译报错
W: Could not decode attr value, using undecoded value instead: ns=android, name=paddingLeft, value=0x00000f01
W: Could not decode attr value, using undecoded value instead: ns=android, name=layout_width, value=0xffffffff
W: Could not decode attr value, using undecoded value instead: ns=android, name=layout_height, value=0xfffffffe
W: Could not decode attr value, using undecoded value instead: ns=android, name=textSize, value=0x00001002
W: Could not decode attr value, using undecoded value instead: ns=android, name=textColor, value=0xff171717
W: Could not decode attr value, using undecoded value instead: ns=android, name=layout_gravity, value=0x00000010
W: Could not decode attr value, using undecoded value instead: ns=android, name=id, value=0x7f09172b
W: Could not decode attr value, using undecoded value instead: ns=android, name=paddingTop, value=0x00001001
W: Could not decode attr value, using undecoded value instead: ns=android, name=paddingBottom, value=0x00001001

安装了不同版本的apktool引起的
解决:

rm -rf ~/.local/share/apktool/framework

  1. sophix
addPatch forbid loading local patch for secure reason in release mode

sophix本场调试没有打开
解决:

  final SophixManager instance = SophixManager.getInstance();
  instance.setEnableDebug(true)

  1. 打Release包报错
java.util.ConcurrentModificationException
        at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
        at java.util.ArrayList$Itr.next(ArrayList.java:859)
        at org.aspectj.bridge.MessageHandler.hasAnyMessage(MessageHandler.java:160)
        at org.aspectj.weaver.Dump.shouldDumpOnExit(Dump.java:179)
        at org.aspectj.weaver.Dump.dumpOnExit(Dump.java:147)
        at org.aspectj.weaver.Dump.dumpOnExit(Dump.java:135)
        at org.aspectj.ajdt.ajc.AjdtCommand.doCommand(AjdtCommand.java:116)
        at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:60)
        at org.aspectj.tools.ajc.Main.run(Main.java:371)
        at sun.reflect.GeneratedMethodAccessor272.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.codehaus.groovy.runtime.callsite.PlainObjectMetaMethodSite.doInvoke(PlainObjectMetaMethodSite.java:43)
        at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSite.invoke(PojoMetaMethodSite.java:190)
        at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:55)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:135)
        at com.hujiang.gradle.plugin.android.aspectjx.internal.AJXTask.call(AJXTask.groovy:99)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

还没想到怎么解决...

总结

  1. 使用ack快速搜索文件内容
$ sudo apt-get install ack
$ ack "<style name=\"AppTheme\""

  1. 查找当前项目依赖:
  • 方法一
    ./gradlew 项目名称:androidDependencies
  • 方法二
    a. View > Tool Windows > Gradle
    b. AppName > Tasks > android, 双击androidDependencies
  1. Android Studio ClassPath库引用路径
~/.gradle/caches/modules-2/files-2.1/库路径/库名称/1.2.5/a447d311d11f043c3ee783af90077b34e05b5263

  1. Android Studio 使用Alt+箭头可以在方法之间跳转
  2. 使用AnimationDrawable加载帧动画(可能会引起OOM和ANR)
  3. MANIFEST.MF CERT.RSA作用
  • CERT.RSA包含了公钥信息和发布机构信息
  • MANIFEST.MF包含所有文件进行SHA-1(这是一个Hash算法)之后再base64编码之后的值
  1. Apk打包编译过程


    image
  2. Android Overlay是一种资源替换机制,它能在不重新打包apk的情况下,实现资源文件的替换(res目录非assert目录),Overlay又分为静态Overlay(Static Resource Overlay)与运行时Overlay(Runtime Resource Overlay)。

  3. 获取View在屏幕中的位置

final int[] decorViewLocationInScreen=new int[2];
decorView.getLocationOnScreen(decorViewLocationInScreen);

  1. Android 9.0系统开始不允许Http协议访问网络

引用

Android应用程序资源的编译和打包过程分析

Resource Merging

Android studio 调试gradle插件

WebView inside ScrollView scrolls only scrollview

Android 9.0系统不允许Http协议访问网络

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352