雀子留下小坑会修复吗一些坑,能自动修复吗,如果不能有

在上一章中,我们使用javassist成功为项目注入了System.out.println(AntilazyLoad.class);这行代码,解决了class_ispreverified问题,可以正常使用了,但肯定还存在着很多未知的问题。
首先是javassist的问题
class中使用到的类,必须添加到classpool的classpath中,我在Demo中写了一个自定义控件,注入代码的时候报错,提示没有找到Context,然后我将android.jar整个添加到classpath之后成功
如果该类是一个接口,会提示没有构造函数的异常。所以需要判断构造函数是否为null
如果该类的构造函数是私有的,也会报错。所以要使用getDeclaredConstructors这种方式获取,和反射有点像。
自定义控件使用问题
自定义控件在使用的时候,预览界面会出现异常,找不到AntilazyLoad.class类,这时候只能clean或者rebuild项目
代码写死问题
说实话,我对于代码封装不太在行,没有封装经验,对设计模式也只会用用单例。所以有一些东西是写死了的。
我将写死的东西先放到一个类里面去了,如下
这几个问题目前来说还不是很重要,而且我也没有比较好的解决方案,只能写完这个系列的博客后再慢慢重构,如果大家有兴趣的话希望能帮忙改进。
二、Transform的坑
在前几篇博文中,我们都是建立在不混淆的基础上完成热补丁框架的。
那么,如果开启混淆后会出现什么问题呢?
可能有网友会说,这还不简单嘛,补丁无效呗,因为混淆之后类名已经变了,而我们的补丁还是原来的类名,包括里面的成员变量。
这是一个问题,也是本篇博文重点内容。
然而这之前还有个奇葩问题得先解决,如果现在开启混淆,紧接着打包,那么会报错。
因为我们是通过注册Transform注入代码的,而这个Transfrom在proguardTransform之前就已经执行。而混淆的时候发现找不到AntilazyLoad,然后就会报classNotFound错误。
所以,如果我们开启混淆的话,在Transfrom中注入代码是不可行的。因为我们无法改变Transfrom的执行顺序,我们注册的PreDexTransfrom肯定在ProguardTransform之前执行,而ProguardTransform混淆又会因为找不到类而报错。
以上说的就是Transform的坑了!
早知道我就不搞什么Transfrom了,直接使用task hook一下也不会麻烦到哪里去。
不过研究了半天还是有了个解决方案,就是在ProguardTransform执行之前将注入的代码移除,然后再ProguardTransfrom执行之后再次注入代码。
2.1 开启混淆后Task的inputs和outputs
没有开启混淆的时候,我们注册的preDexTransform就在DexTransform之前执行,PreDexTransform的outputs就是DexTransfrom的inputs
而开启混淆后,其实没有多大变化,直接PreDexTransfrom与DexTransform之间间多了一个ProguardTask,他们的inputs和outputs我就不多说了,记住相邻的两个Task,前一个的outputs必然是下一个Task的inputs。
2.2 取消注入
那么我们怎么移除掉System.out.println(AntilazyLoad.class);这行代码呢?
再次使用javassist显然太费劲了,我们可以在PreDexTransfrom注入代码之前,将文件先备份到某个文件夹。如果发现使用了Proguard,那么将备份的文件还原就行了。
备份到哪里呢,app的build目录就可以了,因为执行clean的时候会清除这个目录。
下面是Transform修改后的代码
void transform(Context context, Collection&TransformInput& inputs,
Collection&TransformInput& referencedInputs,
TransformOutputProvider outputProvider, boolean isIncremental)
throws IOException, TransformException, InterruptedException {
File backupDir = new File(project.buildDir,"backup")
if(backupDir.exists()) {
FileUtils.cleanDirectory(backupDir)
inputs.each {TransformInput input -&
input.directoryInputs.each {DirectoryInput directoryInput-&
def dest = outputProvider.getContentLocation(directoryInput.name,
directoryInput.contentTypes, directoryInput.scopes, Format.DIRECTORY)
def dirBackup = dest.absolutePath.replace('intermediates','backup')
File dirBackupFile = new File(dirBackup)
if(!dirBackupFile.exists()) {
dirBackupFile.mkdirs()
FileUtils.copyDirectory(directoryInput.file, dirBackupFile)
Inject.injectDir(directoryInput.file.absolutePath)
FileUtils.copyDirectory(directoryInput.file, dest)
input.jarInputs.each {JarInput jarInput-&
def jarName = jarInput.name
def md5Name = DigestUtils.md5Hex(jarInput.file.getAbsolutePath())
if(jarName.endsWith(".jar")) {
jarName = jarName.substring(0,jarName.length()-4)
def dest = outputProvider.getContentLocation(jarName+md5Name, jarInput.contentTypes, jarInput.scopes, Format.JAR)
def jarBackup = dest.absolutePath.replace('intermediates','backup').replace(jarName,jarName+md5Name)
File jarBackupFile = new File(jarBackup)
FileUtils.copyFile(jarInput.file,jarBackupFile)
String jarPath = jarInput.file.absoluteP
String projectName = project.rootProject.
if(jarPath.endsWith("classes.jar") && jarPath.contains("exploded-aar\\"+projectName)) {
Configure.noInjectModules.each {
if(jarPath.contains("exploded-aar\\$projectName\\$it")) {
flag = false
if(flag) {
Inject.injectJar(jarPath)
FileUtils.copyFile(jarInput.file, dest)
然后我们需要在proguardTransform执行之前将备份还原
* Created by AItsuki on .
public class Register implements Plugin&Project& {
public void apply(Project project) {
def android = project.extensions.findByType(AppExtension)
PreDexTransform preDexTransform = new PreDexTransform(project)
android.registerTransform(preDexTransform)
* 我们是在混淆之前就完成注入代码的,这会出现问题,找不到AntilazyLoad这个类
* 我的解决方式:
* 在PreDexTransform注入代码之前,先将原来没有注入的代码保存了一份到 buildDir/backup
* 如果开启了混淆,则在混淆之前将代码覆盖回来
project.afterEvaluate {
project.android.applicationVariants.each {variant-&
def proguardTask = project.getTasks().findByName("transformClassesAndResourcesWithProguardFor${variant.name.capitalize()}")
if(proguardTask) {
proguardTask.doFirst {
File backupDir = new File(project.buildDir,"backup\\transforms\\$preDexTransform.name\\$variant.name")
if(backupDir.exists()) {
def srcDirPath = backupDir.getAbsolutePath().replace('backup','intermediates')
File srcDir = new File(srcDirPath)
FileUtils.cleanDirectory(srcDir)
FileUtils.copyDirectory(backupDir,srcDir)
proguardTask.doLast {
再次开启混淆,运行Generate Signed Apk已经可以成功签名打包了,但是很明显,我们的代码也没有注入,因为已经还原备份了。
看看我们的备份
然后看看preDex, proguard,dex三个task的inputs和outpus。
看到输出我们也知道了,需要混淆的代码就保存在
\app\build\intermediates\transforms\proguard\release
当然,如果你用debug的话最后这里就是proguard\debug
比如这么设置,然后BuildApk
三、混淆后的代码注入
在上面的dolast中就可以有个todo注释,在那里注入代码就可以了,注入的方式和上一篇博客一样。
但是特别有一点提醒一下,混淆后的输出目录只有一个main.jar包(目前试了几个项目都是……不知道有没有特殊情况),直接解压这个jar包注入就可以了
但是,混淆后怎么打包补丁呢,难道解压main.jar,从里面复制么。类名已经变了,找起来太费劲了啊。继续往下看,教你实现自动化打包补丁!
四、自动化打包补丁
Transfrom的问题已经解决了,回归到最开始的问题。
混淆之后,类名,方法名,变量名都可能已经改变,那么我们如何注入dex修复bug呢?
按照之前的制作补丁方法(在我的热补丁系列第二篇博文中有)肯定是不行了,我们制作的补丁必须是已经混淆过的类,而不能直接从debug中直接获取。
所以,我们需要为这个框架加入自动化生成补丁的功能!
那么怎么生成自动化补丁呢?
首先我们来想一下我们热补丁的需求;
发布正式版本(release)的时候,我们会将项目copy一份作为备份(target)
如果线上的release版本出现了问题,我们就会到target项目中去修复bug
修复完毕后,我们直接在target中运行打包,就会自动生成补丁保存到指定的目录。
那么如何实现上面的需求呢
在release版本发布的时候,我们可以生成所有.class文件的md5
然后将该.class对应的完整类名和md5作为键值对保存到某个文件
当我们在target中修复了bug,打包项目的时候,再次生成所有.class文件的md5
将target的md5和release的md5作对比,如果md5不一致,那么代表这个类的代码已经变更,将这个class拷贝出来。这些拷贝出阿里的class就是应该打补丁的类了
4.2 实现自动化打包补丁
首先,我们需要生成所有类的md5,保存到app module的根目录下
怎么遍历所有的类, 在这之前我们已经做过备份了,可以直接遍历备份文件夹生成md5.
在Transfrom方面最后面加上这段代码
File releaseDir = new File(backupDir,"transforms\\${getName()}\\release")
if(releaseDir.exists()) {
File patchDir = new File("$project.projectDir.absolutePath\\patch")
if(!patchDir.exists()) {
patchDir.mkdirs()
File md5File = new File(patchDir, "classesMD5.txt")
if(md5File.exists()) {
md5File.delete()
def pw = md5File.newPrintWriter()
releaseDir.eachFileRecurse {File file-&
String filePath = file.getAbsolutePath()
if(filePath.endsWith('.class') && Inject.needInject(filePath)) {
int beginIndex = filePath.lastIndexOf('release')+8
String className = filePath.substring(beginIndex, filePath.length()-6).replace('\\','.').replace('/','.')
InputStream inputStream = new FileInputStream(file)
String md5 = DigestUtils.md5Hex(inputStream)
inputStream.close()
pw.println("$className-$md5")
if(filePath.endsWith('.jar')) {
File destDir = new File(file.parent,file.getName().replace('.jar',''))
JarZipUtil.unzipJar(filePath,destDir.absolutePath)
destDir.eachFileRecurse {File f-&
String fPath =
f.absolutePath
if(fPath.endsWith('.class') && Inject.needInject(fPath)) {
int beginIndex = fPath.indexOf(destDir.name)+ destDir.name.length()+1
String className = fPath.substring(beginIndex, fPath.length()-6).replace('\\','.').replace('/','.')
InputStream inputStream= new FileInputStream(f)
String md5 = DigestUtils.md5Hex(inputStream)
inputStream.close()
pw.println("$className-$md5")
FileUtils.deleteDirectory(destDir)
pw.close()
我们现在签名打包一下release版本
可以看到在app module下生成了classesMd5文件,如图(过滤了support包的class,但是没有过滤掉hotpatch module的,目前项目比较乱,等写完这章之后就重构一下)
MD5是成功生成了,但是我们怎么校验呢,什么时候校验呢?
我们都知道打包可以选择Debug版本或者Release版本,但是不知道我们也可以自己添加一个版本,其实更标准的说法是变体,variant。
在build.gradle的BuildTypes中这样写,就成功添加了一个dopatch的变体了。
签名打包的时候可以选择打包哪一个,使用过多渠道打包的应该有点了解
我们现在就来约定一下规则,只要打包这个dopatch,就证明我们已经修复好bug,会自动生成补丁包
在transfrom中,我们继续加入以下代码
File dopatchDir = new File(backupDir,"transforms\\${getName()}\\dopatch")
File md5File = new File("$project.projectDir\\patch\\classesMD5.txt")
if(dopatchDir.exists() && md5File.exists()) {
File patchCacheDir = new File(Configure.patchCacheDir)
if(patchCacheDir.exists()) {
FileUtils.cleanDirectory(patchCacheDir)
patchCacheDir.mkdirs()
def reader = md5File.newReader()
List&String& list = reader.readLines()
reader.close()
dopatchDir.eachFileRecurse {File file-&
String filePath = file.getAbsolutePath()
if(filePath.endsWith('.class') && Inject.needInject(filePath)) {
int beginIndex = filePath.lastIndexOf('dopatch')+8
String className = filePath.substring(beginIndex, filePath.length()-6).replace('\\','.').replace('/','.')
InputStream inputStream = new FileInputStream(file)
String md5 = DigestUtils.md5Hex(inputStream)
inputStream.close()
String str = className +"-"+md5
if(!list.contains(str)) {
String classFilePath = className.replace('.','\\').concat('.class')
File classFile = new File(patchCacheDir,classFilePath)
FileUtils.copyFile(file,classFile)
if(filePath.endsWith('.jar')) {
File destDir = new File(file.parent,file.getName().replace('.jar',''))
JarZipUtil.unzipJar(filePath,destDir.absolutePath)
destDir.eachFileRecurse {File f-&
String fPath =
f.absolutePath
if(fPath.endsWith('.class') && Inject.needInject(fPath)) {
int beginIndex = fPath.indexOf(destDir.name)+ destDir.name.length()+1
String className = fPath.substring(beginIndex, fPath.length()-6).replace('\\','.').replace('/','.')
InputStream inputStream= new FileInputStream(f)
String md5 = DigestUtils.md5Hex(inputStream)
inputStream.close()
String str = className+"-"+md5
if(!list.contains(str)) {
String classFilePath = className.replace('.','\\').concat('.class')
File classFile = new File(patchCacheDir,classFilePath)
FileUtils.copyFile(file,classFile)
FileUtils.deleteDirectory(destDir)
现在我们去修改一下cat类,将cat的汪汪汪改成喵喵喵!
然后运行签名打包,记得打包的时候使用dopatch这个BuildType
锵锵锵锵!!!已经自动将改变过的类复制出来了
然后我们进入命令行
这样就成功生成补丁了!
是不是比之前手动打包补丁方便多了呢?
但是,自动生成补丁包最重要的一点不是为了方便,而是为了生成混淆后的补丁包,因为混淆后的补丁我们是很难手动制作的。
4.3 实现混淆后的自动化打包补丁
那么混淆后,我们怎么自动打包补丁呢,其实也不难。
因为在混淆签名打包后,会在outputs目录中生成一个mapping文件,里面记录了混淆的规则。如图
我们可以将这个mapping文件保存起来,下次执行dopatch自动化打包的时候,解析这个mapping就知道我们需要打包哪些类了。
具体思路是这样子的:
dopatch引用一个新的混淆文件,里面使用release的mapping(-apply mapping)
然后build.gradle中可以这样使用
在transform中,我们已经将需要打包成补丁的class文件事先复制到了patchCacheDir目录中
遍历patchCacheDir目录,获取到所有类的完整类名。
解析mapping文件,获取到该类名对应的混淆类名
这个获取到的混淆类名就是我们需要打包成补丁的类了!
然后代码实现
在Register这个类中,hook proguardTransfrom这个task,在dolast中这么做,博文开头也提到过
proguardTask.doLast {
if(proguardTask.name.endsWith('ForRelease')) {
project.logger.error "0=============="
File proguardDir = new File("$project.buildDir\\intermediates\\transforms\\proguard\\release")
proguardDir.eachFileRecurse { File file -&
if(file.name.endsWith('jar')) {
project.logger.error "0=00000============="
Inject.injectJar(file.absolutePath)
project.logger.error "0=11111============="
project.logger.error "1=============="
File mapping = new File("$project.buildDir\\outputs\\mapping\\release\\mapping.txt")
File mappingCopy = new File("$project.projectDir\\patch\\mapping.txt")
project.logger.error "2=============="
FileUtils.copyFile(mapping, mappingCopy)
if(proguardTask.name.endsWith('ForDopatch')) {
File mapping = new File("$project.projectDir\\patch\\mapping.txt")
def reader = mapping.newReader()
Map&String, String& map = new HashMap&&()
reader.eachLine {String line-&
if(line.endsWith(':')) {
String[] strings = line.replace(':','').split(' -& ')
if(strings.length == 2) {
map.put(strings[0],strings[1])
reader.close()
println "map= $map"
List&String& patchList = new ArrayList&&()
File patchCacheDir = new File(Configure.patchCacheDir)
patchCacheDir.eachFileRecurse { File file-&
String filePath = file.absolutePath
if(filePath.endsWith('.class')) {
int beginIndex = filePath.lastIndexOf(patchCacheDir.name)+patchCacheDir.name.length()+1
String className = filePath.substring(beginIndex, filePath.length()-6).replace('\\','.').replace('/','.')
project.logger.error "className==============$className"
String proguardName = map.get(className)
patchList.add(proguardName)
println "list= $patchList"
FileUtils.cleanDirectory(patchCacheDir)
File proguardDir = new File("$project.buildDir\\intermediates\\transforms\\proguard")
proguardDir.eachFileRecurse {File file-&
if(file.name.endsWith('.jar')) {
File destDir = new File(file.parent,file.getName().replace('.jar',''))
JarZipUtil.unzipJar(file.absolutePath,destDir.absolutePath)
destDir.eachFileRecurse {File f-&
String fPath = f.absolutePath
if(fPath.endsWith('.class')) {
int beginIndex = fPath.lastIndexOf(destDir.name) + destDir.name.length() + 1
String className = fPath.substring(beginIndex, fPath.length() - 6).replace('\\', '.').replace('/', '.')
project.logger.error "class=======================$className"
if(patchList.contains(className)) {
String destPath = className.replace(".","\\").concat('.class')
File destFile = new File(patchCacheDir,destPath)
FileUtils.copyFile(f, destFile)
FileUtils.deleteDirectory(destDir)
代码的复用性有点差=。=,但是先别在意这个,现在我们来测试一下:
首先将Cat.class改回汪汪汪,然后release打开proguard,签名打包(记得选release的buildtypes)。发现patch文件夹中已经生成mapping.txt了
然后随意修改一下Cat.class,Circle.class(这次弄两个类测试好了……)
然后dopatch也打开proguard,签名打包(记得选dopatch的buildtypes)
PS:记得每次打包前都Clean一下项目哦,否则可能会出现一些问题。比如代码重复注入,反编译可能看到有多行’System.out.println(AntilazyLoad.class)’
锵锵锵锵!自动打包补丁成功!(=。=,自己手动命令行打包吧,用java代码总是说找不到dx工具,有空再找找原因)
五、写在后面
热补丁框架算是完成了,剩下一个补丁包的签名校验问题,目前也不太想研究,想重构一下项目再说。
这是重构之前的项目下载地址,乱起八糟的,有兴趣的可以下载玩玩。
下一章博客,我准备重构项目,可能会舍弃掉Transfrom这个api,如果不混淆的话还是很好用的,混淆的话我觉得有点反人类了!
这热补丁研究了好长时间了,算是告一段落了,感谢大家支持。
Android 热补丁动态修复框架小结
Android热补丁动态修复实践
Android热修复AndFix混淆后热修复失败,无效
bugly热更新上传补丁失败原因及解决办法
没有更多推荐了,→ 激光去斑留下的疤痕会自动修复吗?
激光去斑留下的疤痕会自动修复吗?
健康咨询描述:
用激光去除斑留下的黑色疤痕小坑不用什么药物它会自己自动修复吗?
其他类似问题
医生回复区
锦州中心医院&& 主任医师
擅长: 颅脑损伤,脑出血,脑胶质瘤,脑垂体瘤,脑膜瘤,三叉
微信扫一扫,随时问医生
&&&&&&病情分析:&&&&&&你好啊,出现这种情况多长时间了?还有其他不适症状吗?&&&&&&指导意见:&&&&&&会好起来的,建议你平时注意用保湿护肤品就可以的。
聊城市第二人民医院&& 主治医师
擅长: 疝气,子宫肌瘤,脑瘤各种疾病手术麻醉
微信扫一扫,随时问医生
&&&&&&一般来说,一个月左右会,自动修复,如果不放心也可使用可俞硅胶人类修复蛋白辅料。或者其他的修复蛋白,加速创面修复,祛除斑痕。
擅长: 子宫肌瘤,卵巢囊肿,阴道炎,宫颈炎,宫颈糜烂,盆腔
微信扫一扫,随时问医生
&&&&&&病情分析:&&&&&&你好向你描述的这种情况如果不管的话考虑是不会修复的&&&&&&指导意见:&&&&&&如果疤痕已经形成那就只能疤痕整形才能去除的&&&&&&以上是对“激光去斑留下的疤痕会自动修复吗?”这个问题的建议,希望对您有帮助,祝您健康!
擅长: 男性常见疾病,前列腺炎,阳痿,早泄,性功能障碍等,
微信扫一扫,随时问医生
&&&&&&病情分析:&&&&&&您好,很高兴为您解答,根据您的描述,激光损伤的是皮肤表皮。&&&&&&指导意见:&&&&&&您好,激光祛斑留下的印记,可以自己慢慢修复,愈合后的皮肤基本不会留下什么疤痕。望对您有所帮助。
&&&&&&病情分析:&&&&&&您好,很高兴为您解答,根据您的描述,激光损伤的是皮肤表皮&&&&&&指导意见:&&&&&&您好,激光祛斑留下的印记,可以自己慢慢修复,愈合后的皮肤基本不会留下什么疤痕。望对您有所帮助。
擅长: 前列腺炎,阳痿,早泄,性病,包皮龟头炎,尿路感染,
微信扫一扫,随时问医生
&&&&&&病情分析:&&&&&&多长时间了呢,如果过了恢复期,可以用点淡化斑痕的产品的!&&&&&&指导意见:&&&&&&可以用点芦荟胶和疤痕灵的,这样有淡疤痕的作用,药店都有售的!
聊城市中心医院&& 护师
擅长: 新生儿黄疸,小儿肺炎,小儿腹泻等一些常见病的护理和
微信扫一扫,随时问医生
&&&&&&病情分析:&&&&&&你好,根据你说情况,自己修复需要很长的过程,可能完全修复不了。&&&&&&指导意见:&&&&&&建议,平时日常生活中要注意防晒,不化妆,不要吃刺激性的食物。
( 专业名称:瘢痕治疗
别称:去疤、疤痕治疗、疤痕
平均费用:8163元
瘢痕是物理、生物、化学因素等多种原因引起的组织严重损伤愈合后的病理性变化,它对人的外表有很大的不良影响。瘢痕可以通过医疗美容的手段来改善,临...
手术项目:
祛疤亲身体验
疾病百科| 疤痕
挂号科室:皮肤科
温馨提示:多食新鲜的水果和蔬菜,以保证维生素的摄入量
疤痕是一个很笼统的概念,它是各种创伤后所引起的正常皮肤组织的外观形态和组织病理学的改变的统称。它是人体创伤后,在伤口或创面自然愈合过程中的一种正常的、必然的生理反应,也是创伤愈合过程的必然结果。疤痕的...
好发人群:无特殊发病群体
常见症状:凹陷性疤痕、凸起性疤痕、平复性疤痕是、瘢
是否医保:--
治疗方法:手术治疗
参考价格:58
参考价格:58
参考价格:16.5
您可能关注的问题
用药指导/吃什么药好
本品适用于接触性湿疹﹑异位性皮炎﹑神经性皮炎﹑面...
参考价格:¥2.5
1.消除疤痕——消除各类皮肤疤痕及其表面症状:凹...
参考价格:¥118
您好,虽然我们的工作人员都在竭尽所能的改善网站,让大家能够非常方便的使用网站,但是其中难免有所疏漏,对您造成非常不必要的麻烦。在此,有问必答网向您表示深深的歉意,如果您遇到的麻烦还没有解决,您可以通过以下方式联系我们,我们会优先特殊解决您的问题。
请选择投诉理由
涉嫌广告宣传
无意义提问
非医学类咨询
违背伦理道德
其他投诉理由
涉嫌广告宣传
无意义回复
违背伦理道德
复制粘贴内容
常识性错误
其他投诉理由
如遇紧急情况,请致电400-脸上起水痘来着,留下一些坑,能自动修复吗,如果不能有什么...
脸上起水痘来着,留下一些坑,能自动修复吗...
脸上起水痘来着,留下一些坑,能自动修复吗,如果不能有什么好的方法吗?我才十七,本来还算是帅哥一枚
皮肤过敏反复发作怎么办?皮肤病医生在线告诉你,皮肤过敏实际是因为人体免疫力下降,还有。。。其他因素
医院出诊医生
擅长:青春痘、荨麻疹湿疹、皮炎疱疹
擅长:小儿内科
共2条医生回复
因不能面诊,医生的建议及药品推荐仅供参考
微信扫码交流育儿经验
微信扫一扫立刻咨询
职称:医生会员
专长:脑血管疾病
&&已帮助用户:67515
问题分析:痘印主要是经常挤压痘痘(痤疮)遗留下的暂时性的色素,一般会随着时间的推移会慢慢变淡或者消退意见建议:可以口服维生素C , 维生素E以加速痘印尽快消退,平时不能刺激局部,比如 经常搔抓 否则可能会加重痘印;在痘印完全消退前,少晒太阳,患处尽量不用化妆品
生养宝宝不容易,寻医问药交流群中答疑解惑
如遇商品下架,请咨询对方药师或客服
微信扫码交流育儿经验
微信扫一扫立刻咨询
职称:主治医师
专长:新生儿胎粪吸入综合征,新生儿感染性肺炎,腹泻病
&&已帮助用户:65258
问题分析:水痘一般不会留下疤痕,但是有些孩子有抓挠的情况,可以加重皮疹的深度,就容易留疤了。意见建议:可以使用维生素E涂抹,注意多吃含维生素丰富的食物。
问起完水痘后脸上有坑,还有印,能好吗
职称:医生会员
专长:高血压、糖尿病、心血管疾病
&&已帮助用户:115885
解决肌肤问题可以去做复合彩光手术,复合彩光是一项无创性皮肤医疗技术,它的全面性功效能从基底曾改善肤质,解决皮肤问题,减退幼纹,祛除色斑,收缩毛孔,美白肌肤,一次疗程,即时拥有紧致亮丽的肌肤.
问脸上全是水痘留下的坑
职称:医师
专长:新生儿胎粪吸入综合征,新生儿感染性肺炎,腹泻病
&&已帮助用户:65258
问题分析:去除水痘疤痕,可以选择按摩法,用手掌根部揉按水痘疤痕,每天三次,每次5-10分钟。这个方法对于刚脱痂的伤口效果最佳,对于旧伤疤效果比较弱。意见建议:维生素E涂抹法对于祛除水痘疤痕,也有不错的效果。维生素E可渗透至皮肤内部而发挥其润肤作用。
问起了水痘但是落了坑脸上
职称:医生会员
专长:擅长;小儿脑瘫,消化疾病,腹泻,小儿多动症,自闭症。
&&已帮助用户:19180
意见建议:你好,维生素C涂抹法,晚上睡觉的时候把VE涂在脸上,都可以,祝你早日恢复
问水豆坑印会自己消掉吗
职称:医生会员
专长:痤疮、抑郁症、心理咨询
&&已帮助用户:55016
问题分析:你好,根据你的症状描述情况是因为长水痘结痂以后没有等痂自然脱落而强行用手抠掉发,而后脸上因为强行揭到痂皮而有红色的色素印及凹坑的情况。这是因为皮肤没有完全恢复好的原因。
指导意见:
因为是强行抠掉的痂皮,意见建议:这样留下的红印一般情下是会自然消退的,这些凹坑如果不深的话一般情况下也会慢慢长平。目前注意防晒,可以外用点维生素E等帮助皮损恢复。希望我的回答对你有所帮助。
问怎么去水痘留下的坑
职称:医生会员
专长:中医妇科疾病
&&已帮助用户:7885
问题分析:是没有办法去除的,目前保持清洁卫生就行,另外皮肤主要靠平时保养的,意见建议:平时饮食以清淡营养为主,多吃含胶原蛋白高的食物,保持充分的睡眠,放松心情就行。
问水痘过后有坑怎么办?
职称:医师
专长:心血管内科、消化内科、呼吸内科
&&已帮助用户:272877
你好,这是皮肤损伤后形成的疤痕组织,没有太好的办法消除的。
关注此问题的人还看了
大家都在搜:
关注健康生活!
社会发展节奏快,生存压力大,很多人不能良好调节自我心理,导致.
主要有:发病年龄;食欲极佳,多食,喜甜食;皮下脂肪分布均匀;青
主要有药物治疗和心理治疗两方面,药物治疗可分为针对抽动症状…
百度联盟推广
水痘相关标签
水痘(varicella)是由水痘-带状疱疹病毒引起的原发感染,是以较轻的全身症状和皮肤粘膜上分批出...
免费向百万名医生提问
填写症状 描述信息,如:小孩头不发烧,手脚冰凉,是怎么回事?
无需注册,10分钟内回答
搜狗联盟推广
百度联盟推广
医生在线咨询
评价成功!}

我要回帖

更多关于 点痣留下的坑如何修复 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信