关于android:FAQ推送服务常见问题及解决方案

一、推送胜利收不到音讯,推送返回:{"message":"success","requestID":"1523868*2842718","resultcode":0}排查步骤: 1、网络不稳固,切换稳固网络进行测试; 2、查看手机是否为EMUI8.0.0零碎,如果是晚期的EMUI8.0,则要降级尝试(在手机会员服务——服务——降级尝鲜),或者用targetversion 26以下的进行编译来躲避这个问题。EMUI版本太低、小于4.1也是不反对的; 3、查看终端token是否正确,在联盟后盾进行推送,如果联盟后盾推送失败则是token已生效,或者手机配置有问题;进行token检查和手机权限设置,如果推送胜利,那么之前失败则是调用接口时参数配置谬误导致; 4、如果是收取告诉音讯失败,查看告诉的playload中的msg、appPkgName等配置是否正确; 5、查看华为挪动服务的缓存问题,尝试革除数据及缓存,并进行华为挪动服务; 6、查看CP是否应用老版本Push,老版本SDK会呈现音讯延时较显著以及收不到推送的状况,需尽快切换到新版本; 7、收集日志(详情见日志抓取方法),参考Push日志解读进行排查。 二、Gettoken返回0,无奈进入onToken函数,无奈收到播送。1、自定义的Receiver是否继承华为PushReceiver; 2、AndroidMainfest配置是否欠缺,请对照现网配置进行查看; 3、保留日志,并发过去; 4、清理华为挪动服务和利用的缓存、数据,重启手机。再进入利用试一下; 5、如果日志中呈现 get token:end 0 和com.huawei.android.pushagent.PushServiceE/PushLog2551: [ReceiverDispatcher-230]responseRegisterTokenFAILED:1(android/PushCommandProcessor.java:557) 示意此处华为挪动服务状态是失常的,然而申请服务器出现异常。查看联盟推送状态是否为“已开明”,状态为开明中则是谬误的。 如果问题还未失去解决能够反复步骤4,筹备日志输入,运行测试利用,打印日志。 三、如何在华为开放平台查看音讯是属于经营音讯还是告诉零碎音讯?咱们推送的时候带了importance字段,然而不能确定该字段是否失效。华为的告诉音讯通过揭示形式来显示该条音讯的类型。importance字段只有在申请自分类权利后能力失效。 申请自分类权利参考:主动权利申请 四、离线角标不显示。1、首先需确认是通过哪种形式应用角标。 第一种:华为提供的音讯体加字段形式,这种形式不论利用在线或者离线,角标都会失常展现。 参考资料:桌面角标 第二种:您在客户端代码设置角标,这种状况,利用离线的状况可能是没有对收到的离线音讯进行解决所以角标没有加上。 参考资料:华为桌面角标开发指导书 2、在确认应用的角标形式后进行排查。 如果应用了第一种,确认离线音讯的音讯体是否有add_num和set_num字段;如果是第二种,需确认收到离线音讯之后是否调用代码加上角标。 五、对于回执问题解决。1、利用设施不在线:损毁,断网,关机,不在服务器等(大多状况); 2、用户敞开推送权限; 3、回执只会发送一次,在网络异样或者服务器异样等状况时会导致申请失败。 六、CP对于https://api.push.hicloud.com域名的应用问题。SDK 2.0 URL:https://api.push.hicloud.com/... ?ha_source=hms1 SDK 3.0+ URL:https://push-api.cloud.huawei...[appId]/messages:send?ha_source=hms1 SDK 2.0 URL是2.0版本应用的接口,能够替换为最新版,替换的同时更新SDK版本到6.7.0,参考最新的文档做好迁徙工作,迁徙实现之后能够测试一下推送性能是否失常应用,有异样及时处理。可参考SDK版本更新阐明:版本更新阐明。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

January 11, 2023 · 1 min · jiezi

关于android:视频实时自然美颜-无惧素颜上镜

华为HMS Core 视频编辑服务依靠本身AI技术的外围劣势,在最新版本HMS Core 6.8.0中上线了全新的视频美颜性能,能对指定图片或视频中的人脸实现磨皮、美白、大眼、瘦脸的美颜成果,实用于直播、相机、视频剪辑、图片解决等场景中,打造独特天然的美颜成果。 HMS Core视频美颜性能在技术上应用CPU+NPU+GPU异构并行框架,反对实时美颜解决,算法跑得更快但零碎功耗升高,50fps+端到端高效解决,能在10ms内实现视频中最多2集体脸(面积占比拟大的2集体)的解决(数据源于华为内部测试)。应用855点浓密五官定位,精准辨认人脸,防止人脸挪动过快或角度过大时,美颜成果变形。针对美颜成果,采纳面部精密分区,联合中性灰天然磨皮,更加天然实在。 另外,为满足用户的更多个性化需要,华为凋谢磨皮、美白、大眼、瘦脸美颜成果的多级调节性能,用户可依据需要自行调节成果,助力开发者以较低成本开发优良的视频美颜成果。 美颜成果 上面咱们就一起来实操一下如何接入华为视频编辑服务,实现视频美颜性能。 开发步骤1. 开发筹备具体筹备步骤可参考华为开发者联盟官网。 2. 集成筹备设置利用的鉴权信息。能够通过api_key或者Access Token来设置利用鉴权信息。 (举荐)通过setAccessToken办法设置Access Token,在利用启动时初始化设置一次即可,无需屡次设置。 HVEAIApplication.getInstance().setAccessToken("your access token");获取Access Token可参见基于OAuth 2.0凋谢鉴权客户端模式。 通过setApiKey办法设置api_key,在利用启动时初始化设置一次即可,无需屡次设置。 HVEAIApplication.getInstance().setApiKey("your ApiKey");当您在AppGallery Connect上注册您的利用时,会给您的利用调配api_key,可参见增加以后利用的AppGallery Connect配置文件。 留神:请勿将api_key硬编码在代码中,同时不要将api_key存储在利用的配置文件中。建议您将api_key存储在云侧,运行时获取。 3. 美颜性能集成// 创立美颜算法类实例HVEAIBeauty hveaiBeauty = new HVEAIBeauty(); // 初始化美颜AI算法引擎hveaiBeauty.initEngine(new HVEAIInitialCallback() { @Override public void onProgress(int progress) { // 初始化美颜AI算法引擎进度 } @Override public void onSuccess() { // 初始化美颜AI算法引擎胜利 } @Override public void onError(int errorCode, String errorMessage) { // 初始化美颜AI算法引擎失败 }}); // 初始化美颜算法opengl运行环境,需在opengl渲染线程里调用hveaiBeauty.prepare(); // 设置需美颜解决的纹理的宽高(textureWidth:纹理的宽;textureHeight:纹理的高),初始化或纹理有变动后调用,需在opengl渲染线程里调用// resize参数为须要解决的纹理宽高,取值须要大于0hveaiBeauty.resize(textureWidth, textureHeight); // 美颜参数配置,磨皮,美白,瘦脸,大眼,亮眼, 美颜水平范畴:[0, 1]HVEAIBeautyOptions options = new HVEAIBeautyOptions.Builder().setBigEye(1) .setBlurDegree(1) .setBrightEye(1) .setThinFace(1) .setWhiteDegree(1) .build(); // 更新美颜参数,初始化或有批改后更新hveaiBeauty.updateOptions(options); // 进行美颜解决,在opengl渲染线程里每帧调用,(inputTextureId:输出的纹理ID;outputTextureId:输入的纹理ID)// 请确保输出正向朝上的人脸的纹理。int outputTextureId = hveaiBeauty.process(inputTextureId); // 开释美颜AI算法引擎hveaiBeauty.releaseEngine();HMS Core视频编辑服务除了反对视频美颜,还提供根底视频编辑、专属滤镜、一键染发、人物追踪、AI着色、动静照片、精彩片段、一键动效、人脸遮挡、一键微笑、指标宰割等视频创作能力,开发者可根据利用场景,在App中轻松实现视频性能的集成。 ...

January 10, 2023 · 1 min · jiezi

关于android:首款通过-机器学习服务活体检测算法荣获CFCA权威安全认证

随着人脸识别技术在金融、医疗等多个畛域的减速落地,网络安全、信息泄露等问题愈为突出,用户对利用稳定性和安全性的要求也更为严格。为保障各行业高效稳固的开展业务,提前发现和应答潜在平安危险,华为 HMS Core 机器学习服务(ML Kit)继续演进人脸检测能力,一直加强对于非活体攻打的防御能力和活体通过率。通过海量样本集训练,人脸活体辨认精度及速度失去无效晋升,同时华为对活体检测SDK进行平安加固,并委托中国金融认证核心(CFCA)对ML Kit活体检测进行了全方位的平安能力测评。 算法认证 软件平安认证 中国金融认证核心(CFCA),是经中国人民银行和国家信息安全管理机构批准成立的国家级权威的平安认证机构,是国家重要的金融信息安全基础设施之一。目前,ML Kit活体检测曾经通过了CFCA算法测试和软件平安测试,获得了央行人脸识别金融领取加强级认证,成为首个通过CFCA权威测评的离线RGB活体检测算法。 根据2019年1月中国人民银行公布的《人脸识别技术线下领取平安利用标准(试行)》(以下简称“标准”),其中对活体检测的性能指标提出了更高要求(如下图所示),只有当FAR<0.1%,FRR<1%,活体性能能力达到加强级。 在人脸识别利用中,活体检测算法能通过眨眼、凝视、张嘴、左/右点头、拍板等组合动作,应用人脸关键点定位和人脸追踪等技术,通过间断的图片,计算变动间隔与不变间隔的比值,进行上一帧图像与下一帧图像的比照,实时判断用户是否为实在活体。可无效抵挡照片、视频、面具、遮挡以及屏幕翻拍等常见攻打伎俩,从而帮忙用户甄别欺诈行为,保障用户利益。此外,在应用动作活体检测能力过程中,针对遮挡和光线不佳等检测场景,反对疏导检测,如及时展现“暗光提醒”、“人像含糊”“墨镜、口罩遮挡”、“人脸过近、过远”等提示信息,实现更加敌对的交互体验 为了严格落实检测标准规范,CFCA具备非常齐备的测验体系,检测范畴也相当全面。此次测评中,评估内容包含但不限于数据与通信安全、交互平安、代码和组件平安、软件运行时平安、业务性能平安等我的项目。用于测试的人脸图像样本更是极具多样化,涵盖了照片、视频、面具、头模、真人等模式,波及了采集设施、样本材质、光照环境、表情、肤色等影响因素。本次测试场景笼罩高达4000多个,可适配金融近程开户、酒店办理入住、刷脸闸机通行、电商用户认证、社交直播、线上考试等不同畛域的理论利用场景。 通过50000屡次检测, ML Kit活体检测能力在抵挡口罩遮挡、抠洞照片、高清视频、硅胶人脸面具、3D头模、反抗样本攻打等多种攻打伎俩时均表现出色,防御能力达到认证规范。不论是二维假体攻打,还是三维假体攻打,ML Kit活体检测都能够实现精准辨认,疾速拦挡。 此次平安测试的通过,体现了国家权威机构对华为ML Kit活体检测能力的认可,也是华为ML Kit活体检测能力平安合规的无力证实。 目前,ML Kit活体检测服务已宽泛使用于华为外部外围业务线及内部各行业客户的账户平安、身份核验、金融风控等业务环节中,全方位保障用户体验及信息安全。华为ML Kit将继续深耕人工智能前沿技术,提供高安全性、高通过率、高易用性的活体检测服务,助力开发者高效构建各场景人脸识别利用。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

January 4, 2023 · 1 min · jiezi

关于android:Flutter异常监控-壹-从Zone说起

如果你正须要解决Flutter异样捕捉,那么祝贺你,找对地了,这里从本源上给你筹备了Flutter异样捕捉须要是所有常识和原理,让你更粗浅意识Flutter Zone概念。 Zone是什么/// A zone represents an environment that remains stable across asynchronous/// calls.SDK中形容:示意一个环境,这个环境为了保持稳定异步调用。 艰深了解39 | 线上呈现问题,该如何做好异样捕捉与信息采集?中形容: 咱们能够给代码执行对象指定一个 Zone,在 Dart 中,Zone 示意一个代码执行的环境范畴,其概念相似沙盒,不同沙盒之间是相互隔离的。如果咱们想要察看沙盒中代码执行呈现的异样,沙盒提供了 onError 回调函数,拦挡那些在代码执行对象中的未捕捉异样。Zone创立Dart提供了runZoned办法,反对Zone的疾速创立 R runZoned<R>(R body(),   {Map<Object?, Object?>? zoneValues,    ZoneSpecification? zoneSpecification,    @Deprecated("Use runZonedGuarded instead") Function? onError}) {zoneValues: Zone 的公有数据,能够通过实例zone[key]获取,能够了解为每个“沙箱”的公有数据。zoneSpecification:Zone的一些配置,能够自定义一些代码行为,比方拦挡日志输入和谬误等Zone的作用捕捉异样import 'dart:async';//OUTPUT:Uncaught error: Would normally kill the programvoid main() { runZonedGuarded(() { Timer.run(() { throw 'Would normally kill the program'; }); }, (error, stackTrace) { print('Uncaught error: $error'); });}用try catch一样能够捕捉,为啥要通过Zone来捕捉? ...

December 31, 2022 · 2 min · jiezi

关于android:有声小说源码付费小说网站源码带支付系统开源小说站源码全自动采集

 读书是一个人能够领有的最好的习惯之一。浏览能够减少创造力和想象力。它还能够帮忙您减少记忆力和词汇量。然而一个人得不到他/她想读的书。因而,应用软件开发公司制作的应用程序在线浏览书籍能够帮忙他们,因为他们能够在网上找到各种书籍。几天前,我发现了有声小说网站源码我的项目——同一个库,应用同一个数据库,但能够通过浏览器拜访。 有声小说源码:xsymz.icu 我的想法是不再将书籍存储在设施中中,而是在挪动设施上和通过浏览器应用其电子书阅读器,但依然可能从任何中央拜访我的图书馆,并领有书籍的浏览地位同步性能。当初我的库自身存储在云端中,我将在我的 Android 设施上应用有声小说源码。 NGINX,让咱们加密 NGINX + Let's Encrypt 设置已在明码管理工具中形容:组织的明码管理器自托管版本装置在 AWS EC2帖子中。 口径网络启动 查看云存储下的库目录,咱们的有声小说源码将应用该目录: $ ll /data/cloud/app/data/setevoy/files/Books/CALIBRE/ | headtotal 1212drwxr-xr-x 3 www-data www-data 4096 Dec 13 07:53 A. A. Orlovdrwxr-xr-x 7 www-data www-data 4096 Dec 13 07:53 A. Avramienkodrwxr-xr-x 3 www-data www-data 4096 Dec 13 07:55 A. Bielashdrwxr-xr-x 3 www-data www-data 4096 Dec 13 07:55 Adol_f Gitlierdrwxr-xr-x 3 www-data www-data 4096 Dec 13 07:55 Al_bier Kamiu... 应用有声小说源码运行一个 Docker 容器,将库的目录装置在外面/books: ...

December 30, 2022 · 2 min · jiezi

关于android:mitmproxy篇一安装使用

mitmproxy简介mitmproxy 就是用于 MITM 的 代理(proxy), 而MITM,也就是(Man-in-the-middle attack)中间人攻打,指的就是通过各种技术手段将入侵者的一台计算机(或服务器)虚构搁置在网络连接的两台计算机之间。(SMB会话劫持、DNS坑骗等)计算机互相通信的申请响应过程均能够被拦挡获取,在中间人攻打中,攻击者将本人伪装成每一个参加会话的终端,且不被其余终端识破,攻击者能够拦挡通信单方的通话并插入新的内容。装置第三方库pip install mitmproxy检测是否装置胜利mitmproxy --versionWindows装置证书 用户的目录下(启动mitmdump就生成了)双击mitmproxy-ca-cert.p12抉择本地计算机,一路next抉择受信赖的根证书,装置实现测试抓包 启动两个命令行窗口,一个启动mitmproxy,一个通过curl发送一个申请mitmproxy -p 8889curl --proxy http://127.0.0.1:8889 https://www.baidu.com --ssl-no-revoke能够看到曾经抓到包了,单击链接能够查看申请和响应内容抓取本地网页内容时,记得关上本地代理,端口本人设置Android证书须要装置到系统目录下,如果装置在用户目录下会导致局部app抓不到包手动装置到系统目录 1.手机或模拟器须要有root权限2.将mitmproxy-ca-cert.pem重命名,以openssl获取到的名字与.0为后缀的文件openssl x509 -inform PEM -subject_hash_old -in mitmproxy-ca-cert.pem -noout没有openssl能够去官网下载安装 https://oomake.com/download/o...3.将文件传入手机adb push c8750f0d.0 /sdcard4.将文件放到零碎证书目录下mv /sdcard/c8750f0d.0 /system/etc/security/cacerts5.如果报错没有权限,能够批改system文件权限chmod 777 system6.查看是否装置胜利设置->平安->信赖的凭据->零碎测试抓包1.设置代理2.启动mitmproxymitmproxy -p 80803.启动app-抓包胜利

December 29, 2022 · 1 min · jiezi

关于android:个推支持小程序消息推送助力开发者实现用户高触达高转化

随着小程序技术和利用场景的不断完善,越来越多的开发者搭建了小程序平台,为用户带来更“轻量”的服务。在小程序用户迅猛增长的同时,开发者对于小程序用户精细化触达的需要也更加强烈。近日,个推音讯推送上线了小程序推送性能,帮忙开发者高效地连贯小程序用户群体,晋升用户沉闷、留存和转化。 个推小程序推送提供功能完善、集成简略、使用方便的SDK解决方案,满足小程序开发者多渠道、多互动场景下的用户连贯需要。通过个推小程序推送的在线+离线组合推送策略,开发者既能够在小程序在线时下发音讯,实现音讯毫秒级送达,也能够通过“离线模板音讯”的模式对用户进行触达,最大化晋升经营成果。在进步用户触达“量”的同时,个推小程序推送也反对开发者结合实际业务场景自助创立用户标签,实现精细化人群洞察、圈选、触达,晋升用户触达的“质”。 此外,个推小程序推送还提供“模板治理”能力,帮忙开发者高效治理小程序模板音讯,优化音讯转化内容与门路,让用户一站式实现内容的获取和生产,造成转化闭环。 除了小程序外,个推音讯推送还高效整合了APP、Web、H5、短信等多推送渠道,并提供音讯多渠道并发、散发、补发策略以及多维度的数据统计报表,帮忙开发者实现多渠道灵便组合推送,晋升整体经营能力。 作为国内挪动推送畛域的晚期进入者,个推十余年来继续专一推送技术的翻新与实际,帮忙开发者开掘更广大的增长空间。比方,个推在与华为、小米、OPPO、vivo、魅族等厂商单干的根底上,往年又与光荣达成单干,进一步增强个推音讯推送的厂商推送能力,晋升音讯达到率。同时,为了帮忙开发者高效开辟海内市场,个推推出了海内音讯推送解决方案,高效整合海内音讯通道,促成APP海内业务快速增长。 在新技术、新玩法、新场景不断涌现的当下,个推还将继续深耕行业利用实际、优化产品技术能力,帮忙更多开发者实现与用户多平台、场景化的互动沟通,独特推动挪动互联网畛域翻新倒退。

December 29, 2022 · 1 min · jiezi

关于android:APP自动化工具uiautomator2

一、介绍uiautomator2是uiautomator的升级版,uiautomator是Google开发的一款用来做安卓自动化测试的Java库,uiautomator2则是将uiautomator中的接口封装成了Python库。因而它反对的语言为Python长处次要概括如下: 环境搭建简略不便 执行速度很快 UI元素定位便捷好用、可视化好 获取toast非常简单二、环境部署1、装置adb并配置环境变量(这个就不多讲了,装置很简略)2、装置python的uiautomator2库 pip install uiautomator23、装置atx-agent python-m uiautomator2 init这一步的目标是从github上下载atx-agent,推送到手机,作为服务端,因而先要保障adb能够链接到手机或者模拟器装置胜利后,能够看到模拟器桌面呈现一个小汽车图标,这个就是atx.apk如果装置失败,能够手动装置这是网上找的一个教程:https://blog.csdn.net/qq_24741027/article/details/1180520754、装置weditor pip3 install weditorweditor是基于浏览器的UI元素查看器如果装置报错,官网解决方案为:通过git将weditor文件拉到本地装置,通过测试并未装置胜利git clone https://github.com/openatx/weditorpip3 install -e weditor通过屡次测试起因是python版本和weditor版本不统一我用的python是3.9.6,weditor目前最新版本是0.6.7应用weditor==0.6.4版本装置胜利pip install weditor==0.6.4装置好后,在命令行输出 python -m weditor 会主动关上浏览器,在页面上输出模拟器的设施序列号,点击Connect,而后点击Dump Hierarchy刷新,能够看到模拟器的界面留神:(集体遇到的问题)装置好启动命令行会有编码问题,site-packages\weditor\web\handlers下的shell.py文件,依据相应的报错将byte转换为字符串三、操作示例链接手机或者模拟器(链接形式有多种,ip、端口、或者设施号) import uiautomator2 as u2d = u2.connect("127.0.0.1:62001") connect("10.0.0.1:7912")connect("10.0.0.1") # use default 7912 portconnect("http://10.0.0.1")connect("http://10.0.0.1:7912")connect("cff1123ea") # adb device serial number 检测是否链接胜利,打印d.info能够取得设施信息代表链接胜利 关上app,而后打印d.info,失去的后果里的currentPackageName即是包名启动指定的app,其语法是: d.app_start("指定的包名")默认的这种办法是先通过atx-agent解析apk包的mainActivity,而后调用am start -n $package/$activity启动d.app_start("指定的包名", use_monkey=True)当第一种形式打不开app时,应用第二种打开方式应用 monkey -p com.example.hello_world -c android.intent.category.LAUNCHER 1 启动这种办法有个副作用,它主动会将手机的旋转锁定给关掉关上weditor UI查看器 python -m weditor鼠标挪动到搜寻点击一下,能够看到有多种定位形式可抉择,例:resourceId、xpath、text 隐性期待语法 d.implicitly_wait(期待时长) 单位是s,默认20秒每一步操作须要加上等待时间,因为下一步的元素控件并不会立刻呈现隐性期待只须要加一次,全局通用,在期待时长内元素呈现就会进行下一步操作,而不像强制期待始终要等够设置的时长。因而隐性期待绝对比拟节约工夫元素定位形式示例 resourceId定位形式d(resourceId='com.xxx.client.android:id/xxx').click()xpath定位形式d.xpath('//*[@resource-id="com.xxx.client.android:id/xxx"]').click()依据文本内容定位d(text="关注").click()而后能够应用get_text()办法拿到文本值,应用assert进行断言assert d(text="关注").get_text() == "关注"点击定位d.click(0.341, 0.188)输出内容d.send_keys("大米")获取屏幕尺寸d.window_size()滑屏操作 ...

December 27, 2022 · 1 min · jiezi

关于android:钉钉-ANR-治理最佳实践-定位-ANR-不再雾里看花

作者:姜凡(步定) 本文为《钉钉 ANR 治理最佳实际》系列文章首篇《定位 ANR 不再雾里看花》,次要介绍了钉钉自研的 ANRCanary 通过监控主线程的执行状况,为定位 ANR 问题提供更加丰盛的信息。 后续将在第二篇文章中讲述钉钉基于剖析算法得出 ANR 归因,上报到 ANR 归因监控平台,帮忙研发人员更快更精确的解决 ANR 问题,并总结钉钉 ANR 实战踩坑与经验总结 置信大家对 Android 的 ANR 问题并不生疏。钉钉作为一个用户数超 5 亿,服务着 2100 万家组织的产品,基本上其余 App 遇到的 ANR 问题,咱们都会遇到。 和大家一样,咱们最后在剖析 ANR Trace 日志的时候,都会不禁狐疑上报的堆栈是否真的有问题,总有一种雾里看花的感觉。 本系列文章次要介绍钉钉在 ANR 治理过程中的思考方向,工具建设,典型问题等,心愿可能通过本次分享,为有 ANR 治理诉求的团队提供肯定的参考。 术语表 零碎 ANR 残缺流程零碎 ANR 残缺流程能够分为如下三个局部: 超时检测ANR 信息收集ANR 信息输入对于超时检测的逻辑,业界曾经有比拟具体的论述,此处不再赘述。重点聊聊检测到超时之后的解决逻辑。具体源码能够参见:ProcessRecord.java,ANR 信息收集和 ANR 信息输入两个流程图如下: 如上图所示,从零碎源码中,失去的启发有: ANR Trace 的堆栈抓取机会是滞后的,其堆栈不肯定是 ANR 根因。System Server 会对多个过程发送 SIGQUIT 信号,申请堆栈抓取的操作。 收到 SIGQUIT 不代表以后过程产生了 ANR ,可能是手机里有一个其余的 App 产生了 ANR,如果不进行 ANR 的二次确认,就会导致 ANR 误报。App 能够通过过程 ANR 谬误状态感知产生了前台 ANR 。守株待兔的 ANR Trace ...

December 27, 2022 · 3 min · jiezi

关于android:Web应用怎样获取Access-Token

1.在联盟创立服务器利用参考文档:开发筹备 2.获取用户级Access Token2.1 获取code 参考文档:接入华为帐号获取凭证 2.1.1 先依照跳转链接进行配置url https://oauth-login.cloud.huawei.com/oauth2/v3/authorize?response_type=code&access_type=offline&state=state_parameter_passthrough_value&client_id=APP ID&redirect_uri=利用的回调地址&scope=openid+profile接口的形容和参数如下表所示: 示例:创立测试的App 传入url: https://oauth-login.cloud.hua... 2.1.2 用户登录并受权 当申请跳转到OAuth服务,OAuth服务会疏导用户进行受权,弹出受权页面给用户,显示利用的名称和图标以及该利用所申请受权的scope权限列表,输出华为帐号及明码实现登录受权。 2.1.3 OAuth服务将响应值通过回调地址redirect_uri回调给利用。 如果用户批准受权,则回调申请中带有受权码code。 https://www.thirdwebdemo.com/redirect_url?code=<返回的受权码code>如果用户不批准受权,则回调申请中蕴含谬误音讯。 https://www.thirdwebdemo.com/redirect_url #error=1107&error_description=access+denied2.2 通过code获取Access Token 参考文档:获取凭证Access Token Authorization Code只有5分钟有效期,并且用完一次就会生效,请从新由用户受权,生成Authorization Code。 2.2.1 接口阐明 2.2.2 间接通过code获取access_token、refresh_token 备注:通过2.1.3获取的code须要UrlDecode后再应用 Postman申请示例: 申请示例: POST /oauth2/v3/token HTTP/1.1Host: oauth-login.cloud.huawei.comCache-Control: no-cachePostman-Token: 923683a5-7379-03f5-b83f-072ba217fc65Content-Type: application/x-www-form-urlencodedgrant_type=authorization_code&code=DwEEABlWuXdOMrHWphJ7ixKxqkMiTfdoFX11KIcY0CP8gL2Qq5b5MNZpGtPWHKK5KBHm6u6KDP1BXq8JRunU4xIz4DV2zbdGCzEPCbuRaDz%2FzgbzWV6ty2K1TcbToSEdDszr1to17JbGiI5yM7oUx5kEf200rCvVBEGWy8a%2BBCADZ8%2BWPAAEd2O%2BUnjqoAhDSjs2s3ate0heX3DFAUrtwIOcZLCK%2FWby%2BU2oD2eaXX0CXhBNY5PE0nzBLxr4%2B5%2BYH%2BFh8%2BSssOl3repWjH0bxni8iQ%3D%3D&client_id=107408391&client_secret=caa9b93ef209bcb8f754a5742b7d617d5db2bd5901ae8656b60e79cca93825f8&redirect_uri=https%3A%2F%2Fwww.thirdwebdemo.com%2Fredirect_url2.2.3 通过refresh_token获取access_token code的有效期只有5分钟,refresh_token的有效期半年,access_token的有效期1个小时。不倡议每次都获取code来换取access_token,能够间接保留refresh_token,再应用refresh_token换access_token的形式。 申请示例: POST /oauth2/v3/token HTTP/1.1Host: oauth-login.cloud.huawei.comCache-Control: no-cachePostman-Token: 53d26c97-c7d8-3d49-042a-db7a4b2768a5Content-Type: application/x-www-form-urlencodedgrant_type=refresh_token&client_id=107408391&client_secret=caa9b93ef209bcb8f754a5742b7d617d5db2bd5901ae8656b60e79cca93825f8&refresh_token=DAECANR5QD9Ta3YKIn2Pwpmq8g6CyOGcsz3iNsxq8YXBpZs6EGlqb%2FM8Iyc%2FXVORdoqb%2FaZXKs9jqz72kQCmp9Om%2B7%2Fp7ff6QfH%2FKN32GwsE9xq%2BTbDT3 获取利用级Access Token 参考文档:客户端模式(Client Credentials) 申请示例: POST /oauth2/v3/token HTTP/1.1Host: oauth-login.cloud.huawei.comCache-Control: no-cachePostman-Token: 1e120cb0-fa6f-e622-1bf0-66a13c82b643Content-Type: application/x-www-form-urlencodedgrant_type=client_credentials&client_id=107408391&client_secret=caa9b93ef209bcb8f754a5742b7d617d5db2bd5901ae8656b60e79cca93825f8理解更多详情>> ...

December 27, 2022 · 1 min · jiezi

关于android:HMS-Core-3D流体仿真技术打造移动端PC级流体动效

挪动设施硬件的高速倒退,让游戏行业产生天翻地覆的变动,许多酷炫的游戏成果不再局限于电脑端,玩家在挪动端就能享受到场景更真切、画质更清晰、体验更晦涩的游戏服务。但因为挪动设施算力有余,为了实现真实感的水体成果,很多游戏厂商采纳预计算的办法缩小实时仿真的计算开销,但水体场景在挪动端的流体成果依然不佳。 真实感水体的模仿始终是图形学和游戏开发畛域的难点问题,对硬件算力要求也很高,因而大多数实在的水体模仿场景只呈现在PC和主机游戏中。为了解决挪动端水体流动真实感的问题,晋升开发者利用开发的效率,HMS Core图形引擎服务(Scene Kit)推出了3D流体仿真技术,无效解决3D流体动效在挪动设施上的实时性和功耗的问题。 3D流体仿真技术流体力学中流体的静止能够用偏微分方程示意,该方程称为纳维-斯托克斯(NS)方程,如公式(1)所示 █((∂ u )/∂t=g -1/ ∇p +∇⋅∇u -u ⋅∇u # (1) )该方程形容了流体动量变动与流体外部的压力(1/ ∇p)、粘滞力(∇⋅∇u )以及重力( g )之间的关系。流体力学中对流体静止有拉格朗日和欧拉两种形容办法,拉格朗日形容用粒子形式对流体建模,每个粒子上携带流体的状态信息在空间中流动;欧拉形容把仿真区域划为空间中的网格,每个网格上存储流过该地位的流体的状态信息。如图2所示。 图2 欧拉形容与拉格朗日形容 模仿实在的流体成果须要大量的粒子或者网格,数量可达到十万、百万级别,但应用CPU串行计算的形式仿真须要几秒能力实现一帧数据的计算,无奈满足实时性要求。而GPU在高性能并行计算畛域有着微小劣势,因而在HMS Core图形引擎服务中,咱们利用GPU减速技术在挪动设施上实现流体仿真。 不过,仅通过GPU硬件加速不能齐全满足挪动设施上流体实时仿真的要求,还须要晋升GPU的运行效率,以及缩小仿真的计算量,从而升高GPU的负载以及带宽的应用,防止高负荷高带宽运行导致的设施发烫等体验问题。在流体静止的两种形容办法中,拉格朗日办法因为粒子状态受四周其它粒子的影响,计算时须要先搜寻邻域粒子,这个过程对并行计算不够敌对,难以施展并行计算的劣势。而欧拉形容中的每个网格状态数据的计算过程都是雷同的,更适宜并行计算。因而为了晋升GPU的并行效率,HMS Core图形引擎服务采纳欧拉办法进行流体仿真。 采纳欧拉办法构建流体模型,先将仿真区域划分成平均的网格,结构出流体的速度场、密度场等数据。如图3所示。 图3 红点示意密度、压强数据的存储地位,红色箭头示意速度场数据 彩色网格是密度场网格,速度场网格在密度场网格根底上沿x、y方向进行半个网格偏移(蓝色网格),密度存储在密度场网格中心点,速度场数据存储在密度场网格顶点上,同时也是速度场网格中心点,这种模式能够很不便的实现核心差分计算,理论计算时须要将速度场按维度拆分。再引入有向间隔场(SDF)数据形容流体的边界,实现流体与边界的碰撞成果。如图4所示。 图4 密度场网格,棕色区域示意固体边界,蓝色区域示意流体,红色区域示意空气。 在流体模型构建实现后,再利用后面提到的纳维-斯托克斯(NS)方程进行仿真计算,计算过程包含求解重力、压强、粘度、对流4步,别离对应公式(1)中等号左边的四项。 压强和粘度求解过程简单,通过大量优化将求解过程简化为线性方程组的求解,从而升高计算复杂度,缩小计算量。方程组求解采纳疾速收敛的解法,同时进行精度取舍从而升高计算开销。数据存储格局的优化,也达到升高GPU带宽应用、进步GPU cache命中率的成果。 求解对流项时,须要思考流体与固体边界的碰撞,图形引擎服务采纳一种对立建模的形式形容空气、流体、固体网格,如图5所示。 图5红色示意在边界内部,灰色区域示意边界,绿色区域示意边界外部 这样在计算时能够对立解决全副网格,无需对流体、固体区域别离计算,能够缩小计算逻辑,晋升GPU线程的运行效率。 通过以上多种技术办法,HMS Core图形引擎服务实现了GPU运行效率的晋升以及流体仿真计算量的升高,从而在挪动设施上实现了较低功耗的3D流体实时仿真。再联合图形渲染的其余能力,最终在挪动设施上可能实现3D流体的流动、飞溅、反射、折射等成果,让用户手机不发烫,还能领有实时晦涩的流体体验。 3D流体仿真技术来自华为2012实验室,通过HMS Core图形引擎服务向开发者凋谢。HMS Core图形引擎服务致力于为开发者提供高性能、低功耗的引擎服务,帮忙开发者制作高品质的3D利用,赋能更多利用走入数字世界。 其余更多对于HMS Core图形引擎服务的信息,请拜访华为开发者联盟-HMS Core图形引擎服务官网。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

December 26, 2022 · 1 min · jiezi

关于android:Android源码定制5root指纹定制与抹除

1.前言本文为源码定制学习的root指纹抹除篇,通过本文的学习,读者能够把握Android指纹的根本定制能力和root定制能力,本文参考了看雪大佬利用root检测通杀篇,为试验记录笔记。有问题,能够一一指出: 本文第二节次要讲述基本原理 本文第三节次要讲述试验 本文第四节次要为总结 2.基础知识2.1 指纹解析须要对Android指纹进行批改,最重要是明确build.prop的参数含意,这里截取网上文章中的一部分,不便大家了解: # begin build properties (开始设置零碎性能)# autogenerated (通过设置造成零碎信息)ro.=GRI40 (版本ID)ro.build.=GRJ22 (版本号)ro.build.version.incremental=eng.buildbot.20110619.060228 (版本增量)ro.build.version.sdk=10 (sdk版本)ro.build.version.codename=REL (版本代号)ro.build.version.release=2.3.4 (Android 2.3.4零碎)ro.build.date=Sun Jun 19 06:02:58 UTC 2011 (制作者及制作工夫)ro.build.date.utc=0ro.build.type=user (编译模式,如user,userdebug,eng,test模式)ro.build.user=buildbot (编译账户)ro.build.host=bb1 (编译主机零碎)ro.build.tags=test-keys (编译标签)ro.product.model=HTC Wildfire (HTC外部手机代号)ro.product.brand=htc_wwe (手机品牌)ro.product.name=htc_buzz (手机正式名称)ro.product.device=buzz (采纳的设施)ro.product.board=buzz (采纳的处理器)ro.product.cpu.abi=armeabi-v6j (cpu的版本)ro.product.cpu.abi2=armeabi (cpu的品牌)ro.product.manufacturer=HTC (手机制造商)ro.product.locale.language=zh (手机默认语言)ro.product.locale.region=CN (地区语言)ro.wifi.channels= (WIFI连贯的渠道)ro.board.platform=msm7k (主板平台)# ro.build.product is obsolete; use ro.product.device (旧代码ro.build.product,应用代码ro.product.device)ro.build.product=buzz (建设产品)# Do not try to parse ro.build.description or .fingerprint (不要试图批改description和fingerprint)ro.build.description=passion-user 2.3.3 GRI40 102588 release-keys (用户的KEY)ro.build.fingerprint=google/passion/passion:2.3.3/GRI40/102588:user/release-keys (零碎指纹)# end build properties (性能代码结束)## system.prop for buzz (零碎技术支持由BUZZ提供)## Density in DPI of the LCD of this board. This is used to scale the UI (高密度的液晶的DPI板。这是用来大规模UI的)# appropriately. If this property is not defined, the default value is 160 dpi. (appropriately.如果这个属性没有定义,缺省值是160 dpi的分辨率)ro.sf.lcd_density=240 (显示屏分辨率,数值越大分辨率越底,240就是800*480的)# View configuration for QVGA. (屏幕的设置)view.fading_edge_length=8view.touch_slop=15 (触摸屏灵敏度,数值越大越灵活)view.minimum_fling_velocity=25 (滑动速度)view.scroll_friction=0.008 (滑动误差)# RIL specific configuration. (特定设置)rild.libpath=/system/lib/libhtc_ro.ril.ecc.HTC-WWE=999ro.ril.ecc.HTC-ELL=92,93,94ro.ril.enable.a52.HTC-ITA=1ro.ril.enable.a53.HTC-ITA=1ro.ril.enable.a52=0ro.ril.enable.a53=1ro.ril.vmail.23415=1571,BTro.ril.hsdpa.category=8 (hsdpa全称High Speed Downlink Packet Access中文意思:高速上行分组接入,设置的数越大传输越快)ro.ril.htcmaskw1.bitmask=429496ro.ril.htcmaskw1=14449ro.ril.def.agps.mode=2 (关上AGPS服务反对,可改为ro.ril.def.agps.mode=0 改后能省电但GPS定位速度会变慢)ro.ril.gprsclass=12 (GPRS设置)# For HSDPA low throughput (HSDPA低输量)ro.ril.disable.power.collapse=1 (关闭电源)# Modify MMS APN retry timer from 5s to 2s. (批改短信的APN设置5秒为2秒)ro.gsm.2nd_data_retry_config=max_retries=3, 2000, 2000, 2000# Time between scans in seconds. Keep it high to minimize battery drain.(扫描在几秒之内,可升高用电量)# This only affects the case in which there are remembered access points, (这个批改仅能影响此文件)# but none are in range.(然而没有一项是在范畴内的)wifi.interface=eth0 (WIFI界面)wifi.supplicant_scan_interval=45 (WIFI扫描间隔时间,这里设置是45秒。把这个工夫设置长点能省电)# Mobile data interfaces (挪动数据的接口)mobiledata.interfaces=rmnet0,rmnet1,rmnet2# Allow or deny tethering. (容许和回绝绑定)ro.tether.denied=false# Default network type. (默认的网络类型)# 0 => WCDMA Preferred. (0=WCDMA优先)ro.telephony.default_network=0# Enable Google-specific location features, (谷歌特定地点的设置)# like NetworkLocationProvider and LocationCollector.(如网络服务器提供商和服务器地位)ro.c o m.google.locationfeatures=1# The OpenGL ES API level that is natively supported by this device. (开放式绘图介面)# This is a 16.16 fixed point number. (界面有16个点,16个不动点数量)ro.opengles.version=65536 (开放式绘图介面参数)# Disable fs check on boot by default. (开机时默认禁用FS查看)sys.checkfs.fat=false# Performance settings. (性能设置)dalvik.vm.execution-mode=int:jitdalvik.vm.heapsize=24m (虚拟内存大小,可设置为16m或24m或32m或48m)persist.sys.use_dithering=1persist.sys.purgeable_assets=1# Increase SKIA decode memory capability for progressive jpg file.ro.media.dec.jpeg.memcap=20000000## ADDITIONAL_BUILD_PROPERTIES (其余性能设置)no_require_sim=true (手机卡爱护设置)ro.rommanager.developerid=cyanogenmodnightly (固件管理器开发者是CM大神)ro.url.legal=http://www./intl/%s/mobile/android/basic/phone-legal.htmlro.url.legal.android_privacy=http://www]/intl/%s/mobile/android/basic/privacy.htmlro. com.google.clientidbase=android-google (谷歌客户身份)ro. com.android.wifi-watchlist=GoogleGuest (WIFI用户名单)ro.setupwizard.enterprise_mode=1 (默认情景模式)ro. com.android.dateformat=MM-dd-yyyy (默认工夫格局,改为yyyy-MM-dd,显示成果就是XXXX年XX月XX日)ro. com.android.dataroaming=false (漫游设置)ro.config.ringtone=Playa.ogg (默认铃声设置,文件在/system/media/audio/ringtones 把喜爱的铃声放这里,比方123. MP3放入ringtones文件夹中,这里代码改为ro.config.ringtone=123. mp3)ro.config.notification_sound=regulus.ogg (默认提示音,文件在/system/media/audio/notifications 批改办法同上)ro.config.alarm_alert=Alarm_Beep_03.ogg (默认闹铃,文件在/system/media/audio/alarms 批改办法同上)ro.modversion=CyanogenMod-7-06192011-NIGHTLY-buzz (版本信息,改这个能让你小名呈现零碎对于中,改为ro.modversion=xxxxx)ro.setupwizard.mode=OPTIONAL (装置向导模式)net. bt. name=Android (零碎名称)dalvik.vm.stack-trace-file=/data/anr/traces.txt 参考文章:Android零碎build.prop文件生成过程 ...

December 24, 2022 · 3 min · jiezi

关于android:Android实现RecyclerView嵌套流式布局

前言Android开发中,列表页面是常见需要,流式布局的标签成果也是常见需要,那么两者联合的成果啥样呢?这篇文章简略实现一下。 实现过程增加流式布局依赖,在app/build.gradle文件中增加如下代码 implementation 'com.google.android.flexbox:flexbox:3.0.0'新建Activity文件RecyclerViewActivity.class package com.example.androidstudy;import androidx.appcompat.app.AppCompatActivity;import androidx.recyclerview.widget.LinearLayoutManager;import androidx.recyclerview.widget.RecyclerView;import android.os.Bundle;import android.widget.Toast;import com.example.androidstudy.adapter.MyRecyclerAdapter;import com.example.androidstudy.bean.TestData;import java.util.ArrayList;import java.util.List;public class RecyclerViewActivity extends AppCompatActivity { private RecyclerView recyclerView; private MyRecyclerAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_recycler_view); initViews(); initListener(); } private void initListener() { adapter.setItemCellClicker(tag -> Toast.makeText(RecyclerViewActivity.this, tag, Toast.LENGTH_SHORT).show()); } private void initViews() { recyclerView = findViewById(R.id.recyclerview); // 设置布局管理器 recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); List<String> sss = new ArrayList<>(); sss.add("重型卡车1"); sss.add("重车11"); sss.add("重型卡车3445"); sss.add("重型卡车6677"); List<String> sss1 = new ArrayList<>(); sss1.add("轻型卡车1"); sss1.add("轻车11"); sss1.add("轻型卡车3445"); sss1.add("轻型卡车6677"); List<String> sss2 = new ArrayList<>(); sss2.add("其余1"); sss2.add("其余2"); List<TestData> list = new ArrayList<>(); list.add(new TestData("重型",sss)); list.add(new TestData("轻型", sss1)); list.add(new TestData("其余", sss2)); // 实例化Adapter对象 adapter = new MyRecyclerAdapter(this, list); // 设置Adapter recyclerView.setAdapter(adapter); adapter.notifyDataSetChanged(); }}Activity页面布局activity_recycler_view.xml ...

December 22, 2022 · 2 min · jiezi

关于android:Android源码定制2Android100的编译流程

一、背景曾经在AOSP 7.1.1 nexus 5x下面实现了批改地位打卡,当初是想在pixel3中持续尝试。 作者:会飞的笨猫 二、如何抉择代码要抉择有对应驱动版本的代码分支,如果没有表明,强行用其余版本的驱动来编译刷机不晓得是否可行。 比方我抉择的状况是这样的。 https://developers.google.com... https://source.android.com/do... 这里是查代码分支和驱动版本的网站。 为什么呢?因为我的网盘中的Android10代码有这个分支,如果通过repo的形式下载,我网络太差了,容易失败,置信很多人放弃都会卡在这一步,下个代码都下不了。 咱们之间下载某个分支的代码就行了,前提是这个分支刚好有驱动。 复制代号:QQ3A.200805.001 去驱动的网页下面搜寻: 在这里找到你的手机和对应代号的驱动。 android-10.0.0_r41 -> QQ3A.200805.001 > Pixel 3 binaries for Android 10.0.0 (QQ3A.200805.001) 关联起来,点击下载那2个文件就行了,先保存起来,到时候参加编译的。 代码地址:链接: https://pan.baidu.com/s/1-U_5... 提取码: ktut 下载好驱动,代码。 三、编译环境Ubuntu 1804 装置好openjdk8 和上面一堆货色。 如果装置不了,请切换国内的源,快很多。(怎么切源,本人解决) sudo apt-get install -y libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 sudo apt-get install -y tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 sudo apt-get install -y dpkg-dev libsdl1.2-dev libesd0-devsudo apt-get install -y git-core gnupg flex bison gperf build-essential sudo apt-get install -y zip curl zlib1g-dev gcc-multilib g++-multilib sudo apt-get install -y libc6-dev-i386 sudo apt-get install -y lib32ncurses5-dev x11proto-core-dev libx11-dev sudo apt-get install -y libgl1-mesa-dev libxml2-utils xsltproc unzip m4sudo apt-get install -y lib32z1-dev ccachesudo apt-get install -y bc python flex bison gperf libsdl-dev libesd0-dev build-essential zip curlsudo apt-get install -y libssl-dev liblz4-toolsudo apt-get install -y libesd-java libwxgtk3.0-dev squashfs-tools pngcrush schedtool libxml2sudo apt-get install -y lzop schedtool lib32readline-dev libswitch-perl libssl-dev创立虚拟机的时候硬盘如果空间足够,尽量给多点比方300g,我给了虚拟机200g。 ...

December 21, 2022 · 3 min · jiezi

关于android:Android源码定制3Xposed源码编译详解

一、前言在上篇帖子中咱们实现了Android 6.0 从源码下载到源码编译的全过程,具体能够参考源码编译(1)——Android6.0源码编译详解,本文次要解说Xposed框架源码编译到源码定制的具体过程,试验环境次要是Android 6.0,在此过程中踩过不少坑,遇到各种问题,好在前面都一一解决了,这个过程中尤其感激一些大佬的博客贴子,从中学习到了很多。本文将从基于咱们编译的Android 6.0,从Xposed源码编译到Xposed源码定制,具体记录全过程。此试验分为两局部:本文Xposed源码编译和下文Xposed源码定制 致谢: 首先感激世界美景大佬的定制Xposed框架,从外面学习到对Xposed框架特色的批改,然而因为集体程度无限,大佬的贴子不够具体,不能残缺复现,通过搜寻发现肉丝大佬的基于此的两篇具体的贴子解说:来自高纬的反抗:魔改XPOSED过框架检测(上)和来自高纬的反抗:魔改XPOSED过框架检测(下),本文的Xposed定制具体参考了大佬的贴子,一些bug也是从中失去了解决,而Xposed编译则参考博客:xposed源码编译与集成,对于Xposed装置以及问题解决则参考:学习篇-xposed框架及高版本代替计划 二、Xposed源码编译1.试验筹备Xposed源码编译的过程中,咱们须要具体的理解Xposed中不同模块对应的版本以及适配的Android 版本状况,这样可能帮忙咱们缩小谬误,本文试验的环境搭建为: 试验平台:Ubuntu 16.0.4 (运行内存4GB+CPU 4+磁盘300G)Android源码:android-6.0.1_r1试验手机:Google nexus5XposedBridge:XposedBridge-artXposedInstaller:3.1.52.编译流程咱们在学习Xposed的源码编译之前,咱们先理解Xposed个各个模块的含意,具体参考官网:Xposed官网 各个模块的含意(这里参考上文肉丝大佬博客(1)): XposedInstaller:下载安装Xposed.zip刷机包、下载安装和治理模块XposedBridge:位于Java层的API提供者,模块调用性能时首先就是到这里,而后再“转发”到Native办法Xposed:位于Native层的Xposed理论实现,实现办法替换的理论逻辑等性能,次要是在app_process上进行的二次开发android_art:在原版art上进行的二次开发,目录及文件基本上与原版art雷同,稍加批改提供对Xposed的反对XposedTools:XposedInstaller下载的那个刷机zip包,就是用XposedTools编译打包进去的咱们理解Xposed的各个模块的作用,接着理解一下Xposed框架初始化的工作原理: Xposed源码编译的流程能够参考下图: 3.XposedBridge(1)源码下载咱们从官网上下载XposedBridge,这里咱们最终下载的是Xposed_art git clone https://github.com/rovo89/XposedBridge.git (2)编译生成XposedBridge.jar咱们在生成XposedBridge.jar的过程中有两种形式:mmm编译和Android Studio编译(这里优先举荐应用AndroidStudio编译) <1>mmm编译首先咱们须要在XposedBridge工程中编写Android.mk文件 Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名、援用的头文件目录、须要编译的.c/.cpp文件和.a动态库文件等。编写android.mk文件,将编译须要的源代码,编译生成的后果模式等信息告知ndk build编译系统。Android.mk文件内容如下所示。LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_DEX_PREOPT = falseLOCAL_MODULE := XposedBridgeLOCAL_SRC_FILES := \ $(call all-java-files-under, src) \ $(call all-java-files-under, lib/apache-commons-lang/external) \ $(call all-java-files-under, hiddenapistubs/src)include $(BUILD_JAVA_LIBRARY)$(LOCAL_INTERMEDIA_TARGETS): PRIVATE_EXTRA_JAR_ARGS := -C "$(LOCAL_PATH)" \assets -C "#(LOCAL_PATH)" NOTICE.txtinclude $(call all-makefiles-under, $(LOCAL_PATH))这里咱们须要留神版本,针对不同版本的XposedBridge,咱们须要批改LOCAL_SRC_FILES中的文件选项,对于Android.mk的文件介绍,大家能够参考官网地址:Android.mk 咱们将XposedBridge文件夹放在Android源码目录下 而后咱们应用mmm针对模块编译: ##初始化环境source build/envsetup.sh##抉择设施lunch 19##编译mmm /home/tom/SourceCode/android-6.0.1_r1/XposedBridge/ ...

December 21, 2022 · 2 min · jiezi

关于android:Android源码定制4Xposed源码定制

一、前言在上篇文章源码编译(2)——Xopsed源码编译详解中具体介绍了Xposed源码编译的残缺过程,本文将从Android编译过程到Xposed运行机制,最初进行Xposed框架的具体定制。其中Xposed的定制次要参考世界美景大佬的定制Xposed框架和肉丝大佬的来自高纬的反抗:魔改XPOSED过框架检测(下)。 致谢: 首先感激世界美景大佬的定制Xposed框架,从外面学习到对Xposed框架特色的批改,然而因为集体程度无限,大佬的贴子不够具体,不能残缺复现,通过搜寻发现肉丝大佬的基于此的两篇具体的贴子解说:来自高纬的反抗:魔改XPOSED过框架检测(上)和来自高纬的反抗:魔改XPOSED过框架检测(下),本文的Android零碎运行参考老罗的博客 二、Android运行机制咱们在理解Xposed的运行机制前,不得不须要理解Android零碎的根本构造和运行机制,这样咱们能力进一步学习如何进行Xposed定制,能力缩小更多的谬误 1. Android平台架构Android的平台架构如下图所示: 上面咱们顺次介绍各层之间的性能和作用: (1)Linux内核Android平台的根底是linux内核,Android Runtime(ART)依附Linux内核来执行底层性能,应用Linux内核可让Android利用次要平安性能,并且运行设施制造商为驰名的内核开发硬件驱动程序,能够了解基于linux内核让Android更平安并且能够领有很多设施驱动 (2)硬件形象层(HAL)HAL提供规范界面,向更高级别Java API框架显示设施硬件性能,HAL蕴含多个模块,其中每个模块都为特定类型的硬件组件实现一个界面,例如相机和蓝牙模块,当框架API要拜访设施硬件时,Android零碎为该硬件组件加载库模块。 (3)Android RuntimeAndroid 5.0之前Android Runtime为Dalvik,Android 5.0之后Android Runtime为ART 首先咱们先理解一些文件的含意: (1)dex文件:Android将所有的class文件打包造成一个dex文件,是Dalvik运行的程序(2)odex文件:优化过的dex文件,Apk在装置时会进行验证和优化,通过dexopt生成odex文件,放慢Apk的响应工夫(3)oat文件:Android公有ELF文件格式,有dex2oat解决生成,蕴含(原dex文件+dex翻译的本地机器指令),是ART虚拟机应用的文件,能够间接加载(4)vdex文件:Android 8.0引入,蕴含APK的未压缩DEX代码,以及一些旨在放慢验证速度的元数据上面咱们从Android零碎的倒退过程中具体介绍二者的区别: 版本虚拟机类型个性2.1-4.4DalvikJIT+解释器5.0-7.0ARTAOT7.0-11ARTAOT+JIT+解释器上面局部参考博客:博客地址 Android 2.2 Dalvik 反对已转换成dex格局的android利用,基于寄存器,指令执行更快,加载的是odex文件,采纳JIT运行时编译JIT: JIT即运行时编译策略,能够了解成一种运行时编译器,此时Android的虚拟机应用的是Dalvik,为了放慢Dalvik虚拟机解释dex速度,运行时动静地将执行频率很高的dex字节码翻译老本地机器码毛病: (1)每次启动利用都须要从新编译 (2)运行时比拟耗电,造成电池额定的开销 基于Dalvik的虚拟机,在APK装置时会对dex文件进行优化,产生odex文件,而后在启动APP后,运行时会利用JIT即时编译,解决执行频率高的一部分dex,将其翻译成机器码,这样在再次调用的时候就能够间接运行机器码,从而进步了Dalvik翻译的速率,进步运行速度毛病: (1)因为在Dex加载时会触发dexopt , 导致Multidex加载的时候会十分慢 (2)因为热点代码的Monitor始终在运行 , 解释器解释的字节码会带来CPU和工夫的耗费, 会带来电量的损耗Android 4.4——ART和AOT 此时引入全新的虚拟机运行环境ART和全新的编译策略AOT,此时ART和Dalvik是共存的,用户能够在两者之间抉择 Android 5.0——ART全面取代Dalvik AOT: AOT是一种运行前编译的策略毛病:(1)利用装置和系统升级之后的利用优化比拟耗时(2)优化后的文件会占用额定的存储空间AOT与JIT区别: JIT 是在运行时进行编译,是动静编译,并且每次运行程序的时候都须要对 odex 从新进行编译AOT 是动态编译,利用在装置的时候会启动 dex2oat 过程把 dex 预编译成 ELF 文件,每次运行程序的时候不必从新编译,是真正意义上的本地利用JVM、Dalvik和ART区别: JVM:传统的Java虚拟机、基于栈、运行class文件Dalvik:反对已转换成dex格局的android利用,基于寄存器,指令执行更快,加载的是odex(优化的dex)ART:第一次装置时,将dex进行Aot(预编译),字节码事后编译成机器码,生成可执行oat文件(ELF文件) 基于ART的虚拟机,会在APK第一次装置时,将dex进行AOT(预编译),通过dex2oat生成oat文件,即Android可执行ELF文件,包含原dex文件和翻译后的机器码,而后启动程序后,间接运行毛病: (1)因为装置APK时触发dex2oat , 须要编译成native code , 导致安装时间过长 (2)因为dex2oat生成的文件较大 , 会占用较多的空间Android 7.0——JIT回归 ...

December 21, 2022 · 4 min · jiezi

关于android:最新版Android原生集成RN

前言当初不少利用都是采纳了混合开发模式,不论是原生加RN,或是原生加Flutter,或是原生加H5。原生实现主业务线,其余局部能够借助跨平台计划开发,进步开发效率,或者实现热更新,调高业务迭代效率。 上面简略介绍一下Android原生集成最新RN版本的过程。 增加package.json文件首先在一个失常编译运行的原生APP根目录下执行yarn init命令,按提醒填写根本信息后会在我的项目根目录下,创立一个package.json文件。 增加JavaScript依赖,生成node_modules而后,应用如下命令增加React和React Native运行环境的反对脚本。 yarn add react react-native命令执行实现后,所有JavaScript依赖模块都会被装置到我的项目根目录下的node_modules/目录中。 留神:node_modules这个目录咱们原则上不复制、不挪动、不批改、不上传,随用随装,同时把node_modules/目录记录到.gitignore文件中(即不上传到版本控制系统,只保留在本地)。接下来,在package.json文件中配置启动RN Metro服务的脚本,即script脚本,文件全部内容如下。我的项目根目录package.json文件 { "name": "AndroidDemo", "version": "1.0.0", "main": "index.js", "license": "MIT", "dependencies": { "react": "^18.2.0", "react-native": "^0.70.6" }, "scripts": { "start": "yarn react-native start" }}原生端增加React Native依赖在app中build.gradle文件中增加React Native和JSC引擎依赖: dependencies { ... implementation "com.facebook.react:react-native:+" implementation "org.webkit:android-jsc:+"}在我的项目的build.gradle文件中为React Native和JSC引擎增加maven源的门路,必须写在 "allprojects" 代码块中。 allprojects { repositories { maven { // All of React Native (JS, Android binaries) is installed from npm url "$rootDir/../node_modules/react-native/android" } maven { // Android JSC is installed from npm url("$rootDir/../node_modules/jsc-android/dist") } }}!!!留神这里有个问题,点击同步后,会报如下谬误: ...

December 21, 2022 · 2 min · jiezi

关于android:FAQ在华为鸿蒙车机上集成华为帐号的常见问题总结

随着新一代信息技术与汽车产业的深度交融,智能网联汽车正逐步成为汽车产业倒退的策略制高点,无论是传统车企还是新权势都瞄准了“智能座舱”这种新一代人机交互形式。面对竞争如此强烈的车机市场,华为鸿蒙车机系统的呈现,给消费者带来了不同凡响的便捷应用感触,这得益于华为在硬件、软件和场景优化上的技术劣势,用户只需一个华为帐号便可疾速登录车机。 本文章收集了在车机上集成华为帐号服务中会遇到的典型问题,并给出了解决办法以提供参考。 问题1:鸿蒙车机系统集成 Account Kit SDK,帐号登录失败,报错误码2002。 起因剖析:2002错误码的个别是利用尚未受权,须要受权。该错误码个别在silentSignIn接口中呈现。 解决办法:在调用静默登录接口silentSignIn失败后,再调用前台登录受权signIn接口,应用显式登录形式;调用显式登录形式时,如果没有通过用户的受权,那么会有相应的受权页面进行受权。 问题2:鸿蒙车机上安装车机版的HMS Core包之后,登录报错,返回错误码 7005。 起因剖析:登录时提醒7005错误码,示意传入参数有误。对日志的进一步剖析发现,数据库中有数据残留,之前曾经有一个帐号存在数据库中,帐号保留失败,须要把数据先删除,而后再从新登录。 解决办法:应用删除数据库数据命令:/data/system_ce/0/accounts_ce.db , 然而前提是车机平板必须要领有ROOT权限。 问题3 :鸿蒙车机上调用退出帐号的接口后,再次登录的时候,登录二维码无奈弹出,无奈重现登录。 鸿蒙车机上有个开发问题:调用这个退出帐号登录的接口当前,oncomplete能够打印,然而当再次登录的时候,登录二维码就不弹出来了,如同并没有退出登录。 起因剖析:具体询问开发者CP得悉,您参考的不是鸿蒙帐号退出的文档中的代码,而是安卓帐号退出的代码,已倡议开发者CP参考鸿蒙帐号退出的文档中的代码从新集成测试。 解决办法:开发者联盟官网文档HarmonyOS帐号退出登录文档链接:https://developer.huawei.com/... 在鸿蒙车机上的帐号退出和在手机上还是有区别的,在车机上调用signout接口,只是勾销受权,并不是齐全退出登录,利用退出华为帐号后,设施上的华为帐号依然处于登录状态,因为利用曾经被受权,所以后续登录不提醒输出登录凭据是失常状况。如果想要实现齐全的退出,您能够尝试以下操作: • 从帐号核心登记设施上的华为ID(设置 > 帐号核心 > 退出帐号) • 撤销华为ID受权(设置 > 帐号核心 > 隐衷核心 > 管制对您帐号的拜访,抉择利用并点击“勾销受权”) 然而有CP反馈鸿蒙车机上没有这个入口,显示“无受权的利用和网站”,所以无奈进行上述操作,须要申请权限: com.huawei.hms.account.logout 而后 Task<Void> task = accountAuthService.logOut(); 能够实现利用齐全的退出。 问题4:鸿蒙车机上调用退出帐号的logout接口,返回错误码2030,该如何解决? 问题形容:鸿蒙车机上调用退出帐号的logout接口,返回错误码2030。 起因剖析:2030错误码的官网解释是 放弃帐号登录。 解决办法:在呈现上图的扫码登录页面的时候,把登录页面中的“记住我的登录状态”的单选框的勾号点击去掉,再次登录就能够从新弹出二维码。然而思考到用户可能会不晓得次操作,不会去点掉单选框的勾号,那么车机上就退出不了,所以这种方法并不能从根本上解决问题。 依据对日志的进一步剖析,发现CP应用的是手机版的HMS Core APK的包; 然而车机和手机的HMS Core,并不是应用同一个包,针对车机,HMS Core 有独自的APK安装包。所以倡议CP下载更换HMS Core的包,再从新测试。 问题5:鸿蒙车机系统负一屏打包的签名变了之后,报错6003,是不是须要重新配置指纹证书 ? 起因剖析:签名变更个别须要从新在AGC上配置签名指纹证书,签名变动,导致呈现签名匹配失败。 解决办法:请在AppGallery Connect后台上重新配置签名指纹证书,而后从新测试。 ...

December 21, 2022 · 1 min · jiezi

关于android:汽车行业充分借力数据价值推动数字化营销链路闭环

当下,汽车行业已缓缓由已经的增量市场逐渐转变为存量市场。更年老的生产群体偏好、更精准智能的营销投放策略和强势入局的新能源汽车等因素都在推动着汽车行业的一直倒退。对于汽车厂商和垂域媒体来说,进行丰盛的人群洞察与用户分层,能开掘更多用户生命周期内的价值。 联结建模,精准拉新随着电商与短视频的疾速倒退,汽车厂商的广告投放渠道有了更多抉择。人群标签的细分和精准水平决定着理论的投放成果,各大数据平台的标签尽管细化,但很多仍旧不足对汽车行业的深度洞察。 HMS Core 剖析服务(即华为剖析)基于业务需要场景,搭建定制化标签体系。同时,通过联结建模的形式,充分发挥华为设施零碎级数据劣势,以设施零碎级数据交融利用内行为数据,深度洞察人群特色,帮忙企业精准开掘更多暗藏的潜在动向人群,无效晋升广告投放效率,实现精准拉新。 *联结建模投放成果示意 高价值线索孵化,缩短转化周期汽车厂商在抉择投放渠道时,因为汽车类垂直媒体人群更聚焦,往往成为投放首选。而是否为厂商带来继续可孵化的高价值线索,成为垂域媒体的重要价值考量。 华为剖析服务除了与华为利用市场付费推广平台建设便捷稳固的转化事件回传通道,帮忙企业实现智能归因外,还提供买量用户剖析报告。汽车垂域媒体在通过付费推广拉新时,可进一步联合买量用户剖析报告,为汽车厂商提供更精准的高价值线索。 *转化事件回传原理示例 *买量用户剖析报告,数据为虚构 例如,通过买量用户报告的新增买量用户属性散布详情,发现近期用户多集中在某些城市。此时,汽车垂域媒体的这个要害线索可同步传递给汽车厂商,通过适当减少这些区域的线下看车流动,让用户从线上理解到线下体验,全面通晓指标车型的配置与驾驶体验,无效缩短购买决策周期,促成最终的成单闭环。 *新增买量用户属性散布,数据为虚构 便捷埋点与行业报告为了继续晋升竞争力,汽车厂商已不局限在将车卖出去,而是以用户为核心,提供从选车、买车、用车、换车、维修保养等所有环节为一体的一站式服务。这就须要汽车厂商们充沛理解用户的用车习惯、车型商品爱好等。 华为剖析服务通过采集埋点全链路跟踪,提供汽车行业强相干的埋点模板与代码样例,当开发者实现定制化的行业埋点计划后,即可查看多维度、多指标的汽车行业剖析报告。报告共分为四个模块看板,别离是数据概览、车辆服务、购车销售剖析和社区与售后。 例如,社区与售后看板聚焦用户参加和用户反馈,能够从支付优惠券人数、应用优惠券人数等指标理解优惠活动参与度,开掘价格敏感用户;从社区沉闷人数、各板块沉闷人数、帖子公布的版块及分享渠道、分割客服人均次数等维度把握社区人群动向,真正解决用户痛点,驱动用户价值降级。 *养车行业报告与代码埋点示例,数据为虚构 随着企业数字化营销倒退的进一步成熟,充沛开掘数据价值,进一步晋升营销精准性成为必然。华为剖析服务作为一站式用户行为剖析平台,将一直精耕业务场景,帮忙更多的行业实现数字化营销链路闭环。 理解更多详情,可参阅官网文档指南。欢送拜访华为剖析服务官网,收费体验Demo:华为剖析服务 | 一站式用户行为剖析平台| Demo体验 。 获取开发领导文档:Android、iOS、Web、HarmonyOS 、微信小程序、快游戏。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

December 21, 2022 · 1 min · jiezi

关于android:如何优化大场景实时渲染HMS-Core-3D-Engine这么做

在先前举办的华为开发者大会2022(HDC)上,华为通过3D数字溪村展现了自有3D引擎“HMS Core 3D Engine”(以下简称3D Engine)的弱小能力。作为一款高性能、高画质、高扩展性的3D引擎,3D Engine不仅能通过实时光追、水体渲染、体积云雾、多维GPU粒子系统等技术还原真实世界的物理体现,对于大规模数字世界的实时渲染,3D Engine同样也能为开发者提供无力的技术支持。 大规模数字世界的需要与挑战明天,如何更好地实现大场景下的实时渲染,曾经成为行业的热门话题,相干技术在泛滥畛域都有着广大的利用前景。咱们能够显著感触到,从3D游戏到虚拟现实,从三维GIS到数字城市,波及场景的规模都在呈指数级增长,局部游戏中的世界地图甚至没有边界。能够说,大规模场景的实时交互渲染能力正在成为构筑数字世界的基础设施。 然而,这并非易事。 场景规模的扩充带来的后果就是海量的内容和数据。一个城市波及的物件数差不多是百万级,面片数更是可能达到亿级,而硬件配置却始终是绝对无限的,即便再高级的硬件配置也有力不从心的时候。 数据和硬件之间的矛盾,对3D引擎的大场景实时渲染能力提出了挑战:• 因为物件、网格、材质等内容数量太多,受限于显存容量,传统的全场景事后加载形式无奈实现; • 在传统3D绘制模式下,GPU的算力不足以撑持万级规模物件数和亿级规模面片的实时渲染; • 如果应用流式加载场景的形式,能够实现一边渲染一边加载数据,但须要预处理场景数据,诸如分区分层、模型合并、材质合并、纹理烘焙等预处理往往极为耗时,几万个物件就须要小时级的期待,且仅反对场景中静止不动的物件。 譬如上图这个服务器大楼,三角面片数达到了千万级,并且有将近万件的模型。为了实现实时渲染,通常须要通过HLOD的形式将整个场景进行Spatial-Coherent的档次重组。 相似于右图红圈所示,以不同半径为一个空间节点,将圈圈内的模型进行合并解决,从而升高场景物件的遍历数量,进步绘制性能。而这个预处理操作自身就须要消耗近一个小时,大大增加了调试和开发成本。 那么,HMS Core 3D Engine将如何应答挑战,构建大规模场景的实时渲染能力? Hi-Mesh层级网格渲染减速技术为了解决这三个“放不下”、“算不了”、“等不起”的问题,华为2012菲尔兹实验室基于HMS Core 3D Engine自研了“Hi-Mesh”层级网格渲染减速技术,针对场景中的资产进行多维度、多层级的构造优化,确保场景构造在生成、遍历、处理过程中的高效。譬如针对一个大规模场景,可将其数字内容进行多维分区: 按空间结构分区3D场景中利用物件原生隐含的空间属性,进行疾速地位编码和索引,大幅升高传统树形构造的线性遍历耗时; 按视角空间分层利用视角的局限性,对场景中的物件进行不同细节档次的辨别或合并解决,从而升高场景的数据量; 按内容特色分组利用场景物件的特色,如按网格、材质的同源性进行分组,从而应用特定优化的绘制指令来强化它们的绘制效率; 按拓扑连贯分片 将模型网格进行更精密粒度的分片,实现高效率的剔除和遮挡操作,优化实时渲染的性能。 Hi-Mesh架构图 基于将场景化整为散的准则,以高效率的空间/视角构造来实现多层级的数据优化,并以GPU驱动的形式,最终实现百万级物件、亿级全面的数字世界的实时渲染。 一千个物件实时动静更新 为了实现上述的操作,3D Engine应用了一种隐式编码树的空间层次结构——“Hi-Mesh Tree”。不同于传统基于链表模式的空间结点树的形式,3D Engine通过一种常量级性能的结构和遍历办法,相较现有的商业引擎,大规模场景的实时渲染性能可晋升15%~120%。此外,还能够大幅晋升三维空间场景组织构造的生成效率,甚至达到毫秒级,大大降低了工作流的工夫老本。 数据起源: 华为外部实验室测试后果 同时,3D Engine还应用了基于GPU驱动的Cluster Rendering (GDCR)绘制技术。 GPU驱动在业界已有一些摸索和利用,其现实指标是用一个Draw Call(DC)来绘制整个场景,以充分发挥GPU的并行流水线能力,实现渲染性能的进步。下图是Ubisoft 在Siggraph 15上提出的GPU驱动管线的架构图,其核心思想就是将本来基于CPU的可视性检测解决迁徙到GPU上,利用GPU的并行和可编程能力,提供高并发、不同粒度的可视性检测能力,从而大幅提高渲染性能。 3D Engine为了更充沛的实现GPU驱动的效率,对GPU驱动的管线节点、数据传输、图形资产进行深度优化和耦合,将场景下的所有3D物件在GPU上进行各个维度(突围盒、实例、片区、三角面)的可视性剔除,配合多层的重组(材质、顶点),从而实现以最大量的绘制指令来实现场景的光栅化和着色,等同规模场景下相比传统模式的渲染性能实现了翻倍。 等同规模场景下渲染性能比照 能够预感,将来的数字世界无论是元宇宙、数字孪生、还是凋谢大世界,趋于宏大的丰富多彩场景都将会是不可或缺的组成部分。在Hi-Mesh技术的加持下,3D Engine得以通过高效的空间层级构造和GPU敌对的绘制管线,大幅提高大规模数字场景下的实时渲染能力,使场景中的3D内容“纵情放”、“更快看”、“少期待”,帮忙开发者大大晋升生产力。 对于HMS Core 3D Engine3D Engine是HMS Core面向行业搭档推出的重要图形能力,不仅提供高性能、高画质、高扩展性的实时3D引擎,配合低代码的可视化开发,可能帮忙开发者便捷高效地发明出高品质的3D内容和体验。如需进一步理解更多信息,请拜访: developer.huawei.com/consumer/cn/hms/3d-engine/?ha_source=hms1 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee ...

December 20, 2022 · 1 min · jiezi

关于android:FAQ申请Health-Kit权限的常见问题及解答

华为静止衰弱服务(HUAWEI Health Kit)提供原子化数据凋谢,用户数据被受权获取后,利用可通过接口拜访静止衰弱数据,对相干数据进行增、删、改、查等操作。这篇文章汇总了申请开明Health Kit测试权限的常见问题,并给出了具体解答,心愿为开发者提供相干参考。 (1) 申请Health Kit 审核时限多久? 答:审核周期约15个工作日,审批后果将以短信和邮件的模式告诉开发者。若资料审核被驳回,请依照审核意见批改后从新提交,从新提交后审核周期仍为15个工作日。为了放慢您的审核进度,请认真对待每一次申请。 (2) 集体开发者是否能够申请接入华为静止衰弱服务? 答:基于隐衷政策要求,集体开发者如果以短暂钻研、开发、测试为目标,能够申请接入华为静止衰弱服务,读/写凋谢等级为根底的用户数据(如步数、热量、间隔等)。然而须要留神以下内容: 1.申请过程中,需在申请材料清单中明确我的项目或测试完结工夫,相干管理人员将在您相干工作完结后敞开权限。 2.高阶用户数据(如心率、睡眠、血压、血糖、血氧等衰弱数据)不凋谢给集体开发者。 3.申请材料、集体征信状况审核通过后,仅限前100名用户能够应用开发者利用集成的华为静止衰弱服务。 4.不反对集体开发者通过“申请验证”操作来申请正式权限,因而100个用户数量限度无奈解除。 5.如利用须要解除100个用户数量限度,请从新申请帐号服务,并实名认证为企业开发者后申请华为静止衰弱服务。 (3) 企业开发者、集体开发者申请数据权限范畴有何不同? 答:集体开发者、企业开发者可申请的数据范畴如下: 集体开发者:身高、体重、步数、间隔、热量、中高强度、海拔、锤炼记录概要、锤炼记录详情(速度、步频、静止心率、步频、海拔、跑姿、跳跃、功率、阻力)、个人信息(性别、出生日期、身高、体重)、锤炼实时数据。 企业开发者:在集体开发者申请的根底数据范畴的根底上,减少地位数据凋谢以及如下高阶数据凋谢:心率、压力、睡眠、血糖、血压、血氧、体温、心电、最大摄氧量、生殖衰弱、实时心脏数据、设施信息。 (4) 企业开发者接入资质审核有哪些要求? 答:企业开发者提交申请前需确认实缴资本:申请拜访凋谢等级为根底的用户数据,企业实缴资本不低于100万;申请拜访凋谢等级为高阶用户数据,企业实缴资本不低于500万。企业关联危险、成立年限也将在评审范畴内。 如有疑难,请通过hihealth@huawei.com邮箱获取人工帮忙。 (5) 申请材料清单有什么填写要求? 答:具体要求如下: 申请材料中每个标注“必填”的页签都须要填写,尤其是“企业文字介绍”页签;若您为集体开发者,请在该页签阐明“申请人为集体开发者”,并明确集体所在科研机构或大学等。 数据应用场景页签中须要体现开发者申请的每一个读/写数据权限,并且须要与理论申请时勾选的权限一一对应。 (6) 申请主体不统一怎么了解? 答:开发者在华为开发者联盟实名认证的开发者名称,须要与利用经营主体保持一致。请在申请测试权限时自检开发者名称一致性。否则,后续申请验证时将会被驳回。 (7) 图标应用不标准问题如何解决? 答:开发者提交的申请材料中,波及华为静止衰弱图标展现的场景须要遵循《HUAWEI Health视觉辨认标准手册》要求的视觉效果进行出现。手册以及图标PNG款式请点击资源下载获取。 请随时关注华为开发者联盟最新信息,并下载最新资源。 (8) 我的申请曾经审核通过了,为什么还查不到用户数据? 答:因为数据缓存起因,倡议开发者开明测试权限24小时后进行测试验证。 如果问题依然存在,请参见华为静止衰弱服务联盟文档错误码章节获取更多信息。 更多接入华为静止衰弱服务常见问题,请参见FAQ 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

December 19, 2022 · 1 min · jiezi

关于android:关于Android-10以上无法隐藏应用图标问题探究及解决方案

Android 10之前的暗藏形式: con.getPackageManager().setComponentEnabledSetting(new ComponentName(con,activityAliasName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);Android 10之后,该暗藏图标形式生效,暗藏胜利后仍然会在桌面上保留其图标,点击后会跳转到利用详情页。具体查看官网API更新阐明:getActivityList) 。 那这就很好受了,在我看来,目前设计的并不太正当,能不能暗藏应该由用户决定,而不是强制不容许暗藏,不过目前官网也设置了管制开关,能够批改零碎设置来去掉该限度,只不过须要adb或能批改零碎设置的APP或ROOT权限能力批改。接下来就是具体分析了。 具体分析getActivityList //frameworks/base/core/java/android/content/pm/LauncherApps.java public List<LauncherActivityInfo> getActivityList(String packageName, UserHandle user) { logErrorForInvalidProfileAccess(user); try { return convertToActivityList(mService.getLauncherActivities(mContext.getPackageName(), packageName, user), user); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); } }getLauncherActivities //frameworks/base/services/core/java/com/android/server/pm/LauncherAppsService.java@Overridepublic ParceledListSlice<LauncherActivityInfoInternal> getLauncherActivities( String callingPackage, String packageName, UserHandle user) throws RemoteException { //查问蕴含ACTION_MAIN和CATEGORY_LAUNCHER的activity ParceledListSlice<LauncherActivityInfoInternal> launcherActivities = queryActivitiesForUser(callingPackage, new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_LAUNCHER) .setPackage(packageName), user); //检测零碎设置(零碎设置管制开关管制是否走新版限度逻辑) if (Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.SHOW_HIDDEN_LAUNCHER_ICON_APPS_ENABLED, 1) == 0) { return launcherActivities; } //没有找到入口activity if (launcherActivities == null) { // Cannot access profile, so we don't even return any hidden apps. return null; } final int callingUid = injectBinderCallingUid(); final long ident = injectClearCallingIdentity(); try { //托管配置文件能够暗藏APP if (mUm.getUserInfo(user.getIdentifier()).isManagedProfile()) { // Managed profile should not show hidden apps return launcherActivities; } //设施管理员能够暗藏APP if (mDpm.getDeviceOwnerComponentOnAnyUser() != null) { // Device owner devices should not show hidden apps return launcherActivities; } final ArrayList<LauncherActivityInfoInternal> result = new ArrayList<>( launcherActivities.getList()); if (packageName != null) { // If this hidden app should not be shown, return the original list. // Otherwise, inject hidden activity that forwards user to app details page. //可能是如果大于0,示意有无效的启动入口,则不必注入暗藏的APP详情页入口 if (result.size() > 0) { return launcherActivities; } final ApplicationInfo appInfo = mPackageManagerInternal.getApplicationInfo( packageName, /* flags= */ 0, callingUid, user.getIdentifier()); //依据APP信息进行判断是否注入暗藏APP详情页入口 if (shouldShowSyntheticActivity(user, appInfo)) { LauncherActivityInfoInternal info = getHiddenAppActivityInfo(packageName, callingUid, user); if (info != null) { result.add(info); } } return new ParceledListSlice<>(result); } final HashSet<String> visiblePackages = new HashSet<>(); for (LauncherActivityInfoInternal info : result) { visiblePackages.add(info.getActivityInfo().packageName); } final List<ApplicationInfo> installedPackages = mPackageManagerInternal.getInstalledApplications(/* flags= */ 0, user.getIdentifier(), callingUid); for (ApplicationInfo applicationInfo : installedPackages) { if (!visiblePackages.contains(applicationInfo.packageName)) { if (!shouldShowSyntheticActivity(user, applicationInfo)) { continue; } LauncherActivityInfoInternal info = getHiddenAppActivityInfo( applicationInfo.packageName, callingUid, user); if (info != null) { result.add(info); } } } return new ParceledListSlice<>(result); } finally { injectRestoreCallingIdentity(ident); }}shouldShowSyntheticActivity ...

December 18, 2022 · 2 min · jiezi

关于android:如何安全开放-API-数据

Eotalk 是由 Eolink 和各合作方一起发动的泛技术聊天流动,每期咱们会邀请一些技术圈内的大牛聊聊天,聊一下对于技术、守业工作、投融资等热点话题。 本期 Eotalk 咱们来聊聊平安。最近网络安全事变频发,比方前段时间的公民数据泄露、美的受到攻打勒索千万等事件。咱们邀请到 奇安信 负责数据安全的子公司技术负责人---简川力,一起来聊聊怎么平安地凋谢数据、应用数据、应用接口等等。 刘昊臻: 咱们 Eolink 在跟用户沟通时发现, API 凋谢数据的需要是十分旺盛的。从企业心愿搭建数字中台疾速通过外部 API 搭建利用,到银行和政府心愿通过凋谢 API 促成企业间单干的效率,现在 API 凋谢无处不在。 川力,你所理解到 API 凋谢的场景有哪些呢? 简川力: 政府单位可能会跟银行单干,银行就会用到政府的数据。以前可能间接去采或者间接去拿,这种形式都是不标准或违规的,当初基本上是不容许了。所以,个别两头会做一些服务,通过模型、通过 API、或者通过一些其余的形式给银行凋谢,银行就能够拿到这些数据,比方咱们贷款相干的、你的征信数据或者你的社保数据之类的,这是一类场景。 还有一类,在公安外面其实也会有相似的状况。公安跟公安外部,其中有一些部门,比如说像刑侦部门或者网安部门,数据是十分窃密的,不能因为你也是公安外部其余部门的人,就让你间接来去拜访,因而要留痕、审计之类,就须要用 API 去做凋谢。 刘昊臻: 你讲的两个场景,其实咱们都有遇到过。数据凋谢它通过了好几个阶段,以前最早的时候,咱们可能间接连数据库,给你一个绝对平安的账号,或者很多年前会要求必须带 U 盘或者是硬盘,去现场拷数据能力带走。这种形式效率是很低的,同时它其实并不平安。 第二个,前期呈现了近程调用,它其实也是在数据库的根底上做的近程调用。就安全性而言,很多鉴权和操作过程的监控等方面都做得不是很好。当初比拟常见的做法,其实是通过 API 的形式去凋谢接口。像银行跟政府之间、一些企业跟供应商之间、企业与单干企业之间,有些时候是企业外部的敏感数据,不好间接凋谢,就能够通过接口来管制哪些供应商或哪些合作方,它可能各自用哪些数据、用哪些字段、用什么拜访形式、有效期等等。 包含像刚刚聊到的公安部门,咱们也有一些相似的客户。因为公安外部很多部门之间,它会通过一个相似于叫 API 的开放平台,或叫能力开放平台,所有零碎的货色都在下面。如果要用的话须要先申请,审批通过之后能力调用。其实 API 的凋谢和调用曾经是十分遍及的场景了。 当初咱们再去看所谓的 API 凋谢,怎么样去把接口凋谢进去,它可能不是一个很难的事件。最简略的就是前面是一些微服务,后面搭一个网关。但即使如此还是会有很多数据泄露的问题。像银行或政府,他们其实还是会对于数据凋谢上有很多深度的要求的。 川力,在你们所接触到的场景外面,大家会在 API 凋谢过程中面临什么样的挑战呢? 简川力: 当初大家可能说的比拟多的是,API 服务申请个权限、限度一下时间段,或者限度一些字段数据。然而像国家的数据,平安爱护好当前还要分类分级,有数据安全的治理标准。而且有些数据跟国家机密还有关系,不只是影响社会关系这么简略,所以他们的要求就更高了。用户通过 API 拜访了数据,尽管通过了鉴权,然而没有方法限度二次散发,或者再去做一次倒卖。他们更心愿数据不进来,并且还可能给他人提供 API 的服务或者是数据的服务,所以当初多了一些隐衷计算等新的解决方案。 很多时候不论是银行、企业,还是政府单位,他们更多想的是在我的可控环境外面用数据,用完了只是把后果拿走,而不是把我的数据拿到你那去做计算。 刘昊臻: 就是你能够拿后果,或者在不拿数据的状况下,去把你想要的后果给算进去。 简川力: 没错。其实凋谢 API 给他人,他真正去用 API 无非也就是要在它的利用下来用你的数据。不论是做机器学习、深度学习,或者是去做一些加减乘除、规定匹配,实际上它的过程也是这样子的。只不过当初可能更多的心愿能够把这个过程再提前,可能在小范畴将数据保存起来,这是最好的。 刘昊臻: 刚刚聊到隐衷计算,对于个别开发者的利用场景下,大家可能比拟少接触这个概念或者没有听过这个词,是否把隐衷计算再开展讲讲?什么场景上面会用的比拟多? ...

December 18, 2022 · 2 min · jiezi

关于android:Android-开发中的SSL-pinning

一、SSL在日常的平安浸透过程中,咱们常常会遇到瓶颈无处下手,这时候如果攻击者从APP进行冲破,往往会有很多惊喜。然而目前市场上的APP都会为避免他人歹意盗取和歹意篡改进行一些保护措施,比方模拟器检测、root检测、APK加固、代码混同、代码反调试、反脱壳、签名校验等等反抗机制。而测试人员对APP进行浸透的首步操作通常就是上burp或者Charles这类抓包工具进行抓包,查看申请记录里的域名及链接地址是否能够进一步利用。 咱们都晓得http协定传输的是明文信息,是能够间接捕捉的,从而造成了数据泄露。为了避免中间人的拦挡,呈现了HTTPS加密机制。在HTTPS中,应用了证书+数字签名解决了抓包的问题,这里用到了两个概念:数字签名和数字证书。 数字签名:是发送方的明文经验了两次加密失去的两个货色组成,一个是hash ,一个是通过私钥加密。数字证书:其实就是明文+数字签名。然而数字证书中的内容远不止这俩,还包含了权威机构的信息,服务器的域名,最重要的是有签名的计算方法,还有就是证书中还包含公钥,公钥用于发放给申请证书的客户端。SSL(安全套接字层)又被称为TLS(数据层平安协定),是一种为网络通信提供数据完整性的一种平安协定。它位于TCP/IP协定与各种利用协定之间。SSL协定次要分为两个局部:Handshake Protocol和Record Protocol。 Handshake protocol是用来协商加密通信数据的密钥,Record Protocol定义传输内容的格局。事实上,HTTPS就是应用SSL/TLS协定进行加密传输,让客户端拿到服务器的公钥,而后客户端随机生成一个对称加密的秘钥,应用公钥加密,传输给服务端,后续的所有信息都通过该对称秘钥进行加密解密,实现整个HTTPS的流程。 二、SSL pinning计划证书锁定实质是反抗中间人攻打,并非用于反抗抓包破解。但如果程序逻辑未被注入运行在"可信环境"中倒是有些作用。SSL证书锁定之前,咱们须要了解一些根本的概念: 可信CA: CA(Certificate Authority)是数字证书认证核心的简称,是指发放、治理、破除数字证书的机构。CA的作用是查看证书持有者身份的合法性,并签发证书,以防证书被伪造或篡改,以及对证书和密钥进行治理。双向锁定:在客户端锁定服务端证书的根底上,服务端对客户端的证书也进行锁定,须要客户端再做一次证书预埋。多见于金融业务场景。证书链:证书链就是Root CA签发二级Intermediate CA,二级Intermediate CA能够签发三级Intermediate CA,也能够间接签发用户证书。从Root CA到用户证书之间形成了一个信赖链:信赖Root CA,就应该信赖它所信赖的二级Intermediate CA,从而就应该信赖三级Intermediate CA直至信赖用户证书。逐级验证:客户端对于收到的多级证书,须要从站点证书(leaf certificate)开始逐级验证,直至呈现操作系统或浏览器内置的受信赖CA 根证书(root certificate)。 SSL Pinning技术指的是在应用程序中只信赖固定证书或是公钥。应用程序开发人员在程序中应用SSL pinning技术作为利用流量的附加平安层。实现SSL pinning的办法次要有两种:证书固定和公钥固定。 证书固定:开发者将SSL证书的某些字节码硬编码在用程序中。当应用程序与服务器通信时,它将查看证书中是否存在雷同的字节码。如果存在,则应用程序将申请发送到服务器;如果字节码不匹配,它将抛出SSL证书谬误。此技术可避免攻击者应用本人的自签名证书。公钥固定:在客户拜访网站时进行公钥固定中,服务器将其公钥固定(通过注入)在客户端(客户)浏览器中。当客户端从新拜访同一网站时,服务器将标识其公共密钥以查看连贯的完整性。此技术还能够避免攻击者应用自签名证书。通常,咱们在测试一个利用的时候会设置代理,从而获取利用在运行过程中的流量。咱们应用代理工具获取流量的话,须要在设施中装置咱们本人的证书到可信赖的根证书中,这样应用程序才会将咱们的证书视为可信赖的无效证书,容许代理工具拦挡利用的流量。然而应用的SSL pinning技术的应用程序,只信赖指定的证书,那么咱们就算把咱们的证书装置到设施中,应用程序也不会信赖咱们的证书,这样的话咱们就不能通过代理的形式来拦挡利用的流量。 三、SSL pinning计划比照依据安全级别的不同,证书锁定计划大体能够分为如下几种: 安全等级策略信赖范畴破解办法 0齐全兼容策略信赖所有证书包含自签发证书无需非凡操作1零碎/浏览器默认策略信赖零碎或浏览器内置CA证书、用户装置的证书设施装置代理证书(用户)2System CA pinning只信赖零碎根证书,不信赖用户装置的证书(android7反对配置network-security-config)注入或者root后将用户证书拷贝到零碎证书目录3CA pinningRoot(intermediate)certificate pinning信赖指定CA方法的证书Hook注入等形式篡改锁定逻辑4Leaf Certificate pinning信赖指定站点证书Hook注入等形式篡改锁定逻辑,如遇双向锁定需将app自带证书导入代理软件3.1 站点证书锁定锁定站点证书是一种比拟平安的做法,然而它有个缺点就是须要保护预埋证书。如果你没思考过更新预埋证书的话就会呈现SSL握手失败的提醒。当初的站点证书个别有效期都是在1到2年,所以做站点证书锁定还要保障服务可用性的话就得必须实现客户端锁定证书指纹的更新。更新站点证书的网络申请通常有如下策略: 指纹更新申请被劫持到的概率比拟低,不锁定更新指纹申请间接应用https实现,毛病是安全性稍弱。自签名证书的有效期十分长,用自签名证书锁定指纹更新申请,毛病是兼容性稍弱。通常,锁定站点证书时,服务端须要实现证书指纹下发接口。还有每到证书行将过期的时候须要人为的将证书指纹配置到客户端中。提取指纹配置能够由代码实现,然而签发证书是由第三方CA实现的,所以此种形式并不是很智能。并且,"人"为因素的引入会给业务稳定性带来极大危险。 3.2 两头证书锁定锁定两头证书或根证书的劣势是安全性靠近锁定站点证书,且这两证书的有效期个别很长,能够达到10年到30年。所以,在不思考热更新证书指纹的状况下,能够应用此种计划。 除了证书有效期工夫长的劣势外,锁定间证书或根证书还能够更好的兼顾业简单的业务场景。因为企业子域名很多状况下都是本人业务的站点证书,然而一个企业通常站点证书都是由一个两头证书(根证书)衍生下来的。所以,锁定间证书或根证书不必特地对每个业务线做调整,一套策略或者计划根本能够实用企业整个业务线。 比方,咱们有一个两头证书,到期工夫为2029年,对于这么长的工夫窗口,咱们齐全能够让指纹随着利用更新实现迭代。 然而,锁定两头证书的计划会遇到一个问题,那就是更换证书CA(数字证书颁发机构)。这就须要通过备份一些可能会用的到CA指纹,两头证书的量级绝对于根证书要高出很多,而且也不好预测未来可能会更换到哪些两头证书。 3.3 根证书锁定参考操作系统更新预埋CA根证书的机制,咱们能够通过自降级实现锁定CA的指纹更新。在Android N零碎版本中,内置了150多个零碎根证书。而理论作为一个利用是不须要信赖这么多CA的根证书的。牢靠卖证书的CA就那么十来家,业务的平安需要决定了须要哪种类型的证书,这样备份证书的范畴就收窄了,且根证书的数量级绝对小,所以就没两头证书备份难的问题。 目前支流的SSL证书次要分为 DV < OV < EV,安全性和价格是递增的。DV和OV型证书最大的差异是:DV型证书不蕴含企业名称信息;而OV型证书蕴含企业名称信息。 综合看来,根锁定策略的安全性施行难度比拟适宜账号业务。接下来就是备份证书的抉择,备份锁定证书的次要的考量因素: 有效期安全性兼容性例如,上面是Mac零碎内置的一些根证书。有效期较长CA别离是HARICA、DigiCert等。其中,对于那些将在将来某个工夫才会失效的根证书,咱们能够将这类根作为备份,因为这些有效期长且在较早的零碎版本中预埋,阐明兼容性也过关,如果对安全性有更改谋求能够预埋些EV证书。 解决根证书的锁定问题后,接下来就是解决到期的问题。比方锁的根证书2031年到期,2031年之后应该如何解决。对于这种场景,咱们能够有如下选项: 回绝连贯,平安优先;容许连贯,可用优先;提醒危险让用户抉择,折中策略;3.4 客户端零碎证书锁定这个锁定计划绝对前三个要激进许多,安全性晋升也绝对无限,不过能够作为一种增强的计划。咱们须要做的仅仅是将通用操作系统中用户装置的第三方证书移除APP的证书信赖列表。并且从Android7.0版本开始默认反对此个性,操作的办法也很简略,只须要通过network-security-config更改配置即可。 在 Android 7.0 及其当前的版本中,咱们能够通过应用“网络安全性配置”来自定义其平安(HTTPS、TLS)连贯的行为,无需批改任何代码,上面是官网对于网络安全配置的阐明。 ...

December 17, 2022 · 2 min · jiezi

关于android:数据价值深度挖掘分析服务上线探索能力

近日,华为剖析服务6.9.0版本公布,正式上线摸索能力。开发者可自在定义与配置分析模型,反对报告实时预览,数据洞察体验更加灵便与便捷。 新上线的摸索能力中,有漏斗剖析、事件归因、会话路径分析三个高级分析模型。在原有能力的根底上,时效性进一步加强,开发者在实现配置与报告创立后,即能查看具体内容。通过低时延、快响应的数据分析,可能及时发现用户在要害转化节点和链路的散失异样,基于此可迅速制订调优策略,无效晋升经营效率。 一、漏斗剖析:直观剖析各环节流失率,达成继续无效的用户增长要害业务流程的漏斗创立可帮忙经营直观剖析转化异样,迅速定位问题节点;而响应更快、工夫颗粒度更细的转化周期更有利于及时发现异常环节的用户散失。 摸索下的漏斗剖析沿用原漏斗分析模型,在此基础上新增转化周期自定义能力,可依照分钟、小时、天级三个维度自在定义,不再局限于原有的天然天与会话转化周期。例如,在电商大促流动刚开始的黄金阶段,经营可能会更加关注用户在前几小时甚至几十分钟内的用户转化状况,那么能够通过自定义转化周期的办法,灵便调整并实时预览报告,迅速定位异样散失,及时调优。 电商转化漏斗示意,非实在数据 须要留神的是,随着摸索漏斗剖析的上线,咱们将敞开原漏斗剖析菜单入口,您的历史漏斗剖析报告将全副迁徙至摸索报告中,可在相干页面查看。 二、归因剖析:精准还原每次转化的奉献散布,帮忙企业优化资源配置摸索下的归因剖析仍旧沿用原“归因剖析—事件归因剖析”模型,开发者可自在定义指标转化事件和待归因事件,并依据业务特点抉择更适宜的归因模型。 举个例子,当促销福利类流动上线时,经营通常会通过Push音讯、利用内弹窗等各类形式触达用户,以实现用户付费转化晋升的目标。那评估不同模式的营销奉献占比则能够通过事件归因来实现,咱们将“领取实现”作为指标转化事件,以“点击利用内音讯”、“营销Push点击事件”为“待归因事件”,通过建设相干归因报告后即能预览不同营销策略对购买商品的贡献率,正当调整和优化估算调配。 归因报告示意,非实在数据 和漏斗剖析一样,原事件归因剖析菜单入口也将下线敞开,您能够在摸索中查看历史创立的事件归因剖析报告。 三、会话路径分析:理解用户利用内行为,验证经营思路,领导产品迭代和原会话路径分析不同的是,摸索下的会话路径分析反对开发者自由选择须要剖析的指标事件与页面,同时事件级门路还反对定义起始事件和完结事件。 面对盘根错节的用户利用内理论流转状况,会话门路的摸索则更加明确与聚焦。开发者通过要害事件的筛选,能够更便捷地剖析出什么样的门路转化周期更短,哪条门路更合乎用户的应用习惯等,让产品的进一步迭代优化更具思路与方向。 会话门路报告示意,非实在数据 作为一站式用户行为剖析平台,华为剖析服务既为开发者提供了丰盛的预置分析模型,又上新了更加灵便的高级数据摸索能力,满足更多开发者精细化经营诉求,提供更好更快的数据经营体验。以上就是华为剖析服务摸索能力的相干介绍,欲了解更多更新内容,欢送拜访华为剖析服务官网,获取剖析服务开发领导文档。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

December 16, 2022 · 1 min · jiezi

关于android:FAQ在华为鸿蒙车机上集成华为帐号的常见问题总结

随着新一代信息技术与汽车产业的深度交融,智能网联汽车正逐步成为汽车产业倒退的策略制高点,无论是传统车企还是新权势都瞄准了“智能座舱”这种新一代人机交互形式。面对竞争如此强烈的车机市场,华为鸿蒙车机系统的呈现,给消费者带来了不同凡响的便捷应用感触,这得益于华为在硬件、软件和场景优化上的技术劣势,用户只需一个华为帐号便可疾速登录车机。 本文章收集了在车机上集成华为帐号服务中会遇到的典型问题,并给出了解决办法以提供参考。 问题1 :鸿蒙车机系统集成 Account Kit SDK,帐号登录失败,报错误码2002。 起因剖析:2002错误码的个别是利用尚未受权,须要受权。该错误码个别在silentSignIn接口中呈现。解决办法:在调用静默登录接口silentSignIn失败后,再调用前台登录受权signIn接口,应用显式登录形式;调用显式登录形式时,如果没有通过用户的受权,那么会有相应的受权页面进行受权。问题2 :鸿蒙车机上安装车机版的HMS Core包之后,登录报错,返回错误码 7005。起因剖析:登录时提醒7005错误码,示意传入参数有误。对日志的进一步剖析发现,数据库中有数据残留,之前曾经有一个帐号存在数据库中,帐号保留失败,须要把数据先删除,而后再从新登录。 解决办法:应用删除数据库数据命令:/data/system_ce/0/accounts_ce.db ,然而前提是车机平板必须要领有ROOT权限。 问题3 :鸿蒙车机上调用退出帐号的接口后,再次登录的时候,登录二维码无奈弹出,无奈重现登录。鸿蒙车机上有个开发问题:调用这个退出帐号登录的接口当前,oncomplete能够打印,然而当再次登录的时候,登录二维码就不弹出来了,如同并没有退出登录。 起因剖析:具体询问开发者CP得悉,您参考的不是鸿蒙帐号退出的文档中的代码,而是安卓帐号退出的代码,已倡议开发者CP参考鸿蒙帐号退出的文档中的代码从新集成测试。解决办法:开发者联盟官网文档HarmonyOS帐号退出登录文档链接:https://developer.huawei.com/... 在鸿蒙车机上的帐号退出和在手机上还是有区别的,在车机上调用signout接口,只是勾销受权,并不是齐全退出登录,利用退出华为帐号后,设施上的华为帐号依然处于登录状态,因为利用曾经被受权,所以后续登录不提醒输出登录凭据是失常状况。如果想要实现齐全的退出,您能够尝试以下操作: • 从帐号核心登记设施上的华为ID(设置 > 帐号核心 > 退出帐号) • 撤销华为ID受权(设置 > 帐号核心 > 隐衷核心 > 管制对您帐号的拜访,抉择利用并点击“勾销受权”) 然而有CP反馈鸿蒙车机上没有这个入口,显示“无受权的利用和网站”,所以无奈进行上述操作,须要申请权限: com.huawei.hms.account.logout 而后 Task<Void> task = accountAuthService.logOut(); 能够实现利用齐全的退出。 问题4:鸿蒙车机上调用退出帐号的logout接口,返回错误码2030,该如何解决?问题形容:鸿蒙车机上调用退出帐号的logout接口,返回错误码2030。 起因剖析:2030错误码的官网解释是 放弃帐号登录。 解决办法:在呈现上图的扫码登录页面的时候,把登录页面中的“记住我的登录状态”的单选框的勾号点击去掉,再次登录就能够从新弹出二维码。然而思考到用户可能会不晓得次操作,不会去点掉单选框的勾号,那么车机上就退出不了,所以这种方法并不能从根本上解决问题。依据对日志的进一步剖析,发现CP应用的是手机版的HMS Core APK的包; 然而车机和手机的HMS Core,并不是应用同一个包,针对车机,HMS Core 有独自的APK安装包。所以倡议CP下载更换HMS Core的包,再从新测试。 问题5:鸿蒙车机系统负一屏打包的签名变了之后,报错6003,是不是须要重新配置指纹证书 ?起因剖析:签名变更个别须要从新在AGC上配置签名指纹证书,签名变动,导致呈现签名匹配失败。解决办法:请在AppGallery Connect后台上重新配置签名指纹证书,而后从新测试。理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

December 15, 2022 · 1 min · jiezi

关于android:MobSDK引进相关问题

1、进入寰球当先的数据智能科技平台-MobTech袤博mob官网首先注册帐号、核验身份、抉择开发者平台 2、创立我的项目的appkey和对应的appSecret进入开发者模式后,对应以下几个选项模块(以短信验证模块为例),点击开始应用跳转到集体开发平台后点击创立利用,并输出相干信息创立胜利后显示页面 3、引入mob依赖点击SDK下载官网提供的增加代码在线装置,免下载SDK ,按步骤进行装置 4、Android studio引入配置关上app,次要批改以下几个文件<1>gradle.properties android.enableJetifier=trueMobSDK.spEdition=FP<2>settings.gradle在新版中settings.gradle配置中默认设置依赖模式为FAIL_ON_PROJECT_REPOS,导致间接或通过插件申明的任何存储库都将会触发构建谬误,故咱们将其替换成 repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)并在repositories中引入maven { allowInsecureProtocol = true //加这个是为了防止mob被断定为不平安的协定而无奈引入url "http://mvn.mob.com/android"}<3>build.gradle 退出对应的插件依赖包,并配置MobSDK的设置<4>如果呈现以下结果表明引入胜利,如果有报错景象可能是因为环境更新导致gradle版本变更,到build.gradle(project)下配置一下版本信息 repositories { google() mavenCentral()//晚期用的是JCenter maven { allowInsecureProtocol = true url 'https://jitpack.io' } maven { allowInsecureProtocol = true url "https://s01.oss.sonatype.org/content/groups/public" } // 增加Mob Maven地址 maven { allowInsecureProtocol = true url "http://mvn.mob.com/android"}}dependencies { classpath 'com.android.tools.build:gradle:3.2.0' //也能够写你本人的版本 // 注册MobSDK classpath "com.mob.sdk:MobSDK:+"} <5>增加用户权限增加须要的用户权限 <!-- if you want to load images from the internet --><uses-permission android:name="android.permission.RECORD_AUDIO" /><uses-permission android:name="android.permission.CAMERA" /><!-- if you want to load images from a file OR from the internet --><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

December 15, 2022 · 1 min · jiezi

关于android:Mobtech秒验SDK一站式解决用户登录场景

据悉,北京中文万维科技有限公司旗下多款APP,和MobTech开发的秒验SDK达成单干,为其提供用户一键登录解决方案。北京中文万维科技有限公司是一家立志以挪动互联网浏览为倒退终点的浏览互动娱乐高新技术企业,旗下领有多款浏览类APP。在日常应用中,其用户在进行手机注册时常会碰到流程过多,短信验证码接管不及时、工夫长等情况,影响用户体验。 为进步用户体验并解决登录流程过程的问题,万维科技抉择了mobtech的秒验SDK,只需点击按钮一步实现验证,极大缩小了用户在注册登录环节消耗的工夫,同时还能够防止账号被盗等危险。 同时,秒验SDK反对三大运营商号码认证,可一次性实现三网对接,优化了用户在手机注册时因网络通道拥挤而呈现的延误问题。 一键登录手机验证的原理秒验SDK的实现原理是通过运营商特有的网关认证能力,验证待校验手机号码和利用所在的手机号码一致性,从而达到和短信验证码一样登录验证用户身份的作用。 这种形式可间接由运营商帮忙APP取号验证,用户既不须要输出账号密码,也不须要期待获取短信验证码,大大减少了等待时间。 丑化注册界面 升高经营老本不仅如此,秒验还有其余长处,在APP接入秒验SDK后,不仅能够优化注册界面的好看水平,还可能从注册源头为企业升高短信验证收入的成本费用。在应用过程中,用户验证胜利才会产生计费,因而节俭很多因有效短信而收入的费用。 验证增值服务:防薅羊毛工具MobTech作为寰球当先的数据智能科技平台,致力于为开发者提供优质便捷的SDK产品,针对营销反作弊行为推出【验证解决方案】,从手机注册验证的源头杜绝羊毛党入侵平台,有机整合了设施指纹追踪舞弊、用户画像排查舞弊等能力,可广泛应用于电商营销、金融领取、生存服务等场景,更好帮忙运营者防备黑灰产舞弊侵害。开发者无需下载安装多个SDK产品,用户只需从验证开始,即可判断身份。 将来,MobTech将继续优化晋升旗下开发者服务和SDK业务能力,为开发者及C端用户发明更多便捷,实用性强的产品。

December 14, 2022 · 1 min · jiezi

关于android:如何用3D流体实现逼真水流效果

华为利用市场在2022年HDC大会期间公布了一款3D水流主题,基于华为HMS Core Scene Kit服务能力,展示平面灵动的水流岛屿,可追随用户指尖实现实时流体稳定成果,既趣味又解压。 让变幻莫测的物质来实现咱们在影视和游戏等多种利用场景中的奇思妙想,从晚期步骤沉重的特效制作演变到现在,曾经有了更为轻量易用的解题范式,只需破费10分钟便可打造一个真切的3D流体成果。 什么是Scene Kit流体模仿?Scene Kit即图形引擎服务,提供轻量级3D图形渲染引擎,能够为游戏、AR & VR等挪动端利用提供易于应用的渲染接口,助力打造粗劣酷炫的视觉体验。 Scene Kit的3D流体技术,目前反对挪动端水、油、岩浆等不同类型的物理实在流体模仿。服务中蕴含原子化接口,场景话接口,离线简模插件,实时光追插件等。 性能优越:基于三维图形渲染框架和算法,提供高性能低功耗的三维平面场景构建能力。 轻量易用:提供场景化挪动利用接口,简化三维图形利用开发,易于为二维图形利用拓展构建三维平面场景。 成果真切:基于物理的渲染能力,提供高画质三维场景成果和沉迷式图形体验。 实操环节:用3D流体实现真切水流成果开发环境装置Android Studio 3.6.1及以上。 JDK 1.8(举荐)。 您的利用应满足以下条件: minSdkVersion 19及以上。 targetSdkVersion 30(举荐)。 compileSdkVersion 30(举荐)。 Gradle 5.4.1及以上(举荐)。 如果同时应用多个HMS Core的服务,则须要应用各个Kit对应的最大值。 测试利用的设施:Android 4.4及以上。 开发配置具体筹备步骤请参考图形引擎服务开发者联盟官网。 开发筹备Android Studio的代码库配置在Gradle插件7.0以下版本、7.0版本和7.1及以上版本有所不同。请依据您以后的Gradle插件版本,抉择对应的配置过程。 在“buildscript > repositories”中配置HMS Core SDK的Maven仓地址。如果App中增加了“agconnect-services.json”文件则须要在“buildscript > dependencies”中减少agcp插件配置。关上我的项目级“settings.gradle”文件,配置HMS Core SDK的Maven仓地址。buildscript { repositories { google() jcenter() // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huawei.com/repo/'} } dependencies { ... // 减少agcp插件配置,举荐您应用最新版本的agcp插件。 classpath 'com.huawei.agconnect:agcp:1.6.0.300' }}dependencyResolutionManagement {...repositories {google()jcenter() // 配置HMS Core SDK的Maven仓地址。maven {url 'https://developer.huawei.com/repo/'}}}增加权限<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"<uses-permission android:name="android.permission.CAMERA" />开发步骤创立两个Activity:MainActivity和SampleActivity。其中MainActivity负责实现SceneKit初始化,SampleActivity用于包容渲染视图,并出现最终成果。在MainActivity中增加初始化标识和初始化办法。在初始化办法中设置SceneKit全局属性,并应用同步初始化接口initializeSync初始化SceneKit。private static final int REQ_CODE_UPDATE_SCENE_KIT = 10001;private boolean initialized = false;private void initializeSceneKit() { // 如果曾经初始化,不再反复初始化。 if (initialized) { return; } // 创立SceneKit属性,配置AppId与图形后端API。 SceneKit.Property property = SceneKit.Property.builder() .setAppId("${app_id}") .setGraphicsBackend(SceneKit.Property.GraphicsBackend.GLES) .build(); try { // 应用同步接口进行初始化。 SceneKit.getInstance() .setProperty(property) .initializeSync(getApplicationContext()); initialized = true; Toast.makeText(this, "SceneKit initialized", Toast.LENGTH_SHORT).show(); } catch (UpdateNeededException e) { // 捕捉须要降级异样,拉起降级Activity。 startActivityForResult(e.getIntent(), REQ_CODE_UPDATE_SCENE_KIT); } catch (Exception e) { // 解决初始化异样。 Toast.makeText(this, "failed to initialize SceneKit: " + e.getMessage(), Toast.LENGTH_SHORT).show(); }}复写MainActivity的onActivityResult办法,解决降级后果// resultCode为-1时代表降级胜利,其余resultCode均代表降级失败。private static final int RES_CODE_UPDATE_SUCCESS = -1;@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); // 如果降级胜利,尝试从新初始化。 if (requestCode == REQ_CODE_UPDATE_SCENE_KIT && resultCode == RES_CODE_UPDATE_SUCCESS) { try { SceneKit.getInstance() .initializeSync(getApplicationContext()); initialized = true; Toast.makeText(this, "SceneKit initialized", Toast.LENGTH_SHORT).show(); } catch (Exception e) { // 从新尝试初始化时不再捕捉降级异样。 Toast.makeText(this, "failed to initialize SceneKit: " + e.getMessage(), Toast.LENGTH_SHORT).show(); }}}在MainActivity的Layout文件中增加按钮,用于跳转至SampleActivity。<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/btn_render_view_demo_text" android:onClick="onBtnRenderViewDemoClicked"/></LinearLayout>在MainActivity中增加按钮回调。public void onBtnRenderViewDemoClicked(View view) { // 如果未初始化,先初始化。 if (!initialized) { initializeSceneKit(); return; } // 跳转到SampleActivity。 startActivity(new Intent(this, SampleActivity.class));}新建渲染视图子类XRenderView,须要在这个子类中增加相机与灯光组件,详情请见安排场景。.public class XRenderView extends RenderView { public XRenderView(Context context) { //... prepareScene(); } //...}创立SampleActivity为展现成果页面public class DemoActivity extends Activity implements SensorEventListener { private XRenderView renderView; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); renderView = new XRenderView(this); setContentView(renderView); //... }}增加createFluidSecene办法用于流体布局3D流体组件不反对动静加载,只有在流体场景初始化时设置,才失效 ...

December 14, 2022 · 3 min · jiezi

关于android:程序员学习-CPU-有什么用

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 发问。前言大家好,我是小彭。 在上一篇文章里,咱们聊到了计算机的冯·诺依曼架构,以及计算机的五大部件:控制器、运算器、存储器、输出设施和输出设备。在当初计算机体系中,CPU 是整个计算机的外围,次要蕴含控制器和运算器两大部件。 在后续文章中,咱们将从 CPU 的根本意识开始,逐渐将 CPU 与执行零碎、存储系统 和 I/O 零碎串联起来,请关注。 小彭的 Android 交换群 02 群曾经建设啦,扫描文末二维码进入~ 思维导图: 1. 意识 CPU 中央处理器1.1 什么是 CPU?地方处理单元(Central Processing Unit,CPU)也叫中央处理器或主处理器,是整个计算机的外围,也是整台计算机中造价最低廉的部件之一。 从硬件的角度: CPU 由超大规模的晶体管组成; 从性能的角度: CPU 外部由时钟、寄存器、控制器和运算器 4 大部分组成。 1、时钟(Clock): 负责收回时钟信号,也能够位于 CPU 内部;2、寄存器(Register): 负责暂存指令或数据,位于存储器零碎金字塔的顶端。应用寄存器可能补救 CPU 和内存的速度差,缩小 CPU 的访存次数,进步 CPU 的吞吐量;3、控制器(Control Unit): 负责控制程序指令执行,包含从主内存读取指令和数据发送到寄存器,再将运算器计算后的后果写回主内存;4、运算器(Arithmetic Logic Unit,ALU): 负责执行控制器取出的指令,包含算术运算和逻辑运算。冯·诺依曼架构 —— 图片援用自 Wikipedia 1.2 为什么要学习 CPU?对于大部分程序员,日常所解决的工作都是在跟 Java 和 C++ 等高级语言打交道,并不会间接地与 CPU 打交道。那么,为什么咱们还要花这么多工夫去学习 CPU 呢?我认为有以下起因: 起因 1 - 把握 CPU 原理可能开发更高性能的程序: 了解 CPU 的工作原理有助于设计出更高性能的算法或代码,例如通过防止伪共享、进步缓存命中率等形式进步程序运行效率,就须要对 CPU 的缓存机制有肯定的了解;起因 2 - 扩大计划积攒: CPU 是整个计算机系统中最简单的模块,也是当代计算机科学的制高点。积攒 CPU 外部的解决方案,可能为未来的遇到相似问题提供思路,达到举一反三的作用。例如 CPU 缓存淘汰策略与利用内存的缓存淘汰策略有相似之处;起因 3 - CPU 是常识体系最底层的常识: 当咱们在思考或解决某一个问题时,就须要利用到更深层次的常识积攒来解释,而 CPU 就是位于常识体系中最底层常识。例在内存零碎的可见性、执行零碎的 IO_WAIT 和线程池设计等问题中,都须要对 CPU 的执行机制有肯定了解。CPU ...

December 1, 2022 · 3 min · jiezi

关于android:如何使用-LinkedHashMap-实现-LRU-缓存

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 发问。大家好,我是小彭。 在上一篇文章里,咱们聊到了 HashMap 的实现原理和源码剖析,在源码剖析的过程中,咱们发现一些 LinkedHashMap 相干的源码,过后没有开展,当初它来了。 那么,LinkedHashMap 与 HashMap 有什么区别呢?其实,LinkedHashMap 的应用场景十分明确 —— LRU 缓存。明天,咱们就来探讨 LinkedHashMap 是如何实现 LRU 缓存的。 本文源码基于 Java 8 LinkedHashMap。 小彭的 Android 交换群 02 群曾经建设啦,扫描文末二维码进入~ 思维导图: 1. 意识 LRU 缓存淘汰算法1.1 什么是缓存淘汰算法?缓存是进步数据读取性能的通用技术,在硬件和软件设计中被宽泛应用,例如 CPU 缓存、Glide 内存缓存,数据库缓存等。因为缓存空间不可能无限大,当缓存容量占满时,就须要利用某种策略将局部数据换出缓存,这就是缓存的替换策略 / 淘汰问题。常见缓存淘汰策略有: 1、随机策略: 应用一个随机数生成器随机地抉择要被淘汰的数据块;2、FIFO 先进先出策略: 记录各个数据块的拜访工夫,最早拜访的数据最先被淘汰;3、LRU (Least Recently Used)最近起码策略: 记录各个数据块的拜访 “工夫戳” ,最近最久未应用的数据最先被淘汰。与前 2 种策略相比,LRU 策略均匀缓存命中率更高,这是因为 LRU 策略利用了 “局部性原理”:最近被拜访过的数据,未来被拜访的几率较大,最近很久未拜访的数据,未来拜访的几率也较小;4、LFU (Least Frequently Used)最不常常应用策略: 与 LRU 相比,LFU 更加重视应用的 “频率” 。LFU 会记录每个数据块的拜访次数,起码拜访次数的数据最先被淘汰。然而有些数据在开始时应用次数很高,当前不再应用,这些数据就会长工夫净化缓存。能够定期将计数器右移一位,造成指数衰减。FIFO 与 LRU 策略 ...

December 1, 2022 · 8 min · jiezi

关于android:MobPush-推送查询API

设施详情接口接口地址:http://api.push.mob.com/devic...接口示例:http://api.push.mob.com/devic...申请形式:GET接口拜访频率限度:受限,参照接口频率限度申请头部申请参数:无返回参数阐明 依据别名查问设施信息接口地址:http://api.push.mob.com/devic...接口示例:http://api.push.mob.com/devic...申请形式:GET接口拜访频率限度:受限,参照接口频率限度申请头部申请参数:无返回参数阐明 依据标签查看查问设施信息接口地址:http://api.push.mob.com/devic...申请形式:POST返回阐明:目前只返回1000条设施相干信息接口拜访频率限度:受限,参照接口频率限度申请头部申请参数:返回参数阐明 设施散布接口(用于查问设施的推送是否关上或者卸载的散布状况)接口地址:http://api.push.mob.com/devic...申请形式:GET接口拜访频率限度:受限,参照接口频率限度申请头部:申请参数:无返回参数阐明 新增标签 删除标签 清空标签接口地址: http://api.push.mob.com/devic...申请形式:POST接口拜访频率限度:受限,参照接口频率限度申请头部申请参数:返回参数: 设置别名接口地址:http://api.push.mob.com/devic...申请形式:POST接口拜访频率限度:受限,参照接口频率限度申请头部申请参数:返回参数: 推送工作状态(依据workId查问 workId为推送工作ID)接口地址:http://api.push.mob.com/v3/pu...申请形式:POST接口拜访频率限度:受限,参照 接口频率限度申请头部申请参数申请示例 {"appkey":"2e08782eb311b","workId":"4bp4tw9tzd1rwcczr4"}返回参数阐明 推送详情(依据workId查问 workId为推送工作ID)接口地址:http://api.push.mob.com/v3/st...申请形式:POST接口拜访频率限度:受限,参照 接口频率限度申请头部申请参数申请示例 {"workId":"32ugyk7bqlm8we8","appkey":"2ecbc7bc53712"}返回参数阐明 推送详情(依据workId数组查问 workId为推送工作ID)接口地址:http://api.push.mob.com/v3/st...申请形式:POST接口拜访频率限度:受限,参照 接口频率限度申请头部申请参数申请示例 {"workIds":["32ugyk7bqlm8we8","32ugykg7590v56o"],"appkey":"2ecbc7bc53712"}返回参数阐明 推送详情(依据workno查问 workno为自定义工作ID,只能查问最近3天的数据)接口地址: http://api.push.mob.com/v3/st...申请形式:POST接口拜访频率限度:受限,参照 接口频率限度申请头部申请参数返回参数请参考3.1依据工作id查问的返回参数阐明 推送详情(按小时查问)接口地址: http://api.push.mob.com/v3/st...申请形式:POST接口拜访频率限度:受限,参照 接口频率限度申请头部申请参数申请示例 {"hour":"2020082415","appkey":"2ecbc7bc53712"}返回参数阐明 推送详情(按日期查问)接口地址: http://api.push.mob.com/v3/st...申请形式:POST接口拜访频率限度:受限,参照 接口频率限度申请头部申请参数申请示例 {"day":"20200824","appkey":"2ecbc7bc53712"}返回参数请参考3.4依据小时查问的返回参数阐明 推送详情(查问每次下发的设施信息)注:该接口暂只反对查精准推送的推送设施详情(例如:别名、rid、别名文件推送和rid文件推送) 接口地址: http://api.push.mob.com/v3/st...申请形式:POST接口拜访频率限度:受限,参照 接口频率限度申请头部申请参数申请示例 {"appkey":"2ecbc7bc53712","workId":"32ugyk7bqlm8we8","pageIndex":1,"pageSize":20}返回参数阐明 依据流动工作id查问流动工作聚合数据接口地址:http://api.push.mob.com/v3/st...申请形式:POST申请头部申请参数申请示例 // 流动工作id为用户自行设置,且惟一{"appkey":"2ecbc7bc53712","activityWorkId ":"09876213123131"}返回参数阐明 其余接口校验scheme长度是否超过厂商限度接口地址:http://api.push.mob.com/push/...申请形式:POST接口拜访频率限度:受限,参照 接口频率限度申请头部申请参数申请示例 {"scheme":"mlink://com.mob.mobpush.link","schemeDataList":[{"key":"key","value":"value"}]}返回参数阐明 FileId上传文件注:上传的File保留工夫一个月,一次最多可上传100万rid/别名 接口地址:http://api.push.mob.com/v3/pu...申请形式:POST接口拜访频率限度:受限,参照 接口频率限度申请头部申请参数申请示例 {"appkey":"3159a7cd8d12f","type":1,"uploadData":["65kzjroi4idsi68","65kzmcrgi2kz85c"]}返回参数阐明

November 30, 2022 · 1 min · jiezi

关于android:开闭原则详细介绍

目录介绍00.问题思考剖析01.前沿简略介绍02.如何了解开闭准则03.举一个原始的例子04.批改后的代码05.批改代码违反准则么06.如何做到开闭准则07.如何使用开闭准则08.总结一下内容00.问题思考剖析01.什么叫作开闭准则,他的主要用途是什么?02.如何做到拓展凋谢,批改关闭这一准则,联合案例说一下如何实现?01.前沿简略介绍学习 SOLID 中的第二个准则:开闭准则。集体感觉,开闭准则是 SOLID 中最难了解、最难把握,同时也是最有用的一条准则。之所以说这条准则难了解,那是因为,“怎么的代码改变才被定义为‘扩大’?怎么的代码改变才被定义为‘批改’?怎么才算满足或违反‘开闭准则’?批改代码就肯定意味着违反‘开闭准则’吗?”等等这些问题,都比拟难了解。之所以说这条准则难把握,那是因为,“如何做到‘对扩大凋谢、批改敞开’?如何在我的项目中灵便地利用‘开闭准则’,以防止在谋求扩展性的同时影响到代码的可读性?”等等这些问题,都比拟难把握。之所以说这条准则最有用,那是因为,扩展性是代码品质最重要的衡量标准之一。在 23 种经典设计模式中,大部分设计模式都是为了解决代码的扩展性问题而存在的,次要听从的设计准则就是开闭准则。02.如何了解开闭准则开闭准则的英文全称是 Open Closed Principle,简写为 OCP。它的英文形容是:software entities (modules, classes, functions, etc.) should be open for extension , but closed for modification。咱们把它翻译成中文就是:软件实体(模块、类、办法等)应该“对扩大凋谢、对批改敞开”。 这个形容比拟简略,如果咱们具体表述一下,那就是,增加一个新的性能应该是,在已有代码根底上扩大代码(新增模块、类、办法等),而非批改已有代码(批改模块、类、办法等)。03.举一个原始的例子为了让你更好地了解这个准则,我举一个例子来进一步解释一下。这是一段 API 接口监控告警的代码。 其中,AlertRule 存储告警规定,能够自在设置。Notification 是告警告诉类,反对邮件、短信、微信、手机等多种告诉渠道。NotificationEmergencyLevel 示意告诉的紧急水平,包含 SEVERE(重大)、URGENCY(紧急)、NORMAL(一般)、TRIVIAL(无关紧要),不同的紧急水平对应不同的发送渠道。对于 API 接口监控告警这部分,更加具体的业务需要剖析和设计,咱们会在前面的设计模式模块再拿进去进一步解说,这里你只有简略晓得这些,就够咱们明天用了。 public class Alert {private AlertRule rule;private Notification notification;public Alert(AlertRule rule, Notification notification) {this.rule = rule;this.notification = notification;}public void check(String api, long requestCount, long errorCount, long durationOfSeconds) {long tps = requestCount / durationOfSeconds;if (tps > rule.getMatchedRule(api).getMaxTps()) { notification.notify(NotificationEmergencyLevel.URGENCY, "...");}if (errorCount > rule.getMatchedRule(api).getMaxErrorCount()) { notification.notify(NotificationEmergencyLevel.SEVERE, "...");}}}下面这段代码非常简单,业务逻辑次要集中在 check() 函数中。当接口的 TPS 超过某个事后设置的最大值时,以及当接口申请出错数大于某个最大允许值时,就会触发告警,告诉接口的相干负责人或者团队。当初,如果咱们须要增加一个性能,当每秒钟接口超时申请个数,超过某个事后设置的最大阈值时,咱们也要触发告警发送告诉。这个时候,咱们该如何改变代码呢?次要的改变有两处:第一处是批改 check() 函数的入参,增加一个新的统计数据 timeoutCount,示意超时接口申请数;第二处是在 check() 函数中增加新的告警逻辑。具体的代码改变如下所示: ...

November 29, 2022 · 4 min · jiezi

关于android:上新啦KIT

HMS Core上新啦!剖析服务区服剖析全新上线;机器学习服务OCR新增手写辨认服务;3D建模续扫能力更新;视频编辑服务反对自定义上传素材……更多#HMS Core#能力可点击网页链接理解。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

November 29, 2022 · 1 min · jiezi

关于android:开发者问第五期

开发者问第五期问答分享来啦!如何实现虚实遮挡?如何打造沉迷感动静漫反射全局光照?机器学习服务OCR能力有哪些降级优化?点击链接,理解更多:https://developer.huawei.com/... 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

November 28, 2022 · 1 min · jiezi

关于android:单一职责原则详解

目录介绍00.问题思考剖析01.前沿根底介绍02.如何了解繁多指摘03.如何判断是否繁多04.繁多判断准则05.繁多就更好么06.总结回顾一下00.问题思考剖析01.如何了解类的繁多指摘,繁多指摘中这个繁多是如何评判的?02.懂了,然而会用么,或者理论开发中有哪些使用,是否举例说明繁多职责劣势?03.繁多指摘是否设计越繁多,越好呢?说出你的原因和论证的思路想法?04.繁多职责准则,除了利用到类的设计上,还能延长到哪些其余设计方面吗?01.前沿根底介绍学习一些经典的设计准则,其中包含,SOLID、KISS、YAGNI、DRY、LOD等。这些设计准则,从字面上了解,都不难。你一看就感觉懂了,一看就感觉把握了,但真的用到我的项目中的时候,你会发现,“看懂”和“会用”是两回事,而“用好”更是难上加难。从工作经验来看,很多共事因为对这些准则了解得不够透彻,导致在应用的时候过于教条主义,拿准则当真谛,生吞活剥,事与愿违。02.如何了解繁多指摘繁多职责准则的英文是 Single Responsibility Principle,缩写为 SRP。这个准则的英文形容是这样的:A class or module should have a single reponsibility。如果咱们把它翻译成中文,那就是:一个类或者模块只负责实现一个职责(或者性能)。留神,这个准则形容的对象蕴含两个,一个是类(class),一个是模块(module)。对于这两个概念,在专栏中,有两种了解形式。一种了解是:把模块看作比类更加形象的概念,类也能够看作模块。另一种了解是:把模块看作比类更加粗粒度的代码块,模块中蕴含多个类,多个类组成一个模块。不论哪种了解形式,繁多职责准则在利用到这两个形容对象的时候,情理都是相通的。为了不便你了解,接下来我只从“类”设计的角度,来解说如何利用这个设计准则。对于“模块”来说,你能够自行引申。繁多职责准则的定义形容非常简单,也不难理解。一个类只负责实现一个职责或者性能。也就是说,不要设计大而全的类,要设计粒度小、性能繁多的类。换个角度来讲就是,一个类蕴含了两个或者两个以上业务不相干的性能,那咱们就说它职责不够繁多,应该将它拆分成多个性能更加繁多、粒度更细的类。举一个例子来解释一下。比方,一个类里既蕴含订单的一些操作,又蕴含用户的一些操作。而订单和用户是两个独立的业务畛域模型,咱们将两个不相干的性能放到同一个类中,那就违反了繁多职责准则。为了满足繁多职责准则,咱们须要将这个类拆分成两个粒度更细、性能更加繁多的两个类:订单类和用户类。举一个例子来解释一下。比方,一个类里既蕴含订单的一些操作,又蕴含用户的一些操作。而订单和用户是两个独立的业务畛域模型,咱们将两个不相干的性能放到同一个类中,那就违反了繁多职责准则。为了满足繁多职责准则,咱们须要将这个类拆分成两个粒度更细、性能更加繁多的两个类:订单类和用户类。03.如何判断是否繁多从刚刚这个例子来看,繁多职责准则看似不难利用。那是因为我举的这个例子比拟极其,一眼就能看出订单和用户毫不相干。但大部分状况下,类里的办法是归为同一类性能,还是归为不相干的两类性能,并不是那么容易断定的。在实在的软件开发中,对于一个类是否职责繁多的断定,是很难拿捏的。我举一个更加贴近理论的例子来给你解释一下。在一个社交产品中,咱们用上面的 UserInfo 类来记录用户的信息。你感觉,UserInfo 类的设计是否满足繁多职责准则呢? public class UserInfo { private long userId; private String username; private String email; private String telephone; private long createTime; private long lastLoginTime; private String avatarUrl; private String provinceOfAddress; // 省 private String cityOfAddress; // 市 private String regionOfAddress; // 区 private String detailedAddress; // 具体地址 // ...省略其余属性和办法...}对于这个问题,有两种不同的观点。 一种观点是,UserInfo 类蕴含的都是跟用户相干的信息,所有的属性和办法都隶属于用户这样一个业务模型,满足繁多职责准则;另一种观点是,地址信息在 UserInfo 类中,所占的比重比拟高,能够持续拆分成独立的 UserAddress 类,UserInfo 只保留除 Address 之外的其余信息,拆分之后的两个类的职责更加繁多。哪种观点更对呢?实际上,要从中做出抉择,咱们不能脱离具体的利用场景。 ...

November 27, 2022 · 2 min · jiezi

关于android:万字-HashMap-详解基础优雅永不过时

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 发问。前言大家好,我是小彭。 在上一篇文章里,咱们聊到了散列表的整体设计思维,在后续几篇文章里,咱们将以 Java 语言为例,剖析规范库中实现的散列表实现,包含 HashMap、ThreadLocalMap、LinkedHashMap 和 ConcurrentHashMap。明天,咱们来探讨 Java 规范库中十分典型的散列表构造,也是 “面试八股文” 的规范题库之一 —— HashMap。 本文源码基于 Java 8 HashMap,并关联剖析局部 Java 7 HashMap。 小彭的 Android 交换群 02 群曾经建设啦,扫描文末二维码进入~ 思维导图: 1. 回顾散列表工作原理在剖析 HashMap 的实现原理之前,咱们先来回顾散列表的工作原理。 散列表是基于散列思维实现的 Map 数据结构,将散列思维利用到散列表数据结构时,就是通过 hash 函数提取键(Key)的特征值(散列值),再将键值对映射到固定的数组下标中,利用数组反对随机拜访的个性,实现 O(1) 工夫的存储和查问操作。 散列表示意图 在从键值对映射到数组下标的过程中,散列表会存在 2 次散列抵触: 第 1 次 - hash 函数的散列抵触: 这是个别意义上的散列抵触;第 2 次 - 散列值取余转数组下标: 实质上,将散列值转数组下标也是一次 Hash 算法,也会存在散列抵触。同时,这也阐明 HashMap 中同一个桶中节点的散列值不肯定是雷同的。事实上,因为散列表是压缩映射,所以咱们无奈防止散列抵触,只能保障散列表不会因为散列抵触而失去正确性。罕用的散列抵触解决办法有 2 类: 凋谢寻址法: 例如 ThreadLocalMap;拆散链表法: 例如明天要剖析的 HashMap 散列表。拆散链表法(Separate Chaining)的核心思想是: 在呈现散列抵触时,将抵触的元素增加到同一个桶(Bucket / Slot)中,桶中的元素会组成一个链表,或者跳表、红黑树等动静数据结构。相比于凋谢寻址法,链表法是更罕用且更稳固的抵触解决办法。 ...

November 26, 2022 · 16 min · jiezi

关于android:Android-序列化框架-Gson-原理分析可以优化吗

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 发问。前言大家好,我是小彭。 Gson 是 Google 推出的 Java Json 解析库,具备接入成本低、应用便捷、性能扩展性良好等长处,想必大家都很相熟了。在这篇文章里,咱们将探讨 Gson 的根本用法和以及次要流程的源码剖析。 小彭的 Android 交换群 02 群曾经建设啦,扫描文末二维码进入~ 学习路线图: 1. Gson 的根本应用Gradle 依赖 dependencies { implementation 'com.google.code.gson:gson:2.10'}1.1 GsonBuilder 配置项Gson 类是整个库的外围 API,在进行任何序列化或反序列化之前,咱们都须要取得一个 Gson 对象。能够间接 new 创立默认配置的 Gson 对象,也能够应用 GsonBuilder 结构者配置 Gson 对象。 事实上,一个 Gson 对象代表一个 Gson 工作环境,不同 Gson 对象之间的配置和缓存都不会复用。 因而,在我的项目中有必要在 common 层提供一个全局的 Gson 对象,既有利于对立序列化配置,也是 Gson 性能优化的基本保障。 GsonBuilder 应用示例 Gson gson = new GsonBuilder() // 设置自定义解析(不反对协变) .registerTypeAdapter(Id.class, new IdTypeAdapter()) // 设置自定义解析(反对协变) registerTypeHierarchyAdapter(List.class, new MyListTypeAdapter()) // 设置自定义解析(以工厂形式) .registerTypeAdapterFactory(new IdTypeAdapterFactory()) // 设置日期格局 .setDateFormat("yyyy-MM-dd HH:mm:ss:SSS") // 设置主动切换命名格调规定(默认不切换命名格调) .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE) // 设置过滤指定字段标识符(默认只过滤 transient 和 static 字段) .excludeFieldsWithModifiers(Modifier.TRANSIENT | Modifier.STATIC) // 设置类或字段过滤规定 .setExclusionStrategies(new MyExclusionStrategy1()) // 设置过滤规定(只实用于序列化) .addSerializationExclusionStrategy(new MyExclusionStrategy2()) // 设置过滤规定(只实用于反序列化) .addDeserializationExclusionStrategy(new MyExclusionStrategy3()) // 设置序列化版本号 .setVersion(1.0) // 启用非根底类型 Map Key .enableComplexMapKeySerialization() // 启用不过滤空值(默认会过滤空值) .serializeNulls() // 启用 Json 格式化 .setPrettyPrinting() .create();1.2 注解配置Gson 没有编译时解决,所以注解均是运行时注解。 ...

November 25, 2022 · 9 min · jiezi

关于android:如何实现一个优秀的-HashTable-散列表

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 发问。前言大家好,我是小彭。 在前几篇文章里,咱们聊到了 Java 中的几种线性表构造,包含 ArrayList、LinkedList、ArrayDeque 等。明天,咱们来探讨另一种罕用的根底数据结构,同时也是 “面试八股文” 的规范题库之一 —— 散列表(Hash Table)。 同时,在后续的文章里,咱们将以 Java 语言为例,剖析规范库中实现的散列表实现,包含 HashMap、ThreadLocalMap、LinkedHashMap 和 ConcurrentHashMap。请关注。 小彭的 Android 交换群 02 群曾经建设啦,扫描文末二维码进入~ 思维导图: 1. 什么是散列表?散列表是基于散列思维实现的 Map 数据结构,散列思维是散列表的外围个性,也就做哈希算法或 Hash 算法。散列算法是一种将 “任意长度的输出数据” 映射为 “固定长度的特征值” 的算法,输入的特征值就是散列值。 用一个表格总结散列算法的次要性质: 性质形容1、单向性(根本性质)反对从输出生成散列值,不反对从散列值反推输出2、高效性(根本性质)单次散列运算计算量低3、一致性(根本性质)雷同输出反复计算,总是失去雷同散列值4、随机性(高效性质)散列值在输入值域的散布尽量随机5、输出敏感性(高效性质)类似的数据,计算后的散列值差异很大将散列思维利用到散列表数据结构上时,就是通过 hash 函数提取键(Key)的特征值(散列值),再将键值对映射到固定的数组下标中,利用数组反对随机拜访的个性,实现 O(1) 工夫的存储和查问操作。 事实上,个别不会间接应用 hash 函数计算后的散列值作为数组下标。例如 Java Object#hashCode() 散列值是 int 类型,值域足足有 2^32 的容量,咱们不可能创立这么大的数组。 最简略的做法是将散列值对数组长度取余后再取绝对值:|hash % length|。如果数组长度 length 是 2 的整数幂,还能够等价替换成位运算:hash & (length - 1) ,不论被除数是正负后果都是负数。 不仅将取余运算替换为位运算,而且缩小了一次取绝对值运算,进步了索引的计算效率。 10 % 4 = 2-10 % 4 = -2 // 正数10 & (4 - 1) = 2-10 & (4 - 1) = 2 // 负数散列表示意图 ...

November 25, 2022 · 3 min · jiezi

关于android:小众安卓浏览器推荐狐猴浏览器可以安装Chrome扩展的手机浏览器

说到浏览器必定都会想到Chrome,不可否认的是电脑端的Chrome浏览器确实很好用,这也是它占据寰球大部分人的电脑的起因;然而手机端的Chrome浏览器就没有那么尽人意了,最重要的一个起因就是不能装置扩大插件。 然而随着手机浏览器的倒退,有了一些反对扩大的手机浏览器呈现,Safari自从iOS15和iPadOS15后也反对插件了,安卓手机中体现得比较突出的有kiwi浏览器、狐猴浏览器、雨见浏览器等等。 狐猴浏览器是我从年初就开始应用的浏览器,它浏览器内置了Chrome和edge插件商店入口,反对在插件商店间接下载安装扩大;除了扩大外,其它的性能也很齐全,比方深色模式、无痕模式、网页内查找、桌面模式等等。这款浏览器是由国内开发者开发的一款安卓手机浏览器,基于chromium内核,运行速度也是杠杠的。 狐猴浏览器下载安装后的插件是主动开启的,如果没有的话能够到扩大治理中开启。和Chrome一样,关上开发者模式后能够加载已解压的扩大。正在运行中的扩大会显示在菜单栏从右数起第二个的扩大按钮里,应用办法和PC端并无不同。 在【扩大治理】页面,能够看到所有下载的扩大,对扩大进行治理、开关等操作,关上开发者模式还能够加载已解压的扩大程序。顺便说一句,能够看到这个页面和Chrome浏览器是一样的,所以应用起来的学习老本很低,是比拟容易上手的。 因为一些插件没有适配好挪动端,所以在手机上很多都用不了,然而只有下载了油猴插件就能够实现绝大部分性能了。油猴脚本间接到greasyfork网站下载,操作和PC端也是一样的,亲测油猴脚本在狐猴浏览器上的运行非常流程,能感觉到开发者在这下面费了不少心理。 除此之外,狐猴浏览器的主页有自带起始页和infinity新标签页两种,能够在设置-主页外面本人抉择。Infinity自身也是一款十分实用的起始页类插件,免去了下载的步骤,因为我电脑上也是应用的infinity,能够间接同步我在电脑上的设置,这俩配套应用起来还挺不错的。

November 25, 2022 · 1 min · jiezi

关于android:HDC2022的无障碍参会体验手语服务是如何做到的

华为开发者大会2022(HDC)上,HMS Core手语数字人以全新形象亮相,并在直播中实现了长达3个多小时的实时手语翻译,向线上线下超过一千万的观众提供了业余、实时、精确的手语翻译服务,为听障人士提供了无障碍参会体验。面对专业性强且词汇量大的科技大会,HMS Core手语数字人是如何精确且流畅地打出手语的? 【解决三大技术难题,科技词汇信“手”拈来】直播中的实时手语翻译较传统翻译和文本转手语的翻译更为简单,次要在于语音辨认过程中各类场景声学环境简单难部署;手语词汇数据量少,尤其是业余畛域词汇较为匮乏;同时,手语语言具备独特的语序逻辑,并非依照日常谈话程序逐字翻译,而要对语句进行语序调整,比方“我有许多敌人,其中既有健听人,也有聋人”的手语语序是“我/敌人/多,听人/有,聋1/有”。因为手语视觉语言的独特性,手语表白中表情、动作地位、动作方向、体态变动、动作幅度大小等都是影响手语可懂度的重要因素。 “我有许多敌人,其中既有健听人,也有聋人。”的手语语序是 “我/敌人/多,听人/有,聋1/有。” 为了让手语数字人实现高可懂度的AI手语能力,HMS Core手语服务技术团队整合了“语音、手语”全链路的AI能力,解决了三大技术点:语音辨认的准确度、手语翻译的准确度、手语动作的晦涩度与节奏感。 首先,为了确保直播中演讲者语音能被精准辨认,尤其是大量中英文混合的技术名词,HMS Core手语数字人语音辨认性能,采纳动静的流式声学建模技术,实现了1秒以内即可出辨认后果,同时借助热词等定制伎俩,专业术语的辨认成果也失去了定向优化,这为手语数字人下一步的手语翻译提供了高精准度的文本根底。 在手语翻译准确度方面,HMS Core手语服务专门组织了一个动作优化团队,并在机器翻译、手语转写等算法方面进行了翻新:通过机器翻译算法,中文表白可疾速转写为手语表白,并主动进行词序调整、词义消歧、表情剖析;通过双重迁徙学习等办法,让算法了解句子的语义和语境,并精确预计出每个手语词对应的体态、表情及口型,实现手语动作、体态、表情、口型全方位地活泼表白,无效晋升手语转写的准确率及速度。 此外,手语生成计划交融了大量手语语言学研究成果,通过调整词、词组、句子之间的进展及速度等,加强节奏感。同时,参考新闻手语主播的手语打法,预训练模型的语句稀释算法,可将简单的长句稀释为简略的短句,并基于语义进行翻译,最终生成晦涩且合乎听障人士表白习惯的手语动作。 对于在HDC大会上罕用的科技词汇“华为”,“鸿蒙”及“人工智能”等,其规范打法已纳入HMS Core手语词汇库。而对于大会上“原子化服务”等较少见的组合型业余词汇,则按字面意思将其拆解成“原子”“化”“服务”三个手语动作,同时生成对应的口型。 “原子化服务” 【产品竞争力跃升,从技术创新到产业利用】HMS Core手语服务通过一年多的倒退和技术迭代,目前已反对2万+中文手语词汇,匹配日常沟通交流、新闻、教育、政务办理等丰盛场景。以后手语数字人不仅能流畅地打出手部动作,还有丰盛的表情和精确的口动,从微笑、开心到诧异、纳闷、悲观等,多达26种表情,灵动又真切,做到了“听得准”、“翻得对”、“打得好”,更好地为保障听障者的社会参加提供了助力。 目前,HMS Core手语服务已携手音书、知音、畅听无碍、开普云、棉花糖科技、将来媒体、硅基智能等泛滥开发者,胜利将AI手语翻译能力利用在各行各业,欠缺了无障碍环境建设。畅听无碍app,通过集成HMS Core手语服务,在利用内实现了AI手语翻译性能,让听障人士随需随用,满足他们在日常生活中沟通交流、学习娱乐的需要,同时还能帮忙他们在政府、医疗、金融、法律等业余公共服务畛域实现无障碍交换。 HMS Core手语服务的利用将一直助力开发者搭建更好的无障碍流传环境,帮忙听障者更好地享受信息化倒退成绩,为他们带来更多陪伴、更多实时交互以及更深的情感联结。将来,HMS Core手语服务,将继续践行“科技,不让任何一个人落伍”,与宽广开发者搭档一起,助力构建数字生态,让无障碍体验惠及更多人。如需进一步理解,请拜访HMS Core手语服务。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

November 25, 2022 · 1 min · jiezi

关于android:说一下-ArrayDeque-和-LinkedList-的区别

大家好,我是小彭。 在上一篇文章里,咱们聊到了基于链表的 Queue 和 Stack 实现 —— LinkedList。那么 Java 中有没有基于数组的 Queue 和 Stack 实现呢?明天咱们就来聊聊这个话题。 小彭的 Android 交换群 02 群曾经建设啦,扫描文末二维码进入~ 思维导图: 1. 回顾 LinkedList在数据结构上,LinkedList 不仅实现了与 ArrayList 雷同的 List 接口,还实现了 Deque 接口,而咱们明天要讲的 ArrayDeque 就是实现于 Deque 接口的动静数组。 Deque 接口示意一个双端队列(Double Ended Queue),容许在队列的首尾两端操作,所以既能实现队列行为,也能实现栈行为。 1.1 Queue 接口Queue 的 API 能够分为 2 类,区别在于办法的回绝策略上: 抛异样: 向空队列取数据,会抛出 NoSuchElementException 异样;向容量满的队列加数据,会抛出 IllegalStateException 异样。返回非凡值: 向空队列取数据,会返回 null;向容量满的队列加数据,会返回 false。回绝策略抛异样返回非凡值入队(队尾)add(e)offer(e)出队(队头)remove()poll()察看(队头)element()peek()1.2 Deque 接口(继承于 Queue 接口)Java 没有提供规范的栈接口(很好奇为什么不提供),而是放在 Deque 接口中: 回绝策略抛异样等价于入栈push(e)addFirst(e)出栈pop()removeFirst()察看(栈顶)peek()peekFirst()除了规范的队列和栈行为,Deque 接口还提供了 12 个在两端操作的办法: 回绝策略抛异样返回值减少addFirst(e)/ addLast(e)offerFirst(e)/ offerLast(e)删除removeFirst()/ removeLast()pollFirst()/ pollLast()察看getFirst()/ getLast()peekFirst()/ peekLast()2. ArrayDeque 的特点2.1 说一下 ArrayDeque 的特点1、ArrayDeque 是基于动静数组实现的 Deque 双端队列,外部封装了扩容和数据搬运的逻辑;2、ArrayDeque 的数组容量保障是 2 的整数幂;3、ArrayDeque 不是线程平安的;4、ArrayDeque 不反对 null 元素;5、ArrayDeque 尽管入栈和入队有可能会触发扩容,但从均摊剖析上看仍然是 O(1) 工夫复杂度;2.2 说一下 ArrayDeque 和 LinkedList 的区别?1、数据结构: 在数据结构上,ArrayDeque 和 LinkedList 都实现了 Java Deque 双端队列接口。但 ArrayDeque 没有实现了 Java List 列表接口,所以不具备依据索引地位操作的行为;2、线程平安: ArrayDeque 和 LinkedList 都不思考线程同步,不保障线程平安;3、底层实现: 在底层实现上,ArrayDeque 是基于动静数组的,而 LinkedList 是基于双向链表的。 ...

November 24, 2022 · 8 min · jiezi

关于android:从零接入-TheRouter

TheRouter是货拉拉开源的路由框架,针对Android平台实现组件化、跨模块调用、动态化等性能的集成框架,基本上算以后最先进的路由库了。 Github: https://github.com/HuolalaTech/hll-wp-therouter-android/ 官网:http://therouter.cn/ 查看最新版本TheRouter的版本分为两种,稳定版和rc版,个别不谋求新性能咱们就用稳定版就行,能够在官网看到最新的版本号和各种版本的阐明:https://therouter.cn/docs/2022/09/06/01 接入新建一个Demo工程,关上Demo的根目录build.gradle。 1. 新版本接入classpath如果是新版本的Gradle,classpath曾经改为用plugins的形式引入,只须要在闭包内加这一句就行了 id 'cn.therouter' version '1.1.1' apply false 2. 老版本接入classpath对于老版本的Gradle,须要手动引入classpath,在TheRouter官网Github首页也有接入介绍 classpath "cn.therouter:plugin:1.1.1" 3. 引入插件找到我的项目里全副的app模块(个别只会有一个,非凡我的项目会有多个)。也就是整个工程的所有build.gradle文件外面,只有是有com.android.application这个的模块,都要加上如下代码 // 老版本这样写apply plugin: 'therouter'// 新版本这样写id 'therouter'新版本的Gradle老版本的Gradle,这里我是用了更先进的ksp)4. 引入kaptTheRouter的注解解决依赖kapt执行,所以要在我的项目外面手动引入,否则无奈解决注解 注:所有的模块都必须引入kapt,否则就有可能造成某些路由表不生成。我最开始认为简略,就在最底层模块依赖了kapt,后果下层模块路由表都没有生成,查了良久才发现,所有模块都要加。 如果报找不到kapt,可能是因为没有引入kotlin-kapt的插件,参考步骤3外面的截图,接入对应的kapt。如果是纯Java工程,须要用Java的APT解决,APT就不必引入插件了,间接把kapt改成annotationProcessor annotationProcessor "cn.therouter:apt:1.1.1"应用1. 申明路由给须要跳转的页面加上路由表申明 @Route(path = "http://therouter.com/home")public class HomeActivity extends BaseActivity {}2. 增加参数注入这一步如果在base外面写了的话就不必每个Activity都加了。 @Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); TheRouter.inject(this);}3. 发动跳转也就是原来应用startActivity()的办法,都能够改成这样应用了 @Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); TheRouter.build("要跳转的指标页Path") .withInt("intValue", 12345678) .withString("str_123_Value", "传中文字符串") .withBoolean("boolValue", true) .withLong("longValue", 123456789012345L) .withChar("charValue", 'c') .withDouble("double", 3.14159265358972) .withFloat("floatValue", 3.14159265358972F) .navigation(); TheRouter.build("如果没有参数,能够什么都不传").navigation();}KSP接入(可选,用于代替kapt)1. 降级GradleKSP 依赖Gradle7.X,所以须要把 Gradle 版本号跟 AGP 版本号都降级到最新。 ...

November 24, 2022 · 1 min · jiezi

关于android:动态路由-TheRouter-的设计与实践

这篇文章是我在 2022【GIAC 寰球互联网架构大会】分享时所讲内容的文字版本,批改删减了演讲时的冗余语言,现凋谢给大家浏览,心愿能给买不到票加入分享的 开源实验室 读者带来帮忙。 大家好,明天跟大家分享的是一个开源路由TheRouter的设计。 代码地址: https://github.com/HuolalaTech/hll-wp-therouter-android 先来看一下目录 咱们从三点,来讲述明天的主题: 别离是模块化的开始,如何通过路由去实现一个模块化。而后再依据指标,去设计一个动态化的路由解决咱们的问题,以及在咱们的我的项目中,是如何实际的。最初,往年的大环境大家应该都晓得,考虑一下如何在资源有些的状况下,推动工程的重构。 这里有三张我手机上APP的截图,别离是:货拉拉、今日头条、美团 他们基本上能够代表了现在市面上大部分APP的一个状态,在这四五年里,互联网公司大幅减少,而APP的业务性能也一直增多。 从技术角度再看一下: 这是我列出来的一个APP的通用架构,这张图根本能够笼罩现如今百分之八九十的 APP 架构。 首先最上层是各个业务层 比方说是像货拉拉的搬家、拉货、运大件这种。接下来是各个业务模块 比方常见的像用户账户体系、而后可能有一些直播、音视频、领取这样的场景模块。再往下就是一些功能性的组件:他们可能跟具体的业务性能相干,比方推送、IM、广告控件、这样的一系列性能组件。最底层就是基础设施了: 就像数据上报 异样统计等等一系列的必要根底能力。而后在侧面还有一些贯通整个APP的能力 像CICD 国际化 端智能 热修复等等。 从这张图咱们也能看呈现现在的APP是越来越简单 性能也越来越多 对于性能越来越多,越来越简单的APP架构,咱们最间接能想到的就是通过模块化,将不同的性能、不同的业务做独立拆分,分而治之,升高整个零碎的复杂度。毕竟越简略,逻辑越少的代码块,BUG就越少。 所以大型 APP 的开发,根本都会选用模块化开发,同时对于模块间解耦要求更高。 而说到模块化,咱们肯定须要一个路由去承载不同模块之间的通信。路由是现如今 Android 开发中必不可少的性能,尤其是企业级APP,能够用于将原生页面跳转的强依赖解耦,同时缩小跨团队开发的相互依赖问题。 比方UI层级的跳转、功能模块的联动调用,这是做模块化绕不开的两点。 实现这两点最罕用的方法也就是:别离将咱们以后的一个UI页面与一个uri关联,用Uri代替咱们的页面, 这个样子在跳转的时候就不须要强依赖UI页面去做匹配,而只须要通过一段字符串去匹配就行 那另一种就是通过接口下沉,将模块依赖改为协定依赖,这样 咱们在不同的模块之间调度的时候 只须要依赖一个最根底的协定或者说是接口 去实现就能够了 做完模块化当前,一个APP的复杂度曾经被升高很多了。 然而有一个最大的问题,咱们通过模块化是没方法解决的。 也就是APP依赖用户去被动的更新降级,用户不更新,那就是永远在用旧版本, 当年,也是为了解决这个问题,催生出了很多黑科技,比方Android的插件化、热修复这种黑科技,最终这些科技最终也被验证是点歪了的技能树。 明天我跟大家讲讲另一种解决办法: 回到咱们明天的主题:动态化路由 前些天咱们开源了一套,在安卓下面的动态化路由叫 TheRouter 他是一整套咱们实现APP动态化的设计方案。包含模块化、包含远端路由下发、包含后面方才我列出来的几个依赖用户降级而造成的一些问题,咱们都是通过他来解决的。 之所以叫TheRouter 因为 The 代表了一种唯一性,咱们在设计的时候就参考了全副现有的开源计划,汲取了大量优良实现,同时补齐了各个计划的毛病。咱们认为做挪动端的模块化,只须要看这一个就够了。 首先咱们来看一下行业内路由的设计方案,不论是页面跳转,还是跨模块调用,基本上都是 开发阶段,对要应用路由的落地页或被调用办法增加注解标识。在编译期解析注解,生成一系列中间代码,期待调用。利用启动后调用中间代码实现路由的筹备动作。大部分路由会额定通过 Gradle Transform,在编译期做一次聚合,以晋升运行时筹备路由表的效率。发动路由跳转时,实质上就是一次路由表遍历,通过uri获取到对应的落地页或办法对象,进行调用。跨模块调用也是相似,在开发时做标记,编译时生成中间代码,运行时通过中间代码调用跨模块办法。 TheRouter 的整体实现逻辑也是依照这个思路去做的,不过咱们对于各个细节的解决,有更好的解决办法。 这是另一个角度,跟行业路由的一些比照数据。 ...

November 24, 2022 · 1 min · jiezi

关于android:AR手势识别交互让应用更加得心应手

现如今, AR技术一直倒退,人们不再满足于使用键盘、鼠标等简略器械来实现传统的人机交互模式。随着用户接触机器的多样化,繁琐的操作岂但对一些用户有门槛,而且还减少其学习老本;如果能用天然且合乎日常生活习惯的人机交互模式,不仅更好上手,也能让开发者们在利用内开发更多玩法。比方在视频直播或者拍照过程中,一个手势就能减少相应的贴纸或特效,丰盛交互体验;面对智能家电等硬件设施时,通过不同的手势能够管制对应的性能。 那么,利用如何能力实现更天然的人机和交互呢? 华为HMS Core AR Engine提供多种特定手势的辨认,输入辨认到的手势类别后果并给出手掌检测框屏幕坐标,左手和右手均可反对。当图像中呈现多只手时,只反馈单手(最清晰且置信度最高)辨认后果和坐标信息。反对前后置相机切换。 通过手势辨认能力,可将虚构物体叠加到人的手部地位,并依据不同的手势变动来激活某些状态的切换,给开发者的AR利用提供根底的交互性能。 不仅如此,AR Engine的手部跟踪性能能辨认和跟踪21个手部关节点的地位和姿势,造成手部骨骼模型,并可分辨左右手,同时提供单手关节点和骨骼辨认能力,输入手指端点、手部骨骼等手部高级特色。 通过手部骨骼辨认能力,开发者们可将虚构物体叠加到更为准确的手部地位,例如手指尖、手掌心等;利用手部骨骼,能驱动虚构手做出更为丰盛和精密的动作,给开发者们的AR利用提供加强的交互性能和难以置信的离奇玩法。 集成步骤开发环境要求:JDK 1.8.211及以上。 装置Android Studio 3.0及以上: minSdkVersion 26及以上 targetSdkVersion 29(举荐) compileSdkVersion 29(举荐) Gradle 6.1.1及以上(举荐) 在华为终端设备上的利用市场下载AR Engine服务端APK(需在华为利用市场,搜寻“华为AR Engine”)并装置到终端设备。 测试利用的设施:参见AREngine个性软硬件依赖表。如果同时应用多个HMS Core的服务,则须要应用各个Kit对应的最大值。 开发筹备在开发利用前须要在华为开发者联盟网站上注册成为开发者并实现实名认证,具体方法请参见帐号注册认证。华为提供了Maven仓集成形式的AR Engine SDK包,在开始开发前,须要将AR Engine SDK集成到您的开发环境中。Android Studio的代码库配置在Gradle插件7.0以下版本、7.0版本和7.1及以上版本有所不同。请依据您以后的Gradle插件版本,抉择对应的配置过程。以7.0为例:关上Android Studio我的项目级“build.gradle”文件,增加Maven代码库。 在“buildscript > repositories”中配置HMS Core SDK的Maven仓地址。 buildscript { repositories { google() jcenter() maven {url "https://developer.huawei.com/repo/" } }}关上我的项目级“settings.gradle”文件,配置HMS Core SDK的Maven仓地址。 dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { repositories { google() jcenter() maven {url "https://developer.huawei.com/repo/" } } }}增加依赖 在“dependencies”中增加如下编译依赖:dependencies { implementation 'com.huawei.hms:arenginesdk:{version}}利用开发1.运行前验证:查看以后设施是否装置了AR Engine,若曾经装置则失常运行,若没有装置,App应采纳适合的形式揭示用户装置AR Engine,如被动跳转利用市场,申请装置AR Engine。具体实现代码如下: ...

November 24, 2022 · 1 min · jiezi

关于android:CopyOnWriteArrayList-是如何保证线程安全的

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 发问。前言大家好,我是小彭。 在上一篇文章里,咱们聊到了ArrayList 的线程平安问题,其中提到了 CopyOnWriteArrayList 的解决办法。那么 CopyOnWriteArrayList 是如何解决线程平安问题的,背地的设计思维是什么,明天咱们就围绕这些问题开展。 本文源码基于 Java 8 CopyOnWriteArrayList。 小彭的 Android 交换群 02 群曾经建设啦,扫描文末二维码进入~ 思维导图: 1. 回顾 ArrayListArrayList 是基于数组实现的动态数据,是线程不平安的。例如,咱们在遍历 ArrayList 的时候,如果其余线程并发批改数组(当然也不肯定是被其余线程批改),在迭代器中就会触发 fail-fast 机制,抛出 ConcurrentModificationException 异样。 示例程序 List<String> list = new ArrayList();list.add("xiao");list.add("peng");list.add(".");Iterator iterator = list.iterator();while (iterator.hasNext()) { // 可能抛出 ConcurrentModificationException 异样 iterator.next();}要实现线程平安有 3 种形式: 办法 1 - 应用 Vector 容器: Vector 是线程平安版本的数组容器,它会在所有办法上减少 synchronized 关键字(过期,理解即可);办法 2 - 应用 Collections.synchronizedList 包装类办法 3 - 应用 CopyOnWriteArrayList 容器Collections.synchronizedList 包装类的原理很简略,就是应用 synchronized 加锁,源码摘要如下: ...

November 23, 2022 · 7 min · jiezi

关于android:项目重构演进之路

目录介绍01.整体概述阐明 1.1 重构的背景1.2 重构的要求1.3 遇到问题1.4 重构的目标1.5 设计指标1.6 产生收益剖析02.重构的具体实际 2.1 重构什么2.2 何时重构2.3 思考如何重构2.4 针对简单场景03.重构技术手段 3.0 举一个重构例子3.1 列举重构事项3.2 把握要害节点3.3 编写测试用例3.4 mock业务数据3.5 发现代码bug3.6 优化编码方式04.防止重构失败 4.1 是否给短缺理由4.2 乱套设计模式4.3 先有问题后革新05.架构设计思考 5.1 针对简单场景5.2 如何做架构设计01.整体概述阐明1.1 重构的背景我的项目的代码往往牵一发而动全身,业务逻辑耦合重大。 对于大的架构重构,其实始终很审慎的。准则是将重构交融在每次迭代中,逐渐优化代码的构造。而后将这个工作继续进行上来!当初设计的架构让我的项目的依赖关系越来越简单,保护老本也越来越高。 决定梳理并优化一下整个我的项目构造。在施行过程中,仍然保持将整个重构的过程交融在每个迭代中,逐渐实现一次大的架构降级。1.2 重构的要求重构代码对一个工程师能力的要求,要比单纯写代码高得多 重构须要你能洞察出代码存在的坏滋味或者设计上的有余,并且能正当、熟练地利用设计思维、准则、模式、编程标准等理论知识解决这些问题。进步代码的品质 具体点说就是,进步代码的可读性、可扩展性、可维护性等。多问本人为什么这样设计 在做代码设计的时候,肯定要先问下本人,为什么要这样设计,这样做是否能真正地进步代码品质,能进步代码品质的哪些方面。如果本人很难讲清楚,或者给出的理由都比拟牵强,没有压倒性的劣势,那基本上就能够判定这是一种适度设计,是为了设计而设计。1.3 遇到问题我的项目痛点在哪里 先要去剖析代码存在的痛点,比方可读性不好、可扩展性不好等等,而后再针对性地利用设计模式去改善。对重构了解不深刻 对为什么要重构、到底重构什么、什么时候重构、又该如何重构等相干问题了解不深,对重构没有系统性、全局性的意识。对重构没有技巧 面对一堆烂代码,没有重构技巧的领导,只能想到哪改到哪,并不能全面地改善代码品质。1.4 重构的目标软件设计巨匠 Martin Fowler 是这样定义重构 重构是一种对软件内部结构的改善,目标是在不扭转软件的可见行为的状况下,使其更易了解,批改老本更低。重构的定义很重要 有一个值得强调的点:“重构不扭转内部的可见行为”。把重构了解为,在放弃性能不变的前提下,利用设计思维、准则、模式、编程标准等实践来优化代码,批改设计上的有余,进步代码品质。遇到问题再重构 保护代码的过程中,真正遇到问题的时候,再对代码进行重构,能无效防止后期投入太多工夫做适度的设计,做到对症下药。1.5 设计指标重构围绕一个陈词滥调的概念「解耦」「拓展」「保护」等维度开展,设定几个指标: 清晰划分各模块的角色明确架构层级及各个模块所在的层级进步整个架构横向扩大的能力各模块独立开发,面向接口和协定编程进步代码可维护性和可读性02.重构的具体实际2.1 重构什么依据重构的规模 能够抽象地分为大规模高层次重构(以下简称为“大型重构”)和小规模低层次的重构(以下简称为“小型重构”)。大型重构指的是对顶层代码设计的重构 包含:零碎、模块、代码构造、类与类之间的关系等的重构,重构的伎俩有:分层、模块化、解耦、形象可复用组件等等。这类重构的工具就是应用学习过的那些设计思维、准则和模式。这类重构波及的代码改变会比拟多,影响面会比拟大,所以难度也较大,耗时会比拟长,引入 bug 的危险也会绝对比拟大。小型重构指的是对代码细节的重构 次要是针对类、函数、变量等代码级别的重构,比方标准命名、标准正文、打消超大类或函数、提取反复代码等等。小型重构更多的是利用咱们能前面要讲到的编码标准。这类重构要批改的中央比拟集中,比较简单,可操作性较强,耗时会比拟短,引入 bug 的危险相对来说也会比拟小。你只须要熟练掌握各种编码标准,就能够做到得心应手。2.2 何时重构须要阐明的问题 集体比拟拥护,平时不重视代码品质,堆砌烂代码,切实保护不了了就大刀阔斧地重构、甚至重写的行为。有时候我的项目代码太多了,重构很难做得彻底,这就更麻烦了!所以,寄希望于在代码烂到肯定水平之后,集中重构解决所有问题是不事实的,咱们必须摸索一条可继续、可演进的形式。找到代码中的问题 能够看看我的项目中有哪些写得不够好的、能够优化的代码,被动去重构一下。或者,在批改、增加某个性能代码的时候,你也能够棘手把不合乎编码标准、不好的设计重构一下。2.3 思考如何重构进行大型重构的时候 要提前做好欠缺的重构打算,井井有条地分阶段来进行。每个阶段实现一小部分代码的重构,而后提交、测试、运行,发现没有问题之后,再持续进行下一阶段的重构,保障代码仓库中的代码始终处于可运行、逻辑正确的状态。每个阶段,咱们都要管制好重构影响到的代码范畴,思考好如何兼容老的代码逻辑,必要的时候还须要写一些兼容过渡代码。小规模低层次的重构 因为影响范畴小,改变耗时短,所以,随时都能够去做。依照分,拆的思维一直优化代码。借助工具剖析代码问题重构 除了人工去发现低层次的品质问题,还能够借助很多成熟的动态代码剖析工具(比方FindBugs、PMD),来主动发现代码中的问题,而后针对性地进行重构优化。03.重构技术手段如何保障重构不出错呢? 你须要熟练掌握各种设计准则、思维、模式,还须要对所重构的业务和代码有足够的理解。除了这些集体能力因素之外,最可落地执行、最无效的保障重构不出错的伎俩应该就是单元测试(Unit Testing)了。当重构实现之后,如果新的代码依然能通过单元测试,那就阐明代码原有逻辑的正确性未被毁坏,原有的内部可见行为未变。3.0 举一个重构例子举一个简略的例子看重构事项 现状:App业务线各种依赖宏大,而后交织在一起,关系变的简单。依赖库之间的强依赖导致版本抵触多。模块计划发生变化,下层批改老本大。功能模块兼容性导致保护老本大。重构计划:整个架构的核心思想是面向接口编程和依赖注入使各个模块之间实现解耦,而后通过横向角色划分与纵向层级划分的形式约定各个模块之间的关系,再通过接口分层的形式,明确具体模块在不同层级上须要实现的性能3.1 列举重构事项针对重构的业务具体列举 针对一个比拟大的重构业务,先进行梳理,而后依据问题或痛点思考,列举解决方案,而后开始实际并保障代码稳定性,最初测试并交付。列举重构事项 ...

November 23, 2022 · 1 min · jiezi

关于android:AI赋能音乐创作人人都是音视频创作者

华为HMS Core音频编辑服务(Audio Editor Kit)依靠本身AI技术的研发劣势,上线全新的歌声合成音色及伴奏,给音视频创作者提供更多的创作可能。在短视频场景中,用户自定义歌词的歌声联合视频让用户感触到身临其境,自在表白本人的情绪;在虚构偶像场景中,歌声合成性能赋予虚构歌手们演唱风格各异的歌曲,带来创意有限。 HMS Core音频编辑服务歌声合成的AI Singer模型能力通过字级别输出歌词进行音素转换,就能够为用户创作音乐,也可预置曲目合成歌声。通过自研音高模型,让音高曲线在放弃输出曲谱的音高精准度的同时改善天然度,更靠近人的实在演唱。应用最新的生成式模型,带来更好的音色还原度、建模更多的演唱细节,同时高清声码器可能实在还原48k高清音质。 另外,用户通过自在调整颤音、滑音、呼吸音等性能,可依据情感需要调整歌声演唱技巧。以后歌声合成服务已凋谢了情风行女声、国风女声和民谣男声音色,将来会继续更新更多音色。 华为HMS Core音频编辑服务(Audio Editor Kit)让机器“演唱”出真实度的歌声,仅需简略的集成取得,以下是开发者利用集成音频编辑服务歌声合成能力的具体步骤。 开发步骤1. 开发筹备1.1注册成为开发者 在开发利用前须要在华为开发者联盟网站上注册成为开发者并实现实名认证,具体方法请参见帐号注册认证。 1.2创立我的项目及利用 参见创立我的项目,而后在我的项目下创立利用实现利用的创立,非凡配置如下: 抉择平台:抉择“Web”。 1.3关上相干服务 应用Audio Editor Kit服务须要您在AppGallery Connect上关上Audio Editor Kit服务开关,具体操作步骤请参见关上服务开关。 2.歌声合成性能集成2.1同步接口(流式) 2.1.1获取access_token鉴权信息 应用开发者联盟界面取得的客户端ID以及对应密钥,发送HTTPS POST申请,获取查问access_token。获取形式请参见客户端模式(Client Credentials)。 2.1.2调用同步接口(流式) 通过以上步骤获取的access_token信息,发送HTTPS POST调用同步接口(流式)。 示例代码(Java)如下所示: 其中requestUrl = "https://audioeditor-api-drcn.cloud.huawei.com/v1/audioeditor/gateway/ai/ttsing/sync"。 请点击下载MusicXML文件,并上传: /** * 调用同步接口(流式) * @throws Exception IO异样 */ private static void syncTask() throws Exception { // 设置申请header PostMethod postMethod = new PostMethod(requestUrl); // 设置文本类型(String),例:"application/json;charset=utf-8" postMethod.setRequestHeader("Content-Type", contentType); // 设置申请ID(String),例:"9af1aeda-531b-407a-80b4-65b40ef77bd6" postMethod.setRequestHeader("X-Request-ID", requestId); // 设置App包名(String),例:"com.huawei.demo" postMethod.setRequestHeader("X-Package-Name", pacageName); // 设置App所在国家(String),例:"cn" postMethod.setRequestHeader("X-Country-Code", countryCode); // 设置App标识(String),例:"9af1aeda-531b-407a-80b4-65b40ef77bd6" postMethod.setRequestHeader("HMS-APPLICATION-ID", applicationId); // 设置证书指纹(String),例:"xxxxxxxxxxxxxxx" postMethod.setRequestHeader("certFingerprint", certFingerprint); // 设置动静获取的AccessToken(String) postMethod.setRequestHeader("Authorization","Bearer " + accessToken); // 设置申请body Map<String, Object> bodyMap = new HashMap<>(); Map<String, Object> dataMap = new HashMap<>(); Map<String, Object> configMap = new HashMap<>(); // filePath是MusicXML文件门路(含文件名、后缀) String lyricFilePath = "filePath"; dataMap.put("lyric", FileUtils.readFileToString(new File(lyricFilePath), "UTF-8")); dataMap.put("language", "chinese"); configMap.put("type", 1); configMap.put("outputEncoderFormat", 0); configMap.put("wordDurationForceAlign", "false"); bodyMap.put("data", dataMap); bodyMap.put("config", configMap); RequestEntity requestEntity = new StringRequestEntity(JSONObject.toJSONString(bodyMap),"application/json" ,"UTF-8"); postMethod.setRequestEntity(requestEntity); HttpClient httpClient = new HttpClient(); int ret = httpClient.executeMethod(postMethod); if (ret == 200) { Header responseHeader = postMethod.getResponseHeader("content-type"); if ("application/octet-stream".equals(responseHeader.getValue())) { InputStream rpsContent = postMethod.getResponseBodyAsStream(); // filePath是要保留文件的门路(含文件名、PCM文件后缀) String filePath = "filePath"; FileUtils.copyInputStreamToFile(rpsContent, new File(filePath)); } else { String errorString = postMethod.getResponseBodyAsString(); System.out.println(errorString); } } else { System.out.println("callApi failed: ret =" + ret + " rsp=" + postMethod.getResponseBodyAsString()); } }应用预置曲目输出歌词: ...

November 23, 2022 · 5 min · jiezi

关于android:Opengl-ES之FBO

FBO介绍FBO帧缓冲对象,它的次要作用个别就是用作离屏渲染,例如做Camera相机图像采集进行前期解决时就可能会用到FBO。如果相机出图的是OES纹理,为了不便前期解决,个别先将OES纹理通过FBO转换成一般的2D纹理,而后再通过FBO等减少美颜等其余各种特效滤镜,最初将FBO一路流送进编码器进行编码,另外一路渲染到屏幕上进行预览显示。 FBO总结起来就是能够临时将未解决完的帧不间接渲染到屏幕上,而是渲染到离屏Buffer中缓存起来,在失当的机会再取出来渲染到屏幕。 FBO(Frame Buffer Object)帧缓冲对象提供了与色彩缓冲区(color buffer)、深度缓冲区(depth buffer)和模版缓冲区(stencil buffer) ,但并不会间接为这些缓冲区调配空间,而只是为这些缓冲区提供一个或多个挂接点。咱们须要别离为各个缓冲区创建对象,申请空间,而后挂接到相应的挂接点上。 从上图能够看出FBO中蕴含了: 多个色彩附着点(GL_COLOR_ATTACHMENT0、GL_COLOR_ATTACHMENT1...)一个深度附着点(GL_DEPTH_ATTACHMENT)一个模板附着点(GL_STENCIL_ATTACHMENT)所谓的色彩附着(纹理附着)就是用于将色彩渲染到纹理中去的意思。前面咱们次要介绍FBO的色彩附着。 如何应用FBO应用函数glGenFramebuffers生成一个FBO对象,保留对象ID。应用函数glBindFramebuffer绑定FBO。应用函数glFramebufferTexture2D关联纹理和FBO,并执行渲染步骤。后续如果须要应用FBO的成果时只须要操作与FBO绑定的纹理即可。应用函数glBindFramebuffer解绑FBO,个别在Opengl中ID参数传递0就是解绑。应用函数glDeleteFramebuffers删除FBO。当挂接实现之后,咱们在执行FBO上面的操作之前,能够检查一下FBO的状态,应用函数GLenum glCheckFramebufferStatus(GLenum target)查看。 本着学以致用的准则,咱们将联合之前的文章,例如纹理贴图、VBO/VAO、EBO等相干知识点,应用这些知识点联合FBO绘制做一个实际的例子:首先将纹理渲染到FBO下来,而后再将FBO的纹理渲染到屏幕上。 插个话。。。总有人盗用不贴原文链接,看看是谁。。。 首先上代码,而后咱们挑重要的略微解读一下:FBOOpengl.h class FBOOpengl:public BaseOpengl{public: FBOOpengl(); void onFboDraw(); virtual ~FBOOpengl(); // override要么就都写,要么就都不写,不要一个虚函数写override,而另外一个虚函数不写override,不然可能编译不过 virtual void onDraw() override; virtual void setPixel(void *data, int width, int height, int length) override;private: void fboPrepare(); GLint positionHandle{-1}; GLint textureHandle{-1}; GLuint vbo{0}; GLuint vao{0}; GLuint ebo{0}; // 自身图像纹理id GLuint imageTextureId{0}; // fbo纹理id GLuint fboTextureId{0}; GLint textureSampler{-1}; GLuint fboId{0}; // 用于fbo的vbo和vao 也能够用数组的模式,这里为了不便了解先独立开来 GLuint fboVbo{0}; GLuint fboVao{0}; int imageWidth{0}; int imageHeight{0};};留神:override作为古代C++的一个关键字,应用的时候须要留神一点,要么就整个类的虚函数都用,要么整个类的虚函数都不必,不要一个虚函数用override润饰,另外一个虚函数又不必override关键字润饰,不然很有可能会编译不过的。 ...

November 23, 2022 · 4 min · jiezi

关于android:Opengl-ES之YUV数据渲染

YUV回顾记得在音视频基础知识介绍中,笔者专门介绍过YUV的相干常识,能够参考:《音视频基础知识-YUV图像》 YUV数据量相比RGB较小,因而YUV实用于传输,然而YUV图不能间接用于显示,须要转换为RGB格局能力显示,因此YUV数据渲染实际上就是应用Opengl ES将YUV数据转换程RGB数据,而后显示进去的过程。 也就是说Opengl ES之所以能渲染YUV数据其实就是应用了Opengl弱小的并行计算能力,疾速地将YUV数据转换程了RGB数据。 本文首发于微信公总号号:思想觉悟 更多对于音视频、FFmpeg、Opengl、C++的原创文章请关注微信公众号:思想觉悟 YUV的格局比拟多,咱们明天就以YUV420SP为例,而YUV420SP又分为NV12和NV21两种,因而明天咱们的主题就是如何应用Opengl ES对NV12和NV21数据进行渲染显示。 在着色器中应用texture2D对YUV数据进行归一化解决后Y数据的映射范畴是0到1,而U和V的数据映射范畴是-0.5到0.5。 因为YUV格局图像 UV 重量的默认值别离是 127 ,Y 重量默认值是 0 ,8 个 bit 位的取值范畴是 0 ~ 255,因为在 shader 中纹理采样值须要进行归一化,所以 UV 重量的采样值须要别离减去 0.5 ,确保 YUV 到 RGB 正确转换。 YUV数据筹备首先咱们能够应用ffmpeg命令即将一张png图片转换成YUV格局的图片: ffmpeg -i 图片名称.png -s 图片宽x图片高 -pix_fmt nv12或者nv21 输入名称.yuv)通过下面这个命令行咱们就能够将一张图片转换成yuv格局的图片,此时咱们能够应用软件YUVViewer看下你转换的图片对不对,如果自身转换进去的图片就是错的,那么前面的程序就白搭了... 留神:转换图片的宽高最好是2的幂次方,笔者测试了下发现如果宽高不是2的幂次方的话尽管能失常转换,然而查看的时候要么有色差,要么有缺点,也有可能失常。 又或者你能够极客一点,间接应用ffmpeg代码解码视频的形式取得YUV数据并保留,这个能够参考笔者之前的文章: 《FFmpeg连载3-视频解码》 同时在下面的文章中笔者也介绍了通过ffplay命令行的形式查看YUV数据的办法。 YUV数据渲染YUV 渲染步骤: 生成 2 个纹理,别离用于承载Y数据和UV数据,编译链接着色器程序;NV21和NV12格局的YUV数据是只有两个立体的,它们的排列程序是YYYY UVUV或者YYYY VUVU因而咱们的片元着色器须要两个纹理采样。 确定纹理坐标及对应的顶点坐标;别离加载 NV21 的两个 Plane 数据到 2 个纹理,加载纹理坐标和顶点坐标数据到着色器程序;绘制。YUV与RGB的转换格局图: 在OpenGLES的内置矩阵实际上是一列一列地构建的,比方YUV和RGB的转换矩阵的构建是: // 规范转换,舍弃了局部小数精度mat3 convertMat = mat3(1.0, 1.0, 1.0, //第一列 0.0,-0.338,1.732, //第二列 1.371,-0.698, 0.0);//第三列OpenGLES 实现 YUV 渲染须要用到 GL_LUMINANCE 和 GL_LUMINANCE_ALPHA 格局的纹理,其中 GL_LUMINANCE 纹理用来加载 NV21 Y Plane 的数据,GL_LUMINANCE_ALPHA 纹理用来加载 UV Plane 的数据。 ...

November 23, 2022 · 4 min · jiezi

关于android:说一下-ArrayList-和-LinkedList-的区别

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 发问。前言大家好,我是小彭。 在上一篇文章里,咱们聊到了基于动静数组 ArrayList 线性表,明天咱们来探讨一个基于链表的线性表 —— LinkedList。 小彭的 Android 交换群 02 群曾经建设啦,扫描文末二维码进入~ 思维导图: 1. LinkedList 的特点1.1 说一下 ArrayList 和 LinkedList 的区别?1、数据结构: 在数据结构上,ArrayList 和 LinkedList 都是 “线性表”,都继承于 Java 的 List 接口。另外 LinkedList 还实现了 Java 的 Deque 接口,是基于链表的栈或队列,与之对应的是 ArrayDeque 基于数组的栈或队列;2、线程平安: ArrayList 和 LinkedList 都不思考线程同步,不保障线程平安;3、底层实现: 在底层实现上,ArrayList 是基于动静数组的,而 LinkedList 是基于双向链表的。事实上,它们很多个性的区别都是因为底层实现不同引起的。比如说: 在遍历速度上: 数组是一块间断内存空间,基于局部性原理可能更好地命中 CPU 缓存行,而链表是离散的内存空间对缓存行不敌对;在访问速度上: 数组是一块间断内存空间,反对 O(1) 工夫复杂度随机拜访,而链表须要 O(n) 工夫复杂度查找元素;在增加和删除操作上: 如果是在数组的开端操作只须要 O(1) 工夫复杂度,但在数组两头操作须要搬运元素,所以须要 O(n)工夫复杂度,而链表的删除操作自身只是批改援用指向,只须要 O(1) 工夫复杂度(如果思考查问被删除节点的工夫,复杂度剖析上仍然是 O(n),在工程剖析上还是比数组快);额定内存耗费上: ArrayList 在数组的尾部减少了闲置地位,而 LinkedList 在节点上减少了前驱和后继指针。1.2 LinkedList 的多面人生在数据结构上,LinkedList 不仅实现了与 ArrayList 雷同的 List 接口,还实现了 Deque 接口(继承于 Queue 接口)。 ...

November 22, 2022 · 6 min · jiezi

关于android:扒一扒-Jetpack-Compose-实现原理

图片来自:https://developer.android.goo... 本文作者:goolong Compose 是 Google 推出的现代化 UI 开发工具包,基于申明式 UI 开发格调,加上 @Composable 函数帮忙开发者无效的实现关注点拆散,另外 Compose 外部最大水平优化了重组范畴,能够帮忙咱们高效的刷新UI,思考到 Compose 整体架构设计过于简单,这篇文章次要带大家理解 Compose Runtime 层外围的实现逻辑。 申明式UI申明式 UI 对于 Android 开发同学可能有点生疏,不过相熟 React 和 Flutter 的同学应该比较清楚,不论是 React、Flutter、Compose,外围都是 MVI 架构形式,通过数据驱动 UI,底层须要保护相应的 UI Tree,比方 React 的 VirtualDOM,Flutter 的 Element,而 Compose 的外围是 Composition。所谓 "数据驱动UI",就是当 state 变动时,重建这颗树型构造并基于这棵 NodeTree 刷新 UI。 当然,出于性能思考,当 NodeTree 须要重建时,各框架会应用 VirtualDom 、GapBuffer(或称SlotTable) 等不同技术对其进行 "差量" 更新,防止 "全量" 重建。compose.runtime 的重要工作之一就是负责 NodeTree 的创立与更新。 @Composable@Copmposable 并不是一个注解处理器,Compose 在 Kotlin 编译器的类型检测和代码生成阶段依赖 Kotlin 编译器插件工作,工作原理有点相似于 Kotlin Coroutine 协程的 suspend 函数,suspend 函数在 Kotlin 插件编译时生成带有 $continuation 参数(挂终点),而 Compose 函数生成带有参数 $composer,因而 Compose 也被网友戏称为 “KotlinUI”。 ...

November 21, 2022 · 12 min · jiezi

关于android:ArrayList-可以完全替代数组吗

本文已收录到  GitHub · AndroidFamily,有 Android 进阶常识体系,欢送 Star。技术和职场问题,请关注公众号 [彭旭锐] 退出 Android 交换群。前言大家好,我是小彭。 在后面的文章里,咱们学习了很多数据结构与算法思维。在理论的业务开发中,往往不须要咱们手写数据结构,而是间接应用规范库的数据结构 / 容器类。 在后续的文章里,咱们将以 Java 语言为例,剖析从 ArrayList 到 LinkedHashMap 等一系列规范库容器类,最初再有一篇总结回顾,请关注。 学习路线图: 1. 说一下 ArrayList 和 LinkedList 的区别?1、数据结构: 在数据结构上,ArrayList 和 LinkedList 都是 “线性表”,都继承于 Java 的 List 接口。另外 LinkedList 还实现了 Java 的 Deque 接口,是基于链表的栈或队列,与之对应的是 ArrayDeque 基于数组的栈或队列;2、线程平安: ArrayList 和 LinkedList 都不思考线程同步,不保障线程平安;3、底层实现: 在底层实现上,ArrayList 是基于动静数组的,而 LinkedList 是基于双向链表的。事实上,它们很多个性的区别都是因为底层实现不同引起的。比如说: 在遍历速度上: 数组是一块间断内存空间,基于局部性原理可能更好地命中 CPU 缓存行,而链表是离散的内存空间对缓存行不敌对;在访问速度上: 数组是一块间断内存空间,反对 O(1) 工夫复杂度随机拜访,而链表须要 O(n) 工夫复杂度查找元素;在增加和删除操作上: 如果是在数组的开端操作只须要 O(1) 工夫复杂度,但在数组两头操作须要搬运元素,所以须要 O(n)工夫复杂度,而链表的删除操作自身只是批改援用指向,只须要 O(1) 工夫复杂度(如果思考查问被删除节点的工夫,复杂度剖析上仍然是 O(n),在工程剖析上还是比数组快);额定内存耗费上: ArrayList 在数组的尾部减少了闲置地位,而 LinkedList 在节点上减少了前驱和后继指针。2. ArrayList 源码剖析这一节,咱们来剖析 ArrayList 中次要流程的源码。 ...

November 20, 2022 · 8 min · jiezi

关于android:设置ListView的选中状态

设置ListView的选中状态:android:state_activated="true"Developer公布于 2016-06-041.阐明看这篇文章之前,首先你得晓得怎么通过Adapter应用ListView控件,不然请不要往下看。次要是为了便于疾速浏览,删除了很多多余的代码。蕴含了字体色彩和背景色彩的扭转,纯xml。没有上源代码,有工夫再进行整顿。2.演示3.步骤:1.ListView控件中必须设置属性,不然是不起作用的:android:choiceMode="singleChoice"2.要想让ListView中的文字在激活状态下变为红色,须要在drawable文件夹下设置xml布局文件,见下图:代码为: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 激活状态下为红色 --> <item android:state_activated="true" android:color="@android:color/white" /> <!-- 默认为彩色 --> <item android:color="#000" /></selector>3.而后在子项布局文件的TextView中进行援用这个xml文件android:textColor="@drawable/menu_item_text_color"就能够了: <TextView android:textColor="@drawable/menu_item_text_color" android:text="首页" />4.设置背景色彩(同下面一样):xml布局(这里的drawable属性的值不能是#222这种的,必须定义在资源文件中,不然会报错): <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_activated="true" android:drawable="@color/grey" /> <item android:drawable="@android:color/transparent" /></selector>5.在LinearLayout中设置属性: android:background="@drawable/menu_item_background" <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:background="@drawable/menu_item_background"> <TextView android:textColor="@drawable/menu_item_text_color" android:text="首页" /></LinearLayout>4.留神:别忘了设置ListView的属性android:choiceMode="singleChoice",不然是看不出android:state_activated="true"的作用的。5.最近始终在学着模拟知乎APP,这也是在做的途中遇到的细小问题,拿进去共勉。有什么不对的中央还请斧正

November 20, 2022 · 1 min · jiezi

关于android:面试官什么是伪共享如何避免

本文已收录到  GitHub · AndroidFamily,有 Android 进阶常识体系,欢送 Star。技术和职场问题,请关注公众号 [彭旭锐] 退出 Android 交换群。前言大家好,我是小彭。 在后面的文章里,咱们聊到了 CPU 的高速缓存机制。因为 CPU 和内存的速度差距太大,古代计算机会在两者之间插入一块高速缓存。 然而,CPU 缓存总能进步程序性能吗,有没有什么状况 CPU 缓存反而会成为程序的性能瓶颈?这就是咱们明天要探讨的伪共享(False Sharing)。 学习路线图: 1. 回顾 MESI 缓存一致性协定因为 CPU 和内存的速度差距太大,为了拉平两者的速度差,古代计算机会在两者之间插入一块速度比内存更快的高速缓存,CPU 缓存是分级的,有 L1 / L2 / L3 三级缓存。 因为单核 CPU 的性能遇到瓶颈(主频与功耗的矛盾),芯片厂商开始在 CPU 芯片里集成多个 CPU 外围,每个外围有各自的 L1 / L2 缓存。其中 L1 / L2 缓存是外围独占的,而 L3 缓存是多外围共享的。为了保障同一份数据在内存和多个缓存正本中的一致性,古代 CPU 会应用 MESI 等缓存一致性协定保证系统的数据一致性。 缓存一致性问题 MESI 协定 当初,咱们的问题是:CPU 缓存总可能进步程序性能吗? 2. 什么是伪共享?基于局部性原理的利用,CPU Cache 在读取内存数据时,每次不会只读一个字或一个字节,而是一块块地读取,每一小块数据也叫 CPU 缓存行(CPU Cache Line)。 ...

November 20, 2022 · 4 min · jiezi

关于android:已经有-MESI-协议为什么还需要-volatile-关键字

本文已收录到  GitHub · AndroidFamily,有 Android 进阶常识体系,欢送 Star。技术和职场问题,请关注公众号 [彭旭锐] 进 Android 面试交换群。前言大家好,我是小彭。 在上一篇文章里,咱们聊到了 CPU 的缓存一致性问题,分为纵向的 Cache 与内存的一致性问题以及横向的多个外围 Cache 的一致性问题。咱们也探讨了 MESI 协定通过写流传和事务串行化实现缓存一致性。 不晓得你是不是跟我一样,在学习 MESI 协定的时候,天然地产生了一个疑难:在不思考写缓冲区和生效队列的影响下,在硬件层面曾经实现了缓存一致性,那么在 Java 语言层面为什么还须要定义 volatile 关键字呢?是多此一举吗?明天咱们将围绕这些问题开展。 学习路线图: 1. 回顾 MESI 缓存一致性协定因为 CPU 和内存的速度差距太大,为了拉平两者的速度差,古代计算机会在两者之间插入一块速度比内存更快的高速缓存,CPU 缓存是分级的,有 L1 / L2 / L3 三级缓存。其中 L1 / L2 缓存是外围独占的,而 L3 缓存是多外围共享的。 在 CPU Cache 的三级缓存中,会存在 2 个缓存一致性问题: 纵向 - Cache 与内存的一致性问题:通过写中转或写回策略解决;横向 - 多外围 Cache 的一致性问题:通过 MESI 等缓存一致性协定解决。MESI 协定可能满足写流传和事务串行化 2 点个性,通过 “已批改、独占、共享、已生效” 4 个状态实现了 CPU Cache 的一致性; ...

November 19, 2022 · 3 min · jiezi

关于android:我把-CPU-三级缓存的秘密藏在这-8-张图里

本文已收录到  GitHub · AndroidFamily,有 Android 进阶常识体系,欢送 Star。技术和职场问题,请关注公众号 [彭旭锐] 进 Android 面试交换群。前言大家好,我是小彭。 在上一篇文章里,咱们聊到了计算机存储器零碎的金字塔构造,其中在 CPU 和内存之间有一层高速缓存,就是咱们明天要聊的 CPU 三级缓存。 那么,CPU Cache 的构造是怎么的,背地隐含着哪些设计思维,CPU Cache 和内存数据是如何关联起来的,明天咱们将围绕这些问题开展。 学习路线图: 1. 意识 CPU 高速缓存1.1 存储器的金字塔构造古代计算机系统为了寻求容量、速度和价格最大的性价比会采纳分层架构,从 “CPU 寄存器 - CPU 高速缓存 - 内存 - 硬盘”自上而下容量逐步增大,速度逐步减慢,单位价格也逐步升高。 1、CPU 寄存器: 存储 CPU 正在应用的数据或指令;2、CPU 高速缓存: 存储 CPU 近期要用到的数据和指令;3、内存: 存储正在运行或者将要运行的程序和数据;4、硬盘: 存储临时不应用或者不能间接应用的程序和数据。存储器金字塔 1.2 为什么在 CPU 和内存之间减少高速缓存?我认为有 2 个起因: 起因 1 - 补救 CPU 和内存的速度差(次要): 因为 CPU 和内存的速度差距太大,为了拉平两者的速度差,古代计算机会在两者之间插入一块速度比内存更快的高速缓存。只有将近期 CPU 要用的信息调入缓存,CPU 便能够间接从缓存中获取信息,从而进步访问速度;起因 2 - 缩小 CPU 与 I/O 设施争抢访存: 因为 CPU 和 I/O 设施会竞争同一条内存总线,有可能呈现 CPU 期待 I/O 设施访存的状况。而如果 CPU 能间接从缓存中获取数据,就能够缩小竞争,进步 CPU 的效率。1.3 CPU 的三级缓存构造在 CPU Cache 的概念刚呈现时,CPU 和内存之间只有一个缓存,随着芯片集成密度的进步,古代的 CPU Cache 曾经广泛采纳 L1/L2/L3 多级缓存的构造来改善性能。自顶向下容量逐步增大,访问速度也逐步升高。当缓存未命中时,缓存零碎会向更底层的档次搜寻。 ...

November 17, 2022 · 3 min · jiezi

关于android:一套用了-70-年的计算机架构-冯诺依曼架构

本文已收录到  GitHub · AndroidFamily,有 Android 进阶常识体系,欢送 Star。技术和职场问题,请关注公众号 [彭旭锐] 进 Android 面试交换群。前言大家好,我是小彭。 上一篇文章里,咱们探讨了可计算问题与图灵机的计算机模型。在了解了图灵机模型后,咱们将从和图灵同时代的另一位计算机科学家提出的 “冯·诺依曼架构” 开始,正式开始计算机组成原理的核心内容。 那么,冯·诺依曼架构是怎么的构造呢,冯·诺依曼架构是基于图灵机的吗,咱们当初用的手机和电脑还在应用冯·诺依曼架构吗?明天咱们将围绕这些问题开展。 学习路线图: 1. 计算机的晚期历史在 1936 年,艾伦·图灵在论文《论可计算数及其在可判定性问题上的利用》中开创性地提出了计算机的通用逻辑模型 —— 图灵机模型。这一实践粗浅地影响了第一代计算机科学家,更多可能实现计算性能的计算机被制作进去,图灵也因而被誉为 “计算机科学之父”。 随着计算机的元器件从继电器降级到电子管(也叫真空管),计算机也从 “机电” 时代进入到 “电子” 时代。第一台电子计算机个别认为是 ABC( Atanasoff-Berry Computer),然而它与其余晚期的计算机一样,都是 不可从新编程 的(参考资料上的用词是 “不可编程”,我认为 “不可从新编程” 更失当)。一台计算机只能执行一个特定的程序,如果须要批改程序性能,就须要将整个计算器拆开,而后从新组装电路。 到了 1943 年,Colossus Mark I 计算机(伟人 1 号)在英国 Bletchley 公园(二战时的明码破译机构)被建造进去,以破解纳粹通信,好家伙一口气造了 10 台。 Colossus Mark I 被认为是第一台可编程的电子计算机,编程办法就是应用大量的开关和插线板(PlugBoards)。 但 Colossus Mark I 并不是通用计算机,它只被设计用于执行明码剖析相干的计算。 Colossus Mark I —— 图片援用自 Wikipedia 直到 1945 年,John Mauchly 和 J. Presper Eckert 在美国宾夕法尼亚大学建造了 ENIAC(Electronic Numerical Integrator and Computer,中译:埃尼亚克), ENIAC 被认为是第一台可编程的通用电子计算机,也被认为是第一台古代意义上的计算机。 然而,ENIAC 和 Colossus Mark I 一样都应用插线板编程,尽管不须要拆掉整台计算机来从新编程,然而编程效率仍然非常低,据说一个简略程序在 ENIAC 上编程最多要花费三个星期。 ...

November 8, 2022 · 2 min · jiezi

关于android:从图灵机到量子计算机计算机可以解决所有问题吗

本文已收录到  GitHub · AndroidFamily,有 Android 进阶常识体系,欢送 Star。技术和职场问题,请关注公众号 [彭旭锐] 进 Android 面试交换群。前言大家好,我是小彭。 明天,咱们正式开启一个新专栏 —— 计算机组成原理。 计算机组成原理是计算机科学中最根底的理论知识,你越早把握这些常识,你就能越早享受常识带来的 "复利效应"。 在构思到写作的过程中,我始终在思考应该以什么内容作为这个专栏的开篇,应该以什么内容来吸引住读者的眼球,也有过其它一些想法。最初,我决定抛开所有功利的想法,回归到一个最纯正的计算机科学问题 —— “计算机能够解决所有问题吗?”。 学习路线图: 1. 图灵机 —— 哪些问题是可计算的?一个有纸、笔、橡皮擦并且保持严格的行为准则的人,本质上就是一台通用图灵机。 —— 图灵1.1 图灵机的背景在计算机科学中, 可计算性(calculability) 是指一个问题是否存在解决算法。对于一个问题,如果可能应用无限的机械的步骤求出后果,就是可计算的,反之则认为这个问题是不可计算的。 一开始,人们普遍认为任何问题都是有算法的,都是可计算的,而科学家的工作正是找出这些问题的解决算法。起初,人们通过长时间钻研,发现很多问题仍然找不到算法,也无奈做出不存在算法的证实。例如数学家希尔伯特提出的 23 个数学问题中的第 10 个问题: 希尔伯特第 10 问题: 是否存在一个算法能断定任何丢番图方程有无整数解?这个问题其实是希尔伯特提出的另一个问题的子集: 可判定性问题: 是否存在一个算法可能断定任何数学命题的真伪? 如果存在这样的算法,那么很多数学问题都能够间接失去答案。如果不存在这样的算法,希尔伯特第 10 问题天然也不成立。在图灵之前,美国数学家阿隆佐·丘奇(图灵的导师)率先提出了可判定性问题的解决办法 —— Lambda 演算 数学表白零碎,并证实了不存在这样的通用断定算法,但其应用了十分多的数学技巧,难以了解和利用。 直到 1936 年(小伙子才 24 岁!),英国科学家艾伦·图灵在数学杂志上发表了论文 《论可计算数及其在可判定性问题上的利用》 ,其中提出了解决 “可判定性问题” 的一个开创性思路。论文我看不懂,我尽量将本人能了解到的外围思路概括为 3 点,如果有谬误,欢送你帮我指出: 1、自动机(Automatic Machines): 图灵察看了人类应用笔和橡皮擦在纸上进行计算的过程,将事实世界中的所有计算行为归结为一系列简单机械的动作。在论文中,图灵将这种以简单机械的形式运行的设想中的机器称为自动机,而后人则将这种机器称为 “图灵机”;同时,图灵证实了只有提供足够的工夫和内存,图灵机总是可能实现任何计算;2、通用图灵机(Universal Turing Machines): 假如有一个非凡的图灵机,它可能接管另外一些图灵机作为输出,并且可能产生和这些图灵机一样的输入,那么咱们说这个非凡的图灵机就是通用图灵机。 在这里,咱们能够把图灵机设想成一个程序或一个算法,而通用图灵机就是可能运行程序的计算机,目前咱们所能接触到的所有古代电子计算机都是通用图灵机。3、停机问题(Halting Problem): 为了解决希尔伯特的可判定性问题,图灵将 “断定数学命题真伪” 的问题转化为 “断定图灵机是否会停机” 的问题,即驰名的停机问题 —— “是否存在一个可能断定其它图灵机是否会停机的通用图灵机”。 随后,图灵通过一个奇妙的逻辑矛盾证实了不存在这样的通用图灵机,等于证实了 “不存在一个算法可能断定任何数学命题的真伪”。图灵的这个逻辑证实的推导过程,咱们先放到一方稍后再说。小结一下: 图灵首先提出了一个可能实现任何计算的计算机模型 —— 图灵机,相比于阿隆佐·丘奇提出 Lambda 演算零碎,图灵机模型更加简略。随后,图灵提出了驰名的停机问题,并通过奇妙的逻辑悖论证实了停机问题在图灵机上是不可计算的,这是最早被证实无奈解决的可判定性问题之一,为希尔伯特的可判定性问题提供了一个反例论证。 ...

November 8, 2022 · 2 min · jiezi

关于android:使用前缀和数组解决区间和查询问题

本文已收录到  GitHub · AndroidFamily,有 Android 进阶常识体系,欢送 Star。技术和职场问题,请关注公众号 [彭旭锐] 进 Android 面试交换群。前言大家好,我是小彭。 明天分享到一种十分乏味的数据结构 —— 前缀和数组。前缀和的思维自身很容易了解,同时也是了解更高难度的线段树、字典树等数据结构的根底。 那么,什么是前缀和,咱们能够应用前缀和解决什么问题呢?明天咱们就围绕这两个问题开展。 学习路线图: 1. 什么是前缀和前缀和数组是一种用来高效地解决 “静态数据的频繁区间和查问” 问题的数据结构。 先举个例子,给定一个整数数组,要求输入数组在 $[i, j]$ 区间内元素的总和,这就是区间查问问题。这道题的暴力解法是很容易想到的,无非就是把 $[i, j]$ 区间中所有元素累计而已即可,工夫复杂度是 $O(n)$,空间复杂度是 $O(1)$。 单次查问的确曾经没有优化空间了,但如果进行频繁的区间和查问,很显著会有十分多反复的求和运算。例如,在查问 $[1, 5]$ 区间和 $[1, 10]$ 区间时,$[1, 5]$ 这个子区间就被反复计算了。那么,有可能借助 “空间换工夫”,在 $O(1)$ 工夫复杂度内计算 $[5000,1000000]$ 上的区间和吗? 这就须要应用前缀和 + 差分技巧: 预处理阶段: 开拓一个前缀和数组,记录每个地位到所有前驱节点的累加和 $preSum$,总共须要 O(n) 工夫;查问阶段: 将区间左右端点的区间和相减,就能够在 $O(1)$ 工夫失去这个区间中所有元素的累加和,防止了每次查问都须要 for 循环遍历整个区间求和。例如,要求 $[i, j]$ 区间的和,就是间接用 $preSum[j + 1] - preSum[i]$ 取得。前缀和示意图 2. 典型例题 · 区间和检索了解以上概念后,就曾经具备解决区间和问题的基本知识了。咱们来看一道 LeetCode 上的前缀和典型例题:LeetCode 303. 区域和检索 - 数组不可变 ...

November 8, 2022 · 3 min · jiezi

关于android:为什么你学不会递归谈谈我的经验

本文已收录到  GitHub · AndroidFamily,有 Android 进阶常识体系,欢送 Star。技术和职场问题,请关注公众号 [彭旭锐] 进 Android 面试交换群。前言大家好,我是小彭。 明天分享到计算机科学中一个根底又十分重要的概念 —— 递归。递归是计算机中特有的概念,你很难在事实世界中找到一个失当的例子与之关联起来。因而,对于很多初学编程的人,一开始会很难了解。 那么,到底什么是递归,咱们为什么要应用递归?咱们明天就围绕这两个问题开展。 学习路线图: 1. 什么是递归?递归(Recursion)是一种通过 “函数本人调用本人” 的形式,将问题反复地合成为同类子问题,并最终解决问题的编程技巧。 举个例子,要求一个数 $n$ 的阶乘 $n! = n*(n-1)*(n-2)*…*2*1$ ,有 2 种思考问题的思路: 递推(个别思维): 咱们从 $1$ 开始,用 $1$ 乘以 $2$ 失去 $2!$ 问题的解,用 $3$ 乘以 $2!$ 失去 $3!$ 问题的解。顺次类推,直到用 $n$ 乘以 $(n-1)!$ 失去原问题 $n!$ 的解。这就是用递推解决问题,这是绝对简略间接的思考形式;递归(计算机思维): 咱们把 $n!$ 的问题拆分为一个 $(n-1)!$ 的问题,如果咱们晓得 $(n-1)!$ 的解,那么将它乘以 $n$ 就能够得出 $n!$ 的解。以此类推,咱们将一个 $(n-1)!$ 的问题拆分为同类型的规模更小的 $(n-2)!$ 子问题,直到拆分到无奈拆分,能够间接得出后果 $1!$ 问题。此时,咱们再沿着拆分问题的门路,反向地依据子问题的解求出原问题的解,最终失去原问题 $n!$ 的后果。这就是用递归解决问题。求 n! ...

November 8, 2022 · 3 min · jiezi

关于android:华为开发者大会HDC2022HMS-Core-持续创新与开发者共创美好数智生活

11月4日,华为开发者大会HDC2022在东莞松山湖拉开帷幕。HMS Core在本次大会上带来了包含音频编辑服务的高拟真歌声合成技术、视频编辑服务的智能提取精彩霎时性能、3D Engine超大规模数字世界实时渲染技术,以及为听障人群发声的手语服务等HMS Core最新技术能力停顿 。此外,HMS Core行业解决方案也为开发者出现了基于行业角度的多样能力组合以及业界利用实例,助力打造高品质翻新利用。 在拥抱数字化时代的明天,华为心愿携手开发者,秉承“科技,不让任何一个人落伍”的美妙愿景,共创数智生存。在媒体畛域,HMS Core通过将AI技术利用在能力翻新中,打造出泛滥独特性能。如音频编辑服务推出的歌声合成性能,独创的AI Singer模型实现高水准业余演唱技巧,让AI变身音乐创作的“得力助手”;而基于华为自研AI算法框架MindSpore的视频编辑服务,在带来精彩片段等AI趣味玩法的同时,还实现了10%的功耗升高。此外,HMS Core还带来两款影音制作工具:业界首个反对Audio Vivid规范的制作工具—花瓣三维声(Petal Vivid)创作插件工具,以及提供沉迷式HDR Vivid全新视频创作体验的华为官网剪辑软件—花瓣剪辑,助力用户在音视频创作中取得翻新体验。 HMS Core在图形畛域也进行了全新降级。新增的凋谢能力 3D Engine,是一套助力打造“数字孪生”世界的3D实时渲染引擎。基于自研的“Hi-Mesh”几何减速技术,3D Engine反对亿级面片超大规模数字世界的实时渲染; 3D建模服务往年新增了主动骨骼绑定性能,该性能为3D建模节俭了繁琐的操作步骤,用户只需基于一般手机拍摄二足人形物体的多张图像,即可实现物体自动化生成3D几何模型和骨骼绑定,极大升高3D物体的生成难度和制作门槛。在理论应用中,3D建模服务可利用于电商购物等场景。目前,国内Top IP生产体验服务平台bilibili会员购,已打算将3D建模服务的主动骨骼绑定使用在手办等物体3D维度的趣味性商品展现,打造沉迷式营销。在3D建模服务的加持下,通过数字技术构筑的平面世界帮忙用户突破了时空界线,可多角度、近距离地产生互动。除了晋升体验感,事实与虚构交融交互的成果更易激发衍生品爱好者的共鸣。 多年来,华为保持用科技为特殊人群发声。HMS Core手语数字人在往年以簇新的形象为HDC 大会主题演讲进行了全程手语直播 。本次退场的AI手语数字人实现了全新降级,目前涵盖20K+手语词汇,可实现“抑扬顿挫”的动作节奏。此外,手语数字人的表情反对合乎听障人士的口动表白并扩大了26个罕用表情。手语服务的技术升级赋予AI手语数字人更加天然晦涩的手语表白,使科技能更精准地为听障人群发声。将来,华为将携手更多开发者同心同行,开发出更符合听障人士的产品,独特助力无障碍环境的建设,不让任何一个人在数字世界落伍。 HMS Core继续凋谢软硬件和端云能力,始终面向前沿畛域不断创新。目前已在媒体、图形、应用服务、人工智能、平安、连贯与通信、智能终端7大畛域凋谢了72个kit、25030个API,笼罩寰球600万开发者,并已有超过22万个利用集成了HMS Core。此外,华为还通过耀星打算、瘠田云创打算,在寰球范畴内继续激励并反对开发者翻新,赋能千行百业。助力开发者更快更好地共建鸿蒙生态,摸索数智将来,让翻新数字服务为更多用户带来智慧生存体验。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

November 6, 2022 · 1 min · jiezi

关于android:华为开发者大会2022HMS-Core-3D建模服务再升级万物皆可驱动

11月4日,HDC2022华为开发者大会在东莞松山湖举办。在本次大会的HMS Core翻新图形能力分论坛中,HMS Core重点介绍了其在3D技术畛域的翻新利用方向,其中3D建模服务展现了翻新的主动骨骼绑定性能,其具备高度自动化,超强鲁棒性,优质的蒙皮成果等劣势,进一步助力开发者技术创新。 HMS Core 3D建模服务的主动骨骼绑定性能,基于AI技术,面向有商品展现、趣味教学、AR游戏、动画制作等诉求的开发者,提供骨骼绑定等服务。用户仅需基于一般手机相机拍摄二足人形物体的多张图像,即可在生成3D模型的同时主动绑定骨骼以及蒙皮权重,实现一键驱动。举例来说,在动画制作方面,传统建模团队在获得模型后,需独自创立人体骨骼,再由绑定师进行逐个骨骼点绑定,使骨骼在模型中起到撑持作用。而通过HMS Core的主动骨骼绑定性能,人体骨骼点在建模的同时实现无感召主动绑定,节俭绑定工夫,从而进步制作效率。 目前,多数实现主动关节预计的办法都须要指标模型摆好规范姿势。HMS Core则利用AI算法缩小了人为规定的需要,能够反对非对称的多种姿势。这是源于华为自主研发的3D角色数据生成框架,基于数十万的3D绑定数据,全面晋升AI绑定算法的准确性和泛化性。此外,在主动绑定人体骨骼技术方面,相较于行业广泛仅反对17个骨骼点的规范,HMS Core的主动骨骼绑定性能反对辨认和跟踪23个骨骼点,可能更精准地辨认人形姿态。 HMS Core 3D建模服务继续翻新助力各畛域的开发者和合作伙伴打造更好的用户体验。在往年,bilibili会员购和HMS Core携手,打算将3D建模服务的主动骨骼绑定性能用于虚构场景下的商品展现。让一般的手办商品从2D立体,到生成3D模型,再与事实场景交融交互,提供跳舞等趣味互动,为消费者提供前所未有地沉迷式购物体验。而在2021年,bilibili会员购就已将HMS Core AR Engine能力利用于塔罗牌系列,助力其搭建平面世界,实现新场景的交融交互,播种了更多用户正向反馈。 HMS Core 3D建模服务不仅为电商行业注入了新的商业体验,在教学模具,游戏开发,动画制作等畛域有着更广大的利用场景。 例如在教学畛域,主动骨骼绑定性能可将教具建成3D模型,通过趣味性演示,进步学习趣味;在游戏开发畛域,通过实时骨骼动画,面部表情驱动,多重动画状态机交融等性能,能够帮忙开发者打造更晦涩实在的3D动画成果,晋升制作动画游戏的效率。 作为华为继续凋谢的软硬件和端云能力,HMS Core也将保持翻新,打造基于鸿蒙生态下全场景万物智联的底座,助力宽广开发者低门槛、低代码开发翻新利用,赋能千行百业走进3D数字世界。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

November 5, 2022 · 1 min · jiezi

关于android:使用单调队列解决-滑动窗口最大值-问题

本文已收录到  GitHub · AndroidFamily,有 Android 进阶常识体系,欢送 Star。技术和职场问题,请关注公众号 [彭旭锐] 私信我发问。前言大家好,我是小彭。 在上一篇文章中,咱们介绍了枯燥栈这种非凡的栈构造,枯燥栈是一种非常适合解决 “下一个更大元素问题” 的数据结构。明天,分享到枯燥栈的孪生兄弟 —— 枯燥队列(Monotonic Queue)。相似地,枯燥队列也是在队列的根底上减少了枯燥的性质(枯燥递增或枯燥递加)。那么枯燥队列是用来解决什么问题的呢? 学习路线图: 1. 枯燥队列的典型问题枯燥队列是一种用来高效地解决 “滑动窗口最大值” 问题的数据结构。 举个例子,给定一个整数数组,要求输入数组中大小为 K 的窗口中的最大值,这就是窗口最大值问题。而如果窗口从最左侧逐步滑动到数组的最右端,要求输入每次挪动后的窗口最大值,这就是滑动窗口问题。这个问题同时也是 LeetCode 上的一道典型例题:LeetCode · 239. 滑动窗口最大值 LeetCode 例题 这个问题的暴力解法很容易想到:就是每次挪动后遍历整个滑动窗口找到最大值,单次遍历的工夫复杂度是 $O(k)$,整体的工夫复杂度是 $O(n·k)$,空间复杂度是 $O(1)$。当然,暴力解法里的反复比拟运算也是很显著的,咱们每次仅仅往窗口里减少一个元素,都须要与窗口中所有元素对比找到最大值。 那么,有没有更高效的算法呢? 滑动窗口最大值问题 或者,咱们能够应用一个变量来记录上一个窗口中的最大值,每减少一个新元素,只须要与这个 “最大值” 比拟即可。 然而,窗口大小是固定的,每退出一个新元素后,也要剔除一个元素。如果剔除的元素正好是变量记录的最大值,那阐明这个值曾经生效。咱们还是须要破费 $O(k)$ 工夫从新找出最大值。那还有更快的办法寻找最大值吗? 2. 解题思路咱们先用 “空间换工夫” 的通用思路梳理一下: 在暴力解法中,咱们每挪动一次窗口都须要遍历整个窗口中的所有元素找出 “滑动窗口的最大值”。当初咱们不这么做,咱们把滑动窗口中的所有元素缓存到某种数据容器中,每次窗口滑动后也向容器减少一个新的元素,而容器的最大值就天然是滑动窗口的最大值。 当初,咱们的问题曾经产生转变,问题变成了:“如何寻找数据容器中的最大值”。 另外,依据题目条件限度,这个容器是带有束缚的:因为窗口大小是固定的,所以每退出一个新元素后,必然也要剔除一个元素。 咱们的数据容器也要满足这个束缚。 当初,咱们把注意力集中在这个容器上,思考一下用什么数据结构、用什么算法能够更高效地解决问题。因为这个容器是咱们额定减少的,所以咱们有足够的操作空间。 先说论断: 办法 1 - 暴力: 遍历整个数据容器中所有元素,单次操作的工夫复杂度是 $O(k)$,整体工夫复杂度是 $O(n·k)$;办法 2 - 二叉堆: 不须要遍历整个数据容器,能够用大顶堆保护容器的最大值,单次操作的工夫复杂度是 $O(lgk)$,整体工夫复杂度是 $O(n·lgk)$;办法 3 - 双端队列: 咱们发现二叉堆中很多两头元素是冗余的,拉低了效率。咱们能够在每解决一个元素时,能够先察看容器中刚刚退出的元素,如果刚刚退出的元素小于以后元素,则间接将其抛弃(后进先出逻辑)。最先退出容器的元素,如果超出了滑动窗口的范畴,也间接将其抛弃(先进先出逻辑)。所以这个容器数据结构要用双端队列实现。因为每个元素最多只会入队和出队一次,所以整体的计算规模还是与数据规模成正比的,整体工夫复杂度是 $O(n)$。上面,咱们先从优先队列说起。 ...

November 4, 2022 · 2 min · jiezi

关于android:使用单调栈解决-下一个更大元素-问题

本文已收录到  GitHub · AndroidFamily,有 Android 进阶常识体系,欢送 Star。技术和职场问题,请关注公众号 [彭旭锐] 私信我发问。前言大家好,我是小彭。 明天分享到一种栈的衍生数据结构 —— 枯燥栈(Monotonic Stack)。栈(Stack)是一种满足后进先出(LIFO)逻辑的数据结构,而枯燥栈实际上就是在栈的根底上减少枯燥的性质(枯燥递增或枯燥递加)。那么,枯燥栈是用来解决什么问题的呢? 学习路线图: 1. 枯燥栈的典型问题枯燥栈是一种特地适宜解决 “下一个更大元素” 问题的数据结构。 举个例子,给定一个整数数组,要求输入数组中元素 $i$ 前面下一个比它更大的元素,这就是下一个更大元素问题。这个问题也能够形象化地思考:站在墙上向后看,问眼帘范畴内所能看到的下一个更高的墙。例如,站在墙 [3] 上看,下一个更高的墙就是墙 [4] 。 形象化思考 这个问题的暴力解法很容易想到:就是遍历元素 $i$ 前面的所有元素,直到找到下一个比 $i$ 更大的元素为止,工夫复杂度是 $O(n)$,空间复杂度是 $O(1)$。单次查问的确没有优化空间了,那屡次查问呢?如果要求输入数组中每个元素的下一个更大元素,那么暴力解法须要的工夫复杂度是 $O(n^2)$ 。有没有更高效的算法呢? 2. 解题思路咱们先转变一下思路: 在暴力解法中,咱们每解决一个元素就要去求它的 “下一个更大元素”。当初咱们不这么做,咱们每解决一个元素时,因为不分明它的解,所以先将它缓存到某种数据容器中。后续如果能确定它的解,再将其从容器中取出来。 这个思路能够作为 “以空间换工夫” 优化工夫复杂度的通用思路。 回到这个例子上: 在解决元素 [3] 时,因为不分明它的解,只能先将 [3] 放到容器中,持续解决下一个元素;在解决元素 [1] 时,咱们发现它比容器中所有元素都小,只能先将它放到容器中,持续解决下一个元素;在解决元素 [2] 时,咱们察看容器中的 [1] 比以后元素小,阐明以后元素就是 [1] 的解。此时咱们能够把 [1] 弹出,记录后果。再将 [2] 放到容器中,持续解决下一个元素;在解决元素 [1] 时,咱们发现它比容器中所有元素都小,只能先将它放到容器中,持续解决下一个元素;在解决元素 [4] 时,咱们察看容器中的 [3] [2] [1] 都比以后元素小,阐明以后元素就是它们的解。此时咱们能够把它们弹出,记录后果。再将 [4] 放到容器中,持续解决下一个元素;在解决元素 [1] 时,咱们发现它比容器中所有元素都小,只能先将它放到容器中,持续解决下一个元素;遍历完结,所有被弹出过的元素都是有解的,保留在容器中的元素都是无解的。剖析到这里,咱们发现问题曾经产生转变,问题变成了:“如何寻找在数据容器中小于以后元素的数”。 当初,咱们把注意力集中在这个容器上,思考一下用什么数据结构、用什么算法能够更高效地解决问题。因为这个容器是咱们额定减少的,所以咱们有足够的操作空间。 ...

November 3, 2022 · 3 min · jiezi

关于android:以开发之名-bilibili会员购让IP在眼前动起来

随着ACG文化(二次元文化)影响力的一直晋升,哔哩哔哩平台上衍生品生产群体不断扩大,手办行业迅速崛起。2017年,B站推出ACG衍生品生产品牌bilibili会员购,涵盖二次元手办销售等多项业务,拓展了IP内容的生产边界,致力于满足Z世代用户的IP文化娱乐生产需要。 多年来,bilibili会员购高度关注用户体验,并借助站内牢固的用户根底劣势,及时洞察Z世代的趣味及偏好,这让他们一直思考:如何让生产体验更实在独特,唤起用户对于ACG文化的共鸣呢?bilibli会员购技术团队基于用户洞察和能力筛选,决定在AR和3D展现方向着手,为用户提供一种更乏味的沉迷式交互体验。 bilibili会员购AR专家刘聪说:“涉足新畛域的摸索,咱们心愿最好有一个短期内能够低成本构建、在业内具备竞争力且能够继续演进的技术化平台,反对咱们做生产体验的翻新。基于业务现状与诉求,咱们对业内多个凋谢服务平台进行了综合的技术评估,重点思考平台的全面性和稳定性,最终抉择了HMS Core提供的AR Engine、3D建模两个服务。” 理解ACG的敌人肯定对卡牌不生疏。B站上“旧日低语”系列卡牌始终都领有少量忠诚粉丝和极高的用户粘性。不久前,bilibili会员购上线该卡牌的AR特效,其真切的特效盘绕在眼前的卡牌,令许多粉丝纷纷感叹。 这是bilibili会员购和HMS Core AR Engine单干的第一个我的项目,通过辨认和跟踪环境中2D图像的地位和姿势,AR Engine可能实时输入图像姿势,将二维的塔罗牌有机地与环境产生融合,与事实世界交互,出现真实感十足的三维动画。刘聪示意,这一性能为用户打造了逾越空间间隔的沉迷式体验,同时也唤起了诸多用户对ACG衍生品的酷爱,这在帮忙用户召回、晋升用户粘性等方面都获得了显著的成果。据咱们统计,AR流动参与率是一般游戏参与率的2倍左右,购买后均匀每个用户应用超过10次。 除了卡牌,bilibili会员购还将AR Engine利用在幻星集、卡农、洛天依等更多商品和我的项目中,利用AR打造真切的平面世界,帮忙用户逾越时空界线,多角度、近距离地与IP衍生品互动。基于对HMS Core凋谢服务的信赖,在手办3D动静展现性能开发过程中,bilibili会员购抉择了持续与HMS Core单干。 往年4月份,bilibili会员购开始与HMS Core 3D建模服务单干,在场景搭建和工作角色设计中,3D建模都起到了重要的内容生产作用。 因为手办算法模型稀缺、造型简单,在建模过程中容易产生粘连等问题。面对bilibili会员购的这些反馈,HMS Core技术团队及时给出了优化倡议和帮忙,在单方的踊跃调试下,bilibili会员购通过减少多视角拍摄面、减少手办外表材质粗糙度,以及应用一些轻量级模型编辑软件进行切割等,终于让手办建模呈现出较高的完成度。 目前,商品3D模型展现性能曾经上线bilibili会员购,实现了短时间内从无到有的冲破。bilibili会员购开发人员徐家慧介绍到:“HMS Core精湛的技术和业余的全方位反对,使咱们在短短两天内就上线了商品3D模型的展现性能。这是咱们和HMS Core单方共同努力的后果,也失去了很多用户侧面的反馈”。 真切的3D模型成果让徐家慧心生感叹:“以前,我总感觉IP衍生品肯定要酷炫能力感动用户。然而当我发现每个产品背地,其实都承载着用户有数打动和尊重的时候,我明确了,只有关上思考维度,能力将商品与用户紧密联系起来。” 技术的倒退一直拓宽购物的场景,AR和3D展现技术正从新定义虚构与事实,帮忙用户逾越空间间隔,带来无可比拟的视觉、交互和生产体验。而在各种酷炫技术之下,包裹的是bilibili会员购与用户一起做梦、一起实现的柔软内核。 将来,bilibili会员购也将一直自我迭代,依靠翻新技术,打造更为沉迷的生产体验。对于将来与HMS Core的单干,刘聪示意:“咱们将配合鸿蒙生态建设,与HMS Core在虚构体验、数字人、音视频媒体创作等场景深度单干,欠缺各个场景的虚构玩法,晋升用户的沉迷式体验,为次元空间架起一座连贯的桥梁。”这一愿景与HMS Core不约而同:继续凋谢具备竞争力并继续演进的翻新技术,助力开发者为用户带来多元乏味的赏玩体验,用技术架起一座翻新的桥梁,全力赋能开发者,激发业务倒退生机和翻新能源。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

November 3, 2022 · 1 min · jiezi

关于android:如何使用并查集解决朋友圈问题

本文已收录到  GitHub · AndroidFamily,有 Android 进阶常识体系,欢送 Star。技术和职场问题,请关注公众号 [彭旭锐] 私信我发问。前言大家好,我是小彭。 明天分享到的是一种绝对冷门的数据结构 —— 并查集。尽管冷门,然而它背地体现的算法思维却十分精妙,在解决特定问题上能做到出奇制胜。那么,并查集是用来解决什么问题的呢? 学习路线图: 1. 意识并查集除了并查集之外,不相交汇合(Disjoint Sets)、合并-查找汇合(Merge-find Set)、联结-查问数据结构(Union-find Data Structure)、联结-查问算法(Union-find algorithm),均示意雷同的数据结构或思维。 1.1 并查集用于解决什么问题?并查集是一种用来高效地判断 “动静连通性 ” 的数据结构: 即给定一个无向图,要求判断某两个元素之间是否存在相连的门路(连通),这就是连通问题,也叫 “朋友圈” 问题。听起来有点懵,你先别着急哈,咱来一点一点地把这个常识体系建设起来。 先举个例子,给定一系列航班信息,问是否存在 “北京” 到 “广州” 的门路,这就是连通性问题。而如果是问 “北京” 到 “广州” 的最短门路,这就是门路问题。并查集是专一于解决连通性问题的数据结构,而不关怀元素之间的门路与间隔,所以最短门路等问题就超出了并查集的可能解决的范畴,不是它思考的问题。 连通问题与门路问题示意图 另一个关键点是,并查集也非常适合解决动态数据的连通性问题。 因为在实现旧数据的解决后,旧数据的连通关系是记录在并查集中的。即便后续动静减少新的数据,也不须要从新检索整个数据集,只须要将新数据提供的信息补充到并查集中,这带有空间换工夫的思维。 动静连通问题 了解了并查集的利用场景后,上面探讨并查集是如何解决连通性的问题。 1.2 并查集的逻辑构造既然要解决连通性问题,那么在并查集的逻辑构造里,就必须用某种形式体现出两个元素或者一堆元素之间的连贯关系。那它是怎么体现的呢 —— 代表元法。 并查集应用 “代表元法” 来示意元素之间的连贯关系:将互相连通的元素组成一个子集,并从中选取一个元素作为代表元。而判断两个元素之间是否连通,就是判断它们的代表元是否雷同,代表元雷同则阐明处于雷同子集,代表元不同则阐明处于不同的子集。 例如,咱们将航班信息构建为并查集的数据结构后,就有 “重庆” 和 “北京” 两个子集。此时,问是否存在 “北京” 到 “广州” 的门路,就是看 “北京” 和 “广州” 的代表元是否雷同。可见它们的代表元是雷同的,因而它们是连通的。 并查集的逻辑构造和物理构造 了解了并查集的逻辑构造后,上面探讨如何用代码实现并查集。 1.3 并查集的物理构造并查集的物理构造能够是数组,亦能够是链表,只有可能体现节点之间连贯关系即可。 ...

November 2, 2022 · 5 min · jiezi

关于android:以开发之名线上家装新美学梦想之家由你来定

何谓家装?过来,人们辗转于各大家装城,购买时下风行的家具装璜,参考各类“过来人”和设计师的意见,糅杂一些样板间格调,依附设想拼凑一个设计方案。而明天,在年轻一代的生产群体心中,家装的意义正产生粗浅扭转:要自在定义,坚定悦己,实用与好看兼得;要猫与鱼,花与叶,喜爱的音乐,珍藏的手办都有本人的天地;要一蔬一饭,一桌一椅,久而久之,都明晃晃写满“自我”;更要足不出户,指尖跃动,线上家装,轻松搞定…… 用手机,在眼前,点缀幻想之家对于早已习惯互联网生产的年老用户来说,线上家装并不是一件新鲜事。在线看看固定的样板间、拖动几个产品模块图这类的玩法,也远不能满足他们的需要。对于线上家装,当代年轻人有着更明确的期待:“在眼前”。 作为淘宝一站式造家的家居家装平台,淘宝极有家正致力于满足这一需要。“装修本人的幻想之家其实是件试错老本很高的事件,单靠立体设计图很难去设想家具的摆放和格调的确定。而用户恰好最想要的就是这种‘在眼前’的感觉。”阿里巴巴大淘宝技术算法工程师宋瑾认为。 想要“在眼前”实现线上搭配,要害就在于构建出用户现实中的实在户型。阿里巴巴大淘宝技术架构师胡晓航示意:“尽管咱们的数据库外面能够通过小区名搜寻到销售户型,但销售户型与实在户型其实存在很多的差别。”因而,淘宝极有家心愿能够利用AR技术实现不同家庭实在户型的重建,在手机上就能轻松进行3D家居搭配,让用户真正看得见装修格调和家具融入理论户型中的成果,实现真正意义上的让现实走进事实。 帮忙极有家解决这一外围问题的正是HMS Core AR Engine,“要实现这样的体验,须要挪动端精确,高效的静止跟踪和环境了解。对于这点,咱们外部开发团队统一认为HMS Core图形畛域中的AR Engine是目前国内行业当先、覆盖面绝对较广的解决方案,也是最适宜咱们的。”宋瑾说。 冲破虚构与事实的界线 AR赋能线上家装体验为了真正让虚构走入用户眼前,让AR更好地赋能在线家装,淘宝极有家与HMS Core进行了深度的开发单干,胜利将HMS Core AR Engine集成到手机淘宝App中,为用户提供了更“悦己”的沉迷式生产体验。利用AR Engine的AR测量性能和高精度环境SLAM技术,联合淘宝极有家技术团队的智能墙角点辨认和门窗辨认技术,用户通过手机扫描即可轻松构建屋宇环境,从而在这个“实在的”家里查看心仪家居的摆放细节,轻松开启线上DIY家装。 现在,关上淘宝极有家,用户不用再费神搜寻各小区房型数据,上传本人家的户型。只需拿起手机,通过AR在家里扫一圈,就能够准确绘制还俗的理论户型。几分钟后,用户还能看到针对本人户型的3D设计方案,并依据本人的爱好随心尝试各种格调的智能设计和家装搭配,打造一个幻想之家,完满包容共性、审美和人生故事。让装修更加便捷舒服,满足新一代年轻人对于线上家装的期待,也唤醒更多人生存理念和形式的扭转。 让用户在线“预体验”家装成果,也只是淘宝极有家和HMS Core AR Engine单干的一部分,胡晓航表白了他对于和HMS Core将来单干的更高期待:“HMS Core凋谢了许多优质的技术,比如说AR Engine、3D Engine和3D建模服务,为家装元宇宙提供了技术基石,置信将来咱们会有更多的单干可能性。” “让用户决定幻想之家的每一片平静,每一缕阳光,和每一份生机”,这是技术握着人类的手绘就的美好生活图卷,也是HMS Core和淘宝极有家独特的愿景。在数字技术的加持下,家居家装行业正在造成一个融合线上线下,交融商家、设计师、消费者的有机新生态。针对开发者们日益重视的用户体验指标——所想即所见、所见即所得,HMS Core将持续凋谢翻新服务,携手更多开发者,为用户带来更便捷舒服的数字体验,推动数字生态凋敝倒退,为数字生存赋予全新的形式和意义。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

November 1, 2022 · 1 min · jiezi

关于android:以开发之名-小红书用年轻人的方式开发年轻人喜欢的应用

2013年,小红书在上海成立,同年12月,小红书推出海内购物分享社区。一个开放式的体验型分享社区走进了数亿用户的生存。每个人都能在这个凋谢社区,分享本人的生存笔记,给有同样需要的人种草。 小红书用户“一只雪梨酱”的车胎呈现了裂缝,她拍了一张照片并附上文字 “这种状况须要换胎吗?”发了一篇小红书笔记,几个小时后,她收到了上百条评论,每个人都在用本人的亲身经历为一只雪梨酱遇到的问题出谋划策。 小红书社区技术部播放器负责人泽宇装修新房子时,偶尔看到一个灯,但他在很多购物平台都没有搜到同款,起初在小红书找到了相干笔记,外面具体介绍了灯具的优缺点及品牌,依据笔记中的实体店举荐,他如愿买到了喜爱的灯具。 作为小红书资深用户,“一只雪梨酱”喜爱遇到问题就看看小红书,说不定有什么意外的播种;作为小红书社区技术部播放器负责人,泽宇发现,通过用户视角应用这个本人参加开发的我的项目,能带给本人意外的惊喜。 这就是小红书的魅力,无论是用户还是开发者,都以一种凋谢的心态体验万事万物,分享并种草给有同样趣味的年轻人,独特打造一个有“人情味”的线上社区。 在退出小红书之前,泽宇是小红书的忠诚用户,他喜爱社区文化,敢于尝试陈腐事物,喜爱凋谢、轻松的工作气氛,这也正是他和其余小伙伴抉择退出小红书的起因。就像泽宇说的“获取用户实在的诉求,并将其及时转换成对应的创新能力,让用户体验并应用,是咱们团队始终谋求的指标”。一个可能一直关注用户反馈并且一直想方法解决问题的团队能力开发出一款用户粘性高的利用。 或者也是得益于这种技术文化与小红书用户文化的符合,能力吸引超过2亿人在这个自在凋谢的社区分享生存笔记,敌对互动。 短视频的爆发式增长,让小红书的博主不再只专一于公布图文内容,短视频、vlog式的记录和分享形式更可能间接疾速的激发用户浏览和互动。于博主而言,更高清晰度的视频画面可能晋升浏览体验和笔记的受欢迎水平,于小红书的开发团队来说,博主和用户的需要都要失去满足,同时也须要管制带宽老本。 因而小红书技术团队开始寻找可能满足需要的合作伙伴,进行一次大胆的尝试。 2021年2月,泽宇和技术团队开始对App迭代优化,“之前,大家还是认为端侧算力各方面的受限比较严重。”与HMS Core凋谢服务的单干被泽宇称为一次业界当先的尝试。“咱们想以端侧超分为契机,来拓宽端侧所使用画质加强能力,进行更深刻的建设,给大家提供一个参考”。 小红书通过应用HUAWEI HiAI Foundation的视频超分能力,在无需耗费用户额定流量的同时,加强了视频的分辨率和画质,带给用户晦涩、高清的视频笔记观看体验。小红书在新性能上线后,经营和技术团队就继续收集用户反馈,大家广泛反馈利用内的视频相较之前,画质有一个显著的晋升,观看的流畅性也比之前要好。 本着真挚分享、敌对互动的信念,小红书在华为利用市场播种了121亿次的下载量,泽宇和技术团队成员用一行行代码,帮忙更多用户实现了分享美好生活的可能。每个人在这个社区中,既是创作者,也是用户,更多年轻人在这找到了气味相投的人。而HMS Core心愿构建开发者背地的“小红书”,发明一个凋谢的社区,每个开发者都能在这里播种、成长和分享。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

November 1, 2022 · 1 min · jiezi

关于android:FAQ关于华为地图服务定位存在偏差的原因及解决办法

一、 问题形容:华为地图服务“我的地位”能力,在中国大陆地区,向用户展现他们在地图上的以后地位与用户的理论地位存在较大的偏差。 具体差异能够查看下方的图片: 二、 偏差较大的起因:华为Map SDK在中国大陆应用的天文坐标系是GCJ02。点击“我的地位”控件,获取的定位经纬度的天文坐标系是WGS-84。因为以上两个起因,即地图View和“我的地位”定位源应用的天文坐标系不统一,所以才导致了“我的地位”定位不精确的问题。三、 解决方案:先应用华为Location SDK通过定位获取用户以后所在位置,华为Location SDK应用的天文坐标系也是WGS-84。将华为Location SDK获取的定位经纬度转换为GCJ02天文坐标系。通过华为Map SDK提供的huaweiMap.setLocationSource(LocationSource locationSource)办法,设置“我的地位”图层定位源。四、 注意事项:应用Location SDK获取用户以后所在位置信息 和 WGS84转GCJ02坐标系的章节仅实用于6.7.0.300之前的SDK版本,因为Location SDK的6.7.0.300及之后的版本已反对间接获取GCJ-02坐标系的经纬度。 五、 具体的实现步骤:1. 创立已开启“我的地位”性能的地图实例a. 在Activity的布局文件中增加地图控件且设置地图属性。 <?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment xmlns:android="http://schemas.android.com/apk/res/android" xmlns:map="http://schemas.android.com/apk/res-auto" android:id="@+id/mapfragment_mapfragmentdemo" class="com.huawei.hms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" map:cameraTargetLat="48.893478" map:cameraTargetLng="2.334595" map:cameraZoom="16" /></androidx.constraintlayout.widget.ConstraintLayout>b. 在Activity中初始化SDK,并加载地图。 public class HwMyLocationActivity extends AppCompatActivity implements OnMapReadyCallback { private HuaweiMap huaweiMap; private SupportMapFragment mSupportMapFragment; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //初始化SDK MapsInitializer.initialize(this); setContentView(R.layout.activity_mylocation); mSupportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapfragment_mapfragmentdemo); //加载地图 mSupportMapFragment.getMapAsync(this); } @Override public void onMapReady(HuaweiMap huaweiMap) { //地图数据加载实现,展现胜利。 this.huaweiMap = huaweiMap; huaweiMap.setMyLocationEnabled(true); }}c. 展现地图并点击我的地位UI控件,从三张截图能够看出:“我的地位”与“用户理论所在位置”存在较大偏差。 ...

October 31, 2022 · 4 min · jiezi

关于android:AR人体姿态识别实现无边界的人机交互

近年来,AR一直倒退,作为一种加强事实技术,给用户带来了虚构和事实世界的交融体验。但用户曾经不满足于单纯地将某件虚构物品放在事实场景中来感触AR技术,更想用身材姿态来触发某个指令,达到更具真实感的人机交互性能。 比方在AR体感游戏中,用户不用点击按键进行频繁操作,通过某个姿态即可触发;在拍摄短视频时,用户无需接触屏幕,摆出不同的姿态便可触发某些特定成果;健身App中,教练进行健身教学时,用户能够摆出相应姿态跟练,由零碎辨认姿态是否规范。 那么,如何用特定的人体姿态来辨认指令进行人机交互呢? 华为HMS Core AR Engine服务给出了解决方案,其中人体姿势辨认服务提供了单人身材姿势辨认能力,辨认六种动态身材姿态并输入辨认后果,反对前后摄像机切换,实现虚拟世界与事实世界的交融。 开发者搭档可将人体姿势辨认能力使用在须要辨认动作并触发某些事件的利用场景中,比方交互界面管制、游戏操作动作辨认等触发类交互行为,是体感利用的根底外围性能,为开发者AR利用提供较远距离近程管制和合作能力,丰盛利用交互体验。 上面是开发者利用集成AR Engine人体姿势辨认能力的具体步骤。 开发步骤开发环境要求: JDK 1.8.211及以上。 装置Android Studio 3.0及以上: minSdkVersion 26及以上 targetSdkVersion 29(举荐) compileSdkVersion 29(举荐) Gradle 6.1.1及以上(举荐) 在华为终端设备上的利用市场下载AR Engine服务端APK(需在华为利用市场,搜寻“华为AR Engine”)并装置到终端设备。 测试利用的设施:参见AREngine个性软硬件依赖表。如果同时应用多个HMS Core的服务,则须要应用各个Kit对应的最大值。 开发筹备在开发利用前须要在华为开发者联盟网站上注册成为开发者并实现实名认证,具体方法请参见帐号注册认证。华为提供了Maven仓集成形式的AR Engine SDK包,在开始开发前,须要将AR Engine SDK集成到您的开发环境中。Android Studio的代码库配置在Gradle插件7.0以下版本、7.0版本和7.1及以上版本有所不同。请依据您以后的Gradle插件版本,抉择对应的配置过程。以7.0为例:关上Android Studio我的项目级“build.gradle”文件,增加Maven代码库。 在“buildscript > repositories”中配置HMS Core SDK的Maven仓地址。 buildscript { repositories { google() jcenter() maven {url "https://developer.huawei.com/repo/" } }}关上我的项目级“settings.gradle”文件,配置HMS Core SDK的Maven仓地址。dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { repositories { google() jcenter() maven {url "https://developer.huawei.com/repo/" } } }}增加依赖 在“dependencies”中增加如下编译依赖:dependencies { implementation 'com.huawei.hms:arenginesdk:{version}}利用开发1.运行前验证:查看以后设施是否装置了AR Engine,若曾经装置则失常运行,若没有装置,App应采纳适合的形式揭示用户装置AR Engine,如被动跳转利用市场,申请装置AR Engine。具体实现代码如下: ...

October 28, 2022 · 2 min · jiezi

关于android:移动端如何强制横屏

因为刚开始没有思路,找了很多大神的参考,最初了解的出如下:思路:在竖屏状态下,让body旋转成横屏,宽高获取屏幕的宽高; <body><div id="print"><h3>Mlll000999887</h3></div></body>css写法:竖屏变横屏,body的宽高还是不对,当初用js来计算: 第二种办法:1.通过增加监听事件onorientationchange,而后判断window.orientation这个参数 window.orientation参数对应的屏幕方向:Andriod:0 或180 横屏Andriod: 90 或 -90 竖屏ipad,iphone: 90 或 -90 横屏ipad,iphone: 0 或180 竖屏window.matchMedia("(orientation: portrait)") 办法返回的是一个MediaQueryList对象,matches值为true示意为竖屏,反之就是横屏:安卓手机在某些浏览器中能够禁止页面横屏:QQ和微信中浏览器:<meta name="x5-orientation" content="portrait">UC浏览器:<meta name="screen-orientation" content="portrait">最初:当然不止这一种办法,也能够全靠css来实现; 最初感激博主大神:https://cloud.tencent.com/dev...https://blog.csdn.net/Lc_styl...

October 27, 2022 · 1 min · jiezi

关于android:广告内容定向分级保护未成年人身心健康

随着挪动智能终端的遍及,未成年人首次触网的年龄一直升高。依据中国互联网络信息中心第48次《中国互联网络倒退情况统计报告》显示,截至2021年6月,中国网民规模为10.11亿人,6—19岁网民占15.7%,共1.58亿人。同时依据第十次中国未成年人互联网使用考察显示,中国未成年人互联网普及率为99.2%,显著高于71.6%的全国均匀普及率。10岁前接触互联网的比例达到78%,首次触网年龄集中在6~10岁。这些数据表明,未成年人上网低龄化趋势显著,面对互联网的“引诱”,未成年人还未建立正确的价值观,没有很好的自控力,所以增强面向未成年人的产品、服务、广告等管控迫不及待。 对于手机App里的商业广告,很多家长心愿广告能够进行分级,比方18岁以下的人群,不再收到酒水、整形、化妆品类广告;还有,依照广告法规定,针对不满14周岁的未成年人的商品或者服务的广告,不要含有诱导家长购买或可能引发孩子模拟的不平安行为等;在儿童占比拟多的童话故事、动画App里尽量不呈现广告。 那么针对未成年爱护的需要,如何为未成年人投放适宜他们观看的内容和广告,实现内容分级的同时还能依据不同受众人群精准投放广告呢?HMS Core广告服务基于受众人群申请广告能力助力App筛选人群设置广告投放。 HMS Core广告服务SDK可通过设置RequestOptions对象,来满足针对不同受众人群申请对应广告内容的能力。该对象通过HwAds静态方法获取利用的全局受众人群信息。 开发步骤在开发前须要集成HMS Core SDK和HUAWEI Ads SDK,具体步骤可参考文档。 RequestOptions提供了7种办法设置受众人群: 满足《儿童在线隐衷保护法》(COPPA)的要求,提供“面向儿童内容标记”的设置// 面向儿童的设置,表明广告内容须要合乎COPPA的规定 RequestOptions requestOptions = HwAds.getRequestOptions().toBuilder().setTagForChildProtection(TAG_FOR_CHILD_PROTECTION_TRUE).build();TAG_FOR_CHILD_PROTECTION_TRUE:表明广告内容须要合乎COPPA的规定。TAG_FOR_CHILD_PROTECTION_FALSE:表明广告内容不须要合乎COPPA的规定。 TAG_FOR_CHILD_PROTECTION_UNSPECIFIED:表明不心愿明确广告内容是否须要合乎COPPA的规定。 满足《个别数据保护条例》(GDPR)和其余国家对于未成年人爱护的要求,提供“未达到法定承诺年龄的用户”的设置// 未达到法定承诺年龄的用户的设置,表明心愿广告申请合乎未达到法定承诺年龄用户的广告规范RequestOptions requestOptions = HwAds.getRequestOptions().toBuilder().setTagForUnderAgeOfPromise(PROMISE_TRUE).build();PROMISE_TRUE:表明心愿按适宜未达到法定承诺年龄的用户的形式来解决广告申请。 PROMISE_FALSE:表明不心愿按适宜未达到法定承诺年龄的用户的形式来解决广告申请。 PROMISE_UNSPECIFIED:表明未明确是否按适宜未达到法定承诺年龄的用户的形式来解决广告申请。 提醒:设置了PROMISE_TRUE后广告平台的返回的广告数量可能会少一些。 提供广告内容过滤能力,在申请广告时能够设置广告内容分级的下限。应用此办法获取的广告内容会小于等于设置的分级下限// 广告内容过滤,指定返回的广告内容应与分级标签名称对应,但不得高于WRequestOptions requestOptions = HwAds.getRequestOptions().toBuilder().setAdContentClassification(AD_CONTENT_CLASSIFICATION_W).build();AD_CONTENT_CLASSIFICATION_W:适宜幼儿及以上年龄段的受众,仅展现内容分级为W的内容。 AD_CONTENT_CLASSIFICATION_PI:适宜少儿及以上年龄段的受众,展现内容分级为PI、W的内容。 AD_CONTENT_CLASSIFICATION_J:适宜青少年及以上年龄段的受众,展现内容分级为J、PI、W的内容。 AD_CONTENT_CLASSIFICATION_A:仅适宜成人受众,展现内容分级为A、J、PI、W的内容。 提醒:设置了AD_CONTENT_CLASSIFICATION_W后广告平台的返回的广告数量可能会少一些。 反对将投放的广告分为个性化广告与非个性化广告// 申请个性化广告与非个性化广告,当参数设置为ALLOW_ALL时,setHwNonPersonalizedAd办法和setThirdNonPersonalizedAd办法设置的个性化广告是无效的RequestOptions requestOptions = HwAds.getRequestOptions();requestOptions.toBuilder().setNonPersonalizedAd(ALLOW_ALL).build();ALLOW_ALL:个性化广告与非个性化广告。ALLOW_NON_PERSONALIZED:非个性化广告。 反对对华为DSP投放的广告设置个性化广告与非个性化广告// 华为DSP投放的广告设置个性化广告与非个性化广告RequestOptions requestOptions = HwAds.getRequestOptions();requestOptions.toBuilder().setHwNonPersonalizedAd(ALLOW_ALL).build();ALLOW_ALL:个性化广告与非个性化广告。ALLOW_NON_PERSONALIZED:非个性化广告。 反对对三方DSP投放的广告设置个性化广告与非个性化广告// 三方DSP投放的广告设置个性化广告与非个性化广告RequestOptions requestOptions = HwAds.getRequestOptions();requestOptions.toBuilder().setThirdNonPersonalizedAd(ALLOW_ALL).build();ALLOW_ALL:个性化广告与非个性化广告。ALLOW_NON_PERSONALIZED:非个性化广告。 提醒:设置了ALLOW_NON_PERSONALIZED后广告平台的返回的广告数量可能会少一些。 具体参数详情请查看HMS Core基于受众人群申请广告官网指南。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

October 27, 2022 · 1 min · jiezi

关于android:分享几个关于Camera的坑

最近忙于开发一款基于Camera2 API的相机利用,局部性能波及到广角镜头,因而踩了不少坑,在此与大家分享下以作记录交换... 通过查阅材料发现在安卓上所谓的广角镜头切换其实是用一个逻辑摄像头蕴含多个物理摄像头实现的,在zoom缩放的时候依据不同的缩放值切换不同的物理摄像头。 参考:https://source.android.google.cn/devices/camera/multi-camera?hl=zh-cn 踩坑记录CameraDevice.TEMPLATE_RECORD的兼容性问题 个别在录制视频的时候为了取得比较稳定的帧率,咱们可能会应用CameraDevice.TEMPLATE_RECORD创立CaptureRequest.Builder,然而CameraDevice.TEMPLATE_RECORD在某些镜头上却是不可用的,个别体现就是黑屏,查找定位发现是相机没有数据流输入。解决方案就是查看API文档正文,发现CameraDevice.TEMPLATE_RECORD是有肯定的限度的,咱们依据文档形容做相应的检测,如果检测到CameraDevice.TEMPLATE_RECORD不可用时回退到TEMPLATE_PREVIEW即可,以下是文档正文内容: Create a request suitable for video recording. Specifically, this means that a stable frame rate is used, and post-processing is set for recording quality. These requests would commonly be used with the CameraCaptureSession.setRepeatingRequest method. This template is guaranteed to be supported on all camera devices except DEPTH_OUTPUT devices that are not BACKWARD_COMPATIBLE.See Also:createCaptureRequest有些镜头明明在CameraManager.getCameraIdList中返回了,然而却无奈关上起初发现这些不能关上的摄像头StreamConfigurationMap的getOutputSizes返回空,也就是说没有可反对的输入图像尺寸,因而咱们在过滤摄像头时也须要验证StreamConfigurationMap是否有反对的尺寸输入。 // 摄像头是否可用 private boolean isEnableCamera(CameraCharacteristics cameraCharacteristics) { StreamConfigurationMap configs = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); Size[] sizes = configs.getOutputSizes(ImageFormat.JPEG); return null != sizes && sizes.length > 0; }有些镜头有色调偏差在对逻辑镜头进行测试时发现,从一个物理摄像头切换到另外一个物理摄像头,图像有显著的色调偏差,例如上面的两幅比照图: ...

October 26, 2022 · 1 min · jiezi

关于android:阿里云移动测试远程真机篇

导读:本文将介绍申请近程真机以及在近程真机上执行测试工作的具体操作,包含申请近程真机、装置利用、扫码、定位、性能测试等。 挪动测试概览挪动测试服务(Mobile Testing)是为企业客户和挪动开发者提供真机测试服务的云平台,提供大量热门机型,7x24 全天候服务,帮忙用户发现各类 App 隐患,包含但不限于利用解体、兼容性问题、功能性问题、性能问题等,晋升 App 品质和市场竞争力,缩小用户散失。 挪动测试领有云真机和专家测试两大个性。本文将开展介绍云真机中近程真机的相干常识。 近程真机性能个性性能测试 反对4大项共9个指标的采集和剖析反对页面卡顿、内存异样、CPU异样等性能问题反对比照历史基线性能数据,辨认性能消退等问题近程调试 提供海量近程真机,通过Web形式间接操作在线录制 提供iOS和Android平台在线可视化录制,晋升用例生产速度10倍以上反对将在线可视化录制脚本间接转化Appium通用脚本真机测试操作指南1.前提条件开明阿里云EMAS收费套餐 2.抉择近程真机机型进入EMAS控制台创立我的项目,找到“挪动测试-近程真机”,在真机列表中抉择待调试的近程真机机型 3.上传并装置测试包近程真机抉择好后,“立刻应用”,进入近程真机页面,上传并装置待测试利用包 4.查看日志在指定设施的近程真机页面,关上日志页签,进行日志查看 5.截屏/录屏关上截屏页签,进行真机截屏与录制 6.上传文件关上文件页签,进行上传文件操作 7.设置近程调试单击更多下拉菜单,抉择ADB,依照零碎提醒进行操作 8.定位测试单击更多下拉菜单,选择定位。左侧真机进入利用待测页面,右侧设置指标地位,定位胜利后零碎提醒“虚构定位胜利”。 阐明: 近程真机需开启定位权限。浏览器需开启定位权限,并在浏览器弹窗中单击“容许应用定位选项”。请确保处于公网环境,地图需在公网环境下显示。 9.扫码测试单击更多下拉菜单,抉择扫码,依照零碎提醒进行操作 10.性能测试单击更多下拉菜单,抉择性能测试。进入后,抉择待测试的利用进行性能剖析 分割咱们如应用过程中有任何疑难,可钉钉搜寻“35248489”退出利用研发平台EAMS开发者交换群

October 25, 2022 · 1 min · jiezi

关于android:驾考宝典携手HMS-Core统一扫码服务构建复杂场景中的流畅扫码体验

“驾考宝典”是一款颇具人气的互联网综合驾照考试学习利用,通过弱小的驾考性能,在手机挪动端为学车学员提供从报名、学习到拿本的全方位驾考服务。作为一个业余的驾培平台,“驾考宝典”始终以来一直地拓宽学员学车的服务场景,增强学员、驾校、平台之间的分割。而扫码性能作为挪动利用上的根底服务,是用户和利用之间疾速连贯的枢纽,是平台连贯学员、驾校、教练的外围性能。学员可基于此绑定驾校、教练,疾速约课练车、优先考试。因而,一个稳固、疾速、识别率高的扫码服务对“驾考宝典”构建“三位一体”的互联网驾培模式起着至关重要的作用。 如何为用户提供更顺畅的学考流程是“驾考宝典”始终以来的谋求。 与华为HMS Core的单干故事始于2021年底,彼时驾考宝典技术团队通过多方市场调研和比对测试,认为HMS Core对立扫码在含糊等简单的场景下也能有较高的识别率,能够减速用户的学考流程,贴合驾考宝典业务场景,便决定开展进一步单干。 学员在驾校报名胜利后,扫描教练二维码并与之绑定,不便后续在线约课练车、查问课程安顿、优先安顿考试。因为全国范畴内的驾校、教练所处的环境皆不雷同,自行打印生成的二维码受打印纸张与扫码环境影响,常常会呈现遮挡、含糊、变形等各类极其状况,大大影响用户的绑定成功率。 (驾考宝典App绑定教练界面) HMS Core对立扫码服务基于多项计算机视觉技术,对遮挡、含糊、变形等简单场景做了针对性算法优化极大水平晋升了学员扫描二维码的识别率,高效、精准、稳固,真正做到了学员无忧驾考,轻松拿本。 驾考宝典利用研发负责人提及与HMS Core单干时说到:“在HMS Core对立扫码的技术加持下,驾考宝典高效实现了绑定驾校、教练这一性能。它无效拓展了驾考宝典App的服务边界,增强了学员、驾校、驾考宝典平台的分割,为构建“三位一体”的互联网驾培模式提供了强有力的根底建设反对。咱们也期待将来与华为HMS Core在其余场景的单干,为咱们的用户带来更多更有价值的服务体验”。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

October 25, 2022 · 1 min · jiezi

关于android:10分钟让你了解应用宝APP上架流程

APP开发实现后,须要上架到各个利用市场,能力供用户下载应用,这篇文章和大家介绍一下利用宝的上架流程,供大家参考,给须要上架的人做参考;    上架前须要注册开发者账号,注册类型有集体和公司,而后依照提醒,提交相干材料,次要包含身份证正反面照片,营业执照等,最初用用邮箱验证一下就能够了。      上架前须要理解一下利用市场所须要筹备的材料,依据提醒去创立利用,依照提醒去上传相应的材料,次要的材料有利用名称,利用分类,利用截图、一句话介绍,利用介绍,关键词等,而后上传利用,抉择审核通过后公布,就坐等利用市场的审核音讯了。     提交后关注一下审核动静,如果没有通过,能够点击站内信参看具体的起因,而后从新提交,再次期待审核通过;如果对审核不通过的起因有质疑,及时与客服分割,这样有助于疾速定位问题,并批改,    利用审核通过后有时候还须要申请外显,须要去工单零碎中去提交需要单,再次申请上架,通过后能力在利用市场显示。具体操作都有相应的指引,如图所示;    国内利用市场绝对比拟好上架,本人相熟一下操作流程就能够了。相干不合规的中央都会有明确的提醒,革新起来也比拟不便,如果是开发本人上架,遇到了问题能够自行解决,如果不懂开发的人上架,就须要将问题反馈给开发整改,而后再次上架。个别十天左右,重复批改几次,就能够失常上架了!

October 24, 2022 · 1 min · jiezi

关于android:如何规范App广告的隐私获取让用户拥有更多知情权

随着互联网的一直遍及,越来越多老百姓应用智能设施触达互联网。但用户常常发现自己无意间提到的货色,关上App就收到相干产品的广告推送,甚至有人狐疑手机App是通过麦克风来窃取本人平时聊天信息中的关键词进行定向的广告推送。 这种狐疑不无道理,与传统广告相比,现在的媒体广告主投放的广告定位更精确、模式更丰盛并且能够取得更好的成果。当然,前提是须要App尽可能地收集用户数据,来掂量广告投放成果和ROI等。尽管这些App会提前获取用户批准,但一方面很多用户放心本人隐衷被泄露,却又不愿花工夫细看那些简短的集体数据收集协定;另一方面目前不足全球化对立的广告行业规范和法律标准框架,尤其是在广告业务的透明性以及获取用户批准方面。这就令广告主、App和第三方数据平台收集用户数据时并不通明。 那么怎么解决这一难题呢?由IAB欧洲和IAB技术实验室联结公布了TCF(Transparency and Consent Framework,透明度和批准框架),由IAB技术实验室负责管理技术规范。现在TCF曾经公布v2.0版本,要求App告知用户正在收集哪些数据、与之单干的广告主打算如何应用数据等,用户领有授予或回绝批准的权力,并行使其对所解决数据的“拥护权”。消费者还能够更好地管制供应商是否以及如何应用数据处理的某些性能,例如应用准确的地理位置,以便用户能够更好地理解集体数据在程序化广告投放时是如何被收集和应用的,从而达到更好的爱护用户隐衷和更标准的数据利用的目标。 简略来说,TCF v2.0一方面简化了程序化广告流程,广告主、App和第三方数据平台都能从中受害;另一方面,标准数据应用权限后,用户能够更好理解集体数据被谁以及如何应用。为了爱护用户隐衷,致力于打造凋谢、合规的广告生态,坚固广告业务的合规性,HUAWEI Ads平台已于2020年9月18日退出TCF v2.0的寰球供应商列表(GVL),供应商ID为856。 HUAWEI Ads平台不强制要求合作伙伴集成TCF v2.0。本文介绍HUAWEI Ads平台如何与曾经集成或者将要集成TCF v2.0的合作伙伴进行交互,因而不适用于不集成TCF v2.0的合作伙伴。如果媒体App不反对TCF v2.0,但仍然能够通过Consent SDK向HUAWEI Ads平台传递用户批准信息,详见征求用户意见。如果您要集成TCF v2.0,请参见下文中的信息,理解HUAWEI Ads平台将如何依据TCF v2.0的透明度和批准字符串(TC String)的内容对广告申请中蕴含的数据进行互操作。HUAWEI Ads平台会不定期更新这些信息。媒体App须要退出批准治理平台(以下简称CMP)或者注册CMP能力与HUAWEI Ads平台通过TCF v2.0进行单干,其余SSP/DSP以及三方剖析平台则须要注册成为供应商。 目标HUAWEI Ads平台在注册成为TCF v2.0供应商时所申明的目标与法律根底如下表所示。为了确保HUAWEI Ads平台可能顺利通过TCF v2.0与您单干,包含但不限于:在HUAWEI Ads平台对竞价申请进行出价、通过HUAWEI Ads平台向需求方发动竞价申请、应用三方剖析平台来跟踪和剖析广告成果。 请参见下方表格中HUAWEI Ads平台对不同目标批准后果的不同策略。 TC String的应用TC String蕴含了用户对各目标/个性的批准状况,HUAWEI Ads平台反对的TC String遵循IAB Europe公布的TC String格局。针对不同用户对各目标的批准状况,HUAWEI Ads平台将依据IAB Europe提供的TCF Policy的要求对数据进行相应的应用与限度。 • 如果您是反对TCF v2.0的媒体App开发者,您可通过HUAWEI Ads SDK中的setConsent(String consent)字段来向HUAWEI Ads平台传递TC String,详情请参见setConsent(String consent)示例代码如下所示: // 设置TCF v2.0用户批准信息字符串RequestOptions requestOptions = HwAds.getRequestOptions();requestOptions.toBuilder().setConsent("tcfString").build();• 如果您是反对TCF v2.0的SSP或Ad Exchange提供商,HUAWEI Ads平台可反对在广告/竞价申请中接管TC String,并依据TC String的批准状况解决用户集体数据。具体接口信息,请与您对接的HUAWEI Ads平台相干人员获取。 ...

October 24, 2022 · 1 min · jiezi

关于android:TheRouter-的跨模块依赖注入实现原理

TheRouter用于跨模块通信设计的ServiceProvider,外围设计思维是参考了SOA(面向服务架构)的设计形式。 具体到 Android 侧就是 AIDL 相似的实现。 模块化能力反对项: 反对跨模块依赖注入反对自定义注入项的创立规定,依赖注入可自定义参数反对自定义服务拦挡,单模块mock调试反对注入对象缓存,屡次注入 只会new一次对象1.0 依赖注入用于跨模块通信应用,外围设计思维是参考了SOA(面向服务架构) 的设计形式。具体到 Android 侧就是 AIDL 相似的实现: 例如以后有两个模块:A订单模块、B登录模块,下单须要获取用户信息。 这个业务场景就是,A须要应用获取用户信息的服务,B须要向外提供一个获取用户信息的服务。 1.1 申明接口服务首先申明一个接口,放入公共依赖层 // 假如以后有一个用户信息获取服务public interface IUserService { String getUserInfo();}1.2 服务应用方也就是下面例子的 A订单模块,他须要应用获取用户信息的服务A无需关怀,IUserService这个接口服务是谁提供的,他只须要晓得本人须要应用这样的一个服务就行了。 注:如果没有提供服务的提供方,TheRouter.get()可能返回null TheRouter.get(IUserService::class.java)?.getUserInfo()1.3 服务提供方服务提供方须要申明一个提供服务的办法,用@ServiceProvider注解标记。 如果是 java,必须是 public static 润饰如果是 kotlin,倡议写成 top level 的函数办法名不限/** * 办法名不限定,任意名字都行 * 返回值必须是服务接口名,如果是实现了服务的子类,须要加上returnType限定(例如上面代码) * 办法必须加上 public static 润饰,否则编译期就会报错 */@ServiceProviderpublic static IUserService test() { return new IUserService() { @Override public String getUserInfo() { return "返回用户信息"; } };}// 也能够间接返回对象,而后标注这个办法的服名是什么@ServiceProvider(returnType = IUserService.class)public static UserServiceImpl test() { xxx}2.0 自定义服务拦截器应用场景:单模块调试时,可能会有须要 mock 其余模块提供的服务,TheRouter 容许自定义其余模块的实现。 ...

October 24, 2022 · 1 min · jiezi

关于android:以开发之名斗罗大陆创造一个尽情探险的开放式游戏世界

2008年,《斗罗大陆》正式发行,成为了风行一时的长篇玄幻小说。小说讲述了穿梭到斗罗大陆的唐三如何一步步修炼武魂,由人修炼为神,最终根除了邪恶力量,成为了斗罗大陆最强者的故事。尔后数十年,《斗罗大陆》成为了一代人心目中宝贵的记忆。每个斗罗迷借由小说设想了一个属于本人的斗罗大陆,能够在外面组队修真、纵情探险,开发者王末也是这其中一员。 参加到《斗罗大陆:魂师对决》游戏开发时,王末形容本人“像刚穿梭到武魂世界的唐三,既兴奋又惶恐。”兴奋的是那些迷恋过的角色行将经由本人和团队的手,变成一个个饱满实在的人物,活在本人身边。惶恐的是,面对这个领有宏大受众的经典IP,如何满足泛滥斗罗迷心中神级的期待和空想呢?王末和团队的摸索才刚刚开始。 在三七游戏,王末的角色是一名资深客户端专家,挖掘当下用户爱好,一直地对游戏的画面和性能提出更高的要求,以满足用户的畅玩体验,是王末的日常工作,也是整个《斗罗大陆:魂师对决》我的项目团队的独特谋求。一款游戏的上架,须要对画面、人物角色进行深刻刻画,重视沉迷式的畅玩体验和晦涩的运行。这所有对于三七游戏来说,都是亟待解决的问题。开发团队尝试代入游戏思维,以游戏思维重构斗罗世界,还原人物个性,定义战斗法令。 开发过程中的难题就像“登上索托城大斗魂场一样频繁呈现”,游戏运行的是否晦涩,间接决定了玩家深度的畅玩体验,王末和团队唯有一直修炼武魂,他们对世面上支流的开发者服务工具进行了测试和评估,最终抉择接入HMS Core的能力,为本人减少魂环,晋升战斗力,集成了HMS Core 的Network Kit能力的《斗罗大陆:魂师对决》,下载速度晋升了40%。 在上线前的测试环节,经营团队须要全面把握游戏运行时呈现的各种BUG。《斗罗大陆:魂师对决》接入了AppGallery Connect能力,其提供的先锋测试,帮忙经营团队及时看到前端到后端的具体数据,以最快工夫修复问题,顺利保障天南海北的斗罗粉丝一起组队修真。 《斗罗大陆:魂师对决》开发团队 随着王末和团队一直打怪降级,开发中的难题一一被解决,这源于他们对于制作的高要求和细节的精准把控。在画面出现时,王末和团队逐个剖析了人物特点,心愿可能刻画还原出一个个实在鲜活的角色。借助HMS Core图形引擎服务Scene Kit ,《斗罗大陆:魂师对决》领有了实在、怯懦的千手修罗唐三、纯洁可恶的小舞,为玩家带来了更身临其境的气氛感,一个实在的斗罗大陆诞生了。 上线后的《斗罗大陆:魂师对决》,首日日活用户便创我的项目新高。截止目前,《斗罗大陆:魂师对决》在AppGallery 装置量超过了7000万次,有超过1.1万次评论,论坛发帖超过63万条,受到有数斗罗迷的青睐。 《斗罗大陆:魂师对决》游戏画面 过来条件匮乏,咱们的设想只能建设在形象的文字上,当初随着技术的提高,那些记忆里迷恋的角色和场景能够跃然屏上,期待咱们的摸索。从老成持重到年少自豪,唐三的修魂路也是人生的成长之路,每一个魂环都是他播种的成长力量,帮忙他一路前行,乘风破浪。对于包含王末在内的三七互娱开发团队三七游戏来说,HMS Core便是那个与他一起比肩成长的搭档,一路组队冒险,提供反对和补给,最终帮忙他实现幻想。这也正是HMS Core始终在做的,为更多开发者提供一个纵情探险的开放式世界,人人都能够是怯懦的唐三。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

October 20, 2022 · 1 min · jiezi

关于android:区服分析丨更透彻的游戏营运数据解读助力高效增长

全民买量时代,新服和新区继续增开,对玩家长线留存及付费晋升显得尤为重要。在剖析游戏流动成果和玩家营运数据时,置信大家都曾有过这样的疑难: 不同区服玩家的体现如何比照剖析? 怎么正当评估新开区服对玩家回流的继续吸引力? 高性价比的新服激励是否无效晋升了ARPU?…HMS Core剖析服务全新上线6.8.0版本,提供更多维度的游戏行业指标解读与埋点计划,反对区服剖析,满足开发者对游戏玩家更多深度洞察诉求。 一、开箱即用的埋点计划到外围指标的解读闭环,深度剖析游戏赛道的用户体现在游戏行业中,数据采集不全面、不足开掘能力等痛点是厂商自建数据中台始终难以解决的技术难题。为进一步满足更多细分游戏品类的精益经营诉求,HMS Core剖析服务在原有卡牌、MMO等细分游戏品类行业报告的根底上,新增通用游戏行业报告。提供残缺的游戏指标数据体系搭建,并配套对应的埋点模板和代码样例,帮忙开发者随时把握游戏的外围数据体现。 *图中数据为虚构 开发者可通过开箱即用的代码样例,灵便抉择代码复制、可视化埋点等快捷方式实现数据采集。当数据胜利上报后,游戏行业报告将出现付费剖析、玩家剖析、区服剖析等不同维度的指标看板,实现从埋点到数据解读的一站式闭环。 *通用游戏埋点模板 二、反对区服细分,进一步评估游戏内各服务器的玩家体现对游戏而言,新服的增开,除了缓解服务器压力的初衷以外,曾经缓缓变成了用户回流与付费晋升的重要利器。游戏内的生存与偏心、高性价比的工作激励等因素吸引着玩家一直滚服。 在这样的行业背景下,游戏的数据处理与剖析将变得更加简单,须要解决同一玩家在不同服务器内的串联行为。 *图中数据为虚构 在HMS Core剖析服务游戏行业报告的区服剖析模块中,反对对繁多服务器的游戏玩家依照纯新用户、回流用户、跨服用户三个维度开展剖析。例如,如果某一玩家近14天在其余服务器沉闷且跨服到以后服务器创立角色,那么在该服务器中,此玩家将被认定为跨服用户而不是纯新用户。 区服剖析共设有玩家剖析、付费剖析、LTV7剖析、留存剖析四个模块,帮忙开发者深度剖析不同服务器上的玩家体现。同时反对比照剖析,通过对不同服务器上的用户体现发展上述四个模块的比照评估,经营可更加迷信地做出增服和合服决策。 *图中数据为虚构 须要留神的是,区服剖析报告除依赖埋点计划中的事件外,须要额定上报用户属性cur_server和pre_server,您可参考上报用户属性开发阐明实现相干设置。 以上就是本次HMS Core剖析服务6.8.0版本中通用游戏行业报告的无关介绍,欲了解更多更新详情,可参阅官网文档指南。 欢送拜访华为剖析服务官网,收费体验Demo:华为剖析服务 | 一站式用户行为剖析平台 | Demo体验 。 获取开发领导文档:Android、iOS、Web、快利用、HarmonyOS 、微信小程序、快游戏。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

October 20, 2022 · 1 min · jiezi

关于android:分析服务用多维度多场景的用户分层带您深度玩转精细化游戏运营

作为游戏类App的用户经营,难免会遇到以下问题: 竞品竞争强烈,新用户获取老本很高,该如何无效挽回卸载用户和缄默用户?估算无限,该对哪些人群做流动能力取得较高的ROI呢?如何依据用户属性和用户行为划分用户价值层级,并精准触达呢?现在,昂扬的买量老本让游戏的吸量越发艰巨,存量用户的精细化经营成为必然趋势。 所以,辨认精准的用户进行多模式、多样化的利用内流动,对用户的留存与付费晋升显得尤为重要。 HMS Core剖析服务与联运流动强强联合,助您疾速实现存量用户的精细化经营。 1. 受众灵便圈选,多维细分,贴合场景HMS Core剖析服务能够通过用户偏好、用户属性、用户行为以及AI预测模型来实现不同维度的玩家分层,满足精益经营各类场景诉求。 例如,在付费晋升场景下,能够通过游戏生产志愿标签,按需抉择志愿高、较高、中等这些维度,并同时从这部分人群中过滤非沉闷玩家,这样即可实现该游戏内生产志愿高的沉闷用户分层。 2. 联运流动精准触达,实现用户召回与付费晋升针对不沉闷用户,HMS Core剖析服务通过玩家数据以及设施应用数据进行AI剖析,对于已卸载/散失的用户,游戏内的音讯已屏蔽无奈触达,可将这部分人群圈选,创立专属的用户券流动,通过利用市场的Push音讯推送,吸引用户再次下载利用并产生付费行为。 3. 玩家付费志愿分层,继续晋升ARPU针对沉闷用户,HMS Core剖析服务通过玩家数据以及设施应用数据进行AI剖析,预测用户付费和复购概率,筛选出高/较高/中付费志愿用户且周活跃度较高人群,发放优惠券,促成沉闷玩家应用优惠券付费转化,晋升ARPU。 4. HMS Core剖析服务&联运流动 精益经营案例(1) 在某卡牌类手游中,开发者冀望无效召回有付费能力的已卸载用户,HMS Core剖析服务圈选了卸载14天以上且累计付费超过30元的用户作为指标人群。通过利用市场Push触达4k+已卸载用户并发放礼包,召回800+且500+用户再次产生了付费行为。 (2) 在某塔防类手游中,开发者冀望针对缄默工夫较长的用户进行唤醒并晋升沉闷,HMS Core剖析服务圈选了缄默天数3-120天的用户作为指标人群。通过优惠券和礼包触达缄默用户3.5w人,召回缄默用户4k+人,3成多的缄默用户产生了付费行为,总流水超过百万RMB。 (3) 在某古代策略类手游中,开发者冀望对游戏付费志愿人群精准营销晋升付费率及ARPU,HMS Core剖析服务圈选了游戏付费志愿高、较高、中且缄默天数小于7天的用户作为指标人群。通过优惠券和礼包刺激用户付费率晋升靠近3%,ARPU晋升靠近18%。 理解更多详情>> 拜访华为开发者联盟官网 获取开发领导文档 华为挪动服务开源仓库地址:GitHub、Gitee 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

October 19, 2022 · 1 min · jiezi

关于android:滴滴开源的APM方案Dokit接入

一、简介DoKit是一款面向泛前端产品研发全生命周期的效率平台,目前反对诸如Android、 iOS、小程序、Flutter和Web等多个平台。并且,随着dokit.cn平台端的推出,也标记着DoKit曾经从单纯的效率工具正式进入了效率工具平台的阶段。与此同时,DoKit还在一直的更新,以提供更多的实用功能。 目前,Dokit提供的性能有: 平台工具(www.dokit.cn)【数据Mock】 App接口Mock解决方案,提供一套基于App网络拦挡的接口Mock计划,无需批改代码即可实现对于接口数据的Mock。【衰弱体检】 一键式操作,整合DoKit多项工具,数据可视化,疾速精确定位问题,让你对app的性能一目了然。【文件同步助手】 通过终端服务,让你的终端空间在平台端残缺的展示并提供弱小的文件以及数据库操作能力。【一机多控】 主从同步,开释人力,让研发测试效率晋升看得见常用工具【App 信息查看】 疾速查看手机信息,App 根底信息、签名相干、权限信息的渠道,防止去手机设置查找或者查看我的项目源代码的麻烦;【开发者选项 Android特有】 一键跳转开发者选项,防止安卓因为平台差别导致的入口不统一【本地语言】 一键跳转本地语言,防止安卓因为平台差别导致的入口不统一【沙盒浏览】 App 外部文件浏览的性能,反对删除和预览, 并且能通过 AirDrop 或者其余分享形式上传到 PC 中,进行更加粗疏的操作;【MockGPS】 App 能定位到全国各地,反对地图位置和手动输出经纬度;【H5任意门】 开发测试同学能够疾速输出 H5 页面地址,查看该页面成果;【Crash查看】 不便本地打印出呈现 Crash 的堆栈;【子线程UI】 疾速定位哪一些 UI 操作在非主线程中进行渲染,防止不必要的问题;(iOS独有)【革除本地数据】 一键删除沙盒中所有数据;【NSLog】 把所有 NSLog 信息打印到UI界面,防止没有开发证书无奈调试的难堪;【Lumberjack】 每一条 CocoaLumberjack 的日志信息,都在在 App 的界面中显示进去,再也不须要导出日志这么麻烦;(iOS独有)【DBView】 通过网页方便快捷的操作利用内数据库,让数据库的调试变得十分优雅;【模仿弱网】 限度网速,模仿弱网环境下App的运行状况;(android独有)【JS脚本】 在指定WebView运行JS脚本。(iOS独有)性能检测【帧率】 App 帧率信息提供波形图查看性能,让帧率监控的趋势更加显著;【CPU】 App CPU 使用率信息提供波形图查看性能,让 CPU 监控的趋势更加形象;【内存】 App 内存使用量信息提供波形图查看性能,让内存监控的趋势更加显明;【流量监控】 拦挡 App 外部流量信息,提供波形图展现、流量概要展现、流量列表展现、流量筛选、流量详情,对流量信息对立拦挡,成为咱们 App 中自带的 "Charles";【卡顿】 锁定 App 呈现卡顿的时刻,打印出对应的代码调用堆栈;【大图检测】 通过流量监测,找出所有的大小超标的图片,防止下载大图造成的流量节约和渲染大图带来的CPU耗费。【启动耗时】 无侵入的统计出App启动过程的总共耗时;【UI层级查看】 查看出每一个页面中层级最深的元素;【函数耗时】 从函数级别剖析app性能瓶颈;【Load】 找出所有的Load办法,并给出耗时剖析;(iOS独有)【内存透露】 找出App中所有的内存透露的问题。视觉工具【色彩吸管】 不便设计师 UI 捉虫的时候,查看每一个组件的色彩值是否设置正确;【组件查看】 能够抓取任意一个UI控件,查看它们的详细信息,包含控件名称、控件地位、背景色、字体色彩、字体大小;【对齐标尺】 参考 Android 零碎自带测试工具,可能实时捕捉屏幕坐标,并且能够查看组件是否对齐;【元素边框线】 绘制出每一个 UI 组件的边框,对于组件布局有肯定的参考意义。Weex专项工具(CML专项工具)【console日志查看】 不便在端上查看每一个Weex文件中的console日志,提供分级和搜寻性能;【storage缓存查看】 将Weex中的storage模块的本地缓存数据可视化展现;【容器信息】 查看每一个关上的Weex页面的根本信息和性能数据;【DevTool】 疾速开启Weex DevTool的扫码入口。 ...

October 18, 2022 · 4 min · jiezi

关于android:请求投放个性化广告时如何征得用户同意

过来,App里各种弹窗和贴片广告不仅令用户心烦,广告主们也头疼。一方面,广撒网的广告老本较高;另一方面,这些广告不能精准触达须要的用户。直到个性化广告的呈现,才解决了这一痛点。 现在媒体广告主们为了更精准地投放广告,通常会收集用户集体数据来判断他们的特色定位、兴趣爱好或近期需要等,而后在App里进行定向的广告推送。基于有些用户不违心共享隐衷数据来接管个性化广告,所以App出于实现个性化广告的目标须要收集、应用和共享用户的集体数据,须先取得用户的无效批准。 HUAWEI Ads提供了征求用户意见能力,在一些隐衷比拟严格的地区,倡议公布商通过HUAWEI Ads SDK接入个性化广告服务,将收集和应用用户的集体数据与HUAWEI Ads共享,HUAWEI Ads有权对媒体广告主们的隐衷和数据合规性进行监督。默认状况下,向HUAWEI Ads平台收回的广告申请会投放个性化广告,并依据以前收集的用户数据筛选广告。HUAWEI Ads平台也反对通过配置广告申请来投放非个性化广告。详情请参见《HUAWEI Ads隐衷与数据安全相干政策》“个性化广告和非个性化广告”。 为了征求用户意见,能够应用HUAWEI Ads平台提供的Consent SDK,也能够应用合乎IAB TCF v2.0标准的CMP,详情请参见IAB TCF v2.0用户批准信息传递。 接下来咱们就看一下如何应用Consent SDK征求用户意见,以及在征得用户意见后如何依据用户意见获取广告。 开发步骤在开发前须要集成HMS Core SDK和HUAWEI Ads SDK,具体步骤可参考开发文档。 Consent SDK应用集成Consent SDK。a. 配置Maven仓地址。 Android Studio的代码库配置在Gradle 插件7.0以下版本、7.0版本和7.1及以上版本有所不同。请依据您以后的Gradle 插件版本,抉择对应的配置过程。 b. 在利用级的“build.gradle”文件中增加编译依赖。 将{version}替换为理论的版本号,版本号索引请参见版本更新阐明,批改如下: dependencies { implementation 'com.huawei.hms:ads-consent:3.4.54.300'}c. 在实现以上的配置后,点击工具栏中的gradle同步图标,实现“build.gradle”文件的同步,将相干依赖下载到本地。 更新用户意见状态。应用Consent SDK时,应确保Consent SDK取得的是HUAWEI Ads平台广告技术提供商的最新信息。如果在征求用户意见后,广告技术提供商的列表产生扭转,则Consent SDK会主动将用户意见置为未知状态。因而在每次启动利用时都必须通过调用requestConsentUpdate()办法确定用户意见状态。示例代码如下所示: ...import com.huawei.hms.ads.consent.*;...public class ConsentActivity extends BaseActivity { ... @Override protected void onCreate(Bundle savedInstanceState) { ... // 检查用户意见状态 checkConsentStatus(); ... } ... private void checkConsentStatus() { ... Consent consentInfo = Consent.getInstance(this); ... consentInfo.requestConsentUpdate(new ConsentUpdateListener() { @Override public void onSuccess(ConsentStatus consentStatus, boolean isNeedConsent, List<AdProvider> adProviders) { // 获取用户意见状态胜利 ... } @Override public void onFail(String errorDescription) { // 获取用户意见状态失败 ... } }); ... } ...}如果胜利更新用户意见信息,那么会通过ConsentUpdateListener的onSuccess()办法提供更新后的用户意见状态参数ConsentStatus、isNeedConsent参数(是否须要consent)和广告技术提供商的adProviders列表。 ...

October 17, 2022 · 2 min · jiezi

关于android:赞Android-Studio-Logcat-大升级

前言最近,看到了「Android开发者」公众号的公布了最新 Android Studio Dolphin 的文章,果决开启了降级最新 Android Studio 之路。 降级当前的对 Compose 和 Wear OS 模块的反对咱们不肯定用的着,然而新日志零碎,必定用的着。 一起来感受一下新的日志零碎的变动吧! 一. 款式零碎新日志款式和之前的外观款式区别还挺大: 比照一下之前的日志,外观次要有如下改变: 标签名辨别更加显著不同等级的日志辨别也更加显著展现的内容品种也更多二. 查问语法新的 Logcat 应用了新的查问零碎,语法如此: <img src="https://tva1.sinaimg.cn/large/008vxvgGgy1h77gnp9125j30x60ksac6.jpg" alt="语法" style="zoom:50%;" /> 看着像好几个,其实也就三个,别离是: package: 包名tag:跟日志的 tag 名无关level:日志等级,这个应该不必我介绍了比方上面这样: package:mine 代表首先选中本地利用我的项目的过程Id的日志,接着选中日志等级 VERBOSE 的日志,最初选中 tag 名为 MMKV 的日志。 当你输出 tag,提醒你像这样: 别离是这样的: tag:一般的塞选,能够应用多个-tag:反向抉择,排除某个值tag~:反对正则表达式抉择tag-tag~:tag~反向用法查问栏还有两个按钮,别离是历史记录查问和珍藏: 历史记录按钮用来查看历史查问记录,珍藏按钮用来珍藏以后查问语句。 三. 两个按钮右边多了几个按钮,红色框中的: 两个都是跟展示款式相干的按钮。 下面的一个叫做 Soft-wrap 按钮,点击了当前左边的日志内容只会展现在一行内,不会换行。 上面个能够管制日志面板中的展现信息,之前咱们始终应用 Standard View 模式,看一下 Compact View 模式: 跟本文中第一张图比拟一下,你就晓得 Compact View 模式更加精简。 最初还有一个 Modify Views 按钮,就是自定义展现内容,能够管制工夫戳、过程ID、Tag内容和包名的展现: ...

October 17, 2022 · 1 min · jiezi

关于android:Flutter中的异步方式

前言最近用 Flutter 写了一段时间的业务代码,遇到了很多之前写简略代码没遇到的问题,比如说: 如何应用 Flutter 调原生如何抉择状态治理和事件治理如何画出本人想要的View... 下面中的很多场景,都会波及到异步常识。 咱们在写 Flutter 的时候,也会须要异步解决问题,比如说文件解决、网络申请、加载图片等。 一、Flutter中的异步机制isolate 这个词对于 Flutter 老手来说可能有些生疏,它其实是 Dart 中的线程机制。 1. 单线程模型Dart 是一种基于单线程模型的语言,它的线程模型是这样的: 正如下面图中所示意的那样。先看右边,每个 isolate 保护着一个事件循环,事件循环由两个队列组成: microtask queue:只解决以后 isolate 中的工作,优先级高event queue:相应点击事件、IO事件、网络事件等的工作队列,优先级低从左边的图中,咱们能够看出,isolate 会先执行 microtask queue 中的工作,之后才会解决 event queue 中的工作,没有工作当前,isolate 才会完结。 2. main isolate每个利用都由 1 个 main isolate 和 0 - 多个 work isolate 组成,main isolate 跟 Android 中的主线程一样,会处于有限循环的状态: main(), responds to events, and then exits" title="A figure showing a main isolate, which runs main(), responds to events, and then exits"> ...

October 17, 2022 · 3 min · jiezi

关于android:Unity应用在手机息屏或切入后台时与正常运行之间的区别

1)Unity利用在手机息屏或切入后盾时与失常运行之前的区别2)PSD转Prefab计划的流程3)HUD UI的资源加载问题4)2021.3 Android从AssetBundle中加载视频播放失败问题 这是第310篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) AndroidQ:想求教一下各位,Unity利用在手机息屏或者切入后盾时与失常运行之间有哪些区别?除了不须要渲染,是否会降帧运行呢?网络通讯会受影响吗?有没有可能在编辑器上模仿这种息屏或者切后盾的成果? A1:在Android中,Unity是作为Activity运行的,在息屏或者切入后盾后,Activity会被暂停。Unity会顺次收到OnApplicationPause和OnApplicationFocus这两个事件。 网络通讯必定是会受到影响的,在模仿上能够复现这种状况。 感激萧小俊@UWA问答社区提供了答复 A2:iOS是假后盾,渲染会暂定,网络会提早一段时间后断开,必须有断线重连机制。 当初Android零碎,如果发现APP占用内存大、耗能较高,也会被kill掉,倡议监听进入后盾事件,进行相应的同步解决,不便后盾拉起到前台持续游戏。 感激郑骁@UWA问答社区提供了答复 UIQ:找到了一个PSD转Prefab开源的插件:https://github.com/zs9024/qui... 该计划的思路:1. 应用PS的内置脚本导出PS中的图片、文字为一份配置文件(须要命名标准)。2. 应用Unity编辑器解析配置文件,生成UGUI。 问题:如果以PSD作为Prefab的源文件,原则上就不能手动批改Prefab了,所有改变都必须通过批改PSD来实现,那么PSD的标准就须要反对Unity的所有组件。如果大型项目组件很多,感觉不太事实。 如果PSD不作为源文件,前端能够进行Prefab的批改,然而后续有任何改变都不能再应用该工具导出。游戏开发如果是先用长期界面实现开发的,这种状况下工具简直就齐全用不上。 想求教有教训的同学,下面的状况怎么解决能力使该流程通顺? A1:咱们之前个别只有做新性能的时候,才会用PSD2UGUI。因为动效、性能、遮罩等因素,Prefab是不能间接应用的,须要做UI的人进行独自调整。之后个别小的改变就间接在Prefab上改了,毕竟再走一遍流程还是比拟节约效率的。 其实能够看一下FairyGUI,而后美术工程全副交由美术治理,效率上会高一点。 感激萧小俊@UWA问答社区提供了答复 A2:现实是美妙的。当初PSD转NGUI、UGUI、FGUI的办法都大同小异,解析PSD文件中的节点,生成对应UI框架的配置文件,例如Prefab、XML等。题主的想法挺好,然而实现老本较高。 第一点,个别美术来制作PSD,如果作为UI源文件,就须要PSD反对自定义属性,其实就是在PS里写插件来做一些自定义性能,或者在图素命名的时候,就要标准功能性的内容,不便后续解析。也要依据图层来组织UI的构造,这对UI美术来说老本极高。 第二点,做一套Livelink机制,PS批改后实时刷新Prefab。后续需要来了,也要刷新Prefab实例化之后的GameObject。 第三点,PSD2UI做完了,如果进行微调,必定在引擎里最不便,转身找美术从PS开始流程有点繁琐了,是不是还要做一套UI2PSD? 第四点,总会有一些只能在引擎里表白的节点在PS里无奈表白,这一部分二次开发量也不小。 整体算下来,这一套工具链从制作到落地,再到前期保护,有点得失相当。 感激郑骁@UWA问答社区提供了答复 AssetBundleQ:想请问一下HUD UI的资源加载问题是怎么解决的,我当初用的URP管线,AssetBundle包的模式,性能曾经实现了,然而打AssetBundle资源当前加载进去显示不正确,我想请问下这个有没有什么解决方案? A1:Shader失落?先判断Resouce模式加载是否失常,Editor中用AssetBundle加载是否失常,不过大概率是Shader没打进包内。感激[email protected]问答社区提供了答复 A2:可能起因:Shader变体失落,未打进AssetBundle里。打包时Shader和UI未进行依赖关系绑定。加载时,依赖的Shader未Load。感激郑骁@UWA问答社区提供了答复 VideoQ:在Unity 2021.3版本下,Android从AssetBundle中加载视频播放 AndroidVideoMedia::OpenExtractor could not translate archive 1. 应用的版本是Unity 2021.3.82. 在打包视频的时候设置了不压缩3. AssetBundle放在StreamingAssets目录下4. 相干代码 btn.onClick.AddListener(() => { AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/assetbundle/videos"+ "/1109.ab"); Debug.Log(ab == null); videoPlayer.clip = ab.LoadAsset<VideoClip>("1109"); videoPlayer.Play(); });///build BuildPipeline.BuildAssetBundles(config.OutPath, BuildAssetBundleOptions.UncompressedAssetBundle, config.buildTarget);呈现的问题:在Android 9.0以下手机加载视频播放不了,日志: ...

October 14, 2022 · 1 min · jiezi

关于android:JNI之常见技巧与陷阱

预报后续可能会推更一个FFmpeg系列的入门博客,大略波及到FFmpeg解封装、FFmpeg编解码、FFmpeg进行音频重采样、应用FFMpeg将mp3转码成aac、应用FFmpeg合并拼接音视频等。 另外如果有工夫可能也会更新几篇对于ffplay的文章,敬请关注。 本文将作为JNI系列的一个结尾,上面是笔者在学习应用JNI的所记录的一些笔记与技巧。 JNIEnv的线程限度一个JNIEnv指针仅在其相关联的线程中无效。你不能将这个指针从一个线程中传递给另一个线程,或者在多线程中缓存和应用它。Java虚拟机在同一个线程的间断调用中传递给本地办法雷同的JNIEnv指针,然而从不同线程中调用本地办法时传递的是不同的JNIEnv指针。该当防止缓存一个线程的JNIEnv指针并在另一个线程中应用指针的常见谬误。 本地援用(部分援用)仅在创立它的线程中无效。你不能将本地援用从一个线程中传递到另一个线程。每当有多个线程可能应用雷同援用的可能性时,应始终将本地援用转换为全局援用。 JNIEnv是用作线程部分存储。因而,使用者不能在多线程间共享一个JNIEnv变量。如果在一段代码中没有其它方法取得它的JNIEnv,使用者能够共享JavaVM对象,应用GetEnv来获得该线程下的JNIEnv。 如果你应用AttachCurrentThread连贯(attach)了Native过程,正在运行的代码在线程拆散(detach)之前绝不会主动开释部分援用。使用者创立的任何部分援用必须手动删除。通常,任何在循环中创立部分援用的Native代码可能都须要做一些手动删除。 全局获取JNIEnv一个JNIEnv指针仅在与其相关联的线程中无效。对于本地办法,这通常不是问题,因为他们从虚拟机承受JNIEnv指针作为第一个参数。然而有时候可能不须要间接从虚拟机调用的本地代码来获取属于以后线程的JNIEnv接口指针。例如通过JNI在Native开启了一个子线程解决某些工作,在这些工作处理完毕后须要将处理结果回调给java层。这种状况能够通过缓存JavaVM获取以后线程的JNIEnv而后进行java办法的回调。 当System加载一个本地库时,虚构机会在本地库中查找下述的导出的程序入口: JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved);此时咱们能够将JavaVM缓存下来,供当前获取JNIEnv应用。 上面是在任何地位获取JNIEnv的例子: JavaVM *globalJVM = nullptr;JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) { globalJVM = jvm; return JNI_VERSION_1_6;}JNIEnv *getCurrentEnv(int *attach) { if (globalJVM == nullptr) return nullptr; *attach = 0; JNIEnv *jni_env = nullptr; int result = globalJVM->GetEnv((void **) &jni_env, JNI_VERSION_1_6); if (result == JNI_EDETACHED || jni_env == nullptr) { result = globalJVM->AttachCurrentThread(&jni_env, nullptr); if (result < 0) { jni_env = nullptr; } else { *attach = 1; } } return jni_env;}不要混同ID和援用JNI将对象作为援用。类,字符串和数组是非凡类型的援用。JNI将办法和字段作为ID。一个ID不是一个参考。不要将类援用称为“类ID”,也不要将办法ID称为“办法援用”。 ...

October 12, 2022 · 2 min · jiezi

关于android:JNI之缓存与引用

导读在后面《JNI之拜访java属性和办法》 一文中咱们介绍了在JNI办法中拜访java类对象的属性和办法,试想一下如果每次调用JNI办法都通过查找类,查找办法id,最初实现调用,这里是否有性能问题呢?而且FindClass/GetMethodID/GetFieldID这些函数自身就含有一些性能问题,既然如此,那是否将FindClass/GetMethodID/GetFieldID这些函数的调用后果缓存起来,下次再进入时间接应用缓存即可呢?必定是能够的。 JNI援用类型在JNI中蕴含三种援用类型,它们别离是全局援用、部分援用和弱全局援用。 1、部分援用部分援用又称为本地援用,部分援用会在函数完结时主动开释,例如函数FindClass返回的就是一个部分援用。须要留神的是部分援用的个数是无限的,个别是512个,所以部分援用能手动开释的尽早手动进行开释,特地是在一些循环体内,应用结束马上进行开释,否则很可能会超出部分援用个数的限度。 同时部分援用还会阻止对象被回收,也就是影响GC,所以更应该在不须要时尽早进行开释,通过函数DeleteLocalRef能够开释部分援用。 不能在本地办法中通过动态变量来贮存本地援用,并在后续调用中应用雷同的援用,因为本地援用是会被主动开释的。 部分援用仅仅在创立它的线程中是无效的。在线程A中被创立的部分援用是不可能在线程B中被应用的。千万不要将一个部分援用保留在全局变量中给其余线程应用。 如果你应用AttachCurrentThread连贯(attach)了Native过程,正在运行的代码在线程拆散(detach)之前绝不会主动开释部分援用。使用者创立的任何部分援用必须手动删除。 2、全局援用全局援用不会在函数完结时主动开释,如果没有开释则会在程序运行期间始终保留,所以特地适宜用来做一些缓存的操作。 不同于部分援用,全局援用是能够跨线程应用的,只有它不被程序员手动开释就会始终无效。 通过函数NewGlobalRef能够创立一个全局援用,当你的本地代码不再须要拜访一个全局援用时,你应该调用DeleteGlobalRef办法。如果你遗记调用这个函数,虚拟机将无奈通过垃圾收集器回收相应的对象,即便这个对象再也不会在零碎的其余中央中应用。 留神jfieldID和jmethodID是映射类型(opaque types),不是对象援用,不应该被传入到NewGlobalRef。原始数据指针,像GetStringUTFChars和GetByteArrayElements的返回值,也都不是对象(它们可能在线程间传递,并且在调用对应的Release函数之前都是无效的)。3、弱全局援用弱全局援用不像部分援用哪样在函数完结时主动开释,也不像全局援用哪有始终保留在内存中,弱全局援用在GC的时候是可能会被垃圾回收的,因而每次在应用弱全局援用之前都须要进行判空解决。能够通过函数IsSameObject与NULL比照判断以后弱全局援用是否还无效。绝不要在Native代码中用==符号来比拟两个援用。 通过函数NewWeakGlobalRef能够创立一个弱全局援用,当你的本地代码不再须要拜访一个弱全局援用时,你应该调用DeleteWeakGlobalRef函数开释掉弱全局援用。如果你遗记调用这个函数,Java虚拟机依然可能通过垃圾收集器收集底层对象,然而将无奈回收该弱全局援用对象占用的内存。 缓存策略通过下面JNI三种援用的介绍咱们晓得,如果须要做缓存的话,应用全局援用就特地适宜了。 平时咱们在做缓存策略的时候个别会面临着两种抉择,一种是相似懒加载式的缓存策略,就是在第一次调用时如果为空则进行缓存;另外一种是在动态代码块中进行缓存。那么这两种缓存策略又什么区别呢,孰优孰劣呢? 针对第一次应用时缓存判空缓存策略须要在每一次应用时对相干资源进行判空校验,且可能在多线程应用情况下产生线程平安的问题;而且这种策略仅仅在类没有被卸载的时候是无效的,开发者必须保障在你的代码还依赖你所缓存的这些ID的过程中,你所应用的类没有被卸载或者从新加载。 应用类动态初始化式缓存策略,被缓存的资源在类被卸载并从新加载时候会被主动从新计算,并且在多线程状况下不会有线程平安的问题。因而倡议应用类的动态初始化代码段中计算并缓存属性或者办法ID等相干资源。 以下是一个应用类动态代码块缓存属性ID的一个简略demo: MainActivity.java public class MainActivity extends AppCompatActivity { static { System.loadLibrary("jnitest"); } private int age = 16; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = findViewById(R.id.sample_text); textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { age++; Person person = new Person(age); person.changeAge(); person.printAge(); } }); }}Person.java public class Person { private int age; Person(int age){ this.age = age; } public void printAge(){ Log.v("Person_Tag","age:" + age); } static { initIDs(); } // 初始化缓存id private native static void initIDs(); // 通过JNI批改年龄 public native void changeAge();}native-lib.cpp ...

October 12, 2022 · 1 min · jiezi

关于android:JNI访问属性和方法

导读在《JNI之动静注册与动态注册》 一文中,咱们介绍了JNI函数动静注册的同时也介绍了JNI中的属性描述符和函数描述符。对这两个概念还不相熟的童鞋们须要再复习一下。在明天的文章中咱们次要介绍在JNI中如何拜访java层对象的属性以及调用java层对象的成员办法等相干常识。 拜访java成员属性1、拜访一般属性在JNI拜访java类属性分为两个步骤,首先是通过FindClass函数找到对应的类,而后通过GetFieldID找到对应的属性,如果须要批改变量的话则通过一系列的SetTypeField函数进行批改即可. 上面的例子通过JNI的形式拜访了java类Person的name属性并作出批改: Person.javapublic class Person { private static int defaultAge = 18; private int age; private String name; Person(int age,String name){ this.age = age; this.name = name; } public void printName(){ Log.v("PersonTag","my name is:" + name); } public static void printDefaultAge(){ Log.v("PersonTag","default age is:" + defaultAge); } // 拜访名字属性 public native void changeName(); // 拜访动态属性 public native void accessStatic(); // 通过JNI调用java的办法 public native void printNameByJNI(); // 拜访静态方法 public native static void callStaticFunc(); // JNI调用构造方法,生成对象 public native static Person createPersonByJNI();}MainActivity.javapublic class MainActivity extends AppCompatActivity { static { System.loadLibrary("jnitest"); } private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater()); Person person = new Person(20,"jack"); person.changeName(); person.printName(); }}native-lib.cppextern "C"JNIEXPORT void JNICALLJava_com_fly_jnitest_Person_changeName(JNIEnv *env, jobject thiz) { // 获取对应的类 jclass jclazz = env->FindClass("com/fly/jnitest/Person"); // 获取属性,第三个参数是属性描述符 jfieldID nameFielid = env->GetFieldID(jclazz,"name","Ljava/lang/String;"); // 批改成员属性 env->SetObjectField(thiz,nameFielid,env->NewStringUTF("james"));}2、拜访动态属性拜访动态属性和拜访一般属性的流程是一样的,只不过获取的动态属性的函数变成了GetStaticFieldID,还是以下面的代码作为例子,咱们通过JNI的形式拜访Person类的动态属性defaultAge并作出批改: ...

October 12, 2022 · 2 min · jiezi

关于android:JNI静态注册与动态注册

导读咱们晓得通过Java通过JNI能够调用C/C++代码,C/C++也能够通过JNI调用java代码,那么JNI是怎么将Java办法与Native的办法对应起来的呢? JVM查找Native办法有两种形式: 1、依照JNI标准的命名规定进行查找,这种形式叫动态注册。 2、调用JNI提供的RegisterNatives函数,将本地函数注册到JVM中,这种形式叫动静注册。 动态注册所谓动态注册就是依照JNI标准书写函数名: java_类门路_办法名(门路用下划线分隔)当咱们应用Android Studio新建一个Native工程时默认生成的JNI函数就是动态注册的,例如上面就是一个动态注册的简略例子: extern "C" JNIEXPORT jstring JNICALLJava_com_fly_jnitest_MainActivity_stringFromJNI( JNIEnv* env, jobject obj) { std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str());}动态注册的形式是零碎的默认形式,应用简略,然而灵活性比拟差,如果批改了Java中的Native函数所在类的包名或类名,则须要同时批改C/C++函数名称(头文件、源文件等)。 属性描述符与函数描述符在理解动静注册之前,咱们先来理解JNI中的属性描述符和函数签名的概念。 JNI属性描述符也就是变量类型在JNI中的示意形式,它是由属性的申明类型决定的。例如应用"I"示意int属性,应用"F"示意float属性,应用"D"示意double属性,应用"Z"示意boolean属性等。 对于援用各类型属性的描述符,比方java.lang.String,须要以字母"L"结尾, 解析来是JNI类描述符并应用一个分号完结,Java中残缺类名中的"."被"/"替换掉了。因而,对于java.lang.String类型须要应用以下模式的属性描述符:Ljava/lang/String;。 数组类型的描述符由"["以及数组元素类型的描述符组成,例如,[I示意整型数组的属性描述符,以此类推。 咱们能够应用javap工具从class文件生成属性描述符。 与属性描述符相似,函数也有函数描述符,通常咱们又称为函数签名,一个函数描述符由他的参数类型和返回值类型组成,参数类型在前,且应用一对括号括起来,参数类型是以他们在函数申明中的程序列举的,多个参数类型之间是没有分隔符,如果一个办法没有参数,应用一对空的括号示意即可。函数的返回值类型紧跟在包裹参数类型的右括号后边。 例如(I)V代指接管一个整型参数且返回值为空的函数。()D代指的是没有输出参数,返回值是一个double类型的函数。 留神:不要被C函数中像"int f(void)"这样的函数原型误导,误认为"(V)I"是它的办法描述符,其实"()I"才函数f的函数描述符。 动静注册在库加载时会主动调用JNI_OnLoad()函数,开发者常常会JNI_OnLoad()函数做一些初始化操作,动静注册就是在这里进行的。调用API是env->RegisterNatives(clazz, gMethods, numMethods)。 env->RegisterNatives(clazz, gMethods, numMethods)是一个承受三个参数的函数,第一个参数是Java对应的类,第二个参数是JNINativeMethod数组,第三个参数是JNINativeMethod数组的长度,也就是须要注册的办法的个数。其中JNINativeMethod示意的是办法办法的映射关系,它包含Java中的办法名,对应的办法签名和Native映射的函数办法三个信息。 相比动态注册,动静注册的灵活性更高,如果批改了java native函数所在类的包名或类名,仅调整Java native函数的签名信息即可。 以下展现了一个动静注册的例子: // 前两个参数还是固定的jstring stringFromJNI(JNIEnv *jniEnv,jobject jobj){ return jniEnv->NewStringUTF("hello from C++ string");}static const JNINativeMethod nativeMethod[] = { // Java中的函数名 {"stringFromJNI", // 函数签名信息 "()Ljava/lang/String;", // native的函数指针 (void *) (stringFromJNI)},};// 类库加载时主动调用JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reversed){ JNIEnv *env = NULL; // 初始化JNIEnv if(vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK){ return JNI_FALSE; } // 找到须要动静动静注册的Jni类 jclass jniClass = env->FindClass("com/fly/jnitest/MainActivity"); if(nullptr == jniClass){ return JNI_FALSE; } // 动静注册 env->RegisterNatives(jniClass,nativeMethod,sizeof(nativeMethod)/sizeof(JNINativeMethod)); // 返回JNI应用的版本 return JNI_VERSION_1_6;}相比于动态注册,动静注册不用在每次运行调用Native办法都去进行办法查找,所以相对来说动静注册的性能更高一些。 ...

October 12, 2022 · 1 min · jiezi

关于android:JNI之数组与字符串的使用

字符串和数组是JNI中常见的援用数据类型,本文将介绍符串和数组在JNI中的常见解决形式。 JNI中字符串的解决1、Java字符串与原生字符串转换 当从java层传递一个字符串过去之后,它的类型是jstring,同样如果须要返回一个字符串给java层,它的类型也是jstring。jstring代表着Java虚拟机中的一个字符串,并且不同于C++语言的string类型。 如果原生代码须要解决jstring,须要通过JNIEnv将其转换为原生字符串才能够应用。通过JNI函数GetStringUTFChars来读取这个字符串中的内容,GetStringUTFChars函数能够通过JNIEnv接口指针调用,它将一个代表着Java虚拟机中的字符串jstring援用,转换成为一个UTF-8模式的C字符串。 当原生代码应用完了通过GetStringUTFChars获取的原生字符串后应该应用ReleaseStringUTFChars开释它。调用ReleaseStringUTFChars标识着原生代码不再须要应用从GetStringUTFChars获取的UTF-8字符串了,这个UTF-8字符串所占用的空间就能够被开释了。如果不调用ReleaseStringUTFChars开释原生字符串的话将会导致内存泄露。 咱们看下函数GetStringUTFChars的原型是: const char GetStringUTFChars(jstring string, jboolean isCopy)在这里第三个参数示意如果返回的字符串是原来的java.lang.String的一份拷贝,则在函数GetStringUTFChars返回之后,isCopy指向的内存地址将会被设置为JNI_TRUE。而如果返回的字符串指针间接指向原来的java.lang.String对象,则该地址会被设置为JNI_FALSE.如果返回了JNI_FALSE, 则原生代码将不能扭转返回的字符串,因为扭转了这个字符串,原来的java字符串也会被批改,这违反了java.lang.String实例不可扭转的准则。通常你能够间接传递NULL给isCopy来通知Java虚拟机你不在乎返回的字符串是否指向原来Java的String对象。 如果须要将C/C++的字符串返回给Java层,则须要通过函数NewStringUTF生成jstring返回。 例如上面的例子展现了在Native层获取java层字符串,并批改返回给java层的一个例子: public class MainActivity extends AppCompatActivity { static { System.loadLibrary("jnitest"); } private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); TextView tv = binding.sampleText; try { // 尽量确保传递进去的是utf-8字符串 tv.setText(sayHello(new String("James".getBytes(),"utf-8"))); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } public native String sayHello(String name);}extern "C"JNIEXPORT jstring JNICALLJava_com_fly_jnitest_MainActivity_sayHello(JNIEnv *env, jobject thiz, jstring name) { // 将java字符串转换成Native层字符串 std::string str = "hello "; const char *cname = env->GetStringUTFChars(name, nullptr); str.append(cname); // 开释字符串 env->ReleaseStringUTFChars(name,cname); return env->NewStringUTF(str.c_str());}除了下面介绍的GetStringUTFChars, ReleaseStringUTFChars以及NewStringUTF, JNI还提供了GetStringChars和ReleaseStringChars等相干API解决Unicode格局的字符串。 ...

October 12, 2022 · 1 min · jiezi

关于android:Opengl-ES之FBO

FBO介绍FBO帧缓冲对象,它的次要作用个别就是用作离屏渲染,例如做Camera相机图像采集进行前期解决时就可能会用到FBO。如果相机出图的是OES纹理,为了不便前期解决,个别先将OES纹理通过FBO转换成一般的2D纹理,而后再通过FBO等减少美颜等其余各种特效滤镜,最初将FBO一路流送进编码器进行编码,另外一路渲染到屏幕上进行预览显示。 FBO总结起来就是能够临时将未解决完的帧不间接渲染到屏幕上,而是渲染到离屏Buffer中缓存起来,在失当的机会再取出来渲染到屏幕。 FBO(Frame Buffer Object)帧缓冲对象提供了与色彩缓冲区(color buffer)、深度缓冲区(depth buffer)和模版缓冲区(stencil buffer) ,但并不会间接为这些缓冲区调配空间,而只是为这些缓冲区提供一个或多个挂接点。咱们须要别离为各个缓冲区创建对象,申请空间,而后挂接到相应的挂接点上。 从上图能够看出FBO中蕴含了: 多个色彩附着点(GL_COLOR_ATTACHMENT0、GL_COLOR_ATTACHMENT1...)一个深度附着点(GL_DEPTH_ATTACHMENT)一个模板附着点(GL_STENCIL_ATTACHMENT)所谓的色彩附着(纹理附着)就是用于将色彩渲染到纹理中去的意思。前面咱们次要介绍FBO的色彩附着。 如何应用FBO应用函数glGenFramebuffers生成一个FBO对象,保留对象ID。应用函数glBindFramebuffer绑定FBO。应用函数glFramebufferTexture2D关联纹理和FBO,并执行渲染步骤。后续如果须要应用FBO的成果时只须要操作与FBO绑定的纹理即可。应用函数glBindFramebuffer解绑FBO,个别在Opengl中ID参数传递0就是解绑。应用函数glDeleteFramebuffers删除FBO。当挂接实现之后,咱们在执行FBO上面的操作之前,能够检查一下FBO的状态,应用函数GLenum glCheckFramebufferStatus(GLenum target)查看。 本着学以致用的准则,咱们将联合之前的文章,例如纹理贴图、VBO/VAO、EBO等相干知识点,应用这些知识点联合FBO绘制做一个实际的例子:首先将纹理渲染到FBO下来,而后再将FBO的纹理渲染到屏幕上。 插个话。。。总有人盗用不贴原文链接,看看是谁。。。 首先上代码,而后咱们挑重要的略微解读一下:FBOOpengl.h class FBOOpengl:public BaseOpengl{public: FBOOpengl(); void onFboDraw(); virtual ~FBOOpengl(); // override要么就都写,要么就都不写,不要一个虚函数写override,而另外一个虚函数不写override,不然可能编译不过 virtual void onDraw() override; virtual void setPixel(void *data, int width, int height, int length) override;private: void fboPrepare(); GLint positionHandle{-1}; GLint textureHandle{-1}; GLuint vbo{0}; GLuint vao{0}; GLuint ebo{0}; // 自身图像纹理id GLuint imageTextureId{0}; // fbo纹理id GLuint fboTextureId{0}; GLint textureSampler{-1}; GLuint fboId{0}; // 用于fbo的vbo和vao 也能够用数组的模式,这里为了不便了解先独立开来 GLuint fboVbo{0}; GLuint fboVao{0}; int imageWidth{0}; int imageHeight{0};};留神:override作为古代C++的一个关键字,应用的时候须要留神一点,要么就整个类的虚函数都用,要么整个类的虚函数都不必,不要一个虚函数用override润饰,另外一个虚函数又不必override关键字润饰,不然很有可能会编译不过的。 ...

October 12, 2022 · 4 min · jiezi

关于android:Opengl-ES之EBO

后面咱们介绍了VBO与VAO等缓冲对象,明天咱们来介绍一下EBO。 对于VBO或VAO能够查看之前的文章:Opengl ES之VBO和VAO EBO是个啥EBO(Element Buffer Object,也叫IBO:Index Buffer Object)索引缓冲区对象,这个缓冲区次要用来存储顶点的索引信息,索引的意义在于缩小反复数据,次要是在函数glDrawElements中应用。 在之前的文章中,咱们绘制三角形、四边形等,因为顶点数据或者专用的顶点坐标不多,都是调用函数glDrawArrays进行绘制的,试想一下,如果须要绘制一个顶点数量比拟多,而且多个顶点之间须要通过不同的组合进行顶点复用的,那么函数glDrawArrays及很难满足绘制需要了,此时就须要应用EBO搭配函数glDrawElements进行绘制了,例如应用8个顶点绘制一个正方体的例子。 在OpenGL通过索引缓冲对象(EBO)来对顶点进行复用,做到反复的顶点只须要调配一次内存,再绘图的时候后通过EBO通知GPU顶点的索引。 如果应用了EBO,那么绘图函数glDrawElements通过索引到相应的顶点缓冲区去拿数据,如果绑定了VAO就到VAO里拿数据。 EBO的应用EBO的应用和后面介绍的VBO的应用差不多: 函数glGenBuffers创建对象ID unsigned int EBO;glGenBuffers(1, &EBO);函数glBindBuffer绑定EBO与VBO相似,只不过EBO的类型变成了GL_ELEMENT_ARRAY_BUFFER glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);函数glBufferData绑定数据glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);对于GL_STATIC_DRAW等几个参数的类型在VBO的文章中曾经做了介绍,这里就不多说了,童鞋们能够看之前的文章。 当以上步骤配置结束就能够应用EBO了,在绘制函数glDrawElements调用前调用函数glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);进行绑定即可应用。 在析构函数中调用函数glDeleteBuffers销毁EBO glDeleteBuffers(1,&EBO);留神:笔者在联合应用VAO、VBO和EBO的时候发现,解除绑定时须要先解除VAO的绑定,再解除其余VBO及EBO的绑定,否则可能会导致绘制不失效。 实例Demo咱们沿用之前VBO/VAO绘制四边形的例子,在下面拓展一下应用四个顶点坐标联合EBO绘制一个四边形。 次要代码EBOOpengl.cpp: #include "EBOOpengl.h"#include "../utils/Log.h"// 顶点着色器static const char *ver = "#version 300 es\n" "in vec4 aColor;\n" "in vec4 aPosition;\n" "out vec4 vColor;\n" "void main() {\n" " vColor = aColor;\n" " gl_Position = aPosition;\n" "}";// 片元着色器static const char *fragment = "#version 300 es\n" "precision mediump float;\n" "in vec4 vColor;\n" "out vec4 fragColor;\n" "void main() {\n" " fragColor = vColor;\n" "}";const static GLfloat VERTICES_AND_COLOR[] = { 0.5f, -0.5f, // 右下 // 色彩 0.0f, 0.0f, 1.0f, 1.0f, 0.5f, 0.5f, // 右上 // 色彩 0.0f, 0.0f, 1.0f, 1.0f, -0.5f, -0.5f, // 左下 // 色彩 0.0f, 0.0f, 1.0f, 1.0f, -0.5f, 0.5f, // 左上 // 色彩 0.0f, 0.0f, 1.0f, 1.0f,};//const static unsigned int indices[] = {// // 留神索引从0开始!// // 此例的索引(0,1,2,3)就是顶点数组vertices的下标,// // 这样能够由下标代表顶点组合成矩形// 0, 1, 2, // 第一个三角形// 1, 2, 3 // 第二个三角形//};//// 应用shor类型//const static unsigned short indices[] = {// // 留神索引从0开始!// // 此例的索引(0,1,2,3)就是顶点数组vertices的下标,// // 这样能够由下标代表顶点组合成矩形// 0, 1, 2, // 第一个三角形// 1, 2, 3 // 第二个三角形//};// 应用byte类型const static uint8_t indices[] = { // 留神索引从0开始! // 此例的索引(0,1,2,3)就是顶点数组vertices的下标, // 这样能够由下标代表顶点组合成矩形 0, 1, 2, // 第一个三角形 1, 2, 3 // 第二个三角形};EBOOpengl::EBOOpengl() { initGlProgram(ver, fragment); positionHandle = glGetAttribLocation(program, "aPosition"); colorHandle = glGetAttribLocation(program, "aColor"); // VAO glGenVertexArrays(1, &vao); glBindVertexArray(vao); // vbo glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(VERTICES_AND_COLOR), VERTICES_AND_COLOR, GL_STATIC_DRAW); // stride 步长 每个顶点坐标之间相隔6个数据点,数据类型是float glVertexAttribPointer(positionHandle, 2, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void *) 0); // 启用顶点数据 glEnableVertexAttribArray(positionHandle); // stride 步长 每个色彩坐标之间相隔6个数据点,数据类型是float,色彩坐标索引从2开始 glVertexAttribPointer(colorHandle, 4, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void *) (2 * sizeof(float))); // 启用色彩顶点数据 glEnableVertexAttribArray(colorHandle); // EBO glGenBuffers(1,&ebo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ebo); glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW); // 这个程序不能乱啊,先解除vao,再解除其余的,不然在绘制的时候可能会不起作用,须要从新glBindBuffer才失效 // vao解除 glBindVertexArray(0); // 解除绑定 glBindBuffer(GL_ARRAY_BUFFER, 0); // 解除绑定 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); LOGD("program:%d", program); LOGD("positionHandle:%d", positionHandle); LOGD("colorHandle:%d", colorHandle);}void EBOOpengl::onDraw() { // 清屏 glClearColor(0.0f, 1.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(program); // VBO与VAO配合绘制 // 应用vao glBindVertexArray(vao); // 应用EBO// glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,(void *)0);// 应用short类型节俭内存// glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_SHORT,(void *)0);// 应用byte类型节俭内存 glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_BYTE,(void *)0); glUseProgram(0); // vao解除绑定 glBindVertexArray(0); // 禁用顶点 glDisableVertexAttribArray(positionHandle); if (nullptr != eglHelper) { eglHelper->swapBuffers(); }}EBOOpengl::~EBOOpengl() noexcept { glDeleteBuffers(1,&ebo); glDeleteBuffers(1,&vbo); glDeleteVertexArrays(1,&vao);}技巧:在确保数据不会产生溢出的状况下尽量应用占有内存小的数据类型以节约内存,例如应用short比int要节俭,应用byte比short要节俭。 ...

October 12, 2022 · 2 min · jiezi

关于android:Opengl-ES之VBO和VAO

前言本文次要介绍了什么是VBO/VAO,为什么须要应用VBO/VAO以及如何应用VBO和VAO。 VBO什么是VBO VBO(vertex Buffer Object):顶点缓冲对象。是在显卡存储空间中开拓的一块区域,在显卡存储空间中开拓一块区域,用于寄存顶点的各类属性信息。如顶点坐标、纹理坐标、顶点色彩等数据。在渲染时间接从显VBO去取数据而不用与CPU进行数据交换。 为什么须要应用VBO 将顶点数据保留在内存中,在调用glDrawArrays或者glDrawElements等绘制办法前须要调用相应的办法将数据送入显存,I/O开销大,性能不够好。若采纳顶点缓冲区对象寄存顶点数据,则不须要在每次绘制前都将顶点数据复制进显存,而是在初始化顶点缓冲区对象时一次性将顶点数据送入显存,每次绘制时间接应用显存中的数据,能够大大提高渲染性能。 如何应用VBO 应用函数glGenBuffers和一个缓冲ID生成一个VBO对象: unsigned int VBO;glGenBuffers(1, &VBO);应用函数glBindBuffer绑定顶点缓冲对象的缓冲类型是GL_ARRAY_BUFFEROpenGL有很多缓冲对象类型,顶点缓冲对象的缓冲类型是GL_ARRAY_BUFFER。 glBindBuffer(GL_ARRAY_BUFFER, VBO); 应用函数glBufferData把定义好的顶点数据复制到缓冲的内存中: // vertices示意顶点数组glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glBufferData是一个专门用来把用户定义的数据复制到以后绑定缓冲的函数。它的第一个参数是指标缓冲的类型,其中VBO代表是的GL_ARRAY_BUFFER。第二个参数指定传输数据的大小(以字节为单位),用一个简略的sizeof计算出顶点数据大小就行。第三个参数是咱们心愿发送的理论数据。第四个参数指定了咱们心愿显卡如何治理给定的数据,它有三种模式: GL_STATIC_DRAW :数据不会或简直不会扭转。 GL_DYNAMIC_DRAW:数据会被扭转很多。 GL_STREAM_DRAW :数据每次绘制时都会扭转。个别状况下地位数据不会扭转,每次渲染调用时都放弃原样,所以它的应用类型个别是GL_STATIC_DRAW。如果一个缓冲中的数据将频繁被扭转,那么应用的类型就是GL_DYNAMIC_DRAW或GL_STREAM_DRAW,这样就能确保显卡把数据放在可能高速写入的内存局部。 用完后应用函数glDeleteBuffers删除缓冲区明天咱们以之前绘制四边形的实际为例子,应用VBO的形式来实现四边形的绘制:Opengl ES之四边形绘制 咱们的指标是灵便应用Opengl绘制一个蓝色的四边形... 一般惯例的绘制这里就不多说了,后续能够看代码,或者回顾之前的四边形绘制的文章,这里次要介绍搭配VBO的两种绘制形式: 首先它们应用的顶点着色器和片段着色器都是一样的,都是: // 顶点着色器static const char *ver = "#version 300 es\n" "in vec4 aColor;\n" "in vec4 aPosition;\n" "out vec4 vColor;\n" "void main() {\n" " vColor = aColor;\n" " gl_Position = aPosition;\n" "}";// 片元着色器static const char *fragment = "#version 300 es\n" "precision mediump float;\n" "in vec4 vColor;\n" "out vec4 fragColor;\n" "void main() {\n" " fragColor = vColor;\n" "}";顶点坐标与色彩值坐标拆散的形式(数组构造)先看顶点数据与色彩数据: ...

October 12, 2022 · 4 min · jiezi

关于android:Opengl-ES之纹理贴图

纹理能够了解为一个二维数组,它能够存储大量的数据,这些数据能够发送到着色器上。个别状况下咱们所说的纹理是示意一副2D图,此时纹理存储的数据就是这个图的像素数据。 所谓的纹理贴图,就是应用Opengl将这个纹理数据渲染进去,这个过程有点像装修工人给墙体贴瓷砖,而瓷砖好比作纹理。 纹理坐标如果为了将一副纹理图贴到Opengl绘制的一个矩形上,那么就须要解决一个问题,如何晓得矩形的具体某个点对应纹理图的某个点呢?为了解决这个问题就引出了纹理坐标,通过矩形的顶点坐标与纹理坐标关联,这样就明确了每个顶点应该显示纹理图的那局部像素数据。 纹理坐标在x和y轴上,范畴为0到1之间。应用纹理坐标获取纹理色彩叫做采样(Sampling)。纹理坐标起始于(0, 0),也就是纹理图片的左下角,终始于(1, 1),即纹理图片的右上角,如下图所示: 纹理盘绕纹理坐标的值介于0到1之间,如果咱们把纹理坐标设置成大于1那么会产生什么呢?OpenGL默认的行为是反复这个纹理图像,那么利用这个默认的个性咱们能做些什么呢?那么比拟火的抖音四分屏、九分屏滤镜不就是能够用这个个性奇妙地实现吗。 以下是通过扭转纹理坐标实现四分屏和九分屏的一个小技巧: // 4分屏const static GLfloat TEXTURE_COORD[] = { 2.0f,2.0f, // 右下 2.0f,0.0f, // 右上 0.0f,2.0f, // 左下 0.0f,0.0f // 左上};// 九分屏const static GLfloat TEXTURE_COORD[] = { 3.0f,3.0f, // 右下 3.0f,0.0f, // 右上 0.0f,3.0f, // 左下 0.0f,0.0f // 左上};当然,当纹理坐标超过1这个范畴时,Opengl也提供了其余的抉择,例如: GL_REPEAT // 对纹理的默认行为。反复纹理图像。GL_MIRRORED_REPEAT //和GL_REPEAT一样,但每次反复图片是镜像搁置的。GL_CLAMP_TO_EDGE //纹理坐标会被束缚在0到1之间,超出的局部会反复纹理坐标的边缘,产生一种边缘被拉伸的成果。GL_CLAMP_TO_BORDER //超出的坐标为用户指定的边缘色彩。 以上个性能够通过函数glTexParameteri设置: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);纹理过滤纹理过滤理论就是纹理在放大放大的过程中像素的解决形式。其中在Opengl ES罕用的两种纹理过滤形式是GL_NEAREST(邻近过滤)和GL_LINEAR(也叫线性过滤)。 GL_NEAREST是OpenGL默认的纹理过滤形式。当设置为GL_NEAREST的时候,OpenGL会抉择中心点最靠近纹理坐标的那个像素。GL_LINEAR(也叫线性过滤,(Bi)linear Filtering)它会基于纹理坐标左近的纹理像素,计算出一个插值,近似出这些纹理像素之间的色彩。一个纹理像素的核心间隔纹理坐标越近,那么这个纹理像素的色彩对最终的样本色彩的奉献越大。GL_NEAREST产生了颗粒状的图案,咱们可能清晰看到组成纹理的像素,而GL_LINEAR可能产生更平滑的图案,很难看出单个的纹理像素。 同理,纹理过滤个性也是通过函数glTexParameteri设置: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);纹理单元纹理单元的次要目标是让咱们在着色器中能够应用多于一个的纹理。通过把纹理单元赋值给采样器,咱们能够一次绑定多个纹理,只有咱们首先激活对应的纹理单元。例如应用Opengl ES对视频解码后的YUV进行渲染就须要用到纹理单元的相干知识点。 Opengl中纹理的应用在Opengl中应用纹理次要有以下几个步骤: 创立纹理glGenTextures激活纹理glActiveTexture绑定纹理glBindTexture,传递特定的纹理id进行绑定上传纹理数据glTexImage2D解除纹理绑定,glBindTexture,传递0进行解除绑定纹理坐标映射关系在理解纹理贴图之前咱们先回顾一下三个坐标零碎,别离是纹理坐标零碎、手机屏幕坐标零碎、Opengl坐标零碎。这三个坐标零碎的的原点各不相同,纹理坐标零碎咱们下面曾经介绍过了,这里不再反复。而手机屏幕坐标零碎则是原点位于左上角,X轴向右为正,Y轴向下为正的坐标零碎。而Opengl坐标零碎则是原点位于核心,X轴向右为正,Y轴向下为正,其值介于-1到1之间的一套坐标零碎。 ...

October 12, 2022 · 2 min · jiezi

关于android:隐私合规综合实践

隐衷合规综合实际目录介绍01.整体概述介绍 1.1 遇到问题阐明1.2 我的项目背景1.3 设计指标1.4 产生收益剖析02.隐衷合规测什么 2.1 隐衷合规是什么2.2 为何做隐衷合规2.3 隐衷合规政策案例2.4 为何做权限合规04.隐衷合规检测 4.1 违规收集个人信息4.2 超范围收集个人信息4.3 违规应用个人信息4.4 适度索取权限4.5 自启动和关联启动05.隐衷合规实际 5.1 整体合规思路5.2 工具检测隐衷API5.3 工具检测权限5.4 敏感信息控频5.5 隐衷协定申明5.6 敏感权限实际5.7 底层依赖库权限阐明06.合规测试查看重点 6.1 合规解决优先级6.2 QA测试查看重点6.3 交互层面合规6.4 服务端敏感收集6.5 隐衷协定筛查07.其余阐明介绍 7.1 参考博客链接7.2 相干demo链接01.整体概述介绍1.1 遇到问题阐明国内对应用程序平安隐衷问题监管变的越来越严格。各个利用市场对APP上架也有比拟严格的查看。呈现隐衷合规平安问题次要有哪些呢? 在用户批准隐衷协定之前,不能有收集用户隐衷数据的行为。例如,在用户批准之前不能去获取 Android ID、Device ID、MAC 等隐衷数据在用户批准隐衷协定之后,收集用户隐衷数据的行为不能超出实现服务场景所必须的最低频率。例如,某些利用会在每次网络申请时将以后设施的 Android ID 作为 header 一起上报,如果没有对 Android ID 进行缓存解决的话,收集该数据的行为频率就会十分高,此时一样存在隐衷合规问题。工信部隐衷合规阐明 具体能够看一下这篇文档:工信部隐衷合规文档1.2 我的项目背景最要害的问题是用户批准隐衷协定之前,不能有收集用户隐衷信息的行为,例如获取deviceId、androidId等信息,除此之外,对于频繁申请权限、超范围申请权限也是须要留神的。除了开迭代针对性整改,从技术角度思考,有没有一劳永逸的方法,杜绝隐衷调用不合规问题呢?1.3 设计指标针对提前收集用户隐衷数据。 须要统计出整个我的项目中所有波及到隐衷行为的相干代码,依据业务流程来判断该隐衷行为是否正当、以及是否会在用户批准隐衷协定之前被触发。这就须要对整个我的项目进行动态扫描。针对收集隐衷数据哪里调用。 须要在利用运行时动静记录每次触发隐衷行为的工夫点和调用链信息,依据触发工夫来判断该隐衷行为是否适量执行,依据调用链信息来辅助判断具体是哪一块业务在获取隐衷数据。这就须要对利用进行动静记录。1.4 产生收益剖析编码排查耗时大 如果单纯靠开发人员来肉眼辨认代码和编码统计的话,工作量十分大而且也很不事实,因为一个大型项目往往都会引入多个依赖库和第三方 SDK,能够标准自有代码,但没法批改和无效束缚内部依赖,也很难理分明依赖库的外部逻辑和调用链关系。进步合规隐衷检测效率 当检测有调用隐衷数据时,在控制台打印输出提醒,给出堆栈信息让开发疾速定位调用链路;当检测到隐衷行为后,输入绝对应的记录报告,以便开发人员可能在开发阶段排查问题。02.隐衷合规测什么2.1 隐衷合规是什么对客户端而言,权限隐衷可分为 权限 和 隐衷 两个大的方面。权限为用户通过app内弹窗设置或者手机设置内对应app的权限设置形式给予对应app相应的权限 如电话权限,定位权限,相机权限,浮窗权限,读写权限等。在每个申请危险权限前,都须要弹窗阐明权限解释阐明。隐衷为app应用过程中与用户集体相干的个人信息 如所在位置,Mac地址,设施id等。就Android端而言,少数隐衷信息须要对应受权后能力获取,但目前仍存在局部隐衷信息无需受权就能够拿到的。2.2 为何做隐衷合规公众隐衷意识沉睡,权限隐衷安全性差会间接导致用户不愿应用;日趋严格的权限治理和隐衷平安治理,工信部和市场的严格管控;客户端作为与用户最间接的交互信息收集入口,有任务合规化的收集和应用用户信息。2.3 隐衷合规政策案例隐衷合规案例 比方获取设施信息:获取设施id,sim,androidId等;比方获取危险权限信息:获取读写存储卡权限,获取电话权限等。须要有文案形容 收集设施id,为了帮忙开发者在进行音讯推送时辨认最终用户设施,保障开发者及最终用户失常应用音讯推送服务,晋升音讯推送服务的效率以及准确率。获取读写权限,帮忙开发者进行最终用户设施辨认,保障开发者及最终用户失常应用音讯推送服务,晋升音讯推送服务的效率以及准确率;更精确定位并解决产品和服务应用问题,改良及优化产品和服务体验。2.4 为何做权限合规首先权限合规有两大点 ...

October 12, 2022 · 2 min · jiezi

关于android:如何用AR-Engine环境Mesh能力实现虚实遮挡

在AR利用中,用户最不心愿看到不实在的穿模景象产生,如虚构形象局部身材陷入墙壁之中,或者未碰到墙壁却已无奈挪动,这种不实在的交互非常影响用户体验。那如何能力让防止虚构物体的穿模问题呢?应用AR Engine的环境Mesh能力就能帮忙开发者解决这个问题。 成果展现 实现办法AR Engine提供实时计算并输入画面环境Mesh数据的能力。通过环境Mesh能力虚构角色能够精确辨认以后所处三维空间的状况,让虚构物体不仅仅能搁置在水平面和垂直面上,还能够搁置在任意可重建的曲面上。开发者可利用重建的环境Mesh实现虚实遮挡和碰撞检测,能够让虚构物体藏在实在物品后,防止事实物体和虚构物体交融景象的产生,从而实现沉迷式AR体验。 集成步骤开发环境要求:JDK 1.8.211及以上。 装置Android Studio 3.0及以上: minSdkVersion 26及以上 targetSdkVersion 29(举荐) compileSdkVersion 29(举荐) Gradle 6.1.1及以上(举荐) 在华为终端设备上的利用市场下载AR Engine服务端APK(需在华为利用市场,搜寻“华为AR Engine”)并装置到终端设备。 测试利用的设施:参见AREngine个性软硬件依赖表中环境Mesh反对设施列表。如果同时应用多个HMS Core的服务,则须要应用各个Kit对应的最大值。 开发筹备在开发利用前须要在华为开发者联盟网站上注册成为开发者并实现实名认证,具体方法请参见帐号注册认证。华为提供了Maven仓集成形式的AR Engine SDK包,在开始开发前,须要将AR Engine SDK集成到您的开发环境中。Android Studio的代码库配置在Gradle插件7.0以下版本、7.0版本和7.1及以上版本有所不同。请依据您以后的Gradle插件版本,抉择对应的配置过程。以7.0为例:关上Android Studio我的项目级“build.gradle”文件,增加Maven代码库。 在“buildscript > repositories”中配置HMS Core SDK的Maven仓地址。 buildscript { repositories { google() jcenter() maven {url "https://developer.huawei.com/repo/" } }}关上我的项目级“settings.gradle”文件,配置HMS Core SDK的Maven仓地址 dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { repositories { google() jcenter() maven {url "https://developer.huawei.com/repo/" } } }}增加依赖 在“dependencies”中增加如下编译依赖:dependencies { implementation 'com.huawei.hms:arenginesdk:{version}}开发步骤创立HitResultDisplay类,这个类依据指定的参数来绘制虚构对象Public class HitResultDisplay implements SceneMeshComponenDisplay{ //初始化VirtualObjectData VirtualObjectData mVirtualObject = new VirtualObjectData(); //在init办法中给mVirtualObject传入上下文 Public void init(Context context){ mVirtualObject.init(context); //传入材质属性 mVirtualObject.setMaterialProperties(); } //在onDrawFrame办法中传入ARFrame,用来获取光照预计 Public void onDrawFrame(ARFrame arframe){ //获取光照预计 ARLightEstimate le = arframe.getLightEstimate(); //获取以后相机视线的像素强度 lightIntensity = le.getPixelIntensity(); //获取好之后,须要给mVirtualObject中一些办法传入数据 mVirtualObject.draw(…,…,lightIntensity,…); //创立handleTap办法传入ARFrame对象来获取坐标信息 handleTap(arframe); } //实现handleTap办法 Private void handleTap(ARFrame frame){ //用ARFrame对象调用hitTest List<ARHitResult> hitTestResults = frame.hitTest(tap); //检测立体是否被击中,是否在立体多边形中被击中 For(int i = 0;i<hitTestResults.size();i++){ ARHitResult hitResultTemp = hitTestResults.get(i); Trackable = hitResultTemp.getTrackable(); If(trackable instanceof ARPoint && ((ARPoint) trackable).getOrientationMode() == ARPoint.OrientationMode.ESTIMATED_SURFACE_NORMAL){ isHasHitFlag = true; hitResult = hitResultTemp; } } }}创立SceneMeshDisplay类,用来渲染场景网络Public class SceneMeshDiaplay implements SceneMeshComponenDisplay{ //须要在init中实现openGL的一些操作 Public void init(Context context){} //在onDrawFrame办法中获取以后对应的环境Mesh Public void onDrawFrame(ARFrame arframe){ ARSceneMesh arSceneMesh = arframe.acquireSceneMesh(); //创立一个用来更新数据的办法把arSceneMesh传入进去 updateSceneMeshData(arSceneMesh); //arSceneMesh应用完之后须要开释 arSceneMesh.release(); } //实现这个办法用来更新数据 Public void updateSceneMeshData(ARSceneMesh sceneMesh){ //返回以后视角下环境Mesh顶点坐标数组 FloatBuffer meshVertices = sceneMesh.getVertices(); //返回以后视角下环境Mesh三角面片顶点索引的数组 IntBuffer meshTriangleIndices = sceneMesh.getTriangleIndices(); }}创立SceneMeshRenderManager类,这个类来提供与内部场景相干的渲染管理器,包含虚构对象渲染治理 ...

October 11, 2022 · 2 min · jiezi

关于android:MobPush-Android常见问题

配置了默认点击跳转界面,对所有通道都无效吗只对MobPush、魅族、小米、华为、OPPO、VIVO通道无效,对FCM通道有效。 如何获取回调参数过程存活的状况下,可在咱们的回调监听中看到告诉详情,能够依据回调参数进行解决。 详情请查看 API接口->推送监听接口。过程被杀状况下,回调监听不可用,但点击告诉后拉起利用的启动页面,会触发启动Activity的onCreate或onNewIntent,通过getIntent拿到回传的Intent,能够拿到告诉详情。注:PushSDK提供了解析办法来获取回调参数,但厂商告诉次要是获取附加字段,不会把所有信息都解析进去。 跳转首页获取参数JSONArray jsonArray = MobPushUtils.parseMainPluginPushIntent(getIntent());System.out.println("-------------JsonPushData打印查看:"+jsonArray);返回阐明 2.2 scheme跳转获取参数,详情请查看 API接口->scheme跳转 JSONArray jsonArray = MobPushUtils.parseSchemePluginPushIntent(getIntent());System.out.println("-------------JsonScheme打印查看:"+jsonArray);返回阐明 3.如不应用PushSDK提供的解析办法,可参考以下办法获取回调参数 private void dealPushResponse(Intent intent) { Bundle bundle = null; if (intent != null) { bundle = intent.getExtras(); if (bundle == null) { Log.e("PushResponse","bundle的值为空"+bundle); return; } else { Set<String> keySet = bundle.keySet(); if (keySet == null || keySet.isEmpty()) { return; } for (String key : keySet) { //通过key获取bundle中的key对应的值。就是附加数据了 Log.e("PushResponse","bundlekey===========================点击信息"+key); } Log.e("PushResponse","bundle===========================点击信息"+bundle.toString()); } } }OPPO推送时按全副人群进行推送,为什么有的OPPO设施接管不到因为OPPO推送对应全副人群这种全量推送是有个工夫限度规定的,当全量推送时当天新注册的OPPO设施是不失效的,第二天才失效,被全量推送计算在指标设备组中,T+1规定。 而对应繁多OPPO设施推送时,没有T+1规定限度,注册胜利即立刻失效。 ...

October 10, 2022 · 2 min · jiezi

关于android:️-如何逐步关闭-MIUI-无处不在的广告

如果你喜爱我的文章,心愿点赞 珍藏 评论 三连反对一下,谢谢你,这对我真的很重要!最近须要给前辈置换一下手机,在无限的预算内,通过屡次比拟发现还是小米的硬件配置更好一些,最初也是下单了小米。 在 2022 年,Android 系统对手机权限的进一步限度,一些过往的卡顿问题都失去了肯定的解决。然而在国内的定制版 Android 机上,和原生 Android 零碎还是多了一些特色的货色: 无处不在的零碎级广告,诱导用户点击/误触,从而去跳转/下载 APP“不小心下载” 的 APP,占用贵重的内存/硬盘资源,拖慢手机速度国内特色的航母级 APP,一个 APP 占几个 G 的硬盘,有些小而美的利用甚至几十个 G下面的三个问题中,前两个能够通过肯定的致力解决大部分,第三个大家都没得选只能硬抗。本文就是聚焦于「敞开 MIUI 无处不在的广告」这个话题的。 尽管 MIUI 始终有 ADUI 的称说,然而集体身处这个行业也能示意了解: 小米把硬件上的利润压到了最低,赚不到钱就要从其余路子上想方法,只能不停的“加点儿广告怎么了” 废话不多说,咱们间接开始。 本文成文于 2022.09,应用的是 MIUI 13.0.4 版本,随着工夫的推移,其它版本 MIUI 可能有操作不统一的状况,这点须要读者留神。一、通过惯例伎俩敞开广告推送1.1 关闭系统广告MIUI 的许多内置利用(例如 天气、万年历、音乐)和零碎级页面(例如桌面文件夹)上都会推送一些贴片广告,诱导用户观看和点击。 可能用户反馈过于强烈,2019 年年末某个版本更新中,新增了「一键关闭系统广告」的性能。这个开关也很好找,咱们间接进入「设置」,而后在搜寻框里输出「零碎广告」,而后点击进入新页面,把「零碎工具广告」这个开关关上即可。 咱们能够通过「查看波及利用列表」查看波及的 APP,而后去相干 APP 里查看是否去掉广告,如果局部广告还没有去除,咱们还能够参考这篇文章:当咱们议论零碎广告的时候,还有哪个国内定制 UI 是无辜的?,手动敞开广告。 这时候其实曾经敞开大部分的零碎广告了,然而有些内置利用还是有不少关不了的广告,上面我举例说明一下。 小米浏览器主页会推送很多新闻,常常会引起首页卡顿和不必要的误触。这时候咱们能够进入「浏览器设置」->「主页设置」,抉择「简洁版」,而后再把「宫格位推送」开关关掉;退回到浏览器主页后,再点击右上角,按需要要把「快捷网址」和「全网热榜」关掉,最初就能失去一个洁净的主页。 小米视频外面有勾销不掉的金币工作,诱导你去装置 APP。实际上在某音某手的存在下,其它的视频 APP 都是没必要的。所以咱们能够通过「小米视频设置」->「其它」,敞开「在线服务」,这样它就只会老老实实的播放本地的视频,不会加那么多乌七八糟的视频流信息了。 小米音乐有两个服务模式,一个是「QQ 音乐模式」,一个是「小米音乐模式」,用户能够二选一。 「QQ 音乐模式」十分的轻量,只有QQ音乐的外围性能。如果有在线听音乐的需要,这个模式还是蛮不错的,能够保留。 「小米音乐模式」也有在线听音乐的性能,然而和小米视频一样,也无关不掉的广告。所幸它也有敞开「在线内容服务」的能力,如果没有在线听音乐需要(或有别的抉择),能够敞开在线服务,让它只用于本地音频播放。 其它 APP 也能够按以上思路,通过一些设置敞开广告,我就不一一列举了。 1.2 调整桌面交互逻辑当初的手机操作系统,不论是 Android 还是 iOS,在零碎桌面上都有相似的性能:桌面下滑能够关上全局搜寻页,桌面左滑能够进入摆放着工具小组件的负一屏。 ...

October 9, 2022 · 2 min · jiezi