自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(93)
  • 资源 (4)
  • 收藏
  • 关注

原创 Android JNI系列详解之ndk-build工具的使用

Android.mk是ndk-build编译必配的一个文件,Application.mk是可选配的(如编译的目标库未使用C/C++标准库,也不需要指定cpu指令集对应的abi),如果未配置Application.mk会走默认的这些配置。Android.mk:用于向ndk-build编译工具描述源文件和库的信息,如要生成什么类型的库(动态、静态),库的名称,以及生成库使用了哪些C/C++源码文件,或者使用了哪些第三方库文件,等等。这时候去运行项目,会出现崩溃,错误是找不到libhaha.so。

2023-08-31 00:07:58 2027

原创 Android JNI系列详解之ndk编译工具环境变量配置

这里是因为我在c:\Users\86157目录下没有相关的配置文件,所以打印的这个。如果是正式项目下有Android.mk和Application.mk配置文件,就可以正式的进行编译了。下节介绍如何使用ndk-build进行编译。之前是只介绍了CMake编译工具的使用,现在介绍另一种原生(NDK自带的脚本工具)自带的编译方式:ndk-build,想要使用ndk-build编译工程,我们需要配置全局的环境变量。找到ndk在电脑上的安装路径,没有的可以点download下载,我这个也是刚在as下载的。

2023-08-27 23:07:15 899

原创 Android JNI系列详解之生成指定CPU的库文件

如上图所示,不同手机使用了不同的cpu,不同的cpu支持不同的指令集,每种指令集有对应的二进制接口abi(arm64-v8a、armeabi-v7a、x86、x86_64就是四种abi类型 ),就是二进制库文件。其中手机常用的是arm64-v8a、armeabi-v7a,平板和虚拟机上更多的是x86、x86_64。如上图所示,是我们之前使用CMake工具默认生成的四种cpu架构的动态库文件:arm64-v8a、armeabi-v7a、x86、x86_64,分别对应对四种不同cpu类型的支持。

2023-08-27 22:46:19 706

原创 Android JNI系列详解之CMake配置库文件的输出目录

如果遇到了,意思是有重复的库文件,就是build下有一份会被加载进项目,jniLibs这个指定的目录也会加载进项目。1.默认的库文件输出路径:app/build/intermediates/cmake/debug/obj。是指与CMakeList.txt所在目录的同级目录:jniLibs (如果没有会新建)生成库文件时,采用gradle配置的ABI策略(即:生成哪些平台对应的库文件)是指 cmake库的源路径,通常是build/.../cmake/​​​​​这是我在项目中加的代码。

2023-08-25 00:09:10 748

原创 Android JNI系列详解之CMake编译工具的使用

如图所示,CMake工具的主要作用是,将C/C++编写的native源文件编译打包生成库文件(包含动态库或者静态库文件),集成到Android中使用。

2023-08-24 23:41:14 1181

原创 Android JNI系列详解之AS创建Native C++项目

Android Studio版本:Android Studio Electric Eel | 2022.1.1 Patch 1。6.buil.gradle中也自带了CMakeList的配置(包含CMakeList的路径和版本)界面显示的字符串来自于C++的代码,说明Java调用C++代码成功。8.编译运行之后的库文件在build目录下。2.选择新建Native C++项目。4.选择C++标准库的支持版本。5.项目自带的默认生成的代码。7.C++代码的实现。9.默认程序运行效果。

2023-08-22 23:48:00 823

原创 Android JNI系列详解之JNI、NDK环境搭建和编译工具安装

JNI属于Java中的一部分,所以只需要搭建Java环境就有了JNI的环境,安装Java的环境可以网上查找教程,很多的安装JDK的博客。本地开发工具包:通过AndroidStudio下载:SDK Manager->SDK Tools->NDK。在上面的第三步安装好了NDK,就自带了ndk-build工具。因此我电脑已经拥有了ndk-build工具。本文主要介绍JNI、NDK环境变量的搭建,以及CMake工具的安装和ndk-build工具的安装。

2023-08-20 23:34:10 644

原创 Android JNI系列详解之CMake和ndk-build编译工具介绍

CMake:cross platform make,是跨平台的编译工具CMake是在AndroidStudio2.2之后引入(目前默认的NDK编译工具),使用时配合CMakeList.txt和gradle。对C++的配置:默认配置了libc++;默认启用了C++异常;默认启用了RTTI(运行时类型识别)

2023-08-20 22:58:56 658

原创 Android JNI系列详解之NDK和JNI介绍

而在Android中,Java或者kotlin代码编写程序,也是需要先生成classes文件,在Android还需要将classes文件使用dx工具打包成dex文件(会将classes中冗余的信息去除,会比class文件少很多,文件少就会减少io的操作,提高了类的查找速度),然后dex文件经过Android的虚拟机Dalvik/ART(与JVM虚拟机不同的是,android虚拟机基于的是CPU寄存器,而JVM基于的是堆栈,CPU寄存器的性能要比堆栈的高)翻译成机器码,才能给到设备执行。

2023-08-20 22:38:20 480 1

原创 十进制数负数转为十六进制补码的步骤

3、将0110取反码1001,补齐8位:11111001;4、将反码加一:11111010;3、将二进制取反码,补齐成8位;4、将上面的反码加一得到补码;5、补码就可以转成十六进制;2、将绝对值先转成二进制;2、对应的二进制位110;1、先将负数取绝对值;

2023-03-16 20:04:26 5945 3

原创 Android开发常见的报错问题(持续更新记录)

Android开发常见的报错问题更新

2022-08-14 10:50:17 1493

原创 Android三方依赖冲突及Gradle的exclude使用

介绍了Android查看项目中使用到那些依赖库的几种方案,以及介绍了Android中使用exclude如何处理依赖库存在冲突的问题。当然解除依赖库冲突不止这一种方案,但这种我觉得是比较方便的一种。

2022-08-01 00:09:13 12483

原创 Android性能分析之---启动卡顿优化

Android冷启动性能优化

2022-06-05 12:46:51 1564

原创 Android性能分析之---卡顿分析

一、性能分析---场景 低性能的APP常见的表现有启动/界面切换慢、动画掉帧、卡顿(启动卡,点击按钮卡,进入新页面卡等)、耗电,甚至出现应用无响应、程序崩溃的现象。当我们着手解决这些性能问题时,面对的第一个问题就是需要找到合适的工具来检测这些问题,用肉眼观察来判断定位这类问题是不靠谱的。理想的检测工具要能做到两点:· 一是可以定性的告诉我们应用是否有低性能问题,并且能定位到的点,指出哪个逻辑哪个方法使用系统资源低效,以便我们针对具体的问题给出对应的优化方案;· 二是可以定量说明问题...

2022-06-02 00:55:37 4366

原创 adb的screenrecord录屏功能

一、开始录屏命令:adbshellscreenrecord/sdcard/launch.mp4如果adb加入了环境变量,直接Win+R,输入cmd打开命令终端,输入上面的命令。前提是你要连接好了设备。这时候你就可以操作手机,需要结束的时候就按ctrl+c就行,文件就保存在手机的SD卡的根目录。二、指定视频分辨率大小,带上参数 --sizeadbshellscreenrecord--size1280*720/sdcard/launch.mp4(录制视频,...

2022-05-24 22:57:12 11258

原创 android支持AndroidX的属性配置

一、AndroidXAndroidX 是对 android.support.xxx 包的整理后产物。由于之前的 support 包过于混乱,所以,Google 推出了AndroidX。(v4包、v7包什么的都不用了,直接用androidx代替了)当我们的项目需要支持Google的AndroidX的时候,一般需要配置两个属性:android.useAndroidX=true 表示“Android插件会启用对应的AndroidX库,而非Support库”;未设置时默认为false;android.

2022-05-22 14:30:30 2665

原创 Android aidl一个service同时绑定多个客户端client

一、场景最近开发过程中,遇到了这样的场景,aidl在service和client通信的过程中,一个service需要同时绑定多个client进行通信。一开始我的想法是:这种写法绑定多个客户端是有问题的,绑定了一个没有解绑的话,其他client是不会走这个onBind方法。因为这是Android四大组件之一的Service的机制决定的。一个service经过bindService之后,再次去bindService,是不会再走onBind回调的。二、解决办法(一个Service返回多种B

2022-05-20 00:17:13 2923 4

原创 Android aidl双app进程通信详细讲解

一、场景公司项目里用了很多的独立进程的服务与其他进程之间存在了很多跨进程的通信。之前有很长一段时间没有实际去做跨进程通信 AIDL了,查阅了一些资料和文章看了些 Demo 把温习的心路历程介绍一下。工具Android studio小米手机Android11(api 30)模拟器手机Android8 (api 26)为什么要准备两个手机,因为这里Android高版本的aidl使用有点坑的地方,需要做兼容处理,后面会讲到原因。二、创建aidl的服务端 AIDL...

2022-05-06 23:46:21 3083 6

原创 Kotlin的构造函数Constructor

一、构造函数kotlin里面的构造函数分为主构造函数和次构造函数。主构造函数只能有一个,次构造函数个数不限制,可以有一个或者多个。1.主构造函数//一般的主构造写法class Student constructor(){ }//当主构造方法没有任何注解或者可见性修饰符时,可以省略(),写成下面这样class Student { }//主构造方法如下,跟在类名后面,有参数class Student constructor(name:String)...

2022-05-06 00:04:05 6364

原创 android使用AS新建项目时 use legacy android.support libraries

一、使用Android Studio新建项目提示是否勾选use legacy android.support librariesuse legacy android.support libraries(勾选了这个框,就表示你要使用遗弃的support库)using legacy android support libraries, will prevent you from using the latest Play Services and jetpack libraries.(使用遗留的an

2022-05-05 22:48:50 3720 2

原创 Android SDK升级到32.0.0遇到:Installed Build Tools revision 32.0.0 is corrupted

一、2022.5.5使用Android studio新建项目,app下的build.gradle使用的sdk是32版本android { compileSdkVersion 32 buildToolsVersion "32.0.0" defaultConfig { applicationId "com.example.aidlclient" minSdkVersion 19 targetSdkVersion 32

2022-05-05 22:46:39 2470 1

原创 Android使用NanoHttpd在app内搭建https server(二)

HTTPS的基本工作原理想必对于许多开发者来说是非常熟悉的了,我们一起先回忆一下HTTP常见的八股文中的描述:客户端(浏览器)访问 HTTPS 的URL;服务器返回 HTTPS 使用的 CA 证书;客户端(浏览器)验证 CA 证书是否为合法证书;验证通过,证书合法,生成一串随机数并使用公钥(证书中提供的)进行加密;发送公钥加密后的随机数给服务器;服务器拿到密文,通过私钥进行解密,获取到随机数(公钥加密,私钥解密,反之也可以);服务器把要发送给浏览器的内容,使用随机数进行加密后传输给客户端(浏

2022-04-24 15:38:55 4073

原创 Android使用NanoHttpd在app内搭建http server(一)

一、场景:想没想过在自己的Android的 app里内嵌一个http server服务端,这样咱们就可以从PC和手机上的浏览器遥控app了。接下来就使用一个GitHub的开源库Nanohttpd在app内搭建一个小型http的server。开源库地址:GitHub - NanoHttpd/nanohttpd: Tiny, easily embeddable HTTP server in Java.二、简单集成使用引入依赖库:implementation 'org.nanohttpd:nanoh

2022-04-20 23:58:01 10228 1

原创 git命令创建分支|合并分支|删除分支

一、 创建test分支提交步骤1.列出所有分支:# git branch -a2.创建test分支:# git branch test3.切换到test分支:# git checkout test4.添加add修改:# git add .5.添加commit注释:# git commit -m "第一次提交代码"6.提交到服务器:# git push origin ...

2022-04-06 10:57:47 10218

原创 Android的LeakCanary的原理分析

场景:最新的leakCanary2.8.1:debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8.1'原理:首先就是我们在引入最新的依赖包,什么都不用干了,因为他的初始化在清单文件中注册了contentProvider(),把初始化放到了这里面的onCreate()去初始化了,在初始化的过程中,他会用application监听观察对象activity、fragment等对象的生命周期的变化,当执行销毁的生命周期,他就

2022-02-16 14:27:21 1895 3

原创 Android四大组件之Service之IntentService

一、IntentService的含义异步的,会自动停止的服务。二、IntentService和service的区别 service服务默认是运行在主线程中的,如果直接在服务中处理一些耗时的逻辑,就可能会出现ANR,所以我们一般都在服务的具体方法里开启一个新的线程去处理具体的逻辑,然后,这种类型的服务一旦启动后,就会一直运行,要想停止服务就得调用stopSeft()然后Android专门提供了IntentService来简单的创建异步,自动停止的服务。三、In...

2021-11-12 10:53:17 1717

原创 Android四大组件之Service

一、Service的含义Android四大组件之一:Service是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件;服务是Android中实现程序后台的解决方案,不依赖任何用户界面,即使程序被切换到后台,或者用户打开了另外一个应用程序,服务还能保持运行,服务非常适合那些不需要和用户交互而且还要求长期运行的任务。服务像Activity那样也是默认运行在主线程中,如果有耗时任务还是要在服务内部创建子线程,不然程序会ANR。(默认是耗时操作超...

2021-11-11 16:30:28 3108 1

原创 Android避坑系列之List的subList谨慎使用

一、场景我们知道String类有分割字符串的作用(subString函数),当然在List集合里面也提供了分割集合的作用(subList函数)。但List的这个分割方法有坑啊,如下面代码:1、正常使用:ArrayList<String> arrayList = new ArrayList<>();arrayList.add("a");arrayList.add("b");arrayList.add("c");arrayList.add("d");List&

2021-11-02 15:39:38 1807 1

原创 Android避坑系列之Gson解析JavaBean获取外部类字段出现空指针

一、场景就是我们平常解析后台json字符串的时候,使用GSON类来解析,创建JavaBean的时候不要采用非静态内部类的方式,否则不小心会出现空指针的异常。看例子:public class Boy { public String boyName; public Girl gril; //非静态内部类 public class Girl { public String girlName; public String getBoyN

2021-11-02 14:56:45 480

原创 Android的ProgressBar自定义样式放.9图片

一、需求场景今天看到UI设计有一个炫酷的进度条样式,那必须要做出来的效果,如下:前面的这个LV6就别管了,这是我盖在上面的一个View。二、需求实现实现过程,首先我们使用ProgressBar,使用它的水平样式,并自定义progressDrawable(使用layout-list,progressbar有三层:@android:id/background、@android:id/secondaryProgress、@android:id/progress)第一层是进度条的底部背景(对..

2021-10-09 13:46:13 2126

原创 Android Jetpack架构组件之ViewModel原理篇

上一篇文章讲了viewmodel的简单使用Android Jetpack架构组件之ViewModel使用篇一、ViewModelViewModel是Jetpack AAC的重要组件,同时也有一个同名抽象类。 ViewModel,意为 视图模型,即为界面准备数据的模型。简单理解就是,ViewModel为UI层提供数据。独立的看ViewModel没有什么实际意义,更像是数据容器,结合LiveData使用更容易理解。二、ViewModel的好处1、Activity配置更改重建时(比如屏幕旋

2021-10-01 13:38:24 396

原创 Android Jetpack架构组件之ViewModel使用篇

一、ViewModel的介绍ViewModel 具有生命周期意识,会自动存储和管理 UI 相关的数据,即使设备配置发生变化后数据还会存在,我们就不需要在 onSaveInstanceState 保存数据,在 onCreate 中恢复数据了,使用 ViewModel 这部分工作就不需要我们做了,很好地将视图与逻辑分离开来。ViewModel生命周期相信大家都看过这张ViewModel生命周期图。从 OnCreate 获取到 ViewModel 之后,它会一直存在,直到该 ViewModel..

2021-09-26 11:41:57 506

原创 Android Jetpack架构组件之LiveData原理篇

LiveData的原理:使用了观察者设计模式,但是这个观察者是跟生命周期拥有者(Activity或Fragment)绑定了生命周期的,想要了解LiveData的原理,还要先理解Lifecycle的原理,因为里面表面是LiveData和Observer建立观察者模式,但实际最终还是LifecycleOwner和LifecycleObserver建立的观察者模式。我这里先梳理一个各函数的流程:注册的流程:LiveData(observe)--->LifecycleRegistry(addObs

2021-09-25 23:23:54 293

原创 使用androidx又要使用android.support-v4包遇到的问题

报错如下:Could not determine the dependencies of task ':app:lintVitalRelease'.> Could not resolve all artifacts for configuration ':app:debugCompileClasspath'. > Could not find com.android.support:support-v4:30.0.0. Required by: proje...

2021-08-26 19:39:23 1649

原创 Android的主题Theme遇到的问题:java.lang.IllegalStateException: You need to use a Theme.AppCompat theme

一、场景最近在做BottomSheetDialog这个底部弹框的时候,在设置dialog的style的时候遇到一个问题:style的代码样式:<!--评论弹框dialog的style--><style name="dialog" parent="@android:style/Theme.Holo.Dialog"> <item name="android:windowFrame">@null</item> <ite..

2021-08-18 09:33:23 807

原创 Android Jetpack架构组件之LiveData使用篇

一、LiveData介绍 从字面意思看出,有生命的数据,LiveData 是一个可以被观察的数据持有类,它可以感知 Activity、Fragment 等组件的生命周期。1、它可以做到在组件处于激活状态的时候才会回调相应的方法,从而刷新相应的 UI;2、不用担心发生内存泄漏;3、当 config 导致 activity 重新创建的时候,不需要手动取处理数据的储存和恢复。它已经帮我们封装好了;4、当 Actiivty 不是处于激活状态的时候,如果你想 livedata setVal...

2021-06-25 19:44:42 342 1

原创 Android Jetpack架构组件之Lifecycle原理篇

上一篇文章介绍过了Jetpack的Lifecycle的简单使用,使用起来非常方便,帮我们节省了很多复杂的代码,就能允许其他对象对生命周期的感知。这篇文章从Google源码分析其原理。源码环境:Androidxandroid { compileSdkVersion 30 buildToolsVersion "30.0.2" defaultConfig { applicationId "com.example.testproject" ...

2021-06-23 12:15:10 306 1

原创 Android Jetpack架构组件之LifeCycle使用篇

一、LifeCycle的简单介绍 LifeCycle是Jetpack中的一个组件,它的功能就是能感知生命周期的变化。这么说可能很抽象,就简单理解为LifeCycle就是一个类:LifeCycle.java,我们可以借助这个类的功能来让我们在Android中写的代码,除了Activity或Fragment这两个类本身有生命周期,其他类都能感知这两个类的生命周期变化,而且使用起来特别方便,底层都由Google封装好了。当然你会说,我们自己也可以实现这个功能呀,用接口回调或者一些第三方消息通知框...

2021-06-22 17:43:53 1102

原创 Android Studio升级4.2.1遇到的问题及Gradle的升级配置

一、场景由于工作需要,把AS的版本从现在的4.0.1版本升级到4.2.1版本,为了把项目迁移到AndroidX的各种依赖库上去,在升级AS的时候直接在菜单栏--->Help中check for updates,后面就直接升级了。二、升级AS4.2.1遇到的问题升级之后编译同步项目,最好先在菜单栏--->Build--->Clear Project一下,有时候可以避开很多莫名其妙的问题。下面列出我这次遇到的问题:1、Could not initialize cla.

2021-06-10 15:10:16 4668 2

原创 NDK之C与C++开发工具准备工作(CLion+Visual Studio2013)

一、开发工具的选择选择CLion左右开发工具。选择VS Code2013作为CLion的ToolChains(也可以选择winGW);虽然目前也不知道这个Toolchains是什么?二、安装工具1、我是先安装vscode 2013,进入最上面的这个文件夹,找到可执行文件vs_ultimate.exe,双击执行安装就行。安装的时候遇到如下的问题:(我电脑没装 IE 10)解决办法:https://jingyan.baidu.com/article/ff42efa92f79c.

2021-05-22 14:19:47 740 5

Android的ViewPager的三种用法Demo

Demo中有三个功能:1.简单手滑图片ViewPager+底部小圆点导航;2.简单手滑图片可缩放ViewPager+底部小圆点导航;3.简单图片自动轮播ViewPager+底部小圆点导航

2018-01-20

三种方式自定义SeekBar样式

三种不同的方式自定义SeekBar样式,其中的资源文件根据自己的开发软件可以修改的,如as中用的mipmap较多,eclipse中用的drawable较多。

2018-01-08

智能家居的RGB调光调色圆形自定义View

做智能家居项目的时候,要自己根据手触摸RGB圆盘的颜色地方,使灯光变成相应的颜色。

2017-12-28

butterknife的jar包和使用方法

有时候会遇到Android studio加载不了依赖库的时候,可以下载jar包,导入jar包的形式。或者eclipse中要用到butterknife。

2017-12-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除