更新本地库而无需重新安装应用程序

3

我有一个应用程序,其中包含两个本地库(例如libfirst.so,libsecond.so)。现在是加载库的标准方法。

System.loadLibrary("first");
System.loadLibrary("second");

现在我需要能够更新库而不必重新安装应用程序(不需要更新.apk文件)。 我可以使用这种方法加载本地库。

System.load("/storage/emulated/0/armeabi/libfirst.so");
System.load("/storage/emulated/0/armeabi/libsecond.so");

我认为这是一种不好的做法。 我试图手动复制文件夹getApplicationInfo().nativeLibraryDir中的库,但系统报错:open failed: EACCES (Permission denied)

在不更新apk的情况下,有哪些最佳实践可以更新本机库?

2个回答

1
什么是更新本地库的最佳实践,而不需要更新apk?我不认为这种情况被覆盖到。代码签名有两个作用。首先,它确保发布应用程序的开发人员与更新应用程序的开发人员相同。其次,它在相关应用程序之间创建信任关系(但这不适用于此处)。Nikolay Elenkov在Android安全模型中的代码签名中讨论了这个主题。如果您想要更新依赖库,则需要重新构建APK以证明您有权进行更新。这是上面讨论的代码签名的第一部分。如果您想要更新应用程序的个人副本(而不是发布它),则只需删除现有的签名,更新库,使用Debug签名密钥进行签名,然后推送到设备即可。另外,您可以放心执行adb install -r <the apk>-r是“替换现有应用程序”,它有效地是重新安装。它保留先前的应用程序数据,例如数据库。

更新应用时还有其他需要处理的事情,比如增加版本号以便在Google Play中正确处理。但这些与您的问题并不相关。


0

其实有一种方法可以做到这一点:

用于安装您的APK:

adb install -r path_to_my_apk.apk

现在你可以更改你的代码并重新编译你的 .so 文件,当你想更新它时,你可以这样做:

adb push -p path_to_my_so.so /data/local/tmp/libmyso.so
adb shell cat /data/local/tmp/libmyso.so | run-as com.mycomp.myapp sh -c 'cat > /data/data/com.mycomp.myapp/lldb/libmyso.so; chmod 700 /data/data/com.mycomp.myapp/lldb/libmyso.so'
adb shell rm /data/local/tmp/libmyso.so

Android Studio在调试本地代码时会安装lldb服务器,以确保程序正常运行。

它假设您的应用目录中有一个名为lldb的文件夹。如果您正在使用Android Studio进行调试,则该文件夹已经存在。

您的Java代码需要确保正确加载相应的.so文件。

System.load("/data/data/com.mycomp.myapp/lldb/libmyso.so");

不要使用System.loadLibrary(),因为它在静态初始化块中不接受完整路径,类似于加载任何其他的.so文件。

如果你的apk非常庞大,而你只想更新二进制文件以便进行简单的调试,那么这种方法非常有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接