关于android:借款App崩溃率优化实战

App的性能稳固是良好用户体验中至关重要的一环,而现实情况却是利用解体、卡顿、慢加载、页面白屏等问题,频频呈现在用户的实在体验之中,成为影响业务转化的间接杀手。其中,客户端最为关注的利用性能体验指标是解体率和卡顿率。借款App在过来相当长一段时间内解体率都处在业界优良的行列,但随着零碎版本以及利用版本的一直迭代,解体率也逐步呈现了好转。本文次要介绍下借款App团队在解体率攻坚战上所做的致力以及获得的成绩,如何将本来好转的App解体率拉回正规重回优良行列的。 借款App解体率现状业内个别应用解体率来掂量一款App的稳定性,解体率的定义为: 解体给用户带来的体验极差,很可能导致用户散失。假如一个用户获客老本是100元,如果是0.1%的解体率,依照每天100w日活计算,则每天可能因App解体而散失1000人,折合成市场推广费用就是10w元。更不用说挽回用户的老本,以及用户潜在成交的可能。后面说到借款App双端在相当长的一段时间内,解体率都处于优良行列,但随着业务的飞速迭代,它们终于不堪重负,身材逐步呈现了隐患,解体率双双跌至0.1%左近,到了不得不器重并解决的境地。 导致 App 解体的起因有很多,诸如谬误地应用线程、零碎函数、编程范式、数据结构等,亦或是零碎版本或者机型之间的差别导致的兼容性问题,除了利用自身还有引入的第三方SDK也时有发生解体进而影响App自身的状况。大部分解体都会在App灰度公布阶段被发现定位并解决。因而解决App解体问题的要害是在于能不能尽早地发现和定位这些“坑”。实践上只有定位并填平所有的“坑”,就能防止所有的解体,但在理论开发过程中须要对现有代码逻辑和业务影响状况做具体评估再做修复打算,如果以后版本批改的危险比解体自身带来的危险还要高,通常会提早修复打算。还有一些解体是偶现的,短少堆栈信息的,或者特定机型上的,通常比拟难以定位。借款App双端都呈现的解体率好转景象,也正是因为这种解体所导致的。 Android平台案例剖析其中Android端自2021年开始呈现了一个Handler相干的解体。Handler : 一套 Android 消息传递机制,次要用于线程间通信因为听云报上来的解体日志短少残缺的堆栈信息无奈精准定位 BUG,线下测试也未能复现,且该解体均呈现在华为鸿蒙零碎上。 通过查看官方论坛,发现遭逢同类型问题的开发者泛滥,彼时鸿蒙零碎刚公布不久,所以一度评估认为是鸿蒙零碎兼容性的问题。之后随着鸿蒙零碎的一直迭代以及市占率的逐步进步,该解体占总解体的占比越来越高,期间借款App团队曾数次尝试解决但均未见成效。随着借款App 华为鸿蒙零碎市占率达到了25%,Android平台整体解体率曾经迫近0.1%,咱们发动了解体率治理专项口头,誓要修复此问题。 通过官网渠道寻求帮忙。在把握的解体堆栈信息中惟一有用的排查方向就是Handler,在继续的地毯式排查和修复未果后,咱们转换思路分割了鸿蒙官网此类解体呈现的可能门路,失去的回答是:“关注一下App中是否有子线程绘制UI的状况”。情理我都懂 —— 对于借款App这种超级App来说,一行行的看代码来排查不太事实,此路不通。 通过自动化的形式尝试复现问题。首先,咱们在听云中找到一批解体的用户,而后去一一剖析用户的操作门路,通过一段时间的剖析,大抵能够还原出用户解体的几个场景:1. 点击敞开弹窗解体;2. 启动即解体;3. 切换首页Tab解体。接下来咱们通过在自动化测试平台上编写脚本模仿上述3个场景的操作门路,一直地反复上述步骤心愿能够复现解体,如果能胜利复现bug,那么bug的修复工作根本就实现一半了。 通过数十个小时的自动化测试终于在听云上胜利捕捉到了这一解体,然而听云有没有可能误报?用户的操作景象是什么?为了进一步坐实复现场景,咱们采纳了最奢侈的技术手段,间接对着测试机开启视频录制,并通过 adb 命令导出日志。最终视频胜利监控到了解体景象,同时咱们也获取到了解体具体日志,定位到对应的代码块。随后的修复工作就瓜熟蒂落了,修复代码编写完之后咱们依然用这个思路去测试修复成绩,自动化脚本跑了近一周都没能复现解体,根本能够确定已修复实现。 以上述的场景3为例,最终定位到 WebUI SDK 里在子线程里去设置了下拉刷新背景图,这也佐证了鸿蒙官网给的修复意见。 能够看到修复代码于1月30日追随Android V10.2版本上线后,解体率显著降落到0.02%左右。 iOS 平台案例剖析iOS端占比比拟高的解体次要有两个:SIGABRT和SIGKILL。其中SIGABRT也是短少解体堆栈,排查修复计划和Android鸿蒙解体相似,都是找到解体用户,通过剖析操作门路,揣测解体场景进而复现修复。SIGKILL解体是在2023年初降级了听云悟空平台后大量出的,其实该类型解体始终存在,只是老的听云平台并没有捕捉统计到。SIGKILL示意操作系统从下层强制终止了利用的过程,该解体占比一度达到40%。在iOS 13之前,SIGKILL是无奈被捕捉的。随着苹果在iOS 13零碎推出MetricKit框架,该框架汇总和剖析异样、解体诊断、电源和性能指标,并在iOS 14零碎进一步提供了解体日志统计性能。通过Metrickit,能够收集SIGKILL信号量,帮忙开发者更好地理解解体状况。应用新技术也裸露了之前未发现的问题,次要集中在内存治理方面。通过Xcode的内存图调试器(Memory Graph Debugger),能够不便地查找我的项目中的内存透露问题,并有针对性地进行修复和优化。 下图为iOS解体修复上线后,解体率显著降落的趋势图。 总结稳定性治理是一场持久战。通过上述的修复治理,借款App双端的解体率都重回0.02%左右,在行业中属于比拟优良的存在。在过来相当长的一段时间里,咱们积攒了一套本人的解决思路,包含但不限于:日志剖析、自动化测试、性能优化、用户反馈以及监控预警等综合性的解体发现、定位和修复办法。从0.1%到0.02%,数量级升高的背地是上述的种种致力,将问题演绎总结整顿,造成技术积淀、适宜团队工作形式、匹配产品业务的一套方法论,并将这套方法论贯彻到日常工作中,实现技术服务产品,技术赋能业务,技术发明价值。 App稳定性治理是一场长期的继续战斗,无奈欲速不达。但咱们对这场战斗充满信心,咱们置信,在借款App团队成员的共同努力下,咱们将打造出更加优良的产品和服务,为用户发明更加极致的应用体验,为业务的倒退注入新的能源。咱们将继续进行App的稳定性治理,通过晋升技术、改良流程和优化策略,以确保借款App始终保持稳定牢靠。 作者简介Star 信也科技挪动利用研发专家,专一于App稳定性及用户体验Kang 信也科技挪动利用研发专家,专一于App根底组件研发

March 4, 2024 · 1 min · jiezi

关于android:快速上手在-Android-设备上运行-Pipy

Pipy 作为一个高性能、低资源耗费的可编程代理,通过反对多种计算架构和操作系统,Pipy 确保了它的通用性和灵活性,可能适应不同的部署环境,包含但不限于云环境、边缘计算以及物联网场景。它可能在 X86、ARM64、海光、龙芯、RISC-V 等架构上运行,反对泛滥 Linux 发行版,以及 FreeBSD、macOS、Windows 和国产操作系统。 总有用户问起 Pipy 是否运行在 Android 上运行,明天就来摸索如何在 Android 平台上运行 Pipy。 环境筹备测试环境: 本地 macOS 地址为 10.1.1.18装置 Android 命令行工具 adb(macOS 上可通过 brew install android-platform-tools 装置)Android 设施地址为 10.1.1.97 (该设施 CPU 用的是 Cortex-A53,arm64-v8a 架构)在开始之前,确保 Android 设施上曾经开启开发者模式。通过 adb connect 命令无线连接到设施。 adb connect 10.1.1.97:5555connected to 10.1.1.97:5555能够通过命令查看以后已连贯的设施。 adb devicesList of devices attached10.1.1.97:5555 device装置 Pipy接下来 下载 Pipy Android 安装包,并解压缩失去两个文件:pipy 和 libc++shared.so,别离是二进制文件和动态链接库。 通过 adb push 命令将其复制到设施中,这里设施目录咱们应用 /data/local/tmp。 adb push pipy /data/local/tmpadb push libc++_shared.so /data/local/tmp装置完 Pipy 之后,咱们通过 adb shell 通过命令行拜访设施,并验证 Pipy 运行状况。 ...

March 4, 2024 · 2 min · jiezi

关于android:Android-应用外悬浮窗

 实现Android利用外悬浮窗的过程能够分为以下步骤: 获取悬浮窗权限:在AndroidManifest.xml文件中增加SYSTEM_ALERT_WINDOW权限,以容许利用在其余利用下层显示悬浮窗。 创立悬浮窗布局:创立一个布局文件,用于定义悬浮窗的款式和内容。 创立悬浮窗服务:创立一个Service类,用于治理悬浮窗的生命周期和操作。 增加显示悬浮窗的代码:在Service类中的onCreate办法中,通过WindowManager.LayoutParams参数设置悬浮窗的显示地位和属性,并将悬浮窗布局增加到WindowManager中进行显示。 增加悬浮窗的触摸事件处理:在Service类中的onCreate办法中,为悬浮窗布局设置触摸事件监听器,以实现拖拽悬浮窗的性能。 增加悬浮窗的点击事件处理:在Service类中的onCreate办法中,为悬浮窗布局设置点击事件监听器,以实现点击悬浮窗进行相应操作的性能。 上面是具体的每一步须要做的操作和代码示例: 第一步:获取悬浮窗权限 在AndroidManifest.xml文件中增加以下代码: <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 第二步:创立悬浮窗布局 创立一个布局文件,例如float_window.xml,用于定义悬浮窗的款式和内容。能够应用LinearLayout或者RelativeLayout等布局容器,依据须要增加相应的控件和款式。 第三步:创立悬浮窗服务 创立一个继承自Service的类,例如FloatWindowService,用于治理悬浮窗的生命周期和操作。 public class FloatWindowService extends Service { // 实现Service的相干办法} 第四步:增加显示悬浮窗的代码 在FloatWindowService的onCreate办法中,通过WindowManager.LayoutParams参数设置悬浮窗的显示地位和属性,并将悬浮窗布局增加到WindowManager中进行显示。 @Overridepublic void onCreate() { super.onCreate(); // 创立悬浮窗布局 View floatView = LayoutInflater.from(this).inflate(R.layout.float_window, null); // 设置悬浮窗参数 WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.width = WindowManager.LayoutParams.WRAP_CONTENT; params.height = WindowManager.LayoutParams.WRAP_CONTENT; params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; params.format = PixelFormat.TRANSLUCENT; // 获取WindowManager WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); // 增加悬浮窗布局到WindowManager windowManager.addView(floatView, params);} 第五步:增加悬浮窗的触摸事件处理 在FloatWindowService的onCreate办法中,为悬浮窗布局设置触摸事件监听器,以实现拖拽悬浮窗的性能。 ...

March 1, 2024 · 1 min · jiezi

关于android:包教包会的Kotlin-Flow教程

原文链接 包教包会的Kotlin Flow教程        公众号「罕见猿诉」Kotlin中的Flow是专门用于解决异步数据流的API,是函数响应式编程范式(Functional Reactive Programming FRP)在Kotlin上的一个实现,并且深度交融了Kotlin的协程。是Kotlin中解决异步数据流问题的首先计划。明天就来认识一下Flow并学会如何应用它。 Hello, Flow!老规矩,新学习一个新货色的时候,总是要从一个根底的『Hello, world』开始,疾速上手体验,有个第一印象。咱们就从一个简略的『Hello, Flow!』开始Flow之旅: fun main() = runBlocking { val simple = flow { listOf("Hello", "world", "of", "flows!") .forEach { delay(100) emit(it) } } simple.collect { println(it) }}//Hello//world//of//flows!这里创立了一个异步产生String的数据流Flow<String>,会不定时的产生一个String,而后收集此数据流产生的数据,把流出的String对象生产掉。 能够看出Flow实质上是一个生产者消费者模式,流出的数据是由生产者产生的,且最终被消费者生产掉。能够把Flow想像成为一个生产线中的传送带,产品(数据)在下面不停的流动,通过各个站点的加工,最终成型,由消费者生产掉。从这个小例子中能够看出Flow API的三要素:数据流的上游是创立Flow(生产者);中游是变幻操作(数据的解决和加工);上游是收集数据(消费者),咱们一一的具体来学习。 创立FlowFlow是一个生产者,创立Flow也就是把数据放到传送带上。数据能够是根底数据或者汇合,也能够是其余形式生成的数据,如网络或者回调或者硬件。创立Flow的API称作flow builder函数。 用汇合创立Flow这是创立Flow的最简略的形式,有两个,一个是flowOf用于从固定数量的元素创立,多用于示例,理论中基本上用不到: val simple = flowOf("Hello", "world", "of", "flows!")simple.collect { println(it) }或者,通过asFlow把现有的汇合转为Flow,这个还是比拟实用的: listOf("Hello", "world", "of", "flows!").asFlow() .collect { println(it) }(1..5).asFlow().collect { println(it) }通用flow builder最为通用的flow builder就是flow {...}了,这是最为通用,也是最为罕用的结构器。在代码块中调用emit就能够了,这个代码块会运行在协程之中,所以在这个代码里能够调用suspend函数: fun main() = runBlocking { val simple = flow { for (i in 1..3) { delay(100) println("Emitting: $i") emit(i) } } simple.collect { println(it) }}//Emitting: 1//1//Emitting: 2//2//Emitting: 3//3这是一个代码块,只有调用了emit产生数据即可,又可调用suspend函数,因而十分的实用,比方能够执行网络申请,申请回来后emit等等。 ...

February 18, 2024 · 5 min · jiezi

关于android:Flutter-Doctor-运行失败Android-licenses-not-accepted

运行flutter doctor报错: [!] Android toolchain - develop for Android devices (Android SDK version 34.0.0) ! Some Android licenses not accepted. To resolve this, run: flutter doctor --android-licenses[√] Chrome - develop for the web[X] Visual Studio - develop Windows apps X Visual Studio not installed; this is necessary to develop Windows apps. Download at https://visualstudio.microsoft.com/downloads/. Please install the "Desktop development with C++" workload, including all of its default components[√] Android Studio (version 2022.3)[√] IntelliJ IDEA Ultimate Edition (version 2021.1)[√] Connected device (3 available)[!] Network resources X A network error occurred while checking "https://maven.google.com/": 信号灯超时工夫已到 X A network error occurred while checking "https://github.com/": 信号灯超时工夫已到解决办法: ...

September 27, 2023 · 1 min · jiezi

关于android:FAQ关于获取运动健康数据的常见问题及解答

目录一、Health Kit衰弱数据采样, 原子采样数据问题 二、Health Kit查问历史数据查问数据和返回数据不统一 三、Health Kit对于获取历史数据问题 四、调用Health Kit接口呈现获取不到数据的状况 问题解答Q1:Health Kit衰弱数据采样, 原子采样数据问题【问题形容】 1.体脂数据中的肌肉量和水份量是如何取得的,是用户本人上传体脂数据中的体重、体脂,而后零碎通过计算公式失去数据吗? 2.日常流动统计数据蕴含什么内容,如何获取这些数据? 锤炼记录概要数据蕴含什么内容,是统计数据吗?获取形式是什么?心脏衰弱数据测的是心电图相干记录。这些数据传到回调地址是什么数据格式?【解决方案】 1、Health Kit是基于用户受权的前提下,将静止衰弱App中的数据进行凋谢,相干数据是由静止衰弱App提供的。 体脂数据是通过算法失去的, Health Kit仅会将有的数据进行返回。 体脂返回的无关数据能够查看“体重”指南。 2、日常流动统计数据蕴含步数、流动热量、锤炼时长、流动小时数的指标与日统计值,能够查看“日常流动统计”指南中的数据凋谢阐明进行获取,返回的参数在指南中也有形容。 3、蕴含的相干数据能够点击此处的图标进行查看,在“数据凋谢总览”中也有相干形容。 锤炼记录属于静止记录,获取形式以跑步为例,能够查看跑步指南中的场景示例。4、订阅性能,是数据有更新时会向您发送一个告诉,告诉内容并不蕴含具体的数据,仅会告知您用户的某个数据在某个工夫点产生了什么。您在接管到告诉后,须要依据推送过去的音讯告诉,向Health Kit服务端拉取数据。 比方,在接管到心电图①的告诉后,依据告诉中返回的信息,调用②的接口,拉取具体的数据。点击查看ECG心电测量记录。 Q2:Health Kit查问历史数据查问数据和返回数据不统一【问题形容】 通过https://health-api.cloud.huawei.com/healthkit/v1/activityReco...查问一个月静止记录,只能查问到最早5月26的数据,然而华为衰弱App里的数据最早为5月8日,为何查问不到? 【解决方案】 1、须要查看是否申请了历史数据权限,查问数据时,出于对用户的数据保护,只容许开发者查问用户受权之后的数据。例如用户是在2022年2月14日受权,那么2022年2月14日之前的数据将不可查问。 另外要申请历史数据相干权限。申请的测试权限个别会有半年有效期,若因到期被平台敞开,请从新申请相干权限。 2、如果静止记录为手动创立,请在查问时携带sourceType参数,接口详情请查看“查问已创立的静止记录”。 Q3:Health Kit对于获取历史数据问题【问题形容1】 利用曾经开明了历史数据拜访权限,同时用户在受权页面曾经勾选了”历史数据“项,调用healthkit的rest接口查问衰弱数据,那么用户受权之前一年的衰弱数据是否都能被查问到呢? 【解决方案】 当用户授予利用“读取历史数据”(一周、一月、一年)权限时,开发者可查问的用户数据工夫范畴从用户受权工夫向前推移对应的工夫。如果用户已受权一年的权限,则能够查问用户受权工夫前一年内的衰弱数据。 【问题形容2】 获取一周中的每天步数总数,须要申请哪些权限? 【解决方案】 须要申请历史数据权限,应用历史数据权限,须要在认证鉴权时的scope参数中增加历史数据权限,供用户抉择受权。 REST API 周的历史数据权限:https://www.huawei.com/healthkit/historydata.open.week Android 周的历史数据权限:Scopes.HEALTHKIT_HISTORYDATA_OPEN_WEEK 点击查看REST接口认证鉴权、点击查看Android认证鉴权、点击查看读取历史数据操作:REST、Android。 Q4:调用Health Kit接口呈现获取不到数据的状况【问题形容1】 曾经在华为衰弱App中绑定设施,并确认有步数等信息且同步到了云端,但通过开发者接口无奈获取。 【解决方案】 请确认Health Kit登录的账号和静止衰弱App中有数据的账号是同一个,并查看在静止衰弱App 隐衷治理中是否关联了华为静止衰弱服务,如果未关联,无奈获取数据。如何判断用户是否关联了华为静止衰弱服务? 形式一:在静止衰弱App 隐衷治理中,查看是否已开启标记②中的华为静止衰弱服务。 ...

September 26, 2023 · 1 min · jiezi

关于android:Android逆向技术高阶大法

原文链接 Android逆向技术高阶大法安卓利用是一个客户端,与传统软件相似,须要把软件打包,而后通过某种渠道(利用市场)分发给用户,这是惯例的公布形式,它的更新节奏很慢,从你在利用市场上更新后,到用户真正的执行降级,这两头很慢的,而且很多用户基本不会降级新版本,这对于互联网来说是极不敌对的。传统的互联网,用户刷新一下网页后,就能看失去更新了,但对于客户端,这行不通,要想实现小时级别的公布和分钟级别的问题修复,正规的公布渠道是做不到的。于是各路大神和专家开始钻研客户端的前端化,也就是使用各种技术能让公布,特地是一些问题修复性的小规模公布能够更快的传递到用户手中。 这与正向办法不一样,谷歌或者水果针对 利用市场有明确 的流程的,这是惯例公布也即是正向形式。明天咱们来聊一聊非正向办法,非常规形式,来实现小模块的公布和热修复。 核心技术原理任何一项技术都离不开编程语言和操作系统上的反对,对于插件化技术来说,最为外围的原理就是Java反对反射,这是一种运行时批改代码的技术,另外就是动静代理,这是插件化可行的基本技术撑持。 说到底,Java仍是一种解释型语言,它的外围是JVM,即也虚拟机,咱们所相熟的Java编程语言,实质上是套在JVM上的一层语法规定,换了一种语言规定也是可行的。就好比Kotlin,Scala和Groovy它们的语法与Java相差很大,但它们编译过后的字节码是完全符合JVM标准的,能够间接运行在JVM之上。 其余的纯解释型语言,如Python和JavaScript,它们在运行时能够动静的加载一段源码,这即是动态化,能够实现真正的插件化,运行时间接加载运行一段代码。Java略变态一些,但它实质上是JVM,而JVM通过反射和动静代理,在肯定水平上反对了相似的动态化,就是通过ClassLoader来动静加载一些编译好的Class。 此为插件化的外围原理。 动静代理机制,能够读这几篇文章: 动静代理大揭秘,带你彻底弄清楚动静代理动静代理Java的动静代理(dynamic proxy) java动静代理实现与原理详细分析小白也能看懂的插件化DroidPlugin原理(一)-- 动静代理Hook大法有了外围原理,才有可行的计划。Hook次要钻研三方面内容,一是钻研ClassLoader,因为不同的dex分属于不同的层级,它们的ClassLoader不一样,反射的第一步就是要能加载到想要的Class,这个要靠找到适合的ClassLoader;二是动静代理机制,hook的外围原理就是用动静代理机制,创立一个Mock对象用以替换掉原来的,所以接口Interface是要害,原零碎设计中必须应用大量接口,并且是以规范形式应用的(没有强制向下转型downcast),这样你创立进去的动静代理去替换才是平安的;三就是学习安卓系统核心组件 的流程,以找到最佳的hook地点。 其实,第3条才是对大部分人最为无益的。 具体如何做hook,能够参考以下文章: Android 插件化原理解析——Service的插件化Android 插件化原理解析——Hook机制之AMS&PMS摸索Android开源框架 - 10. 插件化原理小白也能看懂的插件化DroidPlugin原理(二)-- 反射机制和Hook入门因为安卓版本升级的起因,下面这几个文章都生效了,例子行不通了。然而这几遍对于原理解释的还是相当分明的。 以下文章对于新版本也是实用的。 基于Android9.0的Hook Activity 的启动(插件化)Android Hook Activity 的几种姿态Activity插件化原理第一种计划:Hook InstrumentationActivity插件化原理第二种计划:Hook IActivityManager拦挡Activity的启动流程绕过AndroidManifest检测须要留神的是,hook这件事件,最根底的技术很简略,就通过反射来替换对象,把零碎中的对象替换为仿造的,仿造有三种形式,一是间接创立,这须要类是比较简单的状况,并不需要凋谢进去,通过反射所有皆可创立;二是持续,这个对于简单对象也能仿造,如Instrumentation,然而须要类是凋谢进去的;三是接口,通过动静代理 创立仿造对象(也即代理 )。核心技术就这些。其余的,全是对于零碎代码的了解,找到可行的关键点来进行hook。 另外就是,谷歌对逆向办法限度越来越严了,反射零碎的货色,会有限度,有时仅是打印日志,但指不定哪天就不给反射了。 Accessing hidden field Landroid/app/ActivityManager;->IActivityManagerSingleton:Landroid/util/Singleton; (light greylist, reflection)插件化原理学习一门技术最好的形式就是去研读优良的开源库的源码,对于插件化,当初有很多比拟成熟 的开源框架存在了,能够挑几个比拟有代表性的来钻研 一下。 DroidPlugin这个基于动静代理创立的插件办法,较为风行,外面有大量的hook技术,网络上也有很多解析此框架的文章,能够帮忙了解。 它用了大量的hook,长处就是插件自身能够是失常的apk,无太多的限度,就用惯例的app开发方式开发就好,这是它的最大劣势,因为对插件无限度,所以框架自身就须要做大量的hook,是学习hook技法的良好例子。 DL : Apk动静加载框架这个是以动态代理为根底创立的插件框架,并没有大量的hook,能够参看它的解析文章。 任大神的框架适配性较好,基本上是纯软件层的技术(动态代理),没怎么hook。当然毛病也相当显著,就是对于插件的开发要求很刻薄,必须实现框架自身自定义的一坨货色,与安卓规范的app开发差别较大,且越来越大,并且对于打包和开发过程并无工具反对,在理论利用过程中较为麻烦。退一步讲,并未有真正达到插化的目标,它对插件的限度较大。 当初曾经根本没人用了,不过这属于开山之作。 Qigsaw这个与其余插件框架的最大差异在于,它最靠近于官网的货色(App bundle),它的重点在于我的项目模块化和打包下面,对于惯例了解上的『插件』所做的事件特地少,hook特地少,装置和加载插件的过程比拟很简略,靠近原生,外围在于它的打包过程。这里有具体的介绍。 另外,包建强的书《Android插件化开发指南》也能够读一读的,书的益处在于,它毕竟是一个整体,从根底的技术原理到hook原理都有讲,还是相当不错的。不过书比拟旧了 ,要联合作者的勘误,以及网上的文章一起来消化了解。 热修复原理除了插件化,另外一个大厂热衷的技术便是热修复,这也是大厂头部利用的标配技术。其实插件化,也能实现热修复,比方某个插件,个别是厂里的一个业务,出问题了,紧急打包公布一个修复的版本,而后更新插件。不过,这略显轻便,相当于用牛刀去杀鸡了,总之就是效率不高。 真正的热修复技术考究效率,且要玲珑,针对 点对点式的修复。它的外围原理就是替换,用反射去替换类(批改dex classloader中的dex程序),以及对办法的替换(侵入虚拟机中的method表,进行替换),还分冷失效(类替换个别是冷失效,也即下次启动时失效)和热失效(办法替换个别是热的,下次调用此办法时就失效了,因为它并不波及classloader,无须要从新加载类),还有插桩式的,在代码中间接插桩,先查看有没有patch,有patch就先运行patch(这个思路最简略,适配性也好,但履行难度大,须要对现有代码进行插桩)。 这几篇文章有比拟具体的探讨。 Android热修复技术原理详解Android热修复技术,你会怎么选?摸索Android开源框架 - 11. 热修复原理具体的热修复工具xposed派别也即原生的Xposed和Xposed framework以及大阿里的衍生版本dexposed。 ...

September 25, 2023 · 1 min · jiezi

关于android:Android-桌面App启动与startActivity流程

本文基于android13-release源码浏览整顿 零碎源码地址:init.h - Android Code Search 1.前言紧接上篇[Android零碎Launcher启动流程)]咱们持续看看Launcher是如何运行并加载所有桌面利用,继而探索用户在launcher桌面点击App图标启动利用整体流程 2.Launcher运行及生命周期办法相熟Android开发的同学在启动模拟器显示桌面后,咱们能够直观看到模拟器顶部搜寻框,工夫日历小部件,可拖拽利用区域,底部导航批示条以及快捷启动图标,利用文件夹等,基于零碎UI层级展现形式,咱们通过源码逐渐探寻其工作形式.上面咱们从onCreate()函数开始 源码地位:packages/apps/Launcher3/src/com/android/launcher3/Launcher.java 2.1 Launcher.onCreateprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //获取LauncherAppState实例,次要解决IconCache,IconCacheProvider、LauncherModel对象初始化及凋谢对外调用办法 LauncherAppState app = LauncherAppState.getInstance(this); mOldConfig = new Configuration(getResources().getConfiguration()); //LauncherAppState中定义对外调用办法 mModel = app.getModel(); mRotationHelper = new RotationHelper(this); //依据屏幕宽高读取最靠近设施文件信息,用于桌面图标大小,行列数配置 InvariantDeviceProfile idp = app.getInvariantDeviceProfile(); initDeviceProfile(idp); idp.addOnChangeListener(this); //存储库SharePreferences mSharedPrefs = Utilities.getPrefs(this); mIconCache = app.getIconCache(); mAccessibilityDelegate = createAccessibilityDelegate(); //初始化拖拽布局控制器 mDragController = new LauncherDragController(this); //解决所有app在桌面拖拽图标时的动画 mAllAppsController = new AllAppsTransitionController(this); mStateManager = new StateManager < >(this, NORMAL); //关联存储库SharePreferences mOnboardingPrefs = createOnboardingPrefs(mSharedPrefs); //小部件治理helper mAppWidgetManager = new WidgetManagerHelper(this); mAppWidgetHost = createAppWidgetHost(); mAppWidgetHost.startListening(); //加载launcher xml inflateRootView(R.layout.launcher); //设置所有apps view,放在上面大节独自剖析 setupViews(); //淡入淡出动画 crossFadeWithPreviousAppearance(); //设置监听NotificationListener,PopupDataProvider次要解决长按app图标显示内容 mPopupDataProvider = new PopupDataProvider(this: :updateNotificationDots); //状态解决相干 boolean internalStateHandled = ACTIVITY_TRACKER.handleCreate(this); if (internalStateHandled) { if (savedInstanceState != null) { // InternalStateHandler has already set the appropriate state. // We dont need to do anything. savedInstanceState.remove(RUNTIME_STATE); } } restoreState(savedInstanceState); mStateManager.reapplyState(); if (savedInstanceState != null) { int[] pageIds = savedInstanceState.getIntArray(RUNTIME_STATE_CURRENT_SCREEN_IDS); if (pageIds != null) { mPagesToBindSynchronously = IntSet.wrap(pageIds); } } //LoaderTask相干操作,放在上面大节独自剖析 if (!mModel.addCallbacksAndLoad(this)) { if (!internalStateHandled) { Log.d(BAD_STATE, "Launcher onCreate not binding sync, prevent drawing"); // If we are not binding synchronously, pause drawing until initial bind complete, // so that the system could continue to show the device loading prompt mOnInitialBindListener = Boolean.FALSE: :booleanValue; } } // For handling default keys setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); //设置页面布局 setContentView(getRootView()); if (mOnInitialBindListener != null) { getRootView().getViewTreeObserver().addOnPreDrawListener(mOnInitialBindListener); } getRootView().dispatchInsets(); //注册屏幕敞开播送监听 registerReceiver(mScreenOffReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF)); //更新UiState、Theme(Dark/Light) getSystemUiController().updateUiState(SystemUiController.UI_STATE_BASE_WINDOW, Themes.getAttrBoolean(this, R.attr.isWorkspaceDarkText)); //hook生命周期办法 if (mLauncherCallbacks != null) { mLauncherCallbacks.onCreate(savedInstanceState); } mOverlayManager = getDefaultOverlay(); PluginManagerWrapper.INSTANCE.get(this).addPluginListener(this, LauncherOverlayPlugin.class, false /* allowedMultiple */ ); //屏幕旋转切换配置初始化 mRotationHelper.initialize(); TraceHelper.INSTANCE.endSection(traceToken); mUserChangedCallbackCloseable = UserCache.INSTANCE.get(this).addUserChangeListener(() - >getStateManager().goToState(NORMAL)); if (Utilities.ATLEAST_R) { getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_ADJUST_NOTHING); } setTitle(R.string.home_screen);}launcher类中onCreate()会初始化LauncherAppState实例,用于获取Icon/LauncherModel对象,读取设施文件信息以匹配桌面图标及行列数,初始化SharedPreferences,布局拖拽控制器,设置布局xml,apps view,以及LoaderTask相干操作,设置页面布局及其它配置信息,上面咱们来看看源码中setupViews()办法 ...

September 25, 2023 · 12 min · jiezi

关于android:Android系统Launcher启动流程

本文基于android13-release源码浏览整顿 零碎源码地址:init.h - Android Code Search 前言以往咱们开发Android利用都在零碎桌面点击关上,但桌面Launcher过程是如何加载并展现利用窗口未能深刻理解,由此去窥探Android零碎整体启动流程以加深对Android开发体系的了解 1.Android系统启动外围流程当开机键按下时Boot Rom激活并加载疏导程序BootLoader到RAM启动kernal swapper过程(idle)pid=0初始化过程治理,内存治理加载Binder\Display\Camera Driver创立kthreadd过程(pid=2),初始化内核工作线程kworkder,中断线程ksoftirad,内核守护过程thermal创立init过程2.init过程源码解析2.1 init过程性能如下: 解析init.rc配置文件,首先开启ServiceManager和MediaServer等要害过程init过程fork启动Zygote服务过程解决子过程的终止(signal形式)提供属性服务的性能源码文件门路 : system/core/init/main.cpp) int main(int argc, char** argv) { ... //设置过程和用户的过程执行优先级 setpriority(PRIO_PROCESS, 0, -20); //init过程创立ueventd子过程解决设施节点文件,通过ColdBoot.Run()办法冷启动 //具体细节地位:/system/core/init/ueventd.cpp if (!strcmp(basename(argv[0]), "ueventd")) { return ueventd_main(argc, argv); } if (argc > 1) { if (!strcmp(argv[1], "subcontext")) { //内核日志初始化,文件地位:/system/libbase/logging.cpp //[logging.cpp - Android Code Search](https://cs.android.com/android/platform/superproject/+/android13-release:system/libbase/logging.cpp;drc=715a186b5d8903d30c25299ed0ecff0e2e9fbb9c;bpv=1;bpt=1;l=337?hl=zh-cn) android::base::InitLogging(argv, &android::base::KernelLogger); //文件地位:/system/core/init/builtins.cpp,获取内核函数传递给“subcontext” const BuiltinFunctionMap& function_map = GetBuiltinFunctionMap(); //subcontext过程 return SubcontextMain(argc, argv, &function_map); } if (!strcmp(argv[1], "selinux_setup")) { return SetupSelinux(argv); } if (!strcmp(argv[1], "second_stage")) { return SecondStageMain(argc, argv); } } return FirstStageMain(argc, argv);}2.2 过程优先级setpriority(PRIO_PROCESS, 0, -20); ...

September 25, 2023 · 29 min · jiezi

关于android:Java深入研究ThreadPoolExecutor线程池

在Java代码中咱们经常会开启异步线程去执行一些网络申请,或是开启子线程去读写文件,这些线程的开启与执行在并发量较小的场景下能够失常运行,如果波及并发量比拟大、线程数量无限、响应速度要快的业务场景下,此时就不容许独自创立线程去执行工作,而是基于线程池治理、散发线程机制去执行线程工作,从而升高资源耗费、进步响应速度,对立治理线程资源 线程池的创立与分类Exectors类是concurrent包下的用于疾速创立线程的工具类,该类中定义了一系列创立不同线程类型的静态方法,理论还是调用ThreadPoolExecutor类的有参函数,上面看下对应的办法源码 --- newFixedThreadPoolpublic static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());}--- 调用有参函数public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler);}newFixedThreadPool : 固定数量的线程池,可用于限度特定线程启用数量的场景,调用ThreadPoolExecutor构造函数中的参数定义如下 corePoolSize : 外围线程数量maximumPoolSize : 最大线程数量keepAliveTime : 当线程的数量大于外围线程时,闲暇线程在终止之前期待新工作的最大工夫unit : 参数keepAliveTime的工夫单位workQueue : 寄存期待执行工作的阻塞队列,罕用的组赛队列如下 ArrayBlockingQueue : 基于数组的有界阻塞队列,遵循FIFO(先进先出)准则,构造函数提供设置队列大小参数,采纳ReentrantLock(基于AQS实现)获取重入锁,如果向已满的队列插入则以后线程阻塞LinkedBlockingQueue : 基于链表的无界阻塞队列,默认大小为Integer.MAX_VALUE,向该队列插入数据时会封装到Node<>节点所对应的链表中,队列外部应用了putLock和takeLock标识增加、删除锁,二者可并发执行SynchronousQueue : 单向链表同步队列,具体需查看源码(常识盲区,未钻研到该队列)PriorityBlockingQueue : 具备优先级排序的无界阻塞队列,默认以天然排序形式或者通过传入可比拟的Comparator比拟器进行排序threadFactory : 默认线程创立工厂defaultHandler : 回绝策略,默认应用ThreadPoolExecutor.AbortPolicy,示意当队列满了并且工作线程大于线程池最大线程数量,此时间接抛出异样, CallerRunsPolicy : 用于被回绝工作的处理程序,它间接在 execute 办法的调用线程中运行被回绝的工作;如果执行程序已敞开,则会抛弃该工作DiscardOldestPolicy : 抛弃最老的一个申请,也就是行将被执行的一个工作,并尝试再次提交当前任务DiscardPolicy : 默认抛弃被回绝的工作个别场景下默认应用ThreadPoolExecutor.AbortPolicy回绝策略 ...

September 25, 2023 · 2 min · jiezi

关于android:Android开发传习录之启航篇

作为Android利用开发者,除了把以后利用做好外,纵向的技术深度与横向的技术广度也要继续钻研学习,合纵连横方能立洪流而不倒!任何研发岗位大多数都要求一精多专,常见的招聘需要上"精通..."其实是心愿候选人有扎实的技术深度,其次是技术广度,上面列出我本人的钻研学习路线 Java在Android利用中应用的Java技术外围次要是围绕数据结构、多线程并发、设计模式、文件读写、反射注解以及GC垃圾回收和jvm调优,如下图所示 Android利用Android利用波及的技术点零散繁冗,须要每一位coder都有本人的常识结构图,除此之外第三方优良框架源码、组件化、插件化、热修复等动态化工程技术也须要了解把握,钻研学习其中的设计思维,如下图所示 Flutter跨平台以闲鱼技术团队为代表的Flutter技术利用领跑者目前曾经积淀很多内容,能够在GitHub\闲鱼公号\闲鱼博客之类前去探寻,其它技术团队也都在module或者局部新产品开始尝试接入Flutter,新技术都是在一直实际验证、修复问题的路线上进行欠缺,Flutter中文网的作者也是实际该技术的大牛,如下图所示Flutter 细节原理还是很繁冗的,须要不断深入了解学习,目前还在摸索中... JNI-NDK区别于Android SDK基于Java语言,Android中的NDK基于C/C++,咱们能够把C++编写的代码通过NDK工具生成对应平台反对的文件,例如在Android中常见引入第三方的.so文件,在图片压缩解决、数据加密、日志记录、音视频流解决等场景下C++的效率要比Java高得多,native层波及C/C++语法,如下图所示 OpenGL ESOpenGL ES是跨平台的用于绘制2D/3D图形的接口API,在美颜相机、视频帧解决、图片解决等场景上利用宽泛,波及的专有概念比拟多,门槛也绝对比拟高,如下图所示 音视频利用Android音视频利用是绝对独立的技术畛域,目前市面上的短视频、直播等app都会用到相干技术,常见的音视频录制、播放、直播推流拉流等,如下图所示 Apk逆向加固Android apk的逆向与加固相爱相生,反编译也会用到apktool、dex2jar、jd-gui等工具,逆向、加固须要实战经验与较强的代码跟踪剖析能力,个别利用可能是基于代码混同+NDK加密+三方加固工具以晋升反编译难度,如下图所示 须要不断深入了解学习,目前还在摸索中... Android利用架构设计如果你感觉以上技能剑谱钻研的小有所成,那就开始摸索Android利用架构设计,学习Linux内核原理,framework层工作原理,钻研Google开源的Clean架构、Jetpack系列架构组件,组件化/插件化框架设计,从更高的层面去解决理论问题 算法数据结构与算法是技能剑谱修炼晋升的一大法宝,学习钻研惯例算法能够去LeetCode、剑指offer、牛客网以及其它博客书籍等,目前还在钻研中... 其它Coding相干Gradle插件设计、技术方案设计、英语学习 奉献开源社区GitHub公布开源我的项目,StackOverflow解答疑难,开源我的项目提交PR、issue等 内容阐明每个人都有本人钻研学习的方向与办法,而且在掘金、简书、集体博客上都有有数优良的文章对以上列出的【技术要点】深度分析,所以不作细节形容,留给每位读者自行摸索,以上列出的受限于集体技术把握水平还不够全面,可在下方评论区留言以补全【技能剑谱】, 至臻感激! 博客、开源我的项目链接以上技能要点,波及我的开源我的项目如下AudioCapturePlay 音频录制转码播放 AudioVideoCodec 音视频录制合成 MannaComponent Jetpack系列组件化 OpenGL OpenGL ES学习 湖广午王博客文章OpenGL学习博客

September 25, 2023 · 1 min · jiezi

关于android:Java深入研究HashMap实现原理

承接上篇《Java深入研究Collection汇合框架》文章中的HashMap、ConcurrentHashMap源码剖析,在Java中罕用的四个实现Map接口的类,别离是HashMap、TreeMap、LinkedHashMap以及继承自Dictionary抽象类的Hashtable,上面简略概述下各实现类的特点 : HashMap依据键的hashcode存储数据,容许null键/值(null键只容许一条,value能够有多条null),非synchronized、元素无序,程序也可能随时扭转,底层基于链表+红黑树实现【JDK1.8】 TreeMap实现SortedMap接口,能够依据键排序,默认按键值升序排序,也能够指定排序的比拟器,在应用时key必须实现Comparable接口,TreeMap在Iterator遍历是排过序的 LinkedHashMap属于HashMap的一个子类,保留了记录的插入程序,在用Iterator遍历LinkedHashMap时,先失去的记录必定是先插入的,也能够在结构时带参数,依照拜访秩序排序 Hashtable罕用性能跟HashMap相似,不反对null键/值,synchronized线程平安,Hashtable默认的初始大小为11,之后每次裁减,容量变为原来的2n+1.HashMap默认的初始化大小为16.之后每次裁减,容量变为原来的2倍,并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁 HashMap重要的常量定义DEFAULT_INITIAL_CAPACITY =16 默认容量MAXIMUM_CAPACITY =1 << 30 最大容量DEFAULT_LOAD_FACTOR = 0.75f 默认负载因子TREEIFY_THRESHOLD=8 链表转换红黑树的阀值UNTREEIFY_THRESHOLD=6 红黑树转换链表的阀值MIN_TREEIFY_CAPACITY=64 桶中bin最小hash容量,如果大于这个值会进行resize扩容操作,此值至多是TREEIFY_THRESHOLD的4倍HashMap构造函数首先看初始化容量、负载因子的有参函数源码 public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); if (initialCapacity > MAXIMUM_CAPACITY) initialCapacity = MAXIMUM_CAPACITY; if (loadFactor <= 0 || Float.isNaN(loadFactor)) throw new IllegalArgumentException("Illegal load factor: " + loadFactor); this.loadFactor = loadFactor; this.threshold = tableSizeFor(initialCapacity); }惯例的边界判断、赋值操作,通过tableSizeFor办法计算初始容量 HashMap put办法源码剖析 办法调用 public V put(K key, V value) { return putVal(hash(key), key, value, false, true); } 传入key的hash计算 static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); } 理论调用办法 final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { //部分node节点tab Node<K,V>[] tab; Node<K,V> p; int n, i; //将初始化的table赋值给tab并判null,如果为空则进行tab初始化 if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; //依据hash计算tab[i]地位,判断如果为空则调用newNode()存储新的node<K,V>中 if ((p = tab[i = (n - 1) & hash]) == null) tab[i] = newNode(hash, key, value, null); else { Node<K,V> e; K k; //依据hash值和equals判断key,如果key雷同就把老的node赋值给变量e if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) e = p; //key不同,判断是否时红黑树,如果是则调用putTreeVal()放在树中 else if (p instanceof TreeNode) e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value); else { //循环链表 for (int binCount = 0; ; ++binCount) { if ((e = p.next) == null) { //没有下一个元素,则把以后元素传入newNode()作为下一个元素 p.next = newNode(hash, key, value, null); //链表长度超过阈值TREEIFY_THRESHOLD=8 if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st treeifyBin(tab, hash);//转换成红黑树 break; } //判断key雷同则赋值替换 if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) break; p = e; } } //判断value是否替换 if (e != null) { // existing mapping for key V oldValue = e.value; if (!onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e); return oldValue; } } ++modCount; if (++size > threshold)//判断扩容阈值 resize();//扩容办法 afterNodeInsertion(evict); return null; }resize实现当put时,如果bucke占用水平曾经超过了DEFAULT_LOAD_FACTOR参数初始比例,就把bucket裁减为2倍,之后从新计算index,再把节点放到新的bucket中,源代码阐明如下 ...

September 25, 2023 · 5 min · jiezi

关于android:Java深入研究Collection集合框架

Java汇合框架位于java.util包下,次要蕴含List、Set、Map、Iterator和Arrays、Collections汇合工具类,波及的数据结构有数组、链表、队列、键值映射等,Collection是一个形象接口,对应List、Set两类子接口,Map是key-value模式的键值映射接口,Iterator是汇合遍历的迭代器,上面是整体框架图 汇合框架整体框架图在util包下还波及SortedMap、SortedSet接口,别离对应Map、Set接口,在concurrent包下有常见的ArrayBlockingQueue、ConcurrentHashMap、CopyOnWriteArrayList等实现类对Queue、Map、List接口的扩大实现,上面别离从List\Queue\Set\Map接口罕用实现类一探到底 ArrayList实现咱们先来看看初始化形式, private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};transient Object[] elementData;private int size;public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}从源码中定义的两个Object数组可知ArrayList采纳数组作为根本存储形式,在String字节码中也有定义数组,不过是private final char[] value,transient关键字次要是序列化时疏忽以后定义的变量;在ArrayList无参函数中给定默认数组长度为10,在理论开发中,个别如果能预知数组长度则会调用带有长度阈值的构造函数, public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity); }}源码办法中会间接依照指定长度创立Object数组并赋值给this.elementData,接下来持续看看没有指定数组长度时,数组是如何扩容从而满足可变长度?此时ArrayList中的add办法退场 public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true;}size为ArrayList中定义的int类型变量,默认为0,当调用ensureCapacityInternal(1),持续往下看 ...

September 25, 2023 · 5 min · jiezi

关于android:Java深入研究String字符串

提及String字符串,咱们更多的是用于文本的传输与存储,在JDK源码中也被申明为final类型,同时也不属于Java中根本的数据类型,例如以间接双引号申明的常量String nameStr="Manna Yang";或者采纳构造函数创立String nameStr=new String("Manna Yang");上面将逐渐揭开其神秘面纱... class字节码文件构造在探索String字符串常量池之前,咱们首先看下通过javap -v命令编译后的字节码 原始Java代码,通过javac编译为class, public class TestString{ private String testStr="Manna Yang"; public static int TYPE=0; public static void main(String[] args){ System.out.println("Manna Yang"); }}编译后的字节码 Classfile /C:/Users/15971/Desktop/TestString.class Last modified 2019-9-18; size 566 bytes MD5 checksum 72f3c93ff8293c97a3da06775fa48ba0 Compiled from "TestString.java"public class TestString minor version: 0 major version: 52 flags: ACC_PUBLIC, ACC_SUPERConstant pool:#1 = Methodref #8.#22 // java/lang/Object."<init>":()V#2 = String #23 // Manna Yang#3 = Fieldref #7.#24 // TestString.testStr:Ljava/lang/String;#4 = Fieldref #25.#26 // java/lang/System.out:Ljava/io/PrintStream;#5 = Methodref #27.#28 // java/io/PrintStream.println:(Ljava/lang/String;)V#6 = Fieldref #7.#29 // TestString.TYPE:I#7 = Class #30 // TestString#8 = Class #31 // java/lang/Object#9 = Utf8 testStr #10 = Utf8 Ljava/lang/String; #11 = Utf8 TYPE #12 = Utf8 I #13 = Utf8 <init> #14 = Utf8 ()V #15 = Utf8 Code #16 = Utf8 LineNumberTable #17 = Utf8 main #18 = Utf8 ([Ljava/lang/String;)V #19 = Utf8 <clinit> #20 = Utf8 SourceFile #21 = Utf8 TestString.java #22 = NameAndType #13:#14 // "<init>":()V #23 = Utf8 Manna Yang #24 = NameAndType #9:#10 // testStr:Ljava/lang/String; #25 = Class #32 // java/lang/System #26 = NameAndType #33:#34 // out:Ljava/io/PrintStream; #27 = Class #35 // java/io/PrintStream #28 = NameAndType #36:#37 // println:(Ljava/lang/String;)V #29 = NameAndType #11:#12 // TYPE:I #30 = Utf8 TestString #31 = Utf8 java/lang/Object #32 = Utf8 java/lang/System #33 = Utf8 out #34 = Utf8 Ljava/io/PrintStream; #35 = Utf8 java/io/PrintStream #36 = Utf8 println #37 = Utf8 (Ljava/lang/String;)V{ public static int TYPE; descriptor: I flags: ACC_PUBLIC, ACC_STATIC public TestString(); descriptor: ()V flags: ACC_PUBLIC Code: stack=2, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: aload_0 5: ldc #2 // String Manna Yang 7: putfield #3 // Field testStr:Ljava/lang/String; 10: return LineNumberTable: line 1: 0 line 2: 4 public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=1, args_size=1 0: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #2 // String Manna Yang 5: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 8: return LineNumberTable: line 6: 0 line 7: 8 static {}; descriptor: ()V flags: ACC_STATIC Code: stack=1, locals=0, args_size=0 0: iconst_0 1: putstatic #6 // Field TYPE:I 4: return LineNumberTable: line 3: 0}SourceFile: "TestString.java"Constant pool地位之前,顺次是对以后编译的class、最初批改工夫、MD5校验、Java的主要版本、主版本52(十进制的值,对应jdk 1.8,转换为16进制为34)、标记是否是public、是否调用超类构造方法Constant pool地位以下,从 #1 - #37 对应常量池区域,寄存办法签名以及定义的String字面值,例如#2对应#23 即是Java代码中private String testStr="Manna Yang"; #29 NameAndType 对应#11:#12 即是Java代码中的public static int TYPE=0;办法签名类型如下<center>签名字符办法类型 Bbyte Cchar Ddouble Ffloat Iint Jlong L援用类型 Sshort Zboolean [数组类型 VVoid类型 </center> ...

September 25, 2023 · 4 min · jiezi

关于android:Android实时将PCM转码MP3并播放音频

AudioCapturePlay基于AudioRecord录制原始pcm音频,应用开源库lame实时转换pcm音频为MP3格局音频,采纳Service、MediaPlayer播放MP3,提供录制音频计时器显示,音频音量分贝值显示,音频频谱显示,录制、播放状态管制等 我的项目地址独自音频录制播放(https://github.com/MannaYang/AudioCapturePlay)音视频录制合成(https://github.com/MannaYang/AudioVideoCodec)性能简介目前蕴含根本的音频录制、播放操作,性能如下: 基于AudioRecord录制原始PCM格局音频数据基于lame库实时转换PCM音频为MP3格局音频基于原始lame我的项目中C文件编译生成对应so文件、提供调用lame编码封装类基于FFT格式化PCM数据并实时显示音频频谱提供录制音频计时器显示、音量分贝值显示、录制开始、暂停、持续等状态管制与文件写入提供AudioPlayManager对象管制MediaPlayer播放、暂停、持续状态、Timer定时更新SeekBar进度条提供ObjectAnimator形式实现唱针、唱片旋转、还原动画操作其它音频格式: wav、m4a、aac可在录制PCM格局实时回调中增加相应头文件、转换操作lame编解码lame_encode_buffer_interleaved 该办法为传入双声道音频buffer,如果AudioCapture中应用AudioFormat.CHANNEL_IN_STEREOlame_encode_buffer 该办法为传入单声道音频buffer,如果AudioCapture中应用AudioFormat.CHANNEL_IN_MONOChronometer、RoundedBitmapDrawable控件类Chronometer为原生计时器,提供计时、倒计时等性能,初始格局为00:00,通过setFormat格式化为00:00:00,暂停、持续计时需减掉已计时工夫戳RoundedBitmapDrawable可作为圆角Bitmap应用,通过setCornerRadius、setCircular可实现圆角设置、圆型公共库蕴含录音管制类、lame编解码cpp文件、编译so文件、Service播放管制类,应用形式参见app中AudioCaptureActivity.class截图展现录制开始、暂停、实现 : 音频文件 : 播放筹备 : 播放中 : 感激开源音频频谱柱状图 https://github.com/zhaolewei/MusicVisualizerlame编解码库 https://sourceforge.net/projects/lame/files/lame

September 25, 2023 · 1 min · jiezi

关于android:LeetCode-周赛上分之旅-47-前后缀分解结合单调栈的贡献问题

⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 常识星球发问。 学习数据结构与算法的关键在于把握问题背地的算法思维框架,你的思考越形象,它能笼罩的问题域就越广,了解难度也更简单。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起领会上分之旅。 本文是 LeetCode 上分之旅系列的第 47 篇文章,往期回顾请移步到文章开端\~ LeetCode 周赛 364T1. 最大二进制奇数(Easy) 标签:贪婪T2. 漂亮塔 I(Medium) 标签:枚举、前后缀合成、枯燥栈T3. 漂亮塔 II(Medium) 标签:枚举、前后缀合成、枯燥栈T4. 统计树中的非法门路数目(Hard) 标签:DFS、质数 T1. 最大二进制奇数(Easy)https://leetcode.cn/problems/maximum-odd-binary-number/description/题解(模仿)简略模拟题,先计算 $1$ 的个数,将其中一个 $1$ 置于最低位,其它 $1$ 置于最高位: class Solution { fun maximumOddBinaryNumber(s: String): String { val cnt = s.count { it == '1' } return StringBuilder().apply { repeat(cnt - 1) { append("1") } repeat(s.length - cnt) { append("0") } append("1") }.toString() }}class Solution: def maximumOddBinaryNumber(self, s: str) -> str: n, cnt = len(s), s.count("1") return "1" * (cnt - 1) + "0" * (n - cnt) + "1"class Solution {public: string maximumOddBinaryNumber(string s) { int n = s.length(); int cnt = 0; for (auto& e : s) { if (e == '1') cnt++; } string ret; for (int i = 0; i < cnt - 1; i++) { ret.push_back('1'); } for (int i = 0; i < n - cnt; i++) { ret.push_back('0'); } ret.push_back('1'); return ret; }};复杂度剖析: ...

September 24, 2023 · 9 min · jiezi

关于android:活动报名-个推数据驱动运营增长城市巡回沙龙上海站来了

现在很多互联网企业正在减速数智化降级,心愿通过使用数据以实现降本提效和经营增长。为帮忙更多搭档在工作中“用好”数据,晋升经营效率与成果;同时和更多对用户经营感兴趣的搭档,共创、共享数智经营实际成绩,个推重磅启动了「数据驱动经营增长」城市巡回沙龙打算。 10月18日(周三),个推「数据驱动经营增长」城市巡回沙龙·上海站行将来袭!来自网易云音乐、哈啰出行、携程智行火车票等头部APP的增长负责人及个推经营专家,为你带来“数据增能,高效晋升用户经营价值”的翻新思路,分享数智化经营实战经验。 还有超多精美礼品等你哦,连忙报名&预约直播吧! 流动报名入口:https://www.huodongxing.com/event/5721397973900?td=6491935458234 个推「数据驱动经营增长」城市巡回沙龙·上海站流动主题: 数据增能,高效晋升用户经营价值流动工夫:2023年10月18日 (周三)流动地点:上海市徐汇区东安路888号尚享汇B1层HA Design Centre 流动亮点:关上经营增长新思路,行业大咖解析数智增长体系落地要点解锁行业落地新场景,头部APP分享数智化经营实际干货洞察业务增长新机会,增长专家共探APP用户经营新门路 流动流程: 分享嘉宾用户增长专家 徐梓超十几年产品经营与增长教训,曾负责美团、网易等大厂的用户增长实战。网易云音乐平台经营总监 曹鲁豫曾负责盒马鲜生、天猫超市的用户经营与体验,曾合伙创立过C+轮的人工智能公司,领有横跨内容与电商的用户增长经验。哈啰出行根底算法负责人 贾立负责哈啰出行营销、搜寻举荐、NLP、视觉等算法工作,10年搜寻/广告举荐算法老兵。主导过多个广告平台及营销算法体系从0到100不同阶段的建设。携程智行火车票用户经营负责人 王银笛负责智行业务线用户经营。从0到1主导构建以用户分层和生命周期为根底的增长经营体系,打造智能工具,落地经营体系。个推资深产品专家 袁紫微深耕数据增长畛域多年,服务过泛滥头部APP,领有丰盛的数据驱动决策及增长教训。 现场福利: 流动报名: 对于个推「数据驱动经营增长」城市巡回沙龙:通过“数据驱动”开掘更深层的用户价值,晋升经营效率与成果,已成为互联网人的经营共识。每日互动 (个推)联合本身数智化经营实战经验,打造「数据驱动经营增长」城市巡回沙龙,邀请互联网增长专家、行业头部APP运营官等,分享经营增长翻新思路和实战经验,助力企业实现突破性增长。本次上海场流动,特别感谢鸟哥笔记、经营喵、商业新知、APP干货铺子、弯弓等平台的大力支持!也期待和各位APP运营官、增长官相聚上海,共探APP经营破局进阶之道!  

September 21, 2023 · 1 min · jiezi

关于android:Android-增量构建的科技与狠活

本文作者:jungle形容最近生存中大家遇到的科技与狠活较多,当android的构建用上科技与狠活会不会倒沫子呢,让咱们刮目相待。 前言对于 Android 利用,尤其是大型利用而言,构建耗时是令人头疼的一件事。动辄几分钟甚至十几分钟的工夫更是令大部分开发人员苦不堪言。而在理论开发过程中面对最多的就是本地的增量编译,尽管官网对增量编译有做解决,但在具体我的项目,尤其是中大型项目中,成果其实都不太现实。 背景目前网易云音乐及旗下 look 直播,心遇,mus 等 app 先后采取了公共模块 aar 化,应用最新 agp 版本等措施,但整体构建耗时仍然很久,增量构建个别在 2-5 min 左右。因为自己以后次要是负责开发 mus 的业务,因而联合目前 mus 的理论构建状况对增量构建做了一些优化工作。 耗时排查联合 mus 构建的具体情况来看,目前构建耗时的大头次要集中在一些 Transform 和 dexMerge ( agp 版本 4.2.1 )。 对于 Transform 而言,次要是一些例如隐衷扫描,自动化埋点等工具耗时重大,通常增量时这些 Transform 的耗时就达到数分钟。 另外 dexMeger 工作也是增量构建时的大头,mus 增量 dexMerge 耗时约为 35-40s ,云音乐 dexMerge 增量构建耗时约 90-100s 。 优化方向对于大型项目而言,最耗时的根本就是 Transform 了,这些 Transform 个别分为以下两类: 功能型 Transform,移除只会影响本人的性能局部,不影响构建产物和我的项目运行。例如:埋点校验,隐衷扫描。强依赖型 Transform ,移除影响编译或我的项目失常运行。这部分通常是在 apt 中采集一些信息,而后在 Transform 执行时生成 class ,在运行时调用执行。功能型 Transform 能够通过编译开关和 debug/release 判断,防止在开发时调用执行。对于强依赖的 Transform 能够通过字节开源的 byteX 之类的工具将 Transform 流程拍平,对增量和全量编译都有成果。然而 byteX 的侵入性较大,须要将现有的 Transform 改成字节提供的 Transform 的子类。这里咱们采纳一种批改构建输出产物的轻量级计划来实现 Transform 增量构建的优化。 ...

September 20, 2023 · 5 min · jiezi

关于android:北京小程序开发微信小程序开发时间总结

一、双线程模型 渲染线程和逻辑线程 小程序的双线程指的就是渲染线程和逻辑线程,这两个线程别离承当UI的渲染和执行 JavaScript 代码的工作 渲染线程应用 Webview 进行 UI 的渲染出现。Webview 是一个残缺的类浏览器运行环境,自身具备运行 JavaScript 的能力,然而小程序并不是将逻辑脚本放到 Webview 中运行,而是将逻辑层独立为一个与 Webview 平行的线程,应用客户端提供的 JavaScript 引擎运行代码,iOS 的JavaScriptCore、安卓是腾讯 X5 内核提供的 JsCore 环境以及 IDE 工具的 nwjs 并且逻辑线程是一个只可能运行 JavaScript 的沙箱环境,不提供 DOM 操作相干的 API,所以不能间接操作 UI,只可能通过 setData 更新数据的形式异步更新 UI 事件驱动的通信形式 你要留神上图渲染线程和逻辑线程之间的通信形式,与 Vue/React 不同的是,小程序的渲染层与逻辑层之间的通信并不是在两者之间间接传递数据或事件,而是由 Native 作为两头媒介进行转发。 整个过程是典型的事件驱动模式: 渲染层(也能够称为视图层)通过与用户的交互触发特定的事件 event;而后 event 被传递给逻辑层;逻辑层继而通过一系列的逻辑解决、数据申请、接口调用等行为将加工好的数据 data 传递给渲染层;最初渲染层将 data 渲染为可视化的 UI。总的来说,跟浏览器的线程模型相比,小程序的双线程模型解决了或者说躲避了 Web Worker 堪忧的性能同时又实现了与 Web Worker 雷同的线程平安,从性能和平安两个角度实现了晋升。能够概括地说,双线程模式是受限于浏览器现有的过程和线程管理模式之下,在小程序这一具体场景之内的一种改良的架构计划。 留神:浏览器中Worker 内的 JavaScript 代码不能操作 DOM,能够将其了解为线程平安的 性能方面 在保障性能的前提下尽量应用构造简略的 UI;尽量升高 JavaScript 逻辑的复杂度;尽量减少 setData 的调用频次和携带的数据体量。二、 小程序的用户体系与 OAuth 标准  ...

September 19, 2023 · 4 min · jiezi

关于android:玩转安卓运行速度优化

原文链接 玩转安卓运行速度优化早在许多年以前写过一篇安卓性能优化文章,时过境迁,很多事件都有了变动,所以再专门针对程序运行速度和渲染的优化,这两方面十分间接的影响应用程序的操作晦涩度,也能够称作晦涩度优化办法,但更为业余的形式就是CPU优化,因为就是要进步代码的运行速度。 须要优化的中央总的来说,就是利用程序运行要快,大体能够分为三块: 利用启动要快从用户点击了桌面的图标到用户能残缺见到页面,这个过程要快。其实也不是快,而是没有能从用户感知失去的卡,或者黑屏或者白屏。 渲染要快也就是说View的渲染要快,无显著的Jank,也即卡顿和丢帧。 操作要晦涩次要是针对动画,滑动,转场的时候要晦涩,也并不一定就是要真的快,而是说从用户感知的角度来看没有显著的卡顿和丢帧。 业务逻辑要快也就是说要疾速的实现你的业务逻辑,这个其实没有方法一概而论,取决 于具体的业务逻辑和理论的应用场景,比方网络不好的时候必定啥都慢啊。 咱们常说的性能优化,个别重点是在启动,渲染和操作晦涩度下面下功夫,因为这些货色的优化办法更为通用一些,用户感知也更显著一些。也将是咱们前面要探讨的重点内容。而至于像业务逻辑,每个具体的应用程序都不一样,所以没有方法一概而论,而惯例的一些小的优化技巧也不会起决定性应用。比如说I/O优化办法,缓存的应用,以及像内存优化等等,的确能帮忙你的业务逻辑。但如果业务逻辑就是特地简单,或者代码写的很差劲,明明一个网络申请就能搞定的事儿,非要弄四五个申请,那你再怎么优化细节,比方把每个申请速度都优化到最好,I/O优化到最好,也是没有多大晋升的。 运行速度分析方法后面提到的启动优化,渲染优化和操作晦涩度优化,其实都是针对CPU的优化,也即代码执行的优化,只不过重点剖析那三个场景而已。 具体的分析方法次要就有两方面,一是用Profiler抓取trace,另外就是能够在代码中退出打点数据。 能够后行用代码代码打点的形式进行粗略的量化,比如说看onCreate执行了多久,看onResume执行了多久,这有两方面益处,一是能够粗略的定位问题,二是不便监控,比方你优化前与优化后的比照,能晓得到底是否真的有晋升。 精细化剖析的办法就是抓trace,而后看具体哪里耗时了,具体应用办法可参前面的列举的资源都相当具体,就不反复了。 须要留神的就是剖析trace时除了用Profiler以外,还能够用Perfetto,这个性能更为弱小。 优化办法具体的优化办法,就没有银弹了,做的事件特地多,代码特地简单,逻辑特地多特地简单,优化起来难度天然很大。 外围的准则就是少,少即是多,少做事,特地是主线程,能lazy则lazy,能异步则异步,波及I/O时,要多用BufferedStream,巧用缓存,buffer尽可能要是8k大小(8192),有重I/O的场景要用nio库。View tree要尽可能精简和扁平,某些非凡条件才会显示的页面就用ViewStub先占着等等。 参考资料Android 性能优化总结Inspect CPU activity with CPU ProfilerOverview of system tracing手把手教你应用Systrace(一)Understanding SystraceOverview of measuring app performanceBenchmark your app性能剖析工具Systrace的应用详解Android Systrace 应用办法Android性能优化之CPU ProfilerCPU Profiler 使用指南原创不易,打赏,点赞,在看,珍藏,分享 总要有一个吧

September 18, 2023 · 1 min · jiezi

关于android:让你不再惧怕内存优化

原文链接 让你不再害怕内存优化之前已经写过一篇对于如何做性能优化的文章,当初针对内存这一专项再做精细化的探讨。对于安卓利用开发来说,内存到底会遇到什么样的问题,有什么办法能够用来测试和剖析,以及有什么样的策略能够去实际优化,明天就来好好聊聊这个话题。 缘起古代计算机是基于冯*诺依曼架构的,计算机的软件是运行在内存之中的,过程(也即运行中的程序)会消耗肯定的内存,才可能失常执行。在软件开发的中世纪,C和C++流行的时代,是由软件开发人员(下称猿)本人治理内存,也就是说猿本人申请内存,并解决申请不到内存的状况,并在应用实现后本人负责开释内存,这无疑会加大程序开发难度,产生一些难以调试的问题,如内存越界或者内存踩踏以及野指针。到了近现代,主动内存治理成为支流,研发人员不再用本人去手动治理内存了,只管用,可劲儿造,所有由GC(也即是Garbage Collector内存回收器)来善后。 这极大的解放了研发人员的双手,能够让他们把更多的精力放在接管产品经理的需要下面了,三天一小需要,一周一大需要,产品迭代速度相当快,业务倒退迅速,老板相当快乐啊,这干掉BAT不可企及,赶英超美就在今天,IPO触手可及。然而,事实是极其骨感的。 内存问题会引发什么问题对于安卓 应用程序来说,内存优化很重要,因为Java VM自身就是比拟耗资源的,当利用简单到肯定水平的时候,就会呈现由内存使用不当造成的问题。如,测试同学反馈说利用越用越卡,常常crash,用户也反馈说利用越来越不好用了。老板把老猿叫进办公室一顿骂,而后老板让老猿尽快来解决一下问题。 老猿只得把需要放一边,花工夫看一看这些问题,而后说凭我多年教训来看,这怕是内存出了问题。 后面提过,古代编程语言个别都有GC,帮忙研发人员治理内存。但因为各种起因,还是会呈现内存相干的问题。 特地是对于安卓猿来说,实现利用的编程语言是Java(精确说是JVM,Java和Kotlin 以及像Scala都是基于JVM的编程语言),天生反对GC,导致很多人对内存治理知之甚少。当应用程序简单到肯定水平,当源码宏大到肯定的量级时,性能问题,特地是内存性能问题便随之而来。 具体可能是内存呈现问题的场景有: OOM导致的crash。OOM,也即OutOfMemoryError,可能产生在任何中央,当Heap中可用内存有余时,便可能会遇到此类crash应用程序越用越慢,呈现黑屏或者白屏。UI操作呈现卡顿,不晦涩。造成UI卡,不晦涩的起因很多,当排除了其余起因时,就是内存问题了应用程序莫名闪退内存问题的具体类型及其起因要想做好内存优化,则必须先弄懂内存问题的根本原因,而后再对内存问题进行归类,最初是通过技术手段来解决。 内存问题的根本原因安卓应用程序是由Java构建的,而Java是反对GC的编程语言,所以安卓猿是不须要本人手动的去做内存治理的,只管不停的创建对象即可,Java虚拟机(JVM)会帮忙咱们治理内存,当有不必的对象时会主动被GC。 然而Java应用程序(当然也包含安卓)还是会遇到内存问题,次要是两类,一类是内存不合理应用,如内存应用过多,频繁创立大量对象,内存碎片等等;二是内存透露。很多人会把二者一概而论,网络上绝大多数文章一谈性能优化,一谈内存优化,必然说到内存透露,但其实并不谨严。内存透露的确是最常见的内存优化内容,也的确是内存应用不合理的最常见问题,但内存问题并不局限于内存透露。 内存应用不合理次要分为三个方面: 节约内存,简略来了解就是用一个人住着一千平米的大平层大量创立小对象,产生碎片,内存碎片会造成JVM中的内存管理效率变低,当前面申请大块内存的时候效率就变差,它须要把小对象(碎片)进行转移压缩,以腾出更大的空间给大的对象应用。简略了解,这个时候JVM的效率就会变差,你的应用程序性能变差,甚至可能引起卡顿。频繁创建对象,特地是较大的对象,造成内存抖动,也即应用程序应用的内存忽多忽少,会频繁的触发GC,从而影响JVM的运行效率。 内存透露JVM是反对主动GC的,也就是说JVM帮忙你治理内存,当有不再应用的对象时,会被JVM主动回收,此称之为GC(Garbage Collection)。但如果对象长期处于『应用』状态,并且超出了它本应该存的周期,无奈被及时GC,这就会造成透露。一般来说,这也没啥影响,然而如果透露的对象太多,或者透露的工夫够长,就会把零碎配额Java Heap空间耗尽,应用程序便会因没有内存创建对象而OOM,就会crash。即便没有crash,因为残余空间较少,会频繁触发GC,从而导致应用程序卡顿重大。 内存透露的根本原因是对象的生命周期错乱,对象存活了超过了其本该的生命周期,或者简言之,一个本该是较短的生命周期的对象被一个更长生命周期的对象所援用着,就会导致它本该生命周期完结时无奈被GC,便产生了透露。 这是要重点关注对象的生命周期,只有治理好了对象的生命周期,能力彻底的解决内存透露问题。 安卓利用中的生命周期固定生命周期的对象安卓应用程序外面,有一些是有固定生命周期的,或者说有显著生命周期,且不是由研发人猿本人管制的,如框架层管制的那一坨货色。 ActivityFragmentView特地是Activity,它也是内存透露的头等对象,90%的内存透露都是Activity对象。这货齐全由零碎框架管制,并且有显著的生命周期,而且还有重建实例的状况(波及状态复原时),所以它的生命周期其实相当短暂,并且它跟过程和主线程没有任何关系,Activity退出 了(走了onDestroy)过程仍还在,主线程也仍还在。而,又因为它是应用程序的第1级入口,应用程序所有的对象,以及GUI所有的货色,全副都由Activity间接或者间接持有,换句话说,Activity透露了,你整个应用程序的对象也基本上全透露了。 较长生命周期对象这里所谓的长生命周期,是指它们的生命周期是与过程绑定的,除非过程退出,或者显著的执行一些退出,否则始终随过程而存在: Looper,或者说音讯队列,这玩意儿除非被动quit,否则始终存在。主线程的Looper与过程同在,本人创立的Looper要手动退出才算终结。被static润饰的成员变量,这货色的生命周期是跟过程一样的单例,单例必须由static来润饰,所以与过程生命周期是一样的,过程在,则单例在线程池,或者一个长时间运行的thread,除非被动去shutdownRxJava的Schedulers,这玩意跟looper一样,都是长时间运行的音讯队列,且与过程绑定的零碎框架,手机还在开机零碎框架就在运行,所以它的生命周期远远长于某一个应用程序Application和ApplicationContext,这货色与过程生命周期是一样的,相当于单例了业务逻辑中的生命周期业务逻辑就纯属于应用程序的自身逻辑了,无奈一概而论,但一般来说,主页面的生命周期必定是长于某个子页面的。那么子页面在其退出后,实践上它的绝大多数对象应该要被回收。 如何发现内存问题生存中不是缺少美,而是短少发现。 对于内存优化,第一步就是要通过各种测试伎俩发现问题。最现实的状况是建设一种监控伎俩,这样最能保住反动果实,以及十分及时的发现问题。 这里指的是一般性的粗略伎俩来发现你的利用有内存问题了,可能须要优化了。并且这些测试方法最好能做成定期监控,这样一旦内存性能有回撤时,能尽快发现。 『队长,咱们裸露了』很多时候都是问题被动找上门来了。 后方有雷区很可怜,你的应用程序中弹身亡(crash了),还是OOM。这是Java语言中的一个运行时的谬误,可能在创立任何对象时产生,但一般来说创立比拟大的对象时,这里的大是指对内存需要大,如图片,或者大块数组时,更容易产生。 当你的应用程序呈现了OOM的时候,就是一个特地显著的信号,通知你要器重内存优化了。 遇到终结者了,是lowmemorykiller有时候,没有显著的谬误,然而利用却闪退了,特地是在后盾,或者跳到其余利用页面时。 这个会比拟荫蔽,通常会引发其余表象的问题。最显著的问题就是,当跳转到其余页面,再返回时,发现原来的页面状态不存在了,比方你的利用要拜访一个URL,跳转到了网页浏览器,但从浏览器返回时,要么你的利用不在了,要么你的利用的原先状态不在了。这其中的起因就是当你的利用不在前台了,就被零碎回收了,其中一个占大头的起因就是占用内存太多,被零碎的lmkd(lowmemorykiller)干掉了。 因为零碎要保障整个设施的失常运行,所以会把占用内存太多的先杀掉,以开释内存。 当你的利用频繁的遇到被lowmemory killer干掉时,也是一个显著的信号,要器重内存优化了。 读懂零碎GC日志有些时候不像后面那样重大,然而查看logcat日志时,能发现大量的GC日志,就像这样的 259857:01-08 20:00:17.836 10083 26337 26347 I test.test: NativeAlloc concurrent copying GC freed 141174(6852KB) AllocSpace objects, 29(12MB) LOS objects, 49% free, 24MB/48MB, paused 180us total 308.126ms279178:01-08 20:00:19.618 10083 26337 26347 I test.test: Background young concurrent copying GC freed 469755(20MB) AllocSpace objects, 40(3608KB) LOS objects, 41% free, 28MB/48MB, paused 396us total 124.817ms这是零碎在进行GC,通常来说这没有什么问题。但如果在短时间内,比方某个页面,点了某个按扭后大量呈现此类日志,也是一个显著的信号,通知你要器重内存优化了。 ...

September 11, 2023 · 2 min · jiezi

关于android:引爆用户参与消息重弹让您的推送不再被忽略

在以后各大APP拉新促活老本居高不下的大背景下,如何稳固存量用户、晋升用户粘性就显得尤为要害。从促销流动到个性化举荐,从互动告诉到性能揭示,音讯推送已成为各大APP连贯存量用户和指标市场之间的桥梁,通过点击推送,晋升用户活跃性和参与度,为中长期召回散失用户发明了必不可少的条件。  1、无人问津:为什么你的推送反馈寥寥无几  在传统推送服务中,时效性、推送范围广、弱打搅这三者之间往往难以同时兼顾。例如主打用户参加的社交媒体利用,对收到的评论、私信、点赞等互动的及时反馈是吸引用户深度参加,转化为付费用户的前提,但过于频繁的推送揭示往往会影响用户体验。随着越来越多的利用开启“推送轰炸”,单个音讯推送往往被吞没在潮水般的推送信息流中,留给单篇推送内容驻留在告诉栏上方的工夫所剩不多,被看到的机会天然少得可怜。 此时假使简略粗犷的减少推送频次试图引起用户留神,反而可能会事与愿违,在不失当的机会给不适合的用户推送其不喜爱的内容,激发用户恶感,导致敞开APP推送权限,甚至一劳永逸的卸载APP,减速催化了一批“缄默用户”,使得推送成果大打折扣。因而,如何借助大数据和人工智能,后人一步实现实现精准化、定制化推送至关重要。  2、音讯重弹:给你的推送多几次曝光机会  作为MobTech旗下一款业余的推送服务工具,近日,MobPush再次迭代降级,全新上线了音讯重弹性能。依靠其弱小的模型算法和大数据撑持,在保障音讯稳固下发的同时,以用户触达利用场景为核心,为开发者提供更灵便、更智能、更无效的音讯推送计划。 通过音讯重弹性能,APP开发者能够在创立推送时,可在安卓可选设置中关上音讯重弹开关。这样当推送被其余音讯挤下去时,能够立即实现推送内容从新登顶,引起设施用户的关注,减少音讯的曝光度和点击率。  同时,开发者也能够通过拜访推送API在可选设置中设置音讯重弹的次数,和重弹的工夫距离。其中重弹次数能够抉择1-5次,重弹工夫距离能够抉择五秒钟至一天,也就是说,通过自定义设置推送次数和距离的组合,同一推送内容将在最长继续五天内,有机会五次取得设施用户的关注,此时APP开发者举世无双、富裕吸引力的推送内容,注定不会被湮没在其余推送的信息轰炸中。 目前,Mobtech的音讯重弹性能已先后在社交媒体、游戏娱乐、影音资讯等APP中失去利用和验证,在晋升音讯达到率和点击率等方面体现出显著效果。某初创社交媒体利用旨在帮忙用户建设和扩大社交网络,分享生存时刻和互动交换,激励用户通过分享、转发等模式促成用户裂变,扩充利用辐射范畴,通过利用内虚构服务付费、广告支出、流动资助、品牌单干等路径,实现本身价值长效增长。因而该利用高度依赖推送内容激活沉睡用户,维持利用外部生态。在采纳Mobtech的一站式数智化推送服务所提供的音讯重弹性能后,利用的整体音讯推送点击率晋升了近160%。日沉闷用户(DAU)数量在一个月内增长了36.89%,流量点击转化率 (CTR)较之前减少了16%。其注册用户数和拉活率均较此前有显著增长,从而实现了用户留存到价值变现的良性循环。  将来,MobPush将会在后需性能迭代降级中在推送内容、推送工夫、推送模式上赋予开发者更多抉择,利用数据模型和算法迷信无效地筛选出最优推送内容,进一步晋升推送达到率,助力开发者实现用户增长。  

September 8, 2023 · 1 min · jiezi

关于android:解决Android-Studio-控制台中文乱码的四种方案

前言Android Studio 如果不进行配置的话,运行程序时控制台中文乱码问题会十分重大,甚至影响咱们对信息的获取和程序的跟踪。 通过历年的开发教训,在本文中我总结出四点用于解决控制台中文乱码问题的办法,心愿有助于大家。 留神:上面依据我日常工作的经验总结,排序的先后即为咱们须要留神批改的先后。在每次进行批改之后肯定要重启 Android Studio 使配置失效。 解决方案:1、在help中找到Edit Custom VM Options... 并关上文件,在文件中增加-Dfile.encoding=UTF-8 ,如下图: 2、在设置中找到File Encoding,外面都设置UTF-8,如下图 3、关上设置,搜寻font,批改设置字体(有的字体不反对中文,按需要抉择) 批改胜利乱码问题解决通过以上四种形式齐全能够批改咱们在 Android Studio 遇到的控制台中文乱码问题,心愿大家可能在看了本帖之后,请将你应用哪种办法进行批改胜利留言在本帖下方,给予更多人帮忙。 总结在本文中我总结了四种办法完满解决 Android Studio 控制台中文乱码问题,这里我再次强调一下:在每次进行批改之后肯定要重启 Android Studio 使配置失效。 另外,大家能够在评论区说一下到底哪种形式对你来说有用,也就是说哪种乱码问题最常见。对于 IDEA 的问题和一些技巧之类的博客,我之后会更加频繁的更新!好工具用起来!

September 6, 2023 · 1 min · jiezi

关于android:FAQHMS-Core推送服务推送角标的开发及常见问题解答

目录1、发送音讯并显示桌面数字角标。 2、如何革除数字角标? 3、如何设置圆点角标? 4、利用桌面图标角标开关无奈开启或未显示开关。 5、推送音讯设置了角标字段但未显示角标? 6、未设置角标参数,但收到音讯后显示了角标。 解决方案Q1:发送音讯并显示桌面数字角标。实现设施收到音讯后显示数字角标业务,须要在发送音讯时设置角标 “badge”字段,请参考以下示例及阐明。 音讯体示例: { "validate_only": false, "message": { "android": { "notification": { "title": "test title", "body": "test body", "click_action": { "type": 3 }, "badge": { "add_num": 1, "class": "com.zrgj.push.activity.MainActivity", "set_num": 10 } } }, "token": ["pushtoken1"] }}参数阐明:“add_num”:利用角标累加数字,在已有的角标数量上累加。参数为大于0小于100的整数。 “class”:设置角标门路,参数为利用入口Activity类的全门路。样例:com.example.hmstest.MainActivity “set_num”:设置角标数字,指定角标为设置的数量。 注意事项:“add_num”与“set_num”字段应用其一即可,如果同时设置以set_num为准。 Q2:如何革除数字角标?数字角标和告诉音讯没有关联,关上利用或者点击、清理告诉栏音讯并不会清理角标数字或圆点,客户端可配合业务需要应用以下办法革除。 示例代码:Bundle extra = new Bundle();extra.putString("package", "xxxxxx");//利用包名extra.putString("class", "yyyyyyy");//利用入口Activity类全门路extra.putInt("badgenumber", i);//i为0即可革除context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, extra);Q3:如何设置圆点角标?圆点角标无需开发配置,圆点角标和告诉栏音讯相关联,告诉栏中有利用音讯圆点是革除不了的,如果告诉栏没有利用音讯则圆点会主动革除掉。 开启形式:圆点角标需手动开启,以HarmonyOS 3.0零碎举例:设置->告诉和状态栏->桌面图标角标->角标显示方式(数字角标/圆点角标)。 Q4:利用桌面图标角标开关无奈开启或未显示开关。这种状况阐明未胜利设置过角标,只有胜利设置桌面角标后才能够开启或显示开关。 Q5:推送音讯设置了角标字段但未显示角标?1、查看是否同时设置了set_num为0,同时配置“add_num”与“set_num”以set_num数量为准。 2、查看“class”字段参数是否正确,参数为利用入口Activity类的全门路。(易错) 例如:com.huawei.codelabpush.MainActivity。 <activity android:name="com.huawei.codelabpush.MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>Q6:未设置角标参数,但收到音讯后显示了角标。查看是否只设置了“class”字段,设置了“class”字段“add_num”和“set_num”都设置为空,则利用角标数字默认累加1。 ...

September 5, 2023 · 1 min · jiezi

关于android:深入浅出Android同步屏障机制

原文链接 Android Sync Barrier机制诡异的假死问题前段时间,我的项目上遇到了一个假死问题,随机呈现,无固定复现法则,大量频繁随机操作后,便会呈现假死,整个利用无奈操作,不会响应事件,会产生各种奇怪的ANR,且trace不固定。十分之诡异。 通过大量的复现钻研和剖析, 以及大神的指导后,发现与同步屏障(Sync Barrier)有关系,于是发现有必要钻研一下这个货色。 什么是Sync Barrier机制这是安卓线程音讯队列外面的一个新减少的货色,这么说还是太形象,咱们从头说起这件事件: 安卓的音讯队列机制音讯队列,或者叫做Event Loop,通常在任何一个GUI应用程序外面都会有的,利用大部分工夫处于Idle状态,当有事件产生时,比方用户点了一个button,而后开始响应此事件。安卓也是一个GUI应用程序,绝大多数都是带有GUI的应用程序,那么安卓 外面是如何实现这个EventLoop的呢,它是用Looper和MessageQueue,以及Handler,以一种音讯队列的形式来实现loop。 有肯定教训的同学对这些货色必定不生疏,因为它们在理论的开发过程中相当常见,比如说对于UI的操作只能放在主线程外面,那么当工作线程想要更新UI时就须要用Handler发一个音讯,或者post一个Runnable。或者当你想延后一段时间执行某种操作,就能够用postDelayed。这些都是十分惯例的操作了。对于工作线程,如果想启用音讯队列,就用Looper#prepare就能够了,当然了,要记得quit。 外部原理下面也不是很简单,就是Looper会给线程绑定一个音讯队列,即是MessageQueue,这是一个有限循环的队列,一直的轮询队列,当有新的音讯时就去解决,否则就期待。主线程,安卓框架层在创立利用过程的时候就会给主线程默认创立好MessageQueue,所以就能够向其发消息(sendMessage)或者postDelayed,它们实质上都是一样的,都是向MessageQueue中入队一个音讯,稍后它便会失去解决。 同步音讯与异步音讯这个MessageQueue机制,就是队列,也就是说合乎队列的特点,先进先出(FIFO,First-In First Out),就是说你先post的音讯,必定是先被解决,后post的后处理,即便有delay时候,也是看谁先到,谁先到谁先被解决。因而,这外面的音讯全是同步,也就是说所有音讯都是程序解决,这就是同步音讯。 异步音讯,也就是说某个音讯,想被最高优先级解决,忽视发送音讯的机会,比如说队列外面有8个音讯,如何想让某个音讯最先被解决?这时队列就变成了优先队列,有优先级的队列。那么具备高优先级的音讯也是异步音讯(Asynchronous Message)。即便是最初退出队列的,但因为是异步音讯,它会被先解决,并不是FIFO,此可了解 为异步。 Sync Barrier用以实现优先队列说了这么多,Sync Barrier就是安卓 外部用以实现优先级队列的一种形式。 当队列中呈现Sync barrier(具体实现上就是Message#target为null)时,就会疏忽所有同步音讯,寻找异步音讯(isAsynchrouns为true)的音讯,而后优先解决它。 须要留神的是,把音讯标记为异步,以及向音讯队列中发送Sync barrier,这些API全部都是hide的,也就是说app中是无奈应用的,通过反射兴许能调用胜利,但危险也较大,后续会被谷歌限度调用。换言之,这货色只能在Frameworks层外部本人应用。 为什么要有Sync Barrier说了这么多,其实实质上,这货色就是一个优先队列,给要解决的音讯加一个优先级机制,那这有什么理论用处呢? 音讯队列这货色是在安卓一诞生就有了的货色,大部分时候它也没有什么问题。但有一个事件,就是安卓操作系统的UI晦涩度远不迭水果平台(iOS),起因就是在于水果平台的UI渲染是整个零碎中最高优先执行。 有同学会说安卓外面也是这样啊,你想UI都只能在主线程外面操作(因而主线程也叫UI线程)。只能在主线程中操作UI,就能保障UI渲染是最高优先级吗?当然不是了。因为整个应用程序的默认线程就是主线程,换句话说,如果你不显著的去做线程切换,或者启用工作线程,那么所有事件都产生在主线程外面,当然 也包含了UI渲染,因而UI的渲染与你在主线程时面post一个音讯的优先级是一样的。 如何让UI渲染在主线程中以最高优先级运行?于是就有了Sync barrier机制,这货色就是为了让音讯队列有优先级,并且没有凋谢给app应用。能够去看一下ViewRootImpl(这货是专门负责ViewTree渲染的,也即能够了解为负责UI渲染的)的几个perform,它都是异步音讯,也即会开启Sync barrier,它发送的音讯将会是最高优先级的,会被优先解决。 次要在哪里用Sync barrier后面提到了,Sync barrier这玩意儿并不是给app开发同学用的,很多相干的接口并没有凋谢进去,这是为了进步UI渲染而设计的货色。因而这货色次要是用在了UI渲染过程中。 认真查看ViewRootImpl的源码能够发现,每次渲染View tree之前都会先给主线程插入一个Sync barrier,以挡住同步音讯,以保障渲染被主线程优先执行到。 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) void scheduleTraversals() { if (!mTraversalScheduled) { mTraversalScheduled = true; mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier(); mChoreographer.postCallback( Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null); notifyRendererOfFramePending(); pokeDrawLockIfNeeded(); } } void unscheduleTraversals() { if (mTraversalScheduled) { mTraversalScheduled = false; mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier); mChoreographer.removeCallbacks( Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null); } } void doTraversal() { if (mTraversalScheduled) { mTraversalScheduled = false; mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier); performTraversals(); } }这里的逻辑略简单一些,View tree自身的处理过程,也即三大步measure, layout和draw,也就是performTraversal自身并没有异步音讯,它是在筹备渲染的时候放一个sync barrier,而在具体解决每一帧前就移除了sync barrier,这里为何要这样,还没有齐全想分明。通过搜寻ViewRootImpl能够发现只有input event,keyevent 以及与用户输出相干的音讯被设置为了asynchronous,也就是说用户事件响应被进步了优先级,而view tree的渲染,即UI的每一帧,其实并没有被晋升优先级。因为UI刷的每一帧是以固定频率刷新的,Choreographer 从硬件失去vsync脉冲信号,而后回调给ViewRootImpl让其渲染每一帧(也即是performTraversal)。 ...

September 4, 2023 · 1 min · jiezi

关于android:LeetCode-周赛上分之旅-43-计算机科学本质上是数学吗

⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 常识星球发问。 学习数据结构与算法的关键在于把握问题背地的算法思维框架,你的思考越形象,它能笼罩的问题域就越广,了解难度也更简单。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起领会上分之旅。 本文是 LeetCode 上分之旅系列的第 43 篇文章,往期回顾请移步到文章开端\~ LeetCode 双周赛 112T1. 判断通过操作是否让字符串相等 I(Easy) 标签:模仿T2. 判断通过操作是否让字符串相等 II(Medium) 标签:模仿、计数、排序T3. 简直惟一子数组的最大和(Medium) 标签:滑动窗口、计数T4. 统计一个字符串的 k 子序列漂亮值最大的数目(Hard) 标签:枚举、贪婪、排序、乘法原理、组合数 T1. 判断通过操作是否让字符串相等 I(Easy)https://leetcode.cn/problems/check-if-strings-can-be-made-equal-with-operations-i/题解(模仿)因为只能替换间隔偶数倍的地位,因而相当于比拟两个字符串雷同奇偶性下标上的元素是否相等。 写法 1:基于散列表class Solution { fun canBeEqual(s1: String, s2: String): Boolean { return setOf(s1[0], s1[2]) == setOf(s2[0], s2[2]) && setOf(s1[1], s1[3]) == setOf(s2[1], s2[3]) }}写法 2:基于字符串class Solution: def checkStrings(self, s1: str, s2: str) -> bool: return sorted(s1[0::2]) == sorted(s2[0::2]) and sorted(s1[1::2]) == sorted(s2[1::2])复杂度剖析: ...

September 4, 2023 · 6 min · jiezi

关于android:安装低版本微信

1.先装置最新版本微信,并登录。 2.应用cmd命令行保留用户数据形式卸载利用: adb shell pm uninstall -k com.tencent.mm3.应用cmd命令装置旧版本apk:https://www.wandoujia.com/apps/596157/history adb install -r -d [低版本微信apk] 留神1.应用夜神6.6.1(android 5)2.关上夜神装置目录找到adb.exe3.目录框cmd关上

August 30, 2023 · 1 min · jiezi

关于android:01崩溃捕获设计实践方案

01.解体捕捉设计实际计划目录介绍01.整体介绍概述 1.1 我的项目背景介绍1.2 遇到问题1.3 根底概念介绍1.4 设计指标02.App解体流程 2.1 为何解体推出App2.2 Java解体流程2.3 Native解体流程2.4 解体日志解决2.5 最初推出App2.6 解体流程叙述2.7 Binder死亡告诉03.解体解决入口 3.1 Java解决异样入口3.2 异样解决罕用api3.3 注意事项阐明3.4 JVM解决异样入口3.5 了解异样栈轨迹链3.6 JVM如何实现异样04.解体捕捉思路 4.1 实现解体监听4.2 解决捕捉异样4.3 实现雷同异样次数统计4.4 解体日志收集4.5 捕捉指定线程异样4.6 日志可视化查看4.7 日志发送邮箱4.8 解体重启实际01.整体介绍概述1.1 我的项目背景介绍Android的稳定性是Android性能的一个重要指标,它也是App品质构建体系中最根本和最要害的一环。 如果利用常常解体率,或者要害性能不可用,那显然会对咱们的留存产生重大影响。1.2 遇到问题Crash率多少算优良呢? 在明确了指标之后,咱们能力正确认识咱们的工作到底有什么作用。升高解体率到咱们的指标……解体率如何掂量 解体率 UV = 产生解体的UV / 启动UV衡量标准:解体率小于3/1000为失常,3/10000为优良1.3 根底概念介绍解体现场是“第一案发现场”,它保留着很多有价值的线索。 接下来具体来看看在解体现场,确认重点,内存&线程需特地留神,很多解体都是因为它们使用不当造成的。如何去剖析日志确认重大水平 如果一时半会解决不了,那么是否先止损,采纳降级策略。延期修复,如果是非要解决,那么解决完后即通过灰度测试发版,及时跟进问题。解体根本信息 Java 解体(比方 NullPPointerException 是空指针,OutOfMemoryError 是资源有余)Native 解体(比拟常见的是有 SIGSEGV 和 SIGABRT)ANR(先看看主线程的堆栈,是否是因为锁期待导致。接着看看 ANR 日志中 iowait、CPU、GC、system server 等信息,进一步确定是 I/O 问题,或是 CPU 竞争问题,还是因为大量 GC 导致卡死)Logcat日志 从 Logcat 中咱们能够看到过后零碎的一些行为跟手机的状态,当从一条解体日志中无奈看出问题的起因,或者得不到有用信息时,不要放弃,倡议查看雷同崩溃点下的更多解体日志。查找共性(机型、零碎、ROM、厂商、ABI) 机型、零碎、ROM、厂商、ABI,这些采集到的零碎信息都能够作为维度聚合,共性问题例如是不是因为装置了 Xposed,是不是只呈现在 x86 的手机,是不是只有三星这款机型,是不是只在 Android 8.0 的零碎上。复现问题 ...

August 29, 2023 · 5 min · jiezi

关于android:Android动画内幕揭秘

原文链接 Android Animation Internal Secrets后面的文章重点讲了如何应用安卓平台提供的能力来做好一个动画。为了更深刻的了解,须要去理解一下动画框架的外部机理,这样可能帮忙咱们做出更优雅的动画实现。 View Animation的原理View Animation源码解析View animation的代码都是在android.view.animation包上面。 这外面次要有三个货色,上面来别离认真说说 Animation次要是抽象类Animation以及它的四大子类,也是View animation中的四大变幻对象--位移变幻TranslateAnimation,缩放变幻ScaleAnimation,旋转变幻RotateAnimation和突变变幻AlphaAnimation。 以及一些工具对象,如AnimationSet和AnimationUtils。 认真看这些类的源码能够发现,其实它们不简单,外面也没啥货色,次要是用于各种参数治理,相当于封装进去的工具和原料,具体外部的原理并不在这里。认真看四大变幻的applyTransformation办法,能够发现这一坨把最靠近『原理』的货色都放在了一个叫做Transformation的对象中去了。 Transformation直译变幻,但文档中的定义是动画过程中某一时刻应该做的变幻,此为Transformation。 这货的实现也不简单,它也就是个中间商,只是一个存储从Animation传过来的参数 的两头变量,它外面有一个Alpha成员参数用以保留以后的突变参数值,以及一个Matrix,Matrix能够保留以后的位移,旋转和缩放。Matrix应该不算太生疏,解决过Bitmap变幻的同学,对它应该会有理解,都是通过Matrix来设置参数的。 Interpolator动画是随工夫变动的一系列视觉变幻,因人眼视觉残留,连在一起就是动画,跟电影是一个情理。这里就有一个十分要害的参数就是工夫。工夫对于动画来说体现在两方面一是时长,就是整个动画继续 的工夫,另外一个就是变幻变动的速率,也就是说动画播放速度的变化率。其实,这里变动的并不是工夫,工夫是永恒的以固定速度在流逝,对于动画来说,帧率是固定的,前面谈判到,动画的帧率是由工夫驱动器驱动的,它是以固定的工夫脉冲来回调渲染动画的每一帧。这里的工夫变动其实是做动画的每一帧时用到的参数 的变动,它并不是线性的,假如动画一共有10帧,要把View向右挪动100px,默认是线性的,匀速的,也即每一帧都向前挪动10px,但如果应用减速插值器,那么可能就是一个变加速运动,第1帧可能在0px,第2帧在5px,第3帧25px,第4帧到36px,以此类推。 工夫插值器,就是用来调整播放速度的,用以实现工夫变动。 View Animation的渲染原理从后面的探讨来看,动画的渲染跟那几个对象都没有关系,应用View animation的时候,只有两种办法能够让动画失效,一是调用View#startAnimation,另外一个是View#setAnimation,而后再Animation#start。 如果没有把Animation塞给某一个具体的View对象,光是调用Animation#start,是不会有任何影响和成果的。这阐明动画的渲染是在View对象draw时做的,没有与具体View对象建设关联的动画是没有任何成果的。所以动画的渲染次要还要看View自身的逻辑。 能够从View#setAnimation和View#startAnimation动手来看,这两个办法只是把内部传进来的Animation对象保留在了一个叫做mCurrentAnimation成员外面,其余的什么也没做。查问索引,要害的中央有两个,一个是View#applyLegacyAnimation办法,另外一个就是View#draw办法。 先来看View#applyLegacyAnimation办法: /** * Utility function, called by draw(canvas, parent, drawingTime) to handle the less common * case of an active Animation being run on the view. */ private boolean applyLegacyAnimation(ViewGroup parent, long drawingTime, Animation a, boolean scalingRequired) { Transformation invalidationTransform; final int flags = parent.mGroupFlags; final boolean initialized = a.isInitialized(); if (!initialized) { a.initialize(mRight - mLeft, mBottom - mTop, parent.getWidth(), parent.getHeight()); a.initializeInvalidateRegion(0, 0, mRight - mLeft, mBottom - mTop); if (mAttachInfo != null) a.setListenerHandler(mAttachInfo.mHandler); onAnimationStart(); } final Transformation t = parent.getChildTransformation(); boolean more = a.getTransformation(drawingTime, t, 1f); if (scalingRequired && mAttachInfo.mApplicationScale != 1f) { if (parent.mInvalidationTransformation == null) { parent.mInvalidationTransformation = new Transformation(); } invalidationTransform = parent.mInvalidationTransformation; a.getTransformation(drawingTime, invalidationTransform, 1f); } else { invalidationTransform = t; } // more codes return more; }这个办法看着比拟长,但它就做了三件事件:1)初始化动画;2)获取以后时刻的Transformation;3)如果动画还没有完(还有下一帧),那就得调用View的invalidate,得重绘。 ...

August 28, 2023 · 3 min · jiezi

关于android:李跳跳22正式版下载

最近,李跳跳APP发表永恒进行更新。据称,该利用导致了消费者权利的减损,被指形成不正当竞争,并因而蒙受某大厂的投诉,甚至收到了一封法律信件的威逼。面对压力,最终李跳跳APP抉择了退出舞台。 李跳跳APP是什么?它又做了什么恶? 如果你不相熟这个利用,李跳跳最后只是一个利用无障碍权限来跳过APP开屏广告的工具。能够看作是一个在安卓手机上绝对平安的脚本小程序,这个软件实现目标的办法不是也不可能是齐全屏蔽那些App上的开屏广告性能。而是模拟用户点击广告页面上的“X”这一操作,将其自动化操作以实现跳过广告的目标。 目前曾经把李跳跳的最新版本apk打包到网盘上,大家能够自行获取下载哦: 百度网盘下载: https://pan.baidu.com/s/17m8CBO8yNg9F7UBGFK7CMA?pwd=eun5 提取码: eun5 一提起APP开屏广告,就想到互联网大厂为了强制其用户看完本人的广告,堪称是用尽了所有的损招。 最厉害的莫过于通过手机陀螺仪实现的“摇一摇”广告 而当初有的广告,通过啪啪一通进化,还同时具备点击,摇一摇,滑动等简直所有交互均可实现,堪称是五毒俱全,简直能够说是,广告呈现了你一动就会着他们的道。 不晓得创造摇一摇广告那个人,在他平时用不必手机,不晓得他在用手机的过程当中,有没有被本人设计进去的“摇一摇”给恶心过。 李跳跳的应用形式 装置完APP后,进入李跳跳,按页面提醒关上性能后,再关上其余APP就能主动跳过广告了

August 27, 2023 · 1 min · jiezi

关于android:Android动画进阶指北

原文链接 Android Animation Advanced Tricks后面的文章介绍了动画的根本应用办法,本文来聊一聊波及到动画的高级技巧,以及一些十分优质的学习资源和动画三方库和框架。 页面之间的过渡动画惯例的动画都是针对某一页面上的某个元素做动画,这个绝对简略,之前的文章讲了很多。但有时候页面与页面之间也是须要过渡动画的,这个能够增强切换的视觉体验,但最好要留神整个利用内的格调对立,不能A到B是一种切换款式,B到C却是另外一种。 次要有两类,一是Activity之间的切换,二是布局之间的切换。 Activity之间的切换动画因为Activity的创立与启动以及它的Window的创立和显示都是由Frameworks来管制的,甚至于Activity外面的布局何时加载也是由零碎决定的,所以对于Activity之间的切换重大依赖于Frameworks,而不同版本的安卓,反对的状况还不一样。 传统的做法这个是针对 于所有安卓 版本都能够应用的办法,也是最简略的形式,就是应用Activity#overridePendingTransition办法。 这个办法并不难,具体如何应用能够参考其文档,以及这篇文章,讲的都比较清楚。 应用Transition在Android 4.4时,零碎中退出了一个叫做Transition的货色,专门用于页面之间的切换的,但也仅是限于同一个窗口(也即同一个Activity内)的ViewGroup。在Android 5.0时又把Activity之间的切换提供了反对,对于5.0以上的版本能够应用这个框架来实现切换,会比传统的做法都要业余一些。 具体能够参看官网教程,以及这篇教程和这篇文章,解说的都相当好。 布局之间的过渡切换这里的布局就是指除Activity以外的,比方从一个ViewGroup切换到另外一个ViewGroup。其实Fragment实质上就是一个ViewGroup,所以也蕴含在内。 在Android 4.4 (Kikat API 19),退出了Transition frameworks,专门用于解决场景切换,次要是通过Scene对象和Transition对象。Transition对象定义具体针对 哪个ViewGroup做什么样的动画,而Scene对象定义了ViewGroup的某一种状态,如突变进入,那么突变前是一个Scene,齐全可见后又是一个Scene,而突变的过程则叫Transition。 能够参看官网文档,以具体理解如何应用transition。 简单动画的实现逻辑动画是一个非常复杂且精湛的畛域,千万不要说做个UI很容易,或者说写个动画很容易,要想做好动画须要很深的功底,岂但须要对动画框架有深刻的理解,也要对整个视觉GUI有深刻的了解,并且须要良好的数学与物理常识。 简单的动画的复杂度体现在两个方面,一个是整体上看起来简单,也就是是很多不同的动画的组合;另外一个是具体的某个属性简单,如简单的门路,简单的工夫变动或者简单的形变。离开说。 看起来简单的动画这个别是波及泛滥的动画的组合,整体体现上看起来特地简单。就比如说电商可能会有一个购物筐,外面往外飞各种商品的动画。对于这种就是要把它拆解,拆解开来后,其实并不简单。 购物车:能够是突变,一直的从通明变到不通明。或者罗唆不做动画商品:预约义一组商品,每次随机抉择一个,再抉择随机的地位,而后从底下往上飞(或者从上往下飞),再设置一个随机的速度,也能够加上旋转这样拆解开来就不简单了。 简单的变幻这里就要波及一些数学 和物理常识了,比方用一些特地的曲线,非凡的曲面,非凡的形变等。 优良的动画的设计范例这里就不得不得提到小名顶顶的Dribbble了,这里有相当优良的设计资源,其中也有很多动画设计,能够尝试着去实现一下,都很有挑战。 优良的动画相干资源还有一些资源,特地是开源的库,也十分值得学习和钻研和应用。 MotionLayout这个并不是三方的,而是官网AndroidX中的,相当的弱小,当然应用起来也略简单。具体应用办法能够参考 官网教程和这篇文章。 The Top 27 Android Animation Open Source Projects这里是一个汇合,外面列出一些优良的动画相干的开源库,都相当的棒。 Android View Animations有一些针对View的十分炫酷的特效,如抖动,缩放和旋转等。它是受一个水果下面的动画库的激发。 Material-Animations次要是介绍如何应用Transition frameworks的。 Lottie能够把设计软件Adobe After Effects间接转成动画。 一些插值器可看这个和这个 专门用于加载动画外面有各种神奇的加载特效,十分棒。是一个前端CSS加载特效的Android上的实现。 教程的示例这是一个教程集锦,外面也蕴含各种示例,是一个相当不错的学习资源。 另外一个教程和示例与下面的相似,也是一个集教程与实例在一起的我的项目。 Android Animation Detailed Tutorials一个我的项目的合集。 原创不易,打赏,点赞,在看,珍藏,分享 总要有一个吧

August 21, 2023 · 1 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);返回阐明 返回字段阐明"id":"4bu9702gmq4mvl3myo"id告诉工作id ,仅厂商告诉有该字段{"key":"value"}附加字段附件字段需指定,不指定不会呈现 ,仅厂商告诉有该字段{"from_tcp":true}from_tcp音讯是否来自MobPushTCP通道,true:是{"msg":"MobPushNotifyMessage{}"}msg音讯体,对象为MobPushNotifyMessage,仅MobPushTCP通道音讯有该字段{"channel":"mobpush"}channel渠道名2.2 scheme跳转获取参数,详情请查看 API接口->scheme跳转 JSONArray jsonArray = MobPushUtils.parseSchemePluginPushIntent(getIntent());System.out.println("-------------JsonScheme打印查看:"+jsonArray);返回阐明 返回字段阐明{"from_tcp":true}from_tcp音讯是否来自MobPushTCP通道,true:是{"msg":"MobPushNotifyMessage{}"}msg音讯体,对象为MobPushNotifyMessage,仅MobPushTCP通道音讯有该字段{"key":"value"}附加字段附件字段需指定,倡议不要应用url做为key{"mobpush_link_k":"mlink://com.mob.mobpush.link"}schemescheme地址{"mobpush_link_v":"schemeKey=schemeValue"}scheme参数scheme地址下携带的scheme参数{"id":"4brfm8nti9aj1arf28"}id推送工作id{"channel":"xiaomi"}channel渠道名{"schemeLink":"mlink://com.mobpush.demo2"}schemescheme地址{"schemeKey":"schemeValue"}scheme参数scheme地址下携带的scheme参数(华为,VIVO,OPPO){"schemeKey":"schemeValue","schemeUrl":"mlink://com.mob.mobpush.link"}schemeUrlscheme地址下携带的scheme参数(flyme)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规定限度,注册胜利即立刻失效。 ...

July 11, 2023 · 2 min · jiezi

关于android:Android-View滑动处理大法

原文链接 Android View滑动解决大法对于触控式操作来说,滑动是一个特地重要的手势操作,如何做到让应用程序的页面滑动起来如丝般顺滑,让用户感觉到手起刀落的晦涩感,是开发人猿须要重点解决的问题,这对晋升用户体验是最为重要的事件。本文就将探讨一下,Android中View的滑动相干常识,以及如何做到丝般顺滑。 如何让View滑动起来View的滑动是GUI反对的一项根本个性,就像触摸事件一件,这是废话,平台如果不反对,你还搞个毛线。 View滑动的基本原理咱们先来看一下Android中实现View的滑动的基本原理。其实屏幕并没有动啊,一个View的可绘制区域,对于屏幕来说,对于view tree来说都是没有变动 的。父布局给某一个View的绘制区域是在layout之后就确定好了的,当View的实在高度或者宽度超过了这块可绘制区域,那么就须要滑动才能够把整个View做到用户可见。View外部通过两个要害成员变量mScrollX和mScrollY来记录滑动之后的坐标,View自身有mLeft和mTop来标识本人绝对于父布局的坐标地位,那么当有滑动的时候,在此View当中具体要绘制的区域就变成了以mLeft+mScrollX和mTop+mScrollY为终点的区域了。由此View便滚动起来了。 如何实现View的滑动对于开发人猿来说,实现View的滑动,须要关注三个重要的办法,也即是View#scrollBy),View#scrollTo)以及View#onScrollChanged),这是实现滑动的三个最为外围的办法。 scrollBy提供的参数是须要滑动的间隔,而scrollTo则是须要传入要滑动到的指标坐标值,这两个办法都是要批改mScrollX和mScrollY的值,实质上是一样的。而onScrollChanged则是一个回调,用以告诉更新了的滑动地位。 Scroll手势要想让View滑动起来,离不开事件手势的反对。最简略也是最间接的手势就是onScroll手势,这个在GestureDetecor中能够辨认出此手势,或者本人去间接解决touch event也能够得出此手势。这个并不简单,就是间接通过touch 事件来计算滑动多少间隔就好了,依照View预设计的能够滑动的方向,比方横向就计算不同工夫点MotionEvent的坐标值,失去一个程度间隔deltaX,而后调用scrollBy即可。垂直方向依此类推。 Scroll手势简略是因为它是间接来源于事件,且速度较慢,并不需要额定解决,所以整体逻辑解决流程并不简单。 在GestureDetector中的辨认就是在ACTION_MOVE时,查看滑动过的间隔,这个间隔(由sqrt(dx x dx, dy x dy)如果大于touch slop,就会触发onScroll手势回调。 Fling手势Fling也即是疾速滑动,就是手指在屏幕上使劲的『挠』一下,手势的要点是手指在屏幕疾速滑过一小段短距离,就像把一个小球弹出去的感觉一样。对于Fling手势来说,最重要的是速度,程度方向的速度和垂直方向的速度,能够了解为高中物理常讲到的平抛静止一样。 GestureDetector辨认Fling的逻辑是,在ACTION_UP时,查看此次事件的速度,如果程度方向速度或者垂直方向速度超过了阈值,便会触发Fling手势回调。 留神:注意Scroll与Fling的区别,Scroll是慢的,不关怀工夫与速度,只关怀滑动的间隔,是在ACTION_MOVE时,手指并未有来到屏幕时就触发了,只有是ACTION_MOVE还在持续,就会持续触发onScroll,并且ACTION_UP时终止整个Scroll,而Fling只关怀速度,不关怀间隔,是在ACTION_UP时,手指来到了屏幕了(此次事件流解决结了)才会触发。 VelocityTrackerFling事件速度是决定性的,认真看GestureDetector的处理过程会发现它应用了一个叫做VelocityTracker的对象,来帮忙解决一些对于速度的具体逻辑,那么有必要深刻理解一下这个对象。 VelocityTracker应用起来并不简单,获取它的一个对象后,只须要一直的把MotionEvent塞给它就能够了,而后在须要的时候让其计算两个方向上的速度,而后就没有而后了: velocityTracker = VelocityTracker.obtain(); onTouchEvent(MotionEvent ev) { velocityTracker.addMovement(ev); if (want to know velocities) { velocityTracker.computeCurrentVelocity(100); vx = velocityTracker.getXVelocity(); vy = veolocityTracker.getYVelocity(); be happy with vx and vy. } }这个类的实现,值得认真看一下,它次要的实现都是用JNI去实现,可能是因为计算形式较简单,所以computeCurrentVelocity)办法也阐明了,让你真用的时候再调,这个不必去管细节实现。重点看一下这个类,外面有一个对象池,用以缓存对象,并且创建对象的形式并不是间接new,而是用其obtain)办法。这里用的是叫享元(Flyweight Pattern)的设计模式,也就是说VelocityTracker对象其实是共享的。 顺滑如丝后面提到了,让View滑动,只须要调用scrollBy或者scrollTo即可,但这个吧,是间接批改了mScrollX,mScrollY,而后invalidate,View下次draw时就间接在把指标区域内容绘制进去了,换句话说这两个办法滑动是霎时跳格局的。 一般来说,这也没有问题,就像onScroll手势,ACTION_MOVE时,一直的scrollBy刚刚滑过的间隔,都还okay,没有什么问题。 然而对于Fling事件就不行了,Fling事件,也即疾速滑动,要求短时间内进行大间隔滑动,或者像有跳转的需要时,也是短时间内要滑动大间隔。如果间接scrollBy或者scrollTo一步到位了,会显得 相当的突兀,体验相当不好,卡顿感特地强。如果能像做动画那样,在肯定工夫内,让其平滑的滑动,就会如丝般顺滑,体验好很多。Scroller就是专门用来解决此问题的。 Scroller[Scroller]()是对滑动的封装,并不是View的子类,其实它跟View一点关系也没有,也不能操作View,实际上它与属性动画相似,它仅是一个滚动地位的计算器,通知它起始地位和要滚动的间隔,而后它就会通知你地位随工夫变动的值。其实这是一个中学物理题,也即给定初始地位,给定要滚动的间隔,以肯定的形式来计算每个工夫点的地位。具体的计算形式由mInterpolater成员来管制,默认是ViscousFluid,是按天然指数为减速度来计算的,具体的能够查看Scroller的源码。如果不喜爱默认的计算形式,能够本人实现个Interpolator,而后在结构时传进去。 Scroller的作用在于实现安稳滑动,不让View的滚动呈现跳跃,比方滑动一下ListView,开始滑动时的地位是x0,y0(ActionDown的地位),要向下滑动比方500个像素,不安稳的意思是,从x0,一下跳到x0+500的地位。要安稳,就要一直的一点点的扭转x的值而后invalidate,这也就是Scroller的典型应用场景: Scroller scroller = new Scroller(getContext());scroller.startScroll(x0, y0, 500, 0);而后在computeScroll时: ...

July 10, 2023 · 1 min · jiezi

关于android:android-退出机制

android sdk 退出机制的钻研 有多种, 办法一、用list保留activity实例,而后逐个干掉 上代码: import java.util.LinkedList; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.app.Application; import android.content.DialogInterface; import android.content.Intent; public class SysApplication extends Application { private List<Activity> mList = new LinkedList<Activity>();private static SysApplication instance;private SysApplication() { }public synchronized static SysApplication getInstance() { if (null == instance) { instance = new SysApplication(); } return instance;}// add Activity public void addActivity(Activity activity) { mList.add(activity);}public void exit() { try { for (Activity activity : mList) { if (activity != null) activity.finish(); } } catch (Exception e) { e.printStackTrace(); } finally { System.exit(0); }}@Overridepublic void onLowMemory() { super.onLowMemory(); System.gc();}} ...

July 10, 2023 · 1 min · jiezi

关于android:FAQ关于CP反馈的联运应用的常见结算问题小结

问题一:为什么在“我的账户”>>“收益”外面的金额和领取报表中的金额对不上 ?对于联运类利用付费产品在华为平台上结算问题,您能够具体参考一下“华为商户服务协定”的第四章节对于结算的官网文档的,如果有领取的收益,之前应该曾经签订了该协定。 依据文档,订单金额和理论收益之间是有代扣税和收益分成的, CP认为呈现差异的次要起因是没有把由华为代扣的订单销项税额思考进去。 问题二:为什么10月份的都曾经在付款中,然而依然没有到账 ?1、结算主体为:Huawei Service (Hong Kong) Co., Limited(华为服务(香港)有限公司) 或 Aspiegel Limited,待结算金额总额需达到结算门槛200欧元(EUR)。如果结算期内待结算的累计结算金额低于200欧元(EUR),则结算日期将推延到金额达到200欧元(EUR)的日期。如果6个月内金额未达到200欧元,华为将结算6个月内累计的金额。 2、结算主体为:Huawei Software Technologies Co., Ltd.(华为软件技术有限公司),无结算金额最低门槛要求,但确认结算单后,您须要依照文档要求(章节4)筹备发票并发送到要求邮箱才能够发动结算流程; 依据官网文档,如对结算数据无异议,点击“确认结算单”提交结算申请,核查申付金额及收款银行等信息无误后,点击“提交”,提交后将无奈勾销。须要留神的是当结算期范畴:开发者账号、签约主体、合同、币种、业务类型雷同时,如需多个结算单合并开票,请确认同一个合同、同一业务类型雷同的结算双方可进行合并开票。 结算单流程具体阐明: 在结算单的界面上有三个状态:待确认、付款中、已领取; 点开结算单会有状态明细:生成结算单-结算单已确认-领取已发动-领取实现; 当生成结算单时,结算单的结算状态为“待确认”状态; CP点击确认结算单的时候,界面上的状态会变为付款中,明细状态会变成结算单已确认。待收到CP合格发票核查无误后,华为发动付款流程明细中的状态就是领取已发动,界面上的状态还是付款中,也就是说,只有CP点击确认了结算单,付款状态都是在付款中; 当付款到账之后,结算单状态将变为“领取已实现”,标记着结算付款流程完结。如下图: 依照确认的结算单金额开具发票,合并开票需将所选结算单中的“结算汇总信息-结算金额”加总,留神金额与发票金额要完全一致,不能有一分钱差别。之后您须要依照官网结算文档要求(章节4)筹备发票并发送到要求邮箱才能够发动结算流程; 具体详情请您参考开发者联盟对于自主结算指南的官网文档进行相干操作。 问题三:如何提取海内利用内付款金额到国内公司账户?提取海内利用内付款金额到国内公司账户,这个须要您确认是否在开明商户服务时,填写了跨境收款银行账户,如下图所示: 如果没有的话,请您及时依照是官网操作领导补充欠缺。 问题四:能够间接打印结算单,并依照相应金额开发票吗?具体能够参照开发者联盟的自助结算文档,先核查结算单,后确认结算单,当然CP能够间接下载结算单,间接开票并联同结算单一起邮件给华为,通常状况下,华为会在每月15日向CP提供上个月的结算单。如果在15天后,CP未发动争议申请,则会主动确认结算单;当您确认结算单并通过华为审批后,结算页面上的结算单状态将变为“付款中”。 理解更多详情>> 拜访HMS Core 联盟官网 获取HMS Core 开发领导文档 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

July 5, 2023 · 1 min · jiezi

关于android:LeetCode-周赛-35220230702一场关于子数组的专题周赛

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 常识星球发问。往期回顾:LeetCode 单周赛第 350 场 · 滑动窗口与离散化模板题单周赛 352 概览T1. 最长奇偶子数组(Easy) 标签:滑动窗口、枚举T2. 和等于目标值的质数对(Medium) 标签:质数筛、散列表、数学T3. 不间断子数组(Medium) 标签:滑动窗口、均衡树、枯燥队列T4. 所有子数组中不均衡数字之和(Hard) 标签:均衡树、散列表、前后缀合成、乘法原理 T1. 最长奇偶子数组(Easy)https://leetcode.cn/problems/longest-even-odd-subarray-with-threshold/题解一(滑动窗口 + 枚举子数组)容易想到的办法是枚举每个地位开始的子数组,并计算最长奇偶子数组长度,能够失去工夫复杂度为 O(n^2) 的解法。 class Solution { fun longestAlternatingSubarray(nums: IntArray, threshold: Int): Int { var i = 0 var j = 0 val n = nums.size var ret = 0 while (j < n) { while (i < n && (nums[i] % 2 != 0 || nums[i] > threshold)) i++ if (i >= n) break j = i + 1 while (j < n && (nums[j] % 2 != nums[j - 1] % 2 && nums[j] <= threshold)) j++ ret = Math.max(ret, j - i) i ++ } return ret }}复杂度剖析: ...

July 4, 2023 · 7 min · jiezi

关于android:Android项目中接入-Lint代码规范

一、概述Android Studio 提供了一个名为 Lint 的代码扫描工具,可帮忙开发者发现并更正代码构造品质方面的问题,并且无需您理论执行利用,也不用编写测试用例。零碎会报告该工具检测到的每个问题并提供问题的形容音讯和重大级别,以便开发者能够疾速确定须要优先进行的要害改良。此外,咱们还能够升高问题的重大级别以疏忽与我的项目无关的问题,或者进步重大级别以突出特定问题。 作为一款代码查看工具,Lint 工具能够查看 Android 我的项目源文件是否有潜在的 bug,以及在正确性、安全性、性能、易用性、无障碍性和国际化方面是否须要优化改良。应用 Android Studio 时,无论何时构建利用,都会运行配置的 lint 和 IDE 查看。并且,您能够手动运行查看或从命令行运行 Lint。 上面是 Lint 工具执行代码扫码的工作示意图: Lint 工具有几个根底的概念须要帮大家理分明: 利用的源文件:源文件包含组成 Android 我的项目的各种文件,例如 Java、Kotlin 和 XML 文件,以及图标和 ProGuard 配置文件。lint.xml 文件:一个配置文件,可用于指定要排除的任何 lint 查看以及自定义问题重大级别。lint 工具:一个动态代码扫描工具,能够从命令行或在 Android Studio 中对 Android 我的项目运行该工具来进行查看。lint 工具用于查看代码是否存在可能影响 Android 利用的品质和性能的构造问题。lint 查看后果:Lint查看的后果,能够在控制台或 Android Studio 的 Inspection Results 窗口中查看 lint 查看后果。二、Lint 对于团队开发的重要性Android 官网对 Lint性能的形容十分精确:通过进行 lint 查看来改良代码 。这里关键词是改良,也就是当开发者写了一行语法正确并且运行失常的代码,然而它可能不是最优或最平安的写法,或最优的API组合,通过Lint 检测将发现这些坏代码,通过实时提醒来辅助开发者改良为更强壮更平安的写法。上面是一些具体的应用场景阐明: 2.1 案例1: 检测代码标准在接入ViewBinding时,为了保障xml内的view Id 与 ViewBinding 放弃一致性的驼峰命名,须要防止应用 btn_xx 下划线命名,这样不便浏览代码与检索代码。通常像这样的标准会在团队内集中同步,如何能保障在这个标准自同步后新提交的代码viewId 100% 是驼峰命名呢?留神这里说的是达到100%符合规范,要彻底杜绝因人为导致的疏漏。 ...

July 4, 2023 · 4 min · jiezi

关于android:扫光动效在移动端应用实践

作者 | Seven 导读  随着挪动互联网的疾速倒退,业界涌现出大量有创意又乏味的交互体验。扫光动效就是其中一种有意思的加载动效,常见的扫光动效有骨架屏扫光、logo扫光。那么这两种扫光动效的原理是什么,如何实现这两种扫光成果,以及在iOS和Andoird双端实现起来有什么差别,本文会为你具体揭晓。 全文10549字,预计浏览工夫27分钟。 01 引言扫光动效作为挪动端的常见加载动效,与传统的转圈加载相比,能给人更好的视觉和感官体验。其次要特点是光效会随着工夫进行扫射,文字或图案有被色彩填充的感觉。 笔者先后做过骨架屏扫光、熊掌扫光loading, 本文将别离从 iOS 和 Android的视角, 介绍这两种扫光动效的实现和双端的技术差别。 △熊掌扫光动效 02 骨架屏扫光动效骨架屏是一种界面加载过程中的过渡成果。它在页面数据加载实现前,先给用户展现出页面的大抵构造,在拿到接口数据后渲染出理论页面内容而后替换掉。这种技术可能升高用户的焦灼情绪,使界面加载过程变得天然通顺,晋升用户体验。罕用于文章列表、动静列表页等绝对比拟规定的列表页面。这里以领取半屏面板面板为例,能够看到有光效在骨架图上扫过的成果。 △骨架屏扫光 2.1 骨架屏扫光原理剖析骨架屏的扫光场景比较简单, 因为其背景是不通明, 能够通过在骨架图下面叠加一个遮罩视图作为光块, 对遮罩进行挪动来达到扫光的成果。 其视图的层级整体分位两层,底层为自定义视图的骨架局部,下层为突变通明遮罩。其中,骨架图局部为惯例的列表实现,这里不再赘述,而突变通明遮罩作为扫光的,能够用切图或通过代码来实现。遮罩切图绝对代码实现,会减少一部分包体积,所以能够抉择自定义一个和骨架图一样大小的视图,笼罩到骨架图之上,并设置其为从左到右突变通明。 此外,位移动画,能够通过设置在 xxx工夫内,将遮罩视图在程度方向上,从骨架图的左侧挪动到骨架图的右侧来实现。 2.2 iOS实现Core Animation 是 AppKit 和 UIKit 完满的底层反对,同时也被整合进入 Cocoa 和 Cocoa Touch 的工作流之中,它是 app 界面渲染和构建的最基础架构。Core Animation 主要职责蕴含:渲染、构建和实现动画,尽可能快地组合屏幕上不同的可视内容,这个内容是被分解成独立的 layer(iOS 中具体而言就是 CALayer),并且被存储为树状层级构造。这个树也造成了 UIKit 以及在 iOS 应用程序当中咱们所能在屏幕上看见的所有的根底。 在 iOS 上,能够通过 CALayer +View 动画办法+Transform来实现。layer 是UIView 的底层图层, 负责视图的绘制,动画,边框,暗影等视觉效果。动画局部间接用 View 的类办法animateWithDuration即可,在动画回调中通过设置视图的Transform属性来实现程度位移。 突变遮罩局部能够按如下代码定义,通过一个 ImageView 作为遮罩视图,通过设置CAGradientLayer做为其layer实现通明突变成果: // 创立自定义视图作为遮罩视图_lightCover = [[UIImageView alloc] initWithFrame:self.bounds];CAGradientLayer *gradientLayer = [CAGradientLayer layer];gradientLayer.frame = _lightCover.bounds;// 渐变色色彩数组gradientLayer.colors = [NSArray arrayWithObjects: (id)[UIColorFromRGBA(0xFFFFFF, 0) CGColor], (id)[UIColorFromRGBA(0xFFFFFF, 0.3) CGColor], (id)[UIColorFromRGBA(0xFFFFFF, 0.5) CGColor], (id)[UIColorFromRGBA(0xFFFFFF, 0.3) CGColor], (id)[UIColorFromRGBA(0xFFFFFF, 0) CGColor], nil];// 突变的开始点 (不同的起始点能够实现不同地位的突变,如图)gradientLayer.startPoint = CGPointMake(0, 0.5f);// 突变的完结点gradientLayer.endPoint = CGPointMake(1, 0.5f);// 把突变图层增加到遮罩视图的顶层[_lightCover.layer insertSublayer:gradientLayer atIndex:0];// 设置初始地位_lightCover.transform = CGAffineTransformMakeTranslation(-self.bounds.size.width, 0);通过定时器循环位移动画: ...

July 4, 2023 · 3 min · jiezi

关于android:Android-View-事件派发流程

原文链接 Android View 事件派发流程自从乔帮主横空出世推出了iPhone以来,触控式的操作便成了21世纪智能设施的规范输出形式。对于同是智能操作系统的Android来说,也不例外。事件,特地是触控事件对于挪动利用程序开发来说是一个十分重要的,也是开发人猿必须把握的事件。这里就要讨论一下Android View中的Event零碎,重点探讨一下事件的派发流程。 输出事件综述事件的分类对于Android零碎来说用户输出事件分为两类,一个是KeyEvent,这个是硬件产生的事件,或者更精确的说是非触控手势产生的事件,通常包含硬件按扭如音量键,电源键,零碎导航(HOME,BACK和MENU)以及外设(如外接设备,键盘,自拍杆等)零碎层也都会对立的做成映射转成KeyEvent传给以后Window窗口(以后过程)。 还有一类就是专指解控屏幕产生的触摸式的手势事件,是MotionEvent,为啥不叫TouchEvent呢,因为啊最后的Android版本是反对滑动球的,当初曾经没有这种设施,然而名字就这么流传下来了。这个事件专门由视图零碎view tree来解决,本文也将重点探讨此类事件。 事件从哪里来简略来说事件是源自于硬件,比方屏幕或者按键,这是废话,晓得了这个意义也不大,硬件产生电子信号后会经由驱动传给内核,内核再报给输出零碎,再传给wms(Windows Manager Server),最终会到Window这里。对于应用层来说,能够了解 为事件都是从Window对象这里来的就行了。 谁先收到事件对于GUI应用程序层来说,wms就是事件起源,那么ViewRootImpl对象是第一个接管到事件,ViewRootImpl并没有间接把事件派发给view tree,而是先给到DecorView,宿主组件在DecorView处有一个专门接管事件的回调,由此事件便到了以后的宿主组件如Activity或者Dialog,看它是否违心做解决,如果它不解决,那么就会把事件再派发给GUI视图零碎,也即view tree,这一次没有再通过ViewRootImpl对象,而是由Window对象间接调用根节点的dispatchTouchEvent或者dispatchKeyEvent。 15:57:02.254 W/System.err: java.lang.Exception: Stack trace 15:57:02.255 W/System.err: at java.lang.Thread.dumpStack(Thread.java:1348) 15:57:02.256 W/System.err: at net.toughcoder.view.ViewWindowExampleActivity.dispatchKeyEvent(ViewWindowExampleActivity.java:107) 15:57:02.256 W/System.err: at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:342) 15:57:02.256 W/System.err: at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:5053) 15:57:02.257 W/System.err: at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4921) 15:57:02.257 W/System.err: at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4442) 15:57:02.258 W/System.err: at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4495) 15:57:02.258 W/System.err: at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4461) 15:57:02.259 W/System.err: at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4601) 15:57:02.259 W/System.err: at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4469) 15:57:02.259 W/System.err: at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4658) 15:57:02.260 W/System.err: at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4442) 15:57:02.260 W/System.err: at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4495) 15:57:02.260 W/System.err: at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4461) 15:57:02.261 W/System.err: at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4469) 15:57:02.261 W/System.err: at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4442) 15:57:02.261 W/System.err: at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4495) 15:57:02.262 W/System.err: at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4461) 15:57:02.262 W/System.err: at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4634) 15:57:02.263 W/System.err: at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:4795) 15:57:02.263 W/System.err: at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2571) 15:57:02.263 W/System.err: at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2081) 15:57:02.264 W/System.err: at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2072) 15:57:02.264 W/System.err: at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2548) 15:57:02.265 W/System.err: at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141) 15:57:02.265 W/System.err: at android.os.MessageQueue.nativePollOnce(Native Method) 15:57:02.265 W/System.err: at android.os.MessageQueue.next(MessageQueue.java:326) 15:57:02.265 W/System.err: at android.os.Looper.loop(Looper.java:160) 15:57:02.266 W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6692) 15:57:02.266 W/System.err: at java.lang.reflect.Method.invoke(Native Method) 15:57:02.266 W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 15:57:02.266 W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 15:57:14.582 W/System.err: java.lang.Exception: Stack trace 15:57:14.586 W/System.err: at java.lang.Thread.dumpStack(Thread.java:1348) 15:57:14.586 W/System.err: at net.toughcoder.view.DemoEventView.dispatchTouchEvent(DemoEventView.java:24) 15:57:14.586 W/System.err: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) 15:57:14.586 W/System.err: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2662) 15:57:14.586 W/System.err: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) 15:57:14.587 W/System.err: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2662) 15:57:14.587 W/System.err: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) 15:57:14.587 W/System.err: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2662) 15:57:14.587 W/System.err: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3030) 15:57:14.587 W/System.err: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2662) 15:57:14.587 W/System.err: at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:440) 15:57:14.588 W/System.err: at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1830) 15:57:14.588 W/System.err: at android.app.Activity.dispatchTouchEvent(Activity.java:3400) 15:57:14.588 W/System.err: at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:398) 15:57:14.588 W/System.err: at android.view.View.dispatchPointerEvent(View.java:12753) 15:57:14.588 W/System.err: at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5122) 15:57:14.588 W/System.err: at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4925) 15:57:14.588 W/System.err: at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4442) 15:57:14.588 W/System.err: at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4495) 15:57:14.589 W/System.err: at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4461) 15:57:14.589 W/System.err: at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4601) 15:57:14.589 W/System.err: at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4469) 15:57:14.589 W/System.err: at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4658) 15:57:14.589 W/System.err: at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4442) 15:57:14.589 W/System.err: at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4495) 15:57:14.589 W/System.err: at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4461) 15:57:14.589 W/System.err: at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4469) 15:57:14.590 W/System.err: at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4442) 15:57:14.590 W/System.err: at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7117) 15:57:14.590 W/System.err: at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7086) 15:57:14.590 W/System.err: at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7047) 15:57:14.590 W/System.err: at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7220) 15:57:14.590 W/System.err: at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:187) 15:57:14.590 W/System.err: at android.os.MessageQueue.nativePollOnce(Native Method) 15:57:14.590 W/System.err: at android.os.MessageQueue.next(MessageQueue.java:326) 15:57:14.591 W/System.err: at android.os.Looper.loop(Looper.java:160) 15:57:14.591 W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6692) 15:57:14.591 W/System.err: at java.lang.reflect.Method.invoke(Native Method) 15:57:14.591 W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 15:57:14.591 W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)因而,从应用程序的角度来说,第一个收到事件的是Activity或者Dialog这种持有Window的顶级组件,所以如果想要从窗口级别来拦挡掉所有的事件,那么Activity会是最好的抉择,代码示例: ...

July 3, 2023 · 3 min · jiezi

关于android:附件类文件存储在环信和不存储在环信时的两种实现方式

场景一: 附件类文件存储在环信服务器应用环信EMChatManager#downloadAttachment下载附件计划(本篇文章以图片音讯为例,其余附件类音讯相似): 一、 通过EMFileMessageBody#getLocalUrl判断有没有本地文件; EMImageMessageBody imgBody = (EMImageMessageBody) message.getBody(); //本地文件的资源门路 String imageLocalUrl = imgBody.getLocalUrl();1 、 如果存在本地门路,间接应用本地文件;(本案例应用的Glide) Glide.with(this).load(imageLocalUrl).into(image);2. 如果不存在本地文件,调用EMChatManager#downloadAttachment下载,下载胜利后展现图片;(本案例应用的Glide) EMMessage msg = EMClient.getInstance().chatManager().getMessage(msgId); EMCallBack callback = new EMCallBack() { public void onSuccess() { EMLog.e(TAG, "onSuccess" ); runOnUiThread(new Runnable() { @Override public void run() { Uri localUrlUri = ((EMImageMessageBody) msg.getBody()).getLocalUri(); Glide.with(mContext) .load(localUrlUri) .apply(new RequestOptions().error(default_res)) .into(image); } }); } public void onError(final int error, String message) { EMLog.e(TAG, "offline file transfer error:" + message); } public void onProgress(final int progress, String status) { EMLog.d(TAG, "Progress: " + progress); } }; msg.setMessageStatusCallback(callback); EMClient.getInstance().chatManager().downloadAttachment(msg);二、 如果对本地存储的门路有特殊要求:1 能够先通过EMFileMessageBody#setlocalUrl去批改门路; 2 而后再调用EMChatManager#downloadAttachment下载(下载操作能够参考上边); ...

June 30, 2023 · 1 min · jiezi

关于android:个推消息推送专项运营提升方案5大亮点解读

往年3月份,个推将数智经营服务在音讯推送场景率先落地,公布了音讯推送专项经营晋升计划。目前,该计划曾经在游戏社交、影音资讯等行业利用,在晋升音讯达到率和点击率等方面体现出显著效果。尤其是TT语音,通过个推音讯推送专项经营晋升计划,不仅保障了音讯的稳固下发,还通过文案圈人模型,高效开掘指标用户群,使整体音讯推送点击率晋升了近120%。那么,个推音讯推送服务到底如何帮忙APP晋升音讯推送点击率呢?秘诀一:智选机会,全面晋升音讯达到率个推音讯推送实现了智选机会,帮忙APP在适合的机会下发音讯。APP能够应用个推音讯推送服务,实时查问设施以后在线状态,对用户属性、设施应用场景等维度综合剖析,预测出最佳的用户触达机会。同时,个推对接了APNs、华为、光荣、小米、OPPO、vivo、 魅族、坚果、索尼、海信、FCM等十大厂商通道,提供智能配额、离线补发、推送后效剖析等能力,无效保障音讯的胜利下发,助力APP全面晋升用户触达成果。 秘诀二:标签圈人,为TA推送专属内容个推作为一家数据智能服务商,领有深厚的数据能力,造成了数千种画像标签和亿级别的特色数据,帮忙APP精准洞察用户根底属性、趣味偏好、场景流动特色等,实现精细化的用户分组分群。APP能够应用行为规定、画像标签疾速圈选特定人群,并一键对接给个推音讯推送平台,针对性推送他们感兴趣的内容,从而吸引用户点击。秘诀三:模型圈人,AI匹配推送文案和人群个推还将算法建模的能力融入到音讯推送服务中,提供文案圈人模型,让AI学习文案特色,智能预测对该推送文案有更高点击概率的人群,从而实现把适合的内容推送给适合的人群。比方,某数千万级日活泛娱乐APP,应用个推文案圈人模型,高效开掘指标人群,实现文案与TA用户的精准匹配,使整体音讯推送点击率晋升了超50%。秘诀四:富媒体推送款式,吸引用户点击个推提供大文本、大图、纯图片、音讯重弹、角标、换底图、Emoji、音讯分组等丰盛的推送款式。APP能够创立更有视觉冲击力和吸引力的音讯推送款式,从而吸引用户点击。秘诀五:残缺音讯链路查问,继续优化推送成果个推还提供欠缺的推送数据报表以及音讯链路查问等服务。借助疾速回流的后效数据,APP一方面能够联合A/B test分组推送等性能,对不同的人群、推送文案、推送机会进行测试比照,帮忙优化推送策略;另一方面APP也能够将后效数据“喂”给AI模型持续学习,一直晋升模型的预测能力。而在每一次推送和经营流动中体现出高点击、高转化的优质人群和优质文案,APP也能够将其积淀下来,造成模板,用于下一次的推送或广告投放,继续优化推送成果。个推音讯推送专项经营晋升计划围绕用户触达这一环节,将音讯推送、数据分析、算法模型等能力以及本身积攒的丰盛经营教训整合,为APP发展数智化经营提供切实可行的场景入口。

June 29, 2023 · 1 min · jiezi

关于android:Android-SDK安全加固问题与分析

作者 | 百度APP技术平台 导读  在挪动互联网疾速倒退的背景下,爱护Android应用程序的安全性和知识产权变得尤为重要。为了避免歹意攻打和未受权拜访,通常采纳对dex文件进行代码加固来爱护应用程序。随着Android加固技术通过动静加载、不落地加载、指令抽取、java2cpp、VMP等技术一直演进和改良,VMP加固技术成为一种高安全性解决方案。因而,本文将着重介绍一种实现和落地VMP技术的思路,以帮忙大家理解其工作原理和利用场景。 全文8359字,预计浏览工夫21分钟。 01 问题背景在挪动互联网疾速倒退的背景下,Android 作为寰球最受欢迎的挪动操作系统,吸引了大量开发者和用户。随着利用市场的竞争加剧,爱护应用程序的安全性和知识产权变得越来越重要。 同时,随着公司业务的倒退,百度与内部友商深度单干,须要对外输入了百度业务能力SDK。在这种背景下,对Android代码进行加固成为了一种必要的安全措施。加固能够进步应用程序的安全性,爱护知识产权,避免逆向工程和破解。 02 问题剖析Android 应用程序是由 Java/Kotlin 语言编写而成,而后打包成 APK 文件。Java 代码被编译成 APK/AAR 中的 dex 文件,dalvik/art 虚拟机解释执行 dex 中的字节码。攻击者能够应用反编译工具很容易的逆向剖析 dex 文件,了解代码要害逻辑,减少恶意代码,再打包回 APK 文件。 能够看到,dex 文件就是代码加固的爱护外围! 03 加固调研为了解决对 dex文件的代码加固,咱们进行了相干技术调研,其实在Android代码平安畛域,相干技术始终属于一直攻防演进的过程。如下是业界罕用的加固技术计划:比方最后的360加固给APK加壳,通过不落地动静加载实现加固;市场上罕用的类办法抽取指令加固;以及将java办法转native办法jni调用等。 3.1 DexClassLoader 动静加载机制 利用 Android 零碎的 DexClassLoader 动静加载机制,通过将爱护的 dex 文件解压解密后,动静加载到内存中执行。 这种形式无效地抵挡了 APK 文件的动态剖析,使得逆向剖析者无奈在 APK 文件中找到实在的 dex 文件。然而因为动静加载技术次要依赖于java的动静加载机制,所以要求要害逻辑局部必须进行解压,并且开释到文件系统。 这种动静加载技术不足之处在于:1.这一解压开释机制就给攻击者留下间接获取对应文件的机会; 2.能够通过hook虚拟机要害函数,进行dump出原始的dex文件数据。 3.2 Hook 技术针对 DexClassLoader 动静加载机制的爱护缺点,采纳 Hook 技术来解决问题。 在动静加载过程中,通过替换 DexClassLoader 执行过程中的 dex 内存,将其替换为实在 dex 文件的内存,从而实现了无需将 dex 落地的加载形式。 然而,dex 文件尽管不会解密并保留到文件系统,但它在内存中是残缺存在的。因而,在利用程序运行后,逆向剖析者能够通过内存搜寻的形式将 dex 文件转储进去。 ...

June 29, 2023 · 5 min · jiezi

关于android:Health-Kit-新版本功能解析给你丰富运动体验

华为静止衰弱服务(HUAWEI Health Kit)6.11.0版本新鲜出炉! 凋谢生机三环数据助力养成静止习惯,新增水肺潜水、户外探险数据凋谢…… 丰盛静止体验,尽在Health Kit,一起来看! 凋谢日常流动统计数据查问接口生机三环助力用户养成静止习惯,放弃生机满满。反对用户制订每日指标,打卡三环工作——流动热量、锤炼时长、流动小时数。 新版本中凋谢了日常流动统计数据,将生机三环数据与步数数据通过日常流动统计数据查问接口凋谢给生态利用,便于生态利用获取用户的日常流动状况,以及流动指标达成状况。反对查问用户的流动热量、锤炼时长、流动小时数和步数数据的目标值、日统计值。 自在潜水锤炼记录数据扩大自在潜水对身材多有好处,能够健壮肌肉和加强肺部力量,同时也能够自在体验独特的水下视线。 新版本在原有反对潜水工夫、潜水次数、最大深度等数据类型的根底上,锤炼记录扩大反对关联潜水深度、水温原子采样数据。 新增水肺潜水锤炼记录数据凋谢水肺潜水指潜水员自行携带水下呼吸系统所进行的潜水流动。云侧新增反对水肺潜水锤炼记录数据凋谢,包含CNS(中枢神经零碎毒性等级)、OTU(氧气毒性单元)、水密度等业余静止特色统计数据,以及潜水深度、水温等原子采样数据。 (数据起源:HUAWEI WATCH Ultimate) 新增户外探险静止记录数据凋谢户外探险作为一种户外运动,不仅能给参与者带来大自然奇迹妙景的感官享受,过程中须要进行大量的静止,能够加强呼吸、心血管零碎性能,改善身材各组织器官的机能,促成身材推陈出新。 云侧新增反对户外探险静止记录数据凋谢,包含探险航点里程、卡路里、步频、步数、海拔统计数据,以及探险标记点、海拔详情数据。 理解更多详情>> 拜访静止衰弱服务解决方案 获取静止衰弱服务开发领导文档 拜访HMS Core 联盟官网 获取HMS Core 开发领导文档 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

June 29, 2023 · 1 min · jiezi

关于android:快上车搭乘HUAWEI-HiCar驶向未来

HUAWEI HiCar(以下简称HiCar)是华为提供的人-车-家全场景智慧互联解决方案,连贯手机与车辆,充分发挥各自的劣势属性,将手机的利用/服务生态延长进车辆,实现以手机为外围的全场景体验。消费者通过HiCar能够感触利用/服务在手机和车辆间无缝流转、智慧语音发动导航/播放音乐/车辆管制如车窗空调、日历航班等情景智能信息随需而出等全新智慧出行体验。 为了向消费者提供更多的利用和服务,以及在更多车型上提供HiCar,HiCar别离向利用开发者和设施开发者凋谢了丰盛的接口能力和领导文档。宽广开发者们能够疾速将本人的利用接入HiCar,以及将HiCar预置到正在开发的车型中。 利用接入HiCarHiCar为利用提供一系列凋谢能力,蕴含根底的CarBaseEngine和为不同类别利用提供专属能力的子Engine。目前已凋谢CarBaseEngine和CarMapEngine能力。 利用开发者只须要在原有利用的根底上集成HiCar凋谢能力即可反对HiCar,而不须要独自为HiCar设计开发独自的利用。集成HiCar凋谢能力的利用,装置和运行都是在手机上,手机上的HiCar App会将利用对应的界面启动到车辆硬件设施屏幕上(例如车机屏幕,后续皆以车机屏幕举例),并通过利用中集成的HiCar凋谢能力与利用进行通信。 以后HiCar反对接入的利用类型及相干阐明: 音频类利用:音乐类、儿童故事类、有声读物类、有声新闻资讯类等音频利用能够通过集成CarBaseEngine提供的音频模板疾速接入HiCar。音频模板基于Android MediaSession框架实现,HiCar通过MediaSession机制与音频利用进行数据交互,实现数据获取并展现、进行播放管制等。音频利用只需专一于音频数据的筹备和播放服务的实现即可,其它繁琐的工作,例如绘制车机界面并保障各分辨率兼容性、治理音频桌面卡片等都由HiCar实现。 地图类利用:导航类地图利用能够通过集成CarBaseEngine、CarMapEngine提供的地图模板疾速接入HiCar。地图模板将HiCar环境中的地图利用分为地图图层和客户端交互层两层,地图利用只需关注地图图层中的地图数据提供以及地图导航业务解决,毋庸关注客户端交互层中简单的车机屏幕分辨率和汽车旋钮摇杆适配内容,这些工作将由HiCar实现。 其它利用:非音频和地图类的利用也能够依照HiCar提供的标准和领导疾速接入HiCar。 设施接入HiCarHiCar通过分布式软总线技术、分布式虚拟化能力和应用服务共享虚拟化技术,构建了一个凋谢的平台解决方案。针对汽车硬件设施开发者,HiCar提供了HiCar SDK凋谢能力,不便汽车硬件设施接入HiCar。HiCar SDK依据车机系统的不同分为Android和Linux版本,设施开发者可自行依据车机系统类型抉择不同的HiCar SDK进行集成。 HiCar提供的HiCar SDK次要包含三局部内容: HiCar利用API接口:HiCar为车机应用层提供的HiCar相干性能接口,车机的HMI(Human Machine Interface)利用须要调用这些接口实现HiCar相干的人机交互界面。 HiCar分布式协定组件:HiCar为设施开发者提供的用于实现车机与手机间的数据传递、交互管制等性能的组件,包含分布式设施发现与连贯组件(Nearby)、分布式设施虚拟化组件(DMSDP)、投屏显示组件(HiSight)。 HiCar设施API接口: HiCar定义的硬件和OS相干适配层接口,须要设施开发者负责集成适配,HiCar分布式协定组件会调用这些接口。 设施开发者接入HiCar须要遵循规范的接入流程,整体流程如下图所示(图中以车厂指代设施开发者)。 设施开发者集成HiCar SDK将设施接入HiCar的次要工作能够概括为: 准入评估:从资源、技术、组织等方面对我的项目进行可行性评估,促使我的项目达到能够立项的状态。 立项与打算:依据我的项目要求组建我的项目团队,明确各自分工界面,并制订我的项目打算。 开发和测试:依据实现计划及打算,实现车机侧HiCar我的项目的开发与测试,即把HiCar SDK集成进车机系统中。 认证:由华为为集成HiCar的设施进行认证。为保障集成HiCar的产品体验,只有通过华为认证的HiCar产品才能够上市销售。 生命周期保护:明确产品上市后的舆情和问题解决机制、软件降级保护机制。 理解更多详情>> 拜访HiCar联盟官网 利用接入HiCar流程 设施接入HiCar流程 拜访HMS Core 联盟官网 获取HMS Core 开发领导文档 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

June 28, 2023 · 1 min · jiezi

关于android:Android-JNI-学习实践

目录介绍01.学习JNI开发流程 1.1 JNI开发概念1.2 JNI和NDK的关系1.3 JNI实际步骤1.4 NDK应用场景1.5 学习路线阐明02.NDK架构分层 2.1 NDK分层构建层2.2 NDK分层Java层2.3 Native层03.JNI根底语法 3.1 JNI三种援用3.2 JNI异样解决3.3 C和C++相互调用3.4 JNI外围原理3.5 注册Native函数3.6 JNI签名是什么04.一些必备操作 4.1 so库生成打包4.2 so库查问操作4.3 so库如何反编译05.实际几个案例 5.1 Java动态调用C/C++5.2 C/C++调用Java5.3 Java调三方so中API5.4 Java动静调C++06.一些技术原理 6.1 JNIEnv创立和开释6.2 动静注册的原理6.3 注册JNI流程图07.JNI遇到的问题 7.1 混同的bug7.2 留神字符串编译01.学习JNI开发流程1.1 JNI开发概念.SO库是什么货色 NDK为了方便使用,提供了一些脚本,使得更容易的编译C/C++代码。在Android程序编译中会将C/C++ 编译成动静库 so 文件,相似java库.jar文件一样,它的生成须要应用NDK工具来打包。so是shared object的缩写,见名思义就是共享的对象,机器能够间接运行的二进制代码。本质so文件就是一堆C、C++的头文件和实现文件打包成一个库。JNI是什么货色 JNI的全称是Java Native Interface,即本地Java接口。因为 Java 具备跨平台的特点,所以Java 与 本地代码交互的能力十分弱。采纳JNI个性能够加强 Java 与本地代码交互的能力,使Java和其余类型的语言如C++/C可能相互调用。1.2 JNI和NDK的关系JNI和NDK学习内容太难 其实难的不是JNI和NDK,而是C/C++语言,JNI和NDK只是个工具,很容易学习的。JNI和NDK有何分割 学习JNI之前,首先得先晓得JNI、NDK、Java和C/C++之间的关系。在Android开发中,有时为了性能和安全性(反编译),须要应用C/C++语言,然而Android APP层用的是Java语言,怎么能力让这两种语言进行交换呢,因为他们的编码方式是不一样的,这是就须要JNI了。JNI能够被看作是代理模式,JNI是java接口,用于Java与C/C++之间的交互,作为两者的桥梁,也就是Java让JNI代其与C/C++沟通。NDK是Android工具开发包,帮忙疾速开发C/C++动静库,相当于JDK开发java程序一样,同时能帮打包生成.so库1.3 JNI实际步骤操作实际步骤 第一步,编写native办法。第二步,依据此native办法编写C文件。第三步,应用NDK打包成.so库。第四步,应用.so库而后调用api。如何应用NDK打包.so库 1,编写Android.mk文件,此文件用来告知NDK打包.so库的规定2,应用ndk-build打包.so库相干学习文档 NDK学习:https://developer.android.google.cn/ndk/guides?hl=zh-cn1.4 NDK应用场景NDK的应用场景个别在: 1.为了晋升这些模块的性能,对图形,视频,音频等计算密集型利用,将简单模块计算封装在.so或者.a文件中解决。2.应用的是C/C++进行编写的第三方库移植。如ffmppeg,OpenGl等。3.某些状况下为了进步数据安全性,也会封装so来实现。毕竟应用纯Java开发的app是有很多逆向工具能够破解的。1.5 学习路线阐明JNI学习路线介绍 1.首先要有点C/C++的根底,这个我是在 菜鸟教程 上学习的2.了解NDK和JNI的一些概念,以及NDK的一个大略的架构分层,JNI的开发步骤是怎么的3.把握案例练习,后期先写案例,比方java调用c/c++,或者c/c++调用java。把这个案例写熟,跑通即可4.案例练习之后,而后在思考NDK是怎么编译的,如何打包so文件,loadLibrary的流程,CMake工作流程等一些根底的原理5.在实际过程中,先记录遇到的问题。这时候可能不肯定懂,先放着,先实现案例或者简略的业务。而后边实际边推敲问题和背地的原理注意事项介绍 防止一开始就钻研原理,或者把C/C++整体学习一遍,那样会比拟辛苦。焦点先放在JNI通信流程上,写案例学习把学习内容,分为几个不同类型:理解(可能扯淡),了解(大略晓得什么意思),把握(可能使用和实际),精通(能触类旁通和分享讲清楚)02.NDK架构分层应用NDK开发最终目标是为了将C/C++代码编译生成.so动静库或者动态库文件,并将库文件提供给Java代码调用。所以按架构来分能够分为以下三层: 1.构建层2.Java层3.native层2.1 NDK分层构建层要失去指标的so文件,须要有个构建环境以及过程,将这个过程和环境称为构建层。 构建层须要将C/C++代码编译为动静库so,那么这个编译的过程就须要一个构建工具,构建工具依照开发者指定的规定形式来构建库文件,相似apk的Gradle构建过程。在解说NDK构建工具之前,咱们先来理解一些对于CPU架构的知识点:Android abi ABI即Application Binary Interface,定义了二进制接口交互规定,以适应不同的CPU,一个ABI对应一种类型的CPU。Android目前反对以下7种ABI: ...

June 28, 2023 · 2 min · jiezi

关于android:Android-View的渲染过程

原文链接 Android View的渲染过程对于安卓开发猿来说,每天都会跟布局打交道,那么从咱们写的一个布局文件,到运行后可视化的视图页面,这么长的工夫内到底 产生了啥呢?明天咱们就一起来探询这一旅程。 View tree的创立过程布局文件的生成过程个别状况下,一个布局写好了,如果不是特地简单的布局,那么当把布局文件塞给Activity#setContentView或者一个Dialog或者一个Fragment,之后这个View tree就创立好了。那么setContentView,其实是通过LayoutInflater这个对象来具体的把一个布局文件转化为一个内存中的View tree的。这个对象不算太简单,次要的逻辑就是解析XML文件,把每个TAG,用反射的形式来生成一个View对象,当XML文件解析实现后,一颗View tree就生成完了。 然而须要留神,inflate之后尽管View tree是创立好了,然而这仅仅是以单纯对象数据的模式存在,这时去获取View的一些GUI的相干属性,如大小,地位和渲染状态,是不存在的,或者是不对的。 手动创立除了用布局文件来生成布局,当然也能够间接用代码来撸,这个就比拟直观了,view tree就是你创立的,而后再把根节点塞给某个窗口,如Activity或者Dialog,那么view tree就创立完事了。 渲染前的筹备工作View tree生成的最初一步就是把根结点送到ViewRootImpl#setView外面,这里会把view增加到wms之中,并着手开始渲染,接下来就次要看ViewRootImpl这个类了,次要入口办法就是ViewRootImpl#requestLayout,而后是scheduleTraversals(),这里会把申请放入到队列之中,最终执行渲染的是doTraversal,它外面调用的是performTraversals(),所以,咱们须要重点查看ViewRootImpl#performTraversals这个办法,view tree渲染的流程全在这外面。这个办法相当之长,靠近1000行,次要就是三个办法performMeasure,performLayout和performDraw,就是常说的三大步:measure,layout和draw。 渲染之measure就看performMeasure办法,这个办法很简略,就是调用了根view的measure办法,而后传入widthSpec和heightSpec。measure的目标就是测量view tree的大小,就是说view tree在用户可视化角度所占屏幕大小。要想了解透彻measure,须要了解三个事件,MeasureSpec,View#measure办法和View#onMeasure办法: 了解MeasureSpec从文档中能够理解到,MeasureSpec是从父布局传给子布局,用以代表父布局对子布局在宽度和高度上的束缚,它有两局部一个是mode,一个是对应的size,打包成一个integer。 UNSPECIFIED 父布局对子布局没有要求,子布局能够设置任意大小,这个 基本上 不常见。 EXACTLY 父布局曾经计算好了一个准确的大小,子布局要严格依照 这个来。 AT_MOST 子布局最大能够达到传过来的这个尺寸。 光看这几个mode,还是不太好了解。因为咱们素日里写布局,在大小(或者说宽和高)这块就三种写法:一个是MATCH_PARENT,也就是要跟父布局一样大;要么是WRAP_CONTENT,也就是说子布局想要刚好适合够显示本人就行了;再者就是写死的如100dp等。须要把measure时的mode与LayoutParams联合分割起来,能力更好的了解measure的过程。 还是得从performMeasure这时动手,这个MeasureSpec是由父节点传给子节点,追根溯源,最原始的必定是传给整个view tree根节点的,也就是调用performMeasure时传入的参数值。 根节点的MeasureSpec根节点的MeasureSpec是由getRootMeasureSpec得来的,这个办法传入的是窗口的大小,这是由窗口来给出的,以后的窗口必定 是晓得本人的大小的,以及根节点布局中写的大小。从这个办法就能看出后面说的布局中的三种写法对MeasureSpec的影响了: 如果 根节点布局是MATCH_PARENT的,那么 mode就是EXACTLY,大小就是父布局的尺寸,因为根节点的父亲就是窗口,所以就是窗口的大小如果 根节点布局是WRAP_CONTENT的,那么 mode是AT_MOST,大小仍然会是父布局的尺寸。这个要这样了解,WRAP_CONTENT是想让子布局本人决定本人多大,然而,你的极限 就是父布局的大小了。其余,其实就是根节点写死了大小的(写布局时是必须 要指定layout_width和layout_height的,即便某些view能够省略一个,也是因为缺省值,而并非不必指定),那么mode会是EXACTLY,大小用根节点指定的值。 private static int getRootMeasureSpec(int windowSize, int rootDimension) { int measureSpec; switch (rootDimension) { case ViewGroup.LayoutParams.MATCH_PARENT: // Window can't resize. Force root view to be windowSize. measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.EXACTLY); break; case ViewGroup.LayoutParams.WRAP_CONTENT: // Window can resize. Set max size for root view. measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.AT_MOST); break; default: // Window wants to be an exact size. Force root view to be that size. measureSpec = MeasureSpec.makeMeasureSpec(rootDimension, MeasureSpec.EXACTLY); break; } return measureSpec; }子View的MeasureSpecMeasureSpec这个货色是自上而下的,从根节点向子View传递。后面看过了根节点的spec生成形式,还有必要再看一下子View在measure过程中是如何生成spec的,以更好的了解整体过程。次要看ViewGroup#getChildMeasureSpec办法就能够了: ...

June 26, 2023 · 3 min · jiezi

关于android:FAQ关于华为地图服务定位存在偏差的原因及解决办法二仅适用于Location-670300及之后的版本

一、 问题形容:华为地图服务“我的地位”能力,在中国大陆地区,向用户展现他们在地图上的以后地位与用户的理论地位存在较大的偏差。 具体差异能够查看下方的图片: 二、 偏差较大的起因:华为Map SDK在中国大陆应用的天文坐标系是GCJ02。点击“我的地位”控件,获取的定位经纬度的天文坐标系是WGS-84。因为以上两个起因,即地图View和“我的地位”定位源应用的天文坐标系不统一,所以才导致了“我的地位”定位不精确的问题。三、 解决方案:先应用华为Location SDK通过定位获取用户以后所在位置的经纬度信息(GCJ02天文坐标系)。通过华为Map SDK提供的huaweiMap.setLocationSource(LocationSource locationSource)办法,设置“我的地位”图层定位源。四、 注意事项:应用Location SDK间接获取GCJ-02坐标系的经纬度仅实用于6.7.0.300及之后的SDK版本,因为Location SDK的6.7.0.300之前的版本暂不反对间接获取GCJ-02坐标系的经纬度。 五、 具体的实现步骤:创立已开启“我的地位”性能的地图实例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控件,从三张截图能够看出:“我的地位”与“用户理论所在位置”存在较大偏差。 ...

June 26, 2023 · 2 min · jiezi

关于android:SimpleRouter-Android组件化路由库支持模块间通信

SimpleRouter Android组件化路由库,反对模块间通信,实用于中小型我的项目.最新版本模块srouter-annotationsrouter-compilersrouter-api版本Demo展现Demo apk下载 接入形式在build.gradle文件中增加依赖和配置 参数示意: > SIMPLE_ROUTER_KEY -> 配置生成的路由文件加密秘钥,长度为16个字> OPEN_AES -> 是否开启加密> SROUTER_ANNOTATION -> annotation版本号(查看下面最新版本)> SROUTER_API -> api版本号(查看下面最新版本)> SROUTER_COMPILER -> compiler版本号(查看下面最新版本)代码配置: plugins { id 'kotlin-kapt' } android { defaultConfig { javaCompileOptions { annotationProcessorOptions { arguments = [ SIMPLE_ROUTER_KEY: project.ext.simpleRouterKey, OPEN_AES : project.ext.openAes ] } } } } dependencies { implementation "com.github.jeff-liu14:srouter-annotation:$SROUTER_ANNOTATION" implementation "com.github.jeff-liu14:srouter-api:$SROUTER_API" kapt "com.github.jeff-liu14:srouter-compiler:$SROUTER_COMPILER" }在须要的Activity/Fragment中增加注解 #activity@Route(path = "/app/home")class MainActivity : AppCompatActivity() {} # fragment@Route(path = "/app/demo/product/fragment")class ProductFragment : Fragment() {}初始化SDK ...

June 26, 2023 · 2 min · jiezi

关于android:RecyclerView性能优化之异步预加载

前言首先须要强调的是,这篇文章是对我之前写的《浅谈RecyclerView的性能优化》文章的补充,倡议大家先读完这篇文章后再来看这篇文章,滋味更佳。 过后因为篇幅的起因,并没有深刻开展解说,于是有很多感兴趣的敌人纷纷留言示意:能不能联合相干的示例代码解说一下到底如何实现?那么明天我就联合之前讲的如何优化onCreateViewHolder的加载工夫,讲一讲如何实现onCreateViewHolder的异步预加载,文章开端会给出示例代码的链接地址,心愿能给你带来启发。 剖析之前咱们讲过,在优化onCreateViewHolder办法的时候,能够升高item的布局层级,能够缩小界面创立的渲染工夫,其本质就是升高view的inflate工夫。因为onCreateViewHolder最大的耗时局部,就是view的inflate。置信读过LayoutInflater.inflate源码的人都晓得,这部分的代码是同步操作,并且波及到大量的文件IO的操作以及锁操作,通常来说这部分的代码快的也须要几毫秒,慢的可能须要几十毫秒乃至上百毫秒也是很有可能的。 如果真到了每个ItemView的inflate须要花上上百毫秒的话,那么在大数据量的RecyclerView进行疾速高低滑动的时候,就必然会导致界面的滑动卡顿、不晦涩。 那么如何你的程序里真的有这样一个列表,它的每个ItemView都须要花上上百毫秒的工夫去inflate的话,你该怎么做? 首先就是对布局进行优化,升高item的布局层级。但这点的优化往往是微不足道的。其次可能就是想方法让设计师从新设计,将布局中的某些内容删除或者折叠了,对暂不展现的内容应用ViewStub进行提早加载。不过说实在话,你既然有能力让设计师从新设计的话,还干个球的开发啊,间接当项目经理不香吗?最初你可能会思考不必xml写布局,改为应用代码本人一个一个new布局。话说回来了,一个应用xml加载的布局都要花上上百毫秒的布局,可能xml都快上千行上来了,你确定要本人一个一个new上来?以上的形式,都是建设在列表布局能够批改的状况下,如果咱们应用的列表布局是第三方曾经提供好的呢?(例如广告SDK等) 那么有没有什么方法既能够不必批改以后的xml布局,又能够极大地缩短布局的加载工夫呢?毫无疑问,布局异步加载将为你关上新的世界。 原理Google官网很早就发现了XML布局加载的性能问题,于是在androidx中提供了异步加载工具AsyncLayoutInflater。其本质就是开了一个长期期待的异步线程,在子线程中inflate view,而后把加载好的view通过接口抛出去,实现view的加载。一般来说,对于简单的列表,往往都对应了简单的数据,而这简单的数据往往又是通过服务器获取而来。所以一般来说,一个列表在加载前,往往先须要拜访服务器获取数据,而后再刷新列表显示,而这拜访服务器的工夫大概也在300ms~1000ms之间。很多开发人员对这段时间往往没有加以利用,只是加上一个loading动画了事。 其实对于这一段事务真空的工夫窗口,咱们能够提前进行列表的ItemView的加载,这样等数据申请下来刷新列表的时候,咱们onCreateViewHolder的时候就能够间接到曾经当时预加载好的View缓存池中间接获取View传到ViewHolder中应用,这样onCreateViewHolder的创立工夫简直耗时为0,从而极大地晋升了列表的加载和渲染速度。具体的流程能够参见下图: 实现下面我简略地解说了一下原理,下一步就是思考如何实现这样的成果了。 预加载缓存池首先在预加载前,咱们须要先创立一个缓存池来存储预加载的View对象。 这里我抉择应用SparseArray进行存储,key是Int型,寄存布局资源的layoutId,value是Object型,寄存的是这类布局加载View的汇合。 这里的汇合类型我抉择的是LinkedList,因为咱们的缓存须要频繁的增加和删除操作,并且LinkedList实现了Deque接口,具备先入先出的能力。 这里View的援用我抉择的是软援用SoftReference,之所以不采纳WeakReference, 目标就是心愿缓存能多存在一段时间,防止内存的频繁开释和回收造成内存的抖动。 private static class ViewCache { private final SparseArray<LinkedList<SoftReference<View>>> mViewPools = new SparseArray<>(); @NonNull public LinkedList<SoftReference<View>> getViewPool(int layoutId) { LinkedList<SoftReference<View>> views = mViewPools.get(layoutId); if (views == null) { views = new LinkedList<>(); mViewPools.put(layoutId, views); } return views; } public int getViewPoolAvailableCount(int layoutId) { LinkedList<SoftReference<View>> views = getViewPool(layoutId); Iterator<SoftReference<View>> it = views.iterator(); int count = 0; while (it.hasNext()) { if (it.next().get() != null) { count++; } else { it.remove(); } } return count; } public void putView(int layoutId, View view) { if (view == null) { return; } getViewPool(layoutId).offer(new SoftReference<>(view)); } @Nullable public View getView(int layoutId) { return getViewFromPool(getViewPool(layoutId)); } private View getViewFromPool(@NonNull LinkedList<SoftReference<View>> views) { if (views.isEmpty()) { return null; } View target = views.pop().get(); if (target == null) { return getViewFromPool(views); } return target; }}从getViewFromPool办法咱们能够看出,这里对于ViewCache来说,每次取出一个缓存View应用的是pop办法,咱们都会将它从Pool中移除。 ...

June 26, 2023 · 3 min · jiezi

关于android:Android-App出海全解析

原文链接:https://juejin.cn/post/7195374985077063739 以后,国内各个公司 APP 出海创收曾经是互联网行业的常见操作,本文将对海内 APP 一些开发教训做一些分享。首次出海的时候,咱们总结了须要适配海内环境的方方面面,比方,客户端内的很多通用模块须要反对海内环境: 确认一些三方服务对于海内环境的反对水平,例如云信、声网 SDK一些常见 APP 性能的海内版本封装,例如登录,文件上传,推送,分享底层库性能自查,反对上架政策和一些资源配置。咱们的最终目标是,尽量放弃原有的技术框架去开发新的 APP,不要因为经营环境变了,技术架构也大改。同时,Android APP 的公布渠道和公布格局。海内 Android 利用以 Google Play 上架公布为主,这里咱们须要额定反对 aab(android app bundle) 格局进行公布。 一、海内利用设计1.1 根底库海内实现根底模块咱们遵循接口实现拆散的设计准则,以文件上传底层库为例,咱们会有3个最终打成 aar 的 module: uploader_interface提供文件上传相干的各种接口uploader_module、uploader_interface module各个接口的具体实现,例如文件通过中台的 CDN 接口上传。uploader_module_oversea 是 uploader_interface module外面各个接口的具体实现,实现逻辑从间接 CDN 接口上传改为先上传至亚马逊云,而后把亚马逊云的上传信息同步给 CDN。得益于下面的设计准则,根底模块咱们只须要提供对应的海内实现即可。业务代码内调用的依然是接口 module 的 API,这样做一来一些依赖底层的业务代码能够间接复用,二来开发同学也不须要再去相熟另一套底层库 API,其架构图如下。  1.2 底层库合规查看海内 APP 在 Google Play 作为次要散发渠道的状况下,隐衷政策可能和国内略有不同。而一些底层库可能包含了一些不合规的代码,这部分须要进行排查,一般来说,遵循上面 2 个准则就不容易呈现问题: 底层库代码外面没有违规的 API 调用,例如和热修复这种动静代码下发的。Google Play 不容许相干性能。底层库的依赖里不要蕴含海内环境用不到的性能。例如一些之前全公司 APP 都通用的三方服务的SDK被集成在了某个底层库,尽管海内没有应用相干性能,然而这些 SDK 十分有可能因为包含了动静下发 so 而被查看进去。Google Play 隐衷政策能够参考:[Google Play隐衷政策] 1.3 底层库资源另一方面,对于比较简单的底层逻辑,咱们个别状况也不会对其做接口与实现拆分,然而底层有可能会应用一些通用的资源,例如文案、图标等。如果咱们把这些值作为变量设置进去,一方面底层库的改变比拟大,另一方面初始化时候的设置也十分的繁琐。这里咱们能够利用 Android 本身的资源合并策略。 ...

June 24, 2023 · 3 min · jiezi

关于android:理解安卓的视图体系结构

原文链接 了解安卓的视图体系结构当咱们想要写一个页面的时候,通过一个Activity,而后调用其setContentView办法,把一个布局文件当作一个参数传递过来,而后一个页面就好了,然而除此之外,咱们还须要与一些组件打交道,比方像Window,WindowManager,那么这些货色到底 与咱们的页面布局有什么关系,明天就来学习一下,以便对整体窗口有个更分明的认知。 布局是一颗View tree先从一个最简略的例子登程,平时咱们写一个页面,都从一个布局文件登程。这其实是在构建一个View tree,为啥肯定是tree呢,因为咱们的布局文件,无论有如许的简单,都是从一个根(通常是一个ViewGroup对象)开始的,父布局外面再写子布局,比方这样的: <LinearLayout id="app_root"> <TextView id="label"/> <Button id="submit"/></LinearLayout>这会造成一个树状构造: | app_root<br/>   |- label<br/>   |- submit<br/>作为一个开发者,写布局是咱们再相熟不过的了,次要就是用所相熟的各种Layout和View一起来构建想要的页面。 所写的布局,最终会生成一颗View tree,是一个树状的数据结构,每一个节点都是一个View对象(ViewGroup和View)。因而,布局优化的一个是感觉重要的点就是要先缩小View tree的深度(也即平时所说的缩小布局的嵌套),再想方法缩小广度(缩小个数)。 那么,咱们写的布局的父布局又是哪里呢?这就又波及两个货色,一个叫做decorView和contentView的货色。 DecorView与ContentView咱们平时所见的屏幕窗口的根布局是一个叫做DecorView的货色,它是咱们通常意义上整个屏幕的根节点,它蕴含了下面的Status bar和下方的Navigation bar,以及属于应用程序的两头局部。它的源码门路是frameworks/base/core/java/com/android/internal/policy/DecorView.java。它是一个实在的view,它是FrameLayout的子类。 它上面有一个id为android.R.id.content的FrameLayout,咱们平时在Activity中调用setContent时所传过来的布局文件所生成的View tree都是增加在这个FrameLayout上面,所以,通常对于咱们一个Activity来说,这个FrameLayout是间接意义上的根节点,咱们所写的布局都是增加它上面的。 ContentView所引申进去的奇技淫巧布局优化技巧首先,一个是布局的优化技巧,能够缩小View tree的层级:如果你写的布局中根节点也是一个FrameLayout,那么能够间接用merge节点,把子view全副都间接加挂到后面提到的零碎创立的Activity的根布局下面。 <merge> <Text /> <Button /></merge>这能够把View tree缩小一个层级(深度减1)。 页面内即插即用的弹窗每个Activity都被回挂在一个id是android.R.id.content的FrameLayout上面,利用这一点,能够做一些即插即用的弹窗,即插即用的意思是,不必写在布局外面,而且显示的工夫是不固定的,可能很多时候都不显示,在某个特定的逻辑或者工夫才显示。就好比某些电商特定节日的弹窗一样,这种货色,一年也显示不了几回,如果间接增加在布局外面(哪怕你用ViewStub),不够优雅,毕竟不是惯例逻辑下会呈现的页面,这时能够利用content来做一些即时弹窗: FrameLayout container = activity.findViewById(android.R.id.content);View pop = <create or inflate your own view>;container.addView(pop);只有你能取得到Activity的实例(这个并不难),那么就能够十分优雅的增加弹窗,逻辑代码和布局文件都会相当独立,甚至能够用插件模式来异步加载。再进一步,如果 增加一个WebView,那么就能够做得更加的前端化,实时化和定制化,好多电商的弹窗就是这么干的。 Window与WindowManager作为利用开发者,咱们看一个View tree其实就是一坨布局,这是站在一个十分小的角度去看的,但如果站在整体零碎架构角度来看的话,就会发现应用程序所在的view tree仅是零碎可视化窗口架构中的末端,View只是用来构建视图的根本砖块而已。对于整体View tree是如何渲染的,何时渲染,这就波及到了整体零碎架构层面的重量级组件了。 对于现化代的视图窗口架构(Modern GUI),都有一个window server,作来治理视图窗口的外围组件,比方X11,Android当中也不例外。在Android外面,WindowManager就是专门用于治理视图窗口的,它是零碎级别的server叫window manager server是一个零碎级别的常驻过程,由init.rc启动。而Window则是一个根本的窗口的逻辑上的形象。对于Window以及WindowManager自身就是相当大的话题,都能够独自写本书,这时不做过多的探讨,对于咱们利用开发者来说,理解一下根本的常识就够用了。 每一个Activity,都有一个Window对象,所有所有与GUI无关的事件,都委派给了Window对象,Actvity自身并不参加GUI的具体流程,比方像下面提到的DecorView,ContentView等View tree的构建与治理,View tree的渲染,以及像事件的解决,都是Window对象解决的。Window是WindowManager的根本对象,与其server之间通过IPC通信,Window是供应用程序端应用的,其实真正所有都把握在window server手中。Activity和Dialog应用的对象都是PhoneWindow,它在frameworks/base/core/java/com/android/internal/policy/PhoneWindow.java,Window对象会具体负责创立像DecorView之类的一些基础设施。最为要害的一个办法就是其PhoneWindow#installDecor()办法,这个办法外面会先调用generateDecor()创立mDecor,它就是后面讲到的DecorView对象,再通过generateLayout()创立mContentParent对象,它就是后面讲到的id是android.R.id.content的那个FrameLayout,Activity或者Dialog通过setContentView送过来的View tree就是加在它的上面的。 WindowManager是一个接口(Android零碎的代码接口用的特地多,很多要害的架构层面的组件 都是接口,理论应用的都是其一个实现。)理论应用的是WindowManagerImpl对象,而它也没干啥,它把事件 又委派给另外一个叫做WindowManagerGlobal的对象,这个WindowManagerGlobal则是GUI端的最初一站,它负责与wms(WindowManagerServer)通信。它在frameworks/base/core/java/android/view/WindowManagerGlobal.java 须要留神WindowManagerGlobal是一个单例,也就是说每一个应用程序(严格来说是每一个过程只有一个实例,但安卓下面带有GUI的应用程序只能存活在一个过程,所以能够了解 为一个应用程序)只有一个实例,所以它治理着一个应用程序中的所有的View tree。从它的成员中便可看出,它有一坨ViewRootImpl对象(一个列表),而每一个ViewRoot对象治理着一颗View tree。 最为要害的一个办法就是WindowManagerGlobal#addView,每一个Window的持有者对象(如Activity或者Dialog)都是通过这个办法将其DecorView对象增加给WindowManager的。addView办法,会先创立一个ViewRootImpl对象,而后把要增加的view以及刚创立进去的ViewRootImpl都放进它的列表中,最初再调用ViewRootImpl#setView(view),这就把几大要害对象建设好了连贯,接下来的事件就归ViewRootImpl了。这里还有一个相当要害的对象,那就是LayoutParams,WindowManagerGlobal也有一个列表外面存着每个Viewtree根节点(也就是Decor view)的LayoutParams。 ...

June 19, 2023 · 2 min · jiezi

关于android:LeetCode-周赛-3502023061801-背包变型题

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 常识星球发问。往期回顾:LeetCode 单周赛第 348 场 · 数位 DP 模版学会了吗?T1. 总行驶间隔(Easy) 标签:模仿T2. 找出分区值(Medium) 标签:排序T3. 特地的排列(Medium) 标签:图、状态压缩、回溯T4. 给墙壁刷油漆(Hard) 标签:动静布局、01 背包 T1. 总行驶间隔(Easy)https://leetcode.cn/problems/total-distance-traveled/题解(模仿)WA 的举手: class Solution { fun distanceTraveled(mainTank: Int, additionalTank: Int): Int { return mainTank * 10 + Math.min(additionalTank, mainTank / 5) * 10 }}这道题须要思考加油后又补足 5 升油量的状况: class Solution { fun distanceTraveled(mainTank: Int, additionalTank: Int): Int { var ret = 0 var x = mainTank var y = additionalTank while (x >= 5) { val time = x / 5 ret += time * 50 x %= 5 val diff = Math.min(time, y) y -= diff x += diff } return ret + x * 10 }}复杂度剖析: ...

June 19, 2023 · 4 min · jiezi

关于android:Bitmap-介绍详细版

Bitmap 是 Android 应用程序中用来示意图像的类,提供了多种办法来操作和解决图像数据。上面是 Bitmap 类的全副办法介绍: 构造方法Bitmap(int width, int height, Bitmap.Config config):创立一个指定宽度、高度和像素格局的空白 Bitmap 对象。 Bitmap(int width, int height, Bitmap.Config config, boolean isMutable):创立一个指定宽度、高度、像素格局和是否可变的空白 Bitmap 对象。 Bitmap(android.graphics.Bitmap source):将指定 Bitmap 对象的像素数据拷贝到新的 Bitmap 对象中。 Bitmap(android.graphics.Bitmap source, boolean isMutable):将指定 Bitmap 对象的像素数据拷贝到新的 Bitmap 对象中,同时指定是否可变。 Bitmap.createBitmap(int width, int height, Bitmap.Config config):创立一个指定宽度、高度和像素格局的空白 Bitmap 对象。 Bitmap.createBitmap(int[] colors, int offset, int stride, int width, int height, Bitmap.Config config):从给定的色彩数组中创立一个蕴含指定宽度、高度和像素格局的 Bitmap 对象。 Bitmap.createBitmap(android.graphics.Bitmap source, int x, int y, int width, int height):从指定 Bitmap 对象中截取一部分像素数据创立一个新的 Bitmap 对象。 ...

June 16, 2023 · 2 min · jiezi

关于android:Android逆向某麦网抢票接口加密参数分析

原文链接:https://github.com/m2kar/m2kar.github.io/issues/21 一、概述针对某麦网局部演唱会门票仅能在app渠道抢票的问题,本文钻研了APK的抢票接口并编写了抢票工具。本文介绍的程序为环境搭建、抓包、trace剖析、接口参数获取、rpc调用实现,以及最终的性能实现。通过浏览本文,你将学到反抓包技术破解、Frida hook、jadx apk逆向技术,并能对淘系APP的运行逻辑有所理解。本文仅用于学习交换,严禁用于非法用处。 关键词: frida, damai.cn, Android逆向 先放胜利截图: 二、缘起疫情完结的2023年5月,大家对出去玩都有点疯狂,歌手们也扎堆开演唱会。演唱会虽多,票却一点也不好抢,抢五月天的门票难度不亚于买五一的高铁票。所以想尝试找一些脚本来辅助抢票,之前常常用selenium和request做一些小爬虫来搞定自动化的工作,所以在 MakiNaruto/Automatic_ticket_purchase的根底上改了改,实现抢票性能。然而某麦网切实太刁滑了,改完爬虫才发现简直所有的热门演唱会只容许在app购买,所以就须要利用APP实现接口自动化。 本着能省事则省事的准则,笔者在文章[[Android] 基于Airtest实现某麦网app主动抢票程序](https://github.com/m2kar/m2kar.github.io/issues/20) 中用自动化测试技术实现了抢票程序,然而速度太慢,简直不能用。果然捷径往往不好走,因而持续尝试剖析某麦网apk的api接口。 三、环境搭建本文所需的破解环境如下: windows 10cn.damai apk 版本8.5.4 (2023-04-26)bluestacks 5.11.56.1003 p64adb 31.0.2Root Checker 6.5.3wireshark 4.0.5frida 16.0.19jadx-gui 1.4.73.1 bluestacks 环境搭建目前,Android模拟器竞品很多,抉择Bluestacks 5是因为它能和windows的hyper-v完满兼容,root过程也绝对简略。首先,须要root Bluestacks环境,下载安装Bluestacks,而后运行Bluestacks Multi-instance Manager,发现默认装置的版本为Android Pie 64bit版本,即Android 9.0。 敞开bluestack后关上bluestacks配置文件,文件位于目录:%programdata%\BlueStacks_nxt\bluestacks.conf 在配置文件中查找root关键词,对应值批改为1,共两处。 bst.feature.rooting="1"bst.instance.Pie64.enable_root_access="1" 启动bluestack模拟器,装置 Root Checker APP,点击验证root,即可发现root已胜利。 3.2 adb调试bluestack设置-高级中关上Adb调试,并记录下端口。 接下来,关上主机命令行,运行命令 adb connect localhost:6652,端口号批改为上一步的端口号,即可连贯。再运行adb devices,如有对应设施则连贯胜利。进入adb shell,执行su进入root权限,命令行标识由$变为#,即示意adb 进入root权限胜利。 3.3 frida环境搭建frida是赫赫有名的动态分析的hook神器,用它能够间接拜访批改二进制的内存、函数和对象,十分不便。它对于Android的反对也是很完满。frida的运行采纳C/S架构,客户端为电脑端的开发环境,服务器端为Android,均需对应部署搭建。 firda客户端基于python3开发,因而首先须要配置好python3的运行环境,而后执行 pip install frida-tools即可实现装置,运行 frida --version可验证frida版本。 (py3) PS E:\TEMP\damai> frida --version16.0.19接下来,是在Android模拟器中运行frida-server。这样能够让Frida通过ADB/USB调试与咱们的Android模拟器连贯。 ...

June 16, 2023 · 5 min · jiezi

关于android:有奖调研HarmonyOS新物种鸿蒙流量新阵地元服务邀你来答题

“聊技术无话不谈,一起来吹吹元服务!畅聊你对元服务的想法,说不定,你就能撬动元服务的暴发增长!” 元服务(即原子化服务)是华为“轻量化”服务的新物种,可提供全新的服务和交互方式,让利用化繁为简,让服务触手可及!基于鸿蒙万能卡片,元服务可实现利用性能在桌面“永远关上”,实现智能举荐、服务中转! 而在元服务应用场景一直拓宽的明天,咱们也须要您的体验反馈和贵重倡议,邀请您基于行业畛域常识的理解,分享您的视角与见解! 【有奖调研】元服务需要用户调研 https://developer.huawei.com/consumer/cn/service/josp/agc/cqp... 【流动阐明】 点击“立刻参加”进入问卷填写,此次调研中咱们将选取5位反馈优质倡议的用户,赠送HUAWEI智能键盘(价值499元)! 【流动工夫】2023.6.12-6.18 【评奖规定】专家评审将从问卷反馈内容的业余度和价值度等角度进行评分,如合乎评比规定要求的回复有余时,奖项可顺延。 理解更多详情>> 拜访HMS Core 联盟官网 获取HMS Core 开发领导文档 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

June 15, 2023 · 1 min · jiezi

关于android:Android-的UI组件Compose的介绍和基本用法

Android 的UI组件Compose的用法一:前言Jetpack Compose 是用于构建原生Android界面的新工具包,他用更少的代码,弱小的工具和直观Kotlin API,能够帮忙他简化并放慢Android界面开发 Compose架构的分层设计 由上至下阐明使用material提供了Material Design一套格调体系,蕴含主题零碎、款式化组件Button、AlertDialog等等foundation相当于面向开发者的跟基层,蕴含残缺的UI零碎和实用布局LazyList、Row、Column等等animation动画层,蕴含平移、突变、缩放等等,并且提供了不便开发者的动画组件animate AsState、Transition、Animatable、AnimatedVisibility等等uiui相干的根底性能,包含自定义布局、绘制、触摸反馈等等ComposeView、Layout、LayoutNode等等runtime最底层的概念模型,包含数据结构、状态解决、数据同步等等mutableStateOf、remember等等compiler基于Kotlin的编译器插件解决@Composable函数二:setContent的源码剖析public fun ComponentActivity.setContent( parent: CompositionContext? = null, content: @Composable () -> Unit) {//1.通过decorView找到ContentView,再获取第一个 ComposeView val existingComposeView = window.decorView .findViewById<ViewGroup>(android.R.id.content) .getChildAt(0) as? ComposeView//2.如果ComposeView为空则走初始化流程 if (existingComposeView != null) with(existingComposeView) { setParentCompositionContext(parent) setContent(content) } else ComposeView(this).apply { // 3. 初始化ComposeView必定为空,则进入这边 // Set content and parent **before** setContentView // to have ComposeView create the composition on attach setParentCompositionContext(parent)// 4. 把入口函数对象传入ComposeView setContent(content) // Set the view tree owners before setting the content view so that the inflation process // and attach listeners will see them already present setOwners()// 5. 把ComposeView设置进ContentView setContentView(this, DefaultActivityContentLayoutParams) }} ...

June 15, 2023 · 2 min · jiezi

关于android:推送服务接入指导HarmonyOS篇

音讯推送作为App经营日常应用的用户促活和召回伎俩,是与用户建设继续互动和连贯的良好形式。推送服务(Push Kit)是华为提供的音讯推送平台,建设了从云端到终端的音讯推送通道,本文旨在介绍HarmonyOS(Java)版本的性能及接入领导。 HarmonyOS(Java)版本次要性能为依据token推送告诉栏和透传音讯。HarmonyOS Java SDK为您的HarmonyOS利用开发提供推送音讯相干的接口,实用于手机和平板。 依据Push Token推送音讯您能够输出指标用户的Push Token来推送音讯,一次最多可填1000个Push Token。 透传音讯透传音讯是由客户端利用负责解决的音讯。终端设备收到Push云端发送的数据或指令后不间接展现,而是将数据传递给利用,由利用解析内容,并触发相干动作(如跳转网页、利用内页面等等)。您能够自定义音讯款式,从而更高效灵便地推送音讯。 透传音讯的达到率受Android零碎和利用是否驻留在后盾影响,推送服务不保障透传音讯的高达到率。 透传音讯的罕用场景:VoIP呼叫、语音播报、好友互动告诉等。 开发筹备具体开发筹备请参考官网。 利用开发获取Push TokenToken是推送令牌,每个设施上的每个利用的Token都是惟一存在的,客户端调用getToken办法向Push服务端申请利用的Token,您能够依据Push服务端返回的Token向利用推送音讯。当getToken办法返回为空时,可通过onNewToken办法获取Token值。 倡议将Push Token上报到您本人的应用服务器,并定时更新Token列表。您能够调用上行音讯API,依据这些Token批量推送音讯。 创立一个新的线程,并调用getToken办法获取Push Token(倡议在利用启动后的首个Ability中调用getToken办法)。public class TokenAbilitySlice extends AbilitySlice { private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001234, "TokenAbilitySlice"); private void getToken() { // 创立新线程 new Thread("getToken") { @Override public void run() { try { // 从agconnect-services.json文件中读取client/app_id String appId = "your APP_ID"; // 输出token标识"HCM" String tokenScope = "HCM"; // 获取Push Token String token = HmsInstanceId.getInstance(getAbility().getAbilityPackage(), TokenAbilitySlice.this).getToken(appId, tokenScope); } catch (ApiException e) { // 获取Push Token失败时,打印错误码 HiLog.error(LABEL_LOG, "get token failed, the error code is %{public}d", e.getStatusCode()); } } }.start(); }}在您的service(已继承HmsMessageService)中,覆写onNewToken办法,当Token发生变化时以onNewToken办法返回。public class DemoHmsMessageServiceAbility extends HmsMessageService { private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001234, "DemoHmsMessageServiceAbility"); @Override // 获取Token public void onNewToken(String token) { HiLog.info(LABEL_LOG, "onNewToken called, token:%{public}s", token); } @Override // 获取Token失败,打印错误码 public void onTokenError(Exception exception) { HiLog.error(LABEL_LOG, "get onNewtoken error, error code is %{public}d", ((ZBaseException)exception).getErrorCode()); }}获取透传音讯数据在您的service(已继承HmsMessageService)中,覆写onMessageReceived办法,只有您发送透传音讯至终端设备,都会取得透传音讯的内容。 ...

June 15, 2023 · 3 min · jiezi

关于android:还在为618电商推送方案烦恼我们帮你做好了

618是每年重要的电商大促流动,热度高流量大,是电商App吸引新用户,进步用户转化率(购买率)的最好机会。对电商App经营来说,音讯推送是不可疏忽的流量起源之一,适当的音讯推送能够召回用户,进步用户复购率。如何利用音讯推送性能在618电商节帮忙App获取流量并进步转化率是经营须要关注的问题。 在答复这个问题之前,咱们能够先想一想:和其余类型的App相比,电商App推送特点是什么? 1. 电商App的音讯推送围绕着“流动”和“商品”开展。在各种节日,电商App针对用户关注的店铺或者商品来推送促销信息,用户在购买胜利后还会发送商品物流信息等,很少呈现新闻类、常识类的内容。 2.对于推送工夫的要求,电商App个别在早晨推送。整体上来看,大部分App会抉择用户看手机频率较高的时间段进行推送,如8点和18点左右的早晚顶峰期间。用户在早晨的购买欲望较高,且容易激动生产,所以电商App会抉择在20-24点(睡觉前)进行推送。 3.推送对象数量大且简单,对精细化推送的要求水平高。电商App用户数量宏大,遍布各个年龄层和行业,面对大量可推送的用户,精密用户标签,一键推送到指标用户很要害。 4.线下潜在的生产场景丰盛,可抓住的推送机会多。大部分商品在线上线下渠道都会进行销售,此时,能够利用音讯推送,把线上商店的音讯推送给线下用户,整合线上线下渠道,实现“1+1>2”的成果。 针对以上电商App推送的痛点和需要,华为基于推送服务(Push Kit)构建的Push用户增长服务,为开发者提供高级性能,如丰盛新鲜的告诉展现款式等,通过失当的展现机会和智能投放,无效晋升音讯的曝光度并吸引用户点击,帮忙开发者触达已装置但从未关上过利用的用户,以及已装置但低频应用利用的用户,从而高效促成利用的用户增长和用户活跃度晋升。 产品性能1. 客户接入用户增长平台提供AppGallery Connect和Marketing API两种接入形式。客户能够通过登录AppGallery Connect应用用户增长门户进行自助经营流动投放,也能够通过Marketing API对接Push用户增长平台实现工作投放和治理。 2. 投放平台蕴含指标设定、人群圈选、文案创意、出现机会和成果归因的流动推广的残缺链路。 指标设定:反对缄默唤醒和促激活,面向两种不同的场景的推广指标。 人群圈选:反对标签人群圈定、公有人群上传、自定义人群直投和RTA筛选,保障指标人群更精准。 文案创意:反对文本、图片、按钮根本款式,反对文案AB,反对自定义小图标、背景图、自定义题目色彩等高级款式,减少曝光成果,晋升点击率。 出现机会:反对定义音讯出现的机会,立刻显示、下拉告诉栏显示、亮屏显示,减少曝光成果,晋升点击率。 成果归因:反对成果统计分析,点击回执上报。 3. 音讯中台提供稳固牢靠和笼罩宽泛的音讯连贯,以及大容量、高并发的音讯发送能力。 4. Push Kit以常驻服务运行在终端设备,提供稳固牢靠的音讯连贯、音讯收发和告诉展现能力。针对增长服务提供多种高级显示款式和音讯展现机会。 除此之外,华为推送服务也提供了丰盛的能力来帮忙您在618进步转化率。 受众发送、主题订阅能力。通过对受众进行洞察剖析,理解产品对什么样的用户更有吸引力,针对不同的受众制订不同的推送策略,也可将音讯发送至订阅相干主题的特定人群,从而做到差异化经营,将适合的商品信息推给适合的人。 主动推送告诉能够自定义相干事件,在该事件产生时主动触发音讯推送,即在适合的场景中,推送适合的内容给适合的人。不仅能无效升高推送经营老本,还能晋升用户购物体验,让推送的价值最大化。相干场景包含温度变动时、节假日或休息日、天文围栏条件触发时等,基于场景进行推送能够准确命中用户不同场景下的不同需要。 产品劣势1. 丰盛新鲜的告诉展现款式电商App推送需重点突出商品或流动信息,让用户第一眼就能看懂最重要的信息。华为推送用户增长服务笼罩华为手机,提供多种音讯显示款式,包含振动、铃声、自定义小图标、自定义题目色彩、背景图、大图等多种推送款式。电商App在音讯推送时失当应用这些个性化的推送款式能够带来更好的曝光成果,进步推送音讯的关上率。 2. 人群圈选精准同一个电商App不同流动面向的人群是不一样的,这就要求人群划分足够粗疏,这样推送的关上率才越高。华为Push用户增长服务基于智能化大数据分析,提供丰盛的根底标签、特有的用户行为标签和趣味标签,开发者可通过华为提供的个性化人群标签筛选,精准圈选发送对象,也可自定义指标人群,助力精细化触达。 3. 展现机会智能提供多种智能化音讯展现机会,告诉音讯不仅能够在手机锁屏或熄屏的时候进行展现,还可在手机亮屏或用户在进行下拉告诉栏操作时动静展现、送达时展现等,失当机会揭示,晋升音讯的曝光率与点击率。 4. 零碎级通道Push用户增长服务可发送零碎级Push音讯,即便利用不在过程中也能将款式丰盛的音讯疾速送达用户端。 理解更多详情>> Push用户增长服务官网 Push用户增长服务接入指南 拜访HMS Core 联盟官网 获取HMS Core 开发领导文档 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

June 14, 2023 · 1 min · jiezi

关于android:直播回顾走进元服务携手小强停车探索鸿蒙新流量阵地

本期直播《“元”来如此,“服务”中转——揭秘鸿蒙新流量阵地》聚焦元服务的商业流量价值,介绍元服务提供的服务中转和卡片动态变化等轻量化服务。网约停车旗舰平台小强停车做客直播间,分享小强停车在HarmonyOS生态中,如何通过元服务为宽广用户带来更加便捷易用的线上预约停车体验。快来一起回顾直播的精彩内容吧! 【直播回放】 https://developer.huawei.com/consumer/cn/training/course/live... 【精彩对话】 Q1:什么是元服务?元服务如何散发服务内容? Frank:元服务作为HarmonyOS提供的一种全新的利用状态,具备独立入口,以鸿蒙万能卡片等状态,将航班、快递、日程、工夫等要害信息间接展现在手机桌面和负一屏上,是“即用即走、一键服务中转”的轻量化程序实体。例如,小强停车的车组用户点击卡片预约车位,享受停车费8折优惠;车位预约胜利后,卡片上会展现预约信息,入场工夫,起到揭示作用;待车辆进场后,万能卡片还会有定期的工夫提醒,以便车主节俭停车费。 *示意图仅供参考 Q2:元服务带来了哪些不一样的体验? Frank: (1)一键服务中转:以卡片的模式展示在桌面,将用户感兴趣的内容前置外显、动静更新; (2)轻量化体验:即点即用,即用即走; (3)软硬件联合:将来用碰一碰、扫一扫等形式即可间接触发; (4)跨端迁徙:将来实现1+8+N设施的无缝流转。 Q3:元服务的商业价值是什么? Anja:华为终端上提供多样化零碎级智慧入口作为卡片散发矩阵:手机预装、利用市场、负一屏、浏览器、搜寻等。除了这些入口的流量曝光,元服务将来还会联合AI能力,做更多的场景化举荐的服务卡片,提供“服务找人”能力。例如,针对旅行/出差场景,零碎能够举荐“订酒店机票、打车、拍照美图、当地餐饮”等组合卡片,深刻了解用户用意,举荐“精准的”、“左近的”服务,帮忙终端用户疾速地实现旅行前、旅行中以及旅行后等相干应用需要。 *示意图仅供参考 Q4:元服务如何赋能产品、开发者实现用户增长? Anja & Sophia:HarmonyOS 推送服务,提供多种款式的Push音讯推送,让终端用户中转内容页面,比方小强停车用户进停车场后,手机会智能举荐场内的充电、洗车、商业网生产等服务信息;将来还会有元服务一键加桌,增加卡片到桌面后,后续用户也能够疾速找到,帮忙产品晋升激活与转化。 另外,HarmonyOS生态下的剖析服务,交融OS和要害服务数据,买通全链路数据,提供场景化剖析。比方:用户起源场景剖析,剖析用户是从哪里来的,哪些渠道品质好;用户散失场景剖析,用户散失前/后去了哪里;元服务分享的剖析,多少人分享了,应用了什么平台分享,分享产生的成果怎么样。 Q5:HarmonyOS 扫码服务如何帮忙小强停车解决停车场的扫码场景暗淡、距离远、反光等问题?有什么技术劣势吗? Anja & Sophia:一方面,扫码服务对相机调整进行了个性优化,针对远距离扫码对焦慢的问题,相机进行主动的疾速调焦放大;光照不均的状况下,能够实现自动检测和曝光调整,从而能够实现输入高质量的图像;另一方面,扫码服务基于自研计算机视觉技术,可实现艰难的二维码检测和角度辨认,并对其进行校对,从而可实现码辨认准确率和速度。 技术劣势方面,扫码服务基于HarmonyOS API,行将在华为手机上实现软硬芯协同。开发者将来调起扫码API时,将默认拉起相机扫码模式。相机会精简非必要算法/资源,主动进行码检测,针对码区域进行3A调节(主动对焦、主动曝光、主动白平衡),输入高清码图,晋升扫码的辨认准确率和速度。 【理解更多】 如有技术或单干需要,欢送问卷反馈 欢送点击元服务官网,理解更多 理解更多详情>> 拜访HMS Core 联盟官网 获取HMS Core 开发领导文档 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

June 13, 2023 · 1 min · jiezi

关于android:有奖调研互联网新型社交华为在找元服务搭子快来集合

“聊技术无话不谈,一起来吹吹元服务!畅聊你对元服务的想法,说不定,你就能撬动元服务的暴发增长!” 元服务(即原子化服务)是华为“轻量化”服务的新物种,可提供全新的服务和交互方式,让利用化繁为简,让服务触手可及!基于鸿蒙万能卡片,元服务可实现利用性能在桌面“永远关上”,实现智能举荐、服务中转! 而在元服务应用场景一直拓宽的明天,咱们也须要您的体验反馈和贵重倡议,邀请您基于行业畛域常识的理解,分享您的视角与见解! 【有奖调研】元服务需要用户调研 【流动阐明】 点击“立刻参加”或扫描二维码进入问卷填写,此次调研中咱们将选取5位反馈优质倡议的用户,赠送HUAWEI智能键盘(价值499元)! 【流动工夫】2023.6.12-6.18 【评奖规定】专家评审将从问卷反馈内容的业余度和价值度等角度进行评分,如合乎评比规定要求的回复有余时,奖项可顺延。 理解更多详情>> 拜访HMS Core 联盟官网 获取HMS Core 开发领导文档 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

June 12, 2023 · 1 min · jiezi

关于android:直播回顾走进元服务携手小强停车探索鸿蒙新流量阵地

本期直播《“元”来如此,“服务”中转——揭秘鸿蒙新流量阵地》聚焦元服务的商业流量价值,介绍元服务提供的服务中转和卡片动态变化等轻量化服务。网约停车旗舰平台小强停车做客直播间,分享小强停车在HarmonyOS生态中,如何通过元服务为宽广用户带来更加便捷易用的线上预约停车体验。快来一起回顾直播的精彩内容吧! 【直播回放】 https://developer.huawei.com/consumer/cn/training/course/live... 【精彩对话】 Q1:什么是元服务?元服务如何散发服务内容? Frank:元服务作为HarmonyOS提供的一种全新的利用状态,具备独立入口,以鸿蒙万能卡片等状态,将航班、快递、日程、工夫等要害信息间接展现在手机桌面和负一屏上,是“即用即走、一键服务中转”的轻量化程序实体。例如,小强停车的车组用户点击卡片预约车位,享受停车费8折优惠;车位预约胜利后,卡片上会展现预约信息,入场工夫,起到揭示作用;待车辆进场后,万能卡片还会有定期的工夫提醒,以便车主节俭停车费。 *示意图仅供参考 Q2:元服务带来了哪些不一样的体验? Frank:(1)一键服务中转:以卡片的模式展示在桌面,将用户感兴趣的内容前置外显、动静更新; (2)轻量化体验:即点即用,即用即走; (3)软硬件联合:将来用碰一碰、扫一扫等形式即可间接触发; (4)跨端迁徙:将来实现1+8+N设施的无缝流转。 Q3:元服务的商业价值是什么? Anja:华为终端上提供多样化零碎级智慧入口作为卡片散发矩阵:手机预装、利用市场、负一屏、浏览器、搜寻等。除了这些入口的流量曝光,元服务将来还会联合AI能力,做更多的场景化举荐的服务卡片,提供“服务找人”能力。例如,针对旅行/出差场景,零碎能够举荐“订酒店机票、打车、拍照美图、当地餐饮”等组合卡片,深刻了解用户用意,举荐“精准的”、“左近的”服务,帮忙终端用户疾速地实现旅行前、旅行中以及旅行后等相干应用需要。 *示意图仅供参考 Q4:元服务如何赋能产品、开发者实现用户增长? Anja & Sophia:HarmonyOS 推送服务,提供多种款式的Push音讯推送,让终端用户中转内容页面,比方小强停车用户进停车场后,手机会智能举荐场内的充电、洗车、商业网生产等服务信息;将来还会有元服务一键加桌,增加卡片到桌面后,后续用户也能够疾速找到,帮忙产品晋升激活与转化。 另外,HarmonyOS生态下的剖析服务,交融OS和要害服务数据,买通全链路数据,提供场景化剖析。比方:用户起源场景剖析,剖析用户是从哪里来的,哪些渠道品质好;用户散失场景剖析,用户散失前/后去了哪里;元服务分享的剖析,多少人分享了,应用了什么平台分享,分享产生的成果怎么样。 Q5:HarmonyOS 扫码服务如何帮忙小强停车解决停车场的扫码场景暗淡、距离远、反光等问题?有什么技术劣势吗? Anja & Sophia:一方面,扫码服务对相机调整进行了个性优化,针对远距离扫码对焦慢的问题,相机进行主动的疾速调焦放大;光照不均的状况下,能够实现自动检测和曝光调整,从而能够实现输入高质量的图像;另一方面,扫码服务基于自研计算机视觉技术,可实现艰难的二维码检测和角度辨认,并对其进行校对,从而可实现码辨认准确率和速度。 技术劣势方面,扫码服务基于HarmonyOS API,行将在华为手机上实现软硬芯协同。开发者将来调起扫码API时,将默认拉起相机扫码模式。相机会精简非必要算法/资源,主动进行码检测,针对码区域进行3A调节(主动对焦、主动曝光、主动白平衡),输入高清码图,晋升扫码的辨认准确率和速度。 【理解更多】 如有技术或单干需要,欢送问卷反馈 欢送点击元服务官网,理解更多 理解更多详情>> 拜访HMS Core 联盟官网 获取HMS Core 开发领导文档 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

June 12, 2023 · 1 min · jiezi

关于android:View-方法介绍简介易懂版

View 是 Android 中所有 UI 控件的基类,提供了各种办法来管制和治理控件的显示、交互等行为。以下是 View 类的全副办法介绍: 构造方法View(Context context) View(Context context, AttributeSet attrs) View(Context context, AttributeSet attrs, int defStyleAttr) View(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) 显示相干办法setVisibility(int visibility):设置 View 的可见性; getWindowVisibleDisplayFrame(Rect outRect):获取以后可见区域的矩形; getGlobalVisibleRect(Rect r):获取 View 在屏幕上可见的矩形; postInvalidate():申请从新绘制 View; invalidate():立刻从新绘制 View。 尺寸相干办法getWidth() 和 getHeight():获取 View 的宽度和高度; getMeasuredWidth() 和 getMeasuredHeight():获取测量后的 View 宽度和高度; setMinimumWidth(int minWidth) 和 setMinimumHeight(int minHeight):设置 View 的最小宽度和最小高度; setLayoutParams(ViewGroup.LayoutParams params):设置 View 的布局参数; requestLayout():申请从新测量和布局 View。 地位相干办法getX() 和 getY():获取 View 在父容器中的地位坐标; getLeft()、getTop()、getRight() 和 getBottom():获取 View 四个边界的坐标; getLocationOnScreen(int[] location):获取 View 在屏幕上的地位坐标; setX(float x) 和 setY(float y):设置 View 的横纵坐标; setTranslationX(float translationX) 和 setTranslationY(float translationY):设置 View 的平移间隔。 ...

June 11, 2023 · 2 min · jiezi

关于android:LeetCode-双周赛-10620230610两道思维题

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 退出常识星球发问。往期回顾:LeetCode 单周赛第 348 场 · 数位 DP 模版学会了吗?双周赛 106 概览T1. 判断一个数是否迷人(Easy) 标签:计数T2. 找到最长的半重复子字符串(Medium) 标签:同向双指针T3. 移动机器人(Medium) 标签:脑筋急转弯、排序T4. 找到矩阵中的好子集(Hard) 标签:散列表、贪婪 T1. 判断一个数是否迷人(Easy)https://leetcode.cn/problems/check-if-the-number-is-fascinating/description/题解一(计数)计算拼接后的数字,并查看数字 1 到 9 的数量是否为 1,能够用字符串比拟来模仿计数;察看数字法则,非法 n 的无效范畴是 [123, 329]。class Solution { fun isFascinating(n: Int): Boolean { if (n !in 123..329) return false return "123456789" == "$n${2*n}${3*n}".asSequence().sorted().joinToString("") }}复杂度剖析: 工夫复杂度:O(UlgU) U 是单个数字的最大长度空间复杂度:O(U)题解二(打表)题目范畴中只有 4 个迷人数。 class Solution { fun isFascinating(n: Int): Boolean { return n in arrayOf(192, 219, 273, 327) }}复杂度剖析: ...

June 11, 2023 · 2 min · jiezi

关于android:MobPush-厂商通道申请指南

华为厂商申请创立利用登录[](https://developer.huawei.com/consumer/cn/service/josp/agc/ind...;华为开发者联盟,注册您的利用,在利用信息中获取APP ID和Client Secret</p><p><img src=) [ 配置SHA256证书指纹](https://developer.huawei.com/consumer/cn/service/josp/agc/ind...;华为开发者联盟,注册您的利用,在利用信息中获取APP ID和Client Secret</p><p><img src=) [在华为开发者联盟配置SHA256证书指纹。获取及配置请参见华为官网文档](https://developer.huawei.com/consumer/cn/service/josp/agc/ind...;华为开发者联盟,注册您的利用,在利用信息中获取APP ID和Client Secret</p><p><img src=)配置AppGallery Connect 设置音讯回执集成华为厂商通道SDK后,须要在华为后盾配置音讯回执才能够统计到华为厂商的推送数据,具体设置办法请参见:音讯回执 开明回执需配置回调地址:https://report.push.mob.com/huawei/report 留神回执没有配置会无奈统计华为厂商推送的达到数 Mob开发者后盾配置密钥在Mob开发者后盾利用的【MobPush】->【推送设置】填写AppID和Secret 集成SDK在利用 module 的 gradle文件中找到MobSDK代码块,增加HUAWEI代码块。具体设置办法请参见:厂商SDK集成指南 华为厂商FAQ华为厂商的具体错误码,可参考华为常见错误码,点击理解 华为厂商集成问题,请参考问题FAQ,点击理解 光荣厂商申请创立利用登录光荣开发者服务平台,如果还未注册,可参考:账号注册创立利用并申请开明推送服务,可参考:申请开明推送服务获取利用的APP ID、APP Secret、Client ID、Client Secret 目前光荣仅反对Magic UI 4.0+,请参考:光荣推送业务介绍 Mob开发者后盾配置密钥在Mob开发者后盾利用的【MobPush】->【推送设置】填写APP ID、、APP Secret、Client ID、Client Secret 集成SDK在利用 module 的 gradle文件中找到MobSDK代码块,增加HONOR代码块。具体设置办法请参见:厂商SDK集成指南 光荣厂商FAQ光荣厂商的具体应用问题,可参考光荣平台FAQ,点击理解 小米厂商申请创立利用登录小米开放平台,注册您的App,在利用信息中获取AppID、AppKey、AppSecret。 Mob开发者后盾配置密钥在Mob开发者后盾利用的【MobPush】->【推送设置】填写AppID、AppKey、AppSecret。 集成SDK在利用 module 的 gradle文件中找到MobSDK代码块,增加XIAOMI代码块。具体设置办法请参见:厂商SDK集成指南 小米厂商FAQ小米厂商的具体应用问题,可参考小米平台FAQ,点击理解 OPPO厂商申请创立利用登录OPPO开放平台,抉择推送服务,在推送服务中注册您的利用,在利用信息中获取AppID、AppKey、AppSecret、MasterSecret。 Mob开发者后盾配置密钥在Mob开发者后盾利用的【MobPush】->【推送设置】填写AppID、AppKey、AppSecret、MasterSecret。 注:channelId参数为可选参数,对于target API≥ 26(Android 8.0)的利用,必须适配告诉通道,未指定通道的状况下收回的告诉将无奈显示,对于target API ≤ 25(Android 7.1)的利用,能够不适配,在8.0及以上的设施,告诉也能失常收回。 详情能够参考OPPO平台告诉通道(Channel)适配文档,点击理解 ...

June 9, 2023 · 1 min · jiezi

关于android:MobPush-消息重弹

性能概述音讯重弹性能,可在安卓在线通道送达的音讯被其余音讯挤下去时,从新置顶,减少音讯的曝光度和点击率。 实用场景仅反对Mob通过自有TCP通道下发的告诉音讯,不反对自定义推送音讯反对开发者后盾和推送API配置应用性能应用开发者后盾应用在创立推送时,可在安卓可选设置中关上音讯重弹开关。 未关上开关状态: 关上开关状态: 配置实现后,点击立刻发送即可体验音讯重弹性能。 推送API应用可拜访推送API进行设置,详见推送对象 - androidNotify - notifyRepeat

June 9, 2023 · 1 min · jiezi

关于android:中企出海成大热趋势海外用户如何高效触达

往年第一季度,美国下载量前五的APP中首次有四个来自中国公司!其中前三名由中国出海APP包揽,按程序是Temu(拼多多海外版)、Capcut(剪映海外版)和TikTok(抖音海外版)。从寰球最大的挪动利用市场——中国市场“卷进去”之后,出海企业们欣慰地发现,原来海内是easy模式。有钱、有人、不卷,中企扬帆出海,已成大热趋势。 图源:sensor tower 中企出海不是简略的“Copy from China”近年来国内网络用户增长放缓,挪动利用行业大踏步进入存量时代,此时进军海内市场就成了中企扩充流量池不可漠视的选项。最早有SHEIN强势抢占美国女装市场,再到TikTok横扫寰球短视频社交,以及最近Temu掀起大洋彼岸“砍一刀”浪潮,无一不证实了中企也有底气出海。 可海内市场尽管“鱼大”,但也“水深”。随着中国企业的影响力席卷寰球,跨境“航海家”们高歌猛进,海内限度中企的法律法规也纷纷出台,出海浪潮蒙受遏制。简略地“Copy from China”在新局势、高要求下成了过来式,出海利用必须直面与国内齐全不同的数据合规、网络环境以及软件生态等问题。  音讯推送作为APP连贯用户最无效的路径,在寰球市场里面临着音讯通道建设、海内用户精密经营、数据安全合规等方面的诸多挑战。要顺利解决音讯触达通道扩散、和海内用户沟通效率低、易涉及合规危险等难题,新一轮的“航海家”亟需具备国际化的“沟通工具”,以便在海内市场上实现更大的商业抱负。 MobPush寰球推送性能正式上线为了助推MobTech袤博科技新老APP客户出海,解决用户触达难点,升高出海企业经营老本,进步转化效率,MobPush寰球推送性能正式上线,新性能可同时反对国内外音讯高效触达,助力中企掘金海内市场。  寰球多通道推送,综合达到带领先行业国外APP的音讯推送,次要采纳谷歌服务的FCM通道和苹果服务的APNs通道,但出海APP立足寰球,面对简单的网络环境,仅依赖手机零碎通道,推送达到率必然不现实。  因而,MobPush的音讯推送通道除了反对支流的FCM通道和APNs通道外,还反对自有TCP通道和共享链路通道,并且全面接入华为推送、小米推送、OPPO推送、vivo推送、魅族推送、一加推送等厂商通道。为进一步提高音讯达到率,出海APP开发者还能够在后盾调用接口时切换到MobTech寰球服务器,如需利用api推送,能够间接连贯MobTech海内域名接口 ,音讯综合触达率在多通道的加持下达到行业领先水平。 寰球音讯智能推送,高效晋升转化效率在布局海内市场时,受各国文化差异的影响,中企APP触达海内用户时,很可能采纳“无差别”和“自嗨式”的推送文案,转化效率通常不尽如人意。因而出海APP在推送音讯时,须要一种更牢靠的智能推送形式来激活用户。 基于MobTech深厚的大数据研发能力,MobPush产品后盾具体统计分析了多种用户数据,便于洞察海内用户的应用习惯。依附用户数据建设的智能标签零碎,可依据不同类型用户的行为习惯推送更合乎用户爱好的信息,实现精准高效触达,唤醒不同文化背景下的用户群体。在投放时,多种推送模式包含纯文本推送、图文推送、大图推送、动图推送、透传推送以及滚动头条成果,配合上A/B测试,经营撰写文案能迷信无效地筛选出最优推送组合,牢牢把握海内用户的心理。 多维构建数据安全体系护航企业出海为了更好地助力APP企业出海,推动海内市场高质量倒退,MobTech始终牢固建立责任意识和自律意识,从组织机制、管理制度、技术能力、经营机制等维度,踊跃欠缺数据安全、合规利用体系。  以MobPush产品为例,MobTech提供分层权限治理、鉴权体系、日志监控、推送内容敏感词过滤等多重爱护机制,帮忙APP企业升高经营危险,全方位保障数据安全、系统安全和内容平安。在业务发展过程中,MobTech严格遵守平安合规的准则,最大限度地爱护集体信息安全,不仅如此,还踊跃地联动中国信通院、赛博研究院等机构和头部企业,在法规研究、规范利用、行业共建等方面发展了一系列数据安全专项工作,助力企业在海内衰弱倒退。凭借国家权威平安认证的产品矩阵和服务体系,MobTech已成为百万客户可信赖的首选厂商。

June 8, 2023 · 1 min · jiezi

关于android:MobPush-推送查询API

IP绑定工作台能够绑定服务器IP地址,未绑定之前所有IP均可进行REST API的调用,绑定后进仅绑定的IP才有调用权限。 设施信息查问接口依据RegistrationId查问设施信息接口地址http://api.push.mob.com/device-v3/getById/{registrationId} 申请形式GET 申请头部参数名参数类型参数阐明Content-Typeapplication/json必要参数keyStringMob后盾的MobAppKeysignString加密参数,加密规定为: md5(MobAppSecret)申请参数:参数名参数类型是否必要参数参数阐明registrationIdString是设施的registrationId申请示例curl --location --request GET 'http://api.push.mob.com/device-v3/getById/65l0soev0d0b4lc' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --header 'key: 2e08782eb311b' \ --header 'sign: 9f1bb16df0167c733eb83875dfe445db'返回参数阐明参数名参数类型参数阐明registrationIdStringrid 用户客户端获取的registrationIdtagsString[]设施标签数组aliasString设施别名mobileString手机号码( 用于短信补量等性能)openPushnumber是否开启推送 1:开启,0:敞开statusnumber设施状态 1:失常,3:卸载,0:删除(卸载统计未开明)返回示例申请胜利{ "status": 200, "res": { "registrationId": "65l0soev0d0b4lc", "tags": [ "TestTag2", "TestTag1" ], "alias": "TestAlias", "mobile": null, "openPush": 1, "status": 1 }, "error": null}申请失败{ "status": 5801, "res": null, "error": "数据校验失败"}依据别名查问设施信息接口地址http://api.push.mob.com/device-v3/getByAlias/{alias} 申请形式GET 申请头部参数名参数类型参数阐明Content-Typeapplication/json必要参数keyStringMob后盾的MobAppKeysignString加密参数,加密规定为: md5(MobAppSecret)申请参数:参数名参数类型是否必要参数参数阐明aliasString是设施设置的别名申请示例curl --location --request GET 'http://api.push.mob.com/device-v3/getByAlias/TestAlias' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --header 'key: 2e08782eb311b' \ --header 'sign: 9f1bb16df0167c733eb83875dfe445db'返回参数阐明参数名参数类型参数阐明registrationIdStringrid 用户客户端获取的registrationIdtagsString[]设施标签数组aliasString设施别名mobileString手机号码( 用于短信补量等性能)openPushnumber是否开启推送 1:开启,0:敞开statusnumber设施状态 1:失常,3:卸载,0:删除(卸载统计未开明)返回示例申请胜利{ "status": 200, "res": { "registrationId": "65l0soev0d0b4lc", "tags": [ "TestTag2", "TestTag1" ], "alias": "TestAlias", "mobile": null, "openPush": 1, "status": 1 }, "error": null}申请失败{ "status": 5801, "res": null, "error": "数据校验失败"}依据标签查看查问设施信息接口地址http://api.push.mob.com/device-v3/queryByTags ...

June 8, 2023 · 7 min · jiezi

关于android:变脸的秘密直播源码app开发技术特效功能的实现

网络时代的倒退使得直播源码app平台日渐火爆,抖音就是这些火爆的直播源码app平台的其中之一。大家在应用抖音看直播时有没有看见过这样的状况,在某一个直播间里,正在直播的人的脸在屏幕中会变长变宽,甚至是变得扭曲,或者是那个人会带上西瓜贴纸等其余水果贴纸,又或是在屏幕上看见动漫人物在搂着他,想必说到这里大家都明确我说的这一个状况是直播源码app平台的哪一个常见的性能了,没错,这个性能就是直播源码app平台的特效性能,这个性能对于开发直播源码app平台是十分重要的,废话不多说,上面我就为大家分享直播源码app开发技术特效性能的实现。 首先,咱们要明确直播源码app开发技术特效性能的实现有什么作用?第一个作用那就是能为直播源码app平台用户减少乐趣,如果在一个直播间中,当主播冷场的时候或者观众看久了主播的脸审美疲劳,那这个特效性能就派上了用场,特效性能中的特效不仅很乏味,而且品种繁多,能为主播或者用户提供多种抉择,减少乐趣。第二点,能够去遮蔽主播和用户的面容,特效不仅有漏全脸的特效,还有遮蔽某一地方或者间接将整个脸戴上其余动物或者货色的贴纸,当一个主播感觉本人不是很难看或者一位脸上有缺点的人士直播或者拍视频,不想让他人看到本人的脸或者缺点时,就能够关上特效去遮蔽。第三点,那就是吸引用户,特效性能作为当今市场上热门性能它的益处很多,而且公众很喜爱,你的直播源码app开发平台上具备这一性能,就能吸引到很多用户。实现直播源码app开发技术特效性能步骤:(局部代码)回调贴纸特效,取得自制特效  先设置脸部特效参数,在设置特效(这里我省略了一部分) 这样最根本的直播源码app开发技术特效性能就设置好了,在开发直播源码app平台中,不仅直播源码app开发技术特效性能是重要的,其余直播源码app开发技术性能也是很重要的,我会为大家一一分享进去,大家还有什么不懂的能够问我。

June 8, 2023 · 1 min · jiezi

关于android:MobPush-查看推送数据

推送详情查问进入“MobPush”的"详情"模块,查问推送整体的详情 推送详情查问进入“MobPush”的"推送记录"模块 点击“详情”按钮,查看推送详情状况

June 7, 2023 · 1 min · jiezi

关于android:Android查看竞品内存使用情况

首先电脑环境配置adb环境变量1.手机关上开发者模式,连贯上电脑2.电脑执行 adb shell pm list packages -3 ,列出装置在手机中所有apk包名3.电脑执行 adb shell ,连上手机4.关上微信,电脑执行 dumpsys meminfo com.tencent.mm 查看微信内存占用状况注:com.tencent.mm能够换成你要查看的apk包名 次要关注PSS和RSS的值。 相干内存术语解释: iOS查看竞品内存应用状况

June 7, 2023 · 1 min · jiezi

关于android:MobPush-配置应用包名

进入利用详情界面进入Mob开发者后盾,点击对应的开发利用进入利用详情界面 配置利用包名进入“推送设置”模块,点击“新增包名”按钮,设置包名信息 设置默认包名默认包是在后盾创立推送时多包名抉择的默认选项,可设置其余包名或者多包名推送

June 7, 2023 · 1 min · jiezi

关于android:From-Java-To-Kotlin-2Kotlin-类型系统与泛型终于懂了

上期次要分享了 From Java To Kotlin 1 :空平安、扩大、函数、Lambda。 这是 From Java to Kotlin 第二期。 带来 表达式思维、子类型化、类型零碎、泛型。 From Java to Kotlin 关键在于 思维的转变。 表达式思维Kotlin 中大部分语句是表达式。 表达式思维是一种编程思维。 编程思维是一种十分形象的概念,很多时候是只可意会不可言传的。不过,从某种程度上看,学习编程思维,比学习编程语法更重要。因为编程思维决定着咱们的代码整体的架构与格调,而具体的某个语法反而没那么大的影响力。当然,如果对 Kotlin 的语法没有一个全面的意识,编程思维也只会是海市蜃楼。就像,咱们学会了根底的汉字当前开始写作文:学了汉字当前,如果没把握写作的技巧,是写不出好的文章的。同理,如果学了 Kotlin 语法,却没有把握它的编程思维,也是写不出优雅的 Kotlin 代码的。 上面咱们看一段 Kotlin 代码 //--- 1var i = 0if (data != null) { i = data}//--- 2 var j = 0if (data != null) { j = data} else { j = getDefault() println(j)}//--- 3 var k = 0if (data != null) { k = data} else { throw NullPointerException()}//--- 4 var x = 0when (data) { is Int -> x = data else -> x = 0}//--- 5var y = 0try { y = "Kotlin".toInt()} catch (e: NumberFormatException) { println(e) y = 0}这些代码,如果咱们用平时写 Java 时的思维来剖析的话,是挑不出太多故障的。然而站在 Kotlin 的角度,就齐全不一样了。利用 Kotlin 的语法,咱们齐全能够将代码写得更加简洁,就像上面这样: ...

June 6, 2023 · 8 min · jiezi

关于android:MobPush-厂商通道回执配置指南

华为厂商回执配置登录华为 AppGallery Connect网站。在左侧菜单点击 增长 > 推送服务,进入“推送服务”页面。点击“配置”页签,开明我的项目的利用回执。 而后进入“抉择回执”配置页面,点击“新建回执”。 此处以新建回执为例,如您曾经配置回执信息,能够在原有回执信息根底上批改您的回执信息,如需理解更多请参考消息回执。 配置回执参数。 参数 参数阐明 回执名称 配置音讯回执的名称。 回调地址 应用mob提供的回调地址:https://report.push.mob.com/huawei/report 反对版本 目前须要抉择V1,暂未适配V2 点击“测试回执”能够对回执地址进行功能测试,点击“提交”实现回执的创立。而后在“抉择回执”配置页面,点击“确定”实现回执开明。 魅族厂商回执配置登录魅族开放平台,抉择须要开明推送服务的利用,点击 ”关上利用“ 。抉择 关上利用\>配置管理 - 回执治理 设置回执地址为:http://report.push.mob.com/meizu/report 留神:魅族此回执地址是http申请

June 5, 2023 · 1 min · jiezi

关于android:预约直播揭秘鸿蒙全新流量阵地元服务带来的体验变革

【导读】 在PC 互联网到挪动互联网的演进过程,随着人们对交互和信息获取的智能化要求越来越高,挪动终端上的利用生态倒退到明天也面临着改革。传统厚重的App,功能齐全,但开发成本高、周期长,且存在搜寻、装置、卸载等一系列须要用户被动关注的显性操作,这些显性操作给用户带来了实质性的应用老本。轻量化、可疾速达成消费者用意、可独立执行、实现繁多性能的程序实体正成为新的趋势,例如小程序、快利用等。 同样具备了“即用即走、无需装置卸载、永远最新”特点的元服务,是鸿蒙零碎的一种全新的轻量化利用状态,可通过华为利用市场、负一屏、搜寻等终端的多样化零碎级智慧入口进行散发,用户无需装置,通过点击卡片、碰一碰、扫一扫等形式即可间接触发,享受 “即用即走”的晦涩、丝滑体验。 与小程序不同,元服务能够以鸿蒙万能卡片状态,将航班、快递、日程等要害信息间接展现在桌面和负一屏上。将来还能够在1+8+N多设施间实现无缝流转、跨端迁徙,依靠零碎对于用户的场景化了解,向用户提供精准的服务,真正实现服务找人。 本期直播《“元”来如此,“服务”中转——揭秘鸿蒙新流量阵地》聚焦鸿蒙生态的全新流量阵地元服务,介绍其低代码开发和商业价值,揭示其无需装置、服务中转和卡片动态变化等轻量化服务。 对于有车一族来说,假期忙碌的商圈、高铁站、机场等场地,经常让车主“一位难求”。挪动利用开发者们如何解决停车难问题的“利器”?又是怎么晋升用户体验的?网约停车旗舰平台小强停车App做客直播间,现身说法,介绍小强停车在鸿蒙生态中,如何通过元服务为宽广用户带来更加便捷易用的线上预约停车体验,分享元服务的开发细节以及流量价值。诚邀您进入直播间,一起摸索鸿蒙生态新流量阵地! 【直播预报】 工夫:2023年6月9日16:00-17:00 【直播看点】 1、 无需装置下载的元服务,如何轻量交互、服务中转? 2、 坐拥HarmonyOS级能力,盘活鸿蒙全新流量入口! 3、 低代码开发的元服务,鸿蒙开发者还能够怎么玩? 【直播平台】 【特邀嘉宾】 Sophia,小强停车经营总监 9年互联网我的项目经营教训,深耕用户体验及流量增值方向。 Frank,华为鸿蒙生态高级产品经理 次要负责元服务的服务履约、产品设计和布局,为单干利用提供更便捷的流量入口。 Anja,华为鸿蒙生态高级经营经理 丰盛的数据驱动业务实践经验,善于通过数据与用户洞察,为互联网产品、经营等提供业务价值晋升计划,帮忙企业实现商业增长。 【报名形式】 形式一 扫码关注,预约直播 形式二 点击[问卷链接报名直播](https://developer.huawei.com/consumer/cn/service/josp/agc/cqp...),即可收费获取《鸿蒙生态利用开发白皮书》;如果您对鸿蒙的新流量阵地元服务感兴趣,欢送在问卷留下材料,咱们后续会为您提供一对一回访服务 【直播抽奖】 进入直播间参加弹幕互动的小伙伴,有机会抽取精美礼品,不要错过哦! HUAWEI FreeBuds 4E 真无线耳机 HUAWEI高键程智能键盘 6月9日16:00 直播嘉宾为你现场答疑 点击官网,理解元服务 理解更多详情>> 拜访HMS Core 联盟官网 获取HMS Core 开发领导文档 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

June 2, 2023 · 1 min · jiezi

关于android:MobTech-MobPush统一推送联盟烂尾统一推送还能实现吗

对立推送联盟(Unified Push Alliance)是Android(安卓)平台下的挪动利用信息推送技术联盟,以改善Android零碎用户的推送服务体验。该联盟由工业和信息化部旗下中国泰尔实验室牵头成立于2017年10月,挂靠电信终端产业协会,承受工信部业务领导,总部设于北京。 对立推送联盟旨在制订推送相干规范,整合各手机厂商的现有接入形式,推出对立推送能力开放平台及对立推送SDK。目前,对立推送相干规范曾经失去了包含华为、OPPO、vivo、小米在内的15家手机厂商适配,成为了业内的通用规范。 2021年4月26日,对立推送联盟降级为对立推送工作委员会。2021年8月19日,原官网(chinaupa.com)无法访问,域名发售。2021年9月16日,新网站(push.mobileservice.cn)上线。 为什么须要对立推送?在国外市场,苹果公司和谷歌别离为本人的手机零碎iOS和Android提供了推送服务APNs和FCM,以便将开发者把音讯准确推送给终端用户。这样的推送服务不仅能够保障音讯及时达到,还能够节俭手机的电量、流量和资源占用,进步用户体验。 然而,在国内市场,因为谷歌服务的FCM推送长期处于不稳固的情况,导致了国内安卓生态中推送服务处于凌乱和低效中,次要体现在以下几个方面: 手机厂商纷纷自建推送服务,并将这一与广告非亲非故的信息渠道视为变现体系的重要一环。这使得用户常常收到各种垃圾信息和无关信息,极大影响了应用体验。开发者须要独自接入不同厂商的推送服务,减少了开发成本。同时,因为各厂商的推送服务质量参差不齐,导致了音讯达到率低、提早高、失落多等问题,开发效率降落。手机为了节俭电量和流量,对利用后盾治理进行了严格限度,导致了很多利用无奈推送音讯,用户可能无奈及时收到重要信息,存在应用上的隐患。因而,2017年10月,工信部牵头成立了对立推送联盟,以无效推动音讯推送产业的倒退,并完结了原先各大安卓定制零碎及各利用自带的推送服务各自为政的情况。 对立推送联盟做了什么?对立推送联盟次要做了以下几件事: 制订了《对立推送通道层接口标准》、《对立推送技术要求和测试方法》等根底规范,并失去了15家手机厂商的适配反对。上线了对立推送能力开放平台及对立推送SDK,冀望让开发者能够通过一个平台和一个SDK接入所有反对对立推送规范的手机厂商。构建了匿名用户标识体系,以字符串或二维码等形式提供,实现了手机号码的匿名化。公布了《中国绿色App公约》,提倡开发者恪守内容平安、隐衷爱护、正当应用等准则。凋谢了“推必达”能力给所有智能可穿戴设施厂商,让智能手表、手环等设施也能享受到对立推送服务。对立推送联盟为什么没有胜利?只管对立推送联盟做出了很多致力,然而并没有获得预期的成果。首先手机厂商和互联网企业对于对立推送就没有足够的能源,因为他们更偏向于保护本人的推送服务,不违心放弃数据收集能力。这导致对立推送联盟的接口素来没有真正实现对立,它只是在各厂商现有的推送服务根底上进行兼容,这是一种不够坚定的绥靖政策。 其次是对立推送联盟没有造成一个强有力的主导力量,没有像其余标准化组织那样建设一个独立的平台和标准,没有无效地协调各方利益和需要。它的宣传和推广力度也不够,消费者端对其认知度不高,没有意识到其带来的理论扭转——其实从宽广手机用户层面动手,在道义上获得压倒性的胜利,能反推企业被动接收对立推送联盟。 最初对立推送的必要性和紧迫性受到了质疑,因为安卓零碎自身对于利用后盾治理和告诉权限等方面的优化,以及手机厂商在电池治理和快充技术等方面的提高,曾经在肯定水平上缓解了安卓手机的高能耗问题。 对立推送是否实现?从目前的状况来看,对立推送联盟是否实现还是一个未知数。对立推送的确是一个美妙的愿景,能够为安卓生态带来很多益处,比方进步音讯推送的效率和品质,节俭手机的电量和流量,爱护用户的隐衷和平安,晋升用户体验和开发者效率。但它的实现波及到很多方面的因素,包含技术、政策、市场、用户等等,引起有很多的挑战和艰难,如何压服各方放弃本人的利益和控制权,建设一个真正对立的规范和平台,如何减少消费者和开发者的认知度和参与度,建设一个无效的监管和评估机制都是待解决的难题。所以对立推送的将来还是不确定的,可能须要有更多的工夫和致力能力看到后果。

June 2, 2023 · 1 min · jiezi

关于android:秒验-iOS端集成指南

开发工具:Xcode 集成形式:手动导入SDK或者Pod集成 SDK版本反对:SDK反对Xcode 9.1.0, iOS8.0+及以上版本集成前筹备注册账号应用秒验SDK之前,须要先在MobTech官网注册开发者账号,并获取AppKey和AppSecret,详情能够点击查看创立利用流程 提交审核一键登录是运营商提供的能力,在应用秒验SDK之前,您须要在工作台提交秒验审核,详情能够点击查看秒验审核流程 秒验SDK流程图 增加配置下载SDK导入我的项目(1)手动下载SDK引入 官网下载SDK,而后将下图中SDK文件夹拖入到工程中(若我的项目中集成过秒验SDK,请将原来存在的SDK删除掉,再导入官网下载的SDK)。 (2)CocoaPods形式引入 按需在 Podfile 文件中增加命令 pod 'mob_secverify'留神 如果 pod install导入的版本不是最新版,则先执行pod repo update操作更新本地repo的内容,再从新pod install增加依赖库必要 libc++.tbd 配置Xcode我的项目Build Settings中的Other Linker Flags增加”-ObjC” 配置plist文件 (MOBAppKey和MOBAppSecret以及https)(1)在我的项目中的info.plist文件中增加键值对,键别离为 MOBAppKey 和 MOBAppSecret ,值为在之前在MobTech官网开发者后盾申请的AppKey和AppSecret: (2)ATS 配置 目前运营商个别接口为http申请,对于全局禁用Http的我的项目,须要设置Http白名单。倡议按以下形式配置Info.plist: <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>NSExceptionDomains</key> <dict> <key>zzx9.cn</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> <key>cmpassport.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> <key>id6.me</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> <key>wostore.cn</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> <key>mdn.open.wo.cn</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> <key>NSAllowsArbitraryLoads</key> <false/></dict></plist>(3)禁止上传设施信息 (2.0.6版本更新) ...

June 2, 2023 · 3 min · jiezi

关于android:SDK轻量化降低日均耗电量和日均流量

通常,咱们心愿在保障SDK性能完整性和稳定性的前提下,尽可能升高SDK的日均耗电量和日均流量,从而晋升用户体验。SDK对设施资源的耗费越少,设施越不容易因为过热、卡顿等呈现故障,是真正的花小钱办小事。 那么,升高SDK的日均耗电量和日均流量有哪些罕用的办法呢? 精简功能模块。只保留SDK外围和必要的性能,去除冗余,这样能够缩小SDK的复杂度,进步加载速度和运行效率。举例如,倘若SDK只须要提供根本的图形渲染性能,就不应该蕴含音频、视频、网络等其余功能模块。 优化代码构造。应用高效的编程算法,防止反复和有效的代码逻辑,缩小内存透露。如果SDK应用C++或Java等编程语言,就须要留神内存治理问题,避免出现过多的垃圾回收导致的性能降落。如果SDK应用JavaScript或Lua等脚本语言,就须要留神代码压缩的问题,避免出现过多的全局变量导致的内存占用过高。 优化资源管理。应用适合的图片格式和压缩比例,防止加载过大的资源文件,应用缓存和预加载技术进步资源加载速度。加载图片资源时,就能够依据图片的用处抉择适合的压缩比例,如PNG、JPG、WEBP等,以缩小图片文件的大小和解码工夫。加载多个资源文件时,能够应用缓存技术将罕用的资源文件缓存在内存中,以缩小网络申请次数和流量耗费。加载简单的资源文件时,应用预加载技术在闲暇工夫、后盾线程中提前加载资源文件,以缩小用户等待时间,晋升用户体验。 优化网络通信。正当的网络协议和传输方式能防止频繁的网络申请。与服务器进行网络通信,能够依据通信需要抉择如HTTP、HTTPS、TCP、UDP、WebSocket等,进步通信效率和稳定性。当SDK须要发送或接收数据,定时轮询、心跳包等技术能缩小网络连接次数和流量耗费。当SDK须要解决的数据量微小,应用数据压缩技术进行解决,如GZIP、LZMA、AES等,以缩小数据传输量。 优化渲染成果。按需渲染(On Demand Rendering) ,动静调整渲染帧率,能大幅降低功耗、发热量和耗电量。按需渲染是一种在不影响用户体验的状况下升高渲染负载的技术,能够依据用户输出或设施状态来动静调整渲染帧率,并在须要时复原到失常帧率。如在用户没有操作或设施处于低电量模式时,能够将渲染帧率从60FPS升高到12FPS或更低 ,这样就能够达到大幅升高设施功耗、发热量和耗电量,并缩短设施续航工夫的成果。 应用自适应性能(Adaptive Performance)计划,主动感知硬件情况,通过调节渲染帧率、LOD程度等形式,达到性能和功耗的均衡。它能够实时监测硬件参数如温度、功耗等,并依据预设策略来调节应用程序性能参数如渲染帧率、LOD程度等。在设施过热或功耗过高时,能够升高渲染帧率或LOD程度来升高设施负载,并在设施恢复正常时复原到原始参数。

June 1, 2023 · 1 min · jiezi

关于android:Android如何进行白盒加密SDK一文搞定

白盒加密SDK的目标是帮忙客户端低成本接入高标准的平安爱护机制,免受歹意平安攻打,从而集中精力建设业务自身。 话不多说,咱们明天来看看Android能够如何接入白盒加密SDK。 环境需要条目阐明兼容平台Android 4.0+开发环境Android Studio 3.0.1 或者 Eclipse + ADTCPU架构ARM 或者 x86SDK三方依赖无SDK接入1.SDK获取1)拜访顶象技术官网,注册账号2)登录, 进入控制台,拜访“全流程端防控->白盒加密SDK”模块3)新增App,填写相干信息)下载对应平台SDK 2.SDK文件构造SDK目录构造assets Android 资源文件dx-whitebox-${version}.jar Android jar包armeabi, armeabi-v7a, arm64-v8a, x86 4个abi平台的动静库文件Android Studio 集成点击下载Demo 想间接运行demo我的项目的话,请跑gradle命令assembleRelease 1.Android Studio导入jar, so将dx-whitebox-x.x.x.jar, so文件放到相应模块的libs目录下将assets中资源文件放到相应我的项目assets目录下没有assets目录的,在Android Studio对应app目录下新建Assets Folder2.build.gradle 配置android{ sourceSets { main { jniLibs.srcDirs = ['libs'] } } packagingOptions { doNotStrip "**/libDX*.so" }}repositories{ flatDir{ dirs 'libs' }}dependencies { implementation fileTree(dir: 'libs', include: ['*.jar'])}3.混同配置-dontwarn *.com.dingxiang.mobile.**-dontwarn *.com.mobile.strenc.**-keep class com.dingxiang.mobile.whitebox.**{*;}-keep class com.security.inner.**{*;}-keep class *.com.dingxiang.mobile.**{*;}-keep class *.com.mobile.strenc.**{*;}React Native 形式集成点击下载Demo 1.React Native 环境配置具体参考facebook官网文档: https://facebook.github.io/react-native/docs/getting-started ...

June 1, 2023 · 3 min · jiezi

关于android:ShareSDK-iOS端合规指南

2021年5月1日起,由国家互联网信息办公室、工业和信息化部、公安部、国家市场监督管理总局联结制订了《常见类型挪动互联网应用程序必要个人信息范畴规定》(简称“App必要个人信息范畴规定”)已正式实施。“App必要个人信息范畴规定”不仅明确常见39种类型的App必要个人信息范畴,而且明确挪动互联网应用程序(App)运营者不得因用户不批准收集非必要个人信息,而回绝用户应用App基本功能服务。为了防止App被下架,请您务必做好两件事:首先将SDK降级至满足监管要求的最新版本,再按下文合规解法进行配置。 合规四小步确保APP有《隐衷政策》您须要确保App有《隐衷政策》,并且在用户首次启动App时就弹出《隐衷政策》获得用户批准。 增加MobTech隐衷协定您务必告知用户您抉择MobSDK服务,请在《隐衷政策》中减少如下参考条款:“咱们应用了第三方(上海掌之淘信息技术有限公司,以下称“MobTech”)MobTech ShareSDK服务为您提供登陆分享性能。为了顺利实现该性能,您须要受权MobTechSDK提供对应的服务;在您受权后,MobTech将收集您相干的个人信息。对于MobTech所收集的信息品种、用处、个人信息爱护的规定及退出机制等,详见MobTech官网(https://www.mob.com)上的隐衷政策 (https://www.mob.com/about/policy1)条款。” 回传隐衷协定受权后果您务必确保用户批准《隐衷政策》之后,调用MobSDK提交隐衷协定接口。具体步骤详见下文。 配置MobSDK须要在我的项目默认的plist文件里增加MOBNetLater参数配置,参数值配置为2 配置如图: 接口调用步骤注: 本计划须要依赖mobFoundation.framework 3.2.24版本或更高版本,SDK版本也倡议更新到较新版本。为保障您在集成MobSDK之后,可能满足工信部相干合规要求,您应确保在App装置后首次冷启动时,在用户浏览您的《隐衷政策》并获得用户受权之后,调用提交隐衷协定函数uploadPrivacyPermissionStatus提交隐衷协定。反之,如果用户不批准《隐衷政策》受权,则不能调用uploadPrivacyPermissionStatus提交隐衷协定。 #import <MOBFoundation/MobSDK+Privacy.h>[MobSDK uploadPrivacyPermissionStatus:YES onResult:^(BOOL success) {//留神业务逻辑不要依赖于这个success后果,倡议业务逻辑在调用这个接口之后来写}];为了使MobTech的SDK产品能更好的兼容ios14零碎,同时合乎苹果将于2020年12月8日失效的要求应用程序(APP)开发者配置隐衷“标签”新政策,咱们根据MobTech不同的SDK产品制作了不同的配置操作文档。建议您在接入MobTech SDK服务时更新到最新版本,接入咱们的隐衷政策链接,同时在App Store Connect 后盾,参考对应SDK的配置操作文档,增加您App的隐衷“标签”数据内容。 App Store Connect 后盾配置参考文档点击这里

June 1, 2023 · 1 min · jiezi

关于android:ShareSDK-Android端合规指南

2021年5月1日起,由国家互联网信息办公室、工业和信息化部、公安部、国家市场监督管理总局联结制订了《常见类型挪动互联网应用程序必要个人信息范畴规定》(简称“App必要个人信息范畴规定”)已正式实施。“App必要个人信息范畴规定”不仅明确常见39种类型的App必要个人信息范畴,而且明确挪动互联网应用程序(App)运营者不得因用户不批准收集非必要个人信息,而回绝用户应用App基本功能服务。为了防止App被下架,请您务必做好两件事:首先将SDK降级至满足监管要求的最新版本,再按下文合规解法进行配置。 合规四小步确保APP有《隐衷政策》您须要确保App有《隐衷政策》,并且在用户首次启动App时就弹出《隐衷政策》获得用户批准。 增加Mob隐衷协定您务必告知用户您抉择MobSDK服务,请在《隐衷政策》中减少如下参考条款:“咱们应用了第三方(上海掌之淘信息技术有限公司,以下称“MobTech”)MobTech ShareSDK服务为您提供社交分享、第三方登录社交分享、第三方登录性能。为了顺利实现该性能,您须要受权MobTechSDK提供对应的服务;在您受权后,MobTech将收集您相干的个人信息。对于MobTech所收集的信息品种、用处、个人信息爱护的规定及退出机制等,详见MobTech官网(https://www.mob.com)上的隐衷政策 (https://www.mob.com/about/policy1)条款。” 回传隐衷协定受权后果您务必确保用户批准《隐衷政策》之后,调用MobSDK提交隐衷协定接口。具体步骤详见下文。 配置MobSDK在gradle.properties中,设定MobSDK为隐衷协定适配版本 MobSDK.spEdition=FP接口调用步骤注:本计划须要依赖ShareSDK3.7.6或更高版本(倡议降级到官网最新3.9.9版本)。为保障您的在集成MobSDK之后,可能满足工信部相干合规要求,您应确保在App装置后首次冷启动时,在用户浏览您的《隐衷政策》并获得用户受权之后,调用提交隐衷协定函数MobSDK.submitPolicyGrantResult提交隐衷协定。反之,如果用户不批准《隐衷政策》受权,则不能调用MobSDK.submitPolicyGrantResult提交隐衷协定。 MobSDK.submitPolicyGrantResult(true);

May 31, 2023 · 1 min · jiezi

关于android:MobTech-MobLink小程序网页跳转App的原理

从不同的渠道,如小程序、二维码、网页等,间接跳转到App内对应的页面,并传递相干的参数信息,曾经由挪动还原解决方案MobLink实现了。本文将具体介绍多样化跳转技术的原理。 MobLink的性能架构MobLink的性能架构如下图所示: 从图中能够看出,MobLink次要波及三个局部:客户端、服务器和网页。客户端是指集成了MobLink SDK的App,服务器是指MobLink提供的云端服务,网页是指嵌入了MobLink JS的HTML页面。客户端、服务器和网页之间通过HTTP协定进行通信,传递场景参数和设施信息。 MobLink的实现原理1. 设置场景参数在App中分享商品/内容/流动页面时,须要将须要跳转到App内的页面和参数信息增加到分享的链接中。这能够通过两种形式实现: 通过网页端的params间接设置参数信息,例如:<script type="text/javascript" src="//1p.t4m.cn/applink.js"></script><script> // 页面上仅单个元素须要跳转时能够应用对象形式进行初始化 MobLink({ el: '', path: 'demo/a', params: { key1: 'value1', key2: 'value2', } })</script>通过客户端的接口设置参数信息,例如://java代码// 设置场景参数HashMap<String, Object> senceParams = new HashMap<String, Object>();senceParams.put("key1", "value1");senceParams.put("key2", "value2");senceParams.put("key3", "value3");// 新建场景Scene s = new Scene();s.path = "/demo/a";s.params = senceParams;// 申请场景IDMobLink.getMobID(s, new ActionListener<String>() { public void onResult(String mobID) { // TODO 依据mobID进行分享等操作 } public void onError(Throwable throwable) { // TODO 处理错误后果 }});2. 生成短链在设置了场景参数后,须要将参数信息发送给MobLink的服务器,并生成一个短链,如: http://f.moblink.mob.com/pro/scene/nf9a短链中蕴含了场景ID,也就是mobID,它是一个惟一标识符,用于在服务器中查问对应的场景参数。 3. 分享短链生成短链后,就能够将短链分享给其余用户,分享到微信、QQ、微博等社交平台。用户点击短链后,会关上一个网页,网页中嵌入了MobLink JS代码。 ...

May 30, 2023 · 1 min · jiezi

关于android:手机端快速使用chatgpt提升浏览体验

前几天在知乎看到一个发问:哪个手机端的chatgpt更好用? 看到这个问题,我立马就想到了我正在应用的狐猴浏览器。这款浏览器目前反对安卓手机和平板,外面内置的Chat AI性能能够体验原汁原味的GPT服务。 关上狐猴浏览器,点击首页的Chat AI,或者点击下方右数第二个按钮,再点击Chat AI,两个办法都能够间接进入并应用。 进入之后就是一个相似于聊天窗口的界面,而后你就能够开始发问了。狐猴的Chat AI的常识范畴并不比Chat GPT小,毕竟也是应用的3.5 turbo接口。写代码,写文章,翻译等都不在话下。 除了间接对chat AI发问,你还能够在网页中就某一段文字或者某个词语对chat AI发问,只须要选中文字在抉择Chat AI就能够了,如下图: 如果你常常对Chat AI提某个要求,你也能够间接将这句话设置成常用语,缩小打字的工夫,提高效率。 而除了chat AI,狐猴浏览器自身也是一款非常优良的手机浏览器,Chat AI无疑是精益求精。它反对Chrome和Edge商店的几十万扩大,能够实现许多浏览器自身没有的性能。在退出Chat AI之后,也没有懈怠对各种插件的兼容,特地是油猴插件,仍然是我认为兼容得最好的一款手机浏览器。 如果你认为狐猴浏览器的这些性能对你有帮忙的话,无妨下载试试看。

May 30, 2023 · 1 min · jiezi

关于android:Health-Kit文档大变样一起尝鲜

Health Kit文档全新降级,开发场景更清晰,聚焦你关怀的问题,快来一起尝鲜! 文档入口请戳:文档入口~ 如果你是静止衰弱的老朋友,能够从旧文档页面上方的提示信息中进入:最新版本哦。 一、 架构调整更易读——端/云开发高深莫测Health Kit新架构文档从开发者视角登程,导航目录设计从端侧、云侧利用/服务对接进行辨别,帮忙你疾速定位所须要的领导文档。 端侧数据凋谢服务提供Android和HarmonyOS利用开发不同场景的开发指南, Codelab辅助用户疾速上手,晦涩体验Health Kit开发流程! 二、 数据类型更直观——总览Health Kit 反对的数据类型想要疾速理解Health Kit提供了哪些数据类型?数据凋谢总览满足你的须要! 数据类型及其蕴含的数据子项清晰直观,读写状况和数据获取及时性通通通知你,能够更疾速地辨认利用所须要的数据类型,理解所需申请的数据权限。 三、 应用场景更明确——疾速确定适宜的接入形式Health Kit凋谢丰盛的API接口及数据类型,依照不同开发场景,用户能够抉择不同API与数据类型进行利用/服务开发。 跨平台开发:若您的利用须要同时反对Android、iOS利用,或者须要反对微信小程序等WEB场景,优先倡议应用Rest API ,以便满足不同平台的体验一致性,晋升开发效率。 鸿蒙利用开发:优先倡议应用JS API。如果无奈满足业务场景须要,您能够抉择应用Rest API。 Android挪动利用:优先倡议应用JAVA API。如果无奈满足业务场景须要,您能够抉择应用Rest API。 根底能力服务提供原子化数据凋谢,反对生态利用读/写用户日常流动、衰弱数据、静止数据,数据类型丰盛多样。若利用/服务仅需应用原子化数据,举荐集成根底能力SDK。 扩大能力服务凋谢更多实时静止和衰弱数据。若须要实现实时数据联动同时应用局部原子化静止衰弱数据,可优先集成扩大能力SDK。扩大能力反对的原子化数据请参见扩大能力数据凋谢。 阐明: 若您的生态利用既须要实现实时数据联动,同时又须要应用更丰盛的原子化数据,则需集成扩大能力SDK+根底能力SDK。 四、 接入要求更清晰——提供开发者申请资质阐明集体开发者接入资质审核要求 申请拜访凋谢等级为根底的用户数据,集体开发者不得有个人信用不良记录。凋谢等级为高阶的用户数据暂不向集体开发者凋谢。数据凋谢等级请参见数据凋谢总览。 企业开发者接入资质审核要求 实缴资本:申请拜访凋谢等级为根底的用户数据,企业实缴资本不低于100万元;申请拜访凋谢等级为高阶用户数据,企业实缴资本不低于500万元。 企业成立年限:申请企业存续且成立工夫1年以上。 阐明:若企业申请资质不符合要求,请参见对应解决方案。 更多内容请参见申请被驳回的常见问题。 更多详情,文档入口请戳:文档入口。 理解残缺业务性能介绍,请参见静止衰弱场景。 理解更多详情>> 拜访HMS Core 联盟官网 获取HMS Core 开发领导文档 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

May 30, 2023 · 1 min · jiezi

关于android:ShareSDK-Android端第三方平台分享参数说明

 尽管ShareSDK尽可能屏蔽了不同社交平台间接口api差别,然而分享接口须要传递的差别仍然会因平台而异,本文将以列表的模式展现不同平台的分享参数(ShareParams)的字段要求,以不便开发者应用时翻阅。 留神没有表明可选的就是必填参数,不能为null或者空字符串,另一种状况是例如有imageUrl(”网络图片链接”)、imagePath(“/sdcard/abc.jpg”)、imageData(bitmap)是三选一。 国内平台新浪微博新浪微博反对分享文字、本地图片、网络图片 参数阐明 text:140字符以内 image:web分享ShareSDK不做限度间接提交给微博解决,微博客户端分享图片不能大于2M,仅反对JPEG、GIF、PNG格局; 注:微博分享链接是将链接写到setText内:eg:setText(“分享文本 http://mob.com”); ImageArray String类型图片数组,可传手机本地图片门路和图片链接,分享多图的时候须要将Url参数正文掉,否则会默认分享链接; 分享文本 text   留神:以下分享类型必须有新浪微博客户端才能够分享,如果imagePath和imageUrl同时存在,imageUrl将被疏忽; 分享图文 text imagePath imageUrl imageData 分享本地视频 FilePath("/sdcard/video.MP4") text("文本") 腾讯微博腾讯微博反对分享文字、本地图片、网络图片和经纬度信息 参数阐明 text:最多140个字字符 image:图片最大4M 分享文本 text latitude(可选) longitude(可选) 分享图文 text imagePath latitude(可选) longitude(可选) imageUrl ImageArray 2.5.0当前的版本新增分享多张图片的性能ImageArray。 因为腾讯微博分享网络图片并不属于高级接口,因而imageUrl优先级高于imagePath,这就是说,如果imagePath和imageUrl同时存在,imagePath将被疏忽。 QQ空间提醒:必须须要QQ客户端才能够分享 QQ空间反对分享文字和图文 参数阐明 title:最多200个字符 text:最多600个字符 分享视频 FilePth("/sdcard/视频.mp4") ShareType(platform.SHARE\_VIDEO) 分享文本 text ShareType(platform.SHARE\_TEXT) 分享网页 text imagePath title titleUrl ShareType(platform.SHARE\_WEBPAGE) imageUrl 分享图片 imagePath ShareType(platform.SHARE\_IMAGE) imageUrl 微信(好友、朋友圈、珍藏)提醒: 1.必须须要客户端才能够分享; 2.微信客户端版本从6.7.2以上开始,勾销分享提醒分享胜利;即勾销分享和分享胜利都返回胜利事件; 3.Android11及之后的版本,微信分享图片不反对用imageData(bitmap)接口设置参数; 绕过审核只对微信好友、微信朋友圈无效 微信分享如果是绕过审核(配置信息BypassApproval属性设置为true为绕过审核),微信朋友圈能够分享单张图片或者图片与文字一起分享,微信好友能够进行文字或者单张图片进行分享,分享回调不会正确回调。 不绕过审核,微信三个平台中,好友的性能最残缺,朋友圈不能分享利用,珍藏不能分享利用,表格下以好友为例子: 参数阐明 title:512Bytes以内 text:10KB以内 imageData:10M以内 imagePath:10M以内(传递的imagePath门路不能超过10KB) imageUrl:10KB以内 musicUrl:10KB以内 url:10KB以内(MobSDK没有对参数另做限度,参数限度详细情况能够参考微信官网的限度详情点击这里查看) ...

May 30, 2023 · 4 min · jiezi

关于android:了不起的互联网老男孩在创业路上不掉队

“青春如同奔流的江河,一去不回来不及道别”,老男孩这首歌戳中了太多职场中年男人的心酸痛苦,面对经济上行压力、互联网行业改革以及中年职场危机,互联网人应该如何应答?如何建设和事实叫板的能力? 有2位在互联网守业多年的开发者,经验了从PC互联网到挪动互联网的倒退变迁,踩过不少坑,一路磕磕碰碰走到当初,放弃不难,但他们抉择了保持走上来,在鸿蒙生态里执着追梦不落伍。 倔强的老男孩:守业一次不行就再来一次 刘永强从事互联网行业20年了,2003年退出大厂,那个时候的工作状态基本不存在“内卷”的问题,只有认真做好本人的事件,致力干活就好了,他很享受这种工作状态,不感觉辛苦。 可是想要在杭州买房,只靠工资是不够的,过后在大厂做得好就有股权处分,所以得更加致力去做事,来达成人生不同阶段的指标。可能正是这种始终以来缓缓养成的够拼、够有毅力的生存状态,让刘永强在守业路上,有着一股永不服输的倔强。 在大厂工作的时候,为了能在公司楼下抢到一个车位,早上六点多就得登程,这让他有了一个激动,是否开发一个App帮忙大家找车位?但在过后,没钱没人没资源,想法只能埋在心里。 2012年他先跟着一个老板做一个电商代经营的创业项目,在保持2年之后我的项目失败了。失败了就不再做了吗?不是,守业的想法始终没有变。 第一次的失败让他有机会去做更深刻的思考。两年后的停车行业也曾经热气腾腾了,做硬件的、做解决方案的、做共享的,2B2C的等等,各种模式层出不穷,的确解决了停车场智能化的问题,解决了业主的治理问题,但就是没解决车主停车难和停车贵的问题,他就感觉这可能是市场留下的一个机会。 所以刘永强决定做一款手机利用,心愿在每个城市的大街小巷、角角落落,停车难的中央、停车贵的中央,都能够通过小强停车App来解决。 有人劝他放弃,说“这件事没心愿了,互联网头部都在做,一个能力弱爆了的小团队拿什么去PK?”过后,刘永强从家里拿钱,先后投入了差不多两百万,但他从没有狐疑这件事,感觉是没有找到办法。 他一直钻研市场,理解民营停车场怎么做生意,钻研海内案例,理解国外的模式,一直摸索,从机场、景区、火车站、医院等特定场景切入,将业务模式缓缓滚动起来,逐渐走上正轨。起初这款产品真的帮忙车主预约到了车位,节俭了停车费用。 2019年刘永强关注到鸿蒙生态,对于守业公司,他心愿能在鸿蒙生态中取得技术、流量等有价值的货色,可能实现降本增效。小强停车App先后集成应用了HarmonyOS的扫码服务、认证服务、云测试等技术能力,产品疾速实现了降级和迭代,如通过扫码服务让扫码更快、更准,扫码成功率失去大幅提高。并借助鸿蒙生态流量入口(华为利用市场曝光位、推送等)实现了订单增长。 2022年在鸿蒙开发者大赛Apps UP寰球利用翻新赛道中,小强停车App获得最佳HMS创新奖。小强停车针对HarmonyOS零碎做了一套从预约、下单到停车的元服务。元服务是HarmonyOS的一种轻量化的服务状态,用户能够不必下载App,通过元服务也可能十分不便地体验到预约车位、订单查问、停车缴费等服务,刘永强把这个看作是一个新的流量入口,将来还会把更成熟的业务,像机场、火车站等大交通的停车业务凋谢到元服务上,让更多用户体验到简略的自驾出行体验。 工程师爸爸:坚韧不拔地抓趋势、做产品 70后的李文华,守业十年了,始终在保持做儿童产品,口袋故事App是他的第二个创业项目。在守业遇到困难和挑战时,他首先问本人,是否认同抉择的行业和赛道?既然答案是“是”,那就想尽一切办法,去解决问题。 在产品初创期,没有任何背景和资源,产品规模也小,没有版权很难经营上来,李文华千方百计结识了很多出版社资源和作家,这才搞定了版权问题。有了版权还不够,还须要解决内容制作问题,他就亲自去找配音演员。 2015年,他看到了市面上呈现了智能化的公仔,是故事机的降级产品,这启发了他在更多的智能终端设备上应用口袋故事App。所以他决定做过后还比拟前沿的儿童内容云平台,去赋能这些智能终端。过后团队人员缓和,但他决然将指标调整至凋谢内容云、开放平台的方向,保持做面向儿童智能终端的内容云。2016年到2018年,他先后抓住了智能机器人、智能音箱、儿童智能手表等趋势。 但不同终端的适配和交互是不一样的,面向儿童内容云平台的挪动利用智能终端计划也不同,比方手表等小型设施,内存小,计算能力弱,存储空间小,对程序的优化要求很高。且并发访问量、CPU占用率、内存占用率等,都成为产品次要攻克的问题。 怎么办?李文华感触到将来的终端还会越来越多,从产业角度来看,须要大平台架构,须要更久远的规范建设,能力解决多终端设备适配和互联的问题。他心愿找到一个属于国内开发者的翻新平台,一个大家能够聚在一起互相启发、互相借鉴,独特攻克技术难题。 2019年,李文华开发团队里有一位善于做外围软件架构、喜爱摸索技术的“蠢才程序员”,接触到了HarmonyOS零碎。这个新零碎优质的分布式技术个性,让他们看到了解决问题的可能性。 然而往往做决策也是很艰难的一件事,意味着产品要为适配HarmonyOS调配资源反对。但从长期看,李文华认为,作为一个信息大国,必然要有本人的外围零碎,所以在鸿蒙生态倒退的晚期阶段,他就投入了人力,始终到当初,坚韧不拔地抉择鸿蒙生态,和华为一起并肩作战。 2022年在鸿蒙开发者大赛Apps UP寰球利用翻新赛道中,口袋故事App荣获全场景创新奖,集成应用了华为帐号、Network Kit、云测试、云调试等鸿蒙的凋谢服务和能力,适配手机、手表、车机、平板等多终端设备,让更多的孩子无论居家、在车里还是室外玩耍中,都能凝听到更多乏味的故事。 守业,越往前走就越晓得,这不是一个人的战斗。在鸿蒙开发者大赛中,李文华感触到有很多开发者在围绕鸿蒙生态认真做事件、做产品,大家互相学习。尤其是在新终端崛起,跨平台能力还在一直延展阶段,很可能在一个小的端,就会崛起一个弱小的对手,更得放弃学习状态,疾速跟进才不会落伍。 结语 对少量的开发者来说,生态的赋能是十分值得期待的,从2019年到当初,鸿蒙生态以肉眼可见的速度在冲破。开发者通过应用HarmonyOS的工具和服务解决业务和技术上遇到的艰难,能更快失去稳固和高效的技术撑持,不必本人反复制作轮子。置信不少开发者都有很优良的想法,能够借助鸿蒙生态,将优良的想法变成事实,拓展和寻找更多增长机会,实现弯道超车。 鸿蒙开发者大赛成为翻新利用的孵化器,激励开发者翻新,用技术连贯幻想,怯懦追梦,展示自我价值,能够和更多的生态搭档一起做事,一起共建全场景智慧生态,置信将来还会有更多的生态建造者退出鸿蒙生态,为亿万用户的全场景智慧生存发明更多可能。 理解更多详情>> 拜访HMS Core 联盟官网 获取HMS Core 开发领导文档 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

May 29, 2023 · 1 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); 返回阐明 返回 字段 阐明 "id":"4bu9702gmq4mvl3myo" id 告诉工作id ,仅厂商告诉有该字段 {"key":"value"} 附加字段 附件字段需指定,不指定不会呈现 ,仅厂商告诉有该字段 {"from\_tcp":true} from\_tcp 音讯是否来自MobPushTCP通道,true:是 {"msg":"MobPushNotifyMessage{}"} msg 音讯体,对象为MobPushNotifyMessage,仅MobPushTCP通道音讯有该字段 {"channel":"mobpush"} channel 渠道名 2.2 scheme跳转获取参数,详情请查看 API接口->scheme跳转 JSONArray jsonArray = MobPushUtils.parseSchemePluginPushIntent(getIntent());System.out.println("-------------JsonScheme打印查看:"+jsonArray);返回阐明 返回 字段 阐明 {"from\_tcp":true} from\_tcp 音讯是否来自MobPushTCP通道,true:是 {"msg":"MobPushNotifyMessage{}"} msg 音讯体,对象为MobPushNotifyMessage,仅MobPushTCP通道音讯有该字段 {"key":"value"} 附加字段 附件字段需指定,倡议不要应用url做为key {"mobpush\_link\_k":"mlink://com.mob.mobpush.link"} scheme scheme地址 {"mobpush\_link\_v":"schemeKey=schemeValue"} scheme参数 scheme地址下携带的scheme参数 {"id":"4brfm8nti9aj1arf28"} id 推送工作id {"channel":"xiaomi"} channel 渠道名 {"schemeLink":"mlink://com.mobpush.demo2"} scheme scheme地址 {"schemeKey":"schemeValue"} scheme参数 scheme地址下携带的scheme参数(华为,VIVO,OPPO) {"schemeKey":"schemeValue","schemeUrl":"mlink://com.mob.mobpush.link"} schemeUrl ...

May 29, 2023 · 3 min · jiezi

关于android:扔物线Android-高级开发瓶颈突破系列课第五期去时雪满天山路

download:【扔物线】Android 高级开发瓶颈冲破系列课第五期Elasticsearch搜寻我的项目:构建高效搜索引擎的关键技术 H1:引言 随着大数据时代的到来,搜索引擎为解决海量数据和提供高效搜寻能力的关键技术。Elasticsearch作为一种开源的散发搜寻和剖析引擎,曾经在各个领域失去广泛应用。本文将具体探讨Elasticsearch搜寻我的项目的关键技术和利用,为读者提供构建高效搜索引擎的指南。 H1: Elasticsearch的根底原理 Elasticsearch是基于Lucene的分组搜索引擎,具备疾速、可扩大和高可用性的特点。它采纳倒排搜寻的数据结构,将文档中的关键词信息进行搜寻和剖析,以实现疾速的全文搜寻和高级搜寻性能。倒排搜索引擎能够疾速确定地位文档和关键词的关联,提供高搜寻效率。 H1: Elasticsearch的内核组件 索引(Index):索引是Elasticsearch的外围组件之一,用于存储和组织文件数据。每个索引能够蕴含多个文件类型,每个文件类型能够蕴含含多个文档。通过确定正义索引的影像和片段机器,能够对数据进行分区存储和解决。 文档(Document):文档是Elasticsearch中最根底的数据元。它能够是一个JSON对象,蕴含各种字符段和属性。每个文档都有一个惟一的ID,用于标记识和查。 映射(Mapping):映射定义了文档中字符段的类型和属性。通过映射,能够控制字符段的剖析、搜寻和存储形式。映射还能够定义映射本段的分词器和过滤器,以不便进行全文搜寻和相关性排列。 查问(Query):查问是搜索引擎中最外围的性能之一。Elasticsearch提供丰盛的查询语言法和查问类型,包含全文查问、准确查问、范例围查问、联结查问等。通过灵便的查问性能,能够实现精确和高效的搜寻。 分布式框架:Elasticsearch具备良好的分布式框架,反对程度扩大和容错性。它能够通过多个节点和分片来解决大规格模型数据,提供高搜寻性能和可用性。 H1: Elasticsearch的搜寻优化 为了提供更高的搜寻性能和效率,Elasticsearch提供了一些搜寻优化技术: 倒排索引压缩:倒排索引占用大量存储空间,为了缩小小索引的大,Elasticsearch应用了一些压缩

May 26, 2023 · 1 min · jiezi

关于android:MobPush-iOS端合规指南

2021年5月1日起,由国家互联网信息办公室、工业和信息化部、公安部、国家市场监督管理总局联结制订了《常见类型挪动互联网应用程序必要个人信息范畴规定》(简称“App必要个人信息范畴规定”)已正式实施。“App必要个人信息范畴规定”不仅明确常见39种类型的App必要个人信息范畴,而且明确挪动互联网应用程序(App)运营者不得因用户不批准收集非必要个人信息,而回绝用户应用App基本功能服务。为了防止App被下架,请您务必做好两件事:首先将SDK降级至满足监管要求的最新版本,再按下文合规解法进行配置。 合规四小步确保APP有《隐衷政策》您须要确保App有《隐衷政策》,并且在用户首次启动App时就弹出《隐衷政策》获得用户批准。 增加MobTech隐衷协定您务必告知用户您抉择MobSDK服务,请在《隐衷政策》中减少如下参考条款:“咱们应用了第三方(上海掌之淘信息技术有限公司,以下称“MobTech”)MobTech MobPush服务为您提供XXXX性能。为了顺利实现该性能,您须要受权MobTechSDK提供对应的服务;在您受权后,MobTech将收集您相干的个人信息。对于MobTech所收集的信息品种、用处、个人信息爱护的规定及退出机制等,详见MobTech官网(https://www.mob.com)上的隐衷政策 (https://www.mob.com/about/policy1)条款。” 回传隐衷协定受权后果您务必确保用户批准《隐衷政策》之后,调用MobTech提交隐衷协定接口。具体步骤详见下文 配置MobPush SDK须要在我的项目默认的plist文件里增加MOBNetLater参数配置,参数值配置为“2” 配置如下图所示 接口调用步骤留神本计划须要依赖mobFoundation.framework 3.2.24版本或更高版本,SDK版本也倡议更新到较新版本。为保障您在集成MobPush SDK之后,可能满足工信部相干合规要求,您应确保在App装置后首次冷启动时,在用户浏览您的《隐衷政策》并获得用户受权之后,调用提交隐衷协定函数uploadPrivacyPermissionStatus提交隐衷协定。反之,如果用户不批准《隐衷政策》受权,则不能调用uploadPrivacyPermissionStatus提交隐衷协定。 #import <MOBFoundation/MobSDK+Privacy.h>[MobSDK uploadPrivacyPermissionStatus:YES onResult:^(BOOL success) {//留神业务逻辑不要依赖于这个success后果,倡议业务逻辑在调用这个接口之后来写}];为了使MobTech的SDK产品能更好的兼容iOS14零碎,同时合乎苹果将于2020年12月8日失效的要求应用程序(APP)开发者配置隐衷“标签”新政策,咱们根据MobTech不同的SDK产品制作了不同的配置操作文档。建议您在接入MobTech SDK服务时更新到最新版本,接入咱们的隐衷政策链接,同时在App Store Connect 后盾,参考对应SDK的配置操作文档,增加您App的隐衷“标签”数据内容。 AppStore Connect 后盾配置参考文档:点击这里

May 26, 2023 · 1 min · jiezi

关于android:MobPush-合规指南

确保APP有《隐衷政策》您须要确保App有《隐衷政策》,并且在用户首次启动App时就弹出《隐衷政策》获得用户批准。 增加MobTech隐衷协定MobPushSDK 隐衷政策您务必告知用户您抉择MobSDK服务,请在《隐衷政策》中减少如下参考条款: MobPushSDK 咱们应用了第三方(上海掌之淘信息技术有限公司,以下称“MobTech”)MobTech MobPushSDK服务为您提供 音讯推送性能。为了顺利实现该性能,您须要受权MobTechSDK提供对应的服务;在您受权后,MobTech将收集您相干的个人信息。对于MobTech所收集的信息品种、用处、个人信息爱护的规定及退出机制等,详见MobTech官网(https://www.mob.com)上的隐衷政策 (https://www.mob.com/about/policy1)条款。 第三方 SDK 隐衷政策若通过MobPushSDK 同时集成了厂商通道,请在《隐衷政策》中减少对于厂商通道的隐衷政策阐明,内容如下: 小米推送 SDK 波及的个人信息类型:设施标识符(如 Android ID、OAID、GAID)、设施信息 应用目标:推送音讯 应用场景:在小米手机终端推送音讯时应用 第三方主体:北京小米挪动软件有限公司 数据处理形式:通过去标识化、加密传输及其他平安形式 官网链接:https://dev.mi.com/console/appservice/push.html 隐衷政策:https://dev.mi.com/console/doc/detail?pId=1822 华为 HMS SDK 波及的个人信息类型:利用根本信息、利用内设施标识符、设施的硬件信息、零碎根本信息和零碎设置信息 应用目标:推送音讯 应用场景:在华为手机终端推送音讯时应用 第三方主体:华为软件技术有限公司 数据处理形式:通过去标识化、加密传输及其他平安形式 官网链接:https://developer.huawei.com/consumer/cn/ 隐衷政策:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/sdk-data-security-0000001050042177 光荣推送 SDK 波及的个人信息类型:利用匿名标识 (AAID),利用 Token 应用目标:推送音讯 应用场景:在光荣手机终端推送音讯时应用 第三方主体:光荣终端有限公司 数据处理形式:通过去标识化、加密传输及其他平安形式 官网链接:https://developer.hihonor.com/cn/promoteService 隐衷政策:https://www.hihonor.com/cn/privacy/privacy-policy/ OPPO 推送 SDK 波及的个人信息类型:设施标识符(如 IMEI、ICCID、IMSI、Android ID、GAID)、利用信息(如利用包名、版本号和运行状态)、网络信息(如 IP 或域名连贯后果,以后网络类型) 应用目标:推送音讯 应用场景:在 OPPO 手机终端推送音讯时应用 第三方主体:广东欢太科技有限公司 数据处理形式:通过加密传输和解决的平安解决形式 官网链接:https://open.oppomobile.com/new/introduction?page\_name=oppopush 隐衷政策:[https://dev.vivo.com.cn/promote/pushNews](https://open.oppomobile.com/wiki/doc&gt;https://open.oppomobile.com/wiki/doc#id=10288</p><p>vivo 推送 SDK</p><p>波及的个人信息类型:设施信息</p><p>应用目标:推送音讯</p><p>应用场景:在 vivo 手机终端推送音讯时应用</p><p>第三方主体:广东天宸网络科技有限公司及未来受让经营 vivo 开放平台的公司</p><p>数据处理形式:通过去标识化、加密传输及其他平安形式</p><p>官网链接:<a href=) 隐衷政策:https://www.vivo.com.cn/about-vivo/privacy-policy 魅族推送 SDK ...

May 25, 2023 · 1 min · jiezi

关于android:开发者们618电商团战即将开启抢流量想上分必备这三个大招-MobTech观察

最卷的一届“618”大促行将来袭。  5月23日晚间开始,各平台陆续对外启动预售。在生产畛域减速复苏,全国各地迎来“拼经济”热潮的背景下,各平台纷纷对外喊话,将打造“史上投入最大”的一届“618”。  电商平台们想借年中大促漂漂亮亮地打一场“翻身仗”,却发现这场仗并不好打。据万得(Wind)数据,2022年国内网络购物用户已达8.45亿人,靠近网民总数的80%,增量空间殆尽。各大平台要想实现规模增长不能“坐等”天然流量,必须真刀真枪地去拼,去抢。  随着带货、卖货等变现形式在多种流量渠道失去验证,对各大平台来说,抢流量就是抢营收,抢市值,抢将来。往年的618,争夺流量的战火不仅焚烧在支流电商平台“猫狗拼”之间,更蔓延到抖音、快手等新兴直播电商中,甚至小红书、B站和视频号也退出了战场。 对于各大APP开发者和运营者来说,如何高效备战618,须要在预热、拉新、促活各环节发力。这其中,MobTech为开发者们筹备的“抢流量”三大神器将助力平台在618大战中勇拔头筹。  利器1:大促预热,MobPush为您智能精准送达 终于把618节日大促设计进去了。啧啧,这优惠力度,这新品、尖货……  但618流动策动得再好,短少流量曝光,告诉不到指标用户,很容易成为APP经营人员的自嗨。到了整点抢购,本认为曾经杀破底价、吐血让利,消费者会挤破头来买,但理论却人迹寥寥,咋回事?答案是预热没到位,基本没人晓得!再就是没有卡点告诉用户,有志愿成单的客户纷纷在流动过后大呼错过。   MobPush智能多通道推送零碎,以行业当先的达到率,保障了音讯的准点、无效触达。反对蕴含全量播送、自定义标签、用户别名分群等多种指标定义计划。凭借智能标签,可能通过更精准地推送,唤醒不同场景下的用户群体。更有A/B测试,缩小经营人员撰写推送文案的工作量,用迷信的形式筛选最优文案,牢牢抓住消费者的购物心理。  音讯推送是电商平台达到精细化经营的重要工具,MobPush基于MobTech多年来深厚的大数据技术积淀,助力App推送定位精准用户投放,实现老用户的高效唤醒。   利器2:拉新拼单,ShareSDK助力冲破流量增长瓶颈 小姐妹、好基友们分享好物链接,被种草了!能够拼团杀价,更心动了!  可新用户要参加流动,先得辨认图片二维码,下载安装APP,而后复制邀请码,关上APP,寻找流动页面,粘贴邀请码实现邀请,最初能力领劵购买,看得叫一个头昏脑胀,登时失去了“买买买”的兴致。社会化分享拉新过程简单,新老用户跨平台拼单抢购层层碰壁。如何通过各大社交渠道实现无效裂变?  ShareSDK的无码邀请性能从实质上极简了裂变拉新的流程。被邀请方只需点击链接,即可下载App。点开利用,后盾将智能匹配用户关系,主动实现与邀请人的绑定,大大优化了双边用户体验。不仅如此,ShareSDK内集成了MobLink的回调办法,能够依据场景参数实现场景还原,点开App即关上流动页面,让用户能够疾速实现下单。  拼单减免、成团领券是电商流动的低成本获取新用户的重要玩法,ShareSDK一键分享,极简拉新,能疾速、大量地帮忙商家从40+支流平台抢得流量,打造裂变增长的强劲引擎。   利器3:秒杀抢购,少不了秒验一键登录认证 “1块钱限量秒杀,每天12点,限时大促”。  收到这条推送,“买买买”的眼神是不是亮了? 但当下单购买时却发现没有注册或须要从新验证登录账号,等用户匆匆忙忙输出手机号和验证码,折腾了大半天登上账号后,发现商品早已售罄!不少电商平台辛辛苦苦策动的流动,因为账号登录问题,流动转化率大大降落。该怎么留住用户?  秒验作为MobTech旗下外围产品,能让APP新用户在注册环节实现便捷的极速验证。用户无需期待短信验证码,点击首页受权页的确认键,3秒内即可实现整个登录过程。老用户无需输出账号密码,一键登录后可同步到原有账户,大大减少了用户在登录注册、输出验证上所消耗的工夫,让用户购物更便捷。  对于电商平台来说,在晋升用户体验的同时,还能无效地升高注册登录环节的用户散失,加强新老用户的粘性。不仅如此,还能最大水平地保障用户的信息安全,晋升用户信赖。  间隔6月18号仅不到1个月的工夫,而这届号称最卷618早已拉开帷幕,各大平台、品牌拼价格、拼好物,助力生产继续回暖。业内人士介绍,从电商平台颁布的618节奏与玩法来看,往年618,电商平台都在向更简化、体验感更好的优惠规定进化。MobTech三大神器,在优惠触达、社交流传和登录注册等重要场景中,帮忙APP开发者和运营者,晋升新老用户体验,在这场大战中争夺先机。

May 24, 2023 · 1 min · jiezi

关于android:MobTech-ShareSDK口令分享

在挪动互联网时代,社会化分享是一种重要的营销形式,能够进步用户的活跃度,减少产品的曝光度和口碑。目前,市面上常见的社会化分享形式次要有以下几种: 链接分享:将分享的内容转换成链接,点击链接关上内容,这种形式最为广泛,但也存在可能被屏蔽或生效,链接可能过长或不美观,链接可能无奈适应多种场景等问题。图片分享:将分享的内容转换成图片,扫描图片中的二维码或条形码关上内容,这种形式能够防止链接被屏蔽或生效,但也有一些毛病,比方图片可能不清晰或不美观,图片可能无奈适应多种场景,图片可能无奈实现数据统计和场景还原等。文字分享:将分享的内容转换成文字,复制文字中的关键词或口令关上内容。这种形式能够适应的场景多,但局限性是文字可能不吸引人或不易了解,引人恶感。为了解决以上问题,一种新型的社会化分享形式应运而生,那就是口令分享。 口令分享是指将分享的内容转换成一串口令,比方#ShareSDK#123456,用户输出或复制口令,关上分享的内容。口令分享联合了链接分享、图片分享和文字分享的长处,具备以下几个劣势: 能够适应多种分享场景,比方短信、语音、图片等,不受平台限度能够防止链接被屏蔽或生效的危险,进步分享的成功率能够进步用户的好奇心和参与感,减少分享的点击率能够实现口令的数据统计和场景还原性能,帮忙开发者剖析用户行为和优化经营策略那么,如何实现口令分享呢?这里举荐一个好用的社会化登录分享组件——ShareSDK。ShareSDK是MobTech公司的一款社会化登录分享组件,能够提供40多个支流平台的分享与受权等社会化性能,帮忙开发者节俭开发工夫,进步成果稳定性,残缺清晰统计分享数据。ShareSDK反对Android、iOS、鸿蒙等开发平台,能够在MobTech官网下载SDK和查看文档。 ShareSDK联合了MobLink的口令分享性能,能够让开发者自定义口令的格局、长度、有效期等参数,也能够实现口令的数据统计和场景还原性能,进步用户的分享体验和回流成果。 如果你想要为你的产品减少口令分享性能,无妨试试ShareSDK吧!

May 23, 2023 · 1 min · jiezi

关于android:苏丹的复仇携手华为HMS生态实现用户收入双增长

中国出海中东和北非地区的策略类手游《苏丹的复仇》(Revenge of Sultans,ROS)和华为HMS生态深度单干,为本地用户带来翻新游戏体验,成为当地广受欢迎的游戏之一,下载量居利用市场前列。2023年5月10日,在阿联酋迪拜举办的HUAWEI P60系列及旗舰产品发布会中,ONEMT中东GM敏琦通过视频的形式跟大家分享了《苏丹的复仇》游戏与华为HMS生态深度单干的故事。本次咱们对敏琦进行了采访,邀请他分享更多见解。 “此次单干根植于《苏丹的复仇》晋升玩家游戏体验的信心。通过集成HMS Core凋谢能力、上架华为利用市场(HUAWEI AppGallery)、接入华为鲸鸿动能广告平台(Petal Ads),《苏丹的复仇》得以触达超7.3亿华为终端用户,同时帮忙咱们精准锁定了指标游戏玩家。华为的1+8+N全场景终端设备具备优质的音视频能力以及敌对的界面设计,能更好地施展游戏劣势。通过单干,《苏丹的复仇》实现支出同比大幅增长,业务水平达到新高。” “《苏丹的复仇》最后思考和华为HMS生态进行单干,是从HMS Core端云凋谢能力开始,该解决方案提供全流程、全方位的技术撑持,以及丰盛的激励搀扶资源。其中,音讯推送服务(HMS Core Push Kit)和智能剖析服务(HMS Core Analytics Kit)的转化事件实时回传性能,促使业务智能决策,及时调整投放策略,无效晋升游戏留存与沉闷;华为帐号(HMS Core Account Kit)与利用内领取服务(HMS Core In-App Purchases),通过便捷的登录转化及聚合多种领取渠道,帮忙咱们疾速实现商业变现。借助HMS Core端云凋谢能力,《苏丹的复仇》晋升了游戏开发效率及用户体验,促成了业务增长,获得了十分喜人的成绩。” “咱们与华为HMS生态单干的首要指标是拓展中东和北非市场,触达更宽泛的用户群体。整个单干过程十分顺利,华为的专家团队秉持着业余粗疏的单干态度,在集成HMS Core的过程中实时提供技术支持,帮忙《苏丹的复仇》疾速上架华为利用市场。” 华为中东非洲终端生态倒退与运营部部长胡小勇示意:“咱们很快乐跟《苏丹的复仇》携手,晋升中东北非地区的移动游戏体验。事实证明,咱们业余的技术支持和经营反对可能帮忙合作伙伴晋升用户留存及商业变现。在华为HMS生态加持下,《苏丹的复仇》的开发效率、业务倒退都失去了晋升。此次单干意义重大,将来,咱们期待持续和《苏丹的复仇》同行,在游戏行业点亮新的火花。” 《苏丹的复仇》致力于为玩家提供沉迷、翻新的手游体验,跟华为HMS生态单干无疑可能实现这一指标。将来《苏丹的复仇》将持续摸索更多游戏翻新技术,和HMS Core一起为海内消费者带来华为终端上的手游新玩法、新体验。 理解更多详情>> 拜访HMS Core 联盟官网 获取HMS Core 开发领导文档 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

May 23, 2023 · 1 min · jiezi

关于android:MobTech-MobPushChatGPT辅助消息推送实现文案千人千版

音讯推送的千人千面窘境为了吸引用户的注意力,减少用户的活跃度和留存率,晋升利用的流量和支出,手机应用程序往往心愿千人千面地向用户推送告诉,即依据用户的特色和需要,为每个用户推送适合的音讯内容,以有针对性地取得用户的关注。 目前,音讯推送通过智能标签能力曾经能够实现用户画像千人千面,依据用户的注册信息、行为数据、趣味偏好等,为每个用户打上不同的标签,比方年龄、性别、地区、职业、喜好等。然而,当推送告诉时,经营写的文案只能为用户群而写,做不到千人收到千版告诉,起因有很多: 经营人员无奈为每个用户独自写告诉,这样既费时又费劲。经营人员无奈及时跟进每个用户的反馈和行为,难以实现优化调整。因而,音讯推送的千人千面窘境亟待解决。 AI 创作文案的能力AI 可能依据不同的场景、主题、格调等生成不同的文本内容,并且可能依据上下文生成晦涩、连贯、有逻辑、有创意的文本内容。目前,AI 创作文案曾经有了很多利用,比方: ChatGPT 是一种基于 GPT-4引擎的人工智能聊天机器人,能够用自然语言解决算法进行交换、答复问题和提供有用的信息。CopyAI 是一种人工智能写作工具,能帮忙经营人员疾速生成吸引人的题目、注释、结尾等。这些例子表明,AI 创作文案曾经具备了肯定的能力。 畅想 ChatGPT 辅助音讯推送如果将 ChatGPT 与音讯推送联合起来,会产生什么呢? 经营人员只须要输出一个简略的提醒或问题,就能够让 ChatGPT 为每个用户生成不同的音讯内容,并依据用户画像进行个性化和差异化。经营人员依据 ChatGPT 生成的音讯内容进行抉择或批改,通过音讯推送平台或工具发送给用户。经营人通过 ChatGPT 获取用户对音讯内容的反馈和行为,依据这些信息进行优化和调整。这样,经营人员就能够利用 ChatGPT,真正实现推送文案千人千版。 以下是一个应用 Python 调用 ChatGPT 的代码示例,能够实现与在工作中引入ChatGPT ,仅供参考: # 导入 openai 库import openai# 设置 API 密钥openai.api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"# 定义一个空的音讯列表,用于存储对话历史messages = []# 定义一个循环,用于一直输出和输入音讯while True: # 获取用户输出的音讯 user_message = input("User: ") # 将用户音讯增加到音讯列表中 messages.append({"role": "user", "content": user_message}) # 构建一个申请体,设置模型、音讯列表、最大令牌数等参数 request = { "model": "gpt-3.5-turbo", "messages": messages, "max_tokens": 100 } # 调用 ChatGPT 的 API,获取响应后果 response = openai.Completion.create(**request) # 从响应后果中提取 ChatGPT 的音讯内容 chatgpt_message = response["choices"][0]["message"]["content"] # 将 ChatGPT 的音讯增加到音讯列表中 messages.append({"role": "chatgpt", "content": chatgpt_message}) # 打印 ChatGPT 的音讯内容 print("ChatGPT: " + chatgpt_message)

May 22, 2023 · 1 min · jiezi

关于android:WeTab浏览器必备插件提高学习和工作效率

如果你的浏览器主页是这样的,你会是什么感觉呢? 是不是第一眼感觉,嗯,挺难看的。再认真看看主页里的内容,你可能会感觉,竟然有这么多小组件,感觉好不便,能够一关上浏览器就看到本人想要晓得的信息,不须要再关上其余网页。 这款浏览器主页插件叫WeTab,内置了超多实用小组件,其中还有最近大家都想用的AI工具——Chat AI小组件。 能够看到它外面蕴含了6个源,都是收费的,而且不必魔法和注册就能够间接用啦。另外还有一个须要登录WeTab账号能力用的Chat AI,应用起来也是十分不错的,大家能够依据本人的状况抉择。 这个AI工具能够帮你做很多事件,为你带来灵感和思路,还能够提供素材,这对于工作党和学生党来说切实是太不便不不过了。 如果你认真工作累了,那么外面的其余小组件还能够偷偷摸鱼。 比方游戏小组件,你能够玩玩小游戏放松大脑; 比方新闻小组件,能够关注到明天产生的重大新闻; 比方热搜小组件,能够看到全网十个社交媒体平台的热搜榜单; 再比方历史上的明天小组件,能够理解到超多历史常识,拓宽知识面。

May 22, 2023 · 1 min · jiezi

关于android:LeetCode-周赛-34620230521仅-68-人-AK-的最短路问题

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 发问。LeetCode 单周赛第 345 场 · 体验一题多解的算法之美单周赛 345 概览T1. 删除子串后的字符串最小长度(Easy) 标签:栈 T2. 字典序最小回文串(Medium) 标签:贪婪、双指针 T3. 求一个整数的惩办数(Medium) 标签:回溯、状态压缩、前缀和 T4. 批改图中的边权(Hard) 标签:贪婪、最短路 T1. 删除子串后的字符串最小长度(Easy)https://leetcode.cn/problems/minimum-string-length-after-removing-substrings/题解(栈)应用栈模仿扫描过程,当扫描到 D 和 B 时查看栈顶元素,最初栈内残余的元素个数就是无奈打消的最小长度: class Solution { fun minLength(s: String): Int { val stack = ArrayDeque<Char>() for (c in s) { if (c == 'D' && stack.isNotEmpty() && stack.peek() == 'C') stack.pop() else if (c == 'B' && stack.isNotEmpty() && stack.peek() == 'A') stack.pop() else stack.push(c) } return stack.size }}复杂度剖析: ...

May 22, 2023 · 5 min · jiezi

关于android:云音乐-Android-so-体积治理实践

本文作者: dyl背景软件应用除了性能外,还有许多非性能品质属性须要咱们关注,常见有性能、安全性、可用性、可扩展性等。除此之外,软件的体积也是咱们应该关注的重要品质属性。体积对启动速度、下载安装时长、装置成功率、磁盘空间占用、OOM 异样等都有深刻影响。 最近负责治理云音乐 Android 端 so 的体积,通过钻研摸索总结了一些办法,次要从三个方面着手治理,别离是 优化代码优化编译链接优化依赖。用这些办法进行了一次大面积 so 治理后,so 整体从 30M+ 升高为 20M+,缩小了 30%+ 的体积。本文对这些治理办法和背景常识进行了介绍,以供大家参考。 优化代码针对代码,次要关注在去反复代码和禁用低廉的 C++ 语言个性。Andorid NDK 下低廉的语言个性包含 异样RTTIiostream 库去除反复代码反复的代码,不仅带来体积问题,更是一种代码坏滋味。移除反复代码无论在品质上,还是减小 so 体积上都有好处。咱们可采纳代码动态检测工具检测反复代码,而后以提炼类或函数的重构手法进行解决。 提炼函数:如果一个类的多个函数有反复代码,提炼独立函数,放入类中供其余函数应用。如果多个兄弟子类有反复代码,提炼独立函数,放入父类之中供子类应用。提炼类:如果不相干类有反复代码,提炼独立类搁置反复代码,供这些类应用。禁用低廉的 C++ 语言个性在 Android NDK 下,有许多 C++ 个性是比拟低廉的,在 Android NDK 官网文档亦有提及,要尽量避免应用。次要包含禁用 C++ 异样、禁用 C++ RTTI、防止应用 iostream。 C++ 异样会有一个误导,认为能够捕捉让人头疼的空指针、内存越界等意料之外的谬误,其实并不能。异样机制实际上是一种错误处理框架,捕捉事后定义的谬误,其目标是将失常逻辑和异样逻辑的解决离开,进步代码整洁度。而咱们每定义一处异样,在编译链接后都会插入 C++ 库代码进行扩大,占用比编写的代码更多的空间。因为其性能和体积等问题,在实践中可思考改用返回错误码来代替。 C++ RTTI 机制,在语意层面和多态是矛盾的。C++ 的多态,是通过基类指针指向派生类对象,在 Compile Time 时毋庸晓得理论类型,在 Run Time 时方依据指向的类型,执行对应的虚函数实现,从而让咱们得以从依赖实现改为依赖接口。而 C++ RTTI,则是在 Compie Time 期间得悉基类指针指向的理论类型,也即让咱们从依赖接口改为了依赖实现。此外,编译器实现 RTTI 机制往往会减少 class 的大小,比方为每个 class 产生额定的 RTTI 数据,蕴含类名和基类信息。当咱们应用到 RTTI 时应该认真考量,是否设计上呈现了问题。如果非凡状况须要应用,也要分明背地的体积老本和设计老本。 ...

May 22, 2023 · 2 min · jiezi

关于android:Android-CC-内存泄漏分析-unreachable

背景随着对客户端稳定性品质的不断深入,局部的重点、难点问题逐渐治理,内存品质逐渐成为了影响客户端品质的最突出的问题之一。因而淘宝对此进行了系统性的内存治理,成立了内存专项。 “工欲善其事、必先利其器”。本文次要讲述内存专项的工具之一,内存透露剖析memunreachable。 内存透露内存透露(Memory Leak)是指程序中已动态分配的堆内存因为某种原因程序未开释或无奈开释,造成零碎内存的节约,导致程序运行速度减慢甚至零碎解体等严重后果。 对于 c/c++内存透露,因为存在指针要准确找到那些对象没有被援用是十分艰难的,始终是困扰 c/c++重点、难点问题之一。目前也有一些基于相似 GC Swap-Mark 的算法去找到内存泄露,常见工具如 libmemunreachable,kmemleak,llvm leaksanitizer 这类工具也须要记录调配信息。 Android 的 libmemunreachable 是一个零开销的本地内存透露检测器。 它会应用不准确的“标记-革除”垃圾回收器遍历所有本机内存,同时将任何不可拜访的块报告为透露。 无关应用阐明,请参阅 libmemunacachable 文档[1]。尽管 Android 提供了 libmemunreachable 如此优良的开源 c/c++内存透露工具,并内嵌到 Android 的零碎环境,帮忙咱们去定位内存透露问题,然而目前 libmemunreachable 应用依赖线下的 Debug 配置环境,无奈反对淘宝 Release 包。 本文联合 libmemunreachable 源码,咱们一起来观赏 libmemunreachable 的实现原理以及淘宝对 libmemunreachable 革新用来实现对 Release 包的反对,帮忙淘宝定位和排查线上的内存透露问题。 libmemunreachable 剖析基本原理咱们晓得 JAVA GC 算法中,如果内存中的对象中,如果不在被 GcRoot 节点间接或间接持有,那么 GC 在适当的工夫会触发垃圾回收机制,去开释内存。那么哪些节点能够被作为 GC 的 Root 节点: 虚拟机栈(栈帧中的本地变量表)中援用的对象;办法区中的类动态属性援用的对象;办法区中常量援用的对象;本地办法栈中 JNI(即个别说的 Native 办法)中援用的对象。(JVM 中判断对象是否清理的一种办法是可达性算法.可达性算法就是采纳 GC Roots 为根节点, 采纳树状构造,向下搜寻.如果对象间接达到 GC Roots ,两头没有任何两头节点.则判断对象可回收. 而堆区是 GC 的重点区域,所以堆区不能作为 GC roots。)而 C/C++内存模型,堆 heap 、栈 stack、全局/动态存储区 (.bss 段和.data 段)、常量存储区 (.rodata 段) 、代码区 (.text 段)。libmemunreachable 通过 C/C++内存模型联合可达性算法,将栈 stack、全局/动态存储区 (.bss 段和.data 段)作为 GC Root 节点,判断堆 heap 中的内存是否被 GC Root 所持有,如果不被间接或间接持有,则被断定为透露(别较真,不肯定要 100%的判断 C/C++的内存透露,而是能够剖析可能存在的潜在透露)。 ...

May 22, 2023 · 8 min · jiezi

关于android:从热爱到深耕在开发路上的他们勇敢逐梦

2022年的程序员节, #大龄程序员去哪儿了#成为了社交媒体上最火的话题之一,程序员的职场成长问题在社会上引起了宽泛关注。 有2位在技术畛域摸爬滚打很多年的开发者,35岁后的他们,有70后,有80后,仍然在编程开发,仍然有到职守业的勇气,努力实现本人的人生价值。走进他们的故事,你会发现,这个世上没有遥不可及的幻想。 互联网艺术家:守业就是游玩,守业自身就很乏味 互联网为很多人带来了有限时机,哪怕曾经过了红利期,当下互联网仍是一个宽度很广的畛域。肖世荣是一位酷爱衰弱生存和喜爱摸索新技术的程序员。 70后的他认为,35岁的焦虑是不存在的,大部分人的焦虑是来自以前欠下的“债”。35岁时候的他,致力钻研新技术,因为编程技术是在一直迭代的,三五年就会被淘汰,他认为在 IT行业是肯定要学习的,只有技术够硬,当前去哪里都不会怕。 IT行业的机会要宽得多,相比于很多须要资金、大量投钱能力做的行业,IT行业只有有电脑懂编程就能够。和做实体的人相比,IT从业者踩到了时代的红利,不搞点货色进去,就太节约机会了,能开释本人心田的小宇宙,本人也会很高兴。 肖世荣曾是一名传统的IT从业者,经验过大厂、中小各种IT类型公司。因为他自己遇到了便秘问题,久坐肚子大,推陈出新慢也是大部分中年人的共性,加上他酷爱跑步,发现很多健身类软件和设施可能激发和揭示人们保持跑步,他就想,为什么不做一款揭示大家便便,记录便便工夫的衰弱类App? 2018年的他,心田压抑了很久的一团火被点燃,决定开发便了么App,帮忙有须要的人,让大家器重本人的便秘问题,养成法则的排便习惯,理解和关注本人的衰弱状况。 “毫无保留地爱,得心应手地发明,无牵无挂地游玩。对我而言,守业就是游玩,我守业是因为守业自身很乏味。”肖世荣说。 最后他也是利用空闲的工夫去做这件事,2022年才开始全身心投入进来。在他看来,守业这件事不必立马辞职去做,否则心里压力会很大,得养家糊口,每天想钱的问题怎么可能做得好?像游玩一样的守业和工作并不是非此即彼的选项,能够逐渐向指标凑近。 肖世荣开始尝试,用他的话说,来耍一耍。他的强项是在后端,得自学挪动端编程,万事开头难,他的教训是,做一件事时,开始要简略点,先把第一个界面做进去,比方就在界面做一个【开始】的按钮,前面有工夫了,再做第2个第3个……从0到1去钻研本人真正好奇的货色,缓缓开发产品性能。 就这样,肖世荣保持到了当初。“在这个过程中,必定会有懈怠的时候,抵赖本人会懈怠,心里不要遗记就好了,缓缓迭代。心态很重要,不要一下子想取得很大的成就,他人想做大象,你能够先当蚂蚁,重要的是先口头起来。” 这样一来,守业、赚钱不再是一件压力很大的事,更像是一门艺术,乐趣变得更多了。他的目标和关注点都在创作自身,为了爱好、喜爱而创作,为了自娱、自赏而创作。实质上创业者就是创作者,是互联网行业的艺术家。 2021年HarmonyOS 2.0横空出世,肖世荣开始深刻理解鸿蒙,通过HarmonyOS的真机调试,他惊喜地发现HarmonyOS系统对App的运行效率主动进行了优化,运行起来比其余操作系统还晦涩。随着更多地接入和应用华为帐号、推送、Network Kit、利用内领取、云测试、云调试等鸿蒙的技术和能力,肖世荣感觉App开发起来更高效。 在2022年鸿蒙开发者大赛Apps UP寰球利用翻新赛道中,便了么App取得“最具社会价值奖”,这给了肖世荣更大的信念。他说:“作为中年开发者,加入这样的翻新大赛仍然会让他冲动,利用本人的能力去发明对大家有用的货色,这种感觉就很好。” 肖世荣激励开发者多加入华为开发者联盟举办的HDD、HDG等流动,这样能够获取更多的鸿蒙技术信息和意识更多的生态搭档,并且多尝试应用鸿蒙工具和服务来解决业务和技术上遇到的问题,这样能更快失去稳固和高效的技术撑持,不必本人反复制作轮子,让创作更容易。 回绝内卷的技术宅:钻研技术点就像打游戏一样 吴骞,Notein一笔记App的开发者,是一个典型的技术宅,对软硬件零碎相干的技术尤其感兴趣,对他来说,做技术和玩游戏一样乏味。因为想做本人喜爱的感兴趣的事件,所以抉择了自主守业。 80后的他没有上有老下有小的家庭经济压力,纯正想花工夫做有意义的事件,精密打磨发明出一款又酷又好用的产品。 程序员过了35岁就干不了活了?吴骞感觉是因为很多人一开始就不喜爱技术类的货色,是为了赚钱碰巧进入了这个行业。而有激情有趣味,才更容易把事件做好。 “当下互联网的改革是良性的,之前大厂待遇过高,优良的工程师扎堆后,造成 ‘内卷’,节约了大量的生产力。当下是个十分好的历史机会,能够让优质的App有怀才不遇的空间。”他说。 在应用过市面上能找到的所有支流、非主流的手写笔记App之后,吴骞发现,不同终端操作系统的生态环境不同,在支流平台上,因为一些历史起因,手写笔记相干的利用生态属于后起之秀,真正高质量的好产品并不多见。 且近年来平板市场出现显著的增长态势,生产力工具市场无望成为下一个风口,这给手写笔记App带来很好的机会点,同时,他惊喜地发现鸿蒙生态也在多阵线发力万物互联,买通了多终端设备协同的限度,这正符合了吴骞想要开发一款多终端手写笔记App的想法,能够大大缩减他在跨终端利用开发上的投入。 在这样的背景下,吴骞和合伙人一起启动了Notein我的项目,指标做一个真正从用户体验登程的高品质利用,一款全新的生产力工具,帮忙用户在多端进步学习和工作效率,同时也能缩小人们对纸张的节约。 从鸿蒙被推出的时候,他就在关注,但真正理解鸿蒙,是在HarmonyOS零碎上开发了App之后,吴骞发现,HarmonyOS操作系统和其余的都不一样,很晦涩,最牛的状态是“我都没感觉到它,但体现就是特地的好”。 另外,让吴骞惊喜的是HarmonyOS的凋谢能力和服务,笔记类App的关键问题是书写提早,就是常说的“跟不跟手”,Notein一笔记在应用了Pencil Engine手写笔能力后,让他感觉,“接入手写笔能力后,毫不夸大地说,利用体验好了十分多!”。 2022年,Notein一笔记在鸿蒙开发者大赛中获奖,通过这次大赛,Notein团队对HarmonyOS的凋谢能力有了进一步的理解,吴骞心愿将来也能为鸿蒙生态奉献一份绵薄之力。同时,也心愿在欠缺Notein的同时,持续做出更多优良的产品,以继续为用户提供优良的多端生产力工具软件服务而致力。 结语 现在越来越多的开发者投身鸿蒙生态建设,大家感触最强烈的就是,从19年到当初,鸿蒙生态为开发者提供足够的撑持和便当,并以肉眼可见的速度在日趋完善。对少量的开发者来说,生态的赋能是十分值得期待的,置信不少的开发者都有很优良的想法,能够借助鸿蒙生态,将优良的想法变成事实,真正好的产品,在生态赋能的浪潮里是不会被湮没的。 鸿蒙开发者大赛激励更多的开发者怯懦地谋求本人的幻想,展示自我的价值,和更多的伙伴钻研新技术,获取可能帮忙到本人的技术、资源等等有利于达成指标的“配备”,能在将来打怪降级的路上走得容易些,拓展和寻找更多增长机会,实现弯道超车。 理解更多详情>> 拜访HMS Core 联盟官网 获取HMS Core 开发领导文档 关注咱们,第一工夫理解 HMS Core 最新技术资讯~

May 22, 2023 · 1 min · jiezi

关于android:From-Java-To-Kotlin空安全扩展函数Lambda很详细这次终于懂了

From Java To Kotlin, 空平安、扩大、函数、Lambda概述(Summarize)Kotlin 是什么?能够做什么?Android 官网开发语言从Java变为Kotlin,Java 有哪些问题?Kotlin的长处Kotlin 个性(Features)Kotlin 是什么?Kotlin 出自于捷克一家软件研发公司 JetBrains ,这家公司开发出很多优良的 IDE,如 IntelliJ IDEA、DataGrip 等都是它的杰作,包含 Google 官网的 Android IDE -- Android Studio ,也是 IntelliJ IDEA 的插件版。 Kotlin 源于 JetBrains 的圣彼得堡团队,名称取自圣彼得堡左近的一个小岛 ( Kotlin Island ) ,和 Java一样用岛屿命名,JetBrains 在 2010 年首次推出 Kotlin 编程语言,并在次年将之开源。 Kotlin 是一种在 Java 虚拟机上运行的动态类型编程语言,被称之为 Android 世界的Swift。Kotlin 能够编译成Java字节码。也能够编译成 JavaScript,不便在没有 JVM 的设施上运行。在Google I/O 2017中,Google 发表 Kotlin 成为 Android 官网开发语言,代替 Java 语言。Kotlin 代码会被编译成Java字节码,所以和 Java 兼容<img src="http://seachal-blog-picture-host.oss-cn-beijing.aliyuncs.com/MWeb/2023/03/16/16789367124770.jpg" class="m-0 h-110 rounded shadow" /> ...

May 20, 2023 · 11 min · jiezi

关于android:大数据如何助力营销4策略制定

大数据是指规模微小、类型多样、价值密度低、时效性强的数据汇合,它具备开掘价值、发明价值和驱动翻新的后劲。大数据的利用曾经渗透到各个行业和畛域,其中,营销是一个重要的利用场景。在大数据时代,营销面临着新的时机和挑战,如何利用大数据技术和办法,进步营销的效率和成果,成为了企业关注的重点问题。策略制订具体体现在产品策略、价格策略、渠道策略和促销策略四种策略上。 产品策略和价格策略产品策略是指依据指标市场和指标客户群体的需要,确定产品或服务的性能、品质、设计、品牌等因素,并依据产品生命周期进行产品翻新或改良。价格策略是指依据产品或服务的老本、价值、竞争情况等因素,确定产品或服务的价格水平,并依据市场变动进行价格调整或优惠。 在大数据时代,能够实现以下几个方面的优化 进步产品设计的创新性和适应性:通过消费者行为数据、消费者反馈数据等信息,深刻理解消费者对产品或服务的冀望、偏好和满意度。应用互联网平台让用户积极参与式设计或协同翻新,将消费者纳入产品设计过程中,造成一个具备差异化劣势的产品设计计划。进步价格制订的合理性和灵敏性:利用老本数据、竞争对手数据等,精确计算产品或服务的老本价值,通过竞争剖析和价值剖析,确定产品或服务在市场中所处的地位,并依据不同细分市场或指标客户群体的领取志愿及其变动状况进行动静定价或差异定价。渠道策略和促销策略渠道策略是指依据指标市场和指标客户群体的特色,抉择适合的渠道类型、渠道层级、渠道成员等因素,并依据渠道运作的成果进行渠道治理或调整。促销策略是指依据产品或服务的特点,抉择适合的促销工具、促销形式、促销机会等因素,并依据促销流动的成果进行促销评估或优化。 在大数据时代,能够实现以下几个方面的优化: 进步渠道抉择的多样性和有效性:大数据分析消费者对不同渠道的应用习惯、偏好和满意度,确定不同渠道的覆盖率、老本效率、竞争力等指标,并依据不同细分市场或指标客户群体的特色和需要进行多渠道或跨渠道等形式,造成一个具备协同效应的渠道抉择计划。进步促销设计的创意性和针对性:通过促销剖析或促销测试等形式,依据不同细分市场或指标客户群体的特色和需要进行个性化或定制化等形式,造成一个具备创新性和差异化劣势的促销设计方案。 结语大数据是一种新兴的技术和办法,它为营销提供了新的思路和伎俩。通过利用大数据技术和办法,企业能够更好地理解市场和消费者,更精准地制订营销策略,更无效地执行营销流动,更迷信地评估营销成果。在大数据时代,企业应该抓住机遇,挑战自我,不断创新营销模式,晋升营销程度。

May 19, 2023 · 1 min · jiezi