android源码下编译相关汇总

来源:互联网 发布:js utf16 编辑:程序博客网 时间:2024/05/16 08:00

主要总结下源码下编译遇到的一些问题。


1.LOCAL_JAVA_LIBRARIES引用的文件在system/framework目录下面 
   问题: 在system/etc/permissions会有一些xml文件,其中有些文件名和system/framework下的某些jar包的包名相同。 
2.编译jar成静态库 
    LOCAL_STATIC_JAVA_LIBRARIES := libdom4j
    LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libdom4j:libs/dom4j-1.6.1.jar 
    

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := user #声明引用库的名字LOCAL_STATIC_JAVA_LIBRARIES := libdom4j    LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := CoolReader include $(BUILD_PACKAGE) #编译库include $(CLEAR_VARS) #注意格式和jar包路径,libdom4j可以随便,但是不要冲突。LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libdom4j:libs/dom4j-1.6.1.jar include $(BUILD_MULTI_PREBUILT) 

3.jni的编译

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := user engLOCAL_SRC_FILES := $(call all-subdir-java-files)LOCAL_PACKAGE_NAME := packagenameLOCAL_JNI_SHARED_LIBRARIES := libCipherinclude $(BUILD_PACKAGE)# Use the following include to make .so。include $(call all-makefiles-under,$(LOCAL_PATH))

得到的是.so动态库,另外注意如下几点:

  1.通过上述编译的apk通过adb install 安装能得到.so库,但是push到system/app下,则没有libCipher.so,重启也没有
    需要手动push lib库到system/lib或者将代码全编一起烧录。

  2.上面的mk文件调用了子目录jni下的mk文件来编译jni(最后一句话),将jni当成单独的项目来编译,示例mk文件如下:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_MODULE    := libCipherLOCAL_SRC_FILES := com_android_mic_udp_Cipher.c# for loggingLOCAL_LDLIBS    += -lloginclude $(BUILD_SHARED_LIBRARY)
  3.经过查看查找java加载库路径,System.getProperty("java.library.path")得到的路径是system/lib  和 vendor/lib ,另外也会在data/data/应用/lib/下查找

    并且BUILD_SHARED_LIBRARY生成的so库在system/lib下,可以通过编译log看到。或者将需要的so放在system/lib下,直接使用LOCAL_JNI_SHARED_LIBRARIES或者
    LOCAL_SHARED_LIBRARIES 引用so库

    LOCAL_JNI_SHARED_LIBRARIES将so编译到apk里面去(lib/armeabi-v7a/libxxx.so)

  4.如果系统库目录和第三方库目录下面有相同名称的so库,第三方程序会首先调用系统库。

4. 编译aidl文件 

  在mk文件的LOCAL_SRC_FILES里面加上aidl文件  

如果aidl是继承parcelable,则不是加aidl文件,而是加上aidl对应的java文件

5.如何控制make编译hdpi,mdpi和默认的高度和宽度
  1、修改frameworks\base\core\java\android\content\res \CompatibilityInfo.java:
      public static final int DEFAULT_PORTRAIT_WIDTH = 240;
      public static final int DEFAULT_PORTRAIT_HEIGHT = 320;
  2、在 build\target\product\generic.mk加入
      CUSTOM_LOCALES:= hdpi mdpi

      这样编译出的源码即使用hdpi

6.google源码下编译没有生成hdpi资源

    解决方法和上面类似,在build\target\product\generic.mk最后加上CUSTOM_LOCALES += hdpi mdpi

7.使用LOCAL_DEX_PREOPT = false  使得编译不生成odex文件
8.混淆代码开关

    build/core/proguard.flags中有下面一句,意指将默认不混淆,不需要代码删除,我们将这一句注释起来,就起到代码混淆编译的作用。
# Don't obfuscate. We only need dead code striping.
-dontobfuscate
将-dontobfuscate注释,然后在工程的mk文件里添加LOCAL_PROGUARD_FLAG_FILES := proguard.flags

    另外注意下,eclipse下编译如果用到了隐藏api,则无法导出混淆apk。使用framework编译出来的class文件导入到工程可以成功引用隐藏api并成功编译。

9.高通平台下,devices/qcom/common/common.mk里定义了很多工程信息,比如语言,locale,system.img包含的apk等。

  还有system/core/rootdir/init.rc文件。

原创粉丝点击