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.