我有同樣的需求,之後重研究2天,我想出了一個解決這個問題。這並不簡單,並且需要您能夠修改Android系統代碼。
基本上PackageManagerService防止系統應用到他們的解壓本地二進制文件(.so文件),除非他們已經被更新。所以解決這個問題的唯一方法就是修改PMS.java(正確命名,因爲試圖解決這個問題讓我處於一種可怕的情緒)。
對系統的第一次開機,我寫一個isPackageNative(PackageParser.Package PKG)檢查各系統封裝機二進制文件的功能:
private boolean isPackageNative(PackageParser.Package pkg) throws IOException {
final ZipFile zipFile = new ZipFile(pkg.mPath);
final Enumeration<? extends ZipEntry> privateZipEntries = zipFile.entries();
while (privateZipEntries.hasMoreElements()) {
final ZipEntry zipEntry = privateZipEntries.nextElement();
final String zipEntryName = zipEntry.getName();
if(true) Log.e(TAG, " Zipfile entry:"+zipEntryName);
if (zipEntryName.endsWith(".so")) {
zipFile.close();
return true;
}
}
zipFile.close();
return false;
}
這個功能檢查每一個包本機庫,如果有一,我解開它。 PMS在scanPackageLI(....)中檢查。搜索的方法如下代碼:
if (isSystemApp(pkg) && !isUpdatedSystemApp(pkg))
,並添加isPackageNative(PKG)檢查。還有其他一些小的修改需要,但是一旦你有了這個方向,你可能會想出它。希望能幫助到你!
從技術上講,我相信.so文件應該被複制到/data/data/com.yourpackage.name/lib目錄中,但是我在預裝的應用程序中遇到同樣的問題,不會將其複製到APK。 – Devunwired
我們所做的只是使用任何壓縮工具(例如7zip)手動解壓APK這樣的文件。然後,我們創建了一個make文件,在編譯android源代碼時將文件複製到/out/..../system/lib目錄。在我們的例子中,我們希望將它包含在ROM映像中,因爲它是本地應用程序所需要的,這就是爲什麼我們需要將它複製到/ system/lib目錄。 – artsylar
你可以參考這個論壇https://groups.google.com/group/android-ndk/browse_thread/thread/2d08a95b3038e532?hl=ja 他們有同樣的問題,我們的 – artsylar