Android 资源保护问题——探索
本文地址:http://blog.csdn.net/you_and_me12/article/details/7959349
2012-09-09
apk文件使用解压工具就能看到drawable等资源,但是有些游戏中的图片资源却是无法看到的。
这个问题探索了许久……
【1】图片资源不放置在drawable文件下,放在assets中(但是解压apk,同样能看到图片资源),以下说说使用方法。
分析:Ⅰ)当图片资源放在drawable中的时候,能有相应的Id去解析: BitmapFactory.decodeResource(res, id)
如果放置在assets下,就需要根据文件的名字去解析(Android提供AssetManager)。
Ⅱ)可以自己建立多层目录,方便管理。
Ⅲ)这样的解析过程,耗费的时间要比根据Id解析要多(手机越来越智能,这点时间基本看不出来)。
代码:
Step2:解读assets中的图片,同【1】
Step3:打包apk,然后发现jar包中的assets和当前工程的assets合并了!
【3】图片资源加密,然后在assets文件下读取(可以实现资源保护,但是貌似比较耗时)
分析:通过某种方式对图片预先加密,然后在Android程序中解密,在转换成Bitmap。
可能别的应用程序就是这样做的吧,哪位大神有妙招,给介绍一下吧!(下面介绍一下简单方法)
Step1:加密,采用文件流方式,读取资源,然后修改,最后生成文件(随便格式都可以,就不能知道是图片了)
Ⅰ)每隔多少个字节添加一个指定的字节
Ⅱ)每隔多少个字节,交换字节(代码示例)
/** * 从Assets中读取图片 * @param fileName * @return */ public static Bitmap getImageFromAssets(Context context, String fileName) { Bitmap image = null; AssetManager am = context.getResources().getAssets(); try { InputStream is = am.open(fileName); byte[] buffer = new byte[1000000];//足够大 is.read(buffer); for(int i=0; i<buffer.length; i+= 5000){//与加密相同 byte temp = buffer[i]; buffer[i] = buffer[i+1]; buffer[i+1] = buffer[i]; } image = BitmapFactory.decodeByteArray(buffer, 0, buffer.length); is.close(); } catch (IOException e) { e.printStackTrace(); } return image; }
【?】继续探索中,忘大神指教!感激不尽!