首页 > 代码库 > 20170502

20170502


    应用级.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:
            
            
    
    
   

20170502