网站首页 > 技术文章 正文
Andriod5.0多用户 双开应用
android多用户是5.0之后有的,类似windows的账户系统
不过官方还没有完全确认,API大都是hide状态
我这里提供一种方式并不适用所有的,由于我们有定制化手机,所以有定制化的服务可以开发,所以只需要将源码平台化编译一把,将所需要的类抽取出来,打成jar,再通过AIDL方式暴露出相应的接口,当然这个服务也是系统服务。我们再去开发只需要调用相应AIDL提供相应的接口即可。
下面来详细的说明:
1.首先系统服务
android:sharedUserId="android.uid.system"
签名的时候需要平台对应的签名文件需要signapk.jar签名之后生成apk安装即可
2.将需要的类打成jar(5.0以上版本编译后的class)
在out/target/common/obj/Java_Libraries/framework_intermediates..找到相应的对应的class
源文件
package android.os; import android.os.Bundle; import android.content.pm.UserInfo; import android.content.RestrictionEntry; import android.graphics.Bitmap; /** * {@hide} */ interface IUserManager { UserInfo createUser(in String name, int flags); UserInfo createProfileForUser(in String name, int flags, int userHandle); void setUserEnabled(int userHandle); boolean removeUser(int userHandle); void setUserName(int userHandle, String name); void setUserIcon(int userHandle, in Bitmap icon); Bitmap getUserIcon(int userHandle); List<UserInfo> getUsers(boolean excludeDying); List<UserInfo> getProfiles(int userHandle, boolean enabledOnly); UserInfo getProfileParent(int userHandle); UserInfo getUserInfo(int userHandle); boolean isRestricted; int getUserSerialNumber(int userHandle); int getUserHandle(int userSerialNumber); Bundle getUserRestrictions(int userHandle); boolean hasUserRestriction(in String restrictionKey, int userHandle); void setUserRestrictions(in Bundle restrictions, int userHandle); void setApplicationRestrictions(in String packageName, in Bundle restrictions, int userHandle); Bundle getApplicationRestrictions(in String packageName); Bundle getApplicationRestrictionsForUser(in String packageName, int userHandle); boolean setRestrictionsChallenge(in String newPin); int checkRestrictionsChallenge(in String pin); boolean hasRestrictionsChallenge; void removeRestrictions; void setDefaultGuestRestrictions(in Bundle restrictions); Bundle getDefaultGuestRestrictions; boolean markGuestForDeletion(int userHandle); }
3.写好相应的方法调用:
/** * 得到 IUserManager * @return IUserManager */ private IUserManager getIUserManager{ IUserManager iUserManager = null; IBinder binder = null; try { if(iUserManager==null){ Class<?> ServiceManagerClass = Class.forName("android.os.ServiceManager"); Method method = ServiceManagerClass.getMethod("getService", String.class); if(binder==null){ binder = (IBinder) method.invoke(ServiceManagerClass, Context.USER_SERVICE); } iUserManager = IUserManager.Stub.asInterface(binder); return iUserManager; } } catch (Exception e) { e.printStackTrace; } return null; }
public UserInfo createUser(String name, int flags){ UserInfo info = null; IUserManager iUserManager = getIUserManager; if(info == null){ try { info = iUserManager.createUser(name, flags); loguser(iUserManager); return info; } catch (RemoteException e) { e.printStackTrace; } } return null; }
public UserInfo getUserInfo(int userHandle){ UserInfo info = null; IUserManager iUserManager = getIUserManager; if(info == null){ try { info = iUserManager.getUserInfo(userHandle); loguser(iUserManager); return info; } catch (RemoteException e) { e.printStackTrace; } } return null; }
public boolean removeUser(int userHandle){ IUserManager iUserManager = getIUserManager; boolean isremove = false; try { isremove = iUserManager.removeUser(userHandle); loguser(iUserManager); return isremove; } catch (RemoteException e) { e.printStackTrace; } return false; }
4写一个AIDL我这里是通过回调方式写的,不熟悉的同学可以回去看看AIDL
case SERVICE_EXTENDED_API_CREATE_USER_MODE:{ //TODO if(para!=null){ String name = para.getString(KEY_USER_NAME); int flags = para.getInt(KEY_USER_FLAG); UserInfo info = muserPolicy.createUser(name, flags); if(info!=null){ if (cb != null) { Bundle data = new Bundle(1); data.putParcelable(KEY_USER_INFO, info); try { cb.onResultOfCallExtendedApi(SERVICE_EXTENDED_API_CREATE_USER_MODE, data); } catch (RemoteException e) { e.printStackTrace; } } } } return 0; }
case SERVICE_EXTENDED_API_GET_USER_INFO:{ if(para!=null){ int userHandle = para.getInt(KEY_USER_HANDLER); UserInfo info = muserPolicy.getUserInfo(userHandle); if(info !=null){ if (cb != null) { Bundle data = new Bundle(1); data.putParcelable(KEY_USER_INFO, info); try { cb.onResultOfCallExtendedApi(SERVICE_EXTENDED_API_GET_USER_INFO, data); } catch (RemoteException e) { e.printStackTrace; } } } } return 0; }
case SERVICE_EXTENDED_API_REMOVE_USER:{ if(para!=null){ int userHandle = para.getInt(KEY_USER_HANDLER); boolean isremove = muserPolicy.removeUser(userHandle); if (cb != null) { Bundle data = new Bundle(1); data.putBoolean(KEY_USER_IS_REMOVE, isremove); try { cb.onResultOfCallExtendedApi(SERVICE_EXTENDED_API_REMOVE_USER, data); } catch (RemoteException e) { e.printStackTrace; } } } return 0; }
5.再在需要的应用上调用服务端相应的接口:
启动的时候需要bind系统服务
private void init{ Intent intent1 = new Intent; intent1.setPackage("com.xxx.xxx"); intent1.setAction("com.xxx.xxxService"); bindService(intent1, conn1, Context.BIND_AUTO_CREATE); } case R.id.btn_create: Bundle create = new Bundle; create.putString("username", "Zeng"); try { if(ips!=null){ ips.callExtendedApi(22, create, ipsc); }else{ Log.e("peng","onclickcreate serviceisnull"); } } catch (RemoteException e) { e.printStackTrace; } break; case R.id.btn_get: Bundle get = new Bundle; get.putInt("userHandle", mhandle); try { if(ips!=null){ ips.callExtendedApi(23, get, ipsc); }else{ Log.e("peng","onclickget serviceisnull"); } } catch (RemoteException e) { e.printStackTrace; } break; case R.id.btn_remove: int i = Integer.parseInt(et_text.getText.toString.trim); Bundle remove = new Bundle; remove.putInt("userHandle", i); try { if(ips!=null){ ips.callExtendedApi(24, remove, ipsc); }else{ Log.e("peng","onclickremove serviceisnull"); } } catch (RemoteException e) { e.printStackTrace; } break;
对应的callback可以返回对应的数据。
猜你喜欢
- 2024-09-29 reFlutter:一款针对Flutter的逆向工程分析工具
- 2024-09-29 APP编译打包流程 编译apk
- 2024-09-29 抖音团队内测新版本 应用于PC、平板端
- 2024-09-29 MT管理器-简单实战-去除启动页 怎么用mt管理器去掉软件启动广告
- 2024-09-29 windows11 安装安卓应用apk,访问google play商店!详细安装教程
- 2024-09-29 微信发布安卓内测版 7.0.23 更新 安卓微信7.0.21内测
- 2024-09-29 APK 是怎么来的?Android 构建流程解析
- 2024-09-29 软件测试 | 应用程序签名机制实现的源代码分析
- 2024-09-29 Android 用命令给apk签名 apk签名工具怎么使用
- 2024-09-29 android 安装包优化 android优化工具
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)