SetupWizard调试技巧

MSetupWizard源码路径device/厂商/common/apps/MSetupWizard

MSetupWizard安装完android系统后第一次启东时出现的让用户选择系统语言等信息的一个apk。因此它很特殊,它只在两种情况下才会出现:

1.安装完系统后第一次启动系统时出现

2.reset(恢复出厂设置)后第一次启动出现

如果还有其他情况,请告诉我!

正因为这样,如果想修改该apk的源码,调试是一件很麻烦的事情,使用am命令启动不了它,怎么启动它是我调试它最大的问题了。

方法1: 方法其实非常简单,就是恢复出厂设置,然后系统会重启,重启后会弹出设置系统语言的选项,这个时候不要点下一步,让页面停止在这个页面,在这个页面做其他操作没有关系,就是不要让该页面退出就好了。然后安装自己修改后编译出来的apk,安装后的apk会自动打开(不知道为什么,我操作过程就是这样),这样反复调试即可。(我就是用的这种方法,感觉算是比较方便的)

        方法2:当然,另外一种方法就是重新编译一版系统,该软件中把禁止该activity的代码注释掉。这就比较麻烦了。

       方法3:如果我不想恢复出厂设置,也不想重烧系统,那怎么办呢?办法是改个包名就好啦!如果代码比较简单,推荐这种方法。改完包名后,还是要把禁止该activity的那部分代码注释掉,不然,这个包名一会又不可用啦!

这么大费周折的根本就是这个activity自己禁止了自己。以下是对各部分代码的简单介绍:

MSetupWizard之所以如此特殊,只会出现一次,原因是这样的:MSetupWizard的主acitivity是DefaultActivity,在该activity中:

    private void finishSetupWizard() {
        // Add a persistent setting to allow other apps to know the device has been provisioned.
        Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
        Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);

        // remove this activity from the package manager.
        PackageManager pm = getPackageManager();
        ComponentName name = new ComponentName(this, DefaultActivity.class);
        pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
        finish();
    }
这个函数在退出该activity之前被调用,这个函数的功能就是: remove this activity from the package manager.注释中说的很清楚,核心代码就是
    pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
    文档中是这样解释这个函数的:
<span style="white-space:pre">	</span><pre name="code" class="java"> public abstract void setComponentEnabledSetting (ComponentName componentName, int newState, int flags)
 Added in API level 1

Set the enabled setting for a package component (activity, receiver, service, provider). This setting will override any enabled state which may have been set by the component in its manifest.
Parameters
componentName 	The component to enable
newState 	The new enabled state for the component. The legal values for this state are: COMPONENT_ENABLED_STATE_ENABLED, COMPONENT_ENABLED_STATE_DISABLED and COMPONENT_ENABLED_STATE_DEFAULT The last one removes the setting, thereby restoring the component's state to whatever was set in it's manifest (or enabled, by default).
flags 	<span style="white-space:pre">	</span>Optional behavior flags: DONT_KILL_APP or 0. 

 
更加具体的信息可以在查阅api文档,它的作用就是把特定 
Component禁止掉,使它不可用。 




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值