安卓加密文本分享项目模拟器正常手机崩溃,报Base64类未找到异常
解决安卓实体机加密崩溃:
java.lang.NoClassDefFoundError找不到java.util.Base64 这个问题我之前踩过坑!核心原因特别明确:java.util.Base64是Android API Level 26(也就是Android 8.0)才新增的类,你的模拟器大概率用了API 26+的系统镜像,所以运行毫无问题,但实体手机的系统版本低于Android 8.0时,系统里根本没有这个类,自然就抛出找不到类的异常了。
给你两个可行的解决方案,按需选择:
方案一:改用兼容全版本的安卓Base64类(推荐)
安卓从API 1开始就内置了android.util.Base64,这个类在所有安卓版本上都能正常工作,完全可以替代java.util.Base64的功能。你只需要做两个简单修改:
- 把代码里的
import java.util.Base64;替换成import android.util.Base64; - 调整Base64方法的调用参数(两者方法名和参数略有差异)
比如修改后的AES类核心代码示例:
import android.util.Base64; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; public class AES { private SecretKeySpec secretKey; private Cipher cipher; public AES(String secret, int length, String algorithm) throws UnsupportedEncodingException, NoSuchAlgorithmException { byte[] keyBytes = secret.getBytes("UTF-8"); // 这里根据算法长度截取密钥,比如AES-128取前16字节 secretKey = new SecretKeySpec(keyBytes, 0, length / 8, algorithm); cipher = Cipher.getInstance(algorithm); } // 加密方法 public String encrypt(String plainText) throws Exception { cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] encryptedBytes = cipher.doFinal(plainText.getBytes("UTF-8")); // 用NO_WRAP避免生成换行符,更适合社交平台分享文本 return Base64.encodeToString(encryptedBytes, Base64.NO_WRAP); } // 解密方法 public String decrypt(String encryptedText) throws Exception { cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] encryptedBytes = Base64.decode(encryptedText, Base64.NO_WRAP); byte[] decryptedBytes = cipher.doFinal(encryptedBytes); return new String(decryptedBytes, "UTF-8"); } }
方案二:限制最低支持API版本(不推荐,兼容性差)
如果你的项目只打算服务Android 8.0及以上的设备,可以在模块的build.gradle(或build.gradle.kts)里把minSdkVersion设置为26:
android { defaultConfig { minSdkVersion 26 // 其他配置... } }
但这种方式会直接排除掉大量低版本安卓用户,除非你的目标用户都是高版本设备,否则不建议这么做。
最后小提醒:可以在Android Studio的Logcat里查看实体手机的API等级,确认是不是系统版本过低导致的问题。
内容的提问来源于stack exchange,提问作者Shawal Msk
相关产品推荐
相关产品推荐

