Flutter 项目热更新加载 libapp.so 文件
1. 获取 .so 文件
- 打包 Flutter 项目的 Release 版 APK。
- 解压 APK 文件,从
lib/arm64-v8a
或lib/armeabi-v7a
目录下提取libapp.so
文件。
2. 加载 .so 文件的实现代码
将 libapp.so
文件放入 Android 项目的 app/src/main/assets
目录下,并通过以下代码下载到应用私有目录中:
java
arduino
private static final String LIB_NAME = "libapp.so";
public void loadSoFromAssets() {
try {
// 使用应用私有目录存储 .so 文件
File libDir = new File(getFilesDir(), "libs");
if (!libDir.exists()) {
libDir.mkdirs();
}
File libFile = new File(libDir, LIB_NAME);
// 检查文件是否已存在
if (libFile.exists()) {
Log.d("LoadSO", "SO 文件已存在,路径: " + libFile.getAbsolutePath());
Log.d("LoadSO", "文件大小: " + libFile.length() + " bytes");
Log.d("LoadSO", "最后修改时间: " + new Date(libFile.lastModified()));
Log.d("LoadSO", "是否可读: " + libFile.canRead());
Log.d("LoadSO", "是否可写: " + libFile.canWrite());
System.load(libFile.getAbsolutePath());
Toast.makeText(this, "加载已存在的 SO 文件: " + libFile.getAbsolutePath(), Toast.LENGTH_SHORT).show();
return;
}
// 从 assets 复制到私有目录
InputStream is = getAssets().open(LIB_NAME);
FileOutputStream fos = new FileOutputStream(libFile);
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
is.close();
Log.d("LoadSO", "SO 文件加载成功,路径: " + libFile.getAbsolutePath());
Log.d("LoadSO", "文件大小: " + libFile.length() + " bytes");
Log.d("LoadSO", "最后修改时间: " + new Date(libFile.lastModified()));
Log.d("LoadSO", "是否可读: " + libFile.canRead());
Log.d("LoadSO", "是否可写: " + libFile.canWrite());
// 加载 .so 文件
System.load(libFile.getAbsolutePath());
Toast.makeText(this, "加载 SO 文件成功: " + libFile.getAbsolutePath(), Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(this, "加载 SO 文件失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
Log.e("LoadSO", "加载 SO 文件失败", e);
}
}


3. 测试结果
- 将
libapp.so
文件下载到本地目录后,调用System.load(libFile.getAbsolutePath())
加载。 - 重新进入应用时,UI 未更新到预期的变化。
4. 结论
- 限制 1:虽然 .so 文件被复制到了应用私有目录,但 Android 系统不允许在运行时热替换已加载的原生库。
- 限制 2:Android 对 .so 文件的加载机制有严格限制,一旦加载后无法在运行时替换。
5. 注意事项
- 动态加载 .so 文件需谨慎,确保文件路径和权限正确。
- 若需更新原生代码,建议通过完整的 APK 更新实现。