日期: 2021 年 5 月 17 日

解决Github资源无法访问

不是什么原创,就是个人稍微记录一下。

Windows上可以这样办:

上https://www.ipaddress.com查一下raw.githubusercontent.com的ipv4地址,比如我现在查到的是199.232.68.133。

使用管理员权限打开C:/Windows/System32/hosts文件,添加一行

 

199.232.68.133 raw.githubusercontent.com # comments. put the address here 

或者管理员权限开或者给个用户写入权限。然后差不多就行了,可能要重启。

找不到 raw.githubusercontent.com 的服务器 IP 地址

问题:找不到 raw.githubusercontent.com 的服务器 IP 地址。
解决方法:(在hosts文件中添加IP地址)

在C:\Windows\System32\drivers\etc路径下找到hosts文件

添加 以下内容并保存即可恢复

199.232.68.133 raw.githubusercontent.com

%title插图%num

 

黑客进入服务器隐藏自己的方法

在网络过载攻击中,一个共享的资源或者服务由于需要处理大量的请求,以至于无法满足从其他用户到来的请求。例如一个用户生成了大量的进程,那么其他用户就无法运行自己的进程。如果一个用户使用了大量的磁盘空间,其他用户就无法生成新的文件。有效保护系统免遭过载攻击的办法是划分计算机中的资源,将每个用户的使用量限制在自己的那一份中。另外,还可以让系统自动检查是否过载或者重新启动系统。

1.进程过载的问题

*简单的拒*服务的攻击是进程攻击。在进程攻击中,―个用户可以阻止在同时间内另一个用户使用计算机。进程攻击通常发生在共享的计算机中,如果没有人与自己争夺使用计算机,就没有必要使用这种攻击方法。这种攻击对现在的UNIX系统没有多大效果,因为现在的UNIX系统限制任何UID(除了o)使用的进程数目。这个限制叫做MAXUPROC,当系统构筑时,在内核进行设置,一些系统允许在启动时设置这个值。

例如soIarts允许在/etc/system文件中设置这个值。set NAXUP助C;100进行这种攻击的用户消耗的是他自己的进程数目,而不是别人的。一个超级用户可以使用ps命令查看一个进程的子孙数目,使用kill 命令来杀死那些无用进程。有时候不能一个又―个地杀死这些进程,因为剩余的进程会生成新的进程。一个好的办法是先用kill命令停止这些进程,然后杀死它们。另外可以同时杀死一组进程。在许多情况下,一个用户生成了许多进程,这些进程是同一组的。要找出进程组,可使用ps命令的选项,然后一次杀死这些进程。

在现在的UNIX系统中,一个具有超级用户权限的用户仍旧可以通过使用进程攻击的方法来使系统停机。这是因为对超级用户能使进程数目没有什么限制,但是作为一个超级用户,他还是可以关闭系统,或者执行其他命令,所以这不是一个很重要的问题。除非超级用户正在运行的程序有一个*值,没有人可以得到一个进程,哪怕仅仅是登录。还有其他一些情况可能使系统过载。虽然没使一个用户到达他自己的*大进程数目,但由于太多的用户在使用计算机,系统还是达到了一个可允许的*大进程数。另外一个可能性是系统配置错误,一个用户允许使用的进程树本身已等于或者超出了系统允许的*大进程数目。当系统中有太多的进程时,没有更好的办法来纠正,只有让系统重启。这是因为:用户无法运行ps命令来决定有多少进程需要杀死,因为执行ps命令也需要生成进程。如果网络管理员当前没有登录为超级用户,则也不能使用su或者是10gin命令,因为这两个命令同样要生成新的进程。针对这种情况,可以使用exec% exec /b 2n/su Pass word:#需要注意的是,不要敲错了口令,因为程序会执行,但执行完毕之后,将自动地退出系统。

如果用户遇到了rk于太多进程而造成的系统饱和,重新启动系统。*简单的方法是按机箱上的RESET键。但是,这会破坏磁盘上的文件块,因为系统还没有来得及刷新磁盘。没有多少系统被设计得能在突然关闭时,还执行正常关闭的那些工作。比较好的办法是杀死一些进程,然后进入单用户模式。

在现代的unix系统中,超级用户可以发送一个SIGTEBM信号给除了系统进程和自己进程之外的所有进程:#KILL-TERM-1#

如果当前使用的UNIX没有这一点可以执行如下命令:#KILL-TERM1向INIT进程发送一个SIGTERM信号。UNIX自动杀死所有的进程,进入单用户模式,这时,可以执行sync命令,然后重新启动系统。

2.系统过载攻击

另一种流行的基于进程的攻击是一个用户产生了许多进程,消耗了大量的cpu时间。这种攻击减少了其他用户可用的CPU处理时间。例如,某用户使用了十个find命令,并使用则在一些目录中查找文件,这些都可以使系统运行得像爬行一样慢。

比较好的办法是,教育用户合理地共享系统,鼓励用户使用nice命令降低后台运行的进程的优先级。另外,也可以使用at和batch命令,将一些长的任务安排在系统不是很繁忙的时候去执行。对那些故意或者重复这种行为的用户可以采取一些措施。

如果系统过载了,用root登录,将自己的优先纽设为较高的值。然后使用ps命令观察运行的进程,并使用kill命令。

3.磁盘攻击

攻击方式是填充磁盘空间个用户向磁盘填充了大量的文件,其他用户不能生成文件做其它有用的事。

磁盘满攻击

du命令可以发现系统中磁盘分区空间的使用情况。du命令递归地查找目录树,列出每一个使用了多少块。也可以使用flnd命令列出那些大文件的文件名。可以使用find命令的-size选项,列出文件大小超过一定慎的文件。

quot命令可以根据每一个用户来总结文件系统的使用情况。使用―f选项,quot打印出每一个用户使用的文件数量和使用的块数。

UNIX文件系统使用inode来存放文件的信息。一个可以便磁盘不能使用的途径是消耗所有磁盘上的空闲inode,使之不能生成新的文件。一个用户可能生成了上千个空文件。这是一个很令人困惑的问题,因为df命令提示有许多可用的空间,然而当生成文件时,却得到一个错误。这是因为每一个新文件、目录、管道文件都需要一个inode结构去描述。如果可用的inode消耗尽了,系统便无法生成新文件,但此时,系统还有可用的磁盘空间。

可以使用df命令的―I选项来查看有多少空闲的inode。通常,可以将磁盘划分成一些小的分区,保护磁盘满攻击。将不同用户的主目录放到不同的分区中。用这种方式,如果一个分区被充满了,别的用户并不受影响。

另一个有效的办法是,使用在许多现代unix系统中都有的quota系统,来保护系统不受这种攻击。通过磁盘配额系统,每一个用户可以确定有多少inode可用;有多少磁盘块可用。

防止拒*服务的攻击

许多现代的UNIX允许管理员设置一些限制,如限制可以使用的*大内存、CPU时间以及可以生成的*大文件等。如果当前正在开发―个新的程序,而又不想偶然地使系统变得非常缓慢,或者使其它分享这台主机的用户无法使用,这些限制是很有用的。Korn Shell的ulimit命令和Shell的Iimit命令可以列出当前程的资源限制。

入侵LINUX服务器详解

在网上有许多网友提出这样的问题:究竟网站的主页是如何被黑的?黑客们到底是如何入侵服务器的?
在讨论这部分知识前,读者需要知道——入侵网站是非法的;但是在网络上找到网站的入侵漏洞并通知该网站是受到欢迎的。为什么要这样寻找入侵漏洞或入侵哪, 著名的黑客H ackalot说过“入侵网站是利用所学的知识来学习新的知识的一种办法”,这也就是中国人所常说的“温故而知新”。

【原理】
尽管为服务器设计软件的软件工程师们想方设法提高系统的安全性,然而由于系统管理员的水平参差不齐或安全意识底下,往往给黑客提供了入侵的机会。

其实每一个黑客都有自己独到的方法。笔者对于入侵网站服务器的资料收集了很多,但是因为实际情况的不同,往往造成许多方法的失效;由此可见,每一个网站的 情况都不同,需要入侵者区分对待。假设深圳的线路比北京的线路要好的多,从而给了词典穷举很大的方便,深圳用户就可以依靠这个优势在线攻击口令,作为北京 的用户就需要优先考虑其它办法了。针对这么多的入侵手段,笔者参考H ackalot先生这位黑客界名人的一篇文章给大家介绍一下入侵网站的基本步骤。
分析一部分的主页被黑的事例可以发现使用入侵者*热衷于入侵Web服务器和FTP服务器,因为相对来说这是*简单的两种途径。在假设读者对U NIX系统和WEB SERVER的知识不曾了解的情况下,笔者给出下面的步骤。

一、了解要入侵的系统
现在网络上用作服务器的操作系统以UNIX和Linux为主流,如果要入侵这些系统则必须对它们有一个了解。
大部份在 DOS 上使用的指令在 UNIX 及 Linux 上都有对应的指令(因为早期的dos开发借鉴了UNIX),以下列出在使用 SHELL帐号 (shell account)时*主要的一些指令对应的dos指令:
HELP=HELP
CP=COPY
MV= MOVE
LS= DIR
RM =DEL
CD=CD
要看谁同時也在该系統上用户可以键入 WHO 指令,要知道系統上某一位使用者的资料, 可以鍵入 FINGER。这些基本的 UNIX 指令可以让你得到你正使用系統的信息。

二、破解密码
在UNIX操作系统中, 所有系统使用者的密码都存放在一个文件中,这个文件存放在 /etc这个目录下面, 它的文件名就叫做passwd。如果读者认为所要做的工作就是拿到这个文件按照上面的密码登陆系统的话那就大错特错了。UNIX和Linux下的p asswd文件是特殊的,在它里面所有帐号的密码都已经经过重新编译的(也就是前面说过的DES加密方法),而且这些密码所进行的都是单向编译( one-way encrypted),也就是说没有办法可以反编译它的(decrypt)。
但是还是有些程序可以得到这些原始的密码。笔者向大家推荐一个破解密码的程序“Cracker Jack”,它也是一个使用字典来对字典文件进行穷举的软件。首先“Cracker Jack”会把字典文件里的每一个值进行编译,然后将编译过的值与密码文件中的内容进行比较,得到相同的结果就会报告对应的未经编译密码。这个软件巧妙的 绕过密码无法反编译的限制,使用穷举比较获得密码。使用这种原理获得密码的工具有许多,读者可以到网络上去搜寻一下。

三、获得密码文件
这是*困难的一部分。很明显,如果管理员有那么一个密码文件的话他当然不会放在那里让其它人舒舒服服的拿到的。入侵者必须找到好方法以不进入系统的方式拿到密码文件。这里笔者向大家介绍两种方法,大家可以试试,有可能会成功。
1.tc目录在FTP服务上不会被锁住,入侵可以用FTP client程序使用anoymously匿名帐号登陆,然后检查一下/etc/passwd是否为匿名设置了被读取的权限,如果有马上备份下来使用软件解码。
2.些系统中,/cgi-bin目录下会有个叫PHF的文件,如果准备入侵的服务器上有的话那就要方便的多了。因为PHF允许使用者对网站系统里的文件作远端读取,以此为据,用户可以使用浏览器抓取p asswd文件,只要在浏览器地址栏中键入URL:http://xxx.xxx.xxx/cgi-bin/phf?Qalias=x%0a/bin/cat%20/etc/passwd,其中xxx.xxx.xxx 是要入侵的网站名。
如果这两种方法都行不通的话,那入侵者必须实施其它的办法了。
在 有些情况下入侵者找到的密码文件的第二部分是X、!或者*,那么说明该密码文件已经被锁死,这是系统管理员使用的加强安全的手段之一。但是将密码文件完全 隐藏起来的情况是不太有的。通常情况下都会有未经锁死的密码文件备份在系统中,这样入侵者就可以加以利用,比如:入侵者通常会寻找/ etc/shadow目录或类似的目录,看能否找到密码文件的备份。

四、建立自己的shell帐号
经过 二、三两个关键的步骤入侵者终于拿到了关键的密码文件,并且破解出了密码。现在可以运行TELNET程序,登陆主机了。当连上服务器时服务器会向你显示自 己的一些信息,通常是U NIX、linux、 aix、 irix、 ultrix、 bsd 甚至是 DOS 和VAX/Vms;然后是Login提示符出现在屏幕上,这时键入得来的帐号和密码即可登陆系统。此时入侵者就可以利用自己的UNIX知识做自己喜欢做的 事了。

*后对一份密码文件做一个分析,该文件内容如下:
root:1234aaab:0:1:Operator:/:/bin/csh
nobody:*:12345:12345::/:
daemon:*:1:1::/:
sys:*:2:2::/:/bin/csh
sun:123456hhh:0:1:Operator:/:/bin/csh
bin:*:3:3::/bin:
uucp:*:4:8::/var/spool/uucppublic:
news:*:6:6::/var/spool/news:/bin/csh
audit:*:9:9::/etc/security/audit:/bin/csh
sync::1:1::/:/bin/sync
sysdiag:*:0:1:Old System
Diagnostic:/usr/diag/sysdiag:/usr/diag/sysdiag/sysdiag
sundiag:*:0:1:System
Diagnostic:/usr/diag/sundiag:/usr/diag/sundiag/sundiag
tom:456lll45uu:100:20::/home/tom:/bin/csh
john:456fff76Sl:101:20:john:/home/john:/bin/csh
henry:AusTs45Yus:102:20:henry:/home/henry:/bin/csh
harry:SyduSrd5sY:103:20:harry:/home/harry:/bin/csh
steven:GEs45Yds5Ry:104:20:steven:/home/steven:/bin/csh
+::0:0:::

其中以“:”分成几个栏位,比如: tom:456lll45uu:100:20:tomchang:/home/tom:/bin/csh的含义是:
User Name: tom
Password: 456lll45uu
User No: 100
Group No: 20
Real Name: tom chang
Home Dir: /home/tom
Shell: /bin/csh

读者可以发现以上诸如nobody、 daemon、 sys、 bin、 uucp、 news、 audit、 sysdiag、sundiag 等的密码栏位都是*,也就是说这些帐号的密码都已锁死,无法直接利用。

值得注意的是,许多系统在首次安装后会有一些缺省帐号和密码,这给投机主义的黑客带来方便,以下就是一些UNIX下缺省的帐号和密码。
ACCOUNT PASSWORD
———– —————-
root root
sys sys / system / bin
bin sys / bin
mountfsys mountfsys
adm adm
uucp uucp
nuucp anon
anon anon
user user
games games
install install
reboot 供“command login”使用
demo demo
umountfsys umountfsys
sync sync
admin admin
guest guest
daemon daemon

其中 root mountfsys umountfsys install (有時候 sync也是) 等都是root级别的帐号, 也就是拥有了sysop (系统管理员)的权限。

*后有必要介绍一下UNIX的日志文件。很多入侵者不希望侵入的电脑追踪他们,那到底如何做那。
系统管理员主要依靠系统的LOG,即我们时常所说的日志文件来获得入侵的痕迹及入侵者进来的IP和其他信息。当然也有些管理员使用第三方工具来记录侵入电脑的信息,这里主要讲的是一般U NIX系统里记录入侵踪迹的文件。

UNIX系统有多个版本,各个系统有不同的LOG文件,但大多数都应该有差不多的存放位置,*普通的位置就是下面的这几个:
/usr/adm,早期版本的UNIX;
/var/adm,新一点的版本使用这个位置;
/var/log,一些版本的Solaris,Linux BSD,Free BSD使用这个位置;
/etc,大多数UNIX版本把utmp放在此处,一些也把wtmp放在这里,这也是 syslog.conf的位置。

下面列举一些文件的功能,当然他们也根据入侵的系统不同而不同。
acct 或 pacct,记录每个用户使用的命令记录;
access_log,主要使用来服务器运行了NCSA HTTPD,这个记录文件会有什么站点连接过你的服务器;
aculog,保存着你拨出去的MODEMS记录;
lastlog,记录了用户*近的登陆记录和每个用户的*初目的地,有时是*后不成功登陆的记录;
loginlog,记录一些不正常的登陆记录;
messages,记录输出到系统控制台的记录,另外的信息由syslog来生成;
security,记录一些使用UUCP系统企图进入限制范围的事例;
sulog,记录使用su命令的记录;
utmp,记录当前登录到系统中的所有用户,这个文件伴随着用户进入和离开系统而不断变化;
utmpx,UTMP的扩展;
wtmp,记录用户登录和退出事件;
syslog,*重要的日志文件,使用syslogd守护程序来获得。
日志信息:
/dev/log,一个UNIX域套接字,接受在本地机器上运行的进程所产生的消息;
/dev/klog,一个从UNIX内核接受消息的设备;
514端口,一个INTERNET套接字,接受其他机器通过UDP产生的syslog消息;
Uucp,记录的UUCP的信息,可以被本地UUCP活动更新,也可有远程站点发起的动作修改,信息包括发出和接受的呼叫,发出的请求,发送者,发送时间和发送主机;
lpd-errs,处理打印机故障信息的日志;
ftp日志,执行带-l选项的ftpd能够获得记录功能;
httpd日志,HTTPD服务器在日志中记录每一个WEB访问记录;
history日志,这个文件保存了用户*近输入命令的记录;
vold.log,记录使用外接媒介时遇到的错误记录。

以上介绍了一下入侵服务器的主要步骤,读者现在应该对它有一些基础的认识了。需要再次强调的是如果读者对UNIX系统缺乏了解的话那是*对不可能掌握它的

Android设置手机壁纸(WallPaper)

/**
* Andorid设置手机屏幕的壁纸
*
* @description:
* @author ldm
* @date 2019-5-4 下午3:08:56
*/
public class SetWallpaperActivity extends Activity {
// WallpaperManager类:系统壁纸管理。通过它可以获得当前壁纸以及设置指定图片作为系统壁纸。
private WallpaperManager wallpaperManager;
// 壁纸对应的Drawable
private Drawable wallpaperDrawable;
// 展示样式的ImageView
private ImageView imageView;
// 随机生成图片的颜色 Button
private Button randomize;
// 设置壁纸
private Button setWallpaper;
// 暂定的一些颜色值
final static private int[] mColors = { Color.BLUE, Color.GREEN, Color.RED,
Color.LTGRAY, Color.MAGENTA, Color.CYAN, Color.YELLOW, Color.WHITE };

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.set_wallpaper);
// 初始化WallpaperManager
wallpaperManager = WallpaperManager.getInstance(this);
wallpaperDrawable = wallpaperManager.getDrawable();// 获得当前系统的壁纸
initViews();
initListeners();
}

private void initListeners() {
randomize.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
int mColor = (int) Math.floor(Math.random() * mColors.length);
// 给当前系统壁纸设置颜色
wallpaperDrawable.setColorFilter(mColors[mColor],
PorterDuff.Mode.MULTIPLY);// 取两层绘制交集
imageView.setImageDrawable(wallpaperDrawable);
// imageView.invalidate();
}
});

setWallpaper.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
try {
// 设置壁纸
wallpaperManager.setBitmap(imageView.getDrawingCache());
finish();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}

private void initViews() {
imageView = (ImageView) findViewById(R.id.imageview);
imageView.setDrawingCacheEnabled(true);
imageView.setImageDrawable(wallpaperDrawable);
randomize = (Button) findViewById(R.id.randomize);
setWallpaper = (Button) findViewById(R.id.setwallpaper);
}
}

<?xml version=”1.0″ encoding=”utf-8″?>
<FrameLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”>
<ImageView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:id=”@+id/imageview” />
<LinearLayout
android:orientation=”horizontal”
android:layout_width=”wrap_content”
android:layout_height=”match_parent”>
<Button
android:id=”@+id/randomize”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”@string/randomize”
android:layout_gravity=”bottom” />
<Button
android:id=”@+id/setwallpaper”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”@string/set_wallpaper”
android:layout_gravity=”bottom” />
</LinearLayout>
</FrameLayout>

Android中获取和设置手机的壁纸

package com.easyway.android.ui;

import java.io.IOException;

import android.app.Activity;
import android.app.WallpaperManager;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
/**
* 在Android中获取和设置手机的壁纸
*
* //获取壁纸管理器
* final WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
* //获取壁纸图片
* final Drawable wallpaperDrawable = wallpaperManager.getDrawable();
* 设置壁纸的方法
* //更换壁纸
wallpaperManager.setBitmap(imageView.getDrawingCache());
* @author longgangbai
*
*/
public class AndroidWallpaperActivity extends Activity {

final static private int[] mColors =
{Color.BLUE, Color.GREEN, Color.RED, Color.LTGRAY, Color.MAGENTA, Color.CYAN,
Color.YELLOW, Color.WHITE};

/**
* Initialization of the Activity after it is first created. Must at least
* call {@link android.app.Activity#setContentView setContentView()} to
* describe what is to be displayed in the screen.
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
// Be sure to call the super class.
super.onCreate(savedInstanceState);
// See res/layout/wallpaper_2.xml for this
// view layout definition, which is being set here as
// the content of our screen.
setContentView(R.layout.wallpaper);
//获取壁纸管理器
final WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
//获取壁纸图片
final Drawable wallpaperDrawable = wallpaperManager.getDrawable();
//图片视图
final ImageView imageView = (ImageView) findViewById(R.id.imageview);
//绘制缓存
imageView.setDrawingCacheEnabled(true);
//设置图片
imageView.setImageDrawable(wallpaperDrawable);

//更改壁纸的颜色
Button randomize = (Button) findViewById(R.id.randomize);
randomize.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
int mColor = (int) Math.floor(Math.random() * mColors.length);
wallpaperDrawable.setColorFilter(mColors[mColor], PorterDuff.Mode.MULTIPLY);
imageView.setImageDrawable(wallpaperDrawable);
//调用这个方法用于重新调用onDraw绘制整个界面
imageView.invalidate();
}
});

//
Button setWallpaper = (Button) findViewById(R.id.setwallpaper);
setWallpaper.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
try {
//更换壁纸
wallpaperManager.setBitmap(imageView.getDrawingCache());
finish();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}

Android开发 设置手机壁纸

内容概要
可以选择自己喜欢的图片进行壁纸设置

所需方法
1、使用WallpaperManager的setResource(int ResourceID)方法

2、使用WallpaperManager的setBitmap(Bitmap bitmap)方法

3、重写ContextWrapper 类中提供的setWallpaper()

4.传入9张自己喜欢的图片,命名image1-image9

Mainfest中加入权限:
<uses-permission android:name=”android.permission.SET_WALLPAPER”/>

布局代码
<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:tools=”http://schemas.android.com/tools”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:orientation=”vertical”
android:background=”#000000″
tools:context=”.MainActivity” >
<ImageSwitcher
android:id=”@+id/ImageSwitcher”
android:layout_width=”fill_parent”
android:layout_height=”370dp”>
</ImageSwitcher>
<Gallery
android:id=”@+id/Gallery”
android:layout_width=”fill_parent”
android:layout_height=”80dp”
android:layout_below=”@+id/ImageSwitcher” />
<Button
android:id=”@+id/BtnGo”
android:layout_width=”wrap_content”
android:layout_height=”40dp”
android:layout_below=”@+id/Gallery”
android:layout_alignParentBottom=”true”
android:layout_centerHorizontal=”true”
android:text=”@string/BtnGo” />
</RelativeLayout>

ImageAdapter类
使用Gallery来实现一个可以供用户选择的缩略图列表,当用户选择列表中的图像时,会在ImageSwitcher控件中显示出当前图像,当点击Button时,当前图片将被设置为壁纸。其实这里的ImageSwitcher完全可以替换为ImageView,考虑到ImageSwitcher可以提供较好的动画效果,所以我们在这里选择了ImageSwitcher。同样地,我们继续使用Android开发学习之Gallery中的那个ImageAdapter类:

代码:

package com.android.gallery2switcher;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter{

//类成员myContext为context父类
private Context myContext;
private int[] myImages;

//构造函数,有两个参数,即要存储的Context和Images数组
public ImageAdapter(Context c,int[] Images)
{
// TODO Auto-generated constructor stub
this.myContext=c;
this.myImages=Images;
}

//返回所有的图片总数量
@Override
public int getCount()
{

return this.myImages.length;
}

//利用getItem方法,取得目前容器中图像的数组ID
@Override
public Object getItem(int position)
{
return position;
}

@Override
public long getItemId(int position)
{
return position;
}

//取得目前欲显示的图像的VIEW,传入数组ID值使之读取与成像
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ImageView image=new ImageView(this.myContext);
image.setImageResource(this.myImages[position]);
image.setScaleType(ImageView.ScaleType.FIT_XY);
image.setAdjustViewBounds(true);
return image;
}

}

main代码
package com.android.gallery2switcher;
import java.io.IOException;

import android.os.Bundle;
import android.app.Activity;
import android.app.WallpaperManager;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Button;
import android.widget.Gallery;
import android.widget.Gallery.LayoutParams;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.ViewSwitcher.ViewFactory;

public class MainActivity extends Activity {

Gallery mGallery;
ImageSwitcher mSwitcher;
Button BtnGo;
int[] Resources=new int[]{R.drawable.image0,R.drawable.image1,R.drawable.image2,R.drawable.image3,
R.drawable.image4,R.drawable.image5,R.drawable.image6,R.drawable.image7,R.drawable.image8};
int index;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//不显示标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
mGallery=(Gallery)findViewById(R.id.Gallery);
mSwitcher=(ImageSwitcher)findViewById(R.id.ImageSwitcher);
//实现ImageSwitcher的工厂接口
mSwitcher.setFactory(new ViewFactory()
{
@Override
public View makeView()
{
ImageView i = new ImageView(MainActivity.this);
i.setBackgroundColor(0xFF000000);
i.setScaleType(ImageView.ScaleType.FIT_CENTER);
i.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
return i;
}
});
//设置资源
mSwitcher.setImageResource(Resources[0]);
//设置动画
mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_in));
mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,android.R.anim.fade_out));
BtnGo=(Button)findViewById(R.id.BtnGo);
BtnGo.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
SetWallPaper();
}
});
ImageAdapter mAdapter=new ImageAdapter(this,Resources);
mGallery.setAdapter(mAdapter);
mGallery.setOnItemSelectedListener(new OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> Adapter, View view,int position, long id)
{
//设置图片
mSwitcher.setImageResource(Resources[position]);
//获取当前图片索引
index=position;
}
@Override
public void onNothingSelected(AdapterView<?> arg0)
{

}

});

}
//设置壁纸
public void SetWallPaper()
{
WallpaperManager mWallManager=WallpaperManager.getInstance(this);
try
{
mWallManager.setResource(Resources[index]);
}
catch (IOException e)
{
e.printStackTrace();
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
return true;
}

}

实现效果图

%title插图%num %title插图%num

可左右拖动:
点击设置壁纸后:

%title插图%num

Android Studio 模拟器卡慢、占内存解决方法

Android Studio 模拟器卡慢、占内存解决方法

Android Studio 模拟器卡慢、占内存解决方法
在使用Android virtual device来进行调试运行时会比较慢,性能也不是很好。原生模拟器比较吃电脑配置,常常几分钟都跑不完一个程序。

这里推荐几种解决方法
1.本身自带的Android virtual device(intel处理器)
2.本身自带的Android virtual device(18年更新支持的AMD处理器)
3.使用安卓真机调试
4.使用Genymotion模拟器
在我学习Android中,我尝试了几种模拟器的使用方法。希望在你选择和配置模拟器时有所帮助:
###

一. Android virtual device(自带模拟器Intel)
这里讲一下Android Studio 原生模拟器的改善吧。为 Android 模拟器配置硬件加速,Android 模拟器可以使用硬件加速功能来提升性能,有时甚至可以大幅提升性能。
1.创建新的AVD时修改Graphics Rendering选项

创建新的 AVD 官方链接:
https://developer.android.google.cn/studio/run/managing-avds#createavd.

在 AVD 管理器中创建 Android 虚拟设备 (AVD) 时,你可以指定模拟器应使用硬件还是软件来模拟 AVD 的 GPU。
Graphics Rendering即图形渲染方式,如下有三种可选:自动选择、硬件、软件。右侧标注处解释了其优缺点:
硬件:使用你电脑的显卡得到更快的渲染。
软件:使用电脑中的软件来模拟图形,以此解决电脑显卡的问题。
模拟器将使用软件加速(使用计算机的 CPU)来模拟 GPU 处理。

%title插图%num

默认情况下,模拟器会根据你的计算机设置来决定是使用硬件图形加速还是软件图形加速。建议使用硬件加速,因为硬件加速通常速度更快。

2.在 Windows 上使用 Intel HAXM 配置虚拟机加速
计算机必须满足以下要求,您才能安装和使用 Intel HAXM:

启用了虚拟化技术 (VT-x)、Intel EM64T (Intel 64) 功能和 Execute Disable (XD) Bit 功能的 Intel 处理器

64 位 Windows 10、Windows 8 或 Windows 7(或者 64 位处理器上的 32 位版本的操作系统)

要在 Windows 10 或 Windows 8 上使用 Intel HAXM,您必须在 Windows 控制面板中关闭 Hyper-V。

注意:安装某些软件可能会重新开启 Hyper-V。在可能的情况下,Android Studio 会尝试检测是否重新启用了 Hyper-V,并显示一个可让您再次关闭 Hyper-V 的选项。

①打开 SDK 管理器。

Android Studio SDK 管理器链接:
https://developer.android.google.cn/studio/intro/update#sdk-manager.

②点击 SDK Update Sites 标签,然后选择 Intel HAXM。
③点击 OK。
④下载完成后,运行安装程序。通常,您可以在以下位置找到安装程序:sdk\extras\intel\Hardware_Accelerated_Execution_Manager\intelhaxm-android.exe
⑤使用向导完成安装。

2.设置你的电脑在使用Android Studio时使用独显
如下图,我的电脑是NIVIDA,就以NIVIDA为例。打开NIVIDA控制面板,选择管理3D设置,在界面中间选择程序设置,然后把Android Studio添加进来。下方图形处理器选择高性能NIVIDA处理器。

%title插图%num

再点击设置Surround、PhysX配置,选择独显。如下图,我的是Geforce GTX1050Ti。

%title插图%num

做完以上修改以后,以高性能显卡运行AVD,会有一定的流畅性提升。但是同样的,长时间高性能使用显卡会出现意想不到的问题。(我在配置的时候发热严重、风扇如战斗机一样开转,我电脑太渣了!)

二. Android virtual device(自带模拟器AMD)
对于使用英特尔 x86 处理器的设备来说,默认情况下 Android 模拟器将继续使用硬件加速执行管理器技术 (Intel HAXM)。该技术是英特尔开发的一款较为成熟的开源虚拟化技术解决方案。此外,由于英特尔在创新研发方面的持续投入,HAXM 依旧是目前市面上*快的 Android 模拟器加速技术。

若您的设备使用的是 AMD 处理器,需同时满足以下条件:

AMD 处理器 —— 推荐使用 AMD 锐龙系列处理器;

Android Studio 3.2 Beta 或更高版本,点击前往 Android Studio 预览版下载页面;

Android 模拟器 v27.3.8 +,点击前往 Android Studio SDK 管理器页面下载;

x86 Android 虚拟设备 (AVD),创建虚拟设备;

Windows 10 Version 1803 四月更新版;

①在 Windows 桌面上,右键点击 Windows 图标,然后选择应用程序和功能。
②在相关设置下,点击程序和功能。
③点击打开或关闭 Windows 功能。
④选中 Windows Hypervisor Platform。

%title插图%num

⑤点击 OK。

⑥安装完成后,重启计算机。

三. 使用真机调试
Android Studio是支持使用自己的安卓手机进行调试的。真机调试性能不错,效果较好。需要用数据线将手机与电脑连接。如下图我示范一下真机调试过程:
1.设置开发者选项
在设备上,打开设置应用,选择开发者选项,然后启用 USB 调试。
2.USB 驱动程序。
在 Windows 上开发并且想要连接设备进行测试,则需要安装合适的 USB 驱动程序。
USB驱动链接:
https://developer.android.google.cn/studio/run/oem-usb.

3.在一个创建好的项目中,在上方工具栏中找到APP这个按钮,选择Edit Configurations。如图所示:

%title插图%num

4.在弹出的对话框中,找到“ Deployment Target Options” 并选择“ USB Device ”,然后点击确定。如图所示:

%title插图%num

做完以上操作后,就可以在真机进行调试了。*次执行需要一些时间,后续就快起来了。缺点就是需要随时携带数据线,然后真机调试的配置也较麻烦。但是真机的效率是真的高,很多问题也是在真机上更容易发现。真机调试我还是很推荐的。

四. Genymotion模拟器调试
这是我*推荐的,也是目前比较受欢迎的虚拟机。Genymotion虚拟机可以模拟Galaxy、SAMSUNG、SONY、HTC等主流手机,效率很高,使用简单方便。
1.安装Genymotion前需要安装VirtualBox(官网有提供VirtualBox和Genymotion整合包)
下载地址:https://www.virtualbox.org/wiki/Downloads
傻瓜式安装,不赘述。
2.安装Genymotion
下载地址:https://www.genymotion.com/download
如图,有withVirtualBox版本,我们选择这个合集包,就不用单独下载上面说的VirtualBox。

%title插图%num

安装完后在Genymotion中新建一个模拟器。

%title插图%num

模拟器建完后,保持模拟器开机状态。我的Android Studio是可以自动识别到Genymotion的模拟器的。

%title插图%num

%title插图%num

如果你的无法自动识别到,可以下载Android Studio中Genymotion的插件。左上角File–>setting–>Plugins–>Genymotion

%title插图%num
总结
由于我正在学习Andrio开发,经常需要调试。刚开始学习的时候,确实使用的是AVD,后面写得多了,比较卡顿。老师、同学都推荐使用Genymotion,它占用内存不多,效率比较高,使用便捷,所以一直都在用它。后期如果有实训项目,可能会考虑更多地使用真机开发,毕竟真实的环境还是有优势的。

解决Android Studio模拟器卡慢的问题

Android 模拟器一直以运行速度慢著称, 本文介绍使用 Intel HAXM 技术为 Android 模拟器加速, 使模拟器运行度媲美真机, 彻底解决模拟器运行慢的问题。

Intel HAXM (Hardware Accelerated Execution Manager) 使用基于 Intel(R) Virtualization Technology (VT) 的硬件加速, 因此需要 CPU 支持 VT , 而且仅限于 Intel CPU, 与 AMD CPU 无缘, Intel HAXM 的描述如下:

  • 使用 Intel VT 技术;
  • 为 Android x86 虚拟设备的模拟运行提供硬件加速;
  • 与 Android SDK 集成;

硬件要求:

  • 支持 VT-x, EM64T 以及 Execute Disable Bit 的 Intel 处理器;
  • 至少 1GB 可用内存

Intel HAXM下载和安装

启动android SDK,在Extras目录的*下边,勾选Intel HAXM项,并下载。

%title插图%num

**下载完成后,还需要运行安装程序来进行安装**,HAXM的下载目录为: Sdk\extras\intel\Hardware_Accelerated_Execution_Manager ,运行 intelhaxm-android.exe 进行安装, 根据屏幕提示,一步一步安装即可

%title插图%num

Virtualization Technology 错误

如果在安装过程中出现如下错误,因为之前提过Intel HAXM使用 Intel VT 技术,所以需要打BOIS里开启Virtualization Technology项。

%title插图%num

this computer meets the requirements for haxm but intel virtualization technologyVT-x is not turned onHAXM cannot be installed until VT-x is enable .
please refer to the intel HAXM documentation for more information

%title插图%num

设置成功后,重新运行安装文件,在控制台中输入sc query intelhaxm。出现下图即为成功!!

%title插图%num

下载和使用Android x86镜像

Android 5.0.1的API根据操作系统不同提供了32位和64位的Android x86镜像文件,这里进行自行选择。

%title插图%num

关于使用 Android x86 镜像,在新建或者编辑 Android 模拟器选项卡时, 将模拟器 CPU/ABI 设置为 Intel Atom X86 ,如果是64位系统可以选择,Intel Atom X86_64。

%title插图%num

如果上面的步骤都进行了正确的设置,Android 模拟器,几乎能在30秒内启动完成!下面让我们看看Android 5.0.1的界面吧!

%title插图%num

Android Studio模拟器联网

利用Android Studio自带的模拟器联网。
Android Studio自带的模拟器本身默认是不能上网的,因为默认DNS为10.0.2.3,使用这个DNS是不能上网的。

网上很多帖子已经给出了解决办法,但是会遇到下面这种情况:

%title插图%num

通过继续查询得知:通过shell命令设置(获取)IP、网关、dns信息,需要获取root权限。

下面给出打开Android Studio自带的模拟器联网功能的完整步骤(亲测可行):
首先把模拟器打开,然后需要把SDK文件夹下的platform-tools添加到系统变量中,至于怎么添加系统变量,请自行百度。

怎么检查自己是否添加成功呢,在cmd中输入:adb shell 回车,如果是下图的话代表添加成功。如果成功的话,输入exit即可退出adb。

%title插图%num

重点来了,进入到cmd后,需要输入adb root 将模拟器root一下,才能更改DNS。然后再输入adb shell。

接下来输入getprop获取模拟器系统属性。找到[net.eth0.dns1]这一项,发现后面为10.0.2.3,接下来我们输入setprop net.eth0.dns1 192.168.1.1.后面的ip也可为其他,不过我没尝试。(没有[net.eth0.dns1]的话因为系统是Android9.0及以上,建议换到8.0及以下)

网上很多帖子是[net.dns1],不过我的模拟器上面dns1前面有eth0,这个大家根据自己的模拟器情况决定。

然后打开模拟器的数据连接。即可使用模拟器的谷歌浏览器上网。

网友出现的问题:

1、adbd cannot run as root in production builds
解决办法:原因是模拟器的Android系统是Google Play,应该选用Google API。

%title插图%num %title插图%num
PS:我记得我之前root过一次,但好像是每次打开电脑要修改模拟器重要配置的话就需要root,总之一句话,root就完事了。

 

翠花上酸菜丶:adbd cannot run as root in production builds
翠花上酸菜丶回复BaldStrong:嗯嗯,谢谢
BaldStrong回复:找到原因了 https://icetutor.com/question/adb-root-is-not-working-on-emulator-cannot-run-as-root-in-production-builds/
BaldStrong回复:给你找了几个教程不知能否帮到你 https://blog.csdn.net/hlllmr1314/article/details/52217128 https://www.jianshu.com/p/e0646fbb72ed
AnyPlayer~:这样重新打开模拟器都需要进行设置,有没有其他的方法可以一劳永逸 ?
方峰同学回复:这个我按照文中方法试了,只需要设置一次,重启也还有效。
BaldStrong回复: 这个我之前就设置了一次,现在不搞Android了,我刚查了下,你可以试试把模拟器adb永久root后再设置dns,我没试,仅提供一个思路。
AnyPlayer~回复BaldStrong:没有,我重新启动模拟器就失效了
BaldStrong回复: 如果不删除这个模拟器的话,只设置一次就行。
weixin_41232585:我是Windows10,不知道是否和系统有关,getprop后能得到很多数据,但根本看不见模拟器的dns,root也不行,更别说设置了
BaldStrong回复shirwee_xu:没有[net.eth0.dns1]的话因为系统是Android9.0及以上,建议换到8.0及以下
shirwee_xu回复BaldStrong: 同没有模拟器的dns
BaldStrong回复Shirlyna:输入getprop,返回很多行,你仔细看一下有没有dns开头的,如果确实没有可以加我QQ给我截图看下:1421692663
Shirlyna回复BaldStrong:配置了sdk环境变量,进入adb一样没有dns
qq_42696259回复:我也是,根本看不见dns,呜呜呜
BaldStrong回复:你可以试着把SDK文件夹下的platform-tools添加到系统变量,不行的话百度下 进入adb 的步骤。
weixin_41232585回复BaldStrong:没加,在cmd用cd跳进去的,一样的效果吧
BaldStrong回复:你之前在Android Studio里面运行过模拟器吧?把SDK文件夹下的platform-tools添加到系统变量了吧?
友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速