Android的复制保护如何检查设备是否已root?

4
http://developer.android.com/guide/publishing/licensing.html的“替代复制保护措施”章节中,它提到:

Android Market上遗留的复制保护机制的限制是,使用该机制的应用只能安装在提供安全内部存储环境的兼容设备上。例如,受版权保护的应用程序无法从市场下载到提供根访问权限的设备,并且无法安装到设备的SD卡上。

如何检查设备是否已root,以确定Android中已经过时的复制保护呢?据我所知,这是不可能的,也正如Dianne Hackborn所说(请参见如何在应用程序中检测设备是否已root?)。所以,这只能意味着,检查是通过某些(公众不知道的)模糊的标准检查完成的,显然不仅仅是简单地检查“su”命令是否存在,我想。有人了解更多关于该检查逻辑的信息吗?或者该检查有多安全?

你认为设备是否已经root对于人们是否会盗版有影响,这是为什么呢?LVL实际上没有必要检查是否已经root。旧式复制保护的限制基本上只是市场搜索机制的限制。 - Mike dg
因为只有在已经root的设备上才能访问应用程序的私有存储(/data/... 文件夹)。这是在某些时候需要将内容以解密格式临时放置的地方。所以我们希望应用程序只能在未root或越狱的设备上运行,无论用户是否只是出于非盗版目的而root了设备。我们会在销售信息中明确说明该应用程序不适用于rooted设备。 - Mathias Conradt
是的,LVL 的工作方式不同,并依赖于混淆。我只是想知道,已弃用的复制保护是如何进行根检查的。 - Mathias Conradt
但是修改后的应用程序至少会有不同的签名密钥。我认为即使它具有相同的包名称,它也无法使用相同的私有存储。但我可能是错的。从未测试过。 - Mathias Conradt
更多详细解决方案可以在https://dev59.com/4nNA5IYBdhLWcg3wEpgU找到,即使如此也不能完全检测到已root的手机。如果SU位置不在标准位置,则此方法将失败。 - mask
显示剩余4条评论
3个回答

2
这是我使用的东西:
public static boolean isDeviceRooted () {
    boolean ret = false;
    String path = null;
    Map<String,String> env = System.getenv();

    if (env != null && (path = env.get("PATH")) != null) {
        setDevicePath(path);
        String [] dirs = path.split(":");
        for (String dir : dirs){
            String suPath = dir + "/" + "su";
            File suFile = new File(suPath);
            if (suFile != null && suFile.exists()) {
                setSuLocation(suPath);
                ret = true;
            }
        }
    }
    return ret;
}

理论上来说,这并不适用于所有情况,因为用户可能会将“su”放在非标准位置,而不在PATH中,但实际上如果他这样做了,需要知道“su”位置的其他应用程序也找不到它,因此root的目的将被打败。

0
我们会在销售信息中明确说明该应用程序无法在已经取得Root权限的设备上运行。
这肯定会影响您的安装率。虽然您计划以1000美元的价格出售您的应用程序,但这将比您可以做的任何其他事情都要糟糕得多。

当然我知道,但是有什么替代方案吗?一旦应用程序/破解版出现在海盗湾或其他种子站点上,你就再也没有任何销售额了;我认为这并不比之前好多少。特别是因为该应用程序只针对中国大陆市场,如果你在那里生活和工作过一段时间,你会体验到它的运作方式(不是说其他地方更好,但是特别是这个目标区域注定会遭受这样的命运)。 - Mathias Conradt
顺便提一下:该应用程序已经受到iOS的保护,明确不支持越狱手机运行,销售情况仍然良好,不是一个大问题。因此,我们只想在Android上复制相同的情景。 - Mathias Conradt
好的,对于中国/俄罗斯/印度市场来说,严格的版权保护是完全可以理解的。对于不那么贫困的国家,非市场安装非常非常少。 - pilkch

0

虽然Superuser应用程序的存在不是检测手机是否已获取Root权限的完美方法,但它是一个相当好的指示器。为什么不检查包com.noshufou.android.su是否已安装?

我从未尝试过,但我认为这应该可行。


过时的复制保护非常薄弱,使用它几乎没有任何好处。 - slayton
你是否试图防止你的应用在已经取得 root 权限的设备上安装? - slayton
复制保护:我知道,我不想使用它,只是想了解他们如何检查设备是否已经root。我在这里的SO和邮件列表中阅读了相关主题,从我的理解来看,这似乎并不真正可行。我猜这就是为什么它如此薄弱的原因。我的主要关注点不是安装本身,而是用户能够访问应用程序的私有存储。实际上,我的另一个问题与此密切相关,背景略有不同:https://dev59.com/Hmsz5IYBdhLWcg3w17jQ - Mathias Conradt
我建议销售搭载您的应用程序的设备。将价格从1000美元提高到1500美元,并包括一台Nexus S。 - Mike dg
你需要问自己的问题是,你想要花多少精力来保护你的内容。你可以轻松地花费比制作内容更多100倍的时间来保护内容。或者你可以花费大大少于这个时间。最终,你将不得不做出牺牲,没有任何系统是百分之百安全的。与其对抗盗版的不可避免的真相,不如考虑通过其他手段提出聪明的替代方案,以阻止盗版,而不是使用DRM或尝试加密/保护你的内容。 - slayton
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接