日常爬坑-指纹解锁Invalid argument

最近我的个人应用KeepassA在bugly上收到了一个行奇怪的问题,在androidQ上出现了keyStore参数异常的问题。

异常日志

java.lang.RuntimeException:java.lang.reflect.InvocationTargetException
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
......
Caused by:
android.security.KeyStoreException:Invalid argument
android.security.KeyStore.getKeyStoreException(KeyStore.java:1303)
android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.doFinal(KeyStoreCryptoOperationChunkedStreamer.java:224)
android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:506)
javax.crypto.Cipher.doFinal(Cipher.java:2055)
阅读更多

日常爬坑-Fragment传参失败

最近我的个人应用KeepassA在bugly上看到一个很奇怪的问题,activity在给fragment传参时,使用了赋值的方式,如下:

val f = FragmentA()
f.b = "sss"

某些情况下,b的属性死活拿不到,导致程序出现空指针异常。

阅读更多

日常爬坑-android uri 生命周期问题

最近在写我的个人应用KeepassA时,遇到了android文件uri生命周期的问题,被文件真实路径的获取搞得有点懵逼。从android p开始,谷歌对文件访问的权限限制的更加变态了,如果想兼容大多数机型,使用谷歌提供的ASF框架是一个很好的选择。

但是该框架只能返回文件的uri,并不能返回文件路径,并且随着android的进一步升级,特别是从android Q 开始,已经完全无法从uri获取到文件真实路径了!!

阅读更多

Clang编译FFmpeg常见问题

最近闲来无事,就开始研究下和ffmpeg相关都知识,看了网上关于ndk编译ffmpeg的教程,基本上都是使用gcc来编译,而ndk从r18b开始就正式移除gcc来,因此很有必要研究下clang编译ffmpeg,在此过程中遇到了不少奇怪的问题。

系统:macos
ffmpeg版本:4.1.3
ndk版本:r19c
编译器:clang

阅读更多

android jni 动态注册

最近在研究ffmpeg这个视频库,需要使用到jni的接口,官网看了一遍jni函数注册的方法,感觉特别繁琐,每当新增一个native方法时都要手动编写一个对应的cpp函数,并且cpp函数还要有命名约束,实在不方便。
并且静态注册还有以下弊端:

  • 后期类名、文件名改动,头文件所有函数将失效,需要手动改,超级麻烦易出错
  • 代码编写不方便,由于 JNI 层函数的名字必须遵循特定的格式,且名字特别长;
  • 会导致程序员的工作量很大,因为必须为所有声明了 native 函数的 java 类编写 JNI 头文件;
  • 程序运行效率低,因为初次调用 native 函数时需要根据根据函数名在 JNI 层中搜索对应的本地函数,然后建立对应关系,这个过程比较耗时。
阅读更多

Android shape 画虚线

一、画法

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line">
<size android:height="1dp"/>
<stroke
android:width="3px"
android:color="#dedede"
android:dashWidth="10px"
android:dashGap="10px" />
</shape>

二、虚线不显示

这个在layout预览的时候就可以看出,不必运行到手机或者模拟器上。
原因是View的高度不大于 虚线的高度;

<View
android:layout_width="match_parent"
android:layout_height="4dp"
android:layout_gravity="center_vertical"
android:background="@drawable/comment_share_dash_line"
android:layerType="software" />

如果在标签中设置了android:width,则在标签中android:layout_height的值必须大于android:width的值,否则虚线不会显示。如果不设置,默认android:width为0。

三、虚线显示为实线

第一种解决方法:

代码中添加:

line.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

第二种解决方法:

在xml中添加

android:layerType="software"

IJKplayer 爬坑

前段时间接到一个播放视频流的需求,网上找了不少开源框架,最终发现bilibili出的ijkplayer能完美解决我的需求,由于个人是android开发,习惯使用Cywin来编译so库,在使用cywin编译ijkplayer的过程中遇到了不少的问题;于是便有了此文。

阅读更多

VirtualApk爬坑 build篇

最近公司打算重构已有项目,打算把项目插件化处理,网上找了很多资料,发现滴滴公司的VirtualApk符合我们的业务需求。
本文主要讲解构建宿主工程和插件工程中遇到的各种问题。

一、Cannot invoke method getAt() on null object

请至少添加一个宿主工程或其它插件所没有的资源文件,随意一张图片都可以
参考地址

阅读更多

abstractProcessor debug

现在APT技术已经越来越成熟了,说到APT技术肯定离不开AbstractProcessor。但是AbstractProcessor的处理是在编译层实现的,而在开发中我们往往需要debug断点调试代码;本篇文章主要介绍了如何使用AndroidStudio来进行debug调试

一、添加gradle配置

  • 对工程根目录下gradle.properties添加下面两行配置
    org.gradle.daemon=true
    org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
  • 在命令行中运行gradle daemon来启动守护线程。
    gradlew --daemon
阅读更多

Android FTP 多线程断点续传下载\上传

最近在给我的开源下载框架Aria增加FTP断点续传下载和上传功能,在此过程中,爬了FTP的不少坑,终于将功能实现了,在此把一些核心功能点记录下载。

FTP下载原理

FTP单线程断点续传

FTP和传统的HTTP协议有所不同,由于FTP没有所谓的头文件,因此我们不能像HTTP那样通过设置header向服务器指定下载区间。

但是FTP协议提供了一个更好用的命令REST用于从指定位置恢复任务,同时FTP协议也提供了一个命令SIZE用于获取下载的文件大小,有了这两个命令,FTP断点续传也就没有什么问题。

FTP断点续传的原理和HTTP的断点续传原理差不多,在暂停时记录文件的停止位置,再次下载时,先读取记录的位置,如果位置存在,则通过REST命令告诉服务器从指定区间进行下载。

阅读更多

一行代码实现android文件下载

起源

本文主要介绍开源项目Aria的使用。
Aria项目源于15年工作中遇到的一个文件下载管理的需求,当时被下载折磨的痛不欲生,从那时起便萌生了编写一个简单易用,稳当高效的下载框架,aria经历了1.0到3.0的开发,算是越来越接近当初所制定的目标了。

以下为Aria的使用示例,使用Aria开发图片中的所有功能,只需要很短的时间,很少的代码。

阅读更多