android如何将资源打入jar并对资源进行保护

来源:互联网 发布:js移除节点 编辑:程序博客网 时间:2024/05/16 15:19

引言

有很多项目需要将Android工程打包成SDK,将java代码编译后打成一个jar包提供给二次开发商,但是,因为android工程会含有资源文件,那资源文件怎么提供给对方?怎么直接打到jar中?怎么保证资源的完全性?

走过的弯路

将资源直接提供给对方

之前我做的XX支付插件的项目是将资源文件做为一个lib-project提供给商户的,这种方法实际是可行的。但是,这时候问题来了,对于商户我们是不可控的,也就是说,二次开发中可以对我们的资源做任何手脚。XX曾经给我们的检测报告上写着,修改关键资源,修改关键LOGO后仍能使用。

对关键资源加密

因为XX方主要是在意其logo被篡改,于是就对包含logo的文件用公钥做了一份签名,启动插件的时候,进行签名校验。这份方案在我入职之前,代码里就有了的,刚开始用着是没问题的,但是当我入职后不久,问题就来了。有一个带关键信息的图片文件需要适配,因为对资源采用的是getResources().openRawResource(id)来访问取签名值的,但是在预先保存的签名,只能校验一个屏幕的,而适配的图片是有多份的。

和商户建立了默认的“契约”

其实商户也是相当诚信的,也没有任何必要去修改插件方的资源文件,毕竟支付是“双赢”,商户也不会乱动。

新的办法

发现

<resources>    <item type="layout" name="xxx" >r/dir/xxx.xml/><resources>
偶然发现,在android开发时候,其实我们可以自定义资源的存放位置。怎么弄呢?只要将上面的代码放到values下面(类似strings文件格式,但type是layout),就会有一个R.layout.xxx的id指定到r/dir/xxx.xml,当然图片资源也可以这样用,type是drawable。

而我们可以直接在工程的src项目下新建r.dir的包名,未来打jar会自动打包成目录的。

关键是xml文件,这里我们r.dir不能再放源文件了,需要放用aapt编译的二进制文件。但是该方法也存在一个限制,就是你的values必须是源文件跟随调用你jar的主工程编译

资源的安全防护

之前写过一篇文章,讲的是怎么把资源和jar一起做为SDK的时候,id的处理。传送门。这里我再简单说说

因为安卓资源通过R文件来读取,而R里面的id是在编译时候打入APK的。如果你编译sdk的时候写的是R.xx.xxx这种格式的,编译器会直接将id值写到class文件中,当sdk再在商户项目中编译时候,jar里面的id对应的其实已经不是你的资源了。

之前的文章讲的是把资源直接发给商户来编译,这就给商户提供了改动的空间。但如果是预先用aapt处理过的二进制XML文件,在就不会在商户再做编译,而是直接打入到apk中,所以只要我们验证自定义的路径中保存的二进制XML文件、图片资源文件的md5就可以了。

问:验证归你验证,我这边还有values文件,我只要修改一下路径,指定到我的资源不就行了?或者,删除你的资源。

打包时候,生成一份dir和md5的配置文件,加密保存,在jar中也要保存每个id的名字,通过id的名字就能从资源中获得保存的路径。再通过保存的路径获取到文件并校验md5值。当如果发现通过id的名称获得的dir在这份配置文件中没有,这就说明是一定被修改过了。在代码中要获取真正的id值,这就要结合Resources类的getIdentifier()方法了。

附加说明

如何读取APK中的资源并校验

我们都知道APK其实是一个ZIP,而我们通过context.getApplicationInfo().sourceDir就能得到这个zip的dir了。在zip工具类库中,JAVA其实提供了一个叫crc的校验值,类似md5,其实我们校验这个就OK了。

还需要一套自动化工具!

最初是拆了一下腾讯QQ的包才发现的values可以配置type为layout、drawable等,算是也给自己长”姿势”了。腾讯把除了values的资源路径全部混淆了,这需要一套工具,有没有开源呀!或者,要不要自己尝试写一写!毕竟手动修改路径,也是一件麻烦事。

转自:http://www.lephones.net/2014/10/28/res-safty-in-sdk/

0 0
原创粉丝点击