欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android 安全加密:對稱加密詳解

 更新時間:2016年09月13日 09:02:29   作者:Android-Developer  
本文主要介紹Android 安全加密對稱加密,這里整理了詳細(xì)的資料及介紹凱撒密碼和對稱密碼的資料,有興趣的小伙伴可以參考下

Android安全加密專題文章索引

  1. Android安全加密:對稱加密
  2. Android安全加密:非對稱加密
  3. Android安全加密:消息摘要Message Digest
  4. Android安全加密:數(shù)字簽名和數(shù)字證書
  5. Android安全加密:Https編程

以上學(xué)習(xí)所有內(nèi)容,對稱加密、非對稱加密、消息摘要、數(shù)字簽名等知識都是為了理解數(shù)字證書工作原理而作為一個預(yù)備知識。數(shù)字證書是密碼學(xué)里的終極武器,是人類幾千年歷史總結(jié)的智慧的結(jié)晶,只有在明白了數(shù)字證書工作原理后,才能理解Https 協(xié)議的安全通訊機制。最終才能在SSL 開發(fā)過程中得心應(yīng)手。

另外,對稱加密和消息摘要這兩個知識點是可以單獨拿來使用的。

數(shù)字證書使用到了以上學(xué)習(xí)的所有知識

  1. 對稱加密與非對稱加密結(jié)合使用實現(xiàn)了秘鑰交換,之后通信雙方使用該秘鑰進(jìn)行對稱加密通信。
  2. 消息摘要與非對稱加密實現(xiàn)了數(shù)字簽名,根證書機構(gòu)對目標(biāo)證書進(jìn)行簽名,在校驗的時候,根證書用公鑰對其進(jìn)行校驗。若校驗成功,則說明該證書是受信任的。
  3. Keytool 工具可以創(chuàng)建證書,之后交給根證書機構(gòu)認(rèn)證后直接使用自簽名證書,還可以輸出證書的RFC格式信息等。
  4. 數(shù)字簽名技術(shù)實現(xiàn)了身份認(rèn)證與數(shù)據(jù)完整性保證。
  5. 加密技術(shù)保證了數(shù)據(jù)的保密性,消息摘要算法保證了數(shù)據(jù)的完整性,對稱加密的高效保證了數(shù)據(jù)處理的可靠性,數(shù)字簽名技術(shù)保證了操作的不可否認(rèn)性。

通過以上內(nèi)容的學(xué)習(xí),我們要能掌握以下知識點:

  1. 基礎(chǔ)知識:bit 位、字節(jié)、字符、字符編碼、進(jìn)制轉(zhuǎn)換、io
  2. 知道怎樣在實際開發(fā)里怎樣使用對稱加密解決問題
  3. 知道對稱加密、非對稱加密、消息摘要、數(shù)字簽名、數(shù)字證書是為了解決什么問題而出現(xiàn)的
  4. 了解SSL 通訊流程
  5. 實際開發(fā)里怎樣請求Https 的接口

凱撒密碼

1. 介紹

凱撒密碼作為一種最為古老的對稱加密體制,在古羅馬的時候都已經(jīng)很流行,他的基本思想是:通過把字母移動一定的位數(shù)來實現(xiàn)加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一個固定數(shù)目進(jìn)行偏移后被替換成密文。例如,當(dāng)偏移量是3 的時候,所有的字母A 將被替換成D,B 變成E,由此可見,位數(shù)就是凱撒密碼加密和解密的密鑰。

例如:字符串”ABC”的每個字符都右移3 位則變成”DEF”,解密的時候”DEF”的每個字符左移3 位即能還原,如下圖所示:

2. 準(zhǔn)備知識

 //字符轉(zhuǎn)換成ASCII 碼數(shù)值
 char charA = 'a';
 int intA = charA; //char 強轉(zhuǎn)為int 即得到對應(yīng)的ASCII 碼值,'a'的值為97

//ASCII 碼值轉(zhuǎn)成char
int intA = 97;//97 對應(yīng)的ASCII 碼'a'
char charA = (char) intA; //int 值強轉(zhuǎn)為char 即得到對應(yīng)的ASCII 字符,即'a'

3. 凱撒密碼的簡單代碼實現(xiàn)

 /**
 * 加密
 * @param input 數(shù)據(jù)源(需要加密的數(shù)據(jù))
 * @param key 秘鑰,即偏移量
 * @return 返回加密后的數(shù)據(jù)
 */
 public static String encrypt(String input, int key) {
 //得到字符串里的每一個字符
 char[] array = input.toCharArray();

 for (int i = 0; i < array.length; ++i) {
 //字符轉(zhuǎn)換成ASCII 碼值
 int ascii = array[i];
 //字符偏移,例如a->b
 ascii = ascii + key;
 //ASCII 碼值轉(zhuǎn)換為char
 char newChar = (char) ascii;
 //替換原有字符
 array[i] = newChar;

 //以上4 行代碼可以簡寫為一行
 //array[i] = (char) (array[i] + key);
 }

 //字符數(shù)組轉(zhuǎn)換成String
 return new String(array);
 }

 /**
 * 解密
 * @param input 數(shù)據(jù)源(被加密后的數(shù)據(jù))
 * @param key 秘鑰,即偏移量
 * @return 返回解密后的數(shù)據(jù)
 */
 public static String decrypt(String input, int key) {
 //得到字符串里的每一個字符
 char[] array = input.toCharArray();
 for (int i = 0; i < array.length; ++i) {
 //字符轉(zhuǎn)換成ASCII 碼值
 int ascii = array[i];
 //恢復(fù)字符偏移,例如b->a
 ascii = ascii - key;
 //ASCII 碼值轉(zhuǎn)換為char
 char newChar = (char) ascii;
 //替換原有字符
 array[i] = newChar;

 //以上4 行代碼可以簡寫為一行
 //array[i] = (char) (array[i] - key);
 }

 //字符數(shù)組轉(zhuǎn)換成String
 return new String(array);
 }

代碼輸出結(jié)果:

4. 破解凱撒密碼:頻率分析法

凱撒密碼加密強度太低,只需要用頻度分析法即可破解。

在任何一種書面語言中,不同的字母或字母組合出現(xiàn)的頻率各不相同。而且,對于以這種語言書寫的任意一段文本,都具有大致相同的特征字母分布。比如,在英語中,字母E 出現(xiàn)的頻率很高,而X 則出現(xiàn)得較少。

英語文本中典型的字母分布情況如下圖所示:

5. 破解流程

  1. 統(tǒng)計密文里出現(xiàn)次數(shù)最多的字符,例如出現(xiàn)次數(shù)最多的字符是是'h'。
  2. 計算字符'h'到'e'的偏移量,值為3,則表示原文偏移了3 個位置。
  3. 將密文所有字符恢復(fù)偏移3 個位置。

注意點:統(tǒng)計密文里出現(xiàn)次數(shù)最多的字符時,需多統(tǒng)計幾個備選,因為最多的可能是空格或者其他字符,例如下圖出現(xiàn)次數(shù)最多的字符'#'是空格加密后的字符,'h'才是'e'偏移后的值。

解密時要多幾次嘗試,因為不一定出現(xiàn)次數(shù)最多的字符就是我們想要的目標(biāo)字符,如下圖,第二次解密的結(jié)果才是正確的。

/**
 * 頻率分析法破解凱撒密碼
 */
public class FrequencyAnalysis {
 //英文里出現(xiàn)次數(shù)最多的字符
 private static final char MAGIC_CHAR = 'e';
 //破解生成的最大文件數(shù)
 private static final int DE_MAX_FILE = 4;

 public static void main(String[] args) throws Exception {
 //測試1,統(tǒng)計字符個數(shù)
 //printCharCount("article1_en.txt");

 //加密文件
 //int key = 3;
 //encryptFile("article1.txt", "article1_en.txt", key);

 //讀取加密后的文件
 String artile = file2String("article1_en.txt");
 //解密(會生成多個備選文件)
 decryptCaesarCode(artile, "article1_de.txt");
 }

 public static void printCharCount(String path) throws IOException{
 String data = file2String(path);
 List<Entry<Character, Integer>> mapList = getMaxCountChar(data);
 for (Entry<Character, Integer> entry : mapList) {
 //輸出前幾位的統(tǒng)計信息
 System.out.println("字符'" + entry.getKey() + "'出現(xiàn)" + entry.getValue() + "次");
 }
 }

 public static void encryptFile(String srcFile, String destFile, int key) throws IOException {
 String artile = file2String(srcFile);
 //加密文件
 String encryptData = MyEncrypt.encrypt(artile, key);
 //保存加密后的文件
 string2File(encryptData, destFile);
 }

 /**
 * 破解凱撒密碼
 * @param input 數(shù)據(jù)源
 * @return 返回解密后的數(shù)據(jù)
 */
 public static void decryptCaesarCode(String input, String destPath) {
 int deCount = 0;//當(dāng)前解密生成的備選文件數(shù)
 //獲取出現(xiàn)頻率最高的字符信息(出現(xiàn)次數(shù)越多越靠前)
 List<Entry<Character, Integer>> mapList = getMaxCountChar(input);
 for (Entry<Character, Integer> entry : mapList) {
 //限制解密文件備選數(shù)
 if (deCount >= DE_MAX_FILE) {
 break;
 }

 //輸出前幾位的統(tǒng)計信息
 System.out.println("字符'" + entry.getKey() + "'出現(xiàn)" + entry.getValue() + "次");

 ++deCount;
 //出現(xiàn)次數(shù)最高的字符跟MAGIC_CHAR的偏移量即為秘鑰
 int key = entry.getKey() - MAGIC_CHAR;
 System.out.println("猜測key = " + key + ", 解密生成第" + deCount + "個備選文件" + "\n");
 String decrypt = MyEncrypt.decrypt(input, key);

 String fileName = "de_" + deCount + destPath;
 string2File(decrypt, fileName);
 }
 }

 //統(tǒng)計String里出現(xiàn)最多的字符
 public static List<Entry<Character, Integer>> getMaxCountChar(String data) {
 Map<Character, Integer> map = new HashMap<Character, Integer>();
 char[] array = data.toCharArray();
 for (char c : array) {
 if(!map.containsKey(c)) {
 map.put(c, 1);
 }else{
 Integer count = map.get(c);
 map.put(c, count + 1);
 }
 }

 //輸出統(tǒng)計信息
 /*for (Entry<Character, Integer> entry : map.entrySet()) {
 System.out.println(entry.getKey() + "出現(xiàn)" + entry.getValue() + "次");
 }*/

 //獲取獲取最大值
 int maxCount = 0;
 for (Entry<Character, Integer> entry : map.entrySet()) {
 //不統(tǒng)計空格
 if (/*entry.getKey() != ' ' && */entry.getValue() > maxCount) { 
 maxCount = entry.getValue();
 }
 }

 //map轉(zhuǎn)換成list便于排序
 List<Entry<Character, Integer>> mapList = new ArrayList<Map.Entry<Character,Integer>>(map.entrySet());
 //根據(jù)字符出現(xiàn)次數(shù)排序
 Collections.sort(mapList, new Comparator<Entry<Character, Integer>>(){
 @Override
 public int compare(Entry<Character, Integer> o1,
 Entry<Character, Integer> o2) {
 return o2.getValue().compareTo(o1.getValue());
 }
 });
 return mapList;
 }

 public static String file2String(String path) throws IOException {
 FileReader reader = new FileReader(new File(path));
 char[] buffer = new char[1024];
 int len = -1;
 StringBuffer sb = new StringBuffer();
 while ((len = reader.read(buffer)) != -1) {
 sb.append(buffer, 0, len);
 }
 return sb.toString();
 }

 public static void string2File(String data, String path){
 FileWriter writer = null;
 try {
 writer = new FileWriter(new File(path));
 writer.write(data);
 } catch (Exception e) {
 e.printStackTrace();
 }finally {
 if (writer != null) {
 try {
 writer.close();
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 }

 }
}

對稱加密

介紹

加密和解密都使用同一把秘鑰,這種加密方法稱為對稱加密,也稱為單密鑰加密。
簡單理解為:加密解密都是同一把鑰匙。

凱撒密碼就屬于對稱加密,他的字符偏移量即為秘鑰。

對稱加密常用算法

AES、DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK 等。

DES:全稱為Data Encryption Standard,即數(shù)據(jù)加密標(biāo)準(zhǔn),是一種使用密鑰加密的塊算法,1976 年被美國聯(lián)邦政府的國家標(biāo)準(zhǔn)局確定為聯(lián)邦資料處理標(biāo)準(zhǔn)(FIPS),隨后在國際上廣泛流傳開來。

3DES:也叫Triple DES,是三重數(shù)據(jù)加密算法(TDEA,Triple Data Encryption Algorithm)塊密碼的通稱。
它相當(dāng)于是對每個數(shù)據(jù)塊應(yīng)用三次DES 加密算法。由于計算機運算能力的增強,原版DES 密碼的密鑰長度變得容易被暴力破解;3DES 即是設(shè)計用來提供一種相對簡單的方法,即通過增加DES 的密鑰長度來避免類似的攻擊,而不是設(shè)計一種全新的塊密碼算法。

AES: 高級加密標(biāo)準(zhǔn)(英語:Advanced Encryption Standard,縮寫:AES),在密碼學(xué)中又稱Rijndael 加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。這個標(biāo)準(zhǔn)用來替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。經(jīng)過五年的甄選流程,高級加密標(biāo)準(zhǔn)由美國國家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)于2001 年11 月26 日發(fā)布于FIPS PUB 197,并在2002 年5 月26 日成為有效的標(biāo)準(zhǔn)。2006 年,高級加密標(biāo)準(zhǔn)已然成為對稱密鑰加密中最流行的算法之一。

DES 算法簡介

DES 加密原理(對比特位進(jìn)行操作,交換位置,異或等等,無需詳細(xì)了解)

準(zhǔn)備知識

Bit 是計算機最小的傳輸單位。以0 或1 來表示比特位的值

例如數(shù)字3 對應(yīng)的二進(jìn)制數(shù)據(jù)為:00000011

代碼示例

 int i = 97;
 String bit = Integer.toBinaryString(i);
 //輸出:97 對應(yīng)的二進(jìn)制數(shù)據(jù)為: 1100001
 System.out.println(i + "對應(yīng)的二進(jìn)制數(shù)據(jù)為: " + bit);

Byte 與Bit 區(qū)別

數(shù)據(jù)存儲是以“字節(jié)”(Byte)為單位,數(shù)據(jù)傳輸是以大多是以“位”(bit,又名“比特”)為單位,一個位就代表一個0 或1(即二進(jìn)制),每8 個位(bit,簡寫為b)組成一個字節(jié)(Byte,簡寫為B),是最小一級的信息單位。

Byte 的取值范圍:

//byte 的取值范圍:-128 到127
System.out.println(Byte.MIN_VALUE + "到" + Byte.MAX_VALUE);

即10000000 到01111111 之間,一個字節(jié)占8 個比特位

二進(jìn)制轉(zhuǎn)十進(jìn)制圖示:

任何字符串都可以轉(zhuǎn)換為字節(jié)數(shù)組

String data = "1234abcd";
byte[] bytes = data.getBytes();//內(nèi)容為:49 50 51 52 97 98 99 100

上面數(shù)據(jù)49 50 51 52 97 98 99 100 對應(yīng)的二進(jìn)制數(shù)據(jù)(即比特位為):

00110001
00110010
00110011
00110100
01100001
01100010
01100011
01100100

將他們間距調(diào)大一點,可看做一個矩陣:

之后可對他們進(jìn)行各種操作,例如交換位置、分割、異或運算等,常見的加密方式就是這樣操作比特位的,例如下圖的IP 置換以及S-Box 操作都是常見加密的一些方式:

IP 置換:

S-BOX 置換:

DES 加密過程圖解(流程很復(fù)雜,只需要知道內(nèi)部是操作比特位即可):

對稱加密應(yīng)用場景

  1. 本地數(shù)據(jù)加密(例如加密android 里SharedPreferences 里面的某些敏感數(shù)據(jù))
  2. 網(wǎng)絡(luò)傳輸:登錄接口post 請求參數(shù)加密{username=lisi,pwd=oJYa4i9VASRoxVLh75wPCg==}
  3. 加密用戶登錄結(jié)果信息并序列化到本地磁盤(將user 對象序列化到本地磁盤,下次登錄時反序列化到內(nèi)存里)
  4. 網(wǎng)頁交互數(shù)據(jù)加密(即后面學(xué)到的Https)

DES 算法代碼實現(xiàn)

//1,得到cipher 對象(可翻譯為密碼器或密碼系統(tǒng))
 Cipher cipher = Cipher.getInstance("DES");
 //2,創(chuàng)建秘鑰
 SecretKey key = KeyGenerator.getInstance("DES").generateKey();
 //3,設(shè)置操作模式(加密/解密)
 cipher.init(Cipher.ENCRYPT_MODE, key);
 //4,執(zhí)行操作
 byte[] result = cipher.doFinal("黑馬".getBytes());

AES 算法代碼實現(xiàn)

用法同上,只需把”DES”參數(shù)換成”AES”即可。

使用Base64 編碼加密后的結(jié)果

byte[] result = cipher.doFinal("黑馬".getBytes());
System.out.println(new String(result));

輸出結(jié)果:

加密后的結(jié)果是字節(jié)數(shù)組,這些被加密后的字節(jié)在碼表(例如UTF-8 碼表)上找不到對應(yīng)字符,會出現(xiàn)亂碼,當(dāng)亂碼字符串再次轉(zhuǎn)換為字節(jié)數(shù)組時,長度會變化,導(dǎo)致解密失敗,所以轉(zhuǎn)換后的數(shù)據(jù)是不安全的。

使用Base64 對字節(jié)數(shù)組進(jìn)行編碼,任何字節(jié)都能映射成對應(yīng)的Base64 字符,之后能恢復(fù)到字節(jié)數(shù)組,利于加密后數(shù)據(jù)的保存于傳輸,所以轉(zhuǎn)換是安全的。同樣,字節(jié)數(shù)組轉(zhuǎn)換成16 進(jìn)制字符串也是安全的。

密文轉(zhuǎn)換成Base64 編碼后的輸出結(jié)果:

密文轉(zhuǎn)換成16 進(jìn)制編碼后的輸出結(jié)果:

Java 里沒有直接提供Base64 以及字節(jié)數(shù)組轉(zhuǎn)16 進(jìn)制的Api,開發(fā)中一般是自己手寫或直接使用第三方提供的成熟穩(wěn)定的工具類(例如apache 的commons-codec)。

Base64 字符映射表

對稱加密的具體應(yīng)用方式

1. 生成秘鑰并保存到硬盤上,以后讀取該秘鑰進(jìn)行加密解密操作,實際開發(fā)中用得比較少

//生成隨機秘鑰
SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
//序列化秘鑰到磁盤上
FileOutputStream fos = new FileOutputStream(new File("heima.key"));

ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(secretKey);

//從磁盤里讀取秘鑰
FileInputStream fis = new FileInputStream(new File("heima.key"));
ObjectInputStream ois = new ObjectInputStream(fis);
Key key = (Key) ois.readObject();

2. 使用自定義秘鑰(秘鑰寫在代碼里)

//創(chuàng)建密鑰寫法1
KeySpec keySpec = new DESKeySpec(key.getBytes());
SecretKey secretKey = SecretKeyFactory.getInstance(ALGORITHM).
generateSecret(keySpec);

//創(chuàng)建密鑰寫法2
//SecretKey secretKey = new SecretKeySpec(key.getBytes(), KEY_ALGORITHM);

Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
//得到key 后,后續(xù)代碼就是Cipher 的寫法,此處省略...

注意事項

把秘鑰寫在代碼里有一定風(fēng)險,當(dāng)別人反編譯代碼的時候,可能會看到秘鑰,Android 開發(fā)里建議用JNI 把秘鑰值寫到C 代碼里,甚至拆分成幾份,最后再組合成真正的秘鑰

算法/工作模式/填充模式

初始化cipher 對象時,參數(shù)可以直接傳算法名:例如:

Cipher c = Cipher.getInstance("DES");

也可以指定更詳細(xì)的參數(shù),格式:”algorithm/mode/padding” ,即”算法/工作模式/填充模式”

Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");

密碼塊工作模式

塊密碼工作模式(Block cipher mode of operation),是對于按塊處理密碼的加密方式的一種擴充,不僅僅適用于AES,包括DES, RSA 等加密方法同樣適用。

填充模式

填充(Padding),是對需要按塊處理的數(shù)據(jù),當(dāng)數(shù)據(jù)長度不符合塊處理需求時,按照一定方法填充滿塊長的一種規(guī)則。

具體代碼:

//秘鑰算法
private static final String KEY_ALGORITHM = "DES";
//加密算法:algorithm/mode/padding 算法/工作模式/填充模式
private static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";
//秘鑰
private static final String KEY = "12345678";//DES 秘鑰長度必須是8 位或以上
//private static final String KEY = "1234567890123456";//AES 秘鑰長度必須是16 位

//初始化秘鑰
SecretKey secretKey = new SecretKeySpec(KEY.getBytes(), KEY_ALGORITHM);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);

//加密
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] result = cipher.doFinal(input.getBytes());

注意:AES、DES 在CBC 操作模式下需要iv 參數(shù)

//AES、DES 在CBC 操作模式下需要iv 參數(shù)
IvParameterSpec iv = new IvParameterSpec(key.getBytes());

//加密
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);

總結(jié)

DES 安全度在現(xiàn)代已經(jīng)不夠高,后來又出現(xiàn)的3DES 算法強度提高了很多,但是其執(zhí)行效率低下,AES算法加密強度大,執(zhí)行效率高,使用簡單,實際開發(fā)中建議選擇AES 算法。實際android 開發(fā)中可以用對稱加密(例如選擇AES 算法)來解決很多問題,例如:

  1. 做一個管理密碼的app,我們在不同的網(wǎng)站里使用不同賬號密碼,很難記住,想做個app 統(tǒng)一管理,但是賬號密碼保存在手機里,一旦丟失了容易造成安全隱患,所以需要一種加密算法,將賬號密碼信息加密起來保管,這時候如果使用對稱加密算法,將數(shù)據(jù)進(jìn)行加密,秘鑰我們自己記在心里,只需要記住一個密碼。需要的時候可以還原信息。
  2. android 里需要把一些敏感數(shù)據(jù)保存到SharedPrefrence 里的時候,也可以使用對稱加密,這樣可以在需要的時候還原。
  3. 請求網(wǎng)絡(luò)接口的時候,我們需要上傳一些敏感數(shù)據(jù),同樣也可以使用對稱加密,服務(wù)端使用同樣的算法就可以解密?;蛘叻?wù)端需要給客戶端傳遞數(shù)據(jù),同樣也可以先加密,然后客戶端使用同樣算法解密.

相關(guān)文章

  • android特賣列表倒計時卡頓問題的解決方法

    android特賣列表倒計時卡頓問題的解決方法

    這篇文章主要為大家詳細(xì)介紹了android特賣列表倒計時卡頓問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Android studio實現(xiàn)簡易計算器App功能

    Android studio實現(xiàn)簡易計算器App功能

    這篇文章主要為大家詳細(xì)介紹了Android studio實現(xiàn)簡易計算器App功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Android實現(xiàn)不同apk間共享數(shù)據(jù)的方法(2種方法)

    Android實現(xiàn)不同apk間共享數(shù)據(jù)的方法(2種方法)

    這篇文章主要介紹了Android實現(xiàn)不同apk間共享數(shù)據(jù)的方法,介紹了apk自定義借口實現(xiàn)數(shù)據(jù)共享與基于User id的數(shù)據(jù)共享,并重點介紹了基于User id的數(shù)據(jù)共享實現(xiàn)技巧,非常簡單實用,需要的朋友可以參考下
    2016-01-01
  • Android編程獲取SD卡路徑及剩余容量的方法

    Android編程獲取SD卡路徑及剩余容量的方法

    這篇文章主要介紹了Android編程獲取SD卡路徑及剩余容量的方法,涉及Android針對SD卡的狀態(tài)判斷,路徑獲取及容量計算等相關(guān)技巧,需要的朋友可以參考下
    2016-04-04
  • Android.bp語法和使用方法講解

    Android.bp語法和使用方法講解

    Android.bp是用來替換Android.mk的配置文件,下面這篇文章主要給大家介紹了關(guān)于Android.bp語法和使用的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • Android編程之菜單實現(xiàn)方法

    Android編程之菜單實現(xiàn)方法

    這篇文章主要介紹了Android編程之菜單實現(xiàn)方法,以實例形式較為詳細(xì)的分析了Android編程實現(xiàn)菜單的布局及功能相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • Android 自定義相機及分析源碼

    Android 自定義相機及分析源碼

    這篇文章主要介紹了Android 自定義相機及分析源碼的相關(guān)資料,這里自定義相機并使用系統(tǒng)相機教程源碼進(jìn)行詳解,需要的朋友可以參考下
    2017-08-08
  • Android RecycleView實現(xiàn)Item拖拽效果

    Android RecycleView實現(xiàn)Item拖拽效果

    RecyclerView是Android一個更強大的控件,其不僅可以實現(xiàn)和ListView同樣的效果,還有優(yōu)化了ListView中的各種不足。本文將介紹通過RecyclerView實現(xiàn)Item拖拽效果以及拖拽位置保存,感興趣的可以參考一下
    2022-01-01
  • Android開發(fā)中多進(jìn)程共享數(shù)據(jù)簡析

    Android開發(fā)中多進(jìn)程共享數(shù)據(jù)簡析

    這篇文章主要為大家簡單分析Android開發(fā)中多進(jìn)程共享數(shù)據(jù),怎么做才能讓這兩邊共享數(shù)據(jù),感興趣的小伙伴們可以參考一下
    2016-04-04
  • Android so庫的熱更新問題

    Android so庫的熱更新問題

    這篇文章主要介紹了Android so庫的熱更新問題的相關(guān)資料,需要的朋友可以參考下
    2017-11-11

最新評論