| 设备 | MSIDIGTAL-RM701 |
| 平台 | 瑞芯微RK3128 |
| 环境 | Windows 11 Subsystem Ubuntu 20.04.5 LTS |

在打包解包的过程中,我们至少需要使用瑞芯微官方提供的三个工具:afptool、img_unpack、img_maker。可以自己通过源码编译,也可以使用我文章后面附上的成品,架构为linux_amd64
#拉取源码
git clone 'https://github.com/TeeFirefly/rk2918_tools.git'
#进入目录
cd rk2918_tools/
#生成
make
#将工具复制到/usr/lcoal/bin以方便调用
sudo cp afptool img_unpack img_maker mkkrnlimg /usr/local/bin
从网上下载到的成品固件,我们称之为release_update.img,使用工具img_unpack将其解包为loader.img和update.img
#当前目录存放有:release_update.img
#第一个参数指定固件,第二个参数指定保存目录
img_unpack release_update.img img
通过afptool -unpack把update.img解包出各个分区镜像:
#进入img目录
cd img
#当前目录内有:loader.img update.img
#使用afptool对update.img进行解包
#指定工作模式,解包为-unpack,打包为-pack;第一个参数指定镜像位置;第二个参数指定保存目录
afptool -unpack update.img update
至此,解包已经完成,返回上一级目录,列出目录结构应是如此:
jamaskii@HP-445R-G6:/mnt/d/rk3128/demo/img$ cd ../
jamaskii@HP-445R-G6:/mnt/d/rk3128/demo$ tree .
.
├── img
│ ├── loader.img
│ ├── update
│ │ ├── Image
│ │ │ ├── MiniLoaderAll.bin
│ │ │ ├── boot.img
│ │ │ ├── kernel.img
│ │ │ ├── misc.img
│ │ │ ├── parameter.txt
│ │ │ ├── recovery.img
│ │ │ ├── resource.img
│ │ │ ├── system.img
│ │ │ └── uboot.img
│ │ ├── RESERVED
│ │ └── package-file
│ └── update.img
└── release_update.img
3 directories, 14 files
本次以给固件加入ROOT权限为例,阐述修改system分区的一些步骤。
在修改Image/system.img的内容之前,首先需要对其进行扩容,不然在后续的操作中大概率会遇到空间不足的错误警告:
jamaskii@HP-445R-G6:/mnt/d/rk3128/demo/img/update$ sudo cp '/mnt/d/rk3128/supersu/armv7/su' '/mnt/system/xbin'
cp: error writing '/mnt/system/xbin/su': No space left on device
以对其扩容128MB为例:
#填充128MB数据
dd if=/dev/zero bs=1M count=128 >> Image/system.img
#检查镜像错误并修正、扩容
e2fsck -f Image/system.img
resize2fs Image/system.img
解包出来的Image/system.img本质上是一个ext4文件系统的镜像,所以修改的思路是将其挂载在/mnt/system,当然其他位置也可以,然后进去对内容进行修改:
#创建挂载点
sudo mkdir /mnt/system
#进入img/update/目录
cd img/update/
#当前目录内有:Image RESERVED package-file
#将Image/system.img挂载到/mnt/system
sudo mount Image/system.img /mnt/system
到SuperSU官网下载其最新的zip包,解压,查看/META-INF/com/google/android/update-binary脚本,分析需要进行哪些操作。
首先是根据判断API等级:
# binary ARCH/path build type API
#
# arm-v5te arm ndk non-pie 7+
# x86 x86 ndk non-pie 7+
#
# x86 x86 ndk pie 17+ (su.pie, naming exception)
# arm-v7a armv7 ndk pie 17+
# mips mips ndk pie 17+
#
# arm64-v8a arm64 ndk pie 20+
# mips64 mips64 ndk pie 20+
# x86_64 x64 ndk pie 20+
RK3128属于arm-v7,所以匹配API17+
然后查看对应的操作有哪些。由于篇幅限制,这里只节选API17+部分:
# API source target chmod
#
# 7-19 common/Superuser.apk /system/app/Superuser.apk 0644
# 20+ common/Superuser.apk /system/app/SuperSU/SuperSU.apk 0644
#
# 17+ common/install-recovery.sh /system/etc/install-recovery.sh 0755
# 17+ /system/bin/install-recovery.sh 0755
#
# 7+ ARCH/su /system/xbin/su *3
# 7+ /system/bin/.ext/.su *3
# 17+ /system/xbin/daemonsu 0755
# *3: 06755 if API < 18, 0755 if API >= 18
#
# 17+ common/99SuperSUDaemon *6 /system/etc/init.d/99SuperSUDaemon 0755
# 17+ 'echo 1 >' or 'touch' *7 /system/etc/.installed_su_daemon 0644
# *6: only place this file if /system/etc/init.d is present
# *7: the file just needs to exist
首先需要将修改后的分区卸载:
sudo umount /mnt/system
#当前目录内有Image RESERVED package-file parameter
#设定工作模式为打包-pack,第一个参数为解包后的目录(包含Image/和package-file);第二个参数为保存位置
afptool -pack . ../update_new.img
如果打包工具抛出如下错误:
jamaskii@HP-445R-G6:/mnt/d/rk3128/demo/img/update$ afptool -pack . ../update_new.img
------ PACKAGE ------
Can't open file: ./parameter
Pack failed
则是在当前目录内找不到parameter,我们需要将Image/parameter.txt复制到当前目录,并命名为parameter
cp Image/parameter.txt parameter
#回到上级目录
cd ../
#此时目录内有loader.img update update.img update_new.img
#其中update_new.img是我们新打包出来的镜像
#设置芯片类型为rk3xx系列,第一个参数为loader.img位置;第二个参数为update.img位置;第四个参数为保存位置
img_maker -rk31 loader.img update_new.img ../release_update_new.img
说一下这里的打包工具img_maker,看下他的帮助信息:
usage: img_maker [chiptype] <loader> <old image> <out image>
chiptype:
-rk29
-rk30
-rk31
-rk32
-rk33
If chiptype is missing, it is default to -rk32.
一定要记得指定芯片类型,如果忘记了,则按默认的rk32xx系列打包。到刷机时如果目标设备不是rk32xx,则会验证出错。
打包完成,我们就得到了新的固件'../release_image_new.img',可以用这个固件进行刷机了。
前者是直接用来刷机的固件,后者仅仅包含各个分区的镜像文件。他们的关系如图:

否则做出来的包可能会导致刷机失败。
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).
我写了一个非常简单的rake任务来尝试找到这个问题的根源。namespace:foodotaskbar::environmentdoputs'RUNNING'endend当在控制台中执行rakefoo:bar时,输出为:RUNNINGRUNNING当我执行任何rake任务时会发生这种情况。有没有人遇到过这样的事情?编辑上面的rake任务就是写在那个.rake文件中的所有内容。这是当前正在使用的Rakefile。requireFile.expand_path('../config/application',__FILE__)OurApp::Application.load_tasks这里
我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame
-if!request.path_info.include?'A'%{:id=>'A'}"Text"-else"Text"“文本”写了两次。我怎样才能只写一次并同时检查path_info是否包含“A”? 最佳答案 有两种方法可以做到这一点。使用部分,或使用content_forblock:如果“文本”较长,或者是一个重要的子树,您可以将其提取到一个部分。这会使您的代码变干一点。在给出的示例中,这似乎有点矫枉过正。在这种情况下更好的方法是使用content_forblock,如下所示:-if!request.path_info.inc
我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr
我想在共享服务器上建立一个jekyll博客。当我尝试安装Jekyll时,我得到“您没有写权限”。我该如何在没有root或sudo的情况下解决这个问题?更多细节:我在共享服务器上有空间,但没有根访问权限。我无法安装Ruby,尽管托管公司应我的要求安装了它。当我尝试安装Jekyll时我使用user@hosting.org[~]#geminstalljekyll这是我得到的回应:ERROR:Whileexecutinggem...(Gem::FilePermissionError)Youdon'thavewritepermissionsintothe/usr/lib/ruby/gems/1.