首页
社区
课程
招聘
[原创]如何给android4.2模拟器开启多用户
发表于: 2012-11-16 22:54 13719

[原创]如何给android4.2模拟器开启多用户

2012-11-16 22:54
13719

上周同时拿到了android4.2的SDK和源代码,启动了个手机版的模拟器,结果发现多用户用不起来,后来查看源代码发现卡在一个地方:
#vi frameworks/base/core/java/android/os/UserManager.java

/**
     * Returns the maximum number of users that can be created on this device. A return value
     * of 1 means that it is a single user device.
     * @hide
     * @return a value greater than or equal to 1
     */
    public static int getMaxSupportedUsers() {
        // Don't allow multiple users on certain builds
        if (android.os.Build.ID.startsWith("JVP")) return 1;
        return SystemProperties.getInt("fw.max_users",
                Resources.getSystem().getInteger(R.integer.config_multiuserMaximumUsers));
    }
如果是JVP的build,任你怎么折腾都不能用multi-user这个新feature,除非把buildid改掉,然后看呆了两个关键字:fw.max_users和multiuserMaximumUsers
于是去源代码搜索一把:
#grep -r -n fw.max_users .
./frameworks/base/core/java/android/os/UserManager.java:334:        return SystemProperties.getInt("fw.max_users",

#grep -r -n multiuserMaximumUsers .
./frameworks/base/core/res/res/values/config.xml:937:    <integer name="config_multiuserMaximumUsers">1</integer>
./frameworks/base/core/res/res/values/symbols.xml:295:  <java-symbol type="integer" name="config_multiuserMaximumUsers" />
./frameworks/base/core/java/android/os/UserManager.java:335:                Resources.getSystem().getInteger(R.integer.config_multiuserMaximumUsers));
./device/asus/grouper/overlay/frameworks/base/core/res/res/values/config.xml:233:    <integer name="config_multiuserMaximumUsers">8</integer>
./device/asus/tilapia/overlay/frameworks/base/core/res/res/values/config.xml:236:    <integer name="config_multiuserMaximumUsers">8</integer>
./device/samsung/manta/overlay/frameworks/base/core/res/res/values/config.xml:169:    <integer name="config_multiuserMaximumUsers">8</integer>

嘿嘿,如果是asus的grouper(Nexus 7)和tilapia,还有samsung的manta的话,是支持多用户的,最多8个,其余的暂时免谈,那么想要在模拟器上玩多用户怎么办?

笔者手动搞了个办法,有看到fw.max_users这个system property吗?办法来了
启动android4.2的模拟器,然后连上adb
在adb shell下敲如下命令:
# setprop fw.max_users 8       (最大支持的用户数,数字你想多大设多大)
# stop (停掉android java虚拟机)
# start (启动android java虚拟机)

然后用pm/am命令添加/切换用户是不是发现已经可以工作了?
不过这个方法只是临时之策,重启模拟器(snapshot的除外)后。发现又不能添加用户了(除非再做一次上面的事情),怎么办?笔者想过把fw.max_users写到/data/local.prop里面发现没作用,后来看源代码发现
宏ALLOW_LOCAL_PROP_OVERRIDE阻止了读取/data/local.prop里面的内容。
# vi system/core/init/property_service.c
static void load_override_properties() {
#ifdef ALLOW_LOCAL_PROP_OVERRIDE
    const char *debuggable = property_get("ro.debuggable");
    if (debuggable && (strcmp(debuggable, "1") == 0)) {
        load_properties_from_file(PROP_PATH_LOCAL_OVERRIDE);
    }
#endif /* ALLOW_LOCAL_PROP_OVERRIDE */
}

好吧,那就只能从别的prop文件做文章了,或者修改config.xml
/default.prop (改这个文件只需重做ramdisk.img)
/system/build.prop (改这个文件要重做system.img)
/system/default.prop (改这个文件要重做system.img)
/data/local.prop (模拟器不支持)
/data/property (只支持读persist开头的system property)
config.xml (改这个文件要重做system.img)

选择改代价最小的/default.prop吧
# cd /tmp
# mkdir ramdisk
# gzip -dc /opt/android-sdk-update-manager/add-ons/addon-google_apis-google-17/images/armeabi-v7a/ramdisk.img | cpio -i
# vi default.prop
添加fw.max_users=100 (数字自己想写多大写多大)
# find . | cpio -o -H newc | gzip > ../ramdisk.img
将新生成的ramdisk.img替换avd下的那个,
重启模拟器,发现是不是可以添加/切换用户了?

附件是添加fw.max_users=100的ramdisk,请把.zip后缀去掉。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 6
支持
分享
最新回复 (2)
雪    币: 33
活跃值: (145)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
手机多用户有价值吗?还是有些许的!比如防止钓鱼。一个用户模式安装一些受控软件,另一个随便装!
2013-1-18 20:40
0
雪    币: 104
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
貌似这种东西必须得搭建环境,表示过程很艰难。
电视上好多说,一个工具可以解开apk的源码。。。
好可怕。
2013-2-1 22:04
0
游客
登录 | 注册 方可回帖
返回
//