android手机root后的安全问题 (二)获取通知栏通知

导读:本文介绍杀毒软件和病毒是如何获取通知栏上的所有通知,并且利用其信息杀死应用。

 

上一篇将过如何利用root权限来做一次静默安装,有的人会说,安装apk就安装呗,反正哥有金山手机卫士,哥有360主动防御……他们都会弹出通知告诉我的!

安装了新的应用,手机会发送广播,这些所谓的杀毒软件监听这些广播,然后弹出通知

好吧,我承认,他们在一定意义上还是有点用处的,我们先把这个问题放一放,先来说两句题外话

 

360和和金山手机卫士都有一个让广大android开发者比较蛋疼的一个功能:那就是检查广告通知!

当有通知栏有广告的时候,运行360执行检查,它会告诉你是哪个应用程序的广告(当然,这里并不局限于广告,他们是获得所有通知,然后过滤),然后他会让用户选择:不处理;关闭通知(实际上是把这个进程kill掉,整个软件停止运行);卸载此软件。

 

虽然我没有发布过android应用,但是我知道,靠软件赚钱的各位,本来收入已经够尴尬的了,再加上这些操蛋的软件提供这些操蛋的功能……哎

大家不喜欢收费软件那咱们就免费,点点广告支持一下总行吧,就是不点,你就放在那呗(当然,有的软件发起广告来没玩没了也挺操蛋)

 

说了这么多废话,我们就来看看那些所谓的杀毒软件是如何对付大家的

到了关键的地方,实际也就那么一行代码……又让大家失望了。。。

Shell代码 复制代码  收藏代码
  1. adb shell dumpsys notification  

比如,我现在在我机器上面执行一下,输出的结果为

Log代码 复制代码  收藏代码
  1. Current Notification Manager state:   
  2.   Notification List:   
  3.     NotificationRecord{41453c70 pkg=com.zdworks.android.toolbox id=7f090092 tag=null pri=0}   
  4.       icon=0x0 / <name unknown>   
  5.       contentIntent=null   
  6.       deleteIntent=null   
  7.       tickerText=null   
  8.       contentView=null   
  9.       defaults=0x0  
  10.       flags=0x62  
  11.       sound=null   
  12.       vibrate=null   
  13.       ledARGB=0x0 ledOnMS=0 ledOffMS=0  
  14.     NotificationRecord{415f48e8 pkg=com.zdworks.android.toolbox id=7f090080 tag=null pri=100}   
  15.       icon=0x7f0200fd / com.zdworks.android.toolbox:drawable/barttery_notify_icon   
  16.       contentIntent=PendingIntent{41949028: PendingIntentRecord{412e3c20 com.zdworks.android.toolbox startActivity}}   
  17.       deleteIntent=null   
  18.       tickerText=电量提示   
  19.       contentView=android.widget.RemoteViews@416e7b90   
  20.       defaults=0x0  
  21.       flags=0x22  
  22.       sound=null   
  23.       vibrate=null   
  24.       ledARGB=0x0 ledOnMS=0 ledOffMS=0  
  25.     NotificationRecord{416db3e0 pkg=android id=1040414 tag=null pri=100}   
  26.       icon=0x10804f5 / android:drawable/stat_sys_adb   
  27.       contentIntent=PendingIntent{41275de8: PendingIntentRecord{416dade8 android startActivity}}   
  28.       deleteIntent=null   
  29.       tickerText=USB 调试已连接   
  30.       contentView=android.widget.RemoteViews@416daf40   
  31.       defaults=0x0  
  32.       flags=0x2  
  33.       sound=null   
  34.       vibrate=null   
  35.       ledARGB=0x0 ledOnMS=0 ledOffMS=0  
  36.     NotificationRecord{41790de8 pkg=com.htc.android.psclient id=7f020010 tag=null pri=100}   
  37.       icon=0x7f020010 / com.htc.android.psclient:drawable/usb_to_pc_notify   
  38.       contentIntent=PendingIntent{416c3e38: PendingIntentRecord{417bc968 com.htc.android.psclient startActivity}}   
  39.       deleteIntent=null   
  40.       tickerText=null   
  41.       contentView=android.widget.RemoteViews@4169d128   
  42.       defaults=0x0  
  43.       flags=0x2  
  44.       sound=null   
  45.       vibrate=null   
  46.       ledARGB=0x0 ledOnMS=0 ledOffMS=0  
  47.      
  48.   mSoundNotification=null   
  49.   mSound=com.android.server.NotificationPlayer@413e73b8   
  50.   mVibrateNotification=null   
  51.   mDisabledNotifications=0x0  
  52.   mSystemReady=true  

现在大家知道了吧,这么简单就把咱们给搞定了

下面的事情就简单

1.想办法获取这段log

2.提取包名

3.根据数据库中的黑名单白名单不同处理

4.你的应用很可能在黑名单中,最后的结果也基本是进程被杀死

(这里就不演示3、4部分了,只演示1、2)

 

Java代码 复制代码  收藏代码
  1. testButton = (Button)findViewById(R.id.exec);   
  2. testButton.setOnClickListener(new View.OnClickListener() {   
  3.     public void onClick(View v) {   
  4.         String[] commands = {"dumpsys notification"};   
  5.         Process process = null;   
  6.         DataOutputStream dataOutputStream = null;   
  7.   
  8.         try {   
  9.             process = Runtime.getRuntime().exec("su");   
  10.             dataOutputStream = new DataOutputStream(process.getOutputStream());   
  11.             int length = commands.length;   
  12.             for (int i = 0; i < length; i++) {   
  13.                 Log.e(TAG, "commands[" + i + "]:" + commands[i]);   
  14.                 dataOutputStream.writeBytes(commands[i] + "\n");   
  15.             }   
  16.             dataOutputStream.writeBytes("exit\n");   
  17.             dataOutputStream.flush();   
  18.                
  19.             process.waitFor();   
  20.                
  21.             BufferedReader reader = null;   
  22.             reader = new BufferedReader(new InputStreamReader(process.getInputStream()));     
  23.             String line = "";   
  24.             List<String> lineList = new ArrayList<String>();   
  25.             final StringBuilder log = new StringBuilder();     
  26.             String separator = System.getProperty("line.separator");   
  27.             Pattern pattern = Pattern.compile("pkg=[^\\s]+");   
  28.             while ((line = reader.readLine()) != null) {   
  29.                 if(line != null && line.trim().startsWith("NotificationRecord")){   
  30.                     Matcher matcher = pattern.matcher(line);   
  31.                     if(matcher.find()){   
  32.                         lineList.add(matcher.group());   
  33.                     }else{   
  34.                         Log.e(TAG, "what's this?!");   
  35.                     }   
  36.                 }   
  37.                    
  38.                 log.append(line);   
  39.                 log.append(separator);   
  40.             }   
  41.             Log.v(TAG, "log:" + log.toString());   
  42.                
  43.             int size = lineList.size();   
  44.             for (int i = 0; i < size; i++) {   
  45.                 Log.i(TAG, "app:" + lineList.get(i));   
  46.             }   
  47.         } catch (Exception e) {   
  48.             Log.e(TAG, "copy fail", e);   
  49.         } finally {   
  50.             try {   
  51.                 if (dataOutputStream != null) {   
  52.                     dataOutputStream.close();   
  53.                 }   
  54.                 process.destroy();   
  55.             } catch (Exception e) {   
  56.             }   
  57.         }   
  58.         Log.v(TAG, "finish");   
  59.         }   
  60.     });   
  61. }  

上面的这段代码实在没什么技术含量,让给位网友见笑了

按顺序简单解释一下

首先,我们先执行dumpsys notification这条命令,这在上一期的代码中已经有了

然后通过process.getInputStream()获得其输出按行读取,这里只关心类似于下面这种的log

Log代码 复制代码  收藏代码
  1. NotificationRecord{40dacad8 pkg=com.htc.android.psclient id=7f020010 tag=null pri=100}  

然后从中提取出包名即可

其中的正则就是为了提取包名用的,想了解正则的同学可以看我的正则教程

深入入门正则表达式(java)

 

这里我执行的结果为(看来有一个应用提示了两个通知)

Java代码 复制代码  收藏代码
  1. app:pkg=com.zdworks.android.toolbox   
  2. app:pkg=com.zdworks.android.toolbox   
  3. app:pkg=android   
  4. app:pkg=com.htc.android.psclient   

之后的工作就是把这个list展示给用户,让用户去选择了

既然360可以这样,病毒为什么不可以呢?病毒Fake.apk可以在半夜偷偷安装应用Real.apk,几秒钟后,Fake.apk执行上面的这些操作,获取360,然后kill!爽!

大家有兴趣可以反编译一下金山和360,他们基本就是这么干的,我发现360比较坏,至于为什么这么说,大家自己去发现吧

 

 

ps:我使用的是卡巴斯基免费版,杀毒软件是不会去管有没有广告推送的,广告不是病毒,杀毒软件也不应该干一些不该干的事!

 

 

请大家不要用root的手机随意下载软件,更不要以任何借口制造任何病毒!

 

android手机root后的安全问题 (一)

android手机root后的安全问题 (二)

android手机root后的安全问题 (三)

android手机root后的安全问题 (四)

 

 

android安全问题(一) 静音拍照与被拍

android安全问题(二) 程序锁

android安全问题(三) 钓鱼程序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 第1章 Activity的生命周期和启动模式 / 1 1.1 Activity的生命周期全面分析 / 1 1.1.1 典型情况下的生命周期分析 / 2 1.1.2 异常情况下的生命周期分析 / 8 1.2 Activity的启动模式 / 16 1.2.1 Activity的Launch Mode / 16 1.2.2 Activity的Flags / 27 1.3 Intent Filter的匹配规则 / 28 第2章 IPC机制 / 35 2.1 Android IPC简介 / 35 2.2 Android中的多进程模式 / 36 2.2.1 开启多进程模式 / 36 2.2.2 多进程模式的运行机制 / 39 2.3 IPC基础概念介绍 / 42 2.3.1 Serializable接口 / 42 2.3.2 Parcelable接口 / 45 2.3.3 Binder / 47 2.4 Android中的IPC方式 / 61 2.4.1 使用Bundle / 61 2.4.2 使用文件共享 / 62 2.4.3 使用Messenger / 65 2.4.4 使用AIDL / 71 2.4.5 使用 Content Provider / 91 2.4.6 使用Socket / 103 2.5 Binder连接池 / 112 2.6 选用合适的IPC方式 / 121 第3章 View的事件体系 / 122 3.1 View基础知识 / 122 3.1.1 什么是View / 123 3.1.2 View的位置参数 / 123 3.1.3 Motion Event和Touch Slop / 125 3.1.4 VelocityT racker、Gesture Detector和Scroller / 126 3.2 View的滑动 / 129 3.2.1 使用scroll To/scroll By / 129 3.2.2 使用动画 / 131 3.2.3 改变布局参数 / 133 3.2.4 各种滑动方式的对比 / 133 3.3 弹性滑动 / 135 3.3.1 使用Scroller / 136 3.3.2 通过动画 / 138 3.3.3 使用延时策略 / 139 3.4 View的事件分发机制 / 140 3.4.1 点击事件的传递规则 / 140 3.4.2 事件分发的源码解析 / 144 3.5 View的滑动冲突 / 154 3.5.1 常见的滑动冲突场景 / 155 3.5.2 滑动冲突的处理规则 / 156 3.5.3 滑动冲突的解决方式 / 157 第4章 View的工作原理 / 174 4.1 初识View Root和Decor View / 174 4.2 理解Measure Spec / 177 4.2.1 Measure Spec / 177 4.2.2 Measure Spec和Layout Params的对应关系 / 178 4.3 View的工作流程 / 183 4.3.1 measure过程 / 183 4.3.2 layout过程 / 193 4.3.3 draw过程 / 197 4.4 自定义View / 199 4.4.1 自定义View的分类 / 200 4.4.2 自定义View须知 / 201 4.4.3 自定义View示例 / 202 4.4.4 自定义View的思想 / 217 第5章 理解Remote Views / 218 5.1 Remote Views的应用 / 218 5.1.1 Remote Views在通知上的应用 / 219 5.1.2 Remote Views在桌面小部件上的应用 / 221 5.1.3 Pending Intent概述 / 228 5.2 Remote Views的内部机制 / 230 5.3 Remote Views的意义 / 239 第6章 Android的Drawable / 243 6.1 Drawable简介 / 243 6.2 Drawable的分类 / 244 6.2.1 Bitmap Drawable / 244 6.2.2 Shape Drawable / 247 6.2.3 Layer Drawable / 251 6.2.4 State List Drawable / 253 6.2.5 Level List Drawable / 255 6.2.6 Transition Drawable / 256 6.2.7 Inset Drawable / 257 6.2.8 Scale Drawable / 258 6.2.9 Clip Drawable / 260 6.3 自定义Drawable / 262 第7章 Android动画深入分析 / 265 7.1 View动画 / 265 7.1.1 View动画的种类 / 265 7.1.2 自定义View动画 / 270 7.1.3 帧动画 / 272 7.2 View动画的特殊使用场景 / 273 7.2.1 LayoutAnimation / 273 7.2.2 Activity的切换效果 / 275 7.3 属性动画 / 276 7.3.1 使用属性动画 / 276 7.3.2 理解插值器和估值器 / 280 7.3.3 属性动画的监听器 / 282 7.3.4 对任意属性做动画 / 282 7.3.5 属性动画的工作原理 / 288 7.4 使用动画的注意事项 / 292 第8章 理解Window和Window Manager / 294 8.1 Window和Window Manager / 294 8.2 Window的内部机制 / 297 8.2.1 Window的添加过程 / 298 8.2.2 Window的删除过程 / 301 8.2.3 Window的更新过程 / 303 8.3 Window的创建过程 / 304 8.3.1 Activity的Window创建过程 / 304 8.3.2 Dialog的Window创建过程 / 308 8.3.3 Toast的Window创建过程 / 311 第9章 四大组件的工作过程 / 316 9.1 四大组件的运行状态 / 316 9.2 Activity的工作过程 / 318 9.3 Service的工作过程 / 336 9.3.1 Service的启动过程 / 336 9.3.2 Service的绑定过程 / 344 9.4 Broadcast Receiver的工作过程 / 352 9.4.1 广播的注册过程 / 353 9.4.2 广播的发送和接收过程 / 356 9.5 Content Provider的工作过程 / 362 第10章 Android消息机制 / 372 10.1 Android消息机制概述 / 373 10.2 Android消息机制分析 / 375 10.2.1 Thread Local的工作原理 / 375 10.2.2 消息队列的工作原理 / 380 10.2.3 Looper的工作原理 / 383 10.2.4 Handler的工作原理 / 385 10.3 主线程的消息循环 / 389 第11章 Android的线程和线程池 / 391 11.1 主线程和子线程 / 392 11.2 Android中的线程形态 / 392 11.2.1 Async Task / 392 11.2.2 Async Task的工作原理 / 395 11.2.3 Handler Thread / 402 11.2.4 Intent Service / 403 11.3 Android中的线程池 / 406 11.3.1 Thread Pool Executor / 407 11.3.2 线程池的分类 / 410 第12章 Bitmap的加载和Cache / 413 12.1 Bitmap的高效加载 / 414 12.2 Android中的缓存策略 / 417 12.2.1 Lru Cache / 418 12.2.2 Disk Lru Cache / 419 12.2.3 Image Loader的实现 / 424 12.3 Image Loader的使用 / 441 12.3.1 照片墙效果 / 441 12.3.2 优化列表的卡顿现象 / 446 第13章 综合技术 / 448 13.1 使用Crash Handler来获取应用的crash信息 / 449 13.2 使用multidex来解决方法数越界 / 455 13.3 Android的动态加载技术 / 463 13.4 反编译初步 / 469 13.4.1 使用dex2jar和jd—gui反编译apk / 470 13.4.2 使用apktool对apk进行次打包 / 470 第14章 JNI和NDK编程 / 473 14.1 JNI的开发流程 / 474 14.2 NDK的开发流程 / 478 14.3 JNI的数据类型和类型签名 / 484 14.4 JNI调用Java方法的流程 / 486 第15章 Android性能优化 / 489 15.1 Android的性能优化方法 / 490 15.1.1 布局优化 / 490 15.1.2 绘制优化 / 493 15.1.3 内存泄露优化 / 493 15.1.4 响应速度优化和ANR日志分析 / 496 15.1.5 List View和Bitmap优化 / 501 15.1.6 线程优化 / 501 15.1.7 一些性能优化建议 / 501 15.2 内存泄露分析之MAT工具 / 502 15.3 提高程序的可维护性 / 506
本书是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。本书从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第,结合Android源代码和应用层开发过程,融会贯通,介绍一些比较深入的知识点;第三,介绍一些核心技术和Android的性能优化思想。 第1章 Activity的生命周期和启动模式 1 1.1 Activity的生命周期全面分析 1 1.1.1 典型情况下的生命周期分析 2 1.1.2 异常情况下的生命周期分析 8 1.2 Activity的启动模式 16 1.2.1 Activity的LaunchMode 16 1.2.2 Activity的Flags 27 1.3 IntentFilter的匹配规则 28 第2章 IPC机制 35 2.1 Android IPC简介 35 2.2 Android中的多进程模式 36 2.2.1 开启多进程模式 36 2.2.2 多进程模式的运行机制 39 2.3 IPC基础概念介绍 42 2.3.1 Serializable接口 42 2.3.2 Parcelable接口 45 2.3.3 Binder 47 2.4 Android中的IPC方式 61 2.4.1 使用Bundle 61 2.4.2 使用文件共享 62 2.4.3 使用Messenger 65 2.4.4 使用AIDL 71 2.4.5 使用ContentProvider 91 2.4.6 使用Socket 103 2.5 Binder连接池 112 2.6 选用合适的IPC方式 121 第3章 View的事件体系 122 3.1 View基础知识 122 3.1.1 什么是View 123 3.1.2 View的位置参数 123 3.1.3 MotionEvent和TouchSlop 125 3.1.4 VelocityTracker、GestureDetector和Scroller 126 3.2 View的滑动 129 3.2.1 使用scrollTo/scrollBy 129 3.2.2 使用动画 131 3.2.3 改变布局参数 133 3.2.4 各种滑动方式的对比 133 3.3 弹性滑动 135 3.3.1 使用Scroller 136 3.3.2 通过动画 138 3.3.3 使用延时策略 139 3.4 View的事件分发机制 140 3.4.1 点击事件的传递规则 140 3.4.2 事件分发的源码解析 144 3.5 View的滑动冲突 154 3.5.1 常见的滑动冲突场景 155 3.5.2 滑动冲突的处理规则 156 3.5.3 滑动冲突的解决方式 157 第4章 View的工作原理 174 4.1 初识ViewRoot和DecorView 174 4.2 理解MeasureSpec 177 4.2.1 MeasureSpec 177 4.2.2 MeasureSpec和LayoutParams的对应关系 178 4.3 View的工作流程 183 4.3.1 measure过程 183 4.3.2 layout过程 193 4.3.3 draw过程 197 4.4 自定义View 199 4.4.1 自定义View的分类 200 4.4.2 自定义View须知 201 4.4.3 自定义View示例 202 4.4.4 自定义View的思想 217 第5章 理解RemoteViews 218 5.1 RemoteViews的应用 218 5.1.1 RemoteViews在通知上的应用 219 5.1.2 RemoteViews在桌面小部件上的应用 221 5.1.3 PendingIntent概述 228 5.2 RemoteViews的内部机制 230 5.3 RemoteViews的意义 239 第6章 Android的Drawable 243 6.1 Drawable简介 243 6.2 Drawable的分类 244 6.2.1 BitmapDrawable 244 6.2.2 ShapeDrawable 247 6.2.3 LayerDrawable 251 6.2.4 StateListDrawable 253 6.2.5 LevelListDrawable 255 6.2.6 TransitionDrawable 256 6.2.7 Ins
isActivityExists : 判断 Activity 是否存在 startActivity : 启动 Activity startActivities : 启动多个 Activity startHomeActivity : 回到桌面 getActivityList : 获取 Activity 栈链表 getLauncherActivity : 获取启动项 Activity getTopActivity : 获取栈顶 Activity isActivityExistsInStack : 判断 Activity 是否存在栈中 finishActivity : 结束 Activity finishToActivity : 结束到指定 Activity finishOtherActivities : 结束所有其他类型的 Activity finishAllActivities : 结束所有 Activity finishAllActivitiesExceptNewest: 结束除最新之外的所有 Activity App 相关 -> AppUtils.java -> Demo isInstallApp : 判断 App 是否安装 installApp : 安装 App(支持 8.0) installAppSilent : 静默安装 App uninstallApp : 卸载 App uninstallAppSilent : 静默卸载 App isAppRoot : 判断 App 是否有 root 权限 launchApp : 打开 App exitApp : 关闭应用 getAppPackageName : 获取 App 包名 getAppDetailsSettings: 获取 App 具体设置 getAppName : 获取 App 名称 getAppIcon : 获取 App 图标 getAppPath : 获取 App 路径 getAppVersionName : 获取 App 版本号 getAppVersionCode : 获取 App 版本码 isSystemApp : 判断 App 是否是系统应用 isAppDebug : 判断 App 是否是 Debug 版本 getAppSignature : 获取 App 签名 getAppSignatureSHA1 : 获取应用签名的的 SHA1 值 isAppForeground : 判断 App 是否处于前台 getForegroundApp : 获取前台应用包名 getAppInfo : 获取 App 信息 getAppsInfo : 获取所有已安装 App 信息 cleanAppData : 清除 App 所有数据 相关 -> BarUtils.java -> Demo getStatusBarHeight : 获取状态高度(px) addMarginTopEqualStatusBarHeight : 为 view 增加 MarginTop 为状态高度 subtractMarginTopEqualStatusBarHeight: 为 view 减少 MarginTop 为状态高度 setStatusBarColor : 设置状态颜色 setStatusBarAlpha : 设置状态透明度 setStatusBarColor4Drawer : 为 DrawerLayout 设置状态颜色 setStatusBarAlpha4Drawer : 为 DrawerLayout 设置状态透明度 getActionBarHeight : 获取 ActionBar 高度 showNotificationBar : 显示通知 hideNotificationBar : 隐藏通知 getNavBarHeight : 获取导航高度 hideNavBar : 隐藏导航 缓存相关 -> CacheUtils.java -> Test getInstance : 获取缓存实例 put : 缓存中写入数据 getBytes : 缓存中读取字节数组 getString : 缓存中读取 String getJSONObject : 缓存中读取 JSONObject getJSONArray : 缓存中读取 JSONArray getBitmap : 缓存中读取 Bitmap getDrawable : 缓存中读取 Drawable getParcelable : 缓存中读取 Parcelable getSerializable: 缓存中读取 Serializable getCacheSize : 获取缓存大小 getCacheCount : 获取缓存个数 remove : 根据键值移除缓存 clear : 清除所有缓存 清除相关 -> CleanUtils.java -> Demo cleanInternalCache : 清除内部缓存 cleanInternalFiles : 清除内部文件 cleanInternalDbs : 清除内部数据库 cleanInternalDbByName: 根据名称清除数据库 cleanInternalSP : 清除内部 SP cleanExternalCache : 清除外部缓存 cleanCustomCache : 清除自定义目录下的文件 关闭相关 -> CloseUtils.java closeIO : 关闭 IO closeIOQuietly: 安静关闭 IO 转换相关 -> ConvertUtils.java -> Test bytes2HexString, hexString2Bytes : byteArr 与 hexString 互转 chars2Bytes, bytes2Chars : charArr 与 byteArr 互转 memorySize2Byte, byte2MemorySize : 以 unit 为单位的内存大小与字节数互转 byte2FitMemorySize : 字节数转合适内存大小 timeSpan2Millis, millis2TimeSpan : 以 unit 为单位的时间长度与毫秒时间戳互转 millis2FitTimeSpan : 毫秒时间戳转合适时间长度 bytes2Bits, bits2Bytes : bytes 与 bits 互转 input2OutputStream, output2InputStream : inputStream 与 outputStream 互转 inputStream2Bytes, bytes2InputStream : inputStream 与 byteArr 互转 outputStream2Bytes, bytes2OutputStream : outputStream 与 byteArr 互转 inputStream2String, string2InputStream : inputStream 与 string 按编码互转 outputStream2String, string2OutputStream: outputStream 与 string 按编码互转 bitmap2Bytes, bytes2Bitmap : bitmap 与 byteArr 互转 drawable2Bitmap, bitmap2Drawable : drawable 与 bitmap 互转 drawable2Bytes, bytes2Drawable : drawable 与 byteArr 互转 view2Bitmap : view 转 Bitmap dp2px, px2dp : dp 与 px 互转 sp2px, px2sp : sp 与 px 互转 崩溃相关 -> CrashUtils.java init: 初始化 设备相关 -> DeviceUtils.java -> Demo isDeviceRooted : 判断设备是否 rooted getSDKVersion : 获取设备系统版本号 getAndroidID : 获取设备 AndroidID getMacAddress : 获取设备 MAC 地址 getManufacturer : 获取设备厂商 getModel : 获取设备型号 shutdown : 关机 reboot : 重启 reboot2Recovery : 重启到 recovery reboot2Bootloader: 重启到 bootloader 判空相关 -> EmptyUtils.java -> Test isEmpty : 判断对象是否为空 isNotEmpty: 判断对象是否非空 编码解码相关 -> EncodeUtils.java -> Test urlEncode : URL 编码 urlDecode : URL 解码 base64Encode : Base64 编码 base64Encode2String: Base64 编码 base64Decode : Base64 解码 base64UrlSafeEncode: Base64URL 安全编码 htmlEncode : Html 编码 htmlDecode : Html 解码 加密解密相关 -> EncryptUtils.java -> Test encryptMD2, encryptMD2ToString : MD2 加密 encryptMD5, encryptMD5ToString : MD5 加密 encryptMD5File, encryptMD5File2String : MD5 加密文件 encryptSHA1, encryptSHA1ToString : SHA1 加密 encryptSHA224, encryptSHA224ToString : SHA224 加密 encryptSHA256, encryptSHA256ToString : SHA256 加密 encryptSHA384, encryptSHA384ToString : SHA384 加密 encryptSHA512, encryptSHA512ToString : SHA512 加密 encryptHmacMD5, encryptHmacMD5ToString : HmacMD5 加密 encryptHmacSHA1, encryptHmacSHA1ToString : HmacSHA1 加密 encryptHmacSHA224, encryptHmacSHA224ToString : HmacSHA224 加密 encryptHmacSHA256, encryptHmacSHA256ToString : HmacSHA256 加密 encryptHmacSHA384, encryptHmacSHA384ToString : HmacSHA384 加密 encryptHmacSHA512, encryptHmacSHA512ToString : HmacSHA512 加密 encryptDES, encryptDES2HexString, encryptDES2Base64 : DES 加密 decryptDES, decryptHexStringDES, decryptBase64DES : DES 解密 encrypt3DES, encrypt3DES2HexString, encrypt3DES2Base64: 3DES 加密 decrypt3DES, decryptHexString3DES, decryptBase64_3DES : 3DES 解密 encryptAES, encryptAES2HexString, encryptAES2Base64 : AES 加密 decryptAES, decryptHexStringAES, decryptBase64AES : AES 解密 文件相关 -> FileIOUtils.java -> Test writeFileFromIS : 将输入流写入文件 writeFileFromBytesByStream : 将字节数组写入文件 writeFileFromBytesByChannel: 将字节数组写入文件 writeFileFromBytesByMap : 将字节数组写入文件 writeFileFromString : 将字符串写入文件 readFile2List : 读取文件到字符串链表中 readFile2String : 读取文件到字符串中 readFile2BytesByStream : 读取文件到字节数组中 readFile2BytesByChannel : 读取文件到字节数组中 readFile2BytesByMap : 读取文件到字节数组中 setBufferSize : 设置缓冲区尺寸 文件相关 -> FileUtils.java -> Test getFileByPath : 根据文件路径获取文件 isFileExists : 判断文件是否存在 rename : 重命名文件 isDir : 判断是否是目录 isFile : 判断是否是文件 createOrExistsDir : 判断目录是否存在,不存在则判断是否创建成功 createOrExistsFile : 判断文件是否存在,不存在则判断是否创建成功 createFileByDeleteOldFile : 判断文件是否存在,存在则在创建之前删除 copyDir : 复制目录 copyFile : 复制文件 moveDir : 移动目录 moveFile : 移动文件 deleteDir : 删除目录 deleteFile : 删除文件 deleteAllInDir : 删除目录下所有东西 deleteFilesInDir : 删除目录下所有文件 deleteFilesInDirWithFilter: 删除目录下所有过滤的文件 listFilesInDir : 获取目录下所有文件 listFilesInDirWithFilter : 获取目录下所有过滤的文件 getFileLastModified : 获取文件最后修改的毫秒时间戳 getFileCharsetSimple : 简单获取文件编码格式 getFileLines : 获取文件行数 getDirSize : 获取目录大小 getFileSize : 获取文件大小 getDirLength : 获取目录长度 getFileLength : 获取文件长度 getFileMD5 : 获取文件的 MD5 校验码 getFileMD5ToString : 获取文件的 MD5 校验码 getDirName : 根据全路径获取最长目录 getFileName : 根据全路径获取文件名 getFileNameNoExtension : 根据全路径获取文件名不带拓展名 getFileExtension : 根据全路径获取文件拓展名 Fragment 相关 -> FragmentUtils.java -> Demo add : 新增 fragment show : 显示 fragment hide : 隐藏 fragment showHide : 先显示后隐藏 fragment replace : 替换 fragment pop : 出栈 fragment popTo : 出栈到指定 fragment popAll : 出栈所有 fragment remove : 移除 fragment removeTo : 移除到指定 fragment removeAll : 移除所有 fragment getTop : 获取顶部 fragment getTopInStack : 获取栈中顶部 fragment getTopShow : 获取顶部可见 fragment getTopShowInStack : 获取栈中顶部可见 fragment getFragments : 获取同级别的 fragment getFragmentsInStack : 获取同级别栈中的 fragment getAllFragments : 获取所有 fragment getAllFragmentsInStack: 获取栈中所有 fragment findFragment : 查找 fragment dispatchBackPress : 处理 fragment 回退键 setBackgroundColor : 设置背景色 setBackgroundResource : 设置背景资源 setBackground : 设置背景 图片相关 -> ImageUtils.java -> Demo bitmap2Bytes, bytes2Bitmap : bitmap 与 byteArr 互转 drawable2Bitmap, bitmap2Drawable: drawable 与 bitmap 互转 drawable2Bytes, bytes2Drawable : drawable 与 byteArr 互转 view2Bitmap : view 转 bitmap getBitmap : 获取 bitmap scale : 缩放图片 clip : 裁剪图片 skew : 倾斜图片 rotate : 旋转图片 getRotateDegree : 获取图片旋转角度 toRound : 转为圆形图片 toRoundCorner : 转为圆角图片 addCornerBorder : 添加圆角边框 addCircleBorder : 添加圆形边框 addReflection : 添加倒影 addTextWatermark : 添加文字水印 addImageWatermark : 添加图片水印 toAlpha : 转为 alpha 位图 toGray : 转为灰度图片 fastBlur : 快速模糊 renderScriptBlur : renderScript 模糊图片 stackBlur : stack 模糊图片 save : 保存图片 isImage : 根据文件名判断文件是否为图片 getImageType : 获取图片类型 compressByScale : 按缩放压缩 compressByQuality : 按质量压缩 compressBySampleSize : 按采样大小压缩 意图相关 -> IntentUtils.java getInstallAppIntent : 获取安装 App(支持 6.0)的意图 getUninstallAppIntent : 获取卸载 App 的意图 getLaunchAppIntent : 获取打开 App 的意图 getAppDetailsSettingsIntent: 获取 App 具体设置的意图 getShareTextIntent : 获取分享文本的意图 getShareImageIntent : 获取分享图片的意图 getComponentIntent : 获取其他应用组件的意图 getShutdownIntent : 获取关机的意图 getCaptureIntent : 获取拍照的意图 键盘相关 -> KeyboardUtils.java -> Demo showSoftInput : 动态显示软键盘 hideSoftInput : 动态隐藏软键盘 toggleSoftInput : 切换键盘显示与否状态 clickBlankArea2HideSoftInput: 点击屏幕空白区域隐藏软键盘 日志相关 -> LogUtils.java -> Demo getConfig : 获取 log 配置 Config.setLogSwitch : 设置 log 总开关 Config.setConsoleSwitch : 设置 log 控制台开关 Config.setGlobalTag : 设置 log 全局 tag Config.setLogHeadSwitch : 设置 log 头部信息开关 Config.setLog2FileSwitch: 设置 log 文件开关 Config.setDir : 设置 log 文件存储目录 Config.setFilePrefix : 设置 log 文件前缀 Config.setBorderSwitch : 设置 log 边框开关 Config.setConsoleFilter : 设置 log 控制台过滤器 Config.setFileFilter : 设置 log 文件过滤器 Config.setStackDeep : 设置 log 栈深度 v : tag 为类名的 Verbose 日志 vTag : 自定义 tag 的 Verbose 日志 d : tag 为类名的 Debug 日志 dTag : 自定义 tag 的 Debug 日志 i : tag 为类名的 Info 日志 iTag : 自定义 tag 的 Info 日志 w : tag 为类名的 Warn 日志 wTag : 自定义 tag 的 Warn 日志 e : tag 为类名的 Error 日志 eTag : 自定义 tag 的 Error 日志 a : tag 为类名的 Assert 日志 aTag : 自定义 tag 的 Assert 日志 file : log 到文件 json : log 字符串之 json xml : log 字符串之 xml 网络相关 -> NetworkUtils.java -> Demo openWirelessSettings : 打开网络设置界面 isConnected : 判断网络是否连接 isAvailableByPing : 判断网络是否可用 getDataEnabled : 判断移动数据是否打开 setDataEnabled : 打开或关闭移动数据 is4G : 判断网络是否是 4G getWifiEnabled : 判断 wifi 是否打开 setWifiEnabled : 打开或关闭 wifi isWifiConnected : 判断 wifi 是否连接状态 isWifiAvailable : 判断 wifi 数据是否可用 getNetworkOperatorName: 获取移动网络运营商名称 getNetworkType : 获取当前网络类型 getIPAddress : 获取 IP 地址 getDomainAddress : 获取域名 ip 地址 手机相关 -> PhoneUtils.java -> Demo isPhone : 判断设备是否是手机 getIMEI : 获取 IMEI 码 getIMSI : 获取 IMSI 码 getPhoneType : 获取移动终端类型 isSimCardReady : 判断 sim 卡是否准备好

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值