在安卓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
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐