(ubuntu)在andorid andk工程中使用ccache加速编译速度

本文介绍如何在Linux环境下使用ccache与Android NDK结合,通过配置环境变量和修改makefile文件来实现缓存编译过程,显著提高构建效率。实验证明,在不改变源代码的情况下,ccache能够有效减少编译时间。

环境

系统:Linux luogw-pc 3.5.0-36-generic #57~precise1-Ubuntu SMP Thu Jun 20 18:21:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

ndk:   ndk-r8d

cache: ccache version 3.1.6


第一步:安装ccache

sudo apt-get install ccache


第二步:配置ccache

添加环境变量 export NDK_CCACHE=ccache


第三步:修改 android-ndk-r8e/build/core/default-build-commands.mk

注:红色部份为修改的内容,原内容被注释掉

#
# IMPORTANT: The following definitions must use lazy assignment because
# the value of TOOLCHAIN_PREFIX or TARGET_CFLAGS can be changed later by
# the toolchain's setup.mk script.
#


ifneq ($(findstring ccc-analyzer,$(CC)),)
TARGET_CC       = $(CC)
else
#TARGET_CC       = $(TOOLCHAIN_PREFIX)gcc
TARGET_CC       = ccache $(TOOLCHAIN_PREFIX)gcc
endif
TARGET_CFLAGS   =


ifneq ($(findstring c++-analyzer,$(CXX)),)
TARGET_CXX      = $(CXX)
else
#TARGET_CXX      = $(TOOLCHAIN_PREFIX)g++
TARGET_CXX      = ccache $(TOOLCHAIN_PREFIX)g++
endif
TARGET_CXXFLAGS = $(TARGET_CFLAGS) -fno-exceptions -fno-rtti

实践对比:

使用ccache前后情况对比如下

luogw@luogw-pc:~/study/bitmap-plasma$ ccache -s
cache directory                     /home/luogw/.ccache
cache hit (direct)                     0
cache hit (preprocessed)               0
cache miss                             0
files in cache                         0
cache size                             0 Kbytes
max cache size                       1.0 Gbytes
luogw@luogw-pc:~/study/bitmap-plasma$ time ndk-build
Gdbserver      : [arm-linux-androideabi-4.7] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Gdbserver      : [arm-linux-androideabi-4.7] libs/armeabi-v7a/gdbserver
Gdbsetup       : libs/armeabi-v7a/gdb.setup
Compile thumb  : plasma <= plasma.c
SharedLibrary  : libplasma.so
Install        : libplasma.so => libs/armeabi/libplasma.so
Compile thumb  : plasma <= plasma.c
SharedLibrary  : libplasma.so
Install        : libplasma.so => libs/armeabi-v7a/libplasma.so

real	0m0.226s
user	0m0.128s
sys	0m0.032s
luogw@luogw-pc:~/study/bitmap-plasma$ ccache -s
cache directory                     /home/luogw/.ccache
cache hit (direct)                     0
cache hit (preprocessed)               0
cache miss                             2
called for link                        2
multiple source files                  2
files in cache                         6
cache size                           108 Kbytes
max cache size                       1.0 Gbytes
luogw@luogw-pc:~/study/bitmap-plasma$ rm -r libs/ obj/
luogw@luogw-pc:~/study/bitmap-plasma$ time ndk-build
Gdbserver      : [arm-linux-androideabi-4.7] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Gdbserver      : [arm-linux-androideabi-4.7] libs/armeabi-v7a/gdbserver
Gdbsetup       : libs/armeabi-v7a/gdb.setup
Compile thumb  : plasma <= plasma.c
SharedLibrary  : libplasma.so
Install        : libplasma.so => libs/armeabi/libplasma.so
Compile thumb  : plasma <= plasma.c
SharedLibrary  : libplasma.so
Install        : libplasma.so => libs/armeabi-v7a/libplasma.so

real	0m0.114s
user	0m0.052s
sys	0m0.008s
luogw@luogw-pc:~/study/bitmap-plasma$ ccache -s
cache directory                     /home/luogw/.ccache
cache hit (direct)                     2
cache hit (preprocessed)               0
cache miss                             2
called for link                        4
multiple source files                  4
files in cache                         6
cache size                           108 Kbytes
max cache size                       1.0 Gbytes


参考文章:

1)http://www.41post.com/4509/programming/android-use-ccache-with-android-ndk-in-cygwin

2)http://www.mirwing.com/2011/11/android-android-ndk-revision-7.html

<think>我们正在处理一个关于将FastBLE库移植到新Android工程的问题。用户要求完整的步骤。虽然提供的引用没有直接提到FastBle,但它们提供了Android项目移植的一般步骤和注意事项。我们可以结合这些一般步骤,并针对FastBle的特性进行说明。 根据引用[1]和[2],我们知道在移植时需要注意: - 项目结构和构建系统的差异(Eclipse到Android Studio,但这里用户没有说明是从Eclipse还是直接到新工程,所以我们可以假设是新建Android Studio工程) - 包名(package name)的一致性(引用[2]提到) - 库的依赖配置 另外,引用[3]提到了移植FFmpeg和OpenCV,其中涉及了JNI和NDK的使用,如果FastBle涉及JNI代码,那么也需要类似的步骤。 由于FastBle是一个Android蓝牙库,它可能是一个纯Java库,也可能包含JNI部分。但根据其公开资料(FastBle是一个Android BLE框架,以纯Java实现),我们暂时可以认为它不包含JNI部分,这样移植会更简单。 完整步骤: 1. **创建新的Android工程** 在Android Studio中新建一个工程,选择适当的项目模板,并配置包名(如果需要和原有工程保持一致,则设置相同包名)。 2. **添加FastBle依赖** FastBle通常可以通过Gradle依赖引入。在项目的build.gradle文件中添加仓库(如jcenter或mavenCentral,具体看FastBle的文档),然后在模块的build.gradle中添加依赖。 例如:`implementation 'com.clj.fastble:FastBle:版本号'` 如果用户需要手动导入库(例如,因为修改了源码),则: - 将FastBle的源码或库文件(如jar或aar)复制到新工程中。 - 如果使用源码,则通过导入模块(File -> New -> Import Module)选择FastBle的源码目录,然后在模块的build.gradle文件中添加依赖:`implementation project(':fastble')` 3. **配置权限** 在AndroidManifest.xml中添加蓝牙所需的权限: ```xml <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- 针对Android 12及以上,可能需要添加BLUETOOTH_SCAN等权限,且动态申请 --> ``` 4. **复制必要的代码和资源** 将原工程使用FastBle的相关代码(例如BLE操作的工具类、Activity、Service等)复制到新工程的相应位置。 注意:如果原工程使用了FastBle的某些资源(如图片、字符串等),也需要复制到新工程中。 5. **处理Proguard混淆(如果启用)** 如果启用了混淆,需要在proguard-rules.pro文件中添加FastBle的混淆规则(通常库的文档会提供)。 6. **适配Android版本** 尤其注意Android 6.0以上需要动态申请位置权限(因为蓝牙扫描需要),以及Android 10以上对设备MAC地址的限制等。 7. **测试** 在真机上测试BLE功能,确保扫描、连接、读写数据等操作正常。 如果FastBle包含JNI部分(虽然不太可能,但假设有),则需要: - 将JNI相关的源码或预编译的.so文件放入新工程的对应目录(如app/src/main/jniLibs/abi目录)。 - 配置NDK(在模块的build.gradle中设置ndk配置,或者使用CMake/ndk-build)。 由于用户没有提供原工程的具体信息,以上步骤以常见情况为主。 注意:FastBle的官方文档或GitHub页面通常有使用说明,建议用户参考。 根据引用[4]中提到的移植LVGL时注意文件目录结构,我们在复制文件时也要注意保持目录结构,特别是包名对应的目录结构。 因此,完整步骤总结如下: §§ 回答 §§ 将 FastBLE 移植到新的 Android 工程中可以按照以下步骤进行。请注意,以下步骤假设您在 Android Studio 中进行操作。 ### 1. **创建新工程** - 打开 Android Studio,选择创建新项目(File → New → New Project)。 - 选择适当的模板(例如 Empty Activity),并设置包名(Package name)和其他项目配置。确保包名与原工程一致(若需要),否则可能需要修改代码中的包引用[^2]。 ### 2. **添加 FastBLE 依赖** FastBLE 可以通过 Gradle 依赖或手动导入方式添加: - **Gradle 依赖(推荐)**: 在模块的 `build.gradle`(Module 级别)的 `dependencies` 部分添加: ```groovy dependencies { implementation 'com.clj.fastble:FastBle:2.4.0' // 请使用最新版本号 } ``` 然后同步项目(Sync Now)。 - **手动导入**(若需修改源码): 1. 下载 FastBLE 源码(如从 GitHub)。 2. 在 Android Studio 中选择 `File → New → Import Module`,导入 FastBLE 的源码目录。 3. 在模块的 `build.gradle` 中添加依赖: ```groovy dependencies { implementation project(':fastble') // 模块名与实际一致 } ``` ### 3. **配置权限** 在 `AndroidManifest.xml` 中添加蓝牙所需权限: ```xml <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- Android 6.0+ 需要位置权限用于扫描 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Android 12 新增的蓝牙权限 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> ``` > **注意**:Android 6.0(API 23)及以上需在代码中动态申请位置权限;Android 12(API 31)及以上需动态申请 `BLUETOOTH_SCAN` 权限[^3]。 ### 4. **复制代码和资源** - 将原工程中与 FastBLE 相关的 Java/Kotlin 代码(如 BLE 操作工具类、Service 等)复制到新工程的对应包目录下。 - 如有自定义资源(如图片、字符串),复制到 `res` 目录下。 - 修改代码中可能存在的包名不一致问题(可使用 Android Studio 的 `Refactor → Rename` 调整)。 ### 5. **处理混淆(ProGuard)** 若启用混淆,在 `proguard-rules.pro` 中添加 FastBLE 的保留规则: ```proguard -keep class com.clj.fastble.** { *; } ``` ### 6. **版本适配** - **Android 6.0+**:在运行时动态申请 `ACCESS_FINE_LOCATION` 权限。 - **Android 10+**:限制非系统应用获取设备 MAC 地址,需使用 `BluetoothDevice.getAddress()` 的替代方案(如通过扫描记录设备)。 - **Android 12+**:需声明新权限并在运行时申请 `BLUETOOTH_SCAN`(需无位置访问)和 `BLUETOOTH_CONNECT`。 ### 7. **测试功能** 在真机上运行以下核心功能测试: - BLE 扫描 - 设备连接与断开 - 数据读写/通知 ### 注意事项 - 若原工程使用 JNI 或 NDK,需额外复制 `.so` 文件到 `src/main/jniLibs` 目录,并配置 CMake[^3]。但 FastBLE 为纯 Java 库,通常无需此步骤。 - 确保项目使用的 `compileSdkVersion` 和 `targetSdkVersion` 符合最新要求(推荐 ≥ 31)[^2][^3]。 > **提示**:详细配置可参考 FastBLE 官方文档(如 [GitHub 主页](https://github.com/Jasonchenlijian/FastBle))或示例工程。 §§ 相关问题 §§ 1. 如何处理 Android 12 上的蓝牙权限问题? 2. FastBLE 支持低功耗蓝牙的所有特性吗? 3. 在 Android 上调试 BLE 有哪些常用工具? </think>### FastBle移植到新Android工程的完整步骤 #### **1. 配置新工程基础环境** - 在Android Studio中新建工程(`File → New → New Project`),选择`Empty Activity`模板。 - 确保`build.gradle (Module)`配置如下: ```gradle android { compileSdkVersion 33 // 最低支持API 21(BLE需Android 5.0+) defaultConfig { minSdkVersion 21 targetSdkVersion 33 } } ``` - 同步Gradle配置(点击`Sync Now`)[^1]。 --- #### **2. 添加FastBle依赖** **方式一:Gradle引入(推荐)** 在`app/build.gradle`中添加依赖: ```gradle dependencies { implementation 'com.clj.fastble:FastBleLib:2.3.4' // 检查最新版本 } ``` > ⚠️ 若需兼容旧版,可添加`android.useDeprecatedNdk=true`至`gradle.properties`[^3]。 **方式二:手动导入源码** 1. 下载[FastBle源码](https://github.com/Jasonchenlijian/FastBle)。 2. 复制源码中的`fastblelib`模块到工程目录(如`app/libs/fastblelib`)。 3. 在`settings.gradle`添加: ```gradle include ':app:libs:fastblelib' ``` 4. 在`app/build.gradle`中添加依赖: ```gradle dependencies { implementation project(':app:libs:fastblelib') } ``` [^4] --- #### **3. 配置权限与ProGuard** - **权限声明**:在`AndroidManifest.xml`中添加: ```xml <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- Android 12以下必需 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN"/> <!-- Android 12+ --> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/> <!-- Android 12+ --> ``` - **ProGuard规则**(若启用混淆): ```proguard -keep class com.clj.fastble.** { *; } -keep class com.clj.fastble.callback.** { *; } ``` --- #### **4. 移植核心代码** - 将原工程中调用FastBle的代码(如`BleManager`、扫描/连接回调)复制到新工程。 - **关键适配点**: - **Android 12+ 权限适配**:动态申请权限: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { requestPermissions(new String[]{Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT}, REQUEST_CODE); } ``` - **包名一致性**:检查原工程与新建工程的包名是否一致(`AndroidManifest.xml`中的`package`属性)[^2]。 --- #### **5. 测试与调试** 1. **扫描设备测试**: ```java BleManager.getInstance().scan(new BleScanCallback() { @Override public void onScanFinished(List<BleDevice> scanResultList) { // 处理扫描结果 } }); ``` 2. **连接与通信测试**:验证读写特征值、通知使能等功能。 3. **日志排查**:开启FastBle内置日志: ```java BleManager.getInstance().enableLog(true); // Debug模式 ``` --- #### **6. 常见问题解决** - **库冲突**:若存在重复依赖(如`okhttp`),在`build.gradle`中排除: ```gradle implementation ('com.clj.fastble:FastBleLib:x.x.x') { exclude group: 'com.squareup.okhttp3', module: 'okhttp' } ``` - **JNI兼容问题**:若使用NDK,确保`.so`文件放入`app/src/main/jniLibs/abi目录`(如`armeabi-v7a`)[^3]。 - **BLE回调无响应**:检查是否在主线程操作(FastBle需在主线程初始化)。 > **完成标志**:成功扫描到BLE设备并完成数据读写。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值