2015-06-01 156 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是非常有用的巨大,你只想更新二進制文件,以方便調試。

相關問題