对于今天早上学习到的makefile 文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
PRODUCT_COPY_FILES += $(LOCAL_PATH)/+目录和文件比如 就是拷贝文件到:文件原来位置
PRODUCT_COPY_FILES += $(LOCAL_PATH)/libs/armeabi/sdkcore.so:system/lib/sdkcore.so
#================================================
LOCAL_MODULE_TAGS := optional 制定编译版本 user debug option (所有的版本都编译)等
LOCAL_CERTIFICATE := platform 是平台的签名
LOCAL_PROGUARD_ENABLED := disabled 是否混淆
LOCAL_SRC_FILES := $(call all-java-files-under, src) src的文件路径
LOCAL_RESOURCE_DIR = $(LOCAL_PATH)/res res 的文件路径
LOCAL_PACKAGE_NAME :=so 文件的名字
# 所引用的java library 这个时候会去找其中的关联文件,如果关联文件存在就正常关联
#不存在的话就报错,这个时候如果下面有定义就可以使用,没有定义并且是去找,但是如果是tests那#么就报错。
一般应该提前编译 java library 忘记是检测之后编译还是没有编译的话就报错了。
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 \
#区别于不同的包的不同的引用,如果这个是_What_FOR_ANDROID_L那么使用 org.apache.http.legacy这个文件
ifneq ($(strip $(What_FOR_ANDROID_L)), yes)
LOCAL_JAVA_LIBRARIES += org.apache.http.legacy
endif
#是否使用Jack
LOCAL_JACK_ENABLED := disabled
#LOCAL_REQUIRED_MODULES :=
coreSDK
LOCAL_REQUIRED_MODULES的作用当编译整个android源码时,如果这个模块在编译路径中
,
则会自动编译
coreSDK
,并且打包到system.img,如果不是编译整个源码,只是mm。则不会编译
coreSDK直接使用
生成相应的文件。 所以这个时候可能需要去使用mma 去编译。
#LOCAL_JNI_SHARED_LIBRARIES := coreSDk
变量主要是用在JNI的编译中,如果你要在你的Java代码中引用JNI中的共享库*.so,此变量就是共享库的名字。
include $(BUILD_PACKAGE)
#这个时候表示所有的需要的链接都一定说明完整
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=
coreSDK:/libs/
coreSDK.jar \
#LOCAL_REQUIRED_MODULES :=
coreSDK 和这个对应 只有在LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES 定义之后才可以使用
include $(BUILD_MULTI_PREBUILT)# 编译多个 prebuilt
#
prebuilt.mk就是prebuilt的具体实现,
它是针对独立一个文件的操作
,multi_prebuilt.mk 可以针对##
多#
个文件的,它对多个文件进行判断,然后调用prebuilt对独立一个文件进行处理。
#
预编译so ,jar 文件
include $(CLEAR_VARS)
LOCAL_MODULE := libweibosdkcore.so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)
#用这二个确定最后所在的文件列表的目录
LOCAL_SRC_FILES := libs/arm64-v8a/sdkcore.so
#所在的文件目录
include $(BUILD_PREBUILT)
#====================================================
#====================================================
对于so文件的定义等。
#include $(CLEAR_VARS)
#LOCAL_MODULE :=
sdkcore.so
#LOCAL_MODULE_CLASS := SHARED_LIBRARIES
#LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)
#LOCAL_SRC_FILES := libs/armeabi-v7a/
sdkcore.so
#include $(BUILD_PREBUILT)
include $(call all-makefiles-under,$(LOCAL_PATH))
#去call 了一下列表下面的所有文件
define all-makefiles-under
$(wildcard $(1)/*/Android.mk)
endef
1.只include Android.mk文件,叫其他名字的mk文件,不include.
2.只include这个$(LOCAL_PATH)一级目录下的Android.mk文件,而不是所有子目录以及子目录下的Android.mk文件
应该是为了保证目录下面的mk文件都可以被识别到然后可以编译。
$(shell $(LOCAL_PATH)/distribute.sh)
最后的结束语,不明所以
首先,这个mk文件应该分成3个部分。第一个部分分成,LOCAL_PATH := $(call my-dir)---include $(BUILD_PACKAGE) 第二个部分为 include $(CLEAR_VARS)---include $(BUILD_MULTI_PREBUILT) 第三个部分为:include $(CLEAR_VARS)---include $(BUILD_PREBUILT)。
对于第一个部分来说,这个过程定义了编译的各个属性,和相关的依赖关系:
include $(CLEAR_VARS) :清除所所设置的属性,避免上一次编译的属性使用到这一次的编译过程中。
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_TAGS :=user eng tests optional
user: 指该模块只在user版本下才编译
eng: 指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在所有版本下都编译
LOCAL_CERTIFICATE := platform
这个功能和 android:sharedUserId和LOCAL_CERTIFICATE 相关。
都是用系统的签名来对apk 进行签名。其中签名的文件是:build\target\product\security",下面的platform.pk8和platform.x509.pem两个文件
签名的工具是:
Android提供的Signapk工具来签名,signapk的源代码是在"build\tools\signapk"下,用法为"signapk platform.x509.pem platform.pk8 input.apk output.apk"
其中通过 android:sharedUserId 也已可应用共享同一个进程,但是如果签名不一样是没有办法共享的,其中签名问题还设计到很多,之后可以补充。
其中这个属性还可以有其他的赋值比如:
LOCAL_CERTIFICATE := PRESIGNED 表示 这个apk已经签过名了,系统不需要再次 签名;
LOCAL_CERTIFICATE := platform 表示为系统签名
LOCAL_CERTIFICATE := media
用于指定签名时使用的KEY,如果不指定,默认使用testkey,LOCAL_CERTIFICATE可设置的值如下:
LOCAL_CERTIFICATE := platform
该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,
这种方式编译出来的APK所在进程的UID为system
LOCAL_CERTIFICATE := shared
该APK需要和home/contacts进程共享数据。
LOCAL_CERTIFICATE := media
该APK是media/download系统中的一环。
LOCAL_CERTIFICATE :=
testkey 普通APK,默认情况下使用。、
对于使用eclipse编译的apk,其实 是用
testkey
来签的名;我们也可以用signapk.jar来手动进行签名,其源码在build/tools/signapk下,编译后在out/host/linux-x86/framework/signapk.jar,也可以从网上下载。使用方法,例如:
把签名修改为platform
:
Java
-jar ./signapk platform.x509.pem platform.pk8 input.apk output.apk
(platform.x509.pem platform.pk8在build/target/product/security获取)。build/target/product/security获取)。
LOCAL_PROGUARD_ENABLED := disabled
是否混淆
LOCAL_SRC_FILES := $(call all-java-files-under, src)
确定一个src文件
LOCAL_RESOURCE_DIR = $(LOCAL_PATH)/res
定义一个res文件
LOCAL_PACKAGE_NAME := name
给这个package 确定name