Android 源码环境Android.mk编译android studio 项目

前言

由于Android.mk编译app默认使用的目录与android studio项目目录不一样导致无法直接编译。另外android studio 项目常常依赖其aar或jar库,直接把代码放入源码编译会出现找不到资源的情况。本文描述了如何在Android 源码环境Android.mk编译android studio 项目,涉及资源路径配置、aar和jar配置。本文基于android 8.1 源码环境。

最终Android.mk内容如下,使用到了appcompat和constraint。

LOCAL_PATH:= $(call my-dir)

# 清除除了LOCAL_PATH外的所有变量
include $(CLEAR_VARS)

# support包的根目录,因为编译时我们只能引用来自于framework的support包
support_library_root_dir := frameworks/support

# 设置src 和 res
LOCAL_SRC_FILES := $(call all-java-files-under, app/src/main/java)
LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, app/src/main/res) \
	$(support_library_root_dir)/v7/appcompat/res

# 指定Manifest文件
LOCAL_MANIFEST_FILE := app/src/main/AndroidManifest.xml

# 重复资源自动覆盖
LOCAL_AAPT_FLAGS += \
    --auto-add-overlay \
    --extra-packages android.support.constraint \
    --extra-packages android.support.v7.appcompat

	
# frameworks/support/ 下有v7 和 v4的源码
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v7-appcompat android-support-v4
# 依赖库,jar
LOCAL_STATIC_JAVA_LIBRARIES += constraint-layout-solver

# 依赖库,aar
LOCAL_STATIC_JAVA_AAR_LIBRARIES := constraint-layout


# Apk名称
LOCAL_PACKAGE_NAME := NetworkSettings

# 平台签名
LOCAL_CERTIFICATE := platform

# BUILD_PACKAGE 是一个预定义的宏,里面包含编译一个APK的脚本。
include $(BUILD_PACKAGE)

include $(CLEAR_VARS)

# 构建依赖的jar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := constraint-layout-solver:app/libs/constraint-layout-solver-1.1.3.jar

# 构建依赖的aar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += constraint-layout:app/libs/constraint-layout-1.1.3.aar

include $(BUILD_MULTI_PREBUILT)

include $(call all-makefiles-under,$(LOCAL_PATH))

 

一、Android.mk配置源码和资源路径

# 配置源码路径
LOCAL_SRC_FILES := $(call all-java-files-under, app/src/main/java)

# 配置资源路径
LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, app/src/main/res)

# 指定Manifest文件
LOCAL_MANIFEST_FILE := app/src/main/AndroidManifest.xml

二、Android.mk配置aar和jar

    第三方库导入:

# BUILD_PACKAGE 是一个预定义的宏,里面包含编译一个APK的脚本。
include $(BUILD_PACKAGE)

include $(CLEAR_VARS)

# 构建依赖的jar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := constraint-layout-solver:app/libs/constraint-layout-solver-1.1.3.jar

# 构建依赖的aar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += constraint-layout:app/libs/constraint-layout-1.1.3.aar

include $(BUILD_MULTI_PREBUILT)

 其中constraint-layout-solver-1.1.3.jar和constraint-layout-1.1.3.aar是从Android studio项目中根据External Libraries列表找到对应的库文件并放入应用源码的app/libs目录下。

第三方库使用:

# 依赖库,jar
LOCAL_STATIC_JAVA_LIBRARIES += constraint-layout-solver

# 依赖库,aar
LOCAL_STATIC_JAVA_AAR_LIBRARIES := constraint-layout

第三方库资源覆盖使应用能找到aar中相关资源文件

# 重复资源自动覆盖
LOCAL_AAPT_FLAGS += \
    --auto-add-overlay \
    --extra-packages android.support.constraint

内部库导入:

appcompat直接使用源码中自带的库和资源,还依赖android-support-v4

LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, app/src/main/res) \
	$(support_library_root_dir)/v7/appcompat/res

# 指定Manifest文件
LOCAL_MANIFEST_FILE := app/src/main/AndroidManifest.xml

# 重复资源自动覆盖
LOCAL_AAPT_FLAGS += \
    --auto-add-overlay \
    --extra-packages android.support.v7.appcompat

	
# frameworks/support/ 下有v7 和 v4的源码
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v7-appcompat android-support-v4

三、关于Android studio项目库版本与源码SDK版本匹配问题

库版本需要SDK匹配,否则会出现库里调用的资源或接口无法找到问题。这里以android 8.1 sdk版本27为例:

从android9.0 (API28)开始, support库将会进行改动, V7: 28.0.0将会是support库的终结版本。未来新的特性和改进都会进入Androidx包。

所以android 8.1需要使用旧的库配置。

创建项目时勾选"Use legacy..."

compileSdkVersion 使用27

...
android {
    compileSdkVersion 27
    buildToolsVersion '29.0.2'

    defaultConfig {
        applicationId "com.example.test"
        minSdkVersion 27
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
...

在源码环境中app的AndroidMenifest.xml需要配置sdk版本

<uses-sdk android:targetSdkVersion="27" android:minSdkVersion="26"/>

参考:

用Android.mk的方式编译APK

Android.mk引用aar文件

Android Support v4\v7\v13和AndroidX理解

Android各版本对应的SDK版本

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值