您的位置:首页 > 移动开发 > Android开发

android自定义静态jar包和动态jar包的编译、使用

2016-06-14 16:05 197 查看
有时候需要将自己定义的类打包成jar包供其它地方调用,有两种方式

一、做成静态jar包,Android.mk的写法

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_MODULE := AAFramework

include $(BUILD_STATIC_JAVA_LIBRARY)

一般做法是创建src目录,在src按需要添加的类的包名形式一级一级创建目录,然后把需要做成jar的类放到对应位置;

需要使用静态jar包的地方,只需要在编译的Android.mk中添加 LOCAL_STATIC_JAVA_LIBRARIES := SkyFramework

做静态依赖即可;静态jar包会被打包进需要使用的apk或者plugin插件中,使用静态jar的缺点,每次修改完静态jar涉及

的类的相关内容以后,需要使用的apk或plugin插件也需要重新编译打包才可,debug起来会比较费事;另外,如果有

几处都使用此静态jar包的话,容易产生jar包内容的重复,jar包内容过大时占用空间变大。

二、做成动态jar包,Android.mk写法

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_MODULE := AAFramework

ALL_DEFAULT_INSTALLED_MODULES += $(LOCAL_MODULE)

LOCAL_PROGUARD_ENABLED := disabled

LOCAL_DEX_PREOPT := false

include $(BUILD_JAVA_LIBRARY)

做法和静态jar包做法,只有一处不同,就是最后一句的声明的生成的是动态库;

使用的时候有两种方法:

1、使用的时候在去动态加载;

  首先,在apk的AndroidMainfest.xml文件中添加对动态库的声明;

  如: <application

                     <uses-library  
        android:name="android.net"> 
   </uses-library>

        </application>

   其次,在system/ect/permissions下添加android.net.xml配置文件,在配置文件中去声明jar包的路径

 <?xml version="1.0" encoding="utf-8"?>

 <permissions>

    <library name="android.net"

        file="/system/framework/AAFramework.jar"/>

</permissions>

标签<library>表示除了framework中的动态库以外,系统将为应用自动加载的动态库;

最后,只要在相应的system/framework目录下存在SkyFramework.jar即可

2、像系统自动加载framework.jar包一样,开机时候默认加载

  做法:Android5.0上是在build/target/product的core_minimal.mk中添加到

  PRODUCT_BOOT_JARS := \

AAFramework

开机的时候会默认加载此动态jar包

注:如果加载完成没有生效,提示classNotFind的话,需要去echo export $BOOTCLASSPATH,看下环境变量有没加进来,如果确认有加进来,但是还是报错的话,去手动清除一下data,看下会不会ok。我这边添加的时候一直报类找不到,最后手动清除data后才会正常,不知道是不是android5.0的bug,同事在android4.4上就没有遇到,但在android5.1上也有此问题。

动态jar包的使用的时候

a、可以在apk的Android.mk中去添加动态jar包的依赖,使用的时候jar包的类可以直接调用

b、apk编译的时候如果不在android.mk中做动态jar包的依赖的话,可以在使用的时候去动态寻找system/framework/SkyFramework的jar包,去load此jar包,在去找jar包中的   class;这种方法 apk中可以直接调用接口中自己定义的方法,编译时不需要去做android.mk的依赖。 实现的地方直接继承接口即可,打包到动态jar包中。

这样可以实现分离,接口的定义和实现做到分离,在开发阶段非常有用,不同部门直接可以并行进行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: