Android 开发环境搭建 与在编译中遇到错误make Error 45解决方法

本文详细介绍了在Ubuntu 10.10操作系统下搭建Android开发环境的全过程,包括安装Ubuntu、配置Java环境、下载与配置SDK、进行源代码操作等步骤。文中还解决了在配置过程中遇到的一些常见问题,如浏览器问题、下载工具使用、源代码访问问题等,并提供了详细的解决方法。

Android 开发环境搭建

一、安装ubuntu 10.10操作系统

使用光盘安装,注意分区,分一个swap分区为3G(原则需要与内存一样大,但可以稍微比内存大一点)。当时是同事帮我弄的,swap开了10G觉得很大,剩下的空间全部挂载在home目录下。

二、安装java环境
开始使用配置数据源的方式,找不到好的源,所以只要去oracle官方网下载,但遗憾的是ubuntu 10.10 自带的浏览器firefox3.6.10出现严重bug,不能下载软件,都快崩溃了,还以为下爱Chrome浏览器呢,下不了。使用命令sudo apt-get install aria2 安装aria2,aria2 是 Linux下一个不错的高速下载工具,试一试它,等待着安装。结果使用起来如何下载一个动态下载网址,却老失败,shell自动退去。这些时间折腾我好长时间,自己找哥们春鹤使用他机子下载chrome浏览器拷贝到移动硬盘上,再拷贝我的机子上面进行安装。现在22:25还在公司里面,唉一个字“累”!!!chrome安装也挺慢的....
终于装好了chrome了,进入oracle官方网站把jdk1.5下载下来,希望不要再出现问题。
出现了此网页无法访问。没有办法,只好把eclipse和sdk下载完毕!现在已经是23:43分了。现在已经是23:45分,此时我还在研究所!
明天继续搭建环境....


三、上午把家里的jdk1.5和1.6解压包拷贝过来,放到指定的目录下,然后设置环境变量,有3个步骤:
1.在profile文件末尾加入:
JAVA_HOME=/home/myandroid/devtools/jdk/jdk1.5.0_22
CLASSPATH=.:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
2.修改root用户下.bashrc文件
在最后追加:export PATH=/home/myandroid/devtools/jdk/jdk1.5.0_22/bin:$PATH
3.重新启动系统生效


准备下载源代码
1.repo init -u rocket:platform/manifest -b master-lephone
2.repo sync -d

一、进行full build源代码
1.进入源代码之后执行
. build/envsetup.sh
2.lunch 也可以用tapas 一个个选额(不支持lunch就选 choosecombo)
3.make update-api
4.make -j5

二、进行单个应用编译

1.进入源代码之后执行
. build/envsetup.sh
2.chose combo 1173
3.mmm /packages/app/AppStore

三、安装应用
adb install -r out/target .....apk
./adb install -r /home/tongzhu/lenovo/android/out/target/product/lephone_001w/system/app/PackageInstaller.apk


四、repo sync 出现
Bad owner or permissions on /home/tongzhu/.ssh/config
Bad owner or permissions on /home/tongzhu/.ssh/config
fatal: The remote end hung up unexpectedly
Bad owner or permissions on /home/tongzhu/.ssh/config
fatal: The remote end hung up unexpectedly
error: Cannot fetch platform/bionic
解决办法:
sudo chown tzliu:tzliu /home/tongzhu/.ssh/config
sudo chmod 644 /home/tongzhu/.ssh/config

repo sync

五、提交代码
1.git branch -a 查看
2.git checkout -t -b test0 nov/master-lephone 切换到分支
3.git add src/com/android/packageinstaller/PackageInstallerActivity.java 添加
4.git status 有哪些改动
5.git commit 提交代码,需要参照文档写 见7
6.git push nov HEAD:refs/for/master-lephone 提交到服务器;git push nov HEAD:refs/for/master
7. [BUG] 66618
[DES] APK格式安装文件安装成功后的提示信息与LCA格式安装文件提示不一致
[WHY] 处理不一致
[FIX] 添加统一获取appname方法

六、有时候需要自己编译sdk
1.进入源代码之后执行
. build/envsetup.sh
2.lunch 我选择6,根据情况选择
3.make update-api
4.make sdk
经过等待,编译完生成如下

文档:
Docs droiddoc: out/target/common/docs/dexdeps
DroidDoc took 0 sec. to write docs to out/target/common/docs/dexdeps

jar包,在开发加入classpath:
Package SDK Stubs: out/target/common/obj/PACKAGING/android_jar_intermediates/android.jar

需要的sdk:比如我们常用的adb命令
Package SDK: out/host/linux-x86/sdk/android-sdk_eng.tongzhu_linux-x86.zip

SDK: warning: including GNU target out/target/product/lephone_001w/system/lib/libdbus.so

四、android 2.3源码下载和配置

配置jdk
vi /etc/profile
export PATH=/home/zeus/bin:/usr/bin/git:/home/android/lenovosdk/android-sdk_eng.zeus_linux-x86/tools:/usr/lib/jvm/java-6-sun/jre/bin:"$PATH"

vi ~/.bashrc
#set java environment
export JAVA_HOME=/usr/lib/jvm/java-6-sun/
export JRE_HOME=JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH:/home/android/lenovosdk/android-sdk_eng.zeus_linux-x86/tools
alias adb1="/home/android/lenovosdk/LEOS_mobile_sdk_1.7.0_101029_linux/tools/adb"
alias adb2="/home/android/lenovosdk/android-sdk_eng.zeus_linux-x86/tools/adb"

前几天下载了Android 2.3.1的源代码并在Ubuntu 10.04(32位)上编译通过。这篇文章简要记录了下载、编译的过程。

关于搭建Android开发环境的文章已经有很多,本文只简要介绍一下,做为备忘。

[ 编译前的准备 ]

这一步安装获取源代码以及编译所需要的软件,使用如下命令:

$ sudo aptitude install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
另外,参考别人编译Android 2.3的经验,安装了下列软件包:

$ sudo apt-get install lib64z1-dev libc6-dev-amd64 g++-multilib lib64stdc++6
虽然Android官方网站上讲不支持Java 6,不过我使用Java 6也可以编译通过,所以在这里Easwy安装的是Java 6。首先去掉/etc/apt/sources.list中这两行的注释,使能Java 6源:

deb http://archive.canonical.com/ubuntu lucid partner
deb-src http://archive.canonical.com/ubuntu lucid partner
然后安装Java 6 JDK:

$ sudo aptitude install sun-java6-jdk
接下来下载repo工具,这是Google提供的一个Python脚本,方便管理多个Git版本库:

$ cd ~
$ mkdir bin
$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo
记得把repo加到你的路径中,方便以后使用。编辑~/.bashrc,加入下面一行:

PATH=$PATH:~/bin
export PATH
然后用命令. ~/.bashrc,以后就可以直接使用repo命令了。

接下来获取Android 2.3.1的源代码:

$ mkdir mydroid
$ cd mydroid
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.3.1_r1
$ repo sync
[ 编译Android ]

接下来开始编译:

$ make -j`grep '^processor' /proc/cpuinfo | wc -l`
上面的命令中,-j参数告诉make启动多个并行任务进行编译,在支持多核的CPU上能加快编译速度。如果你知道你CPU是几核的,可以直接把这部分替换成-j2(双核)。

我在编译的过程中遇到下面的错误:

************************************************************

You are attempting to build on a 32-bit system.

Only 64-bit build environments are supported beyond froyo/2.2.

************************************************************

这是因为在Makefile中检测了CPU的字长。我直接把build/core/main.mk中下面的话注释掉:

#ifneq (64,$(findstring 64,$(build_arch)))
#$(warning ************************************************************)
#$(warning You are attempting to build on a 32-bit system.)
#$(warning Only 64-bit build environments are supported beyond froyo/2.2.)
#$(warning ************************************************************)
#$(error stop)
#endif
接下来又遇到下面的错误:

Docs droiddoc: out/target/common/docs/api-stubs

Could not load ‘clearsilver-jni’

java.library.path = out/host/linux-x86/lib

make: *** [out/target/common/docs/api-stubs-timestamp] Error 45

make: *** Waiting for unfinished jobs….

Could not load ‘clearsilver-jni’

java.library.path = out/host/linux-x86/lib

make: *** [out/target/common/docs/doc-comment-check-timestamp] Error 45

这是由于clearsilver在编译时如果检测到使用Java JDK 6,就使用64位编译。要避开此错误,需要修改下面四个文件:

external/clearsilver/cgi/Android.mk
external/clearsilver/java-jni/Android.mk
external/clearsilver/util/Android.mk
external/clearsilver/cs/Android.mk
把这四个Makefile中的下列语句注掉即可:

# This forces a 64-bit build for Java6
# Comment by Easwy
# LOCAL_CFLAGS += -m64
# LOCAL_LDFLAGS += -m64
然后在external/clearsilver目录中执行一下make clean,然后回到项目根目录,继续make即可。

当编译完成时,生成的image文件放在out/target/product/generic目录中。
<think>我们正在讨论Android Native服务的开发编译和调试方法。根据用户提供的引用,我们可以总结出以下几个关键点: 1. **编译**:使用NDK进行Native代码的编译,生成可执行文件或共享库。 2. **调试**: - 使用`ndk-stack`工具分析崩溃日志(引用[3]) - 查看`/data/tombstones`目录下的崩溃日志(引用[4]) - 使用GDB或LLDB进行调试(引用[1][2]) - 在IDE(如Android Studio)中调试Native代码(引用[2]) 由于用户的问题是关于Android Native服务的开发,我们通常指的是运行在Android系统上的C/C++服务(如通过init进程启动的守护进程或通过binder提供服务的native服务)。下面将分步骤介绍。 ### 一、开发环境搭建 1. **安装NDK和CMake**: - 在Android Studio中安装NDK和CMake工具。 - 或下载NDK独立版本并配置环境变量。 2. **创建项目**: - 对于独立的Native服务(不依赖Java),可以创建一个纯C/C++项目。 - 使用`Android.mk`或`CMakeLists.txt`构建。 ### 二、编写Native服务 以创建一个简单的守护进程为例: **main.cpp**: ```cpp #include <unistd.h> #include <stdio.h> #include <android/log.h> #define TAG "MyNativeService" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__) int main() { LOGI("MyNativeService started"); while (true) { // 模拟工作 sleep(5); LOGI("Service is running..."); } return 0; } ``` ### 三、编译配置(使用CMake) **CMakeLists.txt**: ```cmake cmake_minimum_required(VERSION 3.4.1) add_executable(my_native_service main.cpp) target_link_libraries(my_native_service android log) ``` ### 四、编译 使用NDK的cmake进行编译: ```bash $NDK_HOME/build/cmake/android.toolchain.cmake mkdir build && cd build cmake -DCMAKE_TOOLCHAIN_FILE=$NDK_HOME/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=arm64-v8a \ -DANDROID_PLATFORM=android-26 .. make ``` ### 五、部署运行 1. **推送可执行文件到设备**: ```bash adb push my_native_service /data/local/tmp adb shell chmod +x /data/local/tmp/my_native_service ``` 2. **运行**: ```bash adb shell /data/local/tmp/my_native_service ``` ### 六、调试方法 #### 1. 日志调试 使用`__android_log_print`输出日志,通过`logcat`查看: ```bash adb logcat | grep "MyNativeService" ``` #### 2. 使用`ndk-stack`分析崩溃 - 如果程序崩溃,获取`logcat`输出到文件: ```bash adb logcat > log.txt ``` - 使用`ndk-stack`解析: ```bash ndk-stack -sym /path/to/your/project/build -dump log.txt ``` #### 3. 使用GDB/LLDB调试 - **步骤1**:在编译时包含调试信息(在CMake中设置`-DCMAKE_BUILD_TYPE=Debug`) - **步骤2**:在设备上启动gdbserver: ```bash adb push $NDK_HOME/prebuilt/android-arm64/gdbserver/gdbserver /data/local/tmp adb shell /data/local/tmp/gdbserver :5039 /data/local/tmp/my_native_service ``` - **步骤3**:在主机上使用gdb连接: ```bash $NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang++ --gdb (gdb) target remote :5039 ``` #### 4. 分析tombstone文件(引用[4]) 当Native程序崩溃时,系统会在`/data/tombstones`目录下生成崩溃日志(需要root权限): ```bash adb root adb pull /data/tombstones/tombstone_01 ``` 使用`addr2line`或`ndk-stack`分析: ```bash $NDK_HOME/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-addr2line -e my_native_service <崩溃地址> ``` #### 5. Android Studio调试 - 创建`Native`项目或导入现有项目。 - 配置调试器:`Run -> Edit Configurations -> Debugger`选择`Native`。 - 设置断点并调试。 ### 七、高级调试技巧 1. **内存检测**: - 使用AddressSanitizer(ASan)检测内存错误: ```cmake set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer") ``` - 在设备上运行前,推送ASan运行时库。 2. **性能分析**: - 使用`simpleperf`进行CPU性能分析: ```bash adb shell simpleperf record -p <pid> -o /data/local/tmp/perf.data adb pull /data/local/tmp/perf.data simpleperf report ``` ### 八、开发注意事项 1. **权限问题**:Native服务通常需要root权限或特定selinux策略。 2. **稳定性**:确保处理所有可能的错误,避免崩溃。 3. **资源释放**:防止内存泄漏(可定期用Valgrind检查,但Android支持有限)。 ### 九、相关问题 §§相关问题§§ 1. 如何为Android Native服务配置selinux策略? 2. 如何使用AddressSanitizer(ASan)调试Android Native内存问题? 3. 如何将Native服务集成到Android系统镜像中? 4. Native服务如何通过binder其他进程通信? 5. 如何分析Android Native服务的性能瓶颈?</think>### Android Native 服务开发编译调试指南 #### 一、开发环境搭建 1. **工具链安装**: - 安装最新版 [Android NDK](https://developer.android.com/ndk)(至少r25+) - 配置环境变量: ```bash export ANDROID_NDK_HOME=/path/to/ndk export PATH=$PATH:$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin ``` 2. **项目结构**: ``` MyNativeService/ ├── jni/ │ ├── Android.mk # Makefile │ ├── Application.mk │ ├── service.cpp # Native服务源码 │ └── binder/ # Binder接口定义 ├── res/ └── AndroidManifest.xml ``` #### 二、Native服务开发(C++) **service.cpp 示例**: ```cpp #include <binder/IBinder.h> #include <binder/IInterface.h> #include <binder/IPCThreadState.h> #include <binder/ProcessState.h> #include <binder/IServiceManager.h> class MyNativeService : public BBinder { public: status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) override { switch(code) { case COMMAND_1: // 业务逻辑处理 reply->writeInt32(processCommand(data)); return NO_ERROR; default: return BBinder::onTransact(code, data, reply, flags); } } private: int32_t processCommand(const Parcel& data) { int32_t val = data.readInt32(); return val * 2; // 示例处理 } }; int main() { // 注册服务 sp<IServiceManager> sm = defaultServiceManager(); sm->addService(String16("com.example.MyNativeService"), new MyNativeService()); // 启动线程池 ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); return 0; } ``` #### 三、编译配置 1. **Android.mk**: ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := MyNativeService LOCAL_SRC_FILES := service.cpp LOCAL_SHARED_LIBRARIES := libbinder libutils liblog LOCAL_CFLAGS := -Wall -Werror LOCAL_INIT_RC := myservice.rc # 添加init启动脚本 include $(BUILD_EXECUTABLE) ``` 2. **Application.mk**: ```makefile APP_ABI := arm64-v8a armeabi-v7a APP_PLATFORM := android-24 APP_CPPFLAGS := -std=c++17 -fexceptions ``` #### 四、编译部署 1. **编译命令**: ```bash $ cd jni && ndk-build NDK_PROJECT_PATH=.. APP_BUILD_SCRIPT=Android.mk ``` 2. **部署到设备**: ```bash $ adb push libs/arm64-v8a/MyNativeService /system/bin $ adb push myservice.rc /system/etc/init ``` 3. **Init启动脚本**(myservice.rc): ```rc service myservice /system/bin/MyNativeService class main user root group root oneshot ``` #### 五、调试方法 1. **日志调试**: ```cpp #include <android/log.h> #define LOG_TAG "MyNativeService" #define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) // 使用示例 ALOGE("Received command: %d", command); ``` 2. **Crash分析(tombstones)**: ```bash # 1. 获取崩溃日志 $ adb pull /data/tombstones/tombstone_05 # 2. 使用addr2line定位 $ aarch64-linux-android-addr2line -e MyNativeService -fC <崩溃地址> ``` 3. **GDB调试**: ```bash # 启动gdbserver $ adb shell gdbserver :5039 /system/bin/MyNativeService # 本地连接 $ $NDK/prebuilt/linux-x86_64/bin/gdb (gdb) target remote :5039 (gdb) b service.cpp:25 # 设置断点 ``` 4. **Android Studio调试**: - 创建`Native`调试配置 - 指定可执行文件路径 - 配置符号路径(包含编译生成的.so/.dbg文件) 5. **AddressSanitizer内存检测**: ```makefile # 在Android.mk中添加 LOCAL_CFLAGS += -fsanitize=address -fno-omit-frame-pointer LOCAL_LDFLAGS += -fsanitize=address ``` #### 六、Binder接口调试 1. **接口测试**: ```java IBinder binder = ServiceManager.getService("com.example.MyNativeService"); IMyService service = IMyService.Stub.asInterface(binder); int result = service.executeCommand(42); ``` 2. **Binder调用跟踪**: ```bash $ adb shell su root cat /sys/kernel/debug/binder/transactions $ adb shell service list # 查看所有注册服务 ``` #### 七、性能优化技巧 1. **CPU Profiling**: ```bash $ adb shell simpleperf record -p <pid> --duration 10 $ adb pull /data/local/perf.data $ ndk/simpleperf/report.py -g ``` 2. **内存检测**: ```bash $ adb shell am dumpheap <pid> /data/local/tmp/heapdump $ adb pull /data/local/tmp/heapdump $ $NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-symbolizer -e MyNativeService < heapdump ``` #### 八、常见问题解决 1. **SELinux权限问题**: ```te # myservice.te type myservice, domain; type myservice_exec, exec_type, file_type; init_daemon_domain(myservice) allow myservice binder_service:service_manager add; ``` 2. **Binder通信失败**: - 检查服务注册名称是否匹配 - 验证客户端/服务端接口版本一致性 - 使用`dumpsys binder transactions`查看事务状态 3. **Native崩溃无日志**: - 确保编译时包含调试符号(`APP_DEBUG := true`) - 检查`/proc/sys/kernel/core_pattern`配置 - 使用`NDK_DEBUG=1`编译
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值