現在大部分android應用的圖片資源,被反編譯后就可以直接拿來用,如果不想讓自己的圖片資源直接被反編譯后使用,首先想到的應該是把圖片加密。這里筆者拋磚引玉,草草寫了一個對圖片進行簡單加密的方法,希望對各位看官有用。
首先是加密部分,這里使用的是簡單的異或來將圖片進行加密。新建一個java project或者干脆直接用文本文件寫下下面的代碼,然后在命令行執行,代碼如下:
1 import java.io.File; 2 3 import javax.imageio.stream.FileImageInputStream; 4 import javax.imageio.stream.FileImageOutputStream; 5 import javax.imageio.stream.ImageInputStream; 6 import javax.imageio.stream.ImageOutputStream; 7 8 public class EncriptDemo { 9 10 public static final int XOR_CONST = 0X99; //密鑰 11 12 /** 13 * @param args 14 */ 15 public static void main(String[] args) { 16 17 File load = new File("/home/jade/桌面/loading.png"); 18 File loaddest = new File("/home/jade/桌面/loading.dat"); 19 File loadd = new File("/home/jade/桌面/loading_depr.png"); 20 21 try { 22 encrImg(load, loaddest); 23 encrImg(loaddest, loadd); 24 } catch (Exception e) { 25 e.printStackTrace(); 26 } 27 } 28 29 public static void encrImg(File src, File dest) throws Exception { 30 ImageInputStream fis = new FileImageInputStream(src); 31 ImageOutputStream fos = new FileImageOutputStream(dest); 32 33 int read; 34 while ((read = fis.read()) > -1) { 35 fos.write(read ^ XOR_CONST); 36 } 37 fos.flush(); 38 fos.close(); 39 fis.close(); 40 } 41 42 }
上面的代碼並沒有進行文件是否存在的判斷,因為這段代碼是自己對文件進行加密,所以文件是否存在自己檢查下即可。熟悉異或的朋友應該想得到,其實上面的encrImg(File src, File dest)方法既可以做加密,又可以做解密,在main里做了兩次調用,第一次用來加密,第二次進行解密。這樣加密的程序就完成了,接下來看一下在android中解密的方法(上面的加密代碼,使用了javax.imageio.stream包中的相關類,故默認不能在android工程中執行)。
把剛剛加密好的loading.dat文件拷貝到android項目的assets文件夾下,然后在layout中添加一個ImageView,id為img,這樣在activity中就可以執行以下代碼:
1 ImageView img = (ImageView) findViewById(R.id.img); 2 Bitmap bitmap = ImageAdapter.readBitmap(this, "loading.dat"); 3 if(bitmap != null) { 4 img.setImageBitmap(bitmap); 5 } else { 6 System.out.println("圖片為空"); 7 }
這里調用了ImageAdapter的靜態方法readBitmap,該方法讀取筆者這里僅僅是一個demo,所以沒有考慮ANR等處理,正式項目最好是將圖片加載解密部分放在獨立的線程中執行。ImageAdapter的代碼如下:
1 import java.io.IOException; 2 import java.io.InputStream; 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import android.content.Context; 7 import android.graphics.Bitmap; 8 import android.graphics.BitmapFactory; 9 10 public class ImageAdapter { 11 12 public static Bitmap readBitmap(Context context, String fileName) { 13 Bitmap bitmap = null; 14 List list = new ArrayList(); 15 try { 16 InputStream is = context.getAssets().open(fileName); 17 int read; 18 while ((read = is.read()) > -1) { 19 read = read ^ 0X99; 20 list.add((byte)read); 21 } 22 23 byte[] arr = new byte[list.size()]; 24 int i = 0; 25 for(Byte item : list) { 26 arr[i++] = item; 27 } 28 bitmap = BitmapFactory.decodeByteArray(arr, 0, list.size()); 29 System.out.println(bitmap); 30 } catch (IOException e) { 31 e.printStackTrace(); 32 } 33 return bitmap; 34 } 35 36 }
筆者的方法,並不是最好的方法,這里只是拋磚引玉,給需要保護自己的圖片資源的朋友一個簡單的思路。
