1、把antivirus.db(手机归属地数据库)在assets目录中。
2、在SplashActivity.java(应用启动时显示的动画界面)中把antivirus.db拷贝到应用的files目录下。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//拷贝数据库
copyDB("address.db");
}
/**
* 把assert目录下文件拷贝到本地(/data/data/包名/files)
* @param dbName
* assert目录下的文件名
* @throws IOException
*/
private void copyDB(final String dbName) {
new Thread(){
public void run() {
//判断文件是否存在,如果存在不需要拷贝
File file = new File("/data/data/"+getPackageName() + "/files/" + dbName);
if (file.exists()) {//文件存在
return;
}
// 文件的拷贝
try {
filecopy(dbName);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
}
private void filecopy(String dbName) throws IOException,
FileNotFoundException {
//io流来拷贝
//输入流
AssetManager assets = getAssets();
//读取assert的文件,转换成InputStream
InputStream is = assets.open(dbName);
//输出流
FileOutputStream fos = openFileOutput(dbName, MODE_PRIVATE );
//流的拷贝
//定义缓冲区大小10k
byte[] buffer = new byte[10240];
//读取的长度
int len = is.read(buffer);
int counts = 1;
//循环读取,如果读到文件尾部,返回-1
while (len != -1) {
//把缓冲区的数据写到输出流
fos.write(buffer,0,len);
//每次100k的时候刷新缓冲区的数据到文件中
if (counts % 10 == 0) {
fos.flush();//刷新缓冲区
}
//继续读取
len = is.read(buffer);
counts++;
}
fos.flush();
fos.close();
is.close();
}
3、操作病毒数据库的Dao类实现
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.widget.SlidingDrawer;
/**
* 病毒的业务类
* @author Administrator
*
*/
public class AntiVirusDao {
/**
* @param version
* 传递的服务器的病毒库版本
* @return
* 病毒库版本是否一致,true说明目前本地的病毒库是最新的
*/
public static boolean isNewVirus(int version){
boolean res = false;
SQLiteDatabase database = SQLiteDatabase.openDatabase(
"/data/data/"+getPackageName()+ "/files/antivirus.db", null,
SQLiteDatabase.OPEN_READWRITE);
Cursor cursor = database.rawQuery("select 1 from version where subcnt=?", new String[]{version+""});
if (cursor.moveToNext()) {
res = true;
}
cursor.close();
database.close();
return res;
}
/**
* @param md5 病毒文件的md5
* desc 病毒的描述信息
*
*/
public static void addVirus(String md5,String desc){
//获取数据库
SQLiteDatabase database = SQLiteDatabase.openDatabase(
"/data/data/"+getPackageName()+ "/files/antivirus.db", null,
SQLiteDatabase.OPEN_READWRITE);
ContentValues values = new ContentValues();
values.put("md5", md5);
values.put("type", 6);
values.put("name", "Android.Hack.CarrierIQ.a");
values.put("desc", desc);
database.insert("datable", null, values);
database.close();
}
/**
* @param md5
* 文件的md5值
* @return
* 是否是病毒文件
*/
public static boolean isVirus(String md5){
boolean res = false;
SQLiteDatabase database = SQLiteDatabase.openDatabase(
"/data/data/"+getPackageName()+ "/files/antivirus.db", null,
SQLiteDatabase.OPEN_READWRITE);
Cursor cursor = database.rawQuery("select 1 from datable where md5=?", new String[]{md5});
if (cursor.moveToNext()) {
res = true;
}
cursor.close();
database.close();
return res;
}
}
4、判断应用是否是病毒
//根据应用的apk路径得到apk对应的文件md5(即特征码)
String md5 = Md5Utils.getFileMD5(appBean.getApkPath());
//根据文件md5判断该应用是否是病毒
dao.isVirus(md5)
Md5Utils的源码:http://blog.csdn.net/CSDN_LQR/article/details/51175064
AppBean 的源码:http://blog.csdn.net/csdn_lqr/article/details/51168246