分类目录归档:程序运用

my sql数据库链接每次操作完都需要关闭吗

mysql 的jdbc链接如果不进行关闭,那么每次产生新链接,就会新增加一个并发,显然这是很可怕的。即便是同一个ip的多次访问,都会造成并发数量的上升。也就是说,每次操作完页面,是一定要关闭链接。是不是会产生这样的疑问。每次都关闭又链接,不是开了关,关了开,这不是更加资源浪费。其实这是错误的,反而保持越久的链接,会更加浪费资源。因为计算机的处理能力是惊人的,人类的几天,也就是计算机的毫秒而已。换算过来,仅仅是几天打开一次,几天关闭一次。可以这么理解。

//如下,我们注销掉关闭conn的方法:

// 非连接池模式关闭数据库链接
    	DataConn.close(stat, conn);

那么,我们进行多次刷新,并链接数据库,控制台显示代码为:

我们并没有进行关闭链接的操作,即便是同一个ip的访问,也会造成并发。每次刷新都会产生新的链接,并发链接数量不断增加。多次同一个ip刷新操作后,数据库并发量达到20之多。

如果我们接下来,每次操作完,进行数据库链接关闭操作。并发数量始终都是1,无论多少次刷新操作。并发量都能保证在1.关闭数据库情况的打印控制台情况。


MYsql JDBC:关闭statement对象:null
MYsql JDBC:关闭了conn对象:null
MYsql JDBC对象:com.mysql.jdbc.JDBC4Connection@35434747--第10 次请求
MYsql JDBC:关闭statement对象:null
MYsql JDBC:关闭了conn对象:null
MYsql JDBC对象:com.mysql.jdbc.JDBC4Connection@36a66ccc--第11 次请求
MYsql JDBC:关闭statement对象:null
MYsql JDBC:关闭了conn对象:null
MYsql JDBC对象:com.mysql.jdbc.JDBC4Connection@39e5ded1--第12 次请求
MYsql JDBC:关闭statement对象:null
MYsql JDBC:关闭了conn对象:null
MYsql JDBC对象:com.mysql.jdbc.JDBC4Connection@2f782dfe--第13 次请求
MYsql JDBC:关闭statement对象:null
MYsql JDBC:关闭了conn对象:null
MYsql JDBC对象:com.mysql.jdbc.JDBC4Connection@57e0c68a--第14 次请求
MYsql JDBC:关闭statement对象:null
MYsql JDBC:关闭了conn对象:null
MYsql JDBC对象:com.mysql.jdbc.JDBC4Connection@7d5852a7--第15 次请求
MYsql JDBC:关闭statement对象:null
MYsql JDBC:关闭了conn对象:null
MYsql JDBC对象:com.mysql.jdbc.JDBC4Connection@710933f7--第16 次请求
MYsql JDBC:关闭statement对象:null
MYsql JDBC:关闭了conn对象:null
MYsql JDBC对象:com.mysql.jdbc.JDBC4Connection@54e0662c--第17 次请求
MYsql JDBC:关闭statement对象:null
MYsql JDBC:关闭了conn对象:null
MYsql JDBC对象:com.mysql.jdbc.JDBC4Connection@278d791d--第18 次请求
MYsql JDBC:关闭statement对象:null
MYsql JDBC:关闭了conn对象:null
MYsql JDBC对象:com.mysql.jdbc.JDBC4Connection@596bb9de--第19 次请求
MYsql JDBC:关闭statement对象:null
MYsql JDBC:关闭了conn对象:null
MYsql JDBC对象:com.mysql.jdbc.JDBC4Connection@26ed0728--第20 次请求
MYsql JDBC:关闭statement对象:null
MYsql JDBC:关闭了conn对象:null
MYsql JDBC对象:com.mysql.jdbc.JDBC4Connection@38890bb0--第21 次请求
MYsql JDBC:关闭statement对象:null
MYsql JDBC:关闭了conn对象:null

关闭后,共发起21次请求,但mysql数据库的并发了数量依然只是1.

druid连接池配置数据库产生多个{dataSource-1} inited

导致这个错误的原因主要是代码逻辑的错误,把链接池初始化放在获取链接的方法体中了。每次链接都会导致初始化一个连接池。每次刷新都会初始化一个链接池。代码很快就崩溃了。

解决方法:把方法体放在类静态代码块中。也就是类的全局代码块。采用全局代码块的static正确写法,具体代码如下。

import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class DruidPoolConn {
	
	static Connection conn;
	static DataSource dataSource = null;
	static int i=0;
	
	//放在全局代码块,避免创建多个链接池
	     static {
	        //1.输入流加载src目录下的配置配置文件
	        InputStream in = DruidPoolConn.class.getResourceAsStream("/poolbydruid.properties");
	        //2.Properties对象方法加载配置文件
	        Properties prop = new Properties();
	        //加载了配置文件中所有的属性
	        try {
	            prop.load(in);
	            System.out.println("装载连接池配置文件poolbydruid.properties成功...");
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	            try {
					dataSource = DruidDataSourceFactory.createDataSource(prop);
				} catch (Exception e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
	     }
	     
	        //4.从连接池中获取连接对象
	        public static Connection getDruidCon() {
	        try {
	            conn=dataSource.getConnection();
	            i++;
	            System.out.println("同一IP的第:"+i+" 次请求");
	            System.out.println("连接池模式:Druid_Conn对象名:"+conn+"---!!!");
	        } catch (SQLException e) {
	            e.printStackTrace();
	        }
			return conn;
	 }
	        
	    	//关闭数据库链接对象
	    	public static void close(java.sql.PreparedStatement stat,java.sql.Connection conn){
	    		   if(stat !=null){
	    	       try {
	    				stat.close();
	    				stat=null;  //设置可让GC回收
	    				System.out.println("Druid连接池模式:关闭tatement对象:"+stat+"");
	    			} catch (SQLException e) {
	    				// TODO Auto-generated catch block
	    				e.printStackTrace();
	    			}
	    		   }   
	    		   if(conn !=null){
	    			   try {
	    				conn.close();
	    				conn=null; //设置可让GC回收
	    				System.out.println("Druid连接池模式:关闭conn对象:"+conn+"");
	    			} catch (SQLException e) {
	    				// TODO Auto-generated catch block
	    				e.printStackTrace();
	    			}
	    		   }
	    	}
}

我们在方法中设置跟踪,连接池配置放在链接方法中,会产生如下图的异常,conn对象名称不断变化,一般连接池初始化设置为8,很快就会用光。每产生一个链接池,就会分配规定数量的链接数量。如下每次刷新,都会产生一个新的链接对象,建立了新链接。

druid 连接池产生多个dataSource的错误图片

当我们重新采用static静态态代码块以后,静态代码块就一次性分配了连接池资源,当有新的链接进来时,就会从常驻的static进行分配了。采用static静态代码后,重新运行程序,不断N次刷新,无论如何刷新。所产生的链接对象都只是一个,也就是只分配一个链接对象。但我们明明关闭了连接池对象conn,怎么会不变呢?难道关闭连接池没有起到作用。否则刷新操作应该是从新分配链接对象才对。这个问题还需要思索测试。但至少采用这种方式,至少保证了一个一个链接对象的重复利用。具体如下图:

无论多少次请求,分配的链接对象都是一样的。

修改以后刷新链接信息如下:

同一IP的第:1 次请求
连接池模式:Druid_Conn对象名:com.mysql.jdbc.JDBC4Connection@a31b7af—!!!
Druid连接池模式:关闭tatement对象:null
Druid连接池模式:关闭conn对象:null
同一IP的第:2 次请求
连接池模式:Druid_Conn对象名:com.mysql.jdbc.JDBC4Connection@a31b7af—!!!
Druid连接池模式:关闭tatement对象:null
Druid连接池模式:关闭conn对象:null
同一IP的第:3 次请求
连接池模式:Druid_Conn对象名:com.mysql.jdbc.JDBC4Connection@a31b7af—!!!
Druid连接池模式:关闭tatement对象:null
Druid连接池模式:关闭conn对象:null

java mysql如何配置数据库连接池

运行时环境
1.jdk版本 1.8
2.操作系统 windows10
3.tomcat 版本 9.0
4.my sql版本 5 驱动版本:mysql-connector-java-5.1.46-bin.jar
5.durid连接池版本 druid-1.0.29.jar

第一步,在src根目录创建配置文件poolbydruid.properties

#Update MySQL_DruidPool_link
#Fri Dec 28 03:39:24 CST 2020
url=jdbc:mysql://localhost:3306/jicha?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false
username=root
password=
driverClassName=com.mysql.jdbc.Driver
initialSize=5
maxActive=10
maxWait=2000

第二步:在同包目录下创建连接池类DruidPoolConn.java

package com.data;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class DruidPoolConn {
	
	static Connection conn;
	static DataSource dataSource = null;
	static int i=0;
	
	//放在全局代码块,避免创建多个链接池
	     static {
	        //1.输入流加载src目录下的配置配置文件
	        InputStream in = DruidPoolConn.class.getResourceAsStream("/poolbydruid.properties");
	        //2.Properties对象方法加载配置文件
	        Properties prop = new Properties();
	        //加载了配置文件中所有的属性
	        try {
	            prop.load(in);
	            System.out.println("装载连接池配置文件poolbydruid.properties成功...");
	        } catch (IOException e) {
	            e.printStackTrace();
	        }
	            try {
					dataSource = DruidDataSourceFactory.createDataSource(prop);
				} catch (Exception e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
	     }
	     
	        //4.从连接池中获取连接对象
	        public static Connection getDruidCon() {
	        try {
	            conn=dataSource.getConnection();
	            i++;
	            System.out.println("同一IP的第:"+i+" 次请求");
	            System.out.println("连接池模式:Druid_Conn对象名:"+conn+"---!!!");
	        } catch (SQLException e) {
	            e.printStackTrace();
	        }
			return conn;
	 }
	        
	    	//关闭数据库链接对象
	    	public static void close(java.sql.PreparedStatement stat,java.sql.Connection conn){
	    		   if(stat !=null){
	    	       try {
	    				stat.close();
	    				stat=null;  //设置可让GC回收
	    				System.out.println("Druid连接池模式:关闭tatement对象:"+stat+"");
	    			} catch (SQLException e) {
	    				// TODO Auto-generated catch block
	    				e.printStackTrace();
	    			}
	    		   }   
	    		   if(conn !=null){
	    			   try {
	    				conn.close();
	    				conn=null; //设置可让GC回收
	    				System.out.println("Druid连接池模式:关闭conn对象:"+conn+"");
	    			} catch (SQLException e) {
	    				// TODO Auto-generated catch block
	    				e.printStackTrace();
	    			}
	    		   }
	    	}
}	

第三步,同包目录下创建OperationTable.java类进行所有表的操作

package com.data;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

//Operation类方法定义了所有表的sql操作,为高重用类
public class OperationTable {

    private  String operationsql=null;
    private  String selectsql=null ;
    Connection conn =null;
	PreparedStatement  stat = null;
	
	//从alibaba Druid 德鲁伊连接池获取链接
	public void getConn() {
		 conn=DruidPoolConn.getDruidCon();
	}
	
	//operateTabble方法根据传入的sql进行所有数据表的增、删、改
    public  void operateTable(String operatestr) throws SQLException, ClassNotFoundException {
     //打印出sql语句,用于监测程序运行过程中出现的空值及错误的sql代码。
     //System.out.println("OperationTable类的operateTable()方法处,sql代码详情:"+operatestr);
     operationsql=operatestr;
     stat = (PreparedStatement) conn.prepareStatement(operationsql);
     stat.executeUpdate(operationsql);
}  
     
    //selectTable方法获取所有数据库表的RS结合数据
    public  ResultSet selectTable(String selectstr) throws SQLException, ClassNotFoundException {	 
        // System.out.println("这里是OperationTable类的selectTable方法处...sql代码详情"+selectstr);
         selectsql=selectstr;
         stat = (PreparedStatement) conn.prepareStatement(selectsql);
         ResultSet rs = stat.executeQuery(selectsql);
        return rs;
	}
    
    //从链接池关闭链接
    public  void operateclose() throws SQLException, ClassNotFoundException
    {
    	DruidPoolConn.close(stat, conn );  //调用关闭数据库链接
    }  
}

第四步:配置durid链接监控页面,方便查看监控情况,在web info目录下的xml文件添加以下代码

<servlet>
      <servlet-name>DruidStatView</servlet-name>
      <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>DruidStatView</servlet-name>
      <url-pattern>/druid/*</url-pattern>
  </servlet-mapping>

第五步:运行项目,查看监控效果

运行tomcat得到的运行结果

第六步,访问durid提供的监控页面,访问路径为http://localhost:8084/javaSpringboot/druid/index.html

druid 数据库连接池监控页面

maven spring项目本地仓库明明包含jar包,但编译却提示找不到jar包的问题解决

eclipse自带的本地仓库地址为:C:\Users\Administrator.m2\repository,进入到具体的jar包位置,发现配置文件问题。
maven本地仓库中有jar包,项目也能运行,但提示找不到jar包的问题。这个主要是具体jar包位置中的_remote.repositories的配置文件引起的问题,解决方法是进行修改。如下

#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Sat Oct 08 18:54:18 CST 2022
mysql-connector-java-8.0.20-sources.jar>central=
mysql-connector-java-8.0.20.jar>central=
mysql-connector-java-8.0.20.pom>central=

修改为配置文件为以下内容

#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice.
#Sat Oct 08 18:54:18 CST 2022
mysql-connector-java-8.0.20-sources.jar>central
mysql-connector-java-8.0.20.jar>central
mysql-connector-java-8.0.20.pom>central

重新右键项目,update project,然后miss错误提示消失。

提示错误:容器 Maven引用了不存在的库mysql-connector-java-5.1.46.jar

运行spring maven项目中,在pom.xml中配置了依赖关系,同时也在本地maven仓库中拷贝进入了对应的jar包文件,依然提示引用了不存在的jar。提示丢失的是mysql-connector-java-5.1.46.jar包。

项目启动是maven自动下载了mysql-connector-java-8.0.20.jar,以及mysql-connector-java-8.0.22.jar两个jar包文件。但由于自己使用的是MYSQL服务器版本: 5.1.53-community 的版本,所以需要在pom文件规定版本号,并在maven本地仓库引入新的旧版jar包文件。eclipse自带的maven仓库地址为:C:\Users\Administrator.m2\repository\mysql\mysql-connector-java\。

后经仔细观察发现,原来mysql驱动的jar包文件是两个,一个是-bin.jar,而还有一个是不带-bin的jar包文件,而在maven依赖中配置的是带了-bin的jar包文件,mysql-connector-java-5.1.46-bin.jar包。所以提示容器引用错误提示,同时maven构建库中也提示错误的bin文件。

重新到mysql网站下载对应的mysql驱动版本,发现其实驱动文件其实是两个jar包文件,一个带-bin,一个不带,拷贝两个文件到maven仓库,错误提示消失了。mysql java 驱动程序下载地址 https://downloads.mysql.com/archives/c-j/

java如何用一句代码实现用户名密码的md5加密

数据库后台用户密码明文显示,显然安全隐患太大。那么我们如何进行密码的加密呢?采用外部jar包的形式是比较简单的一种方式。spring核心jar包中有一个md5DigestAsHex(Password.toString().getBytes())方法,只需要一句代码就能实现加密。so easy!
利用spring-core-5.2.6.jar的DigestUtils.md5DigestAsHex()方法就能对用户密码进行加密。

但这种加密方式是单向加密,也就是相同的用户密码,加密的结果是一样的。但不可逆向。逆向算法解密也只能采用穷举法,也就是碰撞到相同密码,才能对应到相同的密文。显然这种加密方式还是很靠谱滴。
开始操作。

第一步:我们下载spring 提供的安全加密jar包,名称为spring-core-5.2.6.RELEASE.jar,在spring springframework 的核心jar包中。将jar包拷贝到工程lib目录下;当然如果创建的是spring maven项目,项目自身就包含了相关jar包,不需要导入就可以直接用啦。如果是普通java MVC项目,那么我们就需要找到这个jar包,然后手动导入项目。
classs 类开始!
import org.springframework.util.DigestUtils;

//在局部需要加密的方法处加密
DigestUtils.md5DigestAsHex(Password.toString().getBytes());

eclipse调试时自动将lib目录、class目录同时发布到tomcat目录

eclipse 项目debug时,class文件不跟随发布,lib目录不跟随发布都会导致项目启动失败,报错一丢丢。
这个时候就需要右键查看工程目录与运行时环境目录是否debug对应起来啦。

发布目录时,是否同时debug到了tomcat运行目录。首先右键项目,属相选项。选择Deployment Assembly 选项设置。其中可以添加source路径,对应的deploy Path目录可以修改。deploy Path目录为tomcat运行时环境,也是服务器线上环境。debug线上环境的过程中需要检查各种jar包是否成功部署到tomcat服务器。

eclipse非maven构建的spring程序容易导致各种jar包发布不到位,因此报错原因多为运行环境jar包丢失导致的。我们可以从工程目录手动拷贝jar包到tomcat运行环境目录,当然最简单便捷方式的是通过设置来一次性达到目的。对于需要频繁debug的项目尤其如此。下图所示,修改对应的debug目录后,程序每次调试都能成功自动debug到tomcat。so easy!!

java mysql数据库如何配置alibaba druid(德鲁伊)数据库连接池

流量不大的网站其实没有必要配置数据库连接池。小网站尽量避免尾大不掉。代码越多,留给远方的坑就会越多。维护成本不减反增。之所以配置,主要网上小伙伴纷纷表示可以防止sql注入。把连接池提高到sql安全的角度。那就配吧!首先我们去gt下载jar包,然后调整配置一下。非常easy!!!

首先第一步:tomcat lib目录下导入jar包druid-1.0.29.jar。
第二步在配置文件properties文件中创建数据库链接配置项

MysqlPassword=
MysqlAdmin=root
MysqlUrl=jdbc\:mysql\://localhost\:3306/test?characterEncoding\=utf8&useSSL=false
MysqlDriver=com.mysql.jdbc.Driver //如果mysql是5的版本,则采用此。若mysql为6版本,则为com.mysql.cj.jdbc.Driver
initialSize=1
maxActive=8

第三步://在链接类中import DruidDriver类

import com.alibaba.druid.proxy.DruidDriver;	   
Properties  prop = new Properties();
//创建输入流对象,读取数据库配置文件 
InputStream in =DruidDriver.class.getResourceAsStream("/mysqlJdbc.properties");  
try {
prop.load(in);
//System.out.println("装载mysql配置文件mysqlJdbc.properties!");
//System.out.println("alibaba.druid连接池模式");
url  = prop.getProperty("MysqlUrl");
user = prop.getProperty("MysqlAdmin");
password = prop.getProperty("MysqlPassword");
mdname= prop.getProperty("MysqlDriver");
}

第四步:在xml中配置监控查看项

  <servlet>
      <servlet-name>DruidStatView</servlet-name>
      <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>DruidStatView</servlet-name>
      <url-pattern>/druid/*</url-pattern>
  </servlet-mapping>

至此,配置完成。可以在监控页面查看各项监控数据。

百度网站地图新工具:结构化数据插件

百度官方推出wordpress结构化数据插件以及discuz!结构化数据插件,其实这两款插件的作用是用于取代网站地图的。这就相当于百度索引网站的一些工作让本地插件来完成了。而真正的蜘蛛过来的时候,就重点索引一下由本地插件生成的文件列表就万事大吉,这对百度蜘蛛索引网站减轻了不少的负担,蜘蛛索引网站的部分负担被均衡到网站所在服务器上。在即将来临的大数据时代,这的确是高明的手段。

WordPress 结构化数据插件
WordPress 结构化数据插件

  • 自动推送Sitemap,优化内容收录

没有sitemap权限,不知道怎么提交sitmap数据?结构化数据插件帮你搞定。遍历论坛帖子页历史URL数据,自动生成sitemap提交到百度。

  • 实时推送论坛新内容,加快收录

每天海量新帖子?各种数据频繁更新?结构化数据插件帮你搞定。有新帖发布,立即将新帖子网址及内容推送至百度站长平台,帖子页发生变化,百度也能实时更新相应数据。

  • 优质内容,优化展现,提升用户点击率

优质内容不够醒目?应用结构化摘要优化展现,提升结果点击率,流量节节攀升不是梦。

我可以用结构化数据工具做什么?

安装结构化数据插件,能又快又全的向百度提交论坛网页及内容。帮助百度Spider更好的了解您的网站,帮助收录,对于优质的数据资源,可应用结构化摘要样式优化网站在百度搜索结果页的展现。根据社区论坛软件系统的不同,结构化插件分为:Discuz! 结构化数据插件和WordPress 结构化数据插件,二者的功能基本一致。

结构化数据插件使用指南:

步骤一:下载适合版本的插件,解压文件至论坛根目录下:Discuz! 用户解压至source/plugin下;Wordpress用户解压至 wp-content/plugins下;
步骤二:以管理员账号登陆平台环境,在管理中心应用页面-安装新插件目录下,找到插件“baidusubmit”直接安装;(使用WordPress插件的站长,可跳过该步骤)
步骤三:在管理中心应用页面-插件列表目录下,启用“baidusubmit”插件;
步骤四:启用插件后,验证论坛网址,验证成功,插件安装完成。

本文来源:百度站长管理员工具

apk文件如何安装?

1、可以从安卓网下载软件安装包,存放在手机的SD卡上,然后使用文件管理器进行安装,这样就可以在Android手机里直接安装。如果手机上没有文件管理器,建议使用方法1在电子市场上先搜索es关键字,安装ES文件浏览器免费版本。如果连电子市场都没有,那么使用方法3先安装一个文件管理器。

2、也可以用USB数据线连接电脑,然后在电脑上对Android手机进行安装,但是首先需要在电脑上安装APK安装器或者豌豆荚或者是魔乐手机助手等软件,可以批量安装程序,非常方便。

方法:放进手机存储卡 在手机文件管理器中直接单击打开

对于老鸟来说,apk文件的安装可以说是家常便饭了,不过对于刚刚接触安卓系统的新手来说,这可能是一个很大的困惑,小编在这里简单的分享一下。

Apk文件怎么安装?一般来说,建议新手使用两种途径:

1、通过电脑客户端安装到手机:

作为一个新手,你刚买的安卓手机里面连管理软件也没有,市场也不会用,那这个方法就是首选了。首先通过电脑上网下载一个好用的客户端安装到电脑上,以安卓驱动为例:

安装好之后,就可以像平常操作电脑软件一样打开,通过搜索或分类检索找到自己喜欢的软件,点击进入下载

下载完成后可以发现,原来的下载图标已经变成了开始安装

将手机用数据线连接到电脑,点击开始安装,就能够智能化的将已经下载到电脑上的软件自动安装到手机里面。这种方法的好处是电脑端完成全部操作,并且不会在手机中留下任何缓存垃圾。

2、通过安装在手机的软件市场:

电脑不可能随时在身边,而这时候我们需要下载安装软件的话,就需要使用软件市场了。安卓手机一般带有官方市场,但是里面的软件一般都需要收费,部分免费的软件也会在使用过程中弹出广告,所以建议选择一款好用的第三方市场。

以泡椒软件筐为例,它是泡椒网推出的免费官方市场,里面都是已破解、不需要收费并且没有广告的软件,这里也附下载地址:泡椒软件筐

通过第一种方法安装好泡椒软件筐之后打开,就可以看到海量各种分类的软件,通过分类索引或者搜索找到你想要下载的软件

点击进入下载,完成后点击安装按钮就可以完成安装了

这种方法比较方便,只要手机可以连上网络(3g、wifi和移动网都可以),就能随时随地下载安装自己所需的软件。

怎样,是不是已经明白过来了,其实没想象中那么麻烦吧。当你已经开始熟悉使用安卓手机之后,安装apk的方法就更加五花八门了,比如二维码扫描下载、传到内存卡安装、软件包解压等等,安卓手机的DIY性能无穷无尽,有海量的软件等着你去尝试呢,慢慢发掘其中的乐趣吧。