2015-06-01 160 views
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,但系统错误的库: 打开失败:EACCES(拒绝)

什么是最好的做法,更新本机库不更新APK?

回答

1

What are the best practices update native libraries without update apk ?

我不相信意外事故被覆盖。

代码签名有两件事。首先,它确保发布应用程序的开发人员是更新应用程序的开发人员。其次,它创建相关应用程序之间的信任关系(但这不适用于此)。 Nikolay Elenkov在Code signing in Android's security model讨论了这个话题。

如果要更新相关库,则需要重新构建APK以证明您有权进行更新。这是上面讨论的代码签名的一部分。

如果您想要更新应用程序的个人副本(而不是发布它),那么只需剥离现有的签名,更新库,使用Debug signing key签名,然后推送至设备。您可以安全地执行adb install -r <the apk>-r“替换现有应用程序”,其有效地重新安装。它保留了以前的应用程序数据,如数据库。

更新应用程序时还需要做其他一些事情,例如增加版本号,以便在Google Play中正确处理它。但是它们与你的问题并不相关。

0

其实是有办法做到这

用于安装apk文件:

adb install -r path_to_my_apk.apk 

现在你可以改变你的代码,并重新编译。所以,当你想更新它,你可以这样做:

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代码需要确保加载正确。因此,使用

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

代替System.loadLibrary()这并不需要完整路径在静态初始化块地方,类似于你如何加载任何其他的.so

此法可如果您的APK是非常有用的巨大,你只想更新二进制文件,以方便调试。

相关问题