安装NDK应用程序
我们正在尝试将NDK应用程序预安装到/system/app
目录中。 如果我在ZIP文件管理器中打开apk文件,则.so
文件位于lib目录中。 但是,当我们预安装apk
文件时,apk的.so
文件不会被复制到system/lib
目录,导致应用程序在设备中启动时失败。
任何人都可以告诉我应该在Android.mk
为APK文件设置什么,以便.so
文件将从APK文件中提取并复制到system/lib
目录中? 我们需要将该应用程序包含在系统映像中。
任何反馈将不胜感激。
谢谢,artsylar
我有同样的需求,经过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)检查。 还有其他一些小的修改需要,但是一旦你有了这个方向,你可能会想出它。 希望能帮助到你!
我认为默认情况下你不能这样做,因为Android的/系统分区以只读方式挂载! 您需要一部根深蒂固的电话,以便通过此命令以写权限挂载/系统:
mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system.
所以,如果你有一个固定电话,你可以在你的应用程序中添加这个代码:
Process p;
try {
// Preform su to get root privledges
p = Runtime.getRuntime().exec("su");
// Attempt to write a file to a root-only
DataOutputStream os = new DataOutputStream(p.getOutputStream());
// gain root privileges
os.writeBytes("mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /systemn");
// do here the copy operation you want in /system/lib file, for example:
os.writeBytes("mv /sdcard/mylib.so /system/lib/n");
// Close the terminal
os.writeBytes("exitn");
os.flush();
} catch (IOException e) {
toastMessage("could not get root access");
}
否则,你必须遵循digitalmouse12给出的解决方案。
你必须自己“adb push” .so
文件。 此外,您不一定必须将库推入system/lib
(无论如何,该文件夹可能会拒绝您的许可)。 大多数推送到data/app
,然后通过发布加载
System.load("/data/app/<libName>.so");
链接地址: http://www.djcxy.com/p/74575.html