精华内容
下载资源
问答
  • 仿TC App内存清理动画-已造轮子

    千次阅读 2016-08-14 13:25:57
    仿TC App内存清理动画-已造轮子TC App加速效果本组件实现效果:写在前面:Github地址:MovingCircleView如果觉得效果还行请顺手点个sta支持一下r,谢谢欢迎加入我创建的QQ交流群,群号:375276053另外感谢群友李通同学的...

    仿TC App内存清理动画-已造轮子

    TC App加速效果

    这里写图片描述

    本组件实现效果:

    这里写图片描述

    写在前面:

    Github地址:MovingCircleView

    如果觉得效果还行请顺手点个sta支持一下r,谢谢

    欢迎加入我创建的QQ交流群,群号:375276053

    另外感谢群友李通同学的建议,写这个自定义View也学到了一些东西

    另外一个我的开源库:多达288种动画效果定制的侧滑菜单库欢迎查看与star

    下面介绍本项目

    使用方法:

    1.xml布局中添加组件

    注:至少给宽或者高设置确定的值,不能同时设置为wrap_content,否则报错

        <com.brioal.movingview.view.MovingDotView
            android:id="@+id/main_movingView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            />
    

    2.Activity中获取实例,设置初始的进度,和点击时候要变到的进度

        mMovingDotView = (MovingDotView) findViewById(R.id.main_movingView);
            mMovingDotView.setProgress(50);
            mMovingDotView.setToProgress(10);

    如果需要对动画的执行过程设置监听

    mMovingDotView.setChangeListener(new OnAnimatorChangeListener() {
                @Override
                public void onProgressChanged(float progress) {
                    //progress 范围从 0 ~ 1.0f
                }
            });

    可以在合适的地方设置返回效果,例如当点击返回键的时候

    注:如果返回的时候不设置progress,则返回的是刚开始设置的progress

    比如原本50 , 执行动画变化到10 ,如果返回的时候不设置progress,则返回动画执行后会显示50

    @Override
        public void onBackPressed() {
            if (mMovingDotView.isCleaned()) {
                mMovingDotView.backClean();
            } else {
                super.onBackPressed();
            }
        }

    很多可定制的属性还有很多,包括设置动画持续时间,文字颜色,背景颜色,小圆点数量等等,如下表

    代码内方法 xml属性 效果
    void setDotsCount(int dotsCount) md_dot_count 设置屏幕上小圆点总数
    void setCenterDotRadius(int centerDotRadius) md_center_dot_radius 中心大圆点的半径
    void setCenterDotRes(Drawable centerDotRes) md_center_dot_back 中心大圆点的背景资源文件
    void setDotColor(int dotColor) md_dot_color 小圆点的颜色
    void setMaxDotRadius(int maxDotRadius) md_dot_max_radius 小圆点的最大半径
    void setMinDotRadius(int minDotRadius) md_dot_min_radius 最小小圆点半径
    void setMaxDotSpeed(int maxDotSpeed) md_dot_max_speed 小圆点的最大速度(1~10)
    void setMinDotSpeed(int minDotSpeed) md_dot_min_speed 小圆点的最小速度(1~10)
    void setTextSize(int textSize) md_text_size 显示进度的文字大小
    void setTextColor(int textColor) md_text_color 显示进度的文字颜色
    void setBtnTextColor(int btnTextColor) md_btn_text_color 按钮文字颜色
    void setAnimatorDuration(long animatorDuration) md_animator_duration 动画持续的时间

    另外一点需要注意的地方(希望都读完,自定义效果的时候比较重要):

    1.小圆点的最小速度即为不加速时候的移动速度,建议设置为1

    2.小圆点的最大速度为加速动画结束后的小圆点的移动速度,建议一般为7左右

    3.中心大圆点的半径默认为组件宽度的1/3,默认看起来还是比较协调的,可不设置

    4.默认的组件背景为白色,需要设置的话只要像给其他组件设置背景颜色那样设置即可,图片讲道理也是可以的,不过我没试过

    5.中心圆点的背景资源如果要设置的话尽量用shapedrawable做成圆角角度与宽高一样的效果,意思就是中心的组件其实是正方形的,只是设置的资源文件是圆形而已,这一点自定义的时候不是很好控制,如果需要改变中心颜色的同学得注意.

    在项目中添加此组件的方式:

    Step 1. 项目的build.gradle文件做如下修改

        allprojects {
            repositories {
                ...
                maven { url "https://jitpack.io" }
            }
        }
    

    Step 2. 添加依赖

        dependencies {
                compile 'com.github.Brioal:MovingCircleView:1.0'
        }
    

    完毕.谢谢~

    展开全文
  • 内存清理

    2014-11-03 22:04:43
    内存清理窥视Android系统安全现状 当前多种安全软件几乎都实现了这样一种功能:内存清理。这对于用户是十分有用的。甚至@腾讯手机管家 已经将这个功能置于home界面,用一个小火箭来演示清理内存,手机加速的...

        由内存清理窥视Android系统安全现状

    当前多种安全软件几乎都实现了这样一种功能:内存清理。这对于用户是十分有用的。甚至@腾讯手机管家 已经将这个功能置于home界面,用一个小火箭来演示清理内存,手机加速的过程,生动形象。可见内存清理对于用户来说使用率很高。

    安卓安全小分队 在研究这一功能时,有自己的话要说!

    一、目前安全软件的实现方式

        通过一些技术手段,我们发现,大部分软件都是通过调用forceStopPackage(String pacakgeName)函数将某一进程结束掉。这是系统提供的一条API,但是,这一函数的调用有许多限制。想想如果随便一个应用都可以调用他结束其他程序的进程,那Android系统岂不是要大乱。

    1. 系统要进行权限的检查,不是随便的APP都能使用的。

        

        这就是为什么安全软件要获取root权限,因为有了root权限就可以通过这样的检查。有人可能要说这条检查是检查FORCE_STOP_PACKAGE权限,而不是root权限。实则,这条permission没有在SDK中暴露出来,即便注册了这个permission,普通APP也不会被授予这个权限。申请了root权限的APP就具有了最高的权限,在这里不会被过滤掉,畅通无阻。

    2. SDK中没有暴露这个函数,不能正常调用。

        

      对于hideAPI,各大安全软件都有自己的解决办法。@360手机卫士则是通过反射来调用。

    二、我们的想法

        Android系统本身应该是属于安全型的系统,普通的软件(包括安全软件)本应该无法获取很高的权限,系统通过这种方式避免了普通软件对于系统的篡改。可是,由于种种因素,用户主动或被动的root了自己的手机,放开了Android系统对软件的监管,使Android系统变得不安全。就像打开了潘多拉盒子,在得到便利的同时,系统也更加容易受到攻击。

        以@腾讯手机管家为例,他在获得root权限以后注入到system_server进程,可以说他基本可以对系统做任何他想做的事情,整个手机被绑架了。当然,@腾讯手机管家是不会做这样损害用户的事情,可是,手机被root了以后,其他的APP同样有机会像@腾讯手机管家一样获取root权限,同样可以注入系统。当手机被恶意APP绑架了,后果不堪设想。而追溯到事情的起因,还是因为手机被root了,没有被root的手机是不会被注入的。

        @安卓安全小分队致力于从系统方面完善手机安全的技术研究,力求找到一种不需root的安全Android手机系统方案,让用户用的更放心。对于内存清理功能,我们可以针对某个已经被验证过的优秀软件开放一定权限来执行结束进程的操作,通过特殊的签名来分辨官方出品的正规软件。这也是一种权限最小最优化的考量,避免了为了一点点功能就给某个软件开放了最高级别的权限,让用户在享受便利的同时,保证了自己的安全。

        所以我们还是重申我们的主张,手机安全还是要从系统入手,只要系统本身能够提供安全软件的功能,或者有针对性地将系统接口给安全软件使用,那么,安卓系统在安全上的“水土不服”就能够解决了

    展开全文
  • ImageView内存清理

    千次阅读 2016-04-26 16:48:51
    App的引导页,一般会有几张图片来进行引导介绍APP的大致情况,但是此时内存消耗过多,所以需要做一下回收! 在Activity结束后,要想清理内存,首先要让imageView释放掉图片,然后在释放ImageView组件本身。代码...

    一般情况下,ImageView占用内存比较大,所以回收ImageView,就是一个很有必要的事情!
    在App的引导页,一般会有几张图片来进行引导介绍APP的大致情况,但是此时内存消耗过多,所以需要做一下回收!
    在Activity结束后,要想清理掉内存,首先要让imageView释放掉图片,然后在释放ImageView组件本身。代码如下:

       Intent loginIntent = new Intent(IntroActivity.this, LoginActivity.class);
                    UITool.openWindowRightIn(IntroActivity.this, loginIntent);
                    UITool.closeWindowRightOut(IntroActivity.this);
                    viewPager.setAdapter(null);
    
                    viewPager = null;
                    index.clear();
    
                    if (imageView != null) {
                        Drawable d = imageView.getDrawable();
                        if (d != null && d instanceof BitmapDrawable) {
                            Bitmap bmp = ((BitmapDrawable) d).getBitmap();
                            bmp.recycle();
                            bmp = null;
                        }
                        imageView.setImageBitmap(null);
                        if (d != null) {
                            d.setCallback(null);
                        }
                    }
                    imageView = null;
                    Runtime.getRuntime().gc();
                    System.gc();
                    finish();
    

    注意:viewPager的适配器首先要释放掉,如果不先释放,会导致异常出现:

     Process: cn.mobileteam.cbclient, PID: 2243
                                                                          java.lang.IllegalStateException: The application&#39;s PagerAdapter changed the adapter&#39;s contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 4, found: 0 Pager id: cn.mobileteam.cbclient:id/viewpager Pager class: class android.support.v4.view.ViewPager Problematic adapter: class cn.mobileteam.cbclient.core.welcome.activity.IntroActivity$AdvAdapter
                                                                              at android.support.v4.view.ViewPager.populate(ViewPager.java:1071)
                                                                              at android.support.v4.view.ViewPager.populate(ViewPager.java:1025)
                                                                              at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1545)
                                                                              at android.view.View.measure(View.java:17584)
                                                                              at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5551)
                                                                              at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
                                                                              at android.view.View.measure(View.java:17584)
                                                                              at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5551)

    所以,释放掉适配器,再更改内容,回收图片,就没有问题了

    展开全文
  • android 内存清理

    千次阅读 2015-10-29 10:34:39
    在上一篇中介绍了“垃圾清理”,在系统优化中有一个功能往往是与垃圾清理分不开的,那就是“手机加速”。目前流行的管理软件中以及网络上并没有明确的定义什么叫“垃圾清理”什么叫“手机加速”。结合上一篇的“垃圾...

    欢迎转载,转载请注明:http://blog.csdn.net/zhgxhuaa


    说明


    在上一篇中介绍了“垃圾清理”,在系统优化中有一个功能往往是与垃圾清理分不开的,那就是“手机加速”。目前流行的管理软件中以及网络上并没有明确的定义什么叫“垃圾清理”什么叫“手机加速”。结合上一篇的“垃圾清理”这里统一做一个在本系列文章中的定义:

    n 垃圾清理:在本系列文章中认为扫描和清理的是静态内容,包括应用的文件缓存、缩略图、日志等系统或应用创建的文件,这些文件不具有“运行时”特征。

    n 手机加速:在本系列文章中认为清理的是动态内容,包括杀死运行时进程、限制开机自启动、限制后台自启动,以及应用运行时所占用的内存等,这些内容都与进程相关,具有“运行时”特征。

    在对垃圾清理和手机加速做了简单的区分以后,本篇接下来将研究一下手机加速的相关内容。


    清理运行时进程


    清理运行时进程也就是清理后台进程,有些手机管理软件中也叫“一键加速”或者“一键清理”等,其实指的都是这个功能。

    在正式介绍介绍进程清理之前,先简单介绍一些Android中进程的内存管理策略。


    Android内存管理策略


    Android中,进程的生命周期都是由系统控制的,即使用户关掉了程序,进程依然是存在于内存之中。这样设计的目的是为了下次能快速启动。当然,随着系统运行时间的增长,内存会越来越少。Android Kernel 会定时执行一次检查,杀死一些进程,释放掉内存。

    在Android对内存管理引入了Linux中使用的一种名称为OOM(Out Of Memory,内存不足)的机制来完成这个任务,该机制会在系统内存不足的情况下,选择一个进程并将其Kill掉。在Android中对Linux原生的OOM机制根据嵌入式设备的特点进行了一些改造,于是就有了Low Memory Killer。

     内存管理不是本文的重点,想了解Low Memory Killer的朋友可以自己查阅相关资料或者查看源码,这里不做详细介绍。Low Memory Killer在源码中的位置为:@/kernel/goldfish/drivers/staging/android/lowmemorykiller.c。这里要明确的问题由两点:

    A.       Low Memory Killer在用户空间中指定了一组内存临界值,当其中的某个值与进程描述中的oom_adj值在同一范围时,该进程将被Kill掉。

    B.       Android中的oom相关参数在init.rc中进行初始化配置,在系统运行时由ActivityManagerService进行动态调整。


    Android进程优先级


    根据oom_adj,Android将进程分为6个等级,它们按优先级顺序由高到低依次是:

    1)        前台进程( FOREGROUND_APP)

    2)        可视进程(VISIBLE_APP )

    3)        次要服务进程(SECONDARY_SERVER )

    4)        后台进程 (HIDDEN_APP)

    5)        内容供应节点(CONTENT_PROVIDER)

    6)        空进程(EMPTY_APP)

    这六类进程所对应的oom_adj的值在不同的手机中可能会有所不同。下面是在我的小米2S手机上的参数如下:




    注意值越大说明进程重要程度越低。

    在我的小米2S上这几种进程会被杀死的时机如下:




    注意这些数字的单位是page. 1 page = 4 kB

    对于单个进程的oom_adj的值可以查看/proc/pid/oom_adj的值,如下:




    清理运行时进程


    在简单的了解了Android对进程和内存的管理策略以后,我们会发现这样一个问题:Android中的Low Memory Killer策略会定时扫描,并根据其策略选择杀死进程的。那能给我们清理运行时进程带来什么参考呢?

    我们在杀死运行时进程的一种可行性方案:可以根据oom_adj的值制定一个阀值,在用户触发(当然也可以定时触发)时,判断如果进程的oom_adj的值大于阀值,则杀死。杀死进程有两种方式,下面分别介绍:


    选择在Linux层面杀死进程


    可以选择根据1.2中的方式读取/proc/pid/oom_adj的值进行判断,然后通过Linux中的kill函数杀死进程。


    在Android层面,系统是通过如下属性定义进程的重要程度的:

    @/frameworks/base/core/java/android/app/ActivityManager$RunningAppProcessInfo




    其中,importance的取值如下,关于各个值的含义在下面的注释中:




    采用这种方式杀死进程的部分示例代码如下:




    在上面的示例代码中我们是通过ActivityManager类中的killBackgroundProcesses接口来杀死进程的,下面来看一下killBackgroundProcesses:




    这里需要注意如下几点:

    A.     但是通过该方法只能杀死进程优先级低于SERVICE_ADJ的进程。

    B.      使用该方法需要声明KILL_BACKGROUND_PROCESSES权限

    C.      该接口为ActivityManager中的公开接口,不需要任何权限。

    对于大部分情况下,通过调用改接口杀死后台进程就够了,但有时候我们要执行更加严格的进程清理策略,杀死优先级更高的进程,该如何处理呢?下面一节将做介绍。


    一种更加严格的进程杀死方案


    接着上一节最后的问题继续分析,看一下系统是如何选择杀死指定优先级以下的进程的。虽然在Android中并没有提供接口给我们使用,但是可以确信Android自身肯定也会有我们类似的需求。最后我在ActivityManagerService(后面简称“Ams”)中找到了这个功能的系统实现,如下:

    @/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java





    @/frameworks/base/core/java/android/os/Process.java




    通过上面的过程可以看出,Ams在杀死进程时最后实际调用的是android.os.Process中的killProcessQuiet方法。到此就十分清晰了,我们在实现杀死进程时只有自己实现上述过程就可以了。

    通过killProcessQuiet的实现我们可以看出该方法是一个隐藏的方法,在应用中时不能直接调用的。仔细观察Process类,我们又发现了一个类似的实现,即killProcess方法,如下:




    这里的killProcess和killProcessQuiet是一样的,唯一的区别是通过killProcess杀死进程时会有“Sendingsignal. PID: %d SIG: %d"”字样的log打印出来。所以,我们在实现自己的杀进程逻辑时直接使用killProcess方法就可以了。


    一种防止被杀死进程重启的方案


    本节上面的三个小节中介绍了三种杀死进程的可行性方案,通过验证它们也是可行有效的。但是,细心的朋友在验证上面的方案时会发现直接杀死进程时可能会遇见如下一些问题:

    A.       有些进程无法被杀死或者在被杀死后会重启(主要是系统应用和Service)。

    B.       在杀死当前正在运行的进程时可能会出现异常状况。

    那么需要如何解决这种情况呢?通过查看ActivityManager的代码,我发现了这样一个方法,如下:




    仔细看一下forceStopPackage方法的说明,哎呀,简直超出我们的预期。通过使用forceStopPackage方法,不仅可以强制停止应用进程,甚至可以强行停止掉与当前进程相关的其他一些相关的内容,比如:

    • 与当前应用共享uid的其他进程。
    • 所有证照运行的Service
    • 所有的Activity
    • 通知
    • 定时器

    进一步研究forceStopPackage的实现后发现,在调用forceStopPackage时系统会将当前的package状态设置为stopped状态。在Android2.3版本之后,被标记为stopped状态的应用是不能接受广播的,除非在发送广播时指定FLAG_EXCLUDE_STOPPED_PACKAGES标志,但是系统广播是无法认为指定改标志位的。

    下面是forceStopPackage方法的内部实现:

    @/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java




    通过对这个方法的研究我们可以得出如下几点结论:

    A.       在使用forceStopPackage接口时需要声明FORCE_STOP_PACKAGES权限。

    B.       forceStopPackage是一个隐藏接口,需要通过反射等手段实现调用。

    C.       使用forceStopPackage接口需要系统签名.

    D.       forceStopPackage接口除了可以用来杀死进程外,还可以达到禁止开机自启动和后台自启动的目的。

    E.        在使用forceStopPackage接口时可能会有不想要发生的副作用(清空定时器等),慎重使用。

    F.        Package的stopped状态是在Android4.0以后增加的,也就是说在2.3之前的版本forceStopPackage并不能禁用开机广播等。


    一件加速快捷方式动画效果实现


    关于UI相关的内容不是本文的终端,感兴趣的朋友可以参考网上的一篇文章:

    http://blog.csdn.net/ruils/article/details/16922557


    开机自启动管理


    我们无论做什么事情总是要知其然,然后才能之前所以然。因此,在了解如何禁止开启自启动之前需要先来来了解一下开机自启动的原理,以及系统发出BOOT_COMPLETED广播的时机。


    开机自启动的原理


    Android在开机时,在系统启动完成后会发送一个Standard Broadcast,名为"android.intent.action.BOOT_COMPLETED”。所谓“开机自启”就是注册接收BOOT_COMPLETED的静态广播,在收到广播时将自己唤起。

    下面是一小段示例程序:




    在AndroidManifest中注册静态BOOT_COMPLETED广播:




    要使BOOT_COMPLETED广播生效,需要声明RECEIVE_BOOT_COMPLETED权限。




    这里很简单,大家基本上都用过,没有什么可讲的。这里要说的是几点要注意的问题:

    A.       在使用BOOT_COMPLETED广播时,要记得声明RECEIVE_BOOT_COMPLETED权限。

    B.       在Android4.0开始,Android增加了Package stopped状态,处于该状态的应用是接收不到开机广播的。处于stopped状态的应用包括:

    n  调用1.3.4中介绍的forceStopPackage接口停止的应用。

    n  在“设置->应用->应用详情页”中点“停用”按钮,被停用的应用。

    n  新安装完成,从未打开和运行过的应用。

    C.       在Android2.3之前的版本中,不存在上一条所说的限制,可以接收的开机广播。

    D.       在Android4.0以后的版本中,如果想使处于stopped状态的应用也接收到广播,需要在intent中增加FLAG_EXCLUDE_STOPPED_PACKAGES这个Flag。但是这里要注意的是,系统广播使用户无法自定义的。

    E.        BOOT_COMPLETED是一个Standard广播,在开发应用时有时会希望自己的应用在接收到开机广播后比其他同样接收开机广播的应用更早的启动就需要指定”android:priority属性的值为最大整数(priority为整形,取值范围为-10001000)即可。


    开机自启动的时机


    在2.1节中我们了解到开机自启动是通过接受系统广播“BOOT_COMPLETED”实现的,那“BOOT_COMPLETED”是系统什么时候发出的呢?对于Android系统启动的过程,不是本文研究的内容,不做介绍,这里只说一下与开机广播“BOOT_COMPLETED”相关的部分,如下图所示:



    可以看出开机广播是在系统启动完成后,在启动第一个应用进程(桌面)时发出的。


    实现禁止开机自启动


    了解了开机自启动的原理,接下来介绍一下在开发手机管理软件时,如何实现禁止应用开机自启动。通过前面的分析,我们想一下如果想禁用开机广播有哪些可能的实现?从应用接收处理广播的整个过程来说,其实无外乎下面这几种可能:

    A.       阻止系统发出BOOT_COMPLETED开机完成广播。

    B.       不阻止系统发出广播,但是阻止应用接收到BOOT_COMPLETED开机完成广播。

    C.       应用可以接收到BOOT_COMPLETED广播,但是阻止应用进行响应。

    D.       运行应用接收BOOT_COMPLETED广播并且进行响应,但是在应用响应后阻止其运行。

    接下来将依次分析这几种情况的可行性:

    A.       第一种方案在应用的层次难以实现,而且也不太合理,是不可行的。

    B.       第二种方案理论上是可行的,至少到目前为止前面介绍过的forceStopPackage就可以做到。

    C.       第三种方案,理论上也是可行的,但可能会有些难度(进程注入)。

    D.       第四种方案,也是可行的,而且根据之前的分析也是比较容易做到的。

    下面就依次分析一下具体的实现方案:


    通过停止应用实现禁止开机自启动


    对于上面的第二种方案中“不阻止系统发出广播,但是阻止应用接收到BOOT_COMPLETED开机完成广播“的想法,相信大家很快都会想到在1.3.4中介绍过的forceStopPackage这个接口,这个接口除了可以杀死正在运行的进程以外,还有一些“副作用”,其中将应用状态置为“stopped”和清空定时器这些正是我们在实现禁止开机自启动时所需要的。

    由于前面一对forceStopPackage的使用和需要注意的问题等都做了比较详细的说明,这里不再赘述,不清楚的朋友可以参考1.3.4节。


    通过停用广播接收器实现禁止开机启动


    forceStopPackage接口完全可以满足我们的需求,甚至大大超出了我们的需求,不仅禁用了开机自启动,连后台自启动等等也都禁用了。这些副作用很多时候并不是我们想要的,那有没有一种”副作用”相对较小的实现方式呢?于是引出了本小节这种实现方式。

    本方案也是基于第二种方案中“不阻止系统发出广播,但是阻止应用接收到BOOT_COMPLETED开机完成广播“的想法实现的。

    刚开始有这个想法的时候可能会有些无从下手的感觉,没关系既然本方案的核心是“阻止广播接收”,那我们就先来看一下Android中静态的广播接收器是如何定义的,下面是Android官方文档中关于receiver的截图:




    不知道各位读者在看到“android:enable”这个属性的时候有没有像我一样眼前一亮的感觉。就我而言,在平时开发普通的应用程序时几乎没有关注过这个属性,因为很少有这方面的需求。好了,让我们看一下“android:enable”这个属性,如下:

    看完了这段描述,是不是感觉不仅满足了我们的需求,而且又有一个小惊喜呢?是的,就是这句“The<application> element has its own enabled attribute that applies to allapplication components, including broadcast receivers.”。这说明除receiver以外的其他应用组件也都拥有“android:enable”属性。呵呵,到这里是不是为我们禁止后台自启动应用也找到了一种解决方案?

    在了解了“android:enable”这个属性以后,下面看一下它的使用:

    @/frameworks/base/core/java/android/content/pm/PackageManager.java




    在PackageManager中除了setComponentEnabledSetting以外,还提供了另外一个接口setApplicationEnabledSetting,通过setApplicationEnabledSetting可以停用应用中所有的组件,代码如下:




    这里要注意的问题由这么几点:

    A.       通过调用setApplicationEnabledSetting可以将应用中的所有组件置为disable状态。

    B.       与forceStopPackage接口相比,该接口不会清空定时器等,因此如果应用通过定时器定时发送自定义广播,并且在广播中指定FLAG_EXCLUDE_STOPPED_PACKAGES是可以唤醒的。

    C.       使用setComponentEnabledSetting接口必须是system程序并具有system签名。

    D.       使用该接口需要声明CHANGE_COMPONENT_ENABLED_STATE。

    E.        该接口在应用于在AndroidManifest中的入口Activity(intent-filter指定action为“android.intent.category.LAUNCHER”)时,还可以达到隐藏应用快捷方式图标的效果。

    下面是使用该接口的一段代码片段:




    停用广播接收器方案实例研究


    开机自启动管理有一款小而美的软件AutoStart相信很多朋友都听说过,截图如下:



    这款软件就是利用了2.3.2中介绍的原理实现的,下面是一小段反编译后的代码片段:



    不少朋友会有到这里会有这样一个疑问:在上一节中不是说使用setComponentEnabledSetting接口需要system权限(是system程序并具有system签名)吗?AutoStart并不是system,它是怎么做到的呢?一个同事告诉我AutoStart是通过“pm”命令来做的提醒了我,下面看一下pm命令:




    执行pm需要的shell权限,在取得root权限的情况下就可以直接执行使用了。这也提醒我们在分析一个问题遇到阻碍的时候,不防稍微发散一下和听取一下别人的建议。


    停用广播接收器方案继续探讨


    用过Windows系统的朋友都知道在Windows中有一个称为注册表的东西,维护着Windows系统中已安装应用的相关信息。在Android中严格意义上是不存在注册表这样的东西的,但是在维护安装包信息方面,Android中存在着一个类似的文件“/data/system/packages.xml”,如下图:




    在通过setComponentEnabledSetting设置后,最终会在packages.xml中产生如下数据:




    那在取得root权限的情况下,直接修改packages.xml能不能达到停止自启动的效果呢?大家不妨可以自己验证一下,这里应该是不可以的。因为packages.xml是在PackageManagerService服务初始化的时候解析完成的,以后使用的都是保存在内存数据结构中的数据,直接修改packages.xml文件无法达到修改内存中的数据的目的。这里在重启手机下次进入时应该是会生效的(没有验证)。


    通过杀死进程实现禁止开机自启动


    本方案是对第四种方案“运行应用接收BOOT_COMPLETED广播并且进行响应,但是在应用响应后阻止其运行”的分析和讨论。本方案的想法是这样的:

    如果我们在系统启动完成后能够尽早的接收到“BOOT_COMPLETED”,然后监控其他应用进程,如果发现接下来有其他应用被启动,则强行杀死。这样也就达到了禁止应用开机自启动的目的。下面依次分析该方案中的几个关键点:

    A.       如何能够尽早的启动?

    结合2.1和2.2中介绍的原理,这里我们可以采取两方面的措施:

    1)        指定receiver的优先级为最大整数

    2)        指定receiver的category为“android.intent.category.HOME”




    B       如何监控当前进程?

    自身启动一个定时器,定时轮询正在运行的服务,执行清理工作。

    查询开机启动的应用可以通过PackageManager中提供的下面这个接口实现:




    除了杀死开机启动的应用进程外,在定时唤醒时也可以杀死后台启动的进程。在ActivityManager中提供了获取正在运行的Services和Application的方法,如下:






    C       如何杀死进程?

    这里可以采用前面介绍过的android.os.killProcess即可;也可以采用ActivityManager中的killBackgroundProcesses接口。ActivityManager中的restartPackage接口也能达到同样的目的,但已不推荐使用。

    该方案存在的问题:

    A.       采用定时轮询的方式实现,自身比较耗电。

    B.       除了可以用来限制开机自启动,也可以用来限制后台自启动。

    C.       在获取开启自启动列表时,可以先判断是否具有“android.permission.RECEIVE_BOOT_COMPLETED”权限。


    杀死进程方案实例研究


    采用杀死进程方案的应用中也存在一个非常有名的应用”AutorunManager”,截图如下:



    AutorunStartupIntentReceiver接收到开启广播后,启动AutorunService服务:




    AutorunService服务启动后,启动一个Timer执行h任务:




    h任务读取程序开机自启动设置,如果程序不允许开机启动,则杀死该程序进程:




    后台自启动管理


    所谓名不正则言不顺,在分析后台自启动之前,这里先对开机自启动和后台自启动做一个概念上的区分。网上没有找到相关的定义,这里主要是根据自己的理解来给出一下本系列文章中的定义。

    • 开机自启动:

    1)        从启动时机来说:发生在刚启动完成时。

    2)        从启动原理来说:由开机启动广播“BOOT_COMPLETED”触发。

    • 后台自启动

    1)        从启动时机来说:发生在启动完成后正常运行时。

    2)        从启动原理来说:由“BOOT_COMPLETED”广播以外的其他场景触发,常见的常见有:锁屏解锁、网络状态变化、定时器等。

    开机自启动与后台自启动实际上并没有本质上的区别,在第2章中介绍过的方法也同样适用于后台自启动。这里只说几点需要注意的问题:

    A.       在使用forceStopPackage接口时有一种情况比较难以避免,就是应用之前相互唤起的问题。

    B.       在使用setComponentEnabledSetting接口时需要注意对用户自定义广播的处理。

    C.       在使用killPrcocess方式时需要注意误杀情况的处理。


    总结


    垃圾清理和手机加速的功能到现在就差不多介绍完了,这里想说一些个人的想法,希望能够引起本系列文章读者的一些思考。

    Android中的”垃圾清理“和”手机加速”本身就是一个悖论。你认为是垃圾的东西,可能正是产生垃圾的软件所想保留的;你认为通过手机加速为用户清理了内存空间,殊不知充分利用内存正是Linux内存管理的机制,不提供应用直接杀死进程,将进程统一由系统创建和回收,也是Android为快速创建进程的一种优化。我从不认为Linux内核的开发者或者Android框架的开发者会比我们更加白痴(无知),在系统的设计之初和系统的演化过程中,这里肯定经历过了无数次的讨论与权衡验证,证明了目前所采用的方案是一种可以平衡各方需求的相对优良的做法。

    看到目前市面上形形色色的各类手机管理软件、电子市场各显神通地打着“用户体验”的幌子,为了满足用户心理上那种“爽”的需求,提供甚至自动去清理垃圾和手机加速。应用们为了搜集用户信息和推送等苦心积虑的监听各种广播和定时器来保证自身应用的驻留。这两者的相互博弈,导致应用的整体情况更加恶劣。看到目前Android应用的各种乱象,作为一名Android开发者,真的很痛心疾首。

    并不一定所有的朋友都能认同我的观点,甚至很多人会觉得正是这些不规范造就了Android生态的繁荣,也同样造就了一批类似于360这样的手机安全公司。但是,我还是所有开发者希望在开发应用的过程中能够指定一个“合适的策略”,因为作为用户的我们已经被你们搞的够乱了

     

    到此,手机加速就介绍完了,欢迎大家交流讨论。下一篇将介绍《应用杂篇》,即不属于前几篇的一些应用管理方面的功能,如应用锁、山寨应用识别、应用安装位置判断、应用智能推荐等。

    展开全文
  • 一个给开发者使用的Android App内存清理、监控工具,可以获取当前手机的内存使用比率,可用内存大小,检查一个APP是否存在内存泄漏。并且整理了一些优化内存的方式。 1.内存清理 类似360卫士的 加速球,获取...
  • Android 一键清理、内存清理功能实现

    万次阅读 热门讨论 2014-02-12 17:18:14
    360桌面、金山清理大师等都提供了一键清理、一键加速等功能,其实就是杀一些后台进程来达到释放内存的目的。 基本思路就是列出所有运行的进程,查看其重要值(RunningAppProcessInfo.importance,值越大说明进程重要...
  • iOS开发之MAC的内存清理,Xcode清理

    千次阅读 2018-11-21 15:09:14
    长期不清理Xcode中的一些文件你会发现自己的mac硬盘越来越小,而且是这个其他占了绝大部分的硬盘,在网上搜索了很多办法都没找到如何清理这些其他 后来来来回回在文件夹中找发现~/Library/Developer/Xcode这个Xcode...
  • shell 清理app缓存

    万次阅读 2017-09-19 18:35:53
    使用shell清理app缓存 adb shell pm clear 包名查看测试机当前最上层页面: adb shell dumpsys activity |grep -10 “activities from top to bottom”
  • ubuntu 16.04 内存清理方法总结

    千次阅读 2018-08-15 10:19:50
    1、Ubuntu下利用命令行清空回收站 ...若你想清理出更多的空间,而且网速又比较快的话,那你大可以把电脑上存储的安装包全部卸载咯,命令为 sudo apt-get clean 4、清理孤立包 还有一类...
  • 获取APP缓存大小以及清理APP缓存

    千次阅读 2016-09-21 11:15:34
    在贴一大段代码之前,先普及...内置SD卡(注:现在的手机基本上都有,就是我们所谓的ROM,是不可以移除的,RAM是我们手机的运行内存) 外置SD卡(注:这个就是我们的SD卡了,可以移除) 我们来考虑一个问题
  • 每日清理大师是一款智能便捷的手机清理软件,可快速清理无用缓存、垃圾文件和应用残留,还可深度清理如社交软件中的无用缓存等,有效解决手机卡顿、耗电快、内存不足等问题。每日清理大师App在结合了系统完整性检测...
  • App内存优化整理

    千次阅读 2017-03-11 12:10:49
    一个app通常就是一个进程对应一个虚拟机,使用adb shell --> ps可以查看所有进程信息,具体内存相关信息可以使用dumpsys meminfo packagename查看,如下: generic_x86:/ $ dumpsys meminfo xxx Applications Memory...
  • MemoryMonitor--内存清理和Pss监控工具

    千次阅读 2016-08-24 12:29:56
    摘要 一个给开发者使用的内存清理、Pss监控工具,可以获取当前手机的内存使用比率,可用内存大小,检查一个APP是否存在内存泄漏...一个给开发者使用的Android App内存清理、监控工具,可以获取当前手机的内存使用比率
  • Android之自定义view内存清理

    千次阅读 2016-12-01 15:18:23
    查杀结束之后,再获取当前内存大小,与之前做对比,得出清理内存的大小。 public class TaskClean extends AsyncTask < String , Void , Long >{ @Override protected Long doInBackground...
  • Android-APP内存优化

    千次阅读 2018-04-09 14:27:10
    为什么要进行内存优化 APP运行内存限制,OOM导致APP崩溃 APP性能:流畅性、响应速度和用户体验
  • Ubuntu16.04 内存清理

    千次阅读 2018-05-31 21:21:23
    sudo apt-get remove thunderbird totem rhythmbox empathy braserosimple-scan gnome-mahjongg aisleriot gnome-mines cheesetransmission-common gnome-orca webbrowser-app gnome-sudokulandscape-client-ui-...
  • Android App性能优化之内存优化

    千次阅读 2017-03-09 10:45:27
    1.App运行内存限制,OOM导致App崩溃2.App性能:流畅性、响应速度和用户体验Android的内存管理方式Android系统内存分配与回收方式● 一个App通常就是一个进程对应一个虚拟机可以通过下面的命令在终端来查看Android...
  • 管理App内存

    千次阅读 2016-07-11 11:44:45
    尽管Android的Dalvik虚拟机会执行GC,但是仍然不允许忽略应该在什么时候,什么地方分配和释放内存为了垃圾回收能够回收app内存,需要避免内存
  • Android清理内存

    千次阅读 2016-05-07 18:34:40
    Android内存清理,利用ActivityManager获取当前正在运行的进程,清理这些进程释放内存。 可以根据importance的不同来判断前台或后台RunningAppProcessInfo 里面的常量IMOPORTANCE就是上面所说的前台后台,其实...
  • 随机存储器(RAM)在任何软件运行环境中都是一块非常重要的区域,尤其是在内存受限的移动操作系统上。尽管Android的Dalvik虚拟机会进行垃圾回收,但是...为了可以使垃圾回收清理APP所使用的内存空间,你需要防止内存

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,915
精华内容 16,366
关键字:

内存清理器app