关于Android .so文件
概述
早期的Android只支持ARMv5的CPU,现在支持ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的ABI.
关于ABI支持
很多设备都支持多于一种的ABI,ARM64和x86设备也可以同时运行armeabi-v7a和armeabi的二进制包,但最好是针对特定平台提供相应平台的二进制包,这种情况下运行时就少了一个模拟层,从而得到更好的性能。
容易出错的地方
UnsatisfiedLinkError:找不到java层引用的那个jni函数,
原因可能有:
1.没有调用System.loadLibrary()
2.底层库文件与上层Java jni文件对应的包名或类名不一致
3. 底层库文件与上层Java jni文件对应的函数名称不一致
dlopen: failed:
原因可能有:
c/cpp包名和java文件应该一致
加载不到正确的.so,包括没有或者放错位置.
参考: 安卓开发之so库加载使用的那些坑
兼容性
NDK平台不是后向兼容的,而是前向兼容的。推荐使用app的minSdkVersion对应的编译平台.
注意事项
不要混合使用不同C++运行时编译的.so文件,当存在多个.so文件时,应该让所有的.so文件都动态链接相同的C++运行时
不同架构的.so文件
编译我们的.so文件使其支持缺失的ABIs,或者设置ndk.abiFilters
与.so有关的一个常年大坑
为了减小 apk 体积,只保留 armeabi 和 armeabi-v7a 两个文件夹,并保证这两个文件夹中 .so 数量一致
对只提供 armeabi 版本的第三方 .so,原样复制一份到 armeabi-v7a 文件夹
Android Https
概述
HTTPS相当于HTTP的安全版本,它在HTTP的之下加入了SSL (Secure Socket Layer),SSL位于TCP/IP和HTTP协议之间
SSL的作用
- 通过证书,认证用户和服务器.
- 加密数据
- 维护数据的完整性
第一次握手步骤
- 浏览器将自己支持的一套加密算法、HASH算法发送给网站
- 网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器
- 浏览器获得网站证书之后,开始验证证书的合法性,有效则取出证书公钥,加密数据发送到网站
- 网站接收浏览器发来的数据之后,解密并且HASH校验,完成握手.
这里需要拿到包含公钥的证书(网站下载)
SSL设置步骤
- 构造CertificateFactory对象,通过它的generateCertificate(is)方法得到Certificate
- 将Certificate放入到keyStore中
- 利用keyStore初始化TrustManagerFactory
- 利用TrustManagerFactory初始化SSLContext
- mOkHttpClient.setSslSocketFactory(sslContext.getSocketFactory())
tomcat下部署Https
- 使用keytool生成证书xxx.jks,利用xxx.jks生成xxx.cer
- tomcat/conf/sever.xml 下的 keystoreFile=”xxx.jks”
- 按上面的步骤设置证书,访问相应路径
双向验证
需要再生成一对jks和cer,服务端需要一个cer,客户端需要jks
- 生成jks与cer
- 将cer导入一个新的jks,配置到tomcat,此时浏览器已不能访问网站
- 客户端重新load一个keystore,通过keystore初始化KeyManagerFactory,进而初始化sslContext
- mOkHttpClient.setSslSocketFactory(sslContext.getSocketFactory())
这里需要注意的是Android平台只支持BKS形式的证书,需要将jks转化为bks
//秘钥管理工厂,信任管理工厂,随机序列(Android 4.4之前存在安全漏洞)
sslContext.init(keyFactory.getKeyManagers(), tFactory.getTrustManagers(), new SecureRandom());
参考资料:
关于Android的.so文件你所需要知道的
与 .so 有关的一个长年大坑
Android Https相关完全解析 当OkHttp遇到Https