• [问题求助] 华为welink中开发小程序支持唤起一个android或ios原生app吗
    开发了一个唤起android demo的H5网页http://139.129.12.59:8090/testdocker/,发现h5可以唤起手机上的应用 ,但是用华为welink发现不行,不能唤起应用,具体流程如下图:华为welink中访问同样的页面不会启动APP,会报错:
  • [问题求助] android手机上welink app中302跳转问题
    我们的一个H5应用挂载到welink中,android手机上在welink  app中跳转问题不成功,但是相同的应用在ios的welink app上是可以的。我在我的window机器上通过fiddler开启了代理,然后android手机访问welinkapp的时候,也抓取步到任何报文,而且出现证书信任的错误,我已经将fiddler产生的证书加入到android的信任证书中了。我这里有几个问题:1、welink app的证书信任不是使用的系统的信任证书列表吗?2、welink app中的302跳转或者window.location需要什么特殊条件?这个不是在webview中打开的吗?3、welink app与后端交互好像不是使用的http或者https,使用的是自定义的协议吗?
  • [融合视频] 【Android】频道A支持时移,直播播放多屏同看页面选择一个频道A进入观看,A频道全屏播放页面点击左上角返回按钮,进入小屏播放
    问题描述:1、直播播放多屏同看页面选择一个时移频道A进入观看,2、A频道全屏播放页面点击左上角返回按钮,3、进入小屏播放【预期结果】小屏进度条显示正常【实际结果】小屏进度条变粗
  • [融合视频] android弹窗权限
    为啥需要获取这两个权限(IMEI / IMSI)?有哪位可以详细解释下么?没有这个权限会有什么影响(哪些功能不可用了)?
  • [融合视频] 【Android】频繁滑动Live TV中的栏目Fragmet导致Fragment页面无法显示
    问题描述:Live TV页面存在较多(15)栏目时,频繁左右滑动栏目Fragment,最终导致栏目的Fragment页面数据置空,再次点击底部tabBar,无法切换tabBar,页面卡死。点击手机物理按键,弹出多任务,再次进入恢复正常。问题分析:由于栏目的Fragment是嵌套在Live TV的Fragment中,在Live TV的Fragment中使用getSupportFragmentManager;在栏目的Fragment中使用getChildFragmentManager管理器,目前分析结果是栏目的FragmentManager失效,导致Fragment展示空白页无法显示。
  • [问题求助] LiteOS是否可以支持类似Android一样,在MCU上开发客户应用呢?
    你好。我有个客户需求,帮助客户奖传感数据联网传送至云端,但是客户对采集到的传感数据,需要自己做处理、判断后,再讲数据上传。在这种情况下,我希望提供基础解决方案给到客户,然后客户在此基础上,开发自己的数据处理应用。有没有可能,类似于我提供一台移植了LiteOS的MCU+联网单元,由客户在上面开发类似X应用的方式实现我的功能要求呢。即类似于Android手机是一个处理器
  • [融合视频] 【hl】【T339 TTKB 1827】【android】添加npvr录制后,图标为空,点击录制图标报已录制,且无法取消
    在录制节目的时候,偶现节目录制图标为空,但是从cloud看来,其实是录制状态。此时再去点录制图标就会报错说 a pvr task has been created for the program 332126。无法取消,无法再录制。1.  Account 里面点击Cloud报错 failed to query PVR information2.  whatson频道里面对直播节目或未来节目添加录制后,录制云朵图标未刷新,之后再次点击record 无法取消,而是提示:已经添加该录制任务易杰初步分析结论:日志文件:35414行,调用 /VSP/V3/AddPVR添加录制任务结束,日志文件35424行,返回添加成功,日志文件:  35444行,发现基线SDK,PVRCache开始调用queryPvrFromServer ,接下来发现SDK内部打印的信息日志文件:  35561行,interfaceName=QueryPVR, errorCode=147000002,SDK内部查询PVR信息失败,日志文件:35577行,PVRCache |onComplete() |Line:404]  query pvr failed. SDK内部打印查询失败,接下来就是:SDK的pvrCache缓存状态更新失败,导致图标状态无法及时刷新,仍然是空心,此时点击空心仍然会调用AddPVR日志文件:50187行报错提示语: A PVR task has been created for the program.日志文件:50167行,调用的接口:/VSP/V3/AddPVR 返回信息如下:{   "result": {      "retMsg": "record plan has existed.",         "retCode": "126014701"     },   "PVRID": "178683649841979520" } 结合问题现象,来看,属于添加成功之后,SDK缓存没有及时刷新回来,录制状态图标仍然是空心,导致再次点击的时候,仍然调用的是AddPVR添加录制接口,最后就会报  A PVR task has been created for the program. 问题结论:1.  2月份,陈维华让基线黄火荣提供过一个缓存无法及时刷新的SDK库。2.  针对今天这个问题现象属于SDK查询PVR进行缓存状态更新的时候,属于SDK调用: QueryPVR查询失败,errorCode = 147000002在错误码描述中找到这个code对应的详细描述如下:QueryPVR147000002缓存服务器数据操作失败。The cache server data operation fails.ios;android;epg;pc;操作失败Operation Failure查询录制信息失败。Failed to query the PVR information.请重试,或者联系客服寻求帮助。Please try again or contact us.toasttoasttipstips 
  • [融合视频] android api28变更引发的问题
    背景XX Android App使用WebView+JavaScript的方式构建应用。最近项目工程升级了打包SDK版本至Api28,出现一个奇怪的问题:使用应用管理杀掉App后,再次启动App,进入Web页面后,按后退键,本来应该返回上一个Web页面,但是直接却退出了。初步分析,应该和Android SDK的Api28的变更有关系。参考Android开发者网站的Api28变更说明(https://developer.android.com/about/versions/pie/android-9.0-changes-28),但是没有找到确切的原因。经过多次测试发现:异常场景:安装App->启动App->杀掉App进程->启动App->进入Web页面->进入另一个Web页面->按后退键->App直接退出;正常场景:安装App->启动App->进入Web页面->进入另一个Web页面->按后退键->App后退至上一个Web页面。因此打算使用Android Studio进行单步调试1.         正常情况下,Activity收到的按钮事件能够正常传递到WebView事件处理方法中,异常情况下,Activity收到的按钮事件无法传递到WebView的时间处理方法中;2.         按钮事件从Activity到WebView需要经过SDK的处理逻辑,需要走读SDK源码,查看可能的原因;3.         SDK代码复杂,单步调试容易跟丢;4.         单步调试定位到的行号和SDK源码的行号有差别,无法对上,加大单步调试的难度。这时,想到有正常情况和异常情况作对比,是不是可以通过正常情况下方法调用栈信息,来指导异常情况的单步调试?第一步:在正常情况下,单步调试至WebView的按钮事件处理方法,此时方法调用栈信息如下图所示,其中按钮事件从CordovaViewActivity->SystemWebView。第二步:在异常情况下,从CordovaViewActivity类的dispatchKeyEvent方法,一步一步按照上面的方法调用栈的行号,到达对应行号后,进入方法。例如当单步调试到dispatchKeyEvent:557,AppCompatActivity时,按F8进入下一行558,这时dispatchKeyEvent:558,AppCompatActivity在上面的堆栈中有,此时按F7进入函数dispatchKeyEvent:xxx,CompatActivity中。第三步:按照第二步的方法,直到发现与调用栈不一致的执行顺序。在这里,我们发现程序从DecorView:529走到ViewGroup类dispatchKeyEvent方法1903行时,直接跳至1910行,因此可以初步判断程序在这里未按预期执行。第四步:通过查看ViewGroup类dispatchKeyEvent方法(代码行稍微有些偏移),结合内存变量mFocused的值为null,可知是mFocused的值为空导致异常。到这里,我们就发现了这个mFocused值是问题的关键。经过上网查看资料,这个mFocused的值指向当前焦点的View。结合Android Api28的一个变更:不会再轻触模式下隐式分配初始焦点,基本可以确定就是焦点的问题了。解决方法在SystemWebView中增加请求焦点的代码requestFoucus(),问题解决。博文引自:https://bbs.huaweicloud.com/blogs/152470问题请在本贴讨论。
  • [技术干货] 【深圳HDZ】王松-新气象,接个私活赚点生活费?恐怕事情没有这么简单
          现在到处讲副业,怎么样利用副业赚钱,这能理解,一方面年轻人生存压力大,多赚钱点总是没有坏处;另一方面,每年的裁员信息看的人心惊胆颤,大家都想为自己留一条后路。      新年伊始,想必很多小伙伴可能都想大展拳脚,新的一年好好干一番,很多人就想到了接私活,但是接私活到底赚不赚钱,这里有哪些坑,松哥和大家扯扯。      松哥刚毕业的时候做 Android 开发,在做 Android 期间基本上没有接过私活,因为 Android 有一个特点,就是应用看着很简单,在甲方眼里可能就是画几个页面,但是实际操作起来,要考虑各种各样的机型适配、屏幕适配、甚至系统适配(由于国内厂商做了各种定制带来的)等操作,也算是一件非常费力的事情。由于和甲方这种认知上的差异, Android 的活很难谈上价钱,所以就没接过。      直接接应用做虽然没有做过,但是 Android 有另外一个灰产,就是做“二次打包”的羊毛党,这个几乎不需要很高的技术手法,把别人发布的 App 拿来,拆包之后,加入自己的私货(大部分情况下可能是广告),然后再发布出去供用户下载,就能赚钱了。由于 Android 的开源,加上二次打包成本低,导致这一现象曾经非常猖獗,在 Google Play 排名前 100 位的应用中,有 60% 的应用出现了二次打包版本,而这 60% 的应用中,大部分都是游戏类应用,高 ARPU 游戏,单个安装激活价也比较高。      我当时在广州上班,上海有同事做过这个,但是据我了解到的,他们这种一般也是需要多个人协作的,分配到程序员手里的就是拆包打包的活,工作的可替代性较强,所以其实能赚到的钱也是非常有限的(除非一个人搞定整个链条,那就很有赚头了)。      总之呢,当我还是一个 Android 猿的时候,其实是没有赚到什么外快的,虽然当时国内的一些接单平台都注册了,也经常登录上去看看有没有合适的,但从来没找到合适的。直到变成了一只 Java 猿,事情才有了转机。      下面我从几个不同的方面来和大家介绍接活的一些常见问题。 01  技术栈       当我还是一名 Android 工程师的时候,我每次登录一些接单平台,找 Android 相关的活,但是人家大部分都是希望能够 Android、iOS 以及 Web App 同时做,这就比较麻烦了,你还得学 iOS,要么就是跨平台方案,所以我在 2016 年的时候,还搞了一段时间的 RN,不过跨平台方案不一定适用于有所场景,有的应用没法使用跨平台方案。      如果自己不想学,也可以搞一个团队来做,但是找一个靠谱的搭档其实也挺不容易的,外包赚的是辛苦钱,不一定大家都有这个意愿,而且很多人没接触这个行业,对报价有一些误解,经常乱报,当时有一个在北京总部的同事,做 iOS 的,我联系他,他直接报了一个天价,吓得我再也不敢找他了。      所以当我从 Android 切换到 Java 上之后,我一直在尝试走的路线就是全栈路线,我希望能够做到从前端到后端到架构一个人独立完成,当然这需要我付出巨大的学习成本,事实上我也确实花费了很大的时间去搞定这一套方案,直到今天,我还在继续完善自己的技术栈。      当你能独立搞定前后端这一整套方案,再去接私活就会灵活很多了,价钱、工期、技术栈等等,都有你自己来掌握。      当然,如果你不具备全栈开发的能力,但是有一些长期稳定合作的技术小伙伴,互相之间比较熟悉也比较信任,大家分工合作各司其职,那也可以,每个人的技术压力会小一些,而且技术选型可能也会更加灵活。     **这一块比较忌讳的是临时拉人头,临时凑一个水平参差不齐的团队,项目上线前夕想哭都没眼泪。** 02  接活       接活的话,这个我觉得要分情况。大家经常会在网上看到别人总结的一大堆接活平台,老实说,我几乎所有平台都注册过,但是从来没有接成功过,而且曾经差点被一个厦门的平台坑过,这个我一会和大家说。      在平台接活主要有两方面的问题:1. 平台上的项目规模可能比较大,而且大多需要企业资质,个人开发者生存空间较小2. 互相之间不信任,要通过平台完成付款和验收等操作,这无形中增大了工作量      基于这两点原因,我觉得个人开发者在平台上并不太好接活,那么怎么接?这个时候就考验你的人脉资源了。      松哥做过的几个外包,非常巧合的都是和学校有关,一个是给西藏大学的小程序,一个是给哈尔滨工程大学某老师做的,这两个,一个是我当时的领导给介绍的,另外一个是我高中室友介 绍的,因为哈工程那个老师是我室友在西交大的师兄,除了这两个项目也做过几个国外的项目,国外项目是我在深圳的朋友介绍的。      因为都是朋友介绍的,也都比较信任,这样收款相对来说就要随意很多,事实上我做的几个项目都没遇到过因为项目质量或者尾款扯皮的事,所有事情都比较顺利。而如果是从平台上接的活,那么一般来说要严格签订合同,然后约定付款期限等。      那么平台也有一种比较坑的运作方式,大家要是注册过很多平台可能会遇到这种。有一类平台,当你注册成功之后,他会利用你急着接单的心里,打电话告诉你,他们有许多单需要派发,但是需要你先交会员费(是的,你没看错,你本来是想赚钱的,结果钱没见到,反而先被平台赚了一把),而且这个会员费基本上也不便宜,都得万把块,甚至更多。松哥身边有人掉到这个坑里了,他交了钱之后,平台确实给他派单了,但是都是几百块钱的单子,千把块的单子都很少,他说干个两三年,能回本就不错了。这里的坑就比较多了,我在知乎上也看到过相关的讨论,反正大家如果见到有平台让你先交钱,那么一定要拒绝。 03  报价       报价也是一个技术活,价钱不是漫天要价的,它有一个计算公式,先根据项目的工作量,大致上估算一个工期出来,比如这个项目你预计如果每天干 8 小时,需要 20 天才能完工,那这个 20 天就是工期,然后乘以你目前的日工资,比如你的日工资是 1000 块,那就乘以 1000,然后再上浮 30% 左右作为利润,最终得到的报价就是:`20*1000*1.3=26000`      30% 这个可以根据项目的难易程度,技术含量等灵活调整,一般如果是企业级后台应用的话,其实是没有太多可圈可点的技术点的,都是一些常规技术,所以利润不会太高。      但是大家知道,无论是自己接私活,还是在公司里干活,项目需求都很难一步到位,未来都不可避免的需要更改。一般来说,如果是一些小的变动,我都选择忍。也遇到一些需要大规模更改的,这种该加钱就让加钱,该拒绝就要拒绝,不然累的是自己,而且要重新约定工期。当然,如果签订了合同的话,其实没啥太多问题,按照合同走就行了。 04  合同       合同的话,其实我之前拟定过。做哈工程老师的项目的时候,对方希望能够签订一个合同,那就签订吧。其实我一直觉得如果能签合同最好签,这对双方都有好处。然后我就在网上找了一个合同模版,自己改了下,然后找了一个学法律的同学帮我审了一遍合同,确定没什么问题,发给对方。但是在后来的实际操作中,双方都比较自觉,所以合同其实又放一边了。      大家可以在松哥公众号后台回复 `外包合同` 获取这份合同模版,大家自己以后如果签订外包合同时可以作为参考。 05  小结       总的来说呢,接私活赚到的都是辛苦钱,因为我们要牺牲自己的休息时间,利用休息时间去做事情,而一般能够外包出来的项目也没有特别大的技术含量,所以普遍利润不高,而且也谈不上通过项目自我提升,小打小闹可以,但是如果想把它作为一个长期的事业来做的话,我其实是不太建议的。      长期的话,我觉得大家做一个产品,可能更有赚头一些,例如做一个完整的 erp、一个完整的 crm 或者 cms、wms 等,做一个产品,然后在接活的时候,接同一个领域的活,例如都是 erp、都是 crm ,这样,原本的代码随便改改就能用了,这样,利润就会高很多。也只有这种形式的外包,有赚头。     "好了,小伙伴们有什么兼职接外包的经验,也可以来说说。"关于作者   王松,江湖人称“松哥”出书《Spring Boot +Vue全栈开发实战》,清华大学出版社个人公众号:“江南一点雨”,2019年产出117篇原创技术干货,包含“Spring Boot系列”、“前后端分离系列”、“系列教程等”联系作者添加好友时麻烦请备注来源、公司及名称,谢谢HDZ社区—携手全球开发者 共建开放、创新、多元的开发者社区组织       HDZ是Huawei Developers Zone的英文缩写,是华为开发者生态面向全球开发者建立开放、创新、多元的开发者社区组织。      致力于帮助开发者学习提升、互动交流、挖掘机会,推动ICT、互联网等产业生态的建立和发展。      对云计算、IoT、人工智能、5G、区块链、鲲鹏、昇腾、软件开发与运维、开源等各技术领域感兴趣的开发者、软件工程师、创业者、运营人、产品人、大学生、老师等都可以参与到HDZ。      HDZ秉承开放、创新、多元的社区文化,完全由各地HDZ组织者、志愿者自发组建和领导。华为公司不直接参与HDZ组织建设和领导,只按需对HDZ社区活动提供必要的方向指导、资源支持、活动支撑等,并为各地HDZ组织者提供与全国组织者互动交流的机会。
  • [热门活动] 星云精准测试对安卓底层驱动代码的测试案例分析
    Android原生底层驱动应用面极广,但一直没有很好的办法进行质量追踪。本文借助星云精准测试的高可靠性的测试技术手段,针对Android原生底层驱动进行分析、插桩、编译、采集数据、数据分析等,逐步讲解精准测试是如何实现android原生底层驱动的对接。 在本文中,我们可以清晰地查看到如何进行技术对接的每一步,比如如何使用星云精准测试进行代码插桩、实现测试用例与采集底层驱动运行代码的数据追溯、对最终采集的数据进行一系列分析等。 ## 一、安卓源码精准测试流程概述 经分析android源码的编译主要依靠Android.bp为纽带连接起来;在编译时,只需要在想要编译的模块目录下执行mm命令即可自动的根据当前目录下的Android.bp文件对其所包含的模块进行编译。 ![](https://upload-images.jianshu.io/upload_images/13279626-c47f4b53e8ec7489.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 主要流程大致为:先将ZOA通信库源码复制进去并加入某一层次的Android.bp中,再通过对包含所有Android.bp编译信息的ninja文件的解析可以得到Shell认可的插桩json文件,Shell通过json文件对对应目录的代码进行插桩,插桩完成后,把对ZOA通信库的引用加入该模块的Android.bp中再放入ZoaInstru.h头文件后就可以正常编译出插桩程序了。 ## 二、对安卓源码进行精准测试的准备工具 1.安卓原生8.1.0系统源码,放于/data/source2/目录下 2.shell.tar.gz插桩工具包放于/data/目录下 3.ZOAMQLib通信库源码放于/data/source2/ frameworks/av/目录下 4.谷歌官方装有原生8.1.0系统手机一部 本例是对/data/source2/ frameworks/av/camera模块进行插桩编译,首先source build/envsetup.sh配置环境变量,再lunch后输入2选择aosp_arm64-eng,再mm编译模块 ## 三、精准测试插桩工具部署 在存放精准测试插桩工具包的/data/目录下执行命令 `tar -zxvf shell.tar.gz` 将精准测试插桩工具包解压 `cd /data/shell/bin` 进入shell包bin目录下打开并修改Server.cfg的[SERVER]字段的ip为星云精准测试服务端ip,对[LOCAL]字段的ip,客户端若与服务端在同一主机则保持127.0.0.1,若在不同主机则写明客户端ip。 ## 四、ZOA通信库加入安卓体系 本次选择av模块进行精准测试的插桩编译验证模块,在对av模块进行深入了解后,解析出其Android,bp的连接其结构大致如此,每一个最终节点就代表会生成一个动态库或者静态库。 av大致结构与ZOA通信库加入安卓体系示意图: ![](https://upload-images.jianshu.io/upload_images/13279626-4a69a659abf0f1e5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 注:由于第二层mediadrm模块库目录过多不便展开,但原理又是相同,所以仅对该模块展示骨架信息;绿色部分代表会产生一个库文件,mediadrm只是骨架结构所以未标识。 本次是将写好对应的Android.bp文件的ZOA通信库源代码目录整个复制到av目录下,并在av目录下的Android.bp文件中加入ZOA通信库的目录。 `cd /data/source2/frameworks/av/` 进入av模块 `vi Android.bp` 打开av模块的Android.bp文件,并将ZOAMQLib目录加入其中 ZOA通信库加入av模块的Android.bp图示: ![](https://upload-images.jianshu.io/upload_images/13279626-3600fb2bd0493e87.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 然后在ZOAMQLib目录下直接执行mm命令,编译出安卓体系下的ZOA通信库。 ## 五、插桩编译流程 ### 1.生成json文件 android源码在进行编译时他会将所有的Android.bp中的信息提取出来并添加一些编译信息来生成一个build.ninja文件。该文件中含有编译的模块、源代码和编译参数等信息。 通过android自带的ninja工具可以将该build.ninja文件转化为包含源代码路径、源代码名字和编译参数信息的json文件;再通过工具可以将要插桩模块的部分提取出来生成该模块的插桩json文件 生成json文件的命令: `/data/source2/prebuilts/build-tools/linux-x86/bin/ninja -t compdb g.cc.cc > compile_commands.json` 其中/data/source2/为安卓源代码路径 ### 2.插桩代码 shell编译器可以通过该json文件对该模块进行插桩或还原操作。 插桩代码命令 shell的路径/shell -p json文件的路径/ compile_commands.json 还原代码命令 shell的路径/shell -r json文件的路径/ compile_commands.json 本次插桩与还原命令: ``` /data/shell/bin/shell -p /data/source2/compile_commands.json /data/shell/bin/shell -r /data/source2/compile_commands.json ``` 插桩成功后在客户端重新加载版本数据: ![](https://upload-images.jianshu.io/upload_images/13279626-e1446112f3fb3e18.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ### 3.编译链接 #### 链接通信库 `cd /data/source2/frameworks/av/camera` 进入camera目录下 `vi Android.bp` 打开camera模块的Android.bp文件并在shared_libs中加入ZOA通信库的名字 camera的Android.bp加入ZOA通信库链接图示: ![](https://upload-images.jianshu.io/upload_images/13279626-fb7c76d8024f7e18.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) #### 加入头文件 `cp /data/shell/include/ZoaInstru.h /data/source2/frameworks/av/camera/include/` 将ZOA的头文件加入插桩的camera的头文件夹中 然后就可以按照正常的编译流程来进行编译,执行mm编译该模块。 #### 插桩编译图示: ![](https://upload-images.jianshu.io/upload_images/13279626-39e719412589806d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ## 六、测试方式 本例是将安卓原生8.1.0代码进行插桩后,放入谷歌官方8.1.0系统并获得root权限的手机中进行测试 本次插桩的是av模块的camera部分,所以我们将 camera模块库: `/data/source2/out/soong/.intermediates/frameworks/av/camera/libcamera_client/android_arm64_armv8-a_shared_core/libcamera_client.so` ZOA通信库: `/data/source2/out/soong/.intermediates/frameworks/av/ZOAMQLib/libZOAMQLib/android_arm64_armv8-a_shared_core /libZOAMQLib.so` 这两个库放进手机的/system/lib64/目录中开机进行相机测试。 测试概念图: ![](https://upload-images.jianshu.io/upload_images/13279626-3de1f8bdefc9acfb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 将被测手机开机后用usb线连接到电脑上,采用adb端口映射的方法将程序运行时产生的动态数据传输到星云精准测试工具上,再通过示波器进行波形展示。 数据传输图: ![](https://upload-images.jianshu.io/upload_images/13279626-e3e8778533cef921.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 在星云精准测试工具客户端打开示波器界面,建立测试用例并选择测试用例后点击 开始 并对手机进行相机功能的操作就可以在接收到动态数据并示波器看到波形了。 示波器接收数据图: ![](https://upload-images.jianshu.io/upload_images/13279626-efff5bfab6ee85d2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ## 七、精准测试-基础功能 ### 1.覆盖率 在对测试用例录制完成后就可以在主界面看到覆盖率等相关信息。 在函数列表中随便点开一个函数就可以查看该函数的各项覆盖率。 1.SCO覆盖率 SCO覆盖率即为语句块覆盖率,在函数内顺序执行遇见if、for、while等就算为一个语句块。 SC0覆盖率图示: ![](https://upload-images.jianshu.io/upload_images/13279626-bb3b2c51b808a6a1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 2.MCDC覆盖率 MCDC 修订条件判定覆盖,精准测试中对mcdc做了量化展示,分别统计单一条件个数,针对每一个条件判断是否满足mcdc覆盖如果满足如上图绿色表示条件满足mcdc覆盖,蓝色表示不满足。并对MCDC做了详细信息的展示(选择MCDC覆盖,点击判定,显示MCDC的详细信息) MCDC覆盖率图示: ![](https://upload-images.jianshu.io/upload_images/13279626-95decb3d233a8fa9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 注: 1.覆盖率信息一共有七种,分别为SCO语句块覆率、True、Flase、Both等条件覆盖率、Branch条件分支覆盖率、CDC条件判定覆盖率、MCDC修正条件判定。 2.精准测试默认是不关联源码的,如需要关联源代码使用,请将源码复制到客户端本地,在版本上右键选择修改源码路径,然后添加源码路径来关联源码。 ### 2.函数调用关系图 函数调用图,只有函数调用的关系,能够比较清楚地看清函数调用的层次关系。当点击其中的某个函数时,能显示以该函数为中心,调用该函数的上三层和下三层调用(可点击设置层级进行层级的调整)。 当接收过动态数据后还能将各项数据显示在图像界面中。 ![](https://upload-images.jianshu.io/upload_images/13279626-a636d613a887db4d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ### 3.程序控制流程图 控制流程图基础功能是展示函数的控制流程,即控制流程图,用于表示函数的控制流程、显示测试覆盖率结果、实现半自动高效率测试用例设计,进行逻辑流程查错,以及源码、测试用例和相关文档之间的双向自动追溯等。 ![](https://upload-images.jianshu.io/upload_images/13279626-a40dd5c2973f1b3c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ### 4.简易控制流程图 简易控制流程图功能,以语句块的形式清晰的展示函数内部的控制逻辑,界面上可以直观的看出控制流各节点的测试覆盖情况,在展示中,简易控制流程图还可以通过颜色对每个程序块进行覆盖率标识,在缩略图中整个模块的覆盖率非常直观。(背景色为绿色表示有测试用例覆盖到该块)关联源码后点击语句块可定位到代码具体行。 ![](https://upload-images.jianshu.io/upload_images/13279626-1f891dd5b017cf60.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ### 5.双向追溯 由于精准测试的测试用例与执行过的函数绑定,可以在测试台通过选择不同的测试用例来正向追溯找到它执行过的函数;或者通过选择不同的函数或代码来反向追溯找到执行过它的测试用例。 正向追溯图示: ![](https://upload-images.jianshu.io/upload_images/13279626-e17a3f6aa189eea6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 该正向追溯是通过在左上侧选择测试用例来在下方展示该测试用例运行过的函数 反向追溯图示: ![](https://upload-images.jianshu.io/upload_images/13279626-e9061304eccf1e51.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 反向追溯既可以通过左下角的函数来追溯运行过该函数的测试用例,还可以通过选择代码块来追溯运行过该块的测试用例。 ## 八、精准测试-高级分析功能 ### 1.智能回归测试用例选取 在第一个版本测试完成后对第二个版本进行插桩后就在星云精准测试工具生成了第二个工程版本。此时我们要做的不是立马对新版本进行测试,而是使用我们星云精准测试的回归功能对新插桩的版本进行回归,它会根据版本之间代码的变化的来分析出与该函数相关的测试用例,然后根据测试用例内函数改变的多少进行回归优先级的排序,智能的推荐出需要重新跑的测试用例,以及显示出不需要跑的测试用例。 智能回归示例: cd /data/source2/frameworks/av/camera进入到camera目录下 vi ICamera.cpp打开该源码进行修改 在getParameters函数中加入if(1==1);条件 ![](https://upload-images.jianshu.io/upload_images/13279626-ebc89c40a107b28e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 然后对camera模块进行插桩,再在客户端使用选取回归测试用例功能进行回归 由于getParameters函数内新增条件发生变化,所以运行过该函数的测试用例的回归计数就加一,然后该测试用例就被推荐出来需要重新去跑一遍。 回归图示: ![](https://upload-images.jianshu.io/upload_images/13279626-1836bf2a49e2fb56.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 对精准测试而言,其是采用在测试阶段,将测试用例和它所执行过的函数绑定的方法。在版本迭代时会将上一个版本的测试用例继承下来,通过回归跟上个版本进行比较,哪个函数有了变化,那么与其相关的测试用例的功能都可能会发生变化,所以在回归时会推荐出要重新测试的测试用例;而当一个测试用例里面关联的所有函数都没发生变化时他的功能也不会发生变化,那么此时再去测试一遍该用例是没有意义的事情。所以,在新版本插桩完毕后和以前的进行回归后就可以看出哪些用例需要重新跑哪些完全不用再跑。 ### 2.最后执行时序 该部分是执行插桩程序进行动态数据接收时保存的最后五十个语句块执行的时序关系图 ![](https://upload-images.jianshu.io/upload_images/13279626-4af19fe12fe9bb17.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 它可以点击每一步次序查看执行块的代码 ### 3.聚类分析 聚类算法中个数的设置是需要手动设置的,一般看颗粒度的粗细进行设置。聚类算法是通过测试用例的代码相似程度得出结果的,所以可以帮助我们划分出来有哪些测试用例的代码相似程度比较高, 本次共设计7个测试用例,两次拍照、两次录视频、一次随便侧、一次打开相机、一次打开相机后闲置。 选择分类个数为5后,聚类结果为: ![](https://upload-images.jianshu.io/upload_images/13279626-3612565541876b82.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 切换为图形模式为: ![](https://upload-images.jianshu.io/upload_images/13279626-736b826c0a594527.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ## 10、Web报表 ### 1.覆盖率按日增长曲线图 使用折线图清晰的展现每天该版本覆盖率的变化情况 ![](https://upload-images.jianshu.io/upload_images/13279626-4cb7cd5a6aeaf55c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 左下角雷达图展示了预期的各项覆盖率与实际各项覆盖看的差距 右下角对比了当前版本与最新版本各项覆盖率的差异 ### 2.测试漏洞的智能分析 在一个程序中,往往有成百上千的函数,这些函数有的是关联整个程序核心、有的则是开发人员弃而不用,但一直保留迟迟不肯删除的,针对这些大量的函数,“精准测试”采用通过静态、动态指标的综合分析,在大量的程序函数中,通过计算直接筛选潜在的高危的测试漏洞,通过报表给予展示。 当一个函数复杂度很高但覆盖率却很低的时候其出现风险的概率就可能比较高 ![](https://upload-images.jianshu.io/upload_images/13279626-e904cb065f2288b9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 当函数扇入扇出越大时,意味着其关联函数越多,结合其覆盖率信息也可能是风险较高。 ![](https://upload-images.jianshu.io/upload_images/13279626-712db92bd266a138.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  • [技术干货] Android设备接入华为IoT物联网平台开发实战
    # Android设备接入华为IoT实战 ### 1.开通华为IoT设备接入服务 华为IoT设备接入产品开通 [https://www.huaweicloud.com/product/iothub.html](https://www.huaweicloud.com/product/iothub.html) ![1.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201912/17/133800awqwmxllakevshmj.png) 开通后,接入的是**物联网平台**的控制台,需要点击右上角**设备管理服务**,进入IoT Platform控制台。参考下图: ![3.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201912/17/1338289tzw26hokjq6zvoh.png) ### 2.华为IoT Platform控制台 华为IoT Platform控制台的设备管理页面,可以查看全部设备,当前设备的状态。参考下图: ![2.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201912/17/133848im6ekc5qce8fgsjb.png) #### 2.1 创建设备 进入到设备管理的 **设备注册**页面,点击右上角的 **创建 **按钮。 ![1576498486096-f57ad4a9-a926-4dcc-a8ea-04dd59e59115.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201912/17/133956hnok8eahghxirii6.png) 在弹出框里选择**产品模型**,输入**设备识别码**,点击**确定**按钮。参考下图 ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201912/17/133912i2zbfcott0vmcldj.png) 创建成功,系统会自动生成秘钥。如下图: ![1576484368469-695ac811-2374-48cc-972b-9a7668763cfd.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201912/17/134008tplh6itcuqnuqevn.png) 接下来,我们查看全量设备,会看到刚刚创建的设备,状态为 **未激活。**下参考下图: ![1576484513135-c8c1d396-58ff-46b6-8b11-20c0e7597fe1.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201912/17/134021potfv9clthudzvvi.png) 然后我们点击设备识别码,接入设备详情,开启设备**消息跟踪**服务。华为IoT默认不启动消息跟踪日志,需要手动开启。而且每次最多跟踪3天消息日志,过期后需要再次开启。这里开发联调过程比较痛苦。 ![1576485581846-126f09f5-cc0c-48e7-8b96-5544aa628438.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201912/17/134321os7kr6xzs4lpb6vp.png) #### 2.2 Android设备接入 我们在Android设备上采用Eclipse的paho mqtt库来接入华为IoT平台。通过阅读华为文档,我们知道Connect的参数如下: ![1576498928469-04ed842f-132b-42f8-ac32-69987050b715.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201912/17/134340gtahyjsvdlqbniex.png) 华为IoT平台消息通信的Topic不允许自定义,只能使用默认的上行(/data/),下行(/command/)2个Topic。 ![1576499004395-8ad8c74d-75d1-4e4b-a014-9244adee2b78.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201912/17/134406bngtjpbbgkb7tfqj.png) 核心Connect代码: ```java String targetServer = "ssl://iot-acc.cn-north-4.myhuaweicloud.com:8883"; String timestamp = getHuaweiUTCString(); String mqttclientId = deviceId + "_0_0_" + timestamp; String mqttPassword = HuaweiIoTSignUtil.sign(deviceSecret, timestamp); mqttClient = new MqttAndroidClient(getBaseContext(), targetServer, mqttclientId); MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setMqttVersion(4); connOpts.setAutomaticReconnect(true); connOpts.setCleanSession(true); connOpts.setKeepAliveInterval(120); connOpts.setUserName(deviceId); connOpts.setPassword(mqttPassword.toCharArray()); try { connOpts.setSocketFactory(new HuaweiIoTSocketFactory(getResources().openRawResource(R.raw.rootcert))); } catch (Exception e) { e.printStackTrace(); } final IMqttToken token = mqttClient.connect(connOpts); token.setActionCallback(new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { showToast("MQTT连接成功 ooooo"); } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { showToast("MQTT连接失败 xxxxx"); } }); ``` 上报数据到 /huawei/v1/devices/{deviceId}/data/json ```java MqttMessage message = new MqttMessage(payloadJson.getBytes("utf-8")); message.setQos(1); mqttClient.publish(pubTopic, message); ``` ### 3.设备运行 启动App,输入设备DeviceId和Secret,点击建立连接。如下图 ![1576499610939-bc9af6eb-6543-484b-9162-6173bb5143dc.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201912/17/134441iacisjgylvybchph.png) 点击上报数据,当前页面显示的型号,sdk以及OS信息会上报到云端。在设备详情信息里展示出来。如下图 ![1576499761588-cc0f6910-2909-4d2e-a2cf-40c88ab35d92.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201912/17/134449giyjleqn7y19xi4g.png) 点击断开连接,设备主动下线。控制台设备状态会显示为离线。如下图 ![1576499949385-b13674b1-cdcc-4874-8159-a0b237e6fae2.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201912/17/1345125pug6ajeegd4wg9s.png) 设备整个行为记录,也完整的展示在设备详情的**消息跟踪**里面。如下图 ![1576485704507-1efb48f2-c343-41ac-a84a-9fe9f6ed5fd3.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201912/17/1342537nvbdsh00wul6tkl.png) ![1576498169373-b25d1ed2-70e3-403b-bfe6-ac84b02f484b.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/201912/17/134548g2pqnbvluwxf72av.png)
  • [问题求助] WeLink的Android版本BUG
    我在开发课件播放器的轻应用过程中,由于有全屏需求,而全屏功能调用了浏览器的 Fullscreen API 实现的,在调用了浏览器的 API 后,导致了 Input 文本框无法唤起输入法软键盘,后退页面后的输入法也无法唤起。Bug 重现步骤:1、例如使用 WeLink 扫一扫打开优酷视频网站随便一个视频2、点击全屏按钮让视频全屏,然后再退出全屏3、然后当前的 Android Web 容器下的 Input、Textarea 输入框都无法唤起输入法PS:怎么解决这个问题?1、切换 App 应用然后再返回 WeLink 可以唤起输入法.2、让自己的程序页面中出现系统级的对话框,例如: Alert        
  • [问题求助] 鸿蒙系统的输入法架构和Android一样吗?
    如题
  • [交流分享] Android studio3.4 Unable to resolve dependency问题解决方法
    化鲲为鹏,我有话说超级小白刚入门安卓开发,用的是ecplise,但是听了听一些老师的课程以及翻了些Android入门的书,突然觉得:这都什么年代了,还用ecplise学安卓,太落后了吧。于是我去下载了Android studio比较新的一个版本,3.4版本,并根据网上的教程,一点点安装好,结果没想到,我的噩梦就此来了。不管我以什么方式新建一个新的工程,一编译就出错,困扰了我两天Unable to resolve dependency for ':app@debug/compileClasspath': Could not resolve com.android.support:appcompat-v7:28.0.0.新人小白啥也不懂,就只能到处去百度,去CSDN,结果网上的解决办法一大堆,终究是没有能解决我的问题。最后终于又找到了一篇帖子。https://www.jianshu.com/p/0d0ebb86dd17?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=qq步骤一:在AndroidStudio打开setting,可以从下图的地址中找到自己本地的.gradle文件的路径,然后在该路径下找到gradle.properties文件,并打开步骤二:在gradle.properties中把最后四句用#注释掉,然后重启AS 3.4,终于通过编译了最后,我的问题就终于解决了,哈哈,真开心!落款:云南大学
  • [技术干货] Android app开发对接华为平台总结——附源码
    本帖主要是解决“北向JAVA应用调试(对接电信平台失败)——取消证书校验”中描述的第二个问题:即:JAVA SDK无法在android 平台使用,如何在android平台开发app对接OC平台android  app开发采用的是java语言,华为关于java开发提供了一个Demo和sdk,但是在android平台中无法使用这个SDK进行开发,原因有二:1、SDK中的证书格式是jks,android平台不支持;在android中支持的证书格式是bks;2、SDK中使用的是apache的http框架,该框架在android 6.0中已经废除;无法继续使用;因此,app的开发思路如下:参考JAVA北向Demo,将httpclient部分修改成适配android平台的,推荐使用okhttp或者httpurlconnection;现提供基于okhttp的连接实现,给出基于okhttp的https初始化即鉴权接口,供大家参考:package com.huawei.utils; import android.util.Log; import java.io.IOException; import java.security.KeyStore; import java.util.HashMap; import java.util.Map; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509TrustManager; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class HttpsUtil { public final static String HTTPGET = "GET"; public final static String HTTPPUT = "PUT"; public final static String HTTPPOST = "POST"; public final static String HTTPDELETE = "DELETE"; public final static String HTTPACCEPT = "Accept"; public final static String CONTENT_LENGTH = "Content-Length"; public final static String CHARSET_UTF8 = "UTF-8"; private static OkHttpClient httpClient = null; /**  * Two-Way Authentication In the two-way authentication, the client needs: 1  * Import your own certificate for server verification; 2 Import the CA  * certificate of the server, and use the CA certificate to verify the  * certificate sent by the server; 3 Set the domain name to not verify  * (Non-commercial IoT platform, no use domain name access.)  * */ public void initSSLConfigForTwoWay() throws Exception { // 1 Import your own certificate KeyStore selfCert = KeyStore.getInstance("pkcs12"); selfCert.load(Constant.SelfCertIn, Constant.SELFCERTPWD.toCharArray()); KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509"); kmf.init(selfCert, Constant.SELFCERTPWD.toCharArray()); // 2 Import the CA certificate of the server, KeyStore caCert = KeyStore.getInstance("BKS"); caCert.load(Constant.TrustCAIn, Constant.TRUSTCAPWD.toCharArray()); TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509"); tmf.init(caCert); //llb add for ignor CA verify X509TrustManager truseAllManager = new X509TrustManager() { @Override public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException { } @Override public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException  { } @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new java.security.cert.X509Certificate[0]; //return null } }; //llb end SSLContext sc = SSLContext.getInstance("TLS"); sc.init(kmf.getKeyManagers(), new TrustManager[] { truseAllManager }, null); SSLSocketFactory sslSock = sc.getSocketFactory(); // 3 Set the domain name to not verify try {      httpClient = new OkHttpClient.Builder()                                         .hostnameVerifier(new DefaultHostnameVerifier()) .sslSocketFactory(sslSock, truseAllManager) .build(); } catch (Exception e) {                      Log.e("okhttp init err:",e.toString()); } }         //鉴权接口 public void Login(String httpsUrl){ FormBody formBody = new FormBody.Builder() .add("appId",Constant.APPID) .add("secret",Constant.SECRET) .build(); Request request = new Request.Builder().url(httpsUrl).post(formBody).build(); new Thread(new Runnable() { @Override public void run() { try { Response response = httpClient.newCall(request).execute(); String resLogin = response.body().string(); if (response.isSuccessful()) {     Log.i("LogInRsp",resLogin); } else {     throw new IOException("Unexpected code " + response); } Map data = new HashMap<>(); data = JsonUtil.jsonString2SimpleObj(resLogin, data.getClass()); String accessToken = data.get("accessToken"); Log.i("Token",accessToken); } catch (IOException e) { e.printStackTrace(); } } }).start(); } }由于app刚开始编写,待完善后再开源!
总条数:181 到第
上滑加载中