Android应用进程防杀指南

 

Android应用进程防杀指南1-常用套路

  进程、服务守护防杀的实现,对于每一位开发者来说,都是一部与某系统、某卫士、某助手、某管家、某大师斗争的血泪史。 

    我们常用的进程守护的套路无外乎以下几种,大部分内容摘录自Never-say-Never的博客

套路一.提高进程的优先级数值

    对于Service被系统回收,一般做法是通过提高优先级可以解决,在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = “1000”这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低。

套路二.改变进程等级

    Android中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收。Android将进程分为6个等级,它们按优先级顺序由高到低依次是:

1.前台进程( FOREGROUND_APP) 
2.可视进程(VISIBLE_APP ) 
3.次要服务进程(SECONDARY_SERVER ) 
4.后台进程 (HIDDEN_APP) 
5.内容供应节点(CONTENT_PROVIDER) 
6.空进程(EMPTY_APP)

    我们可以用 setForeground(true) 来设置 Service 的优先级。

1.如果service正在调用onCreate,onStartCommand或者onDestory方法,那么用于当前service的进程则变为前台进程以避免被killed。 
2.如果当前service已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,但是比那些不可见的进程更重要,这就意味着service一般不会被killed. 
3.如果客户端已经连接到service 
(bindService),那么拥有Service的进程则拥有最高的优先级,可以认为service是可见的。 
4.如果service可以使用startForeground(int, 
Notification)方法来将service设置为前台状态,那么系统就认为是对用户可见的,并不会在内存不足时killed。 
5.如果有其他的应用组件作为Service,Activity等运行在相同的进程中,那么将会增加该进程的重要性。

套路三.设置 android:persistent属性为true

<application 
    android:name="com.test.Application" 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
   <span style="color:#ff0000;"> android:persistent="true"</span> 
    android:theme="@style/AppTheme" > 
</application> 
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这个属性设置后,的确发现优先级提高不少,或许是相当于系统级的进程,但是还是无法保证存活

套路四.onDestory方法内调用广播,重启Service

当service执行了onDestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service

@Override 
public void onDestroy() { 
     Intent sevice = new Intent(this, MainService.class); 
     this.startService(sevice); 
     super.onDestroy(); 
} 
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

但是当使用类似于360卫士和腾讯管家等第三方应用或是在setting里-应用-强制停止时,APP进程可能就直接被干掉了,onDestroy方法都进不来,所以还是无法保证存活

套路五.监听系统广播判断Service状态

通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活,记得加权限

<receiver android:name="com.dbjtech.acbxt.waiqin.BootReceiver" > 
    <intent-filter> 
        <action android:name="android.intent.action.BOOT_COMPLETED" /> 
        <action android:name="android.intent.action.USER_PRESENT" /> 
        <action android:name="android.intent.action.PACKAGE_RESTARTED" /> 
        <action android:name="com.dbjtech.waiqin.destroy" /> 
    </intent-filter> 
</receiver> 
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在BroadcastReceiver中:

@Override 
public void onReceive(Context context, Intent intent) { 
    if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { 
        System.out.println("手机开机了...."); 
        startUploadService(context); 
    } 
    if (Intent.ACTION_USER_PRESENT.equals(intent.getAction())) { 
            startUploadService(context); 
    } 
} 
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这个方法监听多了会导致Service很混乱,带来诸多麻烦

套路六.将APK安装到/system/app成为系统级应用

使用ROOT过的手机 
1.把代码编写好后,打包导出apk,copy到手机SD卡根目录下。 
2.手机连接eclipse,cmd: adb shell 
3.切换root模式,输入:su (如果root过就不会有错误) 
4.设置System为读写权限:mount –o remount rw /system (System默认为只读,无法写入,这一步很关键) 
5.cd到sd卡跟目录下,确认是否有我们拷贝到sd卡根目录下的apk(一般都是 storage/sdcard0) 
shell@android:/ # cd storage/sdcard0 
6.最后,我们要把apk拷贝到 /System/app中

参考链接:http://blog.csdn.net/mad1989/article/details/22492519


 

Android应用进程防杀指南2-双进程守护

 在上一篇博客中,我们谈到了Android进程防杀的常用套路,各位童鞋可以点击查看我的博客 Android应用进程防杀指南1-常用套路 ,随着越来越多的用户手机安装某卫士,某管家,常用的进程防杀套路并不能够很好的保证我们的APP进程常驻,因此本篇博客我给大家带来抗某卫士,某管家的双进程守护解决方案。双进程守护,其实原理非常简单,网上也有很多博文讲述,今天我给大家用一个完整的案例来讲述。

假设我们的APP中开启了两个Service,分别是A和B,那么: 
如果A守护B,则B挂掉的同时,A就应该把B启动起来,反之亦然,也就是说A和B应该是互相守护,无论谁被杀掉,对方就把它拉起来。

    既然提到了两个Service,那么这两个Service就不能让它们同处在一个进程中,否则就会被一次性双杀。这里我们很容易想到IPC技术,在Android中通常我们可以使用AIDL来实现IPC操作。废话不多说,直接撸码。 
先来看下项目整体结构:

这里写图片描述

    这里,我们定义两个Service,分别是LocalCastielService和RemoteCastielService,其中的RemoteCastielService我们通过属性配置android:process=”:com.castiel.remote” ,让它成为远端进程。 
LocalCastielService.java

/**
 * @ClassName: LocalCastielService 
 * @Description: 本地服务
 * @author 猴子搬来的救兵 http://blog.csdn.net/mynameishuangshuai
 * @version
 */
public class LocalCastielService extends Service {

    MyBinder myBinder;
    private PendingIntent pintent;
    MyServiceConnection myServiceConnection;

    @Override
    public void onCreate() {
        super.onCreate();
        if (myBinder == null) {
            myBinder = new MyBinder();
        }
        myServiceConnection = new MyServiceConnection();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        this.bindService(new Intent(this, RemoteCastielService.class), myServiceConnection, Context.BIND_IMPORTANT);
        Notification notification = new Notification(R.drawable.ic_launcher, "猴子服务启动中", System.currentTimeMillis());
        pintent = PendingIntent.getService(this, 0, intent, 0);
        notification.setLatestEventInfo(this, "猴子服务", "防止被杀掉!", pintent);

        // 设置service为前台进程,避免手机休眠时系统自动杀掉该服务
        startForeground(startId, notification);
        return START_STICKY;
    }

    class MyServiceConnection implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName arg0, IBinder arg1) {
            Log.i("castiel", "远程服务连接成功");
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            // 连接出现了异常断开了,RemoteService被杀掉了
            Toast.makeText(LocalCastielService.this, "远程服务Remote被干掉", Toast.LENGTH_LONG).show();
            // 启动RemoteCastielService
            LocalCastielService.this.startService(new Intent(LocalCastielService.this, RemoteCastielService.class));
            LocalCastielService.this.bindService(new Intent(LocalCastielService.this, RemoteCastielService.class),
                    myServiceConnection, Context.BIND_IMPORTANT);
        }

    }

    class MyBinder extends CastielProgressConnection.Stub {

        @Override
        public String getProName() throws RemoteException {
            return "Local猴子搬来的救兵 http://blog.csdn.net/mynameishuangshuai";
        }

    }

    @Override
    public IBinder onBind(Intent arg0) {
        return myBinder;
    }

}
     
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

RemoteCastielService.java

/**
 * 
 * @ClassName: RemoteCastielService 
 * @Description: 远程服务
 * @author 猴子搬来的救兵 http://blog.csdn.net/mynameishuangshuai
 */
public class RemoteCastielService extends Service {
    MyBinder myBinder;
    private PendingIntent pintent;
    MyServiceConnection myServiceConnection;

    @Override
    public void onCreate() {
        super.onCreate();
        if (myBinder == null) {
            myBinder = new MyBinder();
        }
        myServiceConnection = new MyServiceConnection();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        this.bindService(new Intent(this,LocalCastielService.class), myServiceConnection, Context.BIND_IMPORTANT);
        Notification notification = new Notification(R.drawable.ic_launcher,
                "猴子服务启动中",
                System.currentTimeMillis());
        pintent=PendingIntent.getService(this, 0, intent, 0);
        notification.setLatestEventInfo(this, "猴子服务",
                "防止被杀掉!", pintent);

        //设置service为前台进程,避免手机休眠时系统自动杀掉该服务
        startForeground(startId, notification);
        return START_STICKY;
    }

    class MyServiceConnection implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName arg0, IBinder arg1) {
            Log.i("castiel", "本地服务连接成功");
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            // 连接出现了异常断开了,LocalCastielService被杀死了
            Toast.makeText(RemoteCastielService.this, "本地服务Local被干掉", Toast.LENGTH_LONG).show();
            // 启动LocalCastielService
            RemoteCastielService.this.startService(new Intent(RemoteCastielService.this,LocalCastielService.class));
            RemoteCastielService.this.bindService(new Intent(RemoteCastielService.this,LocalCastielService.class), myServiceConnection, Context.BIND_IMPORTANT);
        }

    }

    class MyBinder extends CastielProgressConnection.Stub {

        @Override
        public String getProName() throws RemoteException {
            return "Remote猴子搬来的救兵 http://blog.csdn.net/mynameishuangshuai";
        }

    }

    @Override
    public IBinder onBind(Intent arg0) {
        return myBinder;
    }

}
     
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

aidl文件

package com.castiel.aidl;
interface CastielProgressConnection{
    String getProName();
}
     
     
  • 1
  • 2
  • 3
  • 4

启动服务

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 启动本地服务和远程服务
        startService(new Intent(this, LocalCastielService.class));
        startService(new Intent(this, RemoteCastielService.class));
    }
     
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

通过以上代码可以看出,双进程守护实现代码非常简单,两个服务相互连接,Local服务连接着Remote服务,Remote服务又连接着Local服务,你中有我我中有你,一旦两个服务发现对方被杀掉,另一服务立刻会启动并连接它,下面我给大家演示一下。

这里写图片描述

查看一下系统打印日志:

这里写图片描述


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android移动应用开发 第3版 卷1基础篇和卷2提高篇的合集 《android移动应用开发 第3版 卷Ⅰ:基础篇》由Lauren Darcey Shane Conder著 北京麦秆创智信息技术有限公司译 涵盖了android开发从概念 技术到市场推广应用的全部主题 内容包括android平台概览 android应用程序设计精髓 android用户界面设计精髓 android应用程序设计精髓 对外发布你的android应用程序和附录6个部分 附录还包含了android开发常用工具 模拟器 ddms和eclipse 的使用指南Android移动应用开发 第3版 卷Ⅱ:提高篇》涵盖了Android开发从概念 技术到市场推广应用的全部话题 内容包括:高级Android应用程序设计原则 高级Android用户界面设计原则 使用常用Android API Android中的绘图 动画与图形编程 充分利用Android的特性 应用程序发布和分发的进阶话题 附录共7个部分 附录还包含了Android开发常用工具 调试桥和SQLite 的使用指南   《Android移动应用开发 第3版 卷Ⅱ:提高篇》不仅适合Android应用程序开发人员阅读 还能为QA测试人员提供指导 另外 《Android移动应用开发 第3版 卷Ⅱ:提高篇》还可以帮助项目经理更好地管理项目进程和项目团队 帮助市场推广人员更好地把握市场 创造令人瞩目的销售业绩 ">Android移动应用开发 第3版 卷1基础篇和卷2提高篇的合集 《android移动应用开发 第3版 卷Ⅰ:基础篇》由Lauren Darcey Shane Conder著 北京麦秆创智信息技术有限公司译 涵盖了android开发从概念 技术到市场推广应用的全部主题 内 [更多]
Android开发指南中文版.pdf 目录 应用程序基础Application Fundamentals .............................................................. 4 关键类 .......................................................................................................................... 4 应用程序组件 ............................................................................................................... 5 激活组件:intent ................................................................................................ 7 关闭组件 ............................................................................................................... 7 manifest文件 ..................................................................................................... 8 Intent过滤器 ...................................................................................................... 9 Activity和任务 ......................................................................................................... 10 Affinity(吸引力)和新任务 ............................................................................ 11 加载模式 ............................................................................................................. 12 清理堆栈 ............................................................................................................. 13 启动任务 ............................................................................................................. 14 进程和线程................................................................................................................. 14 进程 .................................................................................................................... 14 线程 .................................................................................................................... 15 远程过程调用 ..................................................................................................... 15 线程安全方法 ..................................................................................................... 16 组件生命周期 ............................................................................................................. 17 Activity生命周期 .............................................................................................. 17 调用父类 .................................................................................................................... 17 服务生命周期 ..................................................................................................... 20 广播接收器生命周期 .......................................................................................... 22
Android开发指南中文版 目录 应用程序基础Application Fundamentals................................ 4 关键类................................................................ 4 应用程序组件.......................................................... 5 激活组件:intent.................................................. 7 关闭组件.......................................................... 7 manifest 文件..................................................... 8 Intent 过滤器..................................................... 8 Activity 和任务....................................................... 10 Affinity(吸引力)和新任务........................................ 11 加载模式......................................................... 12 清理堆栈......................................................... 13 启动任务......................................................... 14 进程和线程........................................................... 14 进程............................................................. 15 线程............................................................. 15 远程过程调用..................................................... 15 线程安全方法..................................................... 16 组件生命周期......................................................... 17 Activity 生命周期................................................. 17 调用父类............................................................. 18 服务生命周期..................................................... 21 广播接收器生命周期............................................... 22 进程与生命周期................................................... 22 用户界面User Interface............................................... 24 视图层次View Hierarchy.............................................. 24 布局Layout.......................................................... 25 部件Widgets.........................................................26 用户界面事件UI Events............................................... 26 菜单Menus.......................................................... 26 高级话题Advanced Topics..........................................27 适配器Adapter................................................. 27 风格与主题Styles and Themes.................................... 27 资源和资产Resources and Assets..................................... 28 资源引用Resource Reference..................................... 43 国际化和本地化Internationalization and Localization................ 43 意图和意图过滤器Intents and Intent Filters............................. 43 意图过滤器Intent filters........................................ 47 通常情况Common cases........................................51 使用意图匹配Using intent matching............................52 数据存储Data Storage................................................ 52 概览Storage quickview........................................... 52 .. 系统偏好:快速,轻量级存储....................................52 .. 文件:存储到设备内部或可移动闪存..............................52 .. 数据库:任意的结构化存储......................................52 .. 支持基于网络的存储............................................52 系统偏好Preferences............................................. 53 文件Files........................................................ 54 数据库Databases................................................ 54 网络Network.....................................................55 内容提供器Content Providers......................................... 55 内容提供器的基础知识Content Provider Basics..................... 55 查询一个内容提供器Querying a Content Provider................... 57 修改数据Modifying Data.......................................... 61 创建一个内容提供器Creating a Content Provider.................... 64 Content URI 总结................................................ 67 清单文件The AndroidManifest.xml File.................................68 清单文件结构Structure of the Manifest File......................... 68 文件约定File Conventions........................................ 70 文件特性File Features............................................ 73
本章内容为开发者指南(Dev Guide)/Developing/Tools/adb,这是一篇非常优秀的译稿,翻译来自"移动云_文斌",欢迎访问它的博客:"http://blog.csdn.net/caowenbin",再次感谢"移动云_文斌" !期待你一起参与翻译Android的相关资料,联系我[email protected]。 声明   欢迎转载,但请保留文章原始出处:)     博客园:http://www.cnblogs.com/     Android中文翻译组:http://goo.gl/6vJQl 正文   Android Debug Bridge   Android调试桥接器,简称adb,是用于管理模拟器或真机状态的万能工具,采用了客户端-服务器模型,包括三个部分:   * 客户端部分,运行在开发用的电脑上,可以在命令行中运行adb命令来调用该客户端,像ADB插件和DDMS这样的Android工具也可以调用adb客户端。   * 服务端部分,是运行在开发用电脑上的后台进程,用于管理客户端与运行在模拟器或真机的守护进程通信。   * 守护进程部分,运行于模拟器或手机的后台。   当启动adb客户端时,客户端首先检测adb服务端进程是否运行,如果没有运行,则启动服务端。当服务端启动时,它会绑定到本地的TCP5037端口,并且监听从adb客户端发来的命令——所有的adb客户端都使用5037端口与adb服务端通信。   接下来服务端与所有正在运行的模拟器或手机连接。它通过扫描5555-5585之间的奇数号端口来搜索模拟器或手机,一旦发现adb守护进程,就通过此端口进行连接。需要说明的是,每一个模拟器或手机使用一对有序的端口,偶数号端口用于控制台连接,奇数号端口用于adb连接,例如: Emulator 1, console: 5554 Emulator 1, adb: 5555 Emulator 2, console: 5556 Emulator 2, adb: 5557 ... 即如果模拟器与adb在5555端口连接,则其与控制台的连接就是5554端口。 当服务端与所有的模拟器建立连接之后,就可以使用adb命令来控制或者访问了。因为服务端管理着连接并且可以接收到从多个adb客户端的命令,所以可以从任何一个客户端或脚本来控制任何模拟器或手机设备。 下文介绍了可以用来管理模拟器或手机的这些adb命令。如果是在Eclipse并且安装了ADT插件的环境下开发Android应用程序,就不需要从命令行使用adb了,ADT插件已经提供了透明的集成。不过,还是可以在调试等需要的时候直接使用adb。
### 回答1: 《深入理解Android卷1》是一本关于Android系统的深入学习资料,适合有一定编程基础和对Android开发有兴趣的读者。这本书主要介绍了Android系统各个方面的知识,包括应用程序、系统架构、进程与线程、Binder机制等内容。 在这本书中,读者可以了解到Android系统的基本架构和组成部分。首先,介绍了Android应用组件,包括活动、服务、广播接收器和内容提供器,详细解释了它们的特点和使用方法,帮助读者理解如何开发基于Android应用程序。接着,作者介绍了Android系统的进程与线程管理,包括进程的创建与销毁、线程的创建与同步等内容,让读者了解到Android系统是如何管理多个应用程序同时运行的。 另外,本书还详细介绍了Android系统的核心技术——Binder机制。Binder机制是Android系统中用于进程间通信的重要技术,通过它,不同进程之间可以实现数据共享和通信。书中详细介绍了Binder机制的原理以及如何在应用程序中使用Binder进行进程间通信,为读者提供了理解和使用Binder的指南。 总的来说,这本《深入理解Android卷1》是一本很好的学习资料。通过学习这本书,读者可以深入了解Android系统的背后工作原理,掌握Android应用程序的开发技巧和底层实现细节,为进一步学习和开发Android应用奠定了坚实的基础。无论是对于初学者还是已经有一定Android开发经验的人来说,这本书都是一本不可多得的好书。 ### 回答2: 《深入理解Android卷1》是一本介绍Android系统原理与开发的经典著作。该书的作者是Bill Phillips和Chris Stewart。这本书主要分为四个部分,包括了从Android系统基础知识到高级开发技巧的内容。 第一部分主要介绍了Android系统的架构和组件,包括了应用程序结构、Activity、Fragment、布局和控件等。通过学习这些内容,读者可以对Android系统的基本构建有更深入的了解,为进一步的开发打下坚实的基础。 第二部分重点讲解了Android系统的核心组件,如Service、Content Provider和Broadcast Receiver。通过对这些组件的深入理解,读者可以更好地进行应用程序的开发,实现数据共享、接收系统广播等重要功能。 第三部分围绕Android系统的高级特性展开,包括了多线程和异步处理、通知、权限管理等相关知识。这些知识点对于开发复杂、功能丰富的Android应用至关重要,可以提高应用程序的性能和用户体验。 第四部分将Android开发推向了一个更高的层次,如数据库的使用、网络编程、地图与位置服务等。通过学习这些高级开发技巧,读者可以开发出更加复杂和实用的Android应用。 总之,《深入理解Android卷1》是一本很全面、深入的Android开发参考书籍。通过学习本书,读者可以更好地理解Android系统的原理,掌握基础和高级的开发技巧,提高自己在Android开发领域的技术水平。无论是初学者还是有经验的开发者,都可以从中受益匪浅。 ### 回答3: 《深入理解android卷1 pdf》是一本关于深入学习和理解Android开发的书籍,它详细介绍了Android系统的架构、应用程序的开发、组件的使用和调试等内容。 首先,本书详细介绍了Android系统的架构。它解释了Android的四层架构,包括Linux内核层、系统运行库层、应用框架层和应用程序层。读者可以通过学习这些架构了解Android系统的整体结构和每个层级的功能。 其次,本书全面介绍了Android应用程序的开发。它详细解释了Android的开发环境搭建、基本的应用程序结构和组件的使用。读者可以通过阅读本书,学习到如何创建Activity、Service、Broadcast Receiver和Content Provider等Android组件,并搭建并开发自己的应用程序。 此外,本书还对Android应用程序的调试进行了深入的介绍。它解释了如何使用Android调试工具来调试应用程序的代码,包括使用Logcat进行日志输出、使用DDMS进行监视和调试等。读者可以通过这些调试技巧提高自己的开发效率,快速排查和修复程序中的错误。 总之,《深入理解android卷1 pdf》是一本非常实用和全面的Android开发指南。通过阅读本书,读者可以系统地学习Android开发的基础知识和技巧,提高自己的应用程序开发水平。无论是初学者还是有一定经验的开发者,都可以从这本书中受益匪浅。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值