基于Android源码的应用开发

第一部分:搭建编译环境

系统要求

  1. Android源码比较大,加上编译后的文件大概在200G左右,保险起见,有必要预留至少200G的磁盘空间。
  2. 编译需要至少8G的内存,I5及以上的CPU, 64位系统。
  3. Linux系统(Mac据说也可以,但不在本教程讨论的范围),我使用的是Ubuntu 16.04。

具体步骤

这一部分主要是安装编译所需要的软件,按照官方的指导,根据自己的环境,一步一步进行,如果编译原生Android,按照官方的教程进行。如果编译LineageOS,在LineageOS Wiki选择对应的机器进行

第二部分:源码下载

Android 源代码树位于由 Google 托管的 Git 代码库中,由几百个Git库组成。为了方便代码同步,谷歌提供了Repo工具。详情参考官方介绍

Repo

Repo的安装详情见下载源代码

安装 Repo 说明

按照官方的指导进行即可,这里是一些补充

  1. 确保Home目录下有一个 .bin/ 目录,并且该目录包含在路径中:
    第一行是创建文件夹,第二步可以通过编辑~/.bashrc完成
$ gedit ~/.bashrc
$ source ~/.bashrc
  1. 下载 Repo 工具,并确保它可执行
    这个地址可能无法直接访问,可以从其它地方拷贝,Repo是一个用Python编写的封装Git命令的工具,只是一个文件。

初始化 Repo 客户端说明

这一步,如果是编译原生Android,按照官方的指导进行。如果是想要编译运行在特定机型上的代码,可以去lineageOS 查找,比如本次演示的Samsung Galaxy Note Pro 12.2 SM-P905 LTE

第三部分: 源码编译

这一部分主要也是按官方的教程进行。不能只通过纯源代码来使用 AOSP,还需要运行与硬件相关的其他专有库。

专有二进制文件

在github上找到了Samsung Galaxy Note Pro 12.2 SM-P905 LTE 的硬件相关库。但并不是所有目标设备的相关库都能在网上找到,所以,遇到找不到的情况,就需要从已有的build中提取,可以在这里查找对应机器的build,按这个步骤进行。

编译运行刷机

具体机器具体对待,这一环节比较麻烦,后面有详细的补充。

以上是源码下载,编译,运行的大致流程,这一部分需要花费大量的时间完成,过程中可能遇到各种各样的问题,需要有一定的经验才能解决。

源码目录:

huihg@huihg-ThinkPad-T440p:~/work/code/smp905$ ls
abi         autoload        build   developers   external    libcore          ndk       platform_testing  syntax     vendor
android     bionic          colors  development  frameworks  libnativehelper  out       plugin            system
Android.bp  bootable        cts     device       hardware    lineage          packages  prebuilts         toolchain
art         bootstrap.bash  dalvik  doc          kernel      Makefile         pdk       sdk               tools

系统应用例如相机,日历在packages/apps目录,供应商的应用可以放在vender下面,但这不是必须的。示例托管在[码云]xxx上(xxx代表私有项目,下同),放到vendor/xxx下面。

第四部分:应用开发

编译方式

和Android Studio使用Gradle打包不同,Android 源码中的应用是基于GNU make编译打包的。这里以上面的demo为例进行剖析。
代码目录

huihg@huihg-ThinkPad-T440p:~/work/code/smp905/vendor/xxx/OpenSDKDemo$ ls
AndroidManifest.xml  Android.mk  bin  CleanSpec.mk  libs  MODULE_LICENSE_APACHE2  NOTICE  README.md  res  src

文件以早期ADT的方式组织,Android源码中很多APP都是这样的,但现在也有不少新项目以Gradle的方式组织。原理是一样的,通过Android.mk指定需要用到的代码文件,资源文件,依赖的jar/aar等文件。与gradle处理依赖不同的是,所有的jar/aar都要下载到本地,不能自动下载。

Makefile 说明

这里有一篇文章可以参考Makefile && Android.mk(Android6.0)

示例文件:
vendor/xxx/OpenSDKDemo/Android.mk

应用编译

注意,编译应用之前,应该完整地编译过一遍源码。
这一环节完全按照三星Pad SM-P905进行演示

编译步骤

进入工作platform

$ cd ~/work/code/smp905

初始化编译环境

$ source build/envsetup.sh

选择编译选项

$ lunch lineage_viennalte-userdebug
$ export USE_CCACHE=1

进入应用目录

$ cd vendor/xxx/OpenSDKDemo/

执行编译

$ mm

mm 命令是定义在build/envsetup.sh中的命令,意思是编译当前目录的所有modules,但不编译它们的依赖。类似的,还有其它命令如下:

- croot:     Changes directory to the top of the tree.
- m:         Makes from the top of the tree.
- mm:        Builds all of the modules in the current directory, but not their dependencies.
- mmm:       Builds all of the modules in the supplied directories, but not their dependencies.
             To limit the modules being built use the syntax: mmm dir/:target1,target2.
- mma:       Builds all of the modules in the current directory, and their dependencies.
- mmma:      Builds all of the modules in the supplied directories, and their dependencies.

编译结果

Rom编译中,so文件和apk文件分开存放,首先进入app目录

$ cd out/target/product/viennalte/system/app/OpenSDKDemo/

就能看到刚刚编译生成的apk文件OpenSDKDemo.apk。同样,进入lib目录查看编译生成的so文件

$ croot
$ cd out/target/product/viennalte/system/lib/
$ ls | grep kaola

就能看到刚刚编译生成的so文件

libkaolafmffmpeg.so
libkaolafmplayer.so
libkaolafmsdl.so
libkaolafmutil.so

第五部分:运行应用

通过这种方式编译出来的apk,可以通过adb install 安装,但apk中是没有so库的,所以一般会通过adb push 的方式,把apk和so推到对应的目录。

注意,当前命令行的adb指向的是源码中的adb,如果要用系统的adb,可以新起一个命令行。
$ adb devices 查看设备,如果出现下面的错误,加sudo执行。

List of devices attached
* daemon not running; starting now at tcp:5037
* daemon started successfully
1686620c    no permissions (user in plugdev group;

加sudo方式,然后adb devices就能看见可用设备了。

$ sudo $(which adb) kill-server
$ sudo $(which adb) start-server

因为我们编译的是userdebug版本,自带root权限,所以可以通过下面的命令重新加载

$ adb root
$ adb remount

验证是否成功,进入adb shell,如果是shell以#开始,说明是成功了,例如:

huihg@huihg-ThinkPad-T440p:~/work/code/smp905/out/target/product/viennalte/system/lib$ adb shell
viennalte:/ # 

先push so文件

huihg@huihg-ThinkPad-T440p:~/work/code/smp905/out/target/product/viennalte/system/lib$ adb push libkaolafmffmpeg.so /system/lib/
libkaolafmffmpeg.so: 1 file pushed. 8.8 MB/s (2286180 bytes in 0.246s)
huihg@huihg-ThinkPad-T440p:~/work/code/smp905/out/target/product/viennalte/system/lib$ adb push libkaolafmplayer.so /system/lib/
libkaolafmplayer.so: 1 file pushed. 2.3 MB/s (136920 bytes in 0.057s)
huihg@huihg-ThinkPad-T440p:~/work/code/smp905/out/target/product/viennalte/system/lib$ adb push libkaolafmsdl.so /system/lib/
libkaolafmsdl.so: 1 file pushed. 2.9 MB/s (161236 bytes in 0.052s)
huihg@huihg-ThinkPad-T440p:~/work/code/smp905/out/target/product/viennalte/system/lib$ adb push libkaolafmsdl.so /system/lib/
libkaolafmsdl.so: 1 file pushed. 17.1 MB/s (161236 bytes in 0.009s)
huihg@huihg-ThinkPad-T440p:~/work/code/smp905/out/target/product/viennalte/system/lib$ adb push libkaolafmutil.so /system/lib/
libkaolafmutil.so: 1 file pushed. 0.4 MB/s (9364 bytes in 0.022s)

然后push apk

注意,要先在pad的system/app/下面建一个和apk文件名相同的文件夹OpenSDKDemo

viennalte:/ # mkdir system/app/OpenSDKDemo

push:

huihg@huihg-ThinkPad-T440p:~/work/code/smp905/out/target/product/viennalte/system/app$ adb push OpenSDKDemo/OpenSDKDemo.apk /system/app/OpenSDKDemo/
OpenSDKDemo/OpenSDKDemo.apk: 1 file pushed. 7.9 MB/s (3962620 bytes in 0.477s)

push 完apk和so后,桌面上并没有应用图标,这时候可以重启一下设备,简单起见,可以重启桌面或system_server,例如:

huihg@huihg-ThinkPad-T440p:~/work/code/smp905/out/target/product/viennalte/system/app$ adb shell ps | grep system_server
system    835   407   1794128 132620 sys_epoll_ b6297054 S system_server
huihg@huihg-ThinkPad-T440p:~/work/code/smp905/out/target/product/viennalte/system/app$ adb shell kill 835

就能在桌面看到应用了,点击启动即可。

如何缷载

push的应用是被当成是系统应用,不能直接缷载,可以进入shell,执行remove 把apk 删除了即可。

第六部分:补充LineageOS 编译

这是关于第一,第二部分的补充,因为前面的步骤主要以应用开发为主,源码的编译运行没有详细展开,所以这里补充 三星Galaxy Note 12.2平板SM-P905LineageOS 编译,刷机。

下载LineageOS

前面提到了,光有纯粹的LineageOS源码还不足以支持ROM的编译运行,还需要硬件相关的专有库才能进行。

  1. 创建代码下载目录

我们称这个目录为平台目录

huihg@huihg-ThinkPad-T440p:~/work/code/smp905$

2. 将repo的源修改为清华的源,提升下载速度

打开~/.bashrc, 在结尾加入下面的配置。(其中第一行是修改源,其余两行后面要用,一并加好。)

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
export USE_CCACHE=1
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"

3. 初始化repo

Repo的安装及介绍可以参考这篇文章。确保下面的命名执行成功:

$ mkdir ~/.bin
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo
$ chmod a+x ~/.bin/repo

并将~/.bin/添加到~/.bashrc中的PATH中,例如:``

Linux中.开头的文件是隐藏文件,并没有其它意思,所以这里只要文件夹名称一致即可,命名可以随意的。

PATH=~/.bin:$PATH

进入平台目录,执行

$ repo init -u git://github.com/LineageOS/android.git -b cm-14.1

4. 将lineageaosp的源换成清华的源

这个命令执行后,会在平台目录生成一个.repo目录,这是一个隐藏目录,里面有一个manifest.xml软链接,打开这个文件,就能发现它记录了源码所包含的具体工程,以及源码的远程地址。想要知道这个文件的具体含意,阅读这篇文章,我们要做的只是修改.repo/manifest.xml, 将相关的下载源改为清华的镜像,可以参考这篇文章,也可以不用参考,将.repo/manifest.xml中的几个remote改成如下的样子

<remote  name="github"
           fetch="https://github.com/" />

  <remote  name="lineage"
           fetch="https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/"
           review="review.lineageos.org" />


  <remote  name="private"
           fetch="ssh://git@github.com" />

    <remote  name="aosp"
           fetch="https://aosp.tuna.tsinghua.edu.cn"
           review="android-review.googlesource.com"
           revision="refs/tags/android-7.1.2_r36" />
  1. 增加硬件相关库的代码

创建.repo/local_manifests/roomservice.xml文件,把下面的内容保存到这个文件中

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <project name="Valera1978/android_device_samsung_viennalte" path="device/samsung/viennalte" remote="github" revision="cm14.0_alt" />
  <project name="Valera1978/android_kernel_samsung_msm8974" path="kernel/samsung/msm8974" remote="github" />
  <project name="Valera1978/android_vendor_samsung_viennalte" path="vendor/samsung/viennalte" remote="github" revision="cm14.0_alt" />
  <project name="LineageOS/android_external_sony_boringssl-compat" path="external/sony/boringssl-compat" remote="github" />
  <project name="LineageOS/android_device_samsung_msm8974-common" path="device/samsung/msm8974-common" remote="github" />
  <project name="LineageOS/android_device_qcom_common" path="device/qcom/common" remote="github" />
  <project name="LineageOS/android_device_samsung_qcom-common" path="device/samsung/qcom-common" remote="github" />
  <project name="LineageOS/android_hardware_samsung" path="hardware/samsung" remote="github" />
  <project name="LineageOS/android_external_stlport" path="external/stlport" remote="github" />
  <project name="LineageOS/android_packages_resources_devicesettings" path="packages/resources/devicesettings" remote="github" />
</manifest>
  1. 下载代码

下面的任意一条命令都可以,推荐使用第一条,-c代表只下载当前的分支,这一步是下载源代码,需要好的网络,也需要时间,过程中如果出错,重新执行这个命令,如果卡住不动,ctrl + c终止,重新执行这个命令。

#1:
$ repo sync
#2:
$ repo sync -c -j4
  1. 编译代码

完成上一步以后,说明代码已经下载完成了。可以开始编译了

7.1 给所有项目起一个分支,可选

$ repo start cm14 --all

7.2 然后在平台目录执行下面的命令

$ source build/envsetup.sh

7.3 然后执行

$ brunch viennalte

$ lunch lineage_viennalte-userdebug export USE_CCACHE=1 make -j10 bacon

开始编译,大概需要3个小时。

虽然网上的资料这样写,但我在实验的时候,发现这两个命令的结果不相同的,其中有一个能生成刷机的zip包,好像是第二个命令,但这两个命令能反复执行,不冲突。

  1. 编译成果

平台目录下,进入out/target/product/viennalte,就能看见编译生成的lineage-14.1-20181106-UNOFFICIAL-viennalte.zip,它就是所谓的ROM了。还有recovery.img,在刷机的时候会用到。

  1. 编译过程中遇到的问题

编译过程中遇到问题,要分析出现问题的地方,如果是某个项目例如proprietary报错,进入这个项目,执行 git checkout 将其还原,然后执行前面的7.3。

在只有8G内存的情况下编译,有out of memory的错误,执行 gedit ~/.jack-settings,加入下面一行

JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"

然后在平台目录重启jack,再执行前面的7.3

$ prebuilts/sdk/tools/jack-admin kill-server
$ prebuilts/sdk/tools/jack-admin start-server

You’ve done it! Welcome to the elite club of self-builders. You’ve built your operating system from scratch, from the ground up. You are the master/mistress of your domain… and hopefully you’ve learned a bit on the way and had some fun too.

Samsung Galaxy Note Pro 12.2 Wi-Fi 刷机

刷机可以根据LineageOS Wiki刷机教程, 不同的手机刷法不一样,刷机有风险,谋定而后动。

大致说明如下:

按键

Volume Down (靠近电源键)+ Home + Power进入下载模式。
Home + Volume Up + Power 进入 recovery 模式

先用odin刷入twrp recovery固件

How to Install TWRP Samsung Galaxy Note Pro 12.2 Qualcomm LTE SM-P905

follow this steps :

1. Download TWRP file Samsung Galaxy Note Pro 12.2 Qualcomm LTE SM-P905 from https://dl.twrp.me/viennaltexx/ (twrp-2.8.7.0-viennaltexx.img.tar 11.6M)

2. Download Odin v3.09 or the latest Odin version
(如果失败,尝试一下其它版本的Odin)

3. Extract Odin ZIP file

4. Open Odin

5. Reboot Phone in Download Mode ( Turn Power off the phone, Press and hold Volume Down key (靠近电源键)and Home key, While pressing these keys press and hold Power key, Release all key when Download Mode / Odin Mode appears )

6. Connect the phone to PC with USB Cable Data, then Press and release Volume Up key

7. Wait until you get a blue sign in Odin

8. Add the TWRP .tar file to AP / PDA

9. Make sure re-partition is NOT ticked

10. Click the start button, sit back and wait few minutes

安装lineageOS固件Installing LineageOS from recovery

1. Download the LineageOS install package that you’d like to install or build the package yourself.

  • Optionally, download 3rd party application packages such as Google Apps (use the arm architecture)

2. Place the LineageOS .zip package, as well as any other .zip packages on the root of /sdcard:

  • Using adb: adb push filename.zip /sdcard/

  • You can use any method you are comfortable with. adb is universal across all devices, and works both in Android and recovery mode, providing USB debugging is enabled.

3. If you aren’t already in recovery, reboot into recovery:

  • With the device powered off, hold Home + Volume Up + Power.

4. (Optional, but recommended): Select the Backup button to create a backup.
(Backup all partitions (it least efs) and store somewhere - it need to do - because you can loose imei)

5. Select Wipe and then Advanced Wipe.

6. Select Cache, System and Data partitions to be wiped and then Swipe to Wipe.

7. Go back to return to main menu, then select Install.

8. Navigate to /sdcard, and select the LineageOS .zip package.

9. Follow the on-screen prompts to install the package.

10. (Optional): Install any additional packages using the same method. NOTE: If you want any Google Apps on your device, you must follow this step before the first reboot!

11. (Optional): Root the device by installing the LineageOS su add-on (use the arm package) or using any other method you prefer.

12. Once installation has finished, return to the main menu, select Reboot, and then System.

Root

Settings -> About tablet -> press 7 times "Build number"

Then Settings -> Developer options -> Root access

Work

Almost all work: calls, mobile data, wifi, bluetooth, sound, vibra, camera (photo), sdcard, mtp, otg, pen, gps, ir

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容