美文网首页
Jetpack系列(一、基础)

Jetpack系列(一、基础)

作者: momxmo | 来源:发表于2020-07-25 16:08 被阅读0次

官网文档:https://developer.android.google.cn/jetpack

这里多次一举是为了巩固学习一下;

简介

好处:

  • 提升开发效率:组件可以单独采用,同时利用Kotlin语言功能帮助你提升工作效率;
  • 消除样板代码:Android Jetpack可管理繁琐的Activity(入后台任务、导航、生命周期管理),便于你专注于如何让自己的应用出类拔萃;
  • 构建高质量的强大应用:围绕现代化设计实践构建而成,具有向后兼容性,可以减少崩溃和内存泄漏等问题;

Jetpack组件集合:

  • 基础:Android KTX、 AppCompat、Auto、检测、多dex处理、安全、测试、TV等;
  • 架构:数据绑定、Lifecycles(管理您的Activity Fragment生命周期)、LiveData、Navigation、Paging、Room、ViewModel、WorkManager(管理Andorid后台作业)
  • 行为:Camerax(轻松向应用中添加相机功能)、下载管理器、媒体和播放、通知、权限、偏好设置、共享、切片
  • 界面:动画和过渡、表情符号 、Fragment、布局、调色板

下面我们只会介绍几个我们常用的组件,没有介绍到的可以到官网查看

一、使用Jetpack Security为数据加密

Jetpack Security 是 Google I/O 2019 发布的安全组件库。Security构成简单,主要包含EncryptedFileEncryptedSharedPreferences两个类,分别用来对FileSharedPreferences的读写进行加密解密处理。Security要求min SDK version 23。

记住:加密处理的性能肯定比普通为加密的存在劣势;

image.png
1. EncryptedFile

封装了Google的加密库tink的逻辑,提供FileInputStream和FileOutputStream,可以更安全的进行流的读写。

2.EncryptedSharedPreferences

是SharedPreferences包装类,通过两种方式自动加密键/值:

  • Key加密使用的是确定性的加密算法,使得秘钥可以被加密
  • Value加密使用AES-256 GCM加密,不确定加密
秘钥管理

Security库秘钥管理分为两个部分:

  • 秘钥集合: 包含一个或多个秘钥来加密文件或SharedPreferences数据,存储在SharedPreferences中。
  • 主密钥: 用来加密所有秘钥集合,存储在Android Keystore系统中

使用Android Keystore的包装类MasterKeys只用两行就可以制作Master Key。

val keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC
val masterKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec)

SharedPreferences加密例子:

使用EncryptedSharedPreferences
key和value被加密保存

val keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC
val masterKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec)
 
 
val sharedPreferences = EncryptedSharedPreferences
      .create(
        "Sample",
        masterKeyAlias,
        context,
        EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
        EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
      )
 
 
val editor = sharedPreferences.edit()
editor.putInt("IntSave", 10)
editor.apply()
 
 
val intSaved = sharedPreferences.getInt("IntSave", 1)
Log.d("IntSave", intSaved.toString())

File文件加密例子:

例如向text文件中中写入 ”MY SUPER SECRET INFORMATION“字符串
写入:

val fileToWrite = "my_other_sensitive_data.txt"
val encryptedFile = EncryptedFile.Builder(
    File(context.getFilesDir(), fileToWrite),
    context,
    masterKeyAlias,
    EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build()
 
 
// 写入文件
try {
    val outputStream: FileOutputStream? = encryptedFile.openFileOutput()
    outputStream?.apply {
        write("MY SUPER SECRET INFORMATION"
            .toByteArray(Charset.forName("UTF-8")))
        flush()
        close()
    }
} catch (ex: IOException) {
    // Error occurred opening file for writing.
}

读取:

val fileToRead = "my_sensitive_data.txt"
lateinit var byteStream: ByteArrayOutputStream
val encryptedFile = EncryptedFile.Builder(
    File(context.getFilesDir(), fileToRead),
    context,
    masterKeyAlias,
    EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build()
 
 
try {
    encryptedFile.openFileInput().use { fileInputStream ->
        try {
            val sb = StringBuilder()
            val br = BufferedReader(InputStreamReader(fileInputStream) as Reader?)
            br.readLine()
                .forEach {
                    sb.append(it)
                }
            br.close()
            // 输出 MY SUPER SECRET INFORMATION 
            Log.d("fileContents", sb.toString())
        } catch (ex: Exception) {
            // Error occurred opening raw file for reading.
        } finally {
            fileInputStream.close()
        }
    }
} catch (ex: IOException) {
    // Error occurred opening encrypted file for reading.
}

相关文章

网友评论

      本文标题:Jetpack系列(一、基础)

      本文链接:https://www.haomeiwen.com/subject/svyikktx.html