源码编译引入第三方库

1. 发现问题

在Android工程开发中难免会有引入第三方库的需求,例如GSON,Okhttp,Glide等等,但是在源码中用makefile编译如何让编译器知道你引入的库呢?下面我举一个例子来说明

  • 例如我们工程需要引入GSON库,没引入的时候编译报错如下图。
    编译报错.png

  • 引入库制定编译规则
    依赖库问题.png

2. 寻找原因

原因的话编译器已经报出来了,就是找不到对应的类,也就是找不到对应的库文件。

3. 解决办法(引入第三方库方法)

在解决问题之前首先介绍一下这两个编译参数:BUILD_JAVA_LIBRARY 与 BUILD_STATIC_JAVA_LIBRARY

在Android.mk中可通过调用include $(BUILD_JAVA_LIBRARY)和include $(BUILD_STATIC_JAVA_LIBRARY)来分别生成目标设备上的共享JAVA库与静态JAVA库。

二者的区别在于**静态JAVA库是由.class文件打包而成JAR包,它在任何一个JAVA虚拟机上都可以运行**;而**共享JAVA库则是在静态库的基础上进一步打包成的.dex文件**,众所周知,dex是在android系统上所使用的文件格式。

由以上结论可做出进一步的推论:即Android.mk中变量LOCAL_JAVA_LIBRARIES所指定的为android系统使用的dex类库;而LOCAL_STATIC_JAVA_LIBRARIES变量所指定的则是.class文件打包而成的JAR文件:即静态JAVA库。

**BUILD_STATIC_JAVA_LIBRARY**会生成out/target/common/obj/JAVA_LIBRARIES/lib名_intermediates目录及其下的JAR文件;而**BUILD_JAVA_LIBRARY**生成此目录的同时会将其中的JAR包复制到out/target/product/<product-name>/system/framework/中;除此之外,还存在**BUILD_HOST_JAVA_LIBRARY**命令则是在out/host/linux-x86/framework目录下生成相应的JAR包。分别使用此三条命令执行的结果如下所示:注意其中带有红色下划线的LOG信息。
#编译第三方库基本用法
#在Android.mk目录下建立libs,然后将jar包放入libs,先预编译到out/target/product/generic/obj/JAVA_LIBRARIES下,然后本项目就会找到依赖的者jar包了
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := gson:libs/gson-2.8.2.jar
include $(BUILD_MULTI_PREBUILT)

#################以下是顺带的说明########################
#################完整的mk文件###########################
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_PACKAGE_NAME := Permission
LOCAL_MODULE_TAGS := optional
LOCAL_CERTIFICATE := platform

#LOCAL_SDK_VERSION 和LOCAL_PRIVATE_PLATFORM_APIS在Android.mk中必须用一个
#LOCAL_SDK_VERSION := current  意思是编译时忽略系统隐藏类(@hide)
#LOCAL_PRIVATE_PLATFORM_APIS := true 表示可以应用系统的API(@hide或者@SystemApi)
LOCAL_PRIVATE_PLATFORM_APIS := true

#关闭混淆优化器,没有这个配置,会报:
#there were 194 unresolved references to program class members.Your input classes appear to be inconsistent.
#there were 2494 unresolved references to library class members. You probably need to update the library versions. Alternatively, you may have to specify the option 
LOCAL_PROGUARD_ENABLED := disabled

LOCAL_SRC_FILES := $(call all-java-files-under, src)
#编译aidl文件
LOCAL_SRC_FILES += $(call all-Iaidl-files-under,src/com/xh/permission) \
                    src/com/xh/permission/ICarPermissionManager.aidl

LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/src/com/xh/permission

#应用第三方库
LOCAL_STATIC_JAVA_LIBRARIES := gson \
	android-support-v7-appcompat \
	xhframework

LOCAL_STATIC_ANDROID_LIBRARIES := android-support-annotations
include $(BUILD_PACKAGE)

################我是分割线#####################
LOCAL_STATIC_JAVA_LIBRARIES := gson
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := gson:libs/gson-2.8.2.jar
include $(BUILD_MULTI_PREBUILT)

4.扩展点

如果在Android FrameWork集成第三方SDK的jar包和so库,首先在framework/opt/建立XXXSDK的文件夹讲jar包和so库拷贝进去。

framework依赖库编译.png

###################### mk文件如下 ################################
# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
 
LOCAL_PATH := $(my-dir)
 
include $(CLEAR_VARS)
 
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := okhttp-3.12.0.jar \
                                        rxjava-2.1.12.jar \
                                        sqlite.jar
 
include $(BUILD_MULTI_PREBUILT)
 
##################################################
include $(CLEAR_VARS)
LOCAL_MODULE := libcarlife
LOCAL_SRC_FILES := libs/libcarlife.so
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
 
include $(BUILD_PREBUILT)
 
include $(call all-makefiles-under,$(LOCAL_PATH))
 
##################################################
include $(CLEAR_VARS)
LOCAL_MODULE := libcarlifeserver
LOCAL_SRC_FILES := libs/libcarlifeserver.so
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
 
include $(BUILD_PREBUILT)
 
include $(call all-makefiles-under,$(LOCAL_PATH))
 
##################################################
include $(CLEAR_VARS)
LOCAL_MODULE := libcarlifeservicejni
LOCAL_SRC_FILES := libs/libcarlifeservicejni.so
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
 
include $(BUILD_PREBUILT)
 
include $(call all-makefiles-under,$(LOCAL_PATH))

##################################################
include $(CLEAR_VARS)
LOCAL_MODULE := libcarlifevehicle
LOCAL_SRC_FILES := libs/libcarlifevehicle.so
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
 
include $(BUILD_PREBUILT)
 
include $(call all-makefiles-under,$(LOCAL_PATH))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Go语言中,安装第三方包需要下载、引入和版本管理。你可以使用以下步骤来安装第三方包: 1. 首先,在命令行中使用`go get`命令下载第三方包。例如,如果要安装github.com/gin-gonic/gin包,可以运行以下命令:`go get github.com/gin-gonic/gin***出一个pkg文件夹,其中包含你安装的包。 3. 如果你无法直接在网络上安装包,你可以选择离线安装的方法。首先,你需要到对应的第三方包的GitHub页面(例如https://github.com/gpmgo/gopm)下载源码压缩文件。 4. 将下载的源码压缩文件解压到对应的文件夹,并按照相应的目录结构进行构建。 5. 对于手动安装,你可以使用`go install`命令来安装包。例如,如果要安装github.com/gpmgo/gopm包,可以运行以下命令:`go install github.com/gpmgo/gopm`。 需要注意的是,Go语言对于导入的包有一定的规范。所有import的包必须在%GOPATH路径下,如果直接导入源码路径下的包,编译会报错。因此,如果新加入的第三方包与工程目录脱离,你需要在使用或编译之前将第三方包所在的目录加入到$GOPATH中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [go语言 第三方包安装方法_【分享吧】Go语言第三方包的使用介绍与场景应用](https://blog.csdn.net/weixin_39760650/article/details/110134234)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Golang中第三方包安装方法-git](https://blog.csdn.net/yycoolsam/article/details/106194192)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值