Android系统设置中的魅族升级系统清除数据据会清除哪些数据

查看:19864|回复:7
资深技术经理
想做个功能,清除一个应用下面的所有数据,比如sharedPreference和数据库等等。请问大家有没有什么想法呢?
-----------------------------------------&&分割线 , 因为下面是解决方法 ---------------------------------------------------------------------------------------
如果一个应用想去清除其他应用的缓存数据,今天找了个方法,如下:
1. 得到ActivityManager对象
因为ActivityManager.java有个方法clearApplicationUserData(),这个方法就是用来清除其他应用的数据的复制内容到剪贴板代码: /**
& & public boolean clearApplicationUserData(String packageName, IPackageDataObserver observer) {
& && &&&try {
& && && && &return ActivityManagerNative.getDefault().clearApplicationUserData(packageName,
& && && && && && &&&observer, Binder.getOrigCallingUser());
& && &&&} catch (RemoteException e) {
& && && && &
& & }得到ActivityManager对象:复制内容到剪贴板代码:ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);2. 通过反射调用am.clearApplicationUserData()方法
看到这里,大家肯定会觉得这个东西有点恐怖,因为随便一个应该就把别人应用程序的缓存清除了,那是多么可怕的事情!
所以,google就把这个方法设置成隐藏的,如上@hide, 也就是sdk开发,是调用不到这个方法的。那么我们怎么调用呢?嗯,用反射。。。如:复制内容到剪贴板代码:for (int i = 0; i & methods. i++) {
& && && && && && &&&Log.d(&Sandy&, &i: & + i + & method name: & + methods);
& && && && && && &&&if (&clearApplicationUserData&.equals(methods.getName())){&&
& && && && && && && && &try {
& && && && && && && && && & methods.invoke(am, &com.android.providers.contacts&, new ClearUserDataObserver());
& && && && && && && && &} catch (Exception e) {
& && && && && && && && && & Log.d(&Sandy&, &&, e);
& && && && && && && && &}
& && && && && && &&&}
& && && && && & }复制内容到剪贴板代码:class ClearUserDataObserver extends IPackageDataObserver.Stub {
& && && &&&public void onRemoveCompleted(final String packageName, final boolean succeeded) {
//& && && && && &final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
//& && && && && &msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
//& && && && && &mHandler.sendMessage(msg);
& && && && &}
& && &&&}首先拿到am对象的所有方法,然后找到clearApplicationUserData方法,再执行这个方法。我这里要清除的是手机上所有的联系人记录信息(&com.android.providers.contacts&)。
3. 设置android.permission.CLEAR_APP_USER_DATA权限
嗯,google认为单单把clearApplicationUserData设置成@hide还不够安全,于是它要求执行clearApplicationUserData方法还需要应用具有android.permission.CLEAR_APP_USER_DATA权限。
在AndroidManifest.xml文件里面配置这个权限,如下:复制内容到剪贴板代码: &uses-permission android:name=&android.permission.CLEAR_APP_USER_DATA& /&4.&&设置应用程序的系统进程权限
是不是这样就ok了呢?还不是的。。 ^_^, 我们的应用程序必须具有系统进程权限才可以执行这个操作,怎么办呢?在AndroidManifest.xml里面配置android:sharedUserId,如:复制内容到剪贴板代码:android:sharedUserId=&android.uid.system&5.&&编写Android.mk文件
修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行, 这一行的意思是调用系统平台的签名
6.&&用mm命令来编译我们的应用程序,这样,我们的应用程序就可以清除联系人的数据了。
这种方法的缺陷:
1.&&由于调用LOCAL_CERTIFICATE := platform来编译应用程序,所以我们的应用程序就和系统签名绑定在一起了,就是基本上这个应用程序只能在你的系统上进行安装,别人的手机是装不了的。。这个也是为了安全考虑。
不然别人做个应用程序,然后啪啪啪就把你的应用程序的数据清空了,那真的是可怕的事情了。。
下面是一个链接,大家可以参考:
写的很匆忙,大家将就着看吧。。。
本帖最后由 rongwei84n 于
17:10 编辑
资深技术经理
终于解决了。。 ;P1 ;P1
资深技术经理
其实这个功能也是蛮不错的,和setting里面的应用管理有点像。。 ;P1
中级工程师
引用:原帖由 rongwei84n 于
10:41 发表
想做个功能,清除一个应用下面的所有数据,比如sharedPreference和数据库等等。请问大家有没有什么想法呢?
-----------------------------------------&&分割线 , 因为下面是解决方法 -------------------------------- ... 我也碰到过需要调用 sdk中 隐藏的接口,不知道怎弄,原来可以这样操作!
资深技术经理
引用:原帖由 四海轩 于
12:41 发表
我也碰到过需要调用 sdk中 隐藏的接口,不知道怎弄,原来可以这样操作! 嗯~~, 可以用反射。。 其实反射真的用途挺广的。特别是一些框架,比如struts之类的。大量使用反射来实例化程序员配置在xml文件里面的类。 :lol1
LZ啊,如果我要不绑定系统签名和应用怎么搞?360安全卫士什么的不是可以一键清除缓存的嘛?LZ有思路没?
资深技术经理
引用:原帖由 Kyson 于
17:24 发表
LZ啊,如果我要不绑定系统签名和应用怎么搞?360安全卫士什么的不是可以一键清除缓存的嘛?LZ有思路没? 如果不用系统签名的话, 要root权限的,也就是两个方面
1。 你的手机是root过的
2. 360得到你的授权可以请求到root权限。。
现在执行报错啊: java.lang.IllegalArgumentException: wrong expected 0, got 2
&&找不到原因呢,网上这个错误的资料挺少的。4811人阅读
Android app(6)
Class&?& iPackageDataObserverClass =
&&&&&&&&&&& try {
&&&&&&&&&&&&&&& iPackageDataObserverClass = Class.forName(&android.content.pm.IPackageDataObserver&);
&&&&&&&&&&& } catch (ClassNotFoundException e1) {
&&&&&&&&&&&&&&& // TODO Auto-generated catch block
&&&&&&&&&&&&&&& e1.printStackTrace();
&&&&&&&&&&& }
&&&&&&&&&&& Class&ActivityManager& activityManagerClass=ActivityManager.
&&&&&&&&&&& ActivityManager activityManager=(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
&&&&&&&&&&& Method clearDataMethod=activityManagerClass.getMethods()[0];
&&&&&&&&&&& Object iPackageDataObserverObject = Proxy.newProxyInstance(
&&&&&&&&&&&&&&& SettingMainActivity.class.getClassLoader(), new Class[]{iPackageDataObserverClass},
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& new InvocationHandler() {
&&&&&&&&&&&&&&&&&&&&&&& public Object invoke(Object proxy, Method method, Object[] args)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& throws Throwable {
&&&&&&&&&&&&&&&&&&&&&&&&&&& Log.i(&Proxy&, method.getName() + &: & + Arrays.toString(args));
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& });
&&&&&&&&&&& try {
&&&&&&&&&&&&&&& clearDataMethod.invoke(activityManager, &com.tecom.sip&,iPackageDataObserverObject);
&&&&&&&&&&& } catch (IllegalArgumentException e) {
&&&&&&&&&&&&&&& // TODO Auto-generated catch block
&&&&&&&&&&&&&&& e.printStackTrace();
&&&&&&&&&&& } catch (IllegalAccessException e) {
&&&&&&&&&&&&&&& // TODO Auto-generated catch block
&&&&&&&&&&&&&&& e.printStackTrace();
&&&&&&&&&&& } catch (InvocationTargetException e) {
&&&&&&&&&&&&&&& // TODO Auto-generated catch block
&&&&&&&&&&&&&&& e.printStackTrace();
&&&&&&&&&&& }
 这里说的清除是在软件中清理其它程序的缓存,有两种。均用到反射这方面的知识,没办法,Android系统API把这些方法隐藏了。反射就不说了,不懂得可以自己百度,谷歌!
  一种带root权限的:
Class c1 = Class.forName(&android.content.pm.IPackageDataObserver&);
Method method = pm.getClass().getMethod(&deleteApplicationCacheFiles&, String.class,IPackageDataObserver.class);
method.invoke(pm, packageName,new IPackageDataObserver.Stub(){
public void onRemoveCompleted(String packageName,
boolean succeeded) throws RemoteException {
// TODO Auto-generated method stub
&uses-permission android:name=&android.permission.DELETE_CACHE_FILES& /&
  另外一种是不用权限;一键清理:
private static long getEnvironmentSize()
& && &File localFile = Environment.getDataDirectory();
& && &long l1;
& && &if (localFile == null)
& && &&&l1 = 0L;
& && &while (true)
& && &&&String str = localFile.getPath();
& && &&&StatFs localStatFs = new StatFs(str);
& && &&&long l2 = localStatFs.getBlockSize();
& && &&&l1 = localStatFs.getBlockCount() * l2;
& && &&&return l1;
PackageManager pm = activity.getPackageManager();
Class[] arrayOfClass = new Class[2];
Class localClass2 = Long.TYPE;
arrayOfClass[0] = localClass2;
arrayOfClass[1] = IPackageDataObserver.
Method localMethod = pm.getClass().getMethod(&freeStorageAndNotify&, arrayOfClass);
Long localLong = Long.valueOf(getEnvironmentSize() - 1L);
Object[] arrayOfObject = new Object[2];
arrayOfObject[0] = localL
localMethod.invoke(pm,localLong,new IPackageDataObserver.Stub(){
&&public void onRemoveCompleted(String packageName,boolean succeeded) throws RemoteException {
& && & // TODO Auto-generated method stub
权限:&uses-permission android:name=&android.permission.CLEAR_APP_CACHE& /&
  这也是一点点见解,还不是很成熟,希望懂的多的大牛们指出不足或者错误之处,大家共同学习一下。
可能会遇到IPackageDataObserver这个无法导进去,自己写一个IPackageDataObserver.aidl,内容如下:
package android.content.
&&* API for package data change related callbacks from the Package Manager.
&&* Some usage scenarios include deletion of cache directory, generate
&&* statistics related to code, data, cache usage(TODO)
oneway interface IPackageDataObserver {
& &&&void onRemoveCompleted(in String packageName, boolean succeeded);
}放在src包下就行了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
(1)(2)(2)(1)(1)(2)(1)(3)(3)(1)(7)(2)(2)(6)(6)(6)(1)(2)(2)(2)(8)(5)(1)(2)(6)(4)(13)Android清除数据、清除缓存、一键清理的区别
??在设备中,我们经常会看到与或者应用相关的清除功能有:清除数据、清除缓存、一键清理,这么多清除功能对于一个程序猿就够难理解了,偏偏很多安卓设备上都有这些功能,对于用户来说就更难理解,趁着在把玩手机的时候想到了这一点,索引追根究底了解他们的具体区别。
清除数据、清除缓存、一键清理的区别
??清除数据主要是清除用户配置,比如SharedPreferences、等等,这些数据都是在程序运行过程中保存的用户配置信息,清除数据后,下次进入程序就和第一次进入程序时一样;
??缓存是程序运行时的临时存储空间,它可以存放从网络下载的临时图片,从用户的角度出发清除缓存对用户并没有太大的影响,但是清除缓存后用户再次使用该APP时,由于本地缓存已经被清理,所有的数据需要重新从网络上获取,注意:为了在清除缓存的时候能够正常清除与应用相关的缓存,请将缓存文件存放在getCacheDir()或者 getExternalCacheDir()路径下。比如对微信清除缓存,则聊天记录、朋友圈缓存的用户头像、图片、文字等信息都会被清除掉,清除缓存后再次进入微信时你会发现消息记录被清空了,朋友圈的图片和用户头像需要加载一会才能正常显示。
??一键清理是系统级别的功能,它主要是杀后台进程,以达到释放内存的目的,但杀掉哪些进程和清理时设置的重要值阈值有关,重要值越大说明进程重要程度越低,如果在清理时某个进程的重要值大于该阈值,该进程就会被杀掉。比如微信等应用在后台,一件清理后会将微信和与之相关的服务都杀掉(有的服务做了特殊处理,杀不死!!!)。
What&s the difference between clear cache & clear data in android settings
Android中系统设置中的清除数据究竟会清除哪些数据
Android 一键清理、内存清理功能实现
How to delete files created by the application on uninstall?
??为了让程序被卸载后不在文件系统中留下毫无关联的无用文件,建议将应用相关的配置和缓存文件存放在程序被卸载时会删掉的文件夹下面(音乐文件、视频文件、图片、这种适合多个应用和浏览的文件除外),具体路径有:
/data/data/package/
getFilesDir()
getCacheDir()
getExternalCacheDir()(是否能够在程序被卸载时被删除与API的等级有关)
getExternalFilesDir()(是否能够在程序被卸载时被删除与API的等级有关)
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'如何彻底删除手机里的隐私数据
&v&&v&&v&&v&&v&&v&&v&&v&&v&&v&&v&&v&
您现在的位置:&&>>&&>>&&>>&消费警示正文
如何彻底删除手机里的隐私数据
网友“尼尔”:
手上有一部旧安卓手机,用了两三年了,打算换新机。旧手机会转卖出去,不过怕泄露个人隐私数据。想问下,假如恢复手机的出厂设置,是否可以完全删除手机上的隐私数据?
腾讯科技:
一、相关实验显示这种做法不靠谱
来自安全公司的实验显示,恢复安卓手机的出厂设置并不是防止隐私泄露的好办法。
据国外媒体报道,安全软件开发商Avast本周对Android系统恢复出厂设置功能的安全性提出质疑。该公司购买了20部二手Android手机,以检验能否从其中恢复出此前用户的个人数据。结果Avast从这些手机中恢复出超过4万张照片。许多照片为儿童照片,而另一些则是女性和男性的性感照。
此外,Avast还恢复出了谷歌(微博)搜索关键词、电子邮件和短信。而且利用被认为已永久删除的数据,Avast成功识别了4部手机最初的主人。
据了解,Avast使用了Access Data推出的FTK Imager软件来恢复这些二手手机之前的用户数据。这款软件可以在网上免费MV。他们还从XDA开发者论坛上获取了一些指导,并运用了Android推出的Android DebugBridge以及Android Backup Extractor功能。通过这些准备工作,Avast甚至不用对手机解锁,便在电脑上恢复出手机的有关数据。
早前,国外安全公司McAfee研究员Robert Siciliano也曾表示,在用户使用了手机内置的抹除设备选项后,安卓手机依然无法完全删除个人数据。这位研究员购买了30款设备,包括智能手机和笔记本电脑,测试结果均支持这一结论。
虽然目前还没有官方的权威说法,但是从保护隐私的角度看,恢复手机出厂设置不是最佳的办法。
二、如何彻底删除隐私数据
之所以能够恢复已被删除的数据,是因为删除的只是回收站里面的数据,而硬盘上仍有数据的痕迹,通过某些软件可以恢复。
不过硬盘上的数据可以被多次覆盖,数据恢复一般只能恢复最上层的数据,所以,用户可以用一些无关紧要的内容把用户的个人信息覆盖,这样即便信息被恢复,也不会影响到个人隐私。
具体操作过程如下:
1、恢复安卓手机出厂设置或者格式化;
2、通过电脑或者MV,存入一些无关紧要的文件或者视频,将硬盘空间占满;
3、将手机卖出。
上一篇消费警示: 下一篇消费警示:
相关消费警示

我要回帖

更多关于 魅族升级系统清除数据 的文章

 

随机推荐