반사를 이용하여 프로그램의 캐시 크기, 응용 프로그램 크기, 데이터 크기를 얻고, 반사를 이용하여 캐시를 제거하여 모두 정리한다.

2428 단어
시스템에서 캐시를 가져오는 getPackageSizeInfo 방법을 숨겼습니다. 우리는 반사로 이 방법을 호출할 수 있습니다.
캐시 파일 크기를 읽으려면 추가 권한이 필요합니다: GETPACKAGE_SIZE
먼저 IPackageStatsObserver를 실행합니다.aidl 및 PackageStats.aidl 파일을android로 복사합니다.content.pm 싸주세요.
재반사 획득 방법, 후 호출
Method getPackageSizeInfoMethod = null;
Method[] methods = PackageManager.class.getMethods();
for (Method method : methods) {
	if("getPackageSizeInfo".equals(method.getName())){
		getPackageSizeInfoMethod = method;
	}
}

List<PackageInfo> infos = pm.getInstalledPackages(0);
for (PackageInfo info : infos) {
	try {
		getPackageSizeInfoMethod.invoke(pm, info.packageName,new myObserver());
	} catch (Exception e) {
		e.printStackTrace();
	}
}

이 방법의 다음 매개 변수는 원격 서비스에 사용되며, 클래스 계승 원격 서비스를 쓴다.
private class myObserver extends IPackageStatsObserver.Stub{

	@Override
	public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
			throws RemoteException {
		//    
		long cacheSize = pStats.cacheSize;
		//      
		long codeSize = pStats.codeSize;
		//    
		long dataSize = pStats.dataSize;
		
		    
	}
	
}

반사를 사용하여 캐시를 제거하려면 다음과 같이 하십시오.
캐시 파일을 삭제하려면 추가 권한이 필요합니다:DELETECACHE_FILES
이 권한은 시스템 프로그램만 사용할 수 있기 때문에 우리는 사용할 수 없습니다...
iv_delete.setOnClickListener(new OnClickListener() {
	
	@Override
	public void onClick(View v) {
		try {
			Method method = PackageManager.class.getMethod("deleteApplicationCacheFiles",
				 String.class,IPackageDataObserver.class);
			method.invoke(pm, pStats.packageName,new IPackageDataObserver.Stub(){
			@Override
			public void onRemoveCompleted(String packageName, boolean succeeded)
				throws RemoteException {
			}
			});
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
});

일반 소프트웨어는 시스템 설정 인터페이스에 클릭하여 수동으로 청소한다.
모두 정리:
반사로freeStorageAndNotify를 얻는 방법으로 원클릭으로 청소
Method[] methods = PackageManager.class.getMethods();
for (Method method : methods) {
	if("freeStorageAndNotify".equals(method.getName())){
		try {
			//        
			method.invoke(pm, Long.MAX_VALUE,new IPackageDataObserver.Stub(){
			@Override
			public void onRemoveCompleted(String packageName, boolean succeeded)
				throws RemoteException {
			}
			});
		} catch (Exception e) {
			e.printStackTrace();
		}
		return;
	}
}

좋은 웹페이지 즐겨찾기