SharedPreferences未创建:ADB安装APK导致应用崩溃求助
问题分析与解决方案
这个问题其实很常见,核心差异在于两种安装方式下应用的初始状态完全不同:
为什么会出现这种差异?
- 当你通过Android Studio直接安装到真机时,大概率是增量安装(除非你手动卸载过应用),之前测试时写入的SharedPreferences数据会被保留,所以
getFirsUsageAppFromSharedPreferences能读取到之前存储的值,不会返回null。 - 而通过
adb install安装构建好的APK时,这是一个全新的安装环境(如果之前卸载了应用,或者用了adb install -r但之前的数据被彻底清理),此时SharedPreferences文件还没有被创建——因为SharedPreferences文件只有在首次执行写入操作时才会生成,单纯的读取操作不会触发文件创建。你的方法直接返回null,如果后续代码没有处理这个null值,自然会触发崩溃。
解决方法
1. 给读取方法设置默认值,避免返回null
修改你的getFirsUsageAppFromSharedPreferences方法,在getString的第二个参数传入一个合理的默认值(比如空字符串),这样即使没有该键值对,也不会返回null:
public static String getFirsUsageAppFromSharedPreferences(Context context) { SharedPreferences prefs = context.getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); // 将null替换为默认值,比如空字符串 return prefs.getString("firstUsage", ""); }
2. 在应用启动时提前初始化SharedPreferences
如果"firstUsage"需要记录首次启动的标识(比如时间戳),可以在自定义Application类的onCreate方法中提前初始化这个值,确保读取时一定有数据:
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); String firstUsage = prefs.getString("firstUsage", null); if (firstUsage == null) { // 首次启动,写入初始值,比如当前时间戳 prefs.edit() .putString("firstUsage", String.valueOf(System.currentTimeMillis())) .apply(); } } }
记得在AndroidManifest.xml中配置这个自定义Application类:
<application android:name=".MyApplication" ...> ... </application>
3. 完善后续代码的null值处理
如果必须保留返回null的逻辑,那一定要确保调用getFirsUsageAppFromSharedPreferences的代码处,有完整的null判断逻辑:
String firstUsage = getFirsUsageAppFromSharedPreferences(context); if (firstUsage != null) { // 处理非空逻辑 } else { // 处理空值情况,比如执行初始化操作 }
内容的提问来源于stack exchange,提问作者f.trajkovski




