导航:首页 > 操作系统 > android的deviceattr

android的deviceattr

发布时间:2022-08-18 21:26:39

㈠ 如何安装android SDK和设置ADB

Ubuntu电脑安装Android SDK/ADB

第一步,你要下载linux版Android SDK的安装或文件包,然后你需要从Android SDK Manager内下载Platform Tools
Package

请从Google官方获取Android
SDK安装或文件包,通常情况,你下载的文件名为android-sdk_rxx-linux.tgz的形式,rxx代表版本,比如,r16版,即android-sdk_r16-linux.tgz,r24版,即android-sdk_r24-linux.tgz

请放置Android SDK安装或文件包在你的用户主目录

在你的Ubuntu电脑上打开终端窗口

解压Android SDK文件:
cd ~
tar -zxvf android-sdk_r16-linux.tgz

在~/android-sdk-linux/tools字目录,有一个叫做android的可执行文件,尽管名字是android,但它实际上是Android
SDK Manager

运行Android SDK Manager:
./~/android-sdk-linux/tools/android

选择Android SDK
Tools与Android SDK Platform-tools项,点Install
packages安装Platform Tools
Package工具包。包括ADB与Fastboot可执行的文件在内的工具包都会被下载,由于下载的文件较多而需要一定的时间,你能去喝点东西

你下载的Platform Tools
Package工具包文件将位于新创建的~/android-sdk-linux/platform-tools目录


第二步,修改ADB与Fastboot可执行文件的默认PATH路径环境。PATH环境变量可以是在~/.profile(或~
/.bash_profile)或者~/.bashrc文件内修改,~/.profile文件是读取所有交互式Shell的登录,~/.bashrc文件
读取所有非交互式Shell的登录(如sftp),在大多数默认情况下,~/.profile文件导入所有~/.bashrc文件的设置。PATH命令
定的改变必须包括/android-sdk-linux/tools与/android-sdk-linux/platform-tools目录

kevdog的PATH命令设定通过Ubuntu系统内初始的默认编辑器Gedit在~/.bashrc文件底部增加了一行:
export
PATH=${PATH}:${HOME}/android-sdk-linux/tools:${HOME}/android-sdk-linux/platform-tools

第三步,我们需要为Ubuntu创建udev设备管理规则,从而让设备在通过USB端口连接到电脑时能被正确地识别

将设备连接到电脑,然后执行命令:
lsusb

你会看到类似于下面的输出信息:
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation
2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004
Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001:
ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 063: ID 04e8:6860
Samsung Electronics Co., Ltd

由于kevdog的设备是Samsung的某款设备,因此你能看到相应的识别信息:
Bus 001 Device 063: ID
04e8:6860 Samsung Electronics Co., Ltd

我们来解释下上面的识别信息:

Bus 001 Device
063,设备端的名称是/dev/bus/usb/001/063,即这个信息可以帮助我们确定设备端的名称

04e8,vendorID,即供货商编号

6860,proctID,即产品编号


使用设备端的名称/dev/bus/usb/001/063可以让我们查询设备的属性,查询这些属性有时很有必要,因为udev设备管理匹配设备是基于
特定标准的。为此,我们需要一个正确的udev设备匹配规则集,这个过程的第一步就是查询能被连接或插入到我们规则集的准则,这可以通过udevadm程
序来实现,并且有两种方式现,它们生成的输出信息为我们的设备构建udev设备管理规则:

udevadm查询udev设备管理规则方法1:
udevadm info -q all -n <name of device
node>
根据原作者的实际情况,设备端名称是/dev/bus/usb/001/063,因此命令是:

udevadm info -q all -n /dev/bus/usb/001/063
你会看到类似于下面的输出信息:

$ udevadm info -q all -n /dev/bus/usb/001/063
P:
/devices/pci0000:00/0000:00:1d.7/usb1/1-8
N: bus/usb/001/063
S:
libmtp-1-8
S: GalaxyNexus
E: UDEV_LOG=3
E:
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb1/1-8
E: MAJOR=189
E:
MINOR=62
E: DEVNAME=/dev/bus/usb/001/063
E: DEVTYPE=usb_device
E:
DRIVER=usb
E: PRODUCT=4e8/6860/216
E: TYPE=0/0/0
E: BUSNUM=001

E: DEVNUM=063
E: SUBSYSTEM=usb
E: ID_MTP_DEVICE=1
E:
ID_MEDIA_PLAYER=samsung_galaxy-s2
E: ID_VENDOR=samsung
E:
ID_VENDOR_ENC=samsung
E: ID_VENDOR_ID=04e8
E: ID_MODEL=Galaxy
E:
ID_MODEL_ENC=Galaxy
E: ID_MODEL_ID=6860
E: ID_REVISION=0216
E:
ID_SERIAL=samsung_Galaxy_0146B06501005018
E:
ID_SERIAL_SHORT=0146B06501005018
E: ID_BUS=usb
E:
ID_USB_INTERFACES=:ffff00:ff4201:
E: DEVLINKS=/dev/libmtp-1-8
/dev/GalaxyNexus
E: TAGS=:udev-acl:
我们使用的规则从有E:(E=ENV=Device
Property设备属性值)的行开始

udevadm查询udev设备管理规则方法2:
udevadm info -a -p $(udevadm info -q path
-n <name of device node>)

根据原作者的实际情况,设备端名称是/dev/bus/usb/001/063,因此命令是:
udevadm info -a -p
$(udevadm info -q path -n /dev/bus/usb/001/063)
你会看到类似于下面的输出信息:

$ udevadm info -a -p $(udevadm info -q path -n /dev/bus/usb/001/063)

Udevadm info starts with the device specified by the devpath and then

walks up the chain of parent devices. It prints for every device
found,
all possible attributes in the udev rules key format.
A rule to match, can
be composed by the attributes of the device
and the attributes from one
single parent device.
looking at device
'/devices/pci0000:00/0000:00:1d.7/usb1/1-8':
KERNEL=="1-8"

SUBSYSTEM=="usb"
DRIVER=="usb"
ATTR{configuration}==""

ATTR{bNumInterfaces}==" 2"
ATTR{bConfigurationValue}=="1"

ATTR{bmAttributes}=="80"
ATTR{bMaxPower}=="500mA"
ATTR{urbnum}=="29"

ATTR{idVendor}=="04e8"
ATTR{idProct}=="6860"

ATTR{bcdDevice}=="0216"
ATTR{bDeviceClass}=="00"

ATTR{bDeviceSubClass}=="00"
ATTR{bDeviceProtocol}=="00"

ATTR{bNumConfigurations}=="1"
ATTR{bMaxPacketSize0}=="64"

ATTR{speed}=="480"
ATTR{busnum}=="1"
ATTR{devnum}=="63"

ATTR{devpath}=="8"
ATTR{version}==" 2.00"
ATTR{maxchild}=="0"

ATTR{quirks}=="0x0"
ATTR{avoid_reset_quirk}=="0"

ATTR{authorized}=="1"
ATTR{manufacturer}=="samsung"

ATTR{proct}=="Galaxy"
ATTR{serial}=="0146B06501005018"

looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1':

KERNELS=="usb1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"

ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"

ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"

ATTRS{bMaxPower}==" 0mA"
ATTRS{urbnum}=="1403"

ATTRS{idVendor}=="1d6b"
ATTRS{idProct}=="0002"

ATTRS{bcdDevice}=="0300"
ATTRS{bDeviceClass}=="09"

ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"

ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"

ATTRS{speed}=="480"
ATTRS{busnum}=="1"
ATTRS{devnum}=="1"

ATTRS{devpath}=="0"
ATTRS{version}==" 2.00"
ATTRS{maxchild}=="8"

ATTRS{quirks}=="0x0"
ATTRS{avoid_reset_quirk}=="0"

ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Linux 3.0.0-14-generic
ehci_hcd"
ATTRS{proct}=="EHCI Host Controller"

ATTRS{serial}=="0000:00:1d.7"
ATTRS{authorized_default}=="1"

looking at parent device '/devices/pci0000:00/0000:00:1d.7':

KERNELS=="0000:00:1d.7"
SUBSYSTEMS=="pci"
DRIVERS=="ehci_hcd"

ATTRS{vendor}=="0x8086"
ATTRS{device}=="0x27cc"

ATTRS{subsystem_vendor}=="0x103c"
ATTRS{subsystem_device}=="0x3010"

ATTRS{class}=="0x0c0320"
ATTRS{irq}=="20"
ATTRS{local_cpus}=="ff"

ATTRS{local_cpulist}=="0-7"
ATTRS{dma_mask_bits}=="32"

ATTRS{consistent_dma_mask_bits}=="32"
ATTRS{broken_parity_status}=="0"

ATTRS{msi_bus}==""
ATTRS{companion}==""
looking at
parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"

SUBSYSTEMS==""
DRIVERS==""
我们使用的规则从有ATTRS(ATTRS=Device
Attributes设备属性)的行开始

不管是ENV,还是ATTRS,我们可以构建一个udev设备管理规则集。规则集的名称可以随意,根据原作者的意图,我们叫做51-android.rules:

你能这样建立规则集文件:
gksu gedit /etc/udev/rules.d/51-android.rules

之后,请在规则集文件中加入相关的规则,以原作者的规则来看,注意是一行一个:
SUBSYSTEM=="usb",
ENV{ID_VENDOR_ID}=="04e8", ENV{ID_MODEL}=="Galaxy", MODE="0666",
SYMLINK+="GalaxyNexus"
SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="04e8",
ENV{ID_MODEL_ID}=="6860", MODE="0666", SYMLINK+="GalaxyNexus"

SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProct}=="6860",
ATTR{proct}=="Galaxy" MODE="0666", SYMLINK+="GalaxyNexus"

如上面所加的规则,这些规则匹配准则是SUBSYSTEM,
ENV,ATTR,它只会修改设备的模式MODE(0666=rw-rw-rw-)与创建链接于/dev/GalaxyNexus的GalaxyNexus标识。当然,更多的指令可以分配给设备,如插入或移除设备时的执行命令,你能这样指定指令:

ACTION=="add", RUN+="<name of action>"
ACTION==”remove”,
RUN+="<name of action>"
例如,我们要设定设备在插入或弹出时播放一个声音或MP3文件,可以如下指令设定:

ACTION=="add", RUN+="/usr/local/bin/NexusMount.sh"

ACTION==”remove”, RUN+="/usr/local/bin/NexusUnmount.sh"

需要注意的是,每个ACTION指令设定必须在它自己的命令行;目录必须正确;指令可以是多重设定

一旦规则构建完成,我们需要保存/etc/udev/rules.d/51-android.rules规则文件

在你执行规则集前,测试一下通常是一个好主意,因为那样你能很容易地找出编写规则集的错误:

你能使用udevadm工具简单地完成规则集的测试:
udevadm info -q path -n d=<device
name>
根据原作者的设备端名/dev/bus/usb/001/063,测试行为:

udevadm test --action="SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="04e8",
ENV{ID_MODEL}=="Galaxy" MODE="0666", SYMLINK+="GalaxyNexus"" $(udevadm info -q
path -n /dev/bus/usb/001/063)
虽然测试输出行相当长,两行输出信息正确地识别规则集的指令设定:

udev_rules_apply_to_event: MODE 0666
/etc/udev/rules.d/51-android.rules:1
udev_rules_apply_to_event: LINK
'GalaxyNexus' /etc/udev/rules.d/51-android.rules:1

一旦你确认了规则集正确,请重启udev设备管理服务:
sudo service udev restart

第四步,退出电脑的登录,然后重新登录回

在设备插入的情况下,执行ADB命令,如确认设备连接:
$ adb devices

你会看到设备识别号信息,根据原作者的设备,它是
0146B06501005018 device

如果你的设备已启动在Fastboot模式,许多设备不启动可能也行,你能执行Fastboot命令,如标准的Fastboot设备:
$
fastboot devices

㈡ android开发中shape图形中如何引用attr属性,在做主题切换时,要达到shape图形的颜色与当前主题颜色一致

以前做主题时,貌似shape里面用attr属性会出错,建议你多个theme对应多个shape

㈢ 从源码中浅析Android中怎么利用attrs和styles定义控件

1.attrs.xml:
我们知道Android的源码中有attrs.xml这个文件,这个文件实际上定义了所有的控件的属性,就是我们在布局文件中设置的各类属性
你可以找到attrs.xml这个文件,打开它,全选,右键->Show In->OutLine。可以看到整个文件的解构

我们大概可以看出里面是Android中的各种属性的声明,比如textStyle这个属性是这样定义的:
java代码
<!-- Default text typeface style. -->
<attr name="textStyle">
<flag name="normal" value="0" />
<flag name="bold" value="1" />
<flag name="italic" value="2" />
</attr>
那么现在你知道,我们在写android:textStyle的时候为什么会出现normal,bold和italic这3个东西了吧,就是定义在这个地方。
再看看textColor:
Java代码
<!-- Color of text (usually same as colorForeground). -->
<attr name="textColor" format="reference|color" />
format的意思是说:这个textColor可以以两种方式设置,要么是关联一个值,要么是直接设置一个颜色的RGB值,这个不难理解,因为我们可以平时也这样做过。

也就是说我们平时在布局文件中所使用的各类控件的属性都定义在这里面,那么这个文件,除了定义这些属性外还定义了各种具体的组件,比如TextView,Button,SeekBar等所具有的各种特有的属性
比如SeekBar:

Java代码
<declare-styleable name="SeekBar">
<!-- Draws the thumb on a seekbar. -->
<attr name="thumb" format="reference" />
<!-- An offset for the thumb that allows it to extend out of the range of the track. -->
<attr name="thumbOffset" format="dimension" />
</declare-styleable>
也许你会问SeekBar的background,等属性怎么没有看到?这是因为Android中几乎所有的组件都是从View中继承下来的,SeekBar自然也不例外,而background这个属性几乎每个控件都有,因此被定义到了View中,你可以在declare-styleable:View中找到它。

总结下,也就是说attrs.xml这个文件定义了布局文件中的各种属性attr:***,以及每种控件特有的属性declare-styleable:***

2.styles.xml:
刚才的attrs.xml定义的是组件的属性,现在要说的style则是针对这些属性所设置的值,一些默认的值。

这个是SeekBar的样式,我们可以看到,这里面设置了一个SeekBar的默认的样式,即为attrs.xml文件中的各种属性设置初始值
Java代码
<style name="Widget.SeekBar">
<item name="android:indeterminateOnly">false</item>
<item name="android:progressDrawable">@android:drawable/progress_horizontal</item>
<item name="android:indeterminateDrawable">@android:drawable/progress_horizontal</item>
<item name="android:minHeight">20dip</item>
<item name="android:maxHeight">20dip</item>
<item name="android:thumb">@android:drawable/seek_thumb</item>
<item name="android:thumbOffset">8dip</item>
<item name="android:focusable">true</item>
</style>
这个是Button的样式:
Java代码
<style name="Widget.Button">
<item name="android:background">@android:drawable/btn_default</item>
<item name="android:focusable">true</item>
<item name="android:clickable">true</item>
<item name="android:textAppearance">?android:attr/textAppearanceSmallInverse</item>
<item name="android:textColor">@android:color/primary_text_light</item>
<item name="android:gravity">center_vertical|center_horizontal</item>
</style>

有了属性和值,但是这些东西是如何关联到一起的呢?它们如何被android的framework层所识别呢?

3.组件的源码
我们看下TextView的源码:
Java代码
public TextView(Context context) {
this(context, null);
}//这个构造器用来给用户调用,比如new TextView(this);

public TextView(Context context,
AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.textViewStyle);
}

public TextView(Context context,
AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);//为用户自定义的TextView设置默认的style
mText = "";

//设置画笔
mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
mTextPaint.density = getResources().getDisplayMetrics().density;
mTextPaint.setCompatibilityScaling(
getResources().getCompatibilityInfo().applicationScale);

mHighlightPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mHighlightPaint.setCompatibilityScaling(
getResources().getCompatibilityInfo().applicationScale);

mMovement = getDefaultMovementMethod();
mTransformation = null;

//attrs中包含了这个TextView控件在布局文件中定义的属性,比如android:background,android:layout_width等
//com.android.internal.R.styleable.TextView中包含了TextView中的针对attrs中的属性的默认的值
//也就是说这个地方能够将布局文件中设置的属性获取出来,保存到一个TypeArray中,为这个控件初始化各个属性
TypedArray a =
context.obtainStyledAttributes(
attrs, com.android.internal.R.styleable.TextView, defStyle, 0);

int textColorHighlight = 0;
ColorStateList textColor = null;
ColorStateList textColorHint = null;
ColorStateList textColorLink = null;
int textSize = 15;
int typefaceIndex = -1;
int styleIndex = -1;

/*
* Look the appearance up without checking first if it exists because
* almost every TextView has one and it greatly simplifies the logic
* to be able to parse the appearance first and then let specific tags
* for this View override it.
*/
TypedArray appearance = null;
//TextView_textAppearance不太了解为什么要这样做?难道是为了设置TextView的一些默认的属性?
int ap = a.getResourceId(com.android.internal.R.styleable.TextView_textAppearance, -1);
if (ap != -1) {
appearance = context.obtainStyledAttributes(ap,
com.android.internal.R.styleable.
TextAppearance);
}
if (appearance != null) {
int n = appearance.getIndexCount();
for (int i = 0; i < n; i++) {
int attr = appearance.getIndex(i);

switch (attr) {
case com.android.internal.R.styleable.TextAppearance_textColorHighlight:
textColorHighlight = appearance.getColor(attr, textColorHighlight);
break;

case com.android.internal.R.styleable.TextAppearance_textColor:
textColor = appearance.getColorStateList(attr);
break;

case com.android.internal.R.styleable.TextAppearance_textColorHint:
textColorHint = appearance.getColorStateList(attr);
break;

case com.android.internal.R.styleable.TextAppearance_textColorLink:
textColorLink = appearance.getColorStateList(attr);
break;

case com.android.internal.R.styleable.TextAppearance_textSize:
textSize = appearance.getDimensionPixelSize(attr, textSize);
break;

case com.android.internal.R.styleable.TextAppearance_typeface:
typefaceIndex = appearance.getInt(attr, -1);
break;

case com.android.internal.R.styleable.TextAppearance_textStyle:
styleIndex = appearance.getInt(attr, -1);
break;
}
}

appearance.recycle();
}
//各类属性
boolean editable = getDefaultEditable();
CharSequence inputMethod = null;
int numeric = 0;
CharSequence digits = null;
boolean phone = false;
boolean autotext = false;
int autocap = -1;
int buffertype = 0;
boolean selectallonfocus = false;
Drawable drawableLeft = null, drawableTop = null, drawableRight = null,
drawableBottom = null;
int drawablePadding = 0;
int ellipsize = -1;
boolean singleLine = false;
int maxlength = -1;
CharSequence text = "";
CharSequence hint = null;
int shadowcolor = 0;
float dx = 0, dy = 0, r = 0;
boolean password = false;
int inputType = EditorInfo.TYPE_NULL;

int n = a.getIndexCount();
for (int i = 0; i < n; i++) {
int attr = a.getIndex(i);
//通过switch语句将用户设置的,以及默认的属性读取出来并初始化
switch (attr) {
case com.android.internal.R.styleable.TextView_editable:
editable = a.getBoolean(attr, editable);
break;

case com.android.internal.R.styleable.TextView_inputMethod:
inputMethod = a.getText(attr);
break;

case com.android.internal.R.styleable.TextView_numeric:
numeric = a.getInt(attr, numeric);
break;

//更多的case语句...

case com.android.internal.R.styleable.TextView_textSize:
textSize = a.getDimensionPixelSize(attr, textSize);//设置当前用户所设置的字体大小
break;

case com.android.internal.R.styleable.TextView_typeface:
typefaceIndex = a.getInt(attr, typefaceIndex);
break;
//更多的case语句...
}

通过上面的代码大概可以知道,每个组件基本都有3个构造器,其中只传递一个Context上下文的那个构造器一般用来在java代码中实例化使用。
比如你可以
Java代码
TextView tv = new TextView(context);
来实例化一个组件。

最终调用的是第3个构造器
Java代码
public TextView(Context context,
AttributeSet attrs,
int defStyle)

在这个构造器中为你设置了默认的属性attrs和值styles。关键不在这里,而是后面通过使用下面的代码
Java代码
TypedArray a =
context.obtainStyledAttributes(
attrs, com.android.internal.R.styleable.TextView, defStyle, 0);
来将属性和值获取出来,放到一个TypeArray中,然后再利用一个switch语句将里面的值取出来。再利用这些值来初始化各个属性。这个View最终利用这些属性将这个控件绘制出来。
如果你在布局文件中定义的一个View的话,那么你定义的值,会被传递给构造器中的attrs和styles。也是利用同样的方式来获取出你定义的值,并根据你定义的值来绘制你想要的控件。
再比如其实Button和EditText都是继承自TextView。看上去两个控件似乎差异很大,其实不然。Button的源码其实相比TextView变化的只是style而已:

阅读全文

与android的deviceattr相关的资料

热点内容
去房产局办解压要多久 浏览:723
新建新建文件夹2 浏览:84
加密锁厂家联系方式 浏览:469
怎么执行脚本语言不用编译 浏览:432
目前使用方舟编译的程序 浏览:311
无牙仔电影有几部 浏览:57
外国电影,男人在外星流浪, 浏览:722
用plc编程时基本思路 浏览:474
my是什么app的缩写 浏览:102
性迷宫类似电影 浏览:446
都市警察异能小说主角母女全收 浏览:724
阿甘的英文名 浏览:263
美女情趣体验师 一条震动内裤引发的韩国电影 浏览:673
一女多男主现代小说有哪些 浏览:42
李采谭所有电影 浏览:478
杀破狼2结局都死了吗 浏览:437
主角叫陆宇的小说排行榜 浏览:944
程序员害怕去酒吧 浏览:121
有部很肉的写大学的小说 浏览:421
鬼习班 浏览:699