应用app把user系统识别为root设备导致不能正常使用

最近遇到的一个比较怪异的问题:

中国建设银行app的4.1.6版本开始,把我们的user版本识别为root设备,导致中国建设银行app不能正常使用。(银行类app会比较容易出现这类问题)

解决思路:

1.对于系统来说,三方应用应该只能是通过判断属性值来确定系统是否是root设备,所以最开始在SystemProperties.java中的get方法都加上log,这样只要应用获取了哪个属性,都会有log输出。但是查看打印出来的log信息,并没有看到相关属性值被打印。

2.试试是否是通过ro.build.fingerprint属性值中的字段来进行判断的。通过getprop获得ro.build.fingerprint的值为:
[ro.build.fingerprint]: [abc/XXXXXXXXX/XXXXXXXXX:9/ABC1.222222.001/asdfghj12345678:user/test-keys]
那么问题可能出在最后的test-keys上,因为一般来说user版本的话,最后这个字段会被设置成release-keys而不是test-keys。
ro.build.fingerprint值中的test-keys是由ro.build.tags值拼接,通过getprop获得的ro.build.tags的值为:
[ro.build.tags]: [test-keys]

这样思路就是,修改ro.build.tags的值来试试,是否是test-keys导致。

在build\core\Makefile中,由于ro.build.tags=$BUILD_VERSION_TAGS,而BUILD_VERSION_TAGS += $(BUILD_KEYS),即ro.build.tags的值是由BUILD_KEYS的值决定,通过修改build\core\Makefile及build\make\core\Makefile(这两个文件任意修改一个,另外一个都会同步成一样的)文件中BUILD_KEYS值,使ro.build.tag的值为release-keys后,通过验证发现可以解决这个问题:
ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/testkey)
#BUILD_KEYS := test-keys
BUILD_KEYS := release-keys

else
BUILD_KEYS := dev-keys
endif

相当于是中国建设银行app在初始化中获取了ro.build.tags的值进行判断,如果是test-keys,就判定为root设备,不能正常使用而直接退出app;如果是release-keys就可以正常使用。
但是为什么在SystemProperties.java的get方法中没有输出打印信息呢?
由于没有源码,猜测中国建设银行app直接使用的Build.TAGS值。
在Build.java中,有对TAGS值的定义:

/** Comma-separated tags describing the build, like "unsigned,debug". */
    public static final String TAGS = getString("ro.build.tags");

    /** A string that uniquely identifies this build.  Do not attempt to parse this value. */
    public static final String FINGERPRINT = deriveFingerprint();

    /**
     * Some devices split the fingerprint components between multiple
     * partitions, so we might derive the fingerprint at runtime.
     */
    private static String deriveFingerprint() {
        String finger = SystemProperties.get("ro.build.fingerprint");
        if (TextUtils.isEmpty(finger)) {
            finger = getString("ro.product.brand") + '/' +
                    getString("ro.product.name") + '/' +
                    getString("ro.product.device") + ':' +
                    getString("ro.build.version.release") + '/' +
                    getString("ro.build.id") + '/' +
                    getString("ro.build.version.incremental") + ':' +
                    getString("ro.build.type") + '/' +
                    getString("ro.build.tags");
        }
        return finger;
    }

所以也就明白了为什么在SystemProperties.java的get方法中没有输出打印信息,因为TAGS在定义的时候就直接getString进行赋值了。
三方应用在使用Build.TAGS的时候,已经是初始化的值了,不需要再进行get了。

故最终通过分析验证,是因为ro.build.tags属性值被设置成test-keys导致。

后续遇到这种类似的问题,可以多往属性值方面思考。
 

你可能感兴趣的:(应用app把user系统识别为root设备导致不能正常使用)