androidSDK中并没有锁定文件相关的api.

但是android是基于linux操作系统的,linux比较底层,灵活性也更大,为了实现锁定文件的效果,大概有以下几种办法:

  1. 用chmod命令修改文件读写权限
  2. 利用linux中的多线程独占锁,启动一个长期占用文件的后台线程
  3. 使用文件IO流,对文件的前1K字节进行加密,使其不能被识别为文件,或者读不出有意义的数据

这三种方法中最优雅的是第三种方法,下面结合金山文件锁的源码和技术文章等来详解第三种方法.

==================================技术分割线===================================

金山文件锁会在SD卡下生成一个.ksbox文件夹,这个文件夹下会保存加密后的文件.这个文件夹下有一个db.sqlite数据库文件,使用SQLite Database Browser打开后可以看到被加密文件的列表.

接下来去反编译金山的apk,最开始我使用的工具是dex2jar和java decompiler然而并没有看到加密核心代码.之后使用Apk IDE来反编译.

相关的核心代码在com/ijinshan/mPrivacy/c/j.smali文件中,里面是一些类似汇编的代码:

method public final read([BII)I

.locals 7

.parameter

.parameter

.parameter

.prologue

const/4 v6, 0x0

const/16 v5, 0x400

.line 61

iget-object v0, p0, Lcom/ijinshan/mPrivacy/c/j;->a:Ljava/io/FileInputStream;

invoke-virtual {v0, p1, p2, p3}, Ljava/io/FileInputStream;->read([BII)I

move-result v0

.line 63

const/4 v1, -0x1

if-ne v0, v1, :cond_0

.line 103

:goto_0

return v0

.line 70

:cond_0

iget-wide v1, p0, Lcom/ijinshan/mPrivacy/c/j;->f:J

const-wide/16 v3, 0x400

cmp-long v1, v1, v3

if-gtz v1, :cond_5

.line 73

iget-boolean v1, p0, Lcom/ijinshan/mPrivacy/c/j;->e:Z

if-nez v1, :cond_1

.line 75

iget-object v1, p0, Lcom/ijinshan/mPrivacy/c/j;->c:Lcom/ijinshan/mPrivacy/c/g;

iget-object v1, p0, Lcom/ijinshan/mPrivacy/c/j;->b:Ljava/lang/String;

invoke-static {v1}, Lcom/ijinshan/mPrivacy/c/g;->b(Ljava/lang/String;)[B

move-result-object v1

iput-object v1, p0, Lcom/ijinshan/mPrivacy/c/j;->d:[B

.line 76

iget-object v1, p0, Lcom/ijinshan/mPrivacy/c/j;->d:[B

if-eqz v1, :cond_1

.line 77

const/4 v1, 0x1

iput-boolean v1, p0, Lcom/ijinshan/mPrivacy/c/j;->e:Z

.line 80

:cond_1

if-ge v0, p3, :cond_3

move v1, v0

.line 82

:goto_1

add-int v2, p2, v1

if-gt v2, v5, :cond_4

.line 84

iget-object v2, p0, Lcom/ijinshan/mPrivacy/c/j;->d:[B

if-eqz v2, :cond_2

.line 85

iget-object v2, p0, Lcom/ijinshan/mPrivacy/c/j;->d:[B

invoke-static {v2, p2, p1, v6, v1}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V

.line 100

:cond_2

:goto_2

iget-wide v1, p0, Lcom/ijinshan/mPrivacy/c/j;->f:J

int-to-long v3, v0

add-long/2addr v1, v3

iput-wide v1, p0, Lcom/ijinshan/mPrivacy/c/j;->f:J

goto :goto_0

:cond_3

move v1, p3

.line 80

goto :goto_1

.line 89

:cond_4

if-ge p2, v5, :cond_2

.line 91

iget-object v1, p0, Lcom/ijinshan/mPrivacy/c/j;->d:[B

if-eqz v1, :cond_2

.line 92

iget-object v1, p0, Lcom/ijinshan/mPrivacy/c/j;->d:[B

sub-int v2, v5, p2

invoke-static {v1, p2, p1, v6, v2}, Ljava/lang/System;->arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V

goto :goto_2

.line 98

:cond_5

const/4 v1, 0x0

iput-object v1, p0, Lcom/ijinshan/mPrivacy/c/j;->d:[B

goto :goto_2

.end method

还有一些和它相关联的函数,代码比较长就不全贴上来了,参考着文档对其进行分析的大概了解到金山的做法:

首先创建类继承InputStream,使用decodeStream函数得到输入流,重写read()方法,在方法体中对输入流的前1K字节进行解密,后面的字节直接从filename文件中读取.

解密的方法就是读取filename_e文件,每个字节异或0x6b

这样就得到了加密前的文件.

===========================技术分割线================================

这种方法算是所有方法中最优雅的方法了,虽然也有缺点(文件被误删),但是加解密计算小,只计算前1K字节.文件移动代价小,只要改变一下文件指针,就可以移动文件.速度快稳定性高.是业内主流的解决方案!

Android中锁定文件的方法的更多相关文章

  1. Android 中.aar文件生成方法与用法

    https://i.cnblogs.com/EditPosts.aspx?opt=1 无论是用Eclipse还是用Android Studio做android开发,都会接触到jar包,全称应该是:Ja ...

  2. Android中获取文件路径的方法总结及对照

    最近在写文件存贮,Android中获取文件路径的方法比较多,所以自己也很混乱.找了好几篇博客,发现了以下的路径归纳,记录一下,以备不时之需 Environment.getDataDirectory() ...

  3. 【转】Android中JNI的使用方法

    Android中JNI的使用方法 首先看一下Android平台的框架图:(网上盗用) 可以看到Android上层的Application和ApplicationFramework都是使用Java编写, ...

  4. android中解析文件的三种方式

    android中解析文件的三种方式     好久没有动手写点东西了,最近在研究android的相关技术,现在就android中解析文件的三种方式做以下总结.其主要有:SAX(Simple API fo ...

  5. Android多线程编程<一>Android中启动子线程的方法

          我们知道在Android中,要更新UI只能在UI主线程去更新,而不允许在子线程直接去操作UI,但是很多时候,很多耗时的工作都交给子线程去实现,当子线程执行完这些耗时的工作后,我们希望去修改 ...

  6. Android中的文件读写总结

    在Android中,文件主要分为两大类,内部存储和外部存储 内部存储的文件是程序私有的,分为普通文件和Cache文件 外部文件也可以是私有的,也可以是共有的,这要根据文件的目录位置来决定 共有文件可以 ...

  7. 在android中读写文件

    在android中读写文件 android中只有一个盘,正斜杠/代表根目录. 我们常见的SDK的位置为:/mnt/sdcard 两种最常见的数据存储方式: 一.内存 二.本地 1.手机内部存储 2.外 ...

  8. Android中JNI的使用方法(转载)

    Android中JNI的使用方法 首先看一下Android平台的框架图:(网上盗用) 可以看到Android上层的Application和ApplicationFramework都是使用Java编写, ...

  9. android中的提示信息显示方法(toast应用)

    android中的提示信息显示方法(toast应用) (2011-10-17 11:02:06) 转载▼ 标签: android toast 杂谈 分类: Android android中toast的 ...

随机推荐

  1. IntelliJ idea创建Spring MVC的Maven项目

    参考:http://my.oschina.net/gaussik/blog/385697?fromerr=Pie9IlFV 创建Maven Web项目 菜单File->New Project可进 ...

  2. C#实现Levenshtein distance最小编辑距离算法

    Levenshtein distance,中文名为最小编辑距离,其目的是找出两个字符串之间需要改动多少个字符后变成一致.该算法使用了动态规划的算法策略,该问题具备最优子结构,最小编辑距离包含子最小编辑 ...

  3. Android开发之延时执行

    new Handler().postDelayed(new Runnable() { @Override public void run() { //两秒后执行 startMainActivity() ...

  4. websocket初探

    本文尚未完成,在此只写一些句子,以后慢慢整理. 一.参数 IllegalArgumentException No payload parameter present on the method[mes ...

  5. MySQL字符串函数substring:字符串截取

    MySQL 字符串截取函数:left(), right(), substring(), substring_index().还有 mid(), substr().其中,mid(), substr() ...

  6. Mac合并分区

    Mac合并分区 公司Mac电脑之前是win系统,重新安装了mac系统后,多了一个分区.用分区助手打开后,减号是灰色的,上网搜了很多帖子,都是点击减号直接将分区删除等等.减号不能点击的就要重新装系统了. ...

  7. cocos2dx-lua_修改源码流程(cocos2dx-3.10、win7、Cocos Code IDE1.2)

    以下是在cocos2dx-3.10.win7.Cocos Code IDE1.2下假定你已经配置好了cocos2dx的环境.1.修改源代码步骤(1)在Cocos/Cocos2d-x/cocos2d-x ...

  8. Java分页需求

    近期在实现项目接口时,经常需要分页功能.有时返回“String”,有时是“Object”格式的分页List.针对这种情况,本人用java实现对List分页. 第一版 package org.sun.j ...

  9. angularjs $emit $on $broadcast 父子 兄弟之间传值

    父子之间 <div ng-controller="ParentCtrl"> <div ng-controller="ChildCtrl"> ...

  10. oracleXE(oracle学习版)在windows的安装配置

    oracleXE其实安装基本就是一路下一步. 在安装前记得先把tomcat打开,不然oracleXE会占用8080端口且安装过程无法更改端口. 如果需要远程连接此oracle XE的话,要关闭这台电脑 ...