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

android源码下编译相关汇总

2013-11-29 15:32 459 查看
主要总结下源码下编译遇到的一些问题。

1.LOCAL_J***A_LIBRARIES引用的文件在system/framework目录下面
问题: 在system/etc/permissions会有一些xml文件,其中有些文件名和system/framework下的某些jar包的包名相同。

2.编译jar成静态库
LOCAL_STATIC_J***A_LIBRARIES := libdom4j

LOCAL_PREBUILT_STATIC_J***A_LIBRARIES := libdom4j:libs/dom4j-1.6.1.jar



LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 

LOCAL_MODULE_TAGS := user 

#声明引用库的名字

LOCAL_STATIC_J***A_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_J***A_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 eng
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := packagename
LOCAL_JNI_SHARED_LIBRARIES := libCipher
include $(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 := optional

LOCAL_MODULE    := libCipher
LOCAL_SRC_FILES := com_android_mic_udp_Cipher.c

# for logging
LOCAL_LDLIBS    += -llog

include $(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文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: