Android NDK笔记

目录

Android NDK笔记

AOSP

Android Open Source Project,简称AOSP,android源码项目。

研究android底层的话会用到。一般的android开发者则不必。

Android repository

SDK/NDK等包,可从如下repo地址下载和更新:

其中官方repo的优点是权威,缺点是不提供目录浏览功能,想知道所有发布的某个包(如sdk)版本只能靠猜和试;国内的两个repo优点是访问速度快,缺点是有时候更新失败。

Android SDK / SDK Tools

  • 世界上只有<25版本的android sdk压缩包
  • sdk压缩包是tools包套了一层目录
  • tools压缩的各个版本都能下载
  • tools包里的android(linux)或android.bat(windows)功能强大,提供创建项目、更新adb/sdk、管理avd等功能。
  • 从tools25.2.3开始,提供tools/bin/sdkmanager替代tools/android,增加了管理(查看、下载)各子包(如cmake、lldb、ndk)的功能
  • sdkmanager的下载:有些包可以选择不同版本,有些包(如ndk)只能下载最新的

谷歌官方提供的android sdk压缩包只支持到24.4.1版,后续版本改为下载tools压缩包。sdk压缩包其实就是tools包套了一层目录:

- add-ons (空目录)
- platforms (空目录)
- tools
- SDK Readme.txt (没啥用)

sdk版本<25时,sdk压缩包下载地址模板:

def android_sdk_download_url(ver, os):
    """
    ver:    'r22.6.2', 'r23', 'r24.0.2', 'r24.2', 'r24.3.4', 'r24.4.1', etc
    os:     'windows', 'linux', 'macosx'
    fmt:    'exe', 'zip', 'tgz'
    搭配使用:
            - windows.exe
            - windows.zip
            - macosx.zip
            - linux.tgz
    
    当 float(ver[1:])<25:
        既存在sdk包:   return 'http://dl.google.com/android/android-sdk_{:s}-{:os}.tgz'.format(ver, os)
        也存在tools包: return 'http://dl.google.com/android/repository/tools_{:s}-{:os}.tgz'.format(ver, os)
    当 float(ver[1:])>=25:
        只存在tools包: return 'http://dl.google.com/android/repository/tools_{:s}-{:os}.tgz'.format(ver, os)
    其中repository地址,可以考虑换成国内android repository来加速(zzu和neusoft)
    """
    if float(ver[1:])<25:
        return 'http://dl.google.com/android/android-sdk_{:s}-{:os}.tgz'.format(ver, os)
    else:
        return 'http://dl.google.com/android/repository/tools_{:s}-{:os}.tgz'.format(ver, os)

NDK

  • 使用NDK,有必要过一遍官方指导:https://developer.android.com/ndk/guides/

  • 只要知道ndk的下载地址,就可以从{浏览器/wget/迅雷}下载。获取各版本ndk的下载地址有一个模板:

def android_ndk_download_url(ver, os, arch='x86_64', repo='https://dl.google.com/android/repository'):
    """
    ver:    'r10e', 'r11b', ..., 'r17b', etc
    os:     'windows', 'linux', 'darwin'
    arch:   'x86', 'x86_64'
    repo:   the url of android repository. available:
                - 'https://dl.google.com/android/repository' (官方)
                - 'https://dl-ssl.google.com/android/repository' (官方)
                - 'http://mirrors.neusoft.edu.cn/android/repository' (大连东软)
                - 'http://mirrors.zzu.edu.cn/android/repository/' (郑大)

    e.g.:
    https://dl.google.com/android/repository/android-ndk-r17b-windows-x86.zip
    https://dl.google.com/android/repository/android-ndk-r17b-windows-x86_64.zip
    https://dl.google.com/android/repository/android-ndk-r17b-darwin-x86_64.zip
    https://dl.google.com/android/repository/android-ndk-r17b-linux-x86_64.zip
    """
    return '{:s}/android-ndk-{:s}-{:s}-{:s}.zip'.format(repo_url, ver, os, arch)

cmake && ninja

用到NDK的代码(C/C++)需要被构建,编译出.a或者.so,这需要构建工具。android repository提供的是cmake+ninja的组合。

利用sdkmanager下载cmake,注意指定cmake版本。ninja会被同时下载。

lldb

利用sdkmanager下载。

adb / fastboot: 都在platform-tools

adb很重要:

  • 通过命令行将apk装到模拟器/真机时需要用到
  • 通过android studio调试时用到
    从sdk 22.6.2版本开始,adb就被移到platform-tools目录了(很久远了)。所以,需要用adb则应当下载platform-tools包。

实例:ubuntu命令行安装android sdk/ndk/cmake/lldb

#参考:
#https://gist.github.com/zhy0/66d4c5eb3bcfca54be2a0018c3058931

# Install Oracle JDK 8
add-apt-repository ppa:webupd8team/java
apt-get update
apt-get install -y oracle-java8-installer
apt-get install -y unzip make # NDK stuff

# Get SDK tools (link from https://developer.android.com/studio/index.html#downloads)
wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
tar xf android-sdk*-linux.tgz

# Get NDK (https://developer.android.com/ndk/downloads/index.html)
wget https://dl.google.com/android/repository/android-ndk-r12b-linux-x86_64.zip
uznip android-ndk*.zip

# Let it update itself and install some stuff
# 特别慢。
cd android-sdk-linux/tools
./android update sdk --no-ui

# Download every build-tools version that has ever existed
# This will save you time! Thank me later for this
# 这样会只下载某个版本吗?
./android update sdk --all --no-ui --filter $(seq -s, 27)


#安装cmake。必须指定版本。我从windows上的android studio中找出来的。
~/soft/android-sdk-linux/tools/bin/sdkmanager "cmake;3.6.4111459"

#lldb,和cmake真是难兄难弟。
~/soft/android-sdk-linux/tools/bin/sdkmanager "lldb;3.1"

jni的两种构建方式

mkdir build-android
cd build-android
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
    -DANDROID_ABI="armeabi-v7a" -DANDROID_ARM_NEON=ON \
    -DANDROID_PLATFORM=android-14 ..
make
make install
make package

一些小细节

使用clang替代gcc

Android NDK: WARNING: Deprecated NDK_TOOLCHAIN_VERSION value: 4.9. GCC is no longer supported and wi

Android NDK从r11开始建议大家切换到clang。并且把GCC标记为deprecated,将GCC版本锁定在GCC 4.9不再更新。
参考:https://zhuanlan.zhihu.com/p/27470060

字节对齐

ndk r10d开始,编译器用16字节堆栈对齐。
参考:https://www.oschina.net/news/57886/android-ndk-revision-10d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值