QUSIR


  • Startseite

  • Archiv

poky raspbian教程

Veröffentlicht am 2017-01-21

快速链接

Git仓库web前端:
http://git.yoctoproject.org/cgit/cgit.cgi/meta-raspberrypi/
邮件列表(yocto邮件列表):
yocto@yoctoproject.org
问题管理(Github问题):
https://github.com/agherzan/meta-raspberrypi/issues

内容:

1.说明
Yocto BSP层 - 树莓派
2.A. 如何使用它
2.B. 图片
3.可选构建配置
3.A. 压缩的部署文件
3.B. GPU内存
3.C. 添加购买的许可编解码器
3.D. 禁用过扫描
3.E. 设置超频选项
3.F. 视频摄像机支持V4L2驱动程序
3.G. 启用离线合成支持
3.H. 在控制台支持上启用kgdb
3.I. 引导到U-Boot
3.J. 图像与Initramfs
3.K. 设备树支持
3.L. 使能SPI总线
3.M. 使能I2C
3.N. 启用PiTFT支持
3.O. 启用UART支持
4.额外的应用程序
4.A. omxplayer
5.板卡配置
5.A. 音频路由
源代码和镜像
7.贡献
7.A. 邮件列表
7.B. Github问题
8.维护人员

1.说明

这是RaspberryPi设备的通用硬件特定BSP覆盖。

更多信息,请访问:
http://www.raspberrypi.org/(官方网站)

meta-raspberrypi的核心BSP部分应该与不同的工作
OpenEmbedded / Yocto分布和层堆栈,例如:

  • Distro-less(仅适用于OE-Core)。
  • Angstrom。
  • Yocto / Poky(测试的主要焦点)。

Yocto BSP层 - 树莓派

此图层取决于:

URI:git://git.yoctoproject.org/poky
branch:master
修订:HEAD

URI:git://git.openembedded.org/meta-openembedded
层:元 - 元,元多媒体
branch:master
修订:HEAD

2.A. 如何使用它

一个。source poky / oe-init-build-env rpi-build
b。将所需的图层添加到bblayers.conf:

-  meta-raspberrypi

C。将local.conf中的MACHINE设置为所支持的主板之一:

-  raspberrypi
-  raspberrypi0
-  raspberrypi2
-  raspberrypi3

d。bitbake rpi-hwup-image
e。dd到SD卡生成的sdimg文件(如果使用rpi-sdimg.xz,请使用xzcat)
F。启动RPI。

2.B. 图片

  • ===========
  • rpi-hwup-image
    硬件图像
  • rpi-basic-image
    基于rpi-hwup-image和一些添加的功能(例如:splash)
  • rpi-test-image
    基于rpi-basic-image的图像,其中包含了大部分的包
    层和一些媒体样本。

3.可选构建配置

存在一组用户可以影响构建的不同参数的方式。
我们在这里列出与这个BSP密切相关或特定于它的那些。对于其余的
请检查:http://www.yoctoproject.org/docs/latest/ref-manual/ref-manual.html

3.A. 压缩的部署文件

1.在local.conf中覆盖IMAGE_FSTYPES
IMAGE_FSTYPES =“tar.bz2 ext3.xz”
2.在local.conf中覆盖SDIMG_ROOTFS_TYPE
SDIMG_ROOTFS_TYPE =“ext3.xz”
3.在local.conf中覆盖SDIMG_COMPRESSION
SDIMG_COMPRESSION =“xz”
*容纳以上的值到您自己的需要(例如:ext3 / ext4)。

3.B. GPU内存

变量:详细信息
GPU_MEM:GPU内存(兆字节)。设置ARM和之间的内存分割
GPU。ARM获取剩余的内存。最小16.默认64。
GPU_MEM_256:256MB Raspberry Pi的GPU内存(兆字节)。忽略了
512MB RP。覆盖gpu_mem。Max 192.默认值未设置。
GPU_MEM_512:512MB Raspberry Pi的GPU内存(兆字节)。忽略了
256MB RP。覆盖gpu_mem。默认值未设置。
GPU_MEM_1024:1024MB Raspberry Pi的GPU内存(兆字节)。忽略了
256MB / 512MB RP。覆盖gpu_mem。最大944.默认值未设置。

3.C. 添加购买的许可证编解码器

要添加您自己的许可,请使用变量KEY_DECODE_MPG2和KEY_DECODE_WVC1
local.conf。例:
KEY_DECODE_MPG2 =“12345678”
KEY_DECODE_WVC1 =“12345678”
您可以提供更多许可证(以逗号分隔)。例:
KEY_DECODE_WVC1 =“0x12345678,0xabcdabcd,0x87654321”

3.D. 禁用过扫描

默认情况下,GPU在视频输出周围添加一个黑色边框以补偿
切断图像的一部分的电视。要禁用此设置此变量
local.conf:
DISABLE_OVERSCAN =“1”

3.E. 设置超频选项

Raspberry PI可以超频。到现在超频到“涡轮
模式“由raspbery正式支持,不会失去保修。
检查config.txt有关选项和模式的详细描述。例:
#Turbo模式
ARM_FREQ =“1000”
CORE_FREQ =“500”
SDRAM_FREQ =“500”
OVER_VOLTAGE =“6”

3.F. 视频摄像机支持V4L2驱动程序

设置此变量以启用对摄像机的支持(需要Linux 3.12.4+)
VIDEO_CAMERA =“1”

3.G. 启用离线合成支持

设置此变量以启用对dispmanx脱机合成的支持
DISPMANX_OFFLINE =“1”

这将使固件回退到离线合成
Dispmanx元素。通常,在扫描期间,在线完成合成,
但不能处理太多的元素。当离线启用时,屏幕外
缓冲区被分配用于合成。当场景复杂度(数量和大小
的元素)高,合成将发生离线进入缓冲区。

大力推荐Wayland / Weston。

参见:http://wayland.freedesktop.org/raspberrypi.html

3.H. 在控制台支持上启用kgdb

要将kdbg控制台(kgdboc)参数添加到内核命令行,
在local.conf中设置此变量:
ENABLE_KGDB =“1”

3.I. 引导到U-Boot

要使u-boot加载内核映像,请在local.conf中设置
KERNEL_IMAGETYPE =“uImage”

这将使kernel.img是u-boot映像,这将加载uImage。
默认情况下,kernel.img是实际的内核映像(例如Image)。

3.J. 图像与Initramfs

要构建initramfs映像:
*设置这3个内核变量(例如在linux-raspberrypi.inc中)

    -  kernel_configure_variable BLK_DEV_INITRD y
    -  kernel_configure_variable INITRAMFS_SOURCE“”
    -  kernel_configure_variable RD_GZIP y
*设置yocto变量(例如在linux-raspberrypi.inc中)
    - INITRAMFS_IMAGE =“ ”
    -  INITRAMFS_IMAGE_BUNDLE =“1”
*设置meta-rasberrypi变量(例如,在raspberrypi.conf中)
    -  KERNEL_INITRAMFS =“-initramfs”

3.K. 设备树支持

仅当使用linux-raspberrypi 3.18+时,才支持RPi的设备树
内核。

*设置KERNEL_DEVICETREE(在conf / machine / raspberrypi.conf中)
    - 在内核安装任务之前将预告片添加到内核映像。
      在创建SDCard映像时,将修改此内核
      引导分区(作为kernel.img)以及DeviceTree blob(.dtb文件)。

注意:对于内核> = 3.18,始终禁用KERNEL_DEVICETREE
较老的内核版本。

3.L. 使能SPI总线

当使用设备树内核时,设置此变量以启用SPI总线
ENABLE_SPI_BUS =“1”

3.M. 使能I2C

当使用设备树内核时,设置此变量以启用I2C
ENABLE_I2C =“1”

3.N. 启用PiTFT支持

使用PiTFT屏幕的基本支持可以通过添加启用
下面在local.conf中:

MACHINE_FEATURES + =“pitft”

  • 这将启用SPI总线和i2c设备树,它也将设置
    控制台的framebuffer和PiTFT上的x服务器。

注意:为了使这个工作,PiTFT模型的叠加必须构建,
添加和指定(dtoverlay = 在config.txt)

以下是在meta-raspberrypi中当前支持的PiTFT模型的列表,
模型名应该作为MACHINE_FEATURES在local.conf中添加,如下所示:

-  MACHINE_FEATURES + =“pitft “。

当前支持的型号列表:

-  pitft22
-  pitft28r

3.O. 启用UART

默认情况下,RaspberryPi 1,2和CM将启用UART控制台。

RaspberryPi 3没有默认启用UART,因为这需要一个
固定核心频率和enable_uart将其设置为最小。某些
操作 - 60fps h264解码,高质量去隔行 - 这不是
在ARM上执行可能会受到影响,我们不想这样对用户
谁不想使用串口。需要串口控制台支持的用户
RaspberryPi3必须在local.conf中明确设置:ENABLE_UART =“1”。

参考:https://github.com/raspberrypi/firmware/issues/553
https://github.com/RPi-Distro/repo/issues/22

4.额外的应用程序

4.A. omxplayer

omxplayer取决于具有商业许可证的libav。所以为了成为
能够编译omxplayer你将需要whiteflag商业许可证
添加到local.conf:
LICENSE_FLAGS_WHITELIST =“commercial”

5.板卡配置

5.A. 音频路由

加载音频驱动程序

modprobe snd-bcm2835

测试音频播放

例如aplay test.wav

请注意,如果没有连接HDMI,则会从3.5英寸插孔连接器发出音频
如预期。但是,如果连接了HDMI显示器,则没有音频输出
插孔连接器。

要通过3.5in插孔连接器强制音频路由

amixer cset numid = 3 1

amixer cset的选项有:

0 =自动
1 =耳机
2 = hdmi

源代码和镜像

主要仓库:
git://git.yoctoproject.org/meta-raspberrypi
http://git.yoctoproject.org/git/meta-raspberrypi

Github镜像:
https://github.com/agherzan/meta-raspberrypi

Bitbucket镜子:
https://bitbucket.org/agherzan/meta-raspberrypi

贡献

7.A. 邮件列表

我们使用的主要通信工具是邮件列表:
yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/yocto

随时提出任何问题,但总是在你的电子邮件主题
与“[meta-raspberrypi]”。这是因为我们使用“yocto”邮件列表和
不是一个perticular’meta-raspberrypi’邮件列表。

要贡献这个层,你应该发送补丁以供审查
以上指定的邮件列表。
补丁应该符合开放补丁指南:
http://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines

创建修补程序时,请使用类似:

git format-patch -s --subject-prefix ='meta-raspberrypi] [PATCH'origin

当发送补丁到邮件列表时,请使用类似:

git send-email --to yocto@yoctoproject.org 

7.B. Github的问题

为了管理和跟踪meta-raspberrypi问题,我们使用github问题:
https://github.com/agherzan/meta-raspberrypi/issues

如果你推补丁有一个github问题相关联,请提供
发布号在提交日志就在“签署者”行之前。示例行
为一个错误:
[问题#13]

8.维护人员

安德烈Gherzan 

android键盘输入读取

Veröffentlicht am 2017-01-21

##android键盘输入读取
 监控android键盘输入方式有两种,一种在java层实现,重写onKeyDown和onKeyUp方法。另一种是在jni层实现,监控/dev/input/event0键盘输入设备,获取输入数据。第一种方法缺陷是当有多个键盘设备时候无法区分是哪个键盘输入的,第二种方法是需要有该文件的读写权限。

##调试方法
进入adb模式

adb shell

输入以下指令监控键盘输入

getevent

view

##方法1实现
代码实现

 @Override
public boolean onKeyDown(int keyCode,KeyEvent event){
    switch(keyCode){
        case KeyEvent.KEYCODE_0:
            testview.setText("按下按键0");
            break;
        case KeyEvent.KEYCODE_1:
            testview.setText("按下按键1");
            break;
        case KeyEvent.KEYCODE_2:
            testview.setText("按下按键2");
            break;
        case KeyEvent.KEYCODE_3:
            testview.setText("按下按键3");
            break;
        case KeyEvent.KEYCODE_4:
            testview.setText("按下按键4");
            break;
        case KeyEvent.KEYCODE_5:
            testview.setText("按下按键5");
            break;
        case KeyEvent.KEYCODE_6:
            testview.setText("按下按键6");
            break;
        case KeyEvent.KEYCODE_7:
            testview.setText("按下按键7");
            break;
        case KeyEvent.KEYCODE_8:
            testview.setText("按下按键8");
            break;
        case KeyEvent.KEYCODE_9:
            testview.setText("按下按键9");
            break;
        case KeyEvent.KEYCODE_DEL:
            testview.setText("按下按键*");
            break;
        case KeyEvent.KEYCODE_ENTER:
            testview.setText("按下按键#");
            break;
        default:
            testview.setText("无法识别输入");
            break;

    }

    return super.onKeyDown(keyCode, event);
}
/*释放按键事件*/
@Override
public boolean onKeyUp(int keyCode,KeyEvent event){
    switch(keyCode){
        case KeyEvent.KEYCODE_0:
            testview.setText("放开按键0");
            break;
        case KeyEvent.KEYCODE_1:
            testview.setText("放开按键1");
            break;
        case KeyEvent.KEYCODE_2:
            testview.setText("放开按键2");
            break;
        case KeyEvent.KEYCODE_3:
            testview.setText("放开按键3");
            break;
        case KeyEvent.KEYCODE_4:
            testview.setText("放开按键4");
            break;
        case KeyEvent.KEYCODE_5:
            testview.setText("放开按键5");
            break;
        case KeyEvent.KEYCODE_6:
            testview.setText("放开按键6");
            break;
        case KeyEvent.KEYCODE_7:
            testview.setText("放开按键7");
            break;
        case KeyEvent.KEYCODE_8:
            testview.setText("放开按键8");
            break;
        case KeyEvent.KEYCODE_9:
            testview.setText("放开按键9");
            break;
        case KeyEvent.KEYCODE_DEL:
            testview.setText("放开按键*");
            break;
        case KeyEvent.KEYCODE_ENTER:

            testview.setText("放开按键#");
            break;
        default:
            testview.setText("无法识别输入");
            break;
    }

    return super.onKeyUp(keyCode, event);
}

##方法2实现
赋予可读写权限

C:\Users\liang>adb shell
root@octopus-f1:/ # chmod 777 /dev/input/event6

代码实现

#include <stdio.h>
#include <linux/input.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include"Logger.h"
#include<pthread.h>

#include"com_example_liang_myapplication_KeyBoard.h"

#define DEV_PATH "/dev/input/event6"   //difference is possible

static void* pthread_read_keyboard(void*){
    int keys_fd;
    char ret[2];
    struct input_event t;
    keys_fd=open(DEV_PATH, O_RDONLY);
    if(keys_fd <= 0)
    {
        LOGE("%s device error!\n",DEV_PATH);
    }
    for(;;){
        usleep(500);
        if(read(keys_fd, &t, sizeof(t)) == sizeof(t))
        {
            if(t.type==EV_KEY)
                if(t.value==0 || t.value==1)
                {
                    LOGE("key %d %s\n", t.code, (t.value) ? "Pressed" : "Released");
                    if(t.code == KEY_ESC)
                        break;
                }
        }


    }
    LOGE("pthread_read_keyboard exit\n");
    close(keys_fd);
} 

自己写的
DEMO

android gpio口控制

Veröffentlicht am 2017-01-21

##android gpio口控制

 GPIO口控制方式是在jni层控制的方式实现高低电平输出,类似linux的控制句柄方式,在linux系统下将每个设备看作一个文件,android系统是基于linux内核的。

##保证该文件有读写权限

view

##用命令控制gpio输出
输出高电平
echo 1 > /system/class/gpio_sw/data
输出低电平
echo 1 > /system/class/gpio_sw/data

##代码段

#include <unistd.h>
#include"Logger.h"
#include <stdio.h>
#include <linux/input.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define DEV_PATH "/sys/class/gpio_sw/PE12/data"   //difference is possible


JNIEXPORT jint JNICALL Java_com_example_liang_gpio_1demo_Gpio_Set_1GPIO
        (JNIEnv *env,jobject){
    int fd;

    fd = open(DEV_PATH, O_WRONLY);
    if(fd < 0){
        LOGE("fail in open file %s", DEV_PATH);
        return -1;
    }
    write(fd, "1", strlen("1"));  //输出高电平
    sleep(1);  //延时
    write(fd, "0", strlen("0"));  //输出低电平
    close(fd);
    return 0;

}

##使用
 点击SetGpio按钮输出高低电平变化

自己编写
DEMO

Ubuntu16.04安装Screenlets

Veröffentlicht am 2017-01-21

##通过添加软件源的方式安装装

sudo add-apt-repository ppa:screenlets/ppa
sudo apt-get update
sudo apt-get install screenlets

以上方法在ubuntu16.04下不可行

##以源码的方式安装
sudo apt install python-beautifulsoup python-wnck python-vte python-tz
cd /tmp
wget -O - https://launchpad.net/screenlets/trunk/0.1.6/+download/screenlets-0.1.6.tar.bz2 | bunzip2 -c - | tar xf -
wget -O - https://launchpad.net/indiv-screenlets/trunk/0.1.6/+download/indiv-screenlets-0.1.6.tar.bz2 | bunzip2 -c - | tar xf -
cd screenlets-0.1.6
sudo setuo.py install
cd ../indiv-screenlets-0.1.6
sudo setup.py install
screenlets &

##出错解决
在终端下执行screenlets指令在运行过程中会提示出错信息。发现缺少相关库,使用以下指令安装。

sudo apt-get install python-gconf
sudo apt-get install libcanberra-gtk-module
sudo apt-get install python-xdg

##使用方法
打开screenlets双击相应的桌面控件,便会在桌面生成,相应的小程序,点击开始/停止也可以,或者点击登录时自启动,使桌面小程序,开机显示在桌面。

##设置界面

##效果图

linux终端实现代理

Veröffentlicht am 2016-12-19

##ubuntu 14.04安装Shadowsocks-Qt5

sudo add-apt-repository ppa:hzwhuang/ss-qt5
sudo apt-get update
sudo apt-get install shadowsocks-qt5

##运行Shadowsocks-Qt5

Shadowsocks-Qt5config

配置好账号和代理端口,代理端口为1080 socks5

##安装Privoxy

sudo apt-get install privoxy

##设置配置文件
找到
4.1. listen-address这一节,确认监听的端口号。

listen-address  localhost:8118

找到5.2. forward-socks4, forward-socks4a, forward-socks5 and forward-socks5t

forward-socks5   /               127.0.0.1:1080 .

我修改过后的配置文件

##重启Privoxy

sudo /etc/init.d/privoxy restart

##配置环境变量
sudo vim /etc/profile
在文件末尾添加以下代码

export http_proxy="127.0.0.1:8118"
export https_proxy="127.0.0.1:8118"

使环境变量生效

source /etc/profile

##设置privoxy开机启动
编辑启动项文件

sudo vim /etc/rc.local

在exit0之前添加如下语句

sudo /etc/init.d/privoxy start

linux git实现代理

Veröffentlicht am 2016-12-19

##说明
 Git 目前支持的三种协议 git://、ssh:// 和 http://,使用git:// 和 http://比较多,ssh://忽略,翻墙后可以直接加快同步google和github代码。

方式是通过Shadowsocks实现翻墙再使用connect工具实现代理转换。

##安装配置shadowsock-qt5

###安装

sudo add-apt-repository ppa:hzwhuang/ss-qt5
sudo apt-get update
sudo apt-get install shadowsocks-qt5

###配置

使用socks5的1080端口

##安装connect-proxy

在ubuntu 14.04 64位系统下

sudo apt-get install connect-proxy

##git://协议代理

###创建socks5proxywrapper文件添加如下语句

#!/bin/sh
connect -S 127.0.0.1:1080 "$@"

注意:是1080端口

###赋予可执行权限

chmod +x socks5proxywrapper

###配置git
打开git配置文件

vim .gitconfig

添加以下语句

[core]
    gitproxy = /path/to/socks5proxywrapper

说明:也就是创建socks5proxywrapper文件存放目录。

##https://代理

###配置git执行以下语句

git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'

###查看配置查看里面是否有相关选项

cat ~.gitconfig

参考教程

使用ndk编译c可执行程序

Veröffentlicht am 2016-12-19

##1.创建工程目录

 在ubuntu系统下搭建好ndk编译环境,创建test目录

mkdir test

在test目录下创建jni目录
cd test
mkdir jni

##2.编写源代码

vim hello-exe.c

#include<stdio.h>

int main(){
 printf("hello\n");
 return 0;
}

##3.创建android makefile文件

创建Android.mk和Application.mk文件,在jni目录下

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_CFLAGS += -fPIE  
LOCAL_LDFLAGS += -fPIE -pie


LOCAL_MODULE    :=hello-exe

LOCAL_SRC_FILES    :=hello-exe.c

include $(BUILD_EXECUTABLE)  

Application.mk

APP_ABI := all

##说明:
 如果将程序拷到sd卡内会出现无法修改程序的可执行权限,可以拷贝到手机内部存储再修改。

如果程序执行的时候提示PIE出错则要在android.mk里面添加以下两段字段

LOCAL_CFLAGS += -fPIE  
LOCAL_LDFLAGS += -fPIE -pie

源程序

编译Android源码

Veröffentlicht am 2016-12-19

##编译版本要求

##基本安装环境

###ubuntu 14.04 64

sudo apt-get install git-core gnupg flex bison gperf build-essential \
  zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
  lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \
  libgl1-mesa-dev libxml2-utils xsltproc unzip

###ubuntu 16.04 64

sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib 
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential  
sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib 
sudo apt-get install libc6-dev-i386 
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev 
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache

##配置环境变量
source build/envsetup.sh

##设置编译选项
lunch aosp_hammerhead-userdebug

##编译
make -j4
make失败或停止后,可以使用make -k 继续编译

##运行模拟器
在编译完成之后,就可以通过以下命令运行Android虚拟机了,
命令如下:

source build/envsetup.sh

lunch(选择刚才你设置的目标版本,比如这里了我选择的是2

emulator

如果你是在编译完后立刻运行虚拟机,由于我们之前已经执行过source及lunch命令了,因此现在你只需要执行命令就可以运行虚拟机:

既然谈到了模拟器运行,这里我们顺便介绍模拟器运行所需要四个文件:

Linux Kernel
system.
img
userdate
.img
ramdisk.img

如果你在使用lunch命令时选择的是aosp_arm-eng,
那么在执行不带参数的emualtor命令时,Linux Kernel默认使用的是/source/prebuilds/qemu-kernel/arm/kernel-qemu目录下的kernel-qemu文件
;而android镜像文件则是默认使用source/out/target/product/generic目录下的system.img,userdata.img和ramdisk.img,也就是我们刚刚编译出来的镜像文件.

上面我在使用lunch命令时选择的是aosp_arm64-eng,因此linux默认使用的/source/prebuilds/qemu-kernel/arm64/kernel-qemu下的kernel-qemu,
而其他文件则是使用的source/out/target/product/generic64目录下的system.img,userdata.img和ramdisk.img.
当然,emulator指令允许你通过参数制定使用不同的文件,具体用法可以通过emulator –help查看

##模块编译
除了通过make命令编译可以整个android源码外,
Google也为我们提供了相应的命令来支持单独模块的编译.

编译环境初始化(即执行source build/envsetup.sh)之后,我们可以得到一些有用的指令,
除了上边用到的lunch,还有以下:

- 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.

- mmm: Builds all of the modules in the supplied directories.

- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.

- resgrep: Greps on all local res/*.xml files.

- godir: Go to the directory containing a file.

其中mmm指令就是用来编译指定目录.通常来说,每个目录只包含一个模块.比如这里我们要编译Launcher2模块,
执行指令:

mmm packages/apps/Launcher2/
稍等一会之后,
如果提示:

### make completed success fully ###

即表示编译完成,
此时在out/target/product/gereric/system/app就可以看到编译的Launcher2.apk文件了.

重新打包系统镜像
编译好指定模块后,如果我们想要将该模块对应的apk集成到系统镜像中,
需要借助make snod指令重新打包系统镜像,这样我们新生成的system.img中就包含了刚才编译的Launcher2模块了.
重启模拟器之后生效.

单独安装模块
我们在不断的修改某些模块,总不能每次编译完成后都要重新打包system.img
,然后重启手机吧?有没有什么简单的方法呢?
在编译完后,借助adb install命令直接将生成的apk文件安装到设备上即可,
相比使用make snod,会节省很多事件.

##补充

我们简单的来介绍out/target/product/generic/system目录下的常用目录:
Android系统自带的apk文件都在out/target/product/generic/system/apk目录下;

一些可执行文件(比如C编译的执行),放在out/target/product/generic/system/bin目录下;

动态链接库放在out/target/product/generic/system/lib目录下;

硬件抽象层文件都放在out/targer/product/generic/system/lib/hw目录下.

##SDK编译

如果你需要自己编译SDK使用,很简单,只需要执行命令make sdk即可.

##编译fastboot adb

make fastboot adb

##BUILD
指的是特定功能的组合的特定名称,即表示编译出的镜像可以运行在什么环境.
其中,aosp(Android Open Source Project)代表Android开源项目;arm表示系统
是运行在arm架构的处理器上,arm64则是指64位arm架构;处理器,x86则表示x86架
构的处理器;此外,还有一些单词代表了特定的Nexus设备,下面是常用的设备代码和
编译目标,更多参考官方文档

|受型号|设备代码|编译目标


|Nexus 6P|angler|aosp_angler-userdebug|

|Nexus 5X|bullhead|aosp_bullhead-userdebug|

|Nexus 6|shamu|aosp_shamu-userdebug|

|Nexus 5|hammerhead|aosp_hammerhead-userdebug|

##BUILD TYPE
则指的是编译类型,通常有三种:

-user:代表这是编译出的系统镜像是可以用来正式发布到市场的版本,
其权限是被限制的(如,没有root权限,不能dedug等)

-userdebug:在user版本的基础上开放了root权限和debug权限.

-eng:代表engineer,也就是所谓的开发工程师的版本,拥有最大的权限(root等),
此外还附带了许多debug工具

##清除编译

make clobber

##理解 Android Build 系统
外部文档

提取刷机包内system.new.dat文件

Veröffentlicht am 2016-12-19

##转换
使用python脚本sdat2img来完成

sdat2img.py system.transfer.list system.new.dat system.img

输出信息

Skipping command erase
Copying 32767 blocks into position 0...
Copying 2 blocks into position 32768...
Copying 2 blocks into position 32809...
Copying 32212 blocks into position 33323...
Copying 2 blocks into position 65536...
Copying 20457 blocks into position 66050...
Copying 2 blocks into position 98304...
Copying 2 blocks into position 98345...
Copying 32212 blocks into position 98859...
Copying 2 blocks into position 131072...

Done! Output image: /home/hexiongjun/android/CM_XiaoMi4/cm12.1/system.img

这样就有了我们需要的system.img文件了

##挂载img文件
mount到system目录

sudo mount -t ext4 system.img  system

加速android源码编译

Veröffentlicht am 2016-12-19

添加缓存环境变量 :

在 ~/.bashrc 环境变量文件中 添加 export USE_CCACHE=1环境变量, 加速随后的编译过程;

##分配缓存磁盘大小
为 ccache 指定磁盘中的一部分大小, 用于缓存, 使用prebuilts/misc/linux-x86/ccache/ccache -M 50G 命令,大小可以自己设定,20G也可以。

##命令执行位置
在 Android 源码根目录执行 prebuilts/misc/linux-x86/ccache/ccache -M 50G 命令;

1…456

我思,故我在!

58 Artikel
© 2018 我思,故我在!
Erstellt mit Hexo
|
Theme — NexT.Muse v5.1.4