手机杀毒的原理
一、得到安装和未安装包的程序签名,将改签名进行计算Md5值
String plainText = pm.getPackageInfo(info.packageName,
PackageManager.GET_SIGNATURES).signatures[0]
.toCharsString();
二、将得到的MD5值,做为条件对病毒库进行查询,如果count(*)大于零,说明其为病毒。
public static boolean isVirus(String md5) {
SQLiteDatabase database = SQLiteDatabase.openDatabase(DB_PATH, null,
SQLiteDatabase.OPEN_READONLY);
Cursor c = database.rawQuery(
"SELECT count(*) FROM datable d WHERE d.md5 = ?",
new String[] { md5 });
if (c.moveToNext()) {
int result = c.getInt(0);
c.close();
database.close();
return result > 0;
}
return true;
}
三、旋转动画(RotateAnimation)的使用与清除
a) 使用
RotateAnimation rotAnim = new RotateAnimation(0f, 360f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
// 播放一次的周长1.0秒
rotAnim.setDuration(1600);
// 是否之播放一次 明确指定次数(>=0)或者-1等价于INFINITE无限次
rotAnim.setRepeatCount(RotateAnimation.INFINITE);
/**
* 重复模式 Parameters: repeatMode RESTART or REVERSE
*/
rotAnim.setRepeatMode(RotateAnimation.RESTART);
iv_act_scanning.startAnimation(rotAnim);
b) 清除动画效果
iv_act_scanning.clearAnimation();
四、卸载一个应用程序
Intent intent = new Intent(Intent.ACTION_DELETE);
intent.setData(Uri.parse("package:" + info.getPackageName()));
startActivity(intent);
五、横竖屏切换不重新开始生命周期的两种方式
a) 禁用横竖屏切换
android:screenOrientation="portrait"
b) 设置Activity不关心对齐方式、屏幕大小、键盘改变(推荐)
android:configChanges="orientation|screenSize|keyboardHidden"
六、常见的应用文件目录的含义
a) /data/data/com.example.phoneguard/databases/数据库文件目录
b) /data/data/com.example.phoneguard/shared_prefs/SharedPreferences文件目录
c) /data/data/com.example.phoneguard/files应用文件目录
d) /data/data/com.example.phoneguard/caches/应用缓存文件夹
Fragment的使用
一、为了保证兼容性需要继承V4包中Fragment
a) 主界面代码
package com.example.fragmentdemo;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class MainActivity extends FragmentActivity implements OnClickListener {
private TextView tv1;
private TextView tv2;
private TextView tv3;
private FragmentManager fm;
private FragmentTransaction ft;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1 = (TextView) findViewById(R.id.tv1);
tv2 = (TextView) findViewById(R.id.tv2);
tv3 = (TextView) findViewById(R.id.tv3);
fm = this.getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.ll_fragment, new Fragmemt1());
ft.commit();
tv1.setOnClickListener(this);
tv2.setOnClickListener(this);
tv3.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tv1:
ft = fm.beginTransaction();
ft.replace(R.id.ll_fragment, new Fragmemt1());
ft.commit();
break;
case R.id.tv2:
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.ll_fragment, new Fragmemt2());
ft.commit();
break;
case R.id.tv3:
ft = fm.beginTransaction();
ft.replace(R.id.ll_fragment, new Fragmemt3());
ft.commit();
break;
}
}
}
二、Fragment1的代码
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class Fragmemt1 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment1, null);
}
}
三、Fragment2的代码
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class Fragmemt2 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment2, null);
}
}
四、Fragment3的代码
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class Fragmemt3 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment3, null);
}
}
应用程序混淆保护代码
i. 将sdk/tools/proguard/proguard-android.txt拷到项目根目录并将项目根目录project.properties的倒数第二行代码取消注释
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
proguard.config=proguard-android.txt
# Project target.
target=android-19
Activity防黑客保护
i. 私有的Activity很容易被黑客调用,不写
Intent-filter(私有化)
ii. 为意图过滤器加入权限,权限必须首先在清单文件中声明
服务的注意事项
i. 服务是后台运行组件,可以看成没有界面的Activity。默认运行在主线程的(这就解释了为什么服务存在,程序就不会销毁),同样耗时的操作也不能放在其方法中只能放在子线程中。
ii. 安卓中一个进程的默认使用存储为15MB,也就意味着几个个消耗资源的服务不应该允许再使用同一个进程。可以制定 Process=“:service1”l来为其指定新的进程。同样四大组件都可以使用该配置开辟新的进程
安卓的权限模型
i. uid是程序安卓系统时生成的。OS通过uid生成和判断的权限
ii. 如果一个uid会腾出,其他新安装的应用也可能会使用该uid此时会重新生成权限
O权限重启手机
i. 伪装成系统应用
1. 在清单文件中配置 android:shared_user_id=”android.uid.systemsign”
2. 应用程序使用系统的签名
3. 发送重启的广播
没有网络访问权限的应用不见得安全
可以调用具有互联网访问权限的应用提交用户的隐私
可以修改system/usr/keylayout/qwerty.kl修键码的对应关系
获取Root权限
Runtime.getRuntime.exec(“su”)
pm disable 包名/或组件名
pm enable 包名/或组件名
pm install包名
pm uninstall 包名
静默安装应用
pm install -r 包名
am start -r Activity的全路径