简洁的MIUI9线刷包
MIUI9线刷包精简
1. 说明:系统包一经修改,将无法通过OTA升级(可能只是修改system分区的无法OTA升级,一般精简都修改system分区,system分区未修改的能不能OTA升级未测试)
2. 需要准备的工具:
系统 Windows
python2.7
蘑菇rom助手
文本编辑器(notepad,notepad++等)
miflash_unlock(小米官方bootloader解锁工具,针对有BL锁的手机)
小米官方刷机工具xiaomiflash
miui9线刷包
3. 准备工作
安装好上面的工具(python2.7、蘑菇rom助手、miflash_unlock、文本编辑器,解压miui9线刷包,其中蘑菇rom助手可以直接解压来绿色安装)
解锁BL,不会解锁的直接百度
4. 解锁system
打开蘑菇助手,在蘑菇助手工具箱选择“boot编辑”,“选择文件”(miui9线刷包解压目录images文件夹下)打开,选择“自动去除boot校验”,分别修改boot.img和recovery.img,修改完成后蘑菇助手会自动把原文件修改为_old.img文件,修改好的文件自动命名为原文件名
5. 精简系统apk
再使用蘑菇助手“ROM编辑”,选择刷机包打开,支持直接拖放文件,分别修改cust.img、userdata.img、system.img,在打开img文件之后选择“文件管理”,进入相关目录删除无用包:
userdata.img包中可以删除miui文件夹下app和videoplugins文件夹下所有的文件,cust.img包中app/customized下面所有的文件(partner-BaiduSpeechService可能与语音输入法有关,我没选择删除),prebuilts下面的文件不知道能不能删除,暂时没删除,然后提取修改cust/cn下面的文件,把上面的删除的相关包的相关字段删除,然后再“添加本地文件”覆盖,文件权限不需要修改,修改好之后再“开始封装”,同样会自动命名原文件和新文件
system分区谨慎删除,具体的可以参照网上miui8的可精简apk,其中data-app文件夹下的apk可以全部删除(删除其他的apk造成刷机后无法开机的概不负责),精简完成之后再选择“开始封装”。至此系统精简已经完成了
6. 修改刷机包根目录md5sum.xml文件(使用文本编辑器打开)
上面提到的几个img文件经过修改,md5值改变,可以使用rom助手“工具箱”->“md5计算器”分别在md5sum.xml文件中找到上面文件的行,修改<digest hash="md5" name="***.img">********</digest>,***为文件名,********为修改之后的文件通过md5计算器计算的新的md5值,保存文件
7. 修改刷机包根目录flash_gen_crc_list.py文件(对不起各位了,原稿有误,请按截图方式修改文件,注意python语法对齐tab不能用空格代替)
最好复制文件到新文件修改,随意命名(最好英文文件名吧),用文本编辑器打开,到文件最后:
把上面两行删除,修改为(注意前面的tab键,比上面一行多一个tab键,这是python语法)
tab键不能使用空格代替哦
删除images文件夹下备份sparsecrclist.txt和crclist.txt然后删除(不删除不知道是否会完全覆盖)
然后在当前目录打开命令行,运行“python你命名好的py文件”(命令无法找到的是没有设置好系统环境变量),然后images文件夹下会新生成sparsecrclist.txt和crclist.txt两个文件,文本编辑器打开,把每行末尾的L字母删除,然后再crclist.txt中找到cust行,把整行剪切放到sparsecrclist.txt中,参照原sparsecrclist.txt文件,把空格和数字也加上去(未测试不加,但是不把cust行剪切过来刷机刷不过),保存文件,然后就可以开始刷机了(自行网上搜索教程)
小提示:
如果你不想每次刷机完成后机器又加锁BL,在miflash界面右下角可以选择
你选择的哪个可以修改选择栏中的bat文件,把bat文件用文本编辑器打开,注释或删除行
fastboot %* oem lock || @echo "Oemlock error" && exit /B 1(注释直接在前面加两个英文冒号::)
如果你想加锁BL,兔子模式下(刷机)直接在XiaoMiFlash\Source\ThirdParty\Google\Android下打开命令行,或者miflash_unlock安装目录下运行命令行fastboot_unlock.exe或者fastboot.exe oem lock即可
另外此方法应该可以修改加入root完全获取系统root权限,目前暂时未研究,其实也不需要root了,把系统修改好之后刷入不想要的也精简掉了,需要修改机型的也修改好了。毕竟root之后手机不安全因素太多了。
小米论坛这样的帖子审核不能过。
文件下载地址:
https://pan.baidu.com/s/1PD47qc1uPQ3GN8xLb0bO_g
提取码:ca9b
推荐阅读
-
android卡刷包自制rom之添加删除,添加/删除ROM内置APP的教程
-
定制你的ROM:学会制作刷机包,让你的手机与众不同
-
【软件】使用一键制作工具去除推广APP,并支持线刷包和卡刷包的制作
-
简洁的MIUI9线刷包
-
绘制专属心情的完美刷机包,之创新发展的路上-绘制专属心情的完美刷机包,蘑菇rom助手带来了不同的感官效应,不一样的体验效果,在市场压力的驱动下,他也在不断创新发展,时代赋予的枷锁,当然也会少不了,面对流言蜚语,我们各抒几见。
-
记录了H30-T00刷机(线刷、变砖、救砖)的经验
-
无需取卡,直接下载咪咕MGV3201-ZG_GK国科6323_UWE5621DS固件升级包 - 适用于设备刷新的固件链接:" (请注意,这里已将"免拆卡刷固件包"替换为"无需取卡,直接下载...固件升级包",并保留了原链接)
-
韦根26协议读头的使用及proteus仿真-模拟韦根26读头的数据发送 使用定时器T1,采用16位定时器方式。 //8051 T1初始化 void Timer1_init { TMOD=0x10; //T1 16位定时器模式 ET1=0; //关闭定时器中断 TR1=0; //关闭定时器 TF1=0; //清除TF1标志 } 例如,就发送上面的这个数据:01000110111000001001010101 十进制的18580053 发送数据0的时候,就是将数据线D0拉低404us,发送数据1的时候,就是将数据线D1拉低404us。 首先设置定时器初值,用STC的下载器计算404us的预装入值。 拉低数据线,等待404us到时,之后抬高数据线,再等待2ms的时间,一位数据就发送完成了。 void Send_bit(bit bD) { //拉低数据线D0 404us TL1 = 0x8C; //设置定时初值 TH1 = 0xFE; //设置定时初值 if(bD==0) Send_D0=0; else Send_D1=0; TR1=1; //开启定时器 while(TF1 ==0); //等待溢出 //时间到抬高数据线 if(bD==0) Send_D0=1; else Send_D1=1; TF1=0; //清溢出标志 TR1=0; //关定时器 //下面是数据位的间隔 2ms TL1 = 0xCD; //设置定时初值 TH1 = 0xF8; //设置定时初值 TR1=1; //开启定时器 while(TF1 ==0); //等待溢出 TF1=0; //清溢出标志 TR1=0; //关定时器 } 将韦根26协议的数据装入一个无符号长整型变量里: //二进制 0 100011011100000100101010 1 头尾两位为奇偶校验位,十进制是18580053 unsigned long WG26=18580053; 无符号长整型是四个字节32位,装入26位的数据,则最前面的6位是无效的,循环移位6次,把无效数据移除。 //000000 01000110111000001001010101 for(i=0; i<6; i++) { WGdata=WGdata<<1; } //现在WGdata中的数据是 01000110111000001001010101 000000,后面多了6个0。 有效数据已经移动到最前面,可以开始发送了,循环26次发送数据 for(i=0; i<26; i++) { if( (WGdata & 0x80000000) == 0x80000000 ) Send_bit(1); //如果最高位为1,发送1 else Send_bit(0); //如果最高位为0,发送0 WGdata=WGdata<<1; //左移1位 } } 完整发送函数: //发送韦根26数据,用4个字节保存,一共32位 void SendWG26(unsigned long WGdata) { uchar data i; //从最高位开始发送数据,将开头的6个无效数据位隔过去 //18580053 //000000 01000110111000001001010101 //01000110111000001001010101 000000 for(i=0; i<6; i++) { WGdata=WGdata<<1; } //有效数据位已经移到了开头,开始发送数据 for(i=0; i<26; i++) { if( (WGdata & 0x80000000) == 0x80000000 ) Send_bit(1); else Send_bit(0); WGdata=WGdata<<1; } } 数据的接收 将数据线D0,D1连接到与门74HC08上,两条数据线上有数据发送时会产生INT0的下降沿中断。 (这只是仿真图,实际硬件连接有所不同) 在中断服务程序中接收数据: 还是用一个节的无符号长整型数据WG26,将收到的数据记入其最低位。每接到一位数据,左移一次。当接收到26个数据时,认为收到了读头发来的完整数据。设置接收完成标志ReceiveFlag=1;供主程序查询。 这里设置了一个超时检测,就是接收到的两位数据之间的时间间隔如果大于5ms就认为数据超时,(因为读头发来的数据每位之间的间隔是2ms)。这样,如果有意外的脉冲干扰,引起计数数据位的count值错误,也只会产生一次数据接收错误,将各种标志和变量全部清零后,不会影响下一次的数据接收。 在中断服务程序退出之前,一定要清除中断标志IE0,以免响应了无效数据的中断标志,产生接收错误。 void INT0_ISR(void) interrupt 0 //外部中断0服务程序 { //如果接到的两位数据之间间隔超过5ms,定时器溢出标志TF1置位 //超时检测使用定时器T1,16位定时方式 EX0=0; //关中断 //如果有定时器超时标志置位 if(TF1==1) //数据有误,放弃数据 { LCD_StrDisp(0x00,"Try Again "); LCD_StrDisp(0x40,"TimeOut Error "); Beep(10); //隔过至少一个数据包的时间,以便放弃不完整的数据 //延时100ms Delay50ms; Delay50ms; TR1=0; //关定时 TF1=0; //清标志 TL1 = 0x00; //设置定时初值 5ms 溢出 TH1 = 0xEE; //设置定时初值 5ms 溢出 count=0; WG26=0; ReceiveFlag=0; } //如果数据位间隔未超时 else { WG26=WG26<<1; if(RD0==0) //接收到了0 WG26=WG26&0xFFFFFFFE; else if(RD1==0) //接收到了1 WG26=WG26|0x00000001; count++; if(count==26) { count=0; ReceiveFlag=1; TR1=0; //关定时 TF1=0; //清标志 } else { //为接收下一位做准备 TR1 = 0; //关定时 TF1 = 0; //清除TF1标志 TL1 = 0x00; //设置定时初值 TH1 = 0xEE; //设置定时初值 //超过5ms溢出标志被置位 TR1 = 1; //定时器1开始计时 } } IE0=0; //清除INT0中断标志,很重要! EX0=1; //开中断 } 在主程序查询到接收完成标志后,开始对数据进行奇偶校验位的核对。 得到奇校验位,记入odd=1 将无效的6位移除 得到偶校验位,记入even=0 将偶校验位移除,统计前12位有几个1 100011011100 000100101010
-
Material Design Lite,一个简洁、令人惊叹的前端工具包。
-
剖析并提供解决方案:Odin线刷失败的常见问题与原因探究(改编自他文)