Android
文章平均质量分 51
milovetingting
这个作者很懒,什么都没留下…
展开
-
Mac 编译OpenCV
个人博客http://www.milovetingting.cn前言简单记录Mac下编译OpenCV,以便后续查看。使用HomeBrew安装cmakebrew install cmake获取OpenCV源代码官网地址:https://opencv.org/releases/选择Sources下载编译OpenCV解压文件,在解压后的目录中创建一个临时目录,名称不限,如build,在终端中执行mkdir build进入创建的目录cd build配置cmake .原创 2021-07-05 15:58:19 · 691 阅读 · 0 评论 -
Tesseract-OCR样本训练
个人博客http://www.milovetingting.cn下载Tesseracthttps://github.com/UB-Mannheim/tesseract/wiki下载jTessBoxEditorhttps://sourceforge.net/projects/vietocr/files/jTessBoxEditor/jTessBoxEditor-2.3.1.zip/download安装Tesseract一路Next,在选择组件界面,全选所有组件安装jTessBoxEdi.原创 2021-07-04 12:39:55 · 316 阅读 · 1 评论 -
Artifactory搭建本地仓库(二)-通过Gradle上传AAR
个人博客http://www.milovetingting.cn前言在上一篇文章 Artifactory搭建本地仓库 中,已经搭建好了本地仓库,这一篇,主要介绍在Android Studio中通过Gradle上传AAR到本地仓库,以便其它项目引用。上传AAR在项目根目录下的gradle文件的dependencies节点增加classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.15.2"完整的gradle// Top.原创 2021-01-29 17:11:17 · 485 阅读 · 0 评论 -
阿里云HttpDns接入
个人博客http://www.milovetingting.cn前言简单记录集成阿里云HTTPDNS服务的过程什么是HTTPDNSHTTPDNS是面向多端应用(移动端APP,PC客户端应用)的域名解析服务,具有域名防劫持、精准调度、实时解析生效的特性。以上来自阿里云HTTPDNS文档。接入流程服务开通HTTPDNS是移动研发平台提供的服务,请参考EMAS 快速入门开通服务。开通服务后,进入控制台,点击添加产品,如图所示完成添加产品后,点击添加应用,如图所示添加.原创 2020-12-29 23:33:42 · 1906 阅读 · 0 评论 -
Android电量优化-Battery Historian环境搭建及简单使用
个人博客http://www.milovetingting.cnAndroid电量优化-Battery Historian环境搭建及简单使用前言在Android5.0后,Batterystats已经内置在Android系统中,用于收集设备上的电池数据。可以使用adb将收集的电池数据导出,并生成可使用 Battery Historian 分析的报告。Battery Historian 会将报告从 Batterystats 转换为可在浏览器中查看的 HTML 直观视图。在Android8.0后,也.原创 2020-12-12 12:01:53 · 2668 阅读 · 1 评论 -
Crash监控的简单实现方案
个人博客http://www.milovetingting.cnCrash监控的简单实现方案前言本文从Java层及Native展开,简单记录Android中的Crash监控方案。Java层CrashJava层的crash监控,可以通过实现Thread.UncaughtExceptionHandler接口,重写uncaughtException方法来实现,简单示意代码如下:public class CrashHandler implements Thread.UncaughtExceptio.原创 2020-12-10 02:12:55 · 452 阅读 · 1 评论 -
KMM跨平台开发环境搭建
个人博客http://www.milovetingting.cnKMM跨平台开发环境搭建KMM是什么KMM即Kotlin Multiplatform Mobile ,是由Jetbrains提供的跨平台移动开发SDK,借助 Kotlin的跨平台能力,可以使用一个工程为多个平台编译。使用 KMM,具备灵活性的同时也保留了原生编程的优势。为 Android/iOS 应用程序的业务逻辑代码使用单一的代码库,仅在需要的时候编写平台特定代码,例如实现原生的 UI,使用平台特定 API 等等。KMM 可.原创 2020-12-05 00:53:15 · 1381 阅读 · 0 评论 -
使用BinderPool管理AIDL
使用BinderPool管理AIDL个人博客:http://www.milovetingting.cn前言平时我们用到AIDL,一般的流程可能是这样:定义AIDL接口定义服务,在onBind方法中返回实现了AIDL接口的Stub类的实例调用bindService方法,在ServiceConnection的onServiceConnected回调中获取到Binder对象通过Binder对象调用接口中的方法如果我们只是用到比较少的AIDL调用,那么上面的方法的确是可行的原创 2020-06-28 15:53:08 · 191 阅读 · 0 评论 -
Android自定义View-圆形图片控件
个人博客http://www.milovetingting.cnAndroid自定义View-圆形图片控件前言在日常开发中,圆形的图片效果还是很常见的。可以通过给Paint设置Xfermode来实现,这里简单记录如下。实现实现圆形效果的核心是PorterDuffXfermode,对于PorterDuffXfermode,这里不展开,可以查询相关资料。核心代码//绘制背景canvas.drawCircle(mSize / 2, mSize / 2, mSize / 2, mPaint);.原创 2020-06-09 11:19:29 · 405 阅读 · 3 评论 -
IntelliJ IDEA插件开发的简单流程
个人博客http://www.milovetingting.cnIntelliJ IDEA插件开发的简单流程前言平时用Android Studio开发项目时,我们都会或多或少接触到一些插件,这些插件能帮助我们提高开发效率。如果我们有一些特定的需求,但还没有插件可以满足这些需求,那么可以通过自定义插件来实现。自定义插件创建插件工程File-New-Project,在创建工程的界面,选择IntelliJ Platform Plugin,右侧选择SDK,这里需要选择IntelliJ IDEA安.原创 2020-05-08 22:55:23 · 389 阅读 · 0 评论 -
IOC之运行时注入-实现Activity的布局注入+控件注入+事件绑定
个人博客http://www.milovetingting.cnIOC之运行时注入-实现Activity的布局注入+控件注入+事件绑定前言本文主要介绍基于IOC的设计原则,实现以下功能:布局注入控件注入事件注入其实这些功能,在之前也有零散地介绍过,这里再做一个统一的整理。这里暂时不考虑运行时反射的效率问题,只是展示一种实现方案。IOC的定义IOC,即Inv...原创 2020-05-08 11:28:20 · 183 阅读 · 0 评论 -
动态代理+注解+反射实现View的点击事件绑定
个人博客http://www.milovetingting.cn动态代理+注解+反射实现View的点击事件绑定代理模式是给对象提供一个代理对象,由代理对象来控制原对象的引用。代理模式分为静态代理和动态代理。静态代理定义接口public interface Player { void play();}定义具体的实现类public class PlayerImpl ...原创 2020-04-29 17:23:15 · 376 阅读 · 0 评论 -
Jetpack学习-WorkManager
个人博客http://www.milovetingting.cnJetpack学习-WorkManagerWorkManager是什么WorkManager可以轻松调度即使在应用退出或设备重启时仍应运行的可延迟异步任务,不适用于应用进程结束时能够安全终止的运行中的后台工作,也不适用于需要立即执行的任务。简单使用引入WorkManager在需要引入WorkManager的模块的bu...原创 2020-04-20 21:00:13 · 209 阅读 · 0 评论 -
Jetpack学习-Paging
个人博客http://www.milovetingting.cnJetpack学习-PagingPaging是什么分页库可一次加载和显示一小块数据。按需载入部分数据会减少网络带宽和系统资源的使用量。简单使用引入Paging在需要引入Paging模块的build.gradle中配置 def paging_version = "2.1.0" implementatio...原创 2020-04-18 17:13:03 · 199 阅读 · 0 评论 -
Jetpack学习-Navigation
个人博客http://www.milovetingting.cnJetpack学习-NavigationNavigation是什么Navigation翻译过来就是导航。导航是指支持用户导航、进入和退出应用中不同内容片段的交互。Android Jetpack 的导航组件可帮助您实现导航,无论是简单的按钮点击,还是应用栏和抽屉式导航栏等更为复杂的模式,该组件均可应对。导航组件还通过遵循一...原创 2020-04-17 23:10:30 · 780 阅读 · 0 评论 -
Jetpack学习-Room
个人博客http://www.milovetingting.cnJetpack学习-RoomRoom是什么Room 持久性库在 SQLite 的基础上提供了一个抽象层,让用户能够在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制以上内容来自官方文档。用一句话总结下:Room是基于SQLite封装的一个框架。简单使用引入Room在需要使用的模块的build...原创 2020-04-16 20:37:41 · 200 阅读 · 0 评论 -
Jetpack学习-DataBinding
个人博客http://www.milovetingting.cnJetpack学习-DataBinding简单使用在需要使用DataBinding的模块的build.gradle中增加android { //... defaultConfig { //... dataBinding{ enabled true ...原创 2020-04-15 23:18:16 · 234 阅读 · 0 评论 -
Jetpack学习-LiveData
个人博客http://www.milovetingting.cnJetpack学习-LiveDataLiveData是什么LiveData是一种可观察的数据存储器类,具有生命周期的感知能力。简单使用LiveData一般都是和ViewModel一起使用。定义一个类继承自ViewModel:public class LiveDataSub extends ViewModel { ...原创 2020-04-14 21:48:08 · 115 阅读 · 0 评论 -
Jetpack学习-Lifecycle
个人博客http://www.milovetingting.cnJetpack学习-LifecycleLifecycle是什么Lifecycle是Jetpack提供的一个组件,可以感知Activity,Fragment的生命周期变化。简单使用定义一个类继承自LifecycleObserver,根据业务需要,在这个类中重写相应的方法public class LifecycleObs...原创 2020-04-14 21:45:17 · 139 阅读 · 0 评论 -
Jetpack学习-初识Jetpack
个人博客http://www.milovetingting.cnJetpack学习-初识Jetpack前言本篇介绍Jetpack,内容来自官方文档。(我是搬运工#_#)Jetpack是什么Jetpack 是一套库、工具和指南,可帮助开发者更轻松地编写优质应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的代码上。Jetpack...原创 2020-04-14 21:42:17 · 248 阅读 · 0 评论 -
基于Netty实现服务端与客户端通信
个人博客http://www.milovetingting.cn基于Netty实现服务端与客户端通信前言本文介绍基于Netty实现的服务端与客户端通信的简单使用方法,并在此基础上实现一个简单的服务端-客户端指令通信的Demo。Netty是什么Netty是一个NIO客户端-服务器框架,可以快速轻松地开发网络应用程序,例如协议服务器和客户端。它极大地简化了网络编程,例如TCP和UDP...原创 2020-04-13 03:00:02 · 1067 阅读 · 0 评论 -
Gradle自定义插件发布到Maven
个人博客http://www.milovetingting.cnGradle自定义插件发布到Maven前言日常开发中,我们可能会用到一些别人开发的插件,通常我们是这样引入插件的:在项目根目录下的build.gradle增加配置:buildscript { repositories { //... maven { url 'https://d...原创 2020-04-05 17:17:59 · 437 阅读 · 0 评论 -
Android应用加固的简单实现方案(二)
个人博客http://www.milovetingting.cnAndroid应用加固的简单实现方案(二)前言上一篇文章介绍了基于dex加固方案的两种具体实现。相对于手动加固,基于gradle实现的加固方案效率有了进一步提升。但是,还是需要在壳Module中增加util相关工具类的引用,为进一步减少代码侵入性,在前面方案的基础上,进一步完善插件的功能。实现原理为了避免在壳Modul...原创 2020-04-05 07:55:23 · 573 阅读 · 0 评论 -
Android应用加固的简单实现方案
个人博客http://www.milovetingting.cnAndroid应用加固的简单实现方案概述Android应用加固的诸多方案中,其中一种就是基于dex的加固,本文介绍基于dex的加固方案。原理:在AndroidManifest中指定启动Application为壳Module的Application,生成APK后,将壳Module的AAR文件和加密后的APK中的dex文件合...原创 2020-04-04 16:51:39 · 1574 阅读 · 3 评论 -
Android中ANR的触发机制-BroadcastReceiver篇
个人博客http://www.milovetingting.cnAndroid中ANR的触发机制-BroadcastReceiver篇上一篇分析了Service中的ANR触发机制,这一篇来分析BroadcastReceiver的ANR触发机制。触发机制分析附上时序图注册过程要分析BroadcastReceiver的ANR机制,先来看BroadcastReceiver的regis...原创 2020-03-16 23:14:31 · 2504 阅读 · 1 评论 -
Android中ANR的触发机制-Service篇
个人博客http://www.milovetingting.cnAndroid中ANR的触发机制-Service篇概述ANR,即Application Not Responding,应用程序不响应。在Android系统中,对于事件的处理,都需要在一定的时间内完成,如果处理超时的话,就会触发ANR,弹出不响应的界面,让用户选择等待或是立即结束应用。ANR机制的简单流程:在事件发给应用处理...原创 2020-03-16 23:11:42 · 1975 阅读 · 0 评论 -
Application中以标准模式启动Activity报错的原因分析
个人博客http://www.milovetingting.cnApplication中以标准模式启动Activity报错的原因分析在Android中,启动的Activity都会运行在相应的任务栈中。如果直接在Application中以标准模式启动Activity,则会报出以下错误(Android7、Android8除外,后面会分析):Calling startActivity() f...原创 2020-03-11 20:46:05 · 691 阅读 · 0 评论 -
Android中插件化的简单实现:启动未注册的Activity
个人博客http://www.milovetingting.cnAndroid中插件化的简单实现:启动未注册的Activity前言本文介绍在Android中启动未在AndroidManifest中注册的Activity的一个解决方案。主要需要掌握以下知识点:反射类加载Activity的启动过程Resource加载过程启动应用内未注册的ActivityAc...原创 2020-03-10 21:42:11 · 481 阅读 · 0 评论 -
使用APT实现Android中View的注入
个人博客http://www.milovetingting.cn使用APT实现Android中View的注入前言APT是Annotation Processing Tool的简写,通过在Java编译时期,处理注解,生成代码。APT在ButterKnife、Dagger2等框架中都有应用。下面通过使用APT,实现一个类似ButterKnife的简单的View注入的框架。(参考Jett老师...原创 2020-03-04 23:42:22 · 306 阅读 · 0 评论 -
Android中网络框架的简单封装
个人博客http://www.milovetingting.cnAndroid中网络框架的简单封装前言Android作为一款主要应用在移动终端的操作系统,访问网络是必不可少的功能。访问网络,最基本的接口有:HttpUrlConnection,HttpClient,而在后续的发展中,出现了Volley,OkHttp,Retrofit等网络封装库。由于各种原因,在实际的项目开发中,我们可能...原创 2020-03-04 23:37:47 · 803 阅读 · 0 评论 -
Artifactory搭建本地仓库
个人博客http://www.milovetingting.cnArtifactory搭建本地仓库前言之前使用Nexus Repositories Manager搭建了Maven本地仓库(可参考Android Gradle分类下的Android Gradle 多项目构建文章)。这里,用另一种方法:使用Artifactory来搭建本地仓库(参考Allen老师的课程)。启动下载Arti...原创 2020-03-03 01:30:10 · 782 阅读 · 0 评论 -
修改Android Studio新建工程时repositories的默认配置
个人博客http://www.milovetingting.cn修改Android Studio新建工程时repositories的默认配置前言由于众所周知的原因,Android Studio中连接google和jcenter的仓库时,会比较慢,较大机率会失败。为解决这个问题,可以设置仓库为阿里云的仓库:maven{ url 'https://maven.aliyun.com...原创 2020-03-02 23:50:13 · 2630 阅读 · 0 评论 -
ASM字节码插桩
个人博客http://www.milovetingting.cnASM字节码插桩前言热修复的多Dex加载方案中,对于5.0以下的系统存在CLASS_ISPREVERIFIED的问题,而解决这个问题的一个方案是:通过ASM插桩,在类的构造方法里引入一个其它dex里的类,从而避免被打上CLASS_ISPREVERIFIED标签。热修复可以参考其它资料或者前面写的一篇文章。本文主要介绍ASM...原创 2020-02-25 22:32:19 · 1979 阅读 · 1 评论 -
在Android Studio中调试Gradle插件
个人博客http://www.milovetingting.cn在Android Studio中调试Gradle插件前言在开发Gradle插件时,经常会需要通过调试来排查问题,如果只使用日志输出来定位的话,效率不高,可以通过单步调试来定位问题。关于调试插件的资料,网上比较多,最终经过实践,参照这一篇文章 https://juejin.im/post/5dc8d947e51d455523...原创 2020-02-25 22:29:15 · 884 阅读 · 1 评论 -
自定义Gradle插件
个人博客http://www.milovetingting.cn自定义Gradle插件自定义Gradle插件可以分三种定义在具体的Module对应的gradle文件里。这种方式定义的插件只能在定义的Module中使用定义名为BuildSrc的Module,在BuildSrc里定义。这种方式定义的插件只能在同一个工程中使用。定义其它名字的Module,在新定义的Modul...原创 2020-02-25 00:22:07 · 241 阅读 · 2 评论 -
热修复
个人博客http://www.milovetingting.cn热修复前言最近在熟悉Android热修复方面的知识,纸上得来终觉浅,因此写了一个基于dex分包方案的简单Demo。热修复是什么在热修复技术出现前,对于已经发布的应用,如果遇到BUG,需要再次发布版本,用户需要更新应用版本,才可以解决问题。这种方式,存在新版本覆盖所需要的时间较长、需要全量更新的问题。而基于热修复技术,可...原创 2020-02-21 00:34:32 · 875 阅读 · 1 评论 -
位运算的简单应用-权限管理
个人博客http://www.milovetingting.cn位运算的简单应用-权限管理位运算在实际的开发中,有很多巧妙的应用场景。如:一个存放正整数的数组,里面有一个数字只出现一次,其它数字都出现两次,求只出现一次的数字。不用临时变量,交换两个数字的值。Android中Window设置Flag public void setFlags(int flags, i...原创 2020-01-16 23:34:50 · 150 阅读 · 0 评论 -
Android埋点方案的简单实现-AOP之AspectJ
个人博客http://www.milovetingting.cnAOP之AspectJ的简单使用AOP的定义AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。以上关于AOP的定义引用自百度百科。AOP的运用场景日志记录、性能统计、权限控制、埋点等AOP的具体实现方案...原创 2020-01-13 17:36:31 · 596 阅读 · 1 评论 -
【Android】VirtualAPK的简单使用
VirtualApk引入步骤:一、宿主应用引入VirtualApk###1、在项目的build.gradle文件中加入依赖:dependencies { classpath 'com.didi.virtualapk:gradle:0.9.8.6'}完整的gradle文件如下:// Top-level build file where you can add configura...原创 2019-02-26 11:16:42 · 681 阅读 · 0 评论 -
【Android】动态更新Icon
动态更改图标主要用到activity-alias和PackageManager的setComponentEnabledSetting方法。具体步骤如下:1、在AndroidManifest.xml中增加以下声明:<activity-alias android:name=".alias" android:enabled="false" and...原创 2019-02-26 11:21:02 · 173 阅读 · 0 评论