在安卓app中判断当前系统是ohos还是android? 原创
没用的喵叔
发布于 2021-5-10 16:12
浏览
2收藏
第一版:
public static boolean isOhos() {
boolean isOhos = false;
try {
Class.forName("ohos.aafwk.ability.Ability");
isOhos = true;
} catch (ClassNotFoundException ignored) {
}
return isOhos;
}
第二版,2021-05-11更新:
如评论区的朋友说,Ability类可以被伪造。那么,也简单,咱们再判断一下它的ClassLoader必须是BootClassLoader就可以了。
只要系统没被root,这样应该没有漏洞了吧?
public static boolean isOhos() {
boolean isOhos = false;
try {
Class<?> abilityClass = Class.forName("ohos.aafwk.ability.Ability");
ClassLoader classLoader = abilityClass.getClassLoader();
//如果Ability为系统提供的,其classloader为BootClassLoader
//如果Ability为伪造的,其classloader一般为PathClassLoader
System.out.println("abilityClassLoader: " + classLoader);
//BootClassLoader的parent为null
if (classLoader != null && classLoader.getParent() == null) {
isOhos = true;
}
} catch (ClassNotFoundException ignored) {
}
return isOhos;
}
第三版,2021-06-27更新:
评论区的朋友说,“EMU11.x 不是鸿蒙也会被判定为鸿蒙”。
参考:京东APP鸿蒙版上架实践,可以用如下代码进行判断。再次欢迎测试。
private static final String HARMONY_OS = "harmony";
public static boolean isHarmonyOS() {
try {
Class clz = Class.forName("com.huawei.system.BuildEx");
Method method = clz.getMethod("getOsBrand");
ClassLoader classLoader = clz.getClassLoader();
//如果BuildEx为系统提供的,其classloader为BootClassLoader
//如果BuildEx为伪造的,其classloader一般为PathClassLoader
System.out.println("classLoader: " + classLoader);
//BootClassLoader的parent为null
if (classLoader != null && classLoader.getParent() == null) {
return HARMONY_OS.equals(method.invoke(clz));
}
} catch (ClassNotFoundException e) {
} catch (NoSuchMethodException e) {
} catch (Exception e) {
}
return false;
}
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
已于2021-6-28 10:06:47修改
赞
3
收藏 2
回复
举报
相关推荐
这样是不是比较容易仿冒 搞个同名类就行了?
上午更新一版新方法,欢迎再来查找漏洞
EMU11.x 不是鸿蒙也会被判定为鸿蒙
已更新,EMU11.x 上的bug修复了