![](https://img-blog.csdnimg.cn/61cdb1f1d3024a4ea8f0a90e98ec20f0.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Android
文章平均质量分 67
分享android开发过程中的知识
WongKyunban
这个作者很懒,什么都没留下…
展开
-
apk签名后在apk文件里的META-INF文件
将apk的后缀改名为.zip再解压,我们会看到产生了如下文件,存放在META-INF这个文件夹中:这些签名后产生的文件有什么用呢?原创 2024-01-08 13:35:35 · 1154 阅读 · 1 评论 -
android apk文件的签名问题
android的APK文件实际上是一个jar文件。jar的意思是瓶、罐,那就意味着jar文件是一个用来存放android应用相关文件的容器。事实上,它也确实如此,它只是一个带或不带压缩的zip文件,当你把.apk后缀改成.zip后,就能对此进行解压了。用java写的不同类型应用都会使用jar来存储它们的文件。jar有一些特殊的结构。原创 2024-01-06 18:01:41 · 969 阅读 · 0 评论 -
什么是.jks(.keystore)文件
jks 文件就是Java KeyStore (JKS)文件。它的用于存储加密密钥和证书。这个jks可以用在SSL加密,Android应用签名,Java应用等上面。其实,我们还见过.keystore文件,它和.jks文件是一样的。.jks 文件是.keystore 文件的其中一种。区别在于 .jks 文件是Java应用的默认keystore。既然.jks文件存储了加密密钥和证书,那么具体有哪些呢?因为它存储了这么多敏感的信息,所以一定要保护好这个文件。从输出的信息中,我们可知有等等。还可以通过。原创 2024-01-06 14:29:48 · 3119 阅读 · 0 评论 -
关于@hide的理解
android.jar作为编译android本身的一部分被创建。Android framework的类会被分析,并创建它们的副本。从下面我们可以看到HandlerThread.class确实没有了getThreadHandler方法。如果我们的android项目的build.gradle配置了。会控制我们编译时用到的这个android.jar包里的东西。就会加入我们编译时的类路径中,参与app的编译。,那么在我们编译我们android应用时,原创 2023-02-11 17:20:53 · 1458 阅读 · 0 评论 -
学习HandlerThread
HandlerThread是一个扩展了Thread的类。也就意味着它和普通的Thread类的调用没有什么区别,仍然要调用。虽然HandlerThread类里有getThreadHandler()方法得到Handler,我们知道HandlerThread提供了一种便利给在线程中创建Looper来处理我们的任务。如上图所示,扩展后的HandlerThread类有一个Looper和Handler。就是启动了一个线程,这个线程首先就创建了一个Looper。这样的我们的任务就可以放到其他的线程去执行了。原创 2023-02-11 01:17:44 · 1022 阅读 · 0 评论 -
关于Handler我们应该知道的知识
Handler可以帮助我们在特定的线程执行任务。我们也可以用Handler计划一个任务在未来某个时间点执行。Handler会将我们给它的任务在特定的线程里进行排队执行。如果我们想在某个线程做些什么任务,我们可以指定Handler的Looper,然后Handler就会将这个任务添加到Looper对应的消息队列(message queue)。原创 2023-02-10 01:52:32 · 986 阅读 · 0 评论 -
Kotlin Java多线程编程安全
在多线程编程里,放多线程会交叉访问共享的对象,如果我们不做些同步的工作,那些结果可能不是我们想要的。上面的例子是多个线程去操作sum这个共享变量,每个线程都是让这个sum变加1,那么期待的结果应该是101,但是上面的程序可能不会让你得到101,结果可能是100,99,98等这些错误的结果。再比如下面这个协程的例子shareSum我创建一个有8个线程的协程执行上下文,然后在此执行上下文中创建一个100个协程,每个协程对shareSum进行加1操作。结果是有时正确,有时不正确。原创 2023-02-09 01:34:08 · 1262 阅读 · 0 评论 -
使用Kotlin Flow做HTTP轮询(三)
它会给我们提供SendChannel对象,我们用它在我们的block里发送生产出来的数据。因为channelFlow产生的是一个冷流,所以它的启动,也只有在collect末端操作符作用上来时,才会启动。channelFlow是线程安全的,不用担心它会因并发而产生不好的结果。我们block里的代码,一执行完,channelFlow产生的Flow对象也就结束了。因为它是冷流的原因,为了让它保持工作,上面我用了while循环让它一直工作。如果想结束它,可以拿到它的协程上下文进行取消操作,如上面的close方法。原创 2023-02-08 00:13:55 · 1367 阅读 · 0 评论 -
如何在android开发中使用Kotlin Flow(二)
在android开发中,我们可以用flow来为Fragment和Activity采集数据,然后显示出来。当Fragment和Activity不可见时,就应该停止采集。在ViewModel的实践中,LiveData是典型的代表。这些组件都能够感知Fragment和Activity的生命周期的变化。Flow也可以做到这一点。使用Flow来实现MVVM是相当方便,我们大概来描述一下:这是我们的数据流。原创 2023-02-07 22:56:39 · 1170 阅读 · 0 评论 -
如何在android开发中使用Kotlin Flow(一)
Kotlin 的Flow可以对数据流进行建模,类似LiveData、RxJava的数据流。Flow也是用观察者模式实现的。观察者模式包括了可观察对象(Observable,生产者、发射者、源这些称呼都是指可观察对象,可以被观察)、观察对象(Observers,订阅者、收集者、接收者这些称呼都是指观察对象,可以观察Observable)。当有什么状态(数据)变化时,Observable会自动通知Observers。Observable(可观察者)可以是hot(热)或者是cold(冷)的。原创 2023-01-30 00:07:31 · 760 阅读 · 0 评论 -
什么是Weex
Weex是一个致力于使用现代web开发技术创建高性跨平台的移动应用的框架。在实践中,我们可以使用JavaScript和一些前端框架来开发移动应用。前端框架是Weex的语法层。目前,Vue.js和Rax两个前端框架在Weex开发中被广泛使用。Vue.js和Rax都已集成到Weex SDK中。Weex从不限制、绑定特定的前端框架。我们也可以在Weex中集成我们喜欢的前端框架,但并不容易。这也是Wee...原创 2019-12-11 19:56:24 · 4251 阅读 · 0 评论 -
在Ubuntu 18.04安装GNU Emacs 26
Emacs是一个文本编辑器,据说高手们都用它。在Linux上有两个“历史悠久”的文本编辑:EMACS 和 vim/vi。今天我们来看看如何安装EMACS:1.添加ppa仓库:~$ sudo add-apt-repository ppa:kelleyk/emacs2.更新apt~$ sudo apt update3.通过Synaptic软件包管理器安装Emacs26,或者在终端中运行以...原创 2019-09-28 10:49:01 · 3974 阅读 · 1 评论 -
EMACS文本编辑器的使用
开始快捷键的学习:** Ctrl-v**:看下一屏Alt-v:看上一屏Ctrl-l:移动光标周围的内容,显示在屏幕中间、顶部、底部。光标的移动Ctrl-p:将光标向上移动Ctrl-b:将光标向左移动,逐位移动Ctrl-f:将光标向右移动,逐位移动Ctrl-n:将光标向下移动Alt-b:将光标向左移动,逐单词移动Alt-f:将光标向右移动,逐单词移动Ctrl-a:将光标移动到行...原创 2019-09-29 00:54:01 · 2501 阅读 · 0 评论 -
Emacs可以做什么
GDB调试工具打开方式: Alt-x gdb玩俄罗斯方块 Alt-x tetris文件对比Alt-x ediff文件管理Alt-x dired阅读内置文档Alt-x info查看帮助属性列表Ctrl-h Ctrl-h直接在文件管理器中修改文件打开文件管理器Alt-x dired打开编辑Ctrl-x Ctrl-q保存 Ctrl-x Ctrl-s打开...原创 2019-09-29 23:53:41 · 2179 阅读 · 0 评论 -
带你了解Hook技术
什么是Hook在Android系统中,普通用户程序的进程空间都是独立的,彼此间都不受干扰。这就使得通过一个程序来直接改变其他程序的某些行为的想法行不通。Hook的出现恰恰可以解决这种问题。Hook 翻译过来就是“钩子”的意思,它可以在事件传送的过程中截获并监控事件的传输,将自身的代码与系统方法进行融合。这样一来,当这些方法被调用时,也可以执行我们自己的代码,这也是面向切面编程的思想(AOP)...原创 2019-04-11 18:55:40 · 3215 阅读 · 0 评论 -
使用MobSF进行Android应用安全测试
一、先决条件:安装好的docker二、使用过程步骤1:下载镜像$ docker pull opensecurity/mobile-security-framework-mobsf步骤2:启动容器$ docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest步骤3:访问服务http:...原创 2019-10-24 10:53:13 · 2315 阅读 · 0 评论 -
Https工作原理&TLS握手机制
Https工作原理&TLS握手机制@Kyunban WongHTTPS是在HTTP的基础上提供了数据加密的支持,保存了数据的私密性、完整性,并且可以用来认证客户端和服务端的身份。在普通的HTTP中,数据是明文传输的,很容易出现中间人伪装数据,面对客户端伪装成服务端,面对服务端伪装成客户端,进行窃取数据。在HTTPS中则使用了**非对称公钥机制,**对数据进行了加密,又能验证对方身份,基本避免中间人攻击。HTTPS的加密是通过TLS(Transport Layer Security)安全传输层原创 2020-12-10 00:44:34 · 1778 阅读 · 0 评论 -
Ubuntu安装apktool安装
1.下载Linux包装器脚本脚本地址将脚本保存起来,命名为apktool。2.下载apktool_x.x.x.jarapktool.jar下载将下载的apktool_x.x.x.jar文件重命名为apktool.jar3.将apktool.jar & apktool移动到 /usr/local/bin$ sudo mv apktool /usr/local/bin$ sudo mv apktool.jar /usr/local/bin4.授予apktool.jar &原创 2020-09-20 20:49:52 · 3862 阅读 · 1 评论 -
JSON
概述JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它十分方便人们阅读和编写。它也十分适合机器解析和生成。它是基于JavaScript编程语言标准ECMA-262第三版(1999年12月)的子集。JSON是完全独立于语言的纯文本格式。对于熟悉C家族语言(C, C++, C#, Java, JavaScript, Perl, Python等等)的程序...原创 2019-12-11 15:12:10 · 1786 阅读 · 0 评论 -
android开发的Matrix的mapPoints方法是如何计算的呢?
在android的自定义View中,使用Matrix来转换坐标非常方便,其中有一个方法叫mapPoints,它的计算方式是怎么样的呢?首先来看看Matrix矩阵长得什么样?它是一个3x3的矩阵。在编程里,它对应一个长度为9的float[]数组,通过以下变量准确取到数组中相应的值。现在再来看看,每一位的含意:好了,我们现在来看一下,mapPoints的计算过程:那么mapPoints的计算方式就如上所示了。...原创 2022-07-03 18:49:35 · 1504 阅读 · 0 评论 -
使用Kotlin实现电子签名
Kotlin Demo使用Kotlin实现了电子签名,用Kotlin写Android应用真是舒服。我自定义了一个SignatureView:package com.wong.testpimport android.annotation.SuppressLintimport android.content.Contextimport android.graphics.*import android.util.AttributeSetimport android.util.Base64imp原创 2020-11-29 20:41:33 · 1960 阅读 · 0 评论 -
在自定义View用StaticLayout让文字换行
代码的实现其实很简单,就是让StaticLayout去解释文字中的换行符"\n"。核心就以下这两句:效果如下:原创 2022-07-04 23:56:00 · 950 阅读 · 0 评论 -
什么是Base64?
Base64编码是用于将二进制转换成对应的文本的技术。本章节就来了解它的编码规则。参考RFC-4648Base64编码表:Base64编码表用了64个字符:A-Z、a-z、0-9、+ 、/,刚好是2的6次方,这也是Base64的由来,Base64每个字符用6个比特位来表示。最后还有一个=用作特殊用途,稍后会介绍,所以Base64编码表共有65个字符。...原创 2022-08-13 10:49:29 · 12679 阅读 · 0 评论 -
Android Studio如何做混淆
概述ProGuard是一个Java类文件压缩器、优化器、混淆器、预校验器:压缩阶段会检测和移除未使用的类、字段、方法、属性。ProGuard以递归的方式检查并决定哪些类和类成员是被用到的,而其他没有用到的类和类成员就会被丢弃。优化阶段会分析并优化方法的字节码。ProGuard会进一步优化代码。其他优化包括不是入口点的类或方法可能会变成private、final、static,而没有使用的参...原创 2019-10-18 17:36:04 · 3449 阅读 · 0 评论 -
okhttp经常出现IOException,怎么办?
android应用退了后台,再回到前台调用网络请求时,OKHTTP就会报IOException异常。结果答案就在https://github.com/square/okhttp/issues/2738只要加上就可以成功阻止此异常。它就是在失败时,再偿试一下。为什么在失败时,再偿试会好过去检查服务器的状态呢?首先,目前没有什么好办法去检查服务是否断开了,其次,在失败时就再试一次也没有多复杂,还很有效。所以这样做,不是挺好的吗?...原创 2022-06-27 23:36:30 · 1598 阅读 · 0 评论 -
@BindsInstance在Dagger2中怎么使用
的使用是为了移除Module模块的有参构造函数。比如我们现在有一个依赖是Context,那么如何提供它呢?一种方法是通过一个module类的构造函数注入,并由module提供Context给其他module类使用:使用@BindsInstance使用@BindsInstance的目的就是不再通过一个module类的构造函数来注入依赖,直接在component初始化时提供,如:首先移除module类的构造函数:在Component里流入依赖:参考例子:https://github.com/w原创 2022-06-30 13:17:42 · 897 阅读 · 0 评论 -
RxJava 重复订阅引发的数据重复问题
分析:因为connect()被调用了三次,就是说MyObservable对象中的publishSubjectObservable被订阅了三次,因此会打印了三次。那么我们如果想让一个MyObservable实例中的publishSubjectObservable只被订阅一次,可以怎么办呢?其实标题说重复订阅引发的数据重复问题,严格上来说,它并不是问题,因为订阅了就会收到消息。也就是每次订阅前,都把前一个订阅取消掉。原创 2022-11-12 12:36:52 · 1156 阅读 · 0 评论 -
Android 模块化开发
概述单独开发每个模块,用集成的方式把他们组合起来,拼出一个app。如通用的模块,自动更新的模块,反馈模块,推送模块都可以单独以模块来开发,最后进行集成。我们可以通过一个壳来包含很多个模块。好处可以单独升级模块。耦合度低。同时,也很好地解决了“牵一发而动全身”的问题。方便分工。与其他团队合作时,如外包的团队,可以很好的地将核心代码与外包部分隔离开,不用和他们分享核心代码,让他们去做独立的功能,...原创 2020-01-03 15:00:15 · 3545 阅读 · 3 评论 -
Ubuntu20.04搭建flutter开发环境
根据我的实践分享flutter开发环境的搭建过程。假设你已经搭建好Android的开发环境了。1.下载Flutter SDK大家可以在github(https://github.com/flutter/flutter)上下载Flutter release版本。也可以直接下载SDK的源码,我这里就是直接将它的主分支源码源库拉下来:~$ git clone https://github.com/flutter/flutter.git2.Android Studio安装插件File>Settin原创 2020-08-10 22:20:38 · 3691 阅读 · 0 评论 -
okhttp经常出现SocketTimeoutException
最近开发时android时,发现一个bug,退后台的app,再回前台时,在onResume中调用api经常出现java.net.SocketTimeoutException。当时的网络环境是可以的:有网络,服务器也正常。于是在网上找了一下,终于在这篇文章里找到了答案:https://github.com/square/okhttp/issues/3146和https://stackoverflow.com/questions/39219094/sockettimeoutexception-in-retrof原创 2022-06-25 10:43:03 · 3380 阅读 · 1 评论 -
Android Intent Flags
Flags defined in the intent class that function as metadata for the intent. The flag may instruct the system how to launch an activity and how to treat it after it’s launched.e.g:intent.setFlag(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);This flag would tel原创 2021-04-06 14:57:05 · 1141 阅读 · 0 评论 -
在OKHttpClient的拦载器里遇到java.lang.IllegalStateException异常
OKHttp拦载器异常java.lang.IllegalStateException: closed原创 2022-06-25 00:01:28 · 1373 阅读 · 1 评论 -
What should you do first, when android studio cannot run project
If android studio cannot run project, in most cases,it is the gradle question. Because it cannot build the project successfully for you. So we should fix our gradle first. Here are some tips:1.Check if the gradle is OK for you.you can click the gradle原创 2021-03-06 12:11:20 · 1291 阅读 · 0 评论 -
Android RecyclerView GridLayoutManager 布局中每个Item组都带一个标题
Demo今天写了个demo,是关于意见反馈的页面的,当中使用到了RecyclerView和GridLayoutManager:demo效果图:详细情况,请大家下载demo查看。这里我想特别分享两点:1、如何实现每行列数不一样或多列的视图。2、如何实现网络布局中item之间的间距是均等的。如何实现把网格布局差异化显示要求 RecyclerView GridLayoutManager ...原创 2020-01-15 16:42:25 · 3772 阅读 · 2 评论 -
What‘s the difference between marginLeft and marginStart in Android
We have known that marginStart refers to the distance between the control and the view portion at the beginning adn marginLeft refers to the distance between the control and the left portion of the view.MarginEnd and MarginRight are the same.In general,th原创 2021-03-20 11:35:41 · 1183 阅读 · 0 评论 -
android复制粘贴功能
复制功能 //复制 private void copy(String data) { // 获取系统剪贴板 ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); // 创建一个剪贴数据集,包含一个普通文本...原创 2019-04-11 11:02:18 · 7835 阅读 · 2 评论 -
Android Dropdown List with Spinner
DemoIf you want implement a simple drop down list. Here you go.Spinner is used to select one value from a set of values in Android. Android Spinner is associated with AdapterView, so that we need to set a adapter class with the Spinner.Let’s code!It co原创 2021-04-06 15:07:26 · 1262 阅读 · 0 评论 -
com.android.support版本号冲突的解决办法
解决方案错误信息:All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes当我们在android studio使用api或compile添加一些第三方的依赖库时,就有可能出现上述的错误。出错原因:c...原创 2019-12-12 11:18:08 · 2049 阅读 · 0 评论 -
Android Fragment Lifecycle
According to official doc, Fragment is used to build dynamic User Interfaces. I have heard that some apps just have an Activity with many fragments. That’s crazy! But that is possible.Fragment should be used within an activity.Actually, Fragments have the原创 2021-04-06 21:37:19 · 1394 阅读 · 0 评论 -
Android Intnent Types
There are two types of Intent. Android Intent is a useful component in Android application. It is a data structure containing a description of a to-be-performed operation.You can send asynchronously messages to other activities, services. It is always han原创 2021-04-04 16:59:24 · 1226 阅读 · 0 评论