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
3.jni的编译
得到的是.so动态库,另外注意如下几点:
1.通过上述编译的apk通过adb install 安装能得到.so库,但是push到system/app下,则没有libCipher.so,重启也没有
需要手动push lib库到system/lib或者将代码全编一起烧录。
2.上面的mk文件调用了子目录jni下的mk文件来编译jni(最后一句话),将jni当成单独的项目来编译,示例mk文件如下:
并且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文件。
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文件。
相关文章推荐
- Android源码编译相关问题汇总
- Android 源码编译相关
- android源码编译相关
- 编译Android源码相关资源及文章
- ubuntu12.04编译android源码环境搭建____安装相关包
- Linux下编译Android源码问题汇总
- Android 源码编译出错汇总
- Android源码编译make的各类错误解决方案汇总
- android源码编译相关
- 编译android 源码相关文章
- 如何编译android 4.1 的源码并在android的ADT里面调试framework相关的代码
- Android源码编译相关问题记录
- android 源码编译及其运行模拟器相关问题记录
- android 源码编译相关
- Android 源码编译相关
- Linux下编译Android源码问题汇总
- Android源码编译问题汇总
- Android 源码编译相关命令
- Android内核开发 相关工具及源码下载汇总