应用级.so文件添加到系统:
整个系统编译生成的.so文件会自动生成并放在 system/lib目录下
AMlogic T968:
System.loadLibrary("one_jni");
JNI生成的库文件要以 lib 开头,如 libone_jni.so
系统级.so文件的添加:
1.相应的目录加入android_os_hmdSysPropSet.cpp、hmdSysPropSet.java
base/core/jni/android_os_hmdSysPropSet.cpp
base/core/java/android/os/hmdSysPropSet.java
2.修改以下
1.base/core/jni/AndroidRuntime.cpp
extern int register_android_os_hmdSysPropSet(JNIEnv *env);//add by cg
REG_JNI(register_android_os_hmdSysPropSet),//add by cg
2.base/core/jni/Android.mk //包含机关的动态库so
LOCAL_SHARED_LIBRARIES := \
libhmdSysPropSet \
LOCAL_SRC_FILES:= \
android_os_hmdSysPropSet.cpp \
3.把hmdSystemPropertiesSet放置external目录下,编译出来的是.so
4.Shutdown是一个调用jni的例子
make update-api:
添加系统API或者修改 @hide的API后,需要执行
修改公共api后,需要执行
如果在Android源码中添加了自定义的包、类、方法或者你修改了Android源码中标识为@hide的
方法、类,需要这些内容对Application可见并且需要编译进SDK的Document中的话,这个命令是
必须的。
更新的文件是: frameworks/base/api/ current.txt
System.load(String pathName):
pathName路径必须有执行权限,意思就是说我们不能加载SD卡上的so,因为没有执行权限
动态加载.so,实现动态库升级:
第一种,使用系统方法:
void java.lang.System.load(String pathName)
我们只需要架个服务器,每次启动时动态监测so文件有没有更新,有则下载so,然后加载,
这样就可以避免用户安装新的应用。
第二种,采用dlopen动态加载的第三方库:
实现指定路径加载so的目的,这种方法升级so的话,那就需要一个基本so,一直不变,用来调
用dlopen,然后升级另一个so。
Android系统级应用和普通应用的区别:
1. 签名不同
Android系统应用使用的是系统签名,或称为平台(Platform)签名,而普通的Android应用
使用的是一般的签名。
2. 可以访问的API不同
在Android SDK中有很多API(类、接口、方法等)都声明为hide[由于Android SDK中某些API
非常危险,例如,可以静默安装、卸载程序、拦截电话等,所以Google公司在设计这些API时
将其声明为hide,以便只有在Android系统应用中才能使用。这些Android系统应用 不能通过
常规方法安装,只能在有root权限的情况下上传到Android设备的/system/app目录,或随ROM
一起发布,还可以通过刷机(升级包)的方法安装这些应用。这就限制了这些危险API的使用,
从而大大降低使用Android系统的风险]。这类API不允许在普通的Android应用中访问,而只有
经过Platform签名的Android系统应用才能使用这些API。
编译Android系统级应用:
要想编译Android系统应用,必须要依靠Android源代码才可以。通常会将Android系统应用的源代码
放到<Android源代码根目录>/package/apps目录或其子目录中。编译Android系统应用需要在程序的
根目录建立一个Android.mk文件,该文件是Android源代码专用的编译文件,相当于GCC的Makefile文
件。
LOCAL_CERTIFICATE :=platform 表示签名类型,系统应用通常设为 platform,表示platform签名。
Android系统的签名:
Android源代码中包含了4个签名:
testkey:普通的Key,默认情况下使用。
platform:使用该签名的系统应用可以执行平台的核心功能。
shared:使用该签名的系统应用可以和 home/contacts进程共享数据
media:使用该签名的系统应用将成为 media/download系统的一部分。
LOCAL_CERTIFICATE 变量可以指定上述4个值,如果值为 platform,会使用security目录的platform
.pk8文件对APK文件进行签名。如果值为media,会使用media.pk8文件对APK文件进行签名。
Binder: