主要总结下源码下编译遇到的一些问题。
1.LOCAL_JAVA_LIBRARIES引用的文件在system/framework目录下面
问题: 在system/etc/permissions会有一些xml文件,其中有些文件名和system/framework下的某些jar包的包名相同。2.编译jar成静态库
LOCAL_STATIC_JAVA_LIBRARIES := libdom4jLOCAL_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 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文件。