如何针对特定机型,编译cwm recovery

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何针对特定机型,编译cwm recovery相关的知识,希望对你有一定的参考价值。

*1 准备Ubuntu作为您的操作系统,笔者的版本是12.04_amd64。

*2 准备 android 源码的编译环境,主要是安装一些编译用到的lib库,以及同步源码的一些工具,如GIT,CURL,REPO等。具体可参考:http://source.android.com/source/index.html[source.android.com]

*3 在确保环境已准备妥当之后,接下来开始下载 Android 源码,此文以cm 10.1 源码为例。

1).创建一个用于存放源码的目录,如:jellybean/system

mkdir –p jellybean/system

2).切换到该目录

cd jellybean/system

3).初始化cm-10.1的分支

repo init -u git://github.com/CyanogenMod/android.git -b cm-10.1

4).同步源码

repo sync –j30

*4 适配你的Vendor

1).前提条件

* 已root;

* 有boot.img或者recovery.img

2).手动建立Vendor文件夹:device/ZTE/N881F,规则为“device/device_manufacturer_name/device_name”,这里 “device_manufacturer_name” 指的是你要编译的设备的厂商,“device_name” 指的是你的设备名称。

mkdir –p device/ZTE/N881F

3).获取boot.img

adb连接手机状态下,输入

adb shell

进入shell模式,保证手机已root,输入 su,转入root权限,输入

cat /proc/mtd

查看有recovery(和/或)boot路径,如果存在,分别执行

dd if=/your_boot_partition of=/your_sdcard_if_exists/boot.img
dd if=/your_recovery_partition of=/your_sdcard_if_exists/recovery.img

your_boot_partition 是mtd文件中记载的boot的路径,your_sdcard_if_exists 是你的sdcard路径,recovery同理,完成后退出shell,在终端或命令行下执行

adb pull /your_sdcard_if_exists/boot.img d:\\boot.img
adb pull /your_sdcard_if_exists/recovery.img d:\\recovery.img

这样就获取了boot.img和recovery.img文件

如果cat /proc/mtd 提示 No such file or directory,请在adb shell的root权限下执行

mount

在输出中查找 system,userdata,cache的路径,通常情况下,boot,recovery路径会和他们保持一致,一个可能的输出是

root@edison:/ # mount
mount
rootfs / rootfs ro,relatime 0 0
tmpfs /dev tmpfs rw,nosuid,relatime,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,relatime,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
/dev/block/system /system ext3 ro,relatime,barrier=1,data=ordered 0 0
/dev/block/pds /pds ext3 rw,nosuid,nodev,noatime,nodiratime,errors=continue,barrier=1,data=ordered 0 0
/dev/block/preinstall /preinstall ext3 rw,nosuid,nodev,noatime,nodiratime,barrier=1,data=ordered 0 0
/dev/block/userdata /data ext3 rw,relatime,errors=continue,barrier=0,data=ordered 0 0
/dev/block/cache /cache ext3 rw,nosuid,nodev,noatime,nodiratime,errors=continue,barrier=1,data=ordered 0 0
/dev/fuse /mnt/sdcard fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
/dev/block/vold/179:97 /mnt/external1 vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0

分析内容发现,没有boot,没有Recovery分区。。。不急,咱们找规律。
/dev/block/cache,/dev/block/userdata,/dev/block/system。。。这样是不是boot和recovery分区路径为/dev/block/boot和/dev/block/recovery?

此时查看 /dev/block 目录

root@edison:/ # ls /dev/block
ls /dev/block
boot
cache
cdrom
cid
...
recovery
...

真有,那么 boot 和 recovery 即是我们要寻找的文件,接下来,同样使用 dd 命令导出它们到sdcard,再使用adb pull命令导出到本地磁盘

4).生成vendor

source build/envsetup.sh
make -j4 otatools
build/tools/device/mkvendor.sh device_manufacturer_name device_name /your/path/to/the/boot.img

实际命令如下:

source build/envsetup.sh
make -j4 otatools
build/tools/device/mkvendor.sh ZTE N881F boot.img

上述命令假设你的boot.img存放于源码目录下。

5).提取recovery.fstab。经过第4)步骤后,会生成一份默认的recovery.fstab到你的N881F目录下,这时我们需要获取一份属于你机器的挂载点,这时候有两种办法:

* 直接查看手机里的“/cache/recovery/last_log”,如果该文件存在,则查找如下内容:

recovery filesystem table

=========================

如果有上述内容,那就将它拷贝粘贴至recovery.fstab。

* 解包recovery.img,解压后的etc目录下有此文件,直接拷过来用。文件内容:

mount point fstype device [device2]
/boot emmc /dev/block/mmcblk0p8
/cache ext4 /dev/block/mmcblk0p15
/data ext4 /dev/block/mmcblk0p13
/misc emmc /dev/block/mmcblk0p17
/recovery mtd /dev/block/mmcblk0p16
/sdcard vfat /dev/block/mmcblk1p1 /dev/block/mmcblk1
/system ext4 /dev/block/mmcblk0p12
/sdcard2 vfat /dev/block/mmcblk0p20

6).准备 recovery.rc

import /init.recovery.$ro.hardware.rc
on early-init
start ueventd
on init
export PATH /sbin
export ANDROID_ROOT /system
export ANDROID_DATA /data
export EXTERNAL_STORAGE /sdcard
symlink /system/etc /etc
mkdir /boot
mkdir /recovery
mkdir /sdcard
mkdir /internal_sd
mkdir /external_sd
mkdir /sd-ext
mkdir /datadata
mkdir /emmc
mkdir /system
mkdir /data
mkdir /cache
mount /tmp /tmp tmpfs
chown root shell /tmp
chmod 0775 /tmp
write /sys/class/android_usb/android0/enable 0

#可能会修改的地方
write /sys/class/android_usb/android0/idVendor 19d2
write /sys/class/android_usb/android0/idProduct 1361
write /sys/class/android_usb/android0/functions mass_storage,adb

write /sys/class/android_usb/android0/iManufacturer $ro.product.manufacturer
write /sys/class/android_usb/android0/iProduct $ro.product.model
write /sys/class/android_usb/android0/iSerial $ro.serialno
on boot
ifup lo
hostname localhost
domainname localdomain
class_start default
service ueventd /sbin/ueventd
critical
service recovery /sbin/recovery
service adbd /sbin/adbd recovery
disabled
# Always start adbd on userdebug and eng builds
on property:ro.debuggable=1
write /sys/class/android_usb/android0/enable 1
start adbd
setprop service.adb.root 1
# Restart adbd so it can run as root
on property:service.adb.root=1
write /sys/class/android_usb/android0/enable 0
restart adbd
write /sys/class/android_usb/android0/enable 1

7).修改 recovery.rc

这份文件大致是通用的,可能需要修改的地方单独指出来了,如若Recovery编译完后USB大容量不能正常挂载,则可去手机里查看“/sys/class/android_usb/android0/idVendor”和“/sys/class/android_usb/android0/idProduct”这两个文件的内容,然后依次填入上述可修改处的值(如 idVendor 19d2,把“19d2“换成“/sys/class/android_usb/android0/idVendor”对应的值即可)。

在Ubuntu下还可以用lsusb命令查看这两个值:

focus@ubuntu:/media/linux/jellybeanplus/system$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 003: ID 064e:d20c Suyin Corp.
Bus 002 Device 003: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 003 Device 013: ID 19d2:1361 ZTE WCDMA Technologies MSM

最后一行的19d2和1361即为idVendor和idProduct。

8).重写按键对应的c文件 recovery_ui.c

9).提取设备的根文件系统的rc或sh文件,如init.qcom.usb.rc,init.qcom.usb.sh。(仅在根文件系统的目录下有这些文件的情况下成立,如无则忽略)

10).查看内核基址,ramdisk文件的offset偏移量等

11).提取system.prop

adb pull /system/build.prop

从手机里pull过来build.prop后,拷贝到N881F目录,打开文件,将文件内容拷贝至system.prop,然后将build.prop文件删除。

*5 开始编译

1).设置源码环境变量

gedit ~/.bashrc

添加如下环境变量:

# Android environment
export TARGET_ARCH=arm
export ANDROID_SDK_TOOLS=<YOUR_ANDROID_SDK_DIR>/tools
export ANDROID_TOOLCHAIN=<YOUR_SOURCE_CODE_DIR>/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin
export PATH=$ANDROID_SDK_TOOLS:$ANDROID_TOOLCHAIN:$PATH

# Java environment
JAVA_HOME=<YOUR_JAVA_SDK_DIR>
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

执行命令使环境变量生效:
source ~/.bashrc

2).编译你的Vendor

cd <源码目录>
source build/envsetup.sh
lunch cm_N881F-eng
make -j4 recoveryimage
参考技术A   你必须使用32位或64位Ubuntu系统,关于如何建立编译环境和同步源码的指导,请自己查找有关指导的文章。
  1,

  安装所需要的包
  2,

  建立编译的环境,并同步CWM所需的源码,CyanogenMod源码中附带CWM源码

  CWM 5 - Gingerbread
  CWM 6 - Jellybean
  3,

  下面我们进入真正的编译阶段,确保你已经使用“repo sync ”命令同步了最新的源码
  进入源码的目录

  放出以下命令:

  make -j4 otatools
  3.5,

  如果你的机型不被CM10官方支持,请执行这一步
  在你的手机终端上执行以下命令,

  dump_image boot /sdcard/boot.img

  这将boot镜像导出到你手机的sdcard,复制该镜像至你的home目录下
  为一款新设备编译android源码,需要建立相应的配置文件和makefile文件,这通常比较麻烦,如果仅仅编译recovery镜像,会容易的多。在android源码根目录下(假设已运行envsetup.sh),运行以下命令(使用适当的名称取代命令中的名称)

  build/tools/device/mkvendor.sh device_manufacturer_name device_name /your/path/to/the/boot.img

  例如,你拥有Samsung Galaxy Ace这款设备,你应该使用以下这条命令
  build/tools/device/mkvendor.sh Samsung cooper ~/boot.img

  Please note that Cooper is the device name. Only use "~/boot.img" if you have the boot image in your home directory. Or else please specify the correct path.

  如果所有都工作正常,你将看到"Done!"这样的确认信息。mkvendor.sh脚本也将在你的android源码树中创建以下目录:
  manufacturer_name/device_name

  4,

  现在你已经拥有相关的配置文件

  在源码目录下,在terminal终端下键入以下命令

  . build/envsetup.sh
  这一步将为你建立编译环境

  现在使用这条命令

  lunch full_device_name-eng
  这将为你的设备建立起build system。用文件管理器或IDE打开目录,你应该拥有以下文件: AndroidBoard.mk, AndroidProducts.mk, BoardConfig.mk, device_.mk, kernel, system.prop, recovery.fstab, 和 vendorsetup.sh
  对你感兴趣的应该是recovery.fstab和kernel这两个文件,kernel这个文件是你之前从boot.img文件中提取出的。recovery.fstab将适用于大部分拥有 mtd, emmc,或者其他分区的设备。如果没有,recovery.fstab将需要优化以支持加载这些点。例如 /sdcard被加载至/dev/block/mmcblk1p1,

  你需要将下面这段加入到你的BoardConfig.mk文件中

  /sdcard vfat /dev/block/mmcblk1p1
  一旦recovery.fstab已经适当的装载,你可以开始下一步了

  5,

  现在,我们开始编译Recovery
  make -j4 recoveryimage

  这个命令用于编译recovery镜像

  你能使用这个命令

  make -j4 recoveryzip
  用于建立一个临时的recovery.zip刷机包在你真实的设备上测试

  你编译好的recovery可以在"your_source_directory/OUT/target/product/device/recovery.img"目录下找到。而.zip刷机包可以在相同目录下的utilities文件夹下找到。

  如果各项测试正常,就可以有一个成功的recovery

  一旦你编译通过了recovery,通知"koush",在Github上,他就能根据你的编译文件发放官方版的CWM Recovery,并使Rom Manager提供相应的支持。

  小贴士:

  如果你想编译CWM6,使用以下命令同步jellybean分支源码

  repo init -u git://github.com/CyanogenMod/android.git -b jellybean
  
  repo sync
  如果你改变了BoardConfig.mk文件,在编译期间运行"make clobber",否则你做的更改就不会生效。

  本回答被提问者和网友采纳

选择特定版本的 Visual Studio 命令行工具包并针对特定版本的 C++ 运行时环境编译文件

【中文标题】选择特定版本的 Visual Studio 命令行工具包并针对特定版本的 C++ 运行时环境编译文件【英文标题】:Choose a certain version of Visual Studio's command line toolkit and compile files against a certain version of a C++ run-time environment 【发布时间】:2018-08-14 16:55:38 【问题描述】:

我正在使用 Visual Studio 2017。尝试使用特定版本的 C++ 工具包编译包,并针对特定版本编译 C++ 运行时环境。

在我的情况下,这意味着针对最新 c++ 运行时环境库的最新工具包。

我该如何做到这一点?我尝试使用/std:c++17/std:latest 但这会导致针对vc140.dll 编译的构建。

cl.exelink.exe 的文档都没有给出任何提示。

有什么想法吗?谢谢。

【问题讨论】:

“工具包”没有任何意义。它类似于“工具集”。构建工具集 cl.exe 是其中的一部分。 vc141.dll 没有任何意义。它类似于 vcruntime140.dll,该DLL 没有141 版本。他们没有为 VS2017 创建该运行时 DLL 的新版本,是的。没有迹象表明您有问题。 我的问题确实令人困惑。谢谢你指出。我修改了我的问题。我的意思是如何选择要编译的 c++ 标准库的版本。由于已经提出了答案,我已经离开了关于工具包版本的部分。 【参考方案1】:

在项目属性 UI 中,您可以在“常规”页面上设置平台工具集。

对于 v140,生成的命令行开始:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\CL.exe

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\link.exe

但是对于 v141 他们开始:-

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.12.25827\bin\HostX86\x86\CL.exe

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.12.25827\bin\HostX86\x86\link.exe

如果您将构建输出设置为诊断(通过工具->选项->构建和运行),您可以自己阅读命令行。

【讨论】:

这是我的错误。由于时间锁定,目前无法修改。 我的问题本身也很混乱;这与工具包的版本无关;但所需的 c++ 运行时环境的版本。 @Vega4 请不要因为未使用您未在问题中提供的信息而对答案投反对票。 找到一个 gui 设置做你想做的事情并查看它对命令行做了什么的一般技术可能仍然有用,在这种情况下,我们看到它实际上改变了 cl 的位置。 exe被调用。该文件夹恰好包含一个 vcruntime140.dll(并且没有 141)【参考方案2】:

您可以使用下拉菜单在此处设置它们

(project properties)
(configuration properties)
(general)
(platform toolset)

【讨论】:

问题是关于没有任何项目文件的命令行构建。 有趣。我看到了歧义。在问题真正关闭之前,您应该在问题中说清楚。

以上是关于如何针对特定机型,编译cwm recovery的主要内容,如果未能解决你的问题,请参考以下文章

如何编译lineage不支持的机型

针对特定版本的 armhf g++ 进行编译

选择特定版本的 Visual Studio 命令行工具包并针对特定版本的 C++ 运行时环境编译文件

如何移植android2.1源代码到自己的手机上

方舟编译器明天开源!20多款机型已适配支持

数据仓库的元数据管理