Android Studio Gradle构建依赖冲突的分析和解决

问题介绍

如果App或者库依赖了很多第三方组件库,那么依赖冲突就再所难免。不同版本的库混在在一起,明显的冲突会导致编译过程中就报错。
不明显的隐含冲突更为严重,因为可以正常构建出app包,但报错可能会在app运行时出现,更加难以处理。

例如下面是构建时的一个报错:

build.gradle: Error: All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes). Found versions 28.0.0, 27.1.0. Examples include com.android.support:animated-vector-drawable:28.0.0 and com.android.support:exifinterface:27.1.0 [GradleCompatible]

分析哪些库版本冲突了

简单项目可能人工查看就能定位到,但一般项目都依赖了很多三方组件,人工分析查看就无能为力了。实际上Gradle提供了依赖查看树命令,可以方便的将项目中的全部依赖以tree的形式展现出来,非常便于查看:

查看全部配置下的依赖树:
gradlew -q dependencies app:dependencies

查看某个具体配置下的依赖树:
gradlew -q dependencies app:dependencies –configuration debugAndroidTestCompileClasspath
gradlew -q dependencies app:dependencies –configuration debugUnitTestCompileClasspath
gradlew -q dependencies app:dependencies –configuration debugCompileClasspath

gradlew -q dependencies app:dependencies –configuration releaseCompileClasspath
gradlew -q dependencies app:dependencies –configuration releaseUnitTestCompileClasspath
gradlew -q dependencies app:dependencies –configuration releaseRuntimeClasspath

如何解决冲突

1. 通过 DependencyResolve 强制修改版本

1
2
3
4
5
6
7
8
9
10
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
details.useVersion '28.0.0'
}
}
}
}

2. 通过 exclude 排除有问题的版本依赖

1
2
3
4
5
6
7
8
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})

implementation('com.facebook.android:facebook-login:[4,5)') {
// contains com.android.support:v7:27.0.2, included required com.android.support.*:27.1.1 modules
exclude group: 'com.android.support'
}

WinDbg一般用法(Common usage of WinDbg)

What is windbg?

windbg (formally name is Debugging Tools for Windows).
The Windows Debugger (WinDbg) can be used to debug kernel-mode and user-mode code, analyze crash dumps, and examine the CPU registers while the code executes.

You can get it from https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-download-tools

WinDbg是Microsoft Windows上的多用途调试器,可从微软网站上免费下载安装使用。可用于调试用户态下的应用程序、驱动程序,以及核心态下的操作系统自身。该软件是GUI界面,但与更为著名但功能稍弱的Visual Studio Debugger几乎完全不同。

WinDbg看调试核心态或用户态下的内存卸载文件。

WinDbg能从服务器自动装载匹配的调试符号文件,如PDB文件。调试符号文件在源代码文件与二进制可执行程序之间创建对应。Microsoft的公开的符号服务器提供了Windows 2000以后各版本操作系统及服务包的绝大部分符号。

WinDbg较新版本作为免费的Debugging Tools for Windows包的组成部分被发行,在WinDbg与命令行调试器前端如KD,CDB,NTSD之间共享了同一个调试器后端。

Setup symbols search path

Open File -> Symble File Path, fill up with:

C:\myProgramPDB;C:\Windows\symbols;srvD:\localsymbolshttp://msdl.microsoft.com/download/symbols

This includes your app symbols path and system symbols path.

srvE:\mysymbolshttp://msdl.microsoft.com/download/symbols

Analyze the core dump file

Open File -> Open Crash Dump, browser the dmp file you wish to analyze:

C:\Windows\LiveKernelReports\WATCHDOG\WD-20210702-0011.dmp
C:\Windows\LiveKernelReports\WATCHDOG\WD-20210629-2245.dmp

then wait some minutes(windbg will download symbols from the internet).

When windbgt is ready, run “!analyze -v” commmand to let windbg do some auto analyze job…

kb : Displays the first three parameters that are passed to each function in the stack trace
kc : Displays a clean stack trace. Each display line includes only the module name and the function name

.ecxr : displays the context record that is associated with the current exception
~ : 查看系统当前线程,使用*s命令切换线程,如需要切换到8号线程,可以使用命令:8s

Learn more

Windbg使用简明指南 https://www.cnblogs.com/daoyuly/p/3570037.html

Android Studio Gradle 构建失败:内存不足

Android Studio Gradle Build failed with following message in the log:

Task :AndroidBootstrap:extractDebugAnnotations
Task :AndroidBootstrap:mergeDebugGeneratedProguardFiles UP-TO-DATE
Task :AndroidBootstrap:mergeDebugConsumerProguardFiles UP-TO-DATE
Task :AndroidBootstrap:syncDebugLibJars
Task :AndroidBootstrap:bundleDebugAar
Task :AndroidBootstrap:compileDebugSources
Task :AndroidBootstrap:assembleDebug
Task :AndroidBootstrap:parseReleaseLocalResources
Task :AndroidBootstrap:writeReleaseAarMetadata
Task :AndroidBootstrap:verifyReleaseResources
Task :AndroidBootstrap:bundleLibResDebug NO-SOURCE
Task :AndroidBootstrap:generateReleaseRFile
Daemon will be stopped at the end of the build after running out of JVM memory
Task :AndroidBootstrap:bundleLibRuntimeToJarDebug
Task :AndroidBootstrap:compileReleaseJavaWithJavac


at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.OutOfMemoryError: Metaspace

  • Try:
    Run with –stacktrace option to get the stack trace. Run with –info or –debug option to get more log output. Run with –scan to get full insights.

  • Get more help at https://help.gradle.org

BUILD FAILED in 3m 1s

FAILURE: Build failed with an exception.

  • What went wrong:
    Metaspace

  • Try:
    Run with –stacktrace option to get the stack trace. Run with –info or –debug option to get more log output. Run with –scan to get full insights.

  • Get more help at https://help.gradle.org

BUILD FAILED in 3m 1s

Solution

Check the jvmargs parameter in file gradle.properties (project root dir):

#The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m

You need add the org.gradle.jvmargs line or modify its value to be more larger than current.

Android Studio 中文乱码问题彻底解决

Add these three lines in this file and restart:

C:\Users\Administrator\AppData\Roaming\Google\AndroidStudio4.2\studio64.exe.vmoptions

-Dfile.encoding=UTF-8
-Duser.country=US
-Duser.language=en

For memo

Before modify:

“C:\Program Files\Java\jdk1.8.0_202\bin\java.exe” -Djava.security.manager=worker.org.gradle.process.internal.worker.child.BootstrapSecurityManager -Xmx512m -Dfile.encoding=UTF-8 -Duser.country=CN -Duser.language=zh -Duser.variant -cp C:\Users\Administrator.gradle\caches\6.5\workerMain\gradle-worker.jar worker.org.gradle.process.internal.worker.GradleWorkerMain “‘Gradle Worker Daemon 9’”

After modify:

“C:\Program Files\Java\jdk1.8.0_202\bin\java.exe” -Djava.security.manager=worker.org.gradle.process.internal.worker.child.BootstrapSecurityManager -Xmx512m -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -cp C:\Users\Administrator.gradle\caches\6.5\workerMain\gradle-worker.jar worker.org.gradle.process.internal.worker.GradleWorkerMain “‘Gradle Worker Daemon 1’”

“C:\Program Files\Java\jdk1.8.0_202\bin\java.exe” -XX:MaxMetaspaceSize=256m -XX:+HeapDumpOnOutOfMemoryError -Xms256m -Xmx512m -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -cp C:\Users\Administrator.gradle\wrapper\dists\gradle-6.5-all\2oz4ud9k3tuxjg84bbf55q0tn\gradle-6.5\lib\gradle-launcher-6.5.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 6.5

“C:\Program Files\Java\jdk1.8.0_202\bin\java.exe” -Xmx1536m -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -cp C:\Users\Administrator.gradle\wrapper\dists\gradle-6.5-all\2oz4ud9k3tuxjg84bbf55q0tn\gradle-6.5\lib\gradle-launcher-6.5.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 6.5

Bugs for Android Studio / IntelliJ IDEA

But when generating javadoc, Android Studio does not use any options in file studio64.exe.vmoptions, you can execute in commandline and add “-J-Duser.language=en” manualy:

“C:\Program Files\Java\jdk1.8.0_202\bin\javadoc.exe” -J-Duser.language=en @D:\Downloads\Android-xxx\build\tmp\androidJavadocs\javadoc.options

Android Studio 4.2升级后问题处理案例集锦

介绍

先看看 Android Studio 4.2 带来了啥新玩意:

  • 按变体配置应用签名
  • 针对JDK 11 优化Gradle 构建
  • System Trace:改进了内存和图形的指标
  • 现在,R8 retrace 包含在命令行工具中
  • 新增布局检查器刷新操作
  • Jetpack Compose 的Android Gradle 插件支持
  • 适用于AGP 的升级助理

balabala,说的不少,但也没看出有什么特别的地方。
更多内容,见原文 https://developer.android.com/studio/preview/features?hl=zh-cn#4.2

如果原来版本用的挺好的,不建议升级。但对于新版本强迫症患者,肯定会手贱升级一波的,然后问题就来了…

问题 1: Gradle Task面板中啥都看不到了

原因:这是因为新版本中,AS中在Experimental一栏中有新的内容修改,但是在它的What’s New in 4.2中是没有任何体现的,并且非常体贴的默认给你勾选了”Do not build Gradle task list during Gradle sync”,让你体验一波新版本的福利,解决办法也就显而易见了。

解决办法:Setting中去掉这项的勾选: “Do not build Gradle task list during Gradle sync”,然后再 Sync Project

问题 2: 构建时报错: java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

问题原因:在 Android Studio 中运行时,Gradle 构建工具使用 Android Studio 中设置的默认 JDK 版本。在以前的版本中,默认情况下使用 JDK 8;但在 4.2 中,默认的 JDK 版本为 JDK 11。JDK 11 的这项更新会影响 JVM 垃圾回收器的默认配置,因为 JDK 8 使用并行垃圾回收器,而 JDK 11 使用 G1 垃圾回收器。

解决办法:Project Structure -> Platform Settings\SDKs -> Android API xx Platform -> Change “Java SDK” to 1.8

问题 3: 插件问题

4.2 中插件路径修改了,可能需要重新安装插件。在Android studio 4.2中plugin目录发生了变化:
Plugin folder has changed in 4.2 version;
From : ~/Library/Application\ Support/AndroidStudio4.2
To : ~/Library/Application\ Support/Google/AndroidStudio4.2/plugins

ln -s ~/Library/Application\ Support/Google/AndroidStudio4.2/plugins ~/Library/Application\ Support/AndroidStudio4.2

莫名其妙的其他问题

问题描述:比如编译时突然提示文件名过长,无法删除文件之类的提示。
解决办法:可尝试将kotlin版本升级到最新的1.5.0以上,build gradle插件4.2.0以上,主项目gradle 6.7.1以上

KiB、KB和Kb傻傻分不清?

KiB、MiB与KB、MB的区别

KB和MB是由 国际单位制(SI)制定的十进制标准,而KiB和Mib是由国际电工委员会(IEC)制定的二进制标准。
也就是通常所说的SI和IEC标准。

具体换算关系:

不带“i”的单位换算:

  • 1KB = 10^3 = 1000 Byte
  • 1MB = 10^6 = 1000*1000 Byte = 1000KB

带“i”的单位换算

  • 1KiB = 2^10 = 1024 Byte
  • 1MiB = 2^20 = 1024*1024 Byte = 1024KiB

历史由来

硬盘的容量用了1000进位而不是以2进制为底的1024进位这个问题已经是常识了,但是存储厂商这么标反而是符合标准的。可能有些朋友在Linux和macOS中见过容量单位的两个大写字母中插了一个i的,比如KiB、MiB、GiB这样的单位,那么它和我们常用的KB、MB和GB有什么区别呢?

KB代表国际单位制标准规定的1000进位,KiB这类中间带个”i”的是1024进位法的标准写法。Windows使用1024进位,但是没有按照标准写,Linux和macOS等很多其他系统使用1000进位,并且按照规范写了。Kb这类代表1000进位,计量单位为bit而不是byte的单位,常见于描述带宽和媒体码率。

还是要扯到二进制与十进制身上。

在国际通用的国际单位制标准(SI)中,对于一个单位的倍数和分数,有着详细的定义。比如对于赫兹这一用于描述频率的导出单位,1000倍时可以称为千赫兹(kHz),1000000(百万)倍时,称为兆赫兹(MHz),再往上以1000倍跳就是吉赫兹(GHz)、太赫兹(THz)……(注意,标准中代表“千”的字母k必须为小写)

而这些放在单位名之前的字母,其实都是一些代表数量的单词的首字母,比如k是kilo,M是mega,G是giga……这些词代表的数有一个特征——它们都是以10为底数的幂。

然而到了计算机工业中,在底层的硬件电路中,通用的是二进制,基于十进制的国际单位制对它没用,反而会带来麻烦。为了方便描述以2为底的大数字幂,工程师们联合了起来,由国际电工委员会(IEC)制定了新的用于1024进位的数字前缀,其实就是将原本对应单词中的最后两位改成了”bi”,以代表二进制(binary),而对应的缩写,也从原本的单字母变成了附上”i”,比如kB变成KiB,MB变成MiB,全称为kibibytes,mebibytes。

但因为这套标准在1998年才提出,虽然马上写入了ISO标准中,但当时Windows都已经出Windows 98了,所以并没能很好的统一整个计算机业界,很多系统和厂商仍然保持了1 KB=1024 Bytes的表示方式,并没有附上”i”。内存方面的JEDEC标准也仍然我行我素,采用了与Windows一样的表示方法,所以我们今天在内存上看到的GB、MB等单位都是1024进位的。而硬盘存储业界,仍然使用1 KB=1000 Bytes的国际单位制标准对容量进行描述。

不过在Linux下,有一些程序提供了两种表示方式,但也不是都按照标准来写单位,比如:

再来看到B的大小写区别这个老生常谈的话题上,大写B指的是byte即字节,小写b指的是bit即比特,1 byte = 8 bits。常见使用bit而不是byte来描述的量就是比特率了,比如1000 kb/s,或者写成1000 kbps的形式,都是一样的。而在描述通信带宽的时候也往往会使用bit,比如现在的千兆局域网、百兆光宽带就是1000Mbps、100Mbps而不是1000MB/s、100MB/s,而我们实际看到的文件传输速度使用的是byte来描述,两者有一个八倍的换算关系。

而同样在这里,国际单位制占据了统治的地位,这些使用bit作为单位的量,大部分采用的都是1000进位而不是1024进位,所以在换算的时候还要考虑到这个因素,于是,我们在Windows下能够看到的百兆宽带最大的理论速度就变成了:

100 Mb/s = 100 × 1000 × 1000 = 100,000,000 b/s

100,000,000 b/s = 12,500,000 B/s = 12,207.03125 KiB/s = 11.92 MiB/s

同理,因为Windows并不遵守规范,所以这个最终显示给你的数字是11.92MB/s,但切记,这不是正确的表示方法。

看懂网速表示中 Mbps、Mb/s、MB/s 区别

运营商或者设备商都喜欢将网速标注为Mbps而不是MB/S,不知道各位有没有注意过,设备厂商——华为、中兴、诺基亚之流,运营商——中国移动、联通、电信,亦或是终端制造商——小米、OPPO等,在进行网速宣传时,其速率单位都用的Mbps。例如前不久中国联通宣布,其5G网络测试速率基本上已经全部能达到900+Mbps的速率,有些甚至能够达到1.1Gbps。但是我们平时在讨论网速好坏时,都说的是“MB/s”,也就是每秒几多兆。

换算关系:

  • B = Byte
  • b = bit
  • 1 Kb = 1024 bit
  • 1 KB = 1024 Byte
  • 1 Mb = 1024 Kb
  • 1 MB = 1024 KB
  • 1 Byte = 8 bit
  • 1 MB = 8Mb
  • 1 Mb = 0.125 MB

其中,bit(比特,1比特代表1个位)是信息的最小单位,是二进制数的一位包含的信息或2个选项中特别指定1个的需要信息量。一般来说,n比特的信息量可以表现出2的n次方种选择。

而Byte(字节)是计算机信息技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串,是构成信息的一个小单位。最常用的字节是八位的字节,即它包含八位的二进制数。一个位就代表一个0或1(即二进制),每8个位组成一个字节(Byte,简写为B)。

那么答案就出来了,1 Byte = 8 bit,每秒传输多少bit、每秒传输多少Byte,我们可以用Byte/s、bit/s来表示,换算一下就可以得出8Mbps=8Mb/s=1MB/s。

通常,运营商说的1M宽带的M是指Mb/s,也就是Mbps,换算一下的话,1M宽带下载速度也就是125KB/s,再去掉损耗的话就是120KB/s左右。以此类推,10M宽带的最快下载速度是1.25MB/s,100M的宽带最快下载速度是12.5MB/s。

为什么网速用Mbps而不是MB/s呢,呵呵,实际还是营销噱头,数字越大越对消费者有吸引力罢了。
我们知道,计算机是以Bit和Byte作为计算单位,其中bit(比特)是电脑辨识讯息的最小单位,再上一个更大的单位为Byte(字节)。
一般来说,数据传输速度大多是以“位”(bit,又名“比特”)为单位的,这也就是为什么网速的单位都是Mbps而不是MB/s了,而数据存储是则以“字节”(Byte)为单位,比如硬盘的读写速度一般就用的是MB/S。

例如著名的SSD测试软件的结果显示:
AS SSD  Benchmark

无论是以Byte还是bit作为网速单位其实都是正确的,但是我们在在书写单位时一定要注意B字母的大小写,此时B字母的大小写真的可以称之为“失之毫厘,谬以千里”。其实运营商等在宣传的时候,Mbps作为网络速率单位是最正确的,因为数据的传输以及运营商在流量收费的时候都是按照比特来计算的;但从消费者的角度来看,MB/s符合我们大众的生活习惯,而且也便于理解。

总结

虽然有标准约定,但很多厂商并不遵守,加上这么多年的混用,实际中还是要根据具体环境和上下文来确定。一般的辨识原则是:

K单独出现时,代表1000 或 1024,一般会附有备注说明
K与Ki一起出现时,K代表1000,Ki代表1024
K与k一起出现时,K代表1024,k代表1000

另外,还有注意是在网速还是存储领域,b/B(bit和Byte)是大写还是小写。小写b表示bit位,大写B表示Byte,1 Byte = 8 bit

参考文章

有问有答:KiB、KB和Kb傻傻分不清?
一文看懂 Mbps、Mb/s、MB/s 有什么区别
维基百科 Kibibyte

如何让BeyondCompare3支持新版本的rar压缩文档

问题

Beyond Compare 是个非常好用的代码/文件比较工具,3.x版本是个用的比较多的版本,而且支持zip/rar文档(不用解压直接作为目录)的比较。
winrar是个windows下面非常流行的压缩工具,最新的版本是已经到了6.x了。rar文档格式从5版本开始做了一次修改,而且从5版本开始,
默认格式就是v5版本,跟原来的格式不兼容,如果用低于winrar 5.x版本的winrar去打开新版本文件,会报无法识别或文件损坏。
这个时候用Beyond Compare去比较winrar v5版本生成的压缩文档的话,会报文件找不到,打开错误。不知情的人还以为是rar文
件本身坏了。

解决办法

winrar是个商业软件,压缩算法是不公开的,但解压算法是公开的,而且免费提供unrar dll给第三方软件集成用。Beyond Compare 3也是集成了unrar dll。
因此,我们可以用新版本的unrar dll替换老版本(v3.9)的即可。


链接:https://pan.baidu.com/s/1y2zfKiCY9E62NdI_1HuFHA
提取码:l2sf
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V5的分享


unrar新版本dll从上面网盘共享中获取,替换下面文件中的对应文件即可(建议将原来的文件重命名备份下):

C:\Program Files (x86)\Beyond Compare 3\UnRAR.dll

注意,如果你安装的是x64版本,一般安装目录如下,请使用网盘文件中x64目录下对应的dll:
C:\Program Files\Beyond Compare 3\UnRAR.dll

enjoy coding, enjoy life!

华为手机怎么解锁和ROOT

为何要root

一般想把手机root的不外乎下面3种用户:
1、搞机爱好者,喜欢折腾;
2、app开发者,有了root权限更方便开发和调试app;实际没有root,一般的开发和调试也没问题,只是有时候想查看下app里面的数据或者获取日志不太方便而已;
3、逆向或安全工作者,这个就不用说了。

查看机型是否能root

首先,想root必须先获取手机的BL解锁码。但不是任何一步华为手机都能获取到解锁码(华为内部手机开发部门开发用的手机一般都是root过的,这个外部拿不到)。
因为华为公司已于2018年5月24日后对新上市产品停止解锁码服务,一般来说,如果你的手机是2018年5月24日前上市的,可以到T宝上找商家远程获取到解锁码。
具体可把手机机型提供给对方,询问是否可以。像 荣耀 3c / 3x / 4x / 5c / 6 / 7 / 8 / 9 / 10 / 荣耀V10,mate 7 / 8 / 9 / mate 10 / mate 10 pro,p 10 / p20 等等,
这些机型都是可以的。具体支持机型可以这里查询:http://www.7to.cn/model.html

获取bootloader解锁码

这个就不多说了,现在只能花钱到T宝上找商家远程获取到解锁码,一般30~50不等。

刷入TWRP获取root权限

如果T宝上能提供解锁+root一条龙服务最好,现在一般只提供解锁服务。解锁后就可以刷入开了root权限的包了。
网上各种刷root教程和包,但基本没有可用的,或者跟自己手机版本对不上。
踩了很多坑,发现奇兔一键刷机 http://www.7to.cn/,很不错,建议花钱买方便,10~15块钱,一键搞定。

解除root恢复到正常ROM

使用华为手机的eRecovery来恢复系统至官方版本。eRecovery适用场景:手机不能开机或系统不稳定可以使用eRecovery修复系统。

前提条件:

1、有可连接的WLAN热点(建议连接家庭WLAN网络,尽量不要使用公共场所WLAN网络,确保网络下载速度顺畅)。
2、手机电池电量大于30%

操作步骤:

  1. 将手机关机后,且USB在连接电脑的状态下,长按【音量上键】+【电源键】15秒左右,手机会自动重启进入华为系统恢复(eRecovery)模式。
  2. 在eRecovery主界面点击”下载最新版本并恢复”。
  3. 在下载界面点击”下载并恢复”,系统将启动WLAN系统,并扫描可用热点。
  4. 选择可用WLAN热点并输入密码,则开始连接热点。
  5. 系统将自动获取安装包信息并自动下载,无需其他操作。这个过程需要一定时间,请耐心等待。
  6. 下载完成后系统自动进行升级安装,升级成功后倒计时自动重启进入主系统

说明:

出厂版本为EMUI 4.0及以上机型支持eRecovery。

华为手机禁用系统更新的办法

目的说明

有时候不想更新到新版本,但系统老是提示自动更新,小红点冒出来看见心烦。
尤其是一些较早的手机,比如荣耀10,因为cpu是麒麟970,运行emui 9.0/9.1很流畅,
但是升级到emui 10.0,那叫一个惨,所以这个时候就可以把系统更新禁用掉,^_^

准备

打开开发者模式

设置–>系统–>关于手机,连续点击7次“版本号”栏,屏幕将出现提示“您正处于开发者模式”,返回上一步“系统”界面,打开“开发人员选项”,关闭“自动系统更新”,打开“USB调试”以及打开“仅充电”模式下允许ADB调试。

下载adb工具包

1、下载ADB和驱动,网盘地址链接:https://pan.baidu.com/s/11QBdu-woPni_ZuE6P7BOAw 提取码:fe2v
2、安装驱动,下载包中Handset+WinDriver.exe,进行安装。安装完,把华为手机连上电脑,会自动安装驱动,手机会提示是否usb接口模式和允许使用USB调试模式【一定要等几分钟才能出提示,所以要有耐心】
3、解压下载包中的adb到C盘
4、运行CMD,输入cd c:\adb,确保当前目录是C盘adb文件夹

禁用系统更新

注意手机要连接电脑,并在开发人员选项中开启USB调试和“仅充电”模式下允许adb调试,运行下面命令查看设备是否连接正常:
adb devices

List of devices attached
xxxxxxxxxxxxxxxxxxxx device

如果出现 unauthrorized 字样,则到开发人员选项中查看”USB调试”开关是否打开了。

运行下面命令,停止系统更新:

adb shell pm disable-user com.huawei.android.hwouc

Package com.huawei.android.hwouc new state: disabled-user 出现这个结果提示,表面操作成功了。

如果前面检查过系统更新,出现了小红点提示,想去掉这个提示,操作如下:

手机上断开WIFI和移动网络,设置-应用管理-系统更新-存储-删除数据,然后再依次打开设置——系统更新,点击“检查更新”,目的是消除已有的新系统提醒红点角标。

恢复系统更新

准备同上,运行下面命令恢复系统更新功能:

adb shell pm enable com.huawei.android.hwouc

Hexo系列-5-重装系统如何备份和恢复

1、备份博客目录和配置

如果操作系统需要重新安装,则需要在安装前将你的博客工作目录如blog进行备份(通过复制或者压缩)。
当然,如果你的blog目录不在系统盘上,就可以省略这一步。

2、恢复博客目录和配置

按照【Hexo 系列-2: 安装和配置】介绍的,先安装node js环境和hexo框架。
再将备份的blog解压恢复至原来或者新的位置即可。

完毕,就可以像原来那样,创建新的文章进行本地预览、上传github服务器等操作了。