Android手机端为什么要用到数据库数据连接到手机

查看:11485|回复:6
最近正在学习以及尝试Android手机开发,属于WebService 一类的开发。
由于要用到数据库,不知道数据该存放在手机端还是服务器端,我认为如果使用SQLite数据库的话,数据就存放在客户端了,如果使用mysql的话呢,就放在服务器断了,我们用了mysql放在服务器端,最近看大家都在议论SQLite,希望高手给讲解一下这两种使用方式的区别
问题描述详细
初级工程师
如果是手机端的话 只能是SQLite数据库 就看你的数据量大不大了 如果数据量非常大的话 那肯定是要存在 服务器端了 毕竟是手机开发SQLite 是个轻量级的数据库&&不是PC开发&&内存是有限制的。。希望可以帮助到楼主噢 ~哇咔咔!!
嗯 说的是&&不过我们开发的是那种服务端通过类似于网站后台那样子添加数据,在手机端通过通信功能获取信息,所以我们试用了mysql数据库,,,:(pdd_22):
初级工程师
那就是mysql吧~~~&&哇咔咔!!! 希望常来这里
嗯嗯 ,那当然 必须常来啊 呵呵不断学习嘛
Stay Hungry, Stay Foolish!
大智若愚,求职若渴Android 建立手机与手表数据同步机制总结
Wear 数据同步机制总结
当手机与手表建立蓝牙连接之后,数据就可以通过Google Play Service进行传输。
同步数据对象Data Item
DataItem提供手机与手表数据存储的自动同步,一个DataItem对象由其创建者与路径组成的URI所确定。一个DataItem对象为手机和手表提供了一个数据通路,开发者通过改变指定的DataItem实现手机和手表的数据自动同步。
访问数据层API
DataItem可以提供手机和手表数据的保存,改变该对象的操作则依赖数据层API(the Data Layer APIs),也就是说,在改变DataItem数据之前,需要先访问数据层,获得一个GoogleApiClient实例,从而能够使用数据层API。
下面是实例化GoogleApiClient的代码
GoogleApiClient mGoogleAppiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(new ConnectionCallbacks() {
public void onConnected(Bundle connectionHint) {
Log.d(TAG, "onConnected: " + connectionHint);
// Now you canuse the data layer API
public void onConnectionSuspended(int cause) {
Log.d(TAG, "onConnectionSuspended: " + cause);
.addOnConnectionFailedListener(new OnConnectionFailedListener() {
public void onConnectionFailed(ConnectionResult result) {
Log.d(TAG, "onConnectionFailed: " + result);
.addApi(Wearable.API)
在使用数据层Api的之前,需要先调用connect()方法,如果成功则会回调onConnected()方法,否则回调onConnectionFailed()。
同步DataItems
GoogleApiClient连接成功后,就可以通过DataItem进行数据同步了。
一个DataItem包括连个部分,一个是Payload,这是一个字节数组,可以通过序列化或者反序列化保存需要的数据类型和对象;另一个是Path,这是一个唯一的字符串,由反斜杠开头,区别不同的DataItem。
通常在开发过程中是使用DataMap类实现DataItem接口,类似Bundle键值对的存储方式。
下面是使用的DataMap步骤:
创建PutDataMapRequest对象,为DataItem设置path值;
使用put…()方法为DataMap设置需要的数据;
调用PutDataMapRequest.asPutDataRequest()创建PutDataRequest对象;
调用DataApi.putDataItem()请求创建DataItem。
如果此时手机和手表没有建立连接,则会将数据保存在Buffer中,等下次连接后会发送到另一方。
下面是使用DataMap创建DataItem的方法
PutDataMapRequest dataMap = PutDataMapRequest.create("/count");
dataMap.getDataMap().putInt(COUNT_KEY, count++);
PutDataRequest request = dataMap.asPutDataRequest();
PendingResult pendingResult = Wearable.DataApi
.putDataItem(mGoogleApiClient, request);
监听数据层事件
由于数据层同步或发送的数据连接手机和手表,所以经常需要获知何时DataItem被创建以及手机与手表什么时候连接或断开等事件。
监听数据层时间可以使用两种方式,一种是继承WearableListenerService,一种是在Activity中实现DataApi.DataListener。无论使用两种方式的哪种,可以重写其需要的回调方法执行相应的操作。
使用WearableListenerService
该service在手机和手表端都可以使用,如果在一方不需要监听数据层时间可以不适用该服务。
例如,可以在手机端接收和设置DataItem,然后在手表端实现该服务,监听数据层的事件,从而修改手表的UI。
WearableListenerService提供回调接口onDataChanged()处理DataItem的变化,当DataItem被创建、更改或删除,手机和手表的该事件将被触发。
下面是使用WearableListenerService的方法
创建一个类继承WearableListenerService;
监听需要的事件,如onDataChanged();
在配置文件中声明一个intentfilter通知系统监听WearableListenerService,这样在系统需要的时候就会绑定WearableListenerService。
下面代码是一个简单的WearableListenerService实现。
public class DataLayerListenerService extends WearableListenerService {
private static final String TAG = "DataLayerSample";
private static final String START_ACTIVITY_PATH = "/start-activity";
private static final String DATA_ITEM_RECEIVED_PATH = "/data-item-received";
public void onDataChanged(DataEventBuffer dataEvents) {
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "onDataChanged: " + dataEvents);
final List events = FreezableUtils
.freezeIterable(dataEvents);
GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
ConnectionResult connectionResult =
googleApiClient.blockingConnect(30, TimeUnit.SECONDS);
if (!connectionResult.isSuccess()) {
Log.e(TAG, "Failed to connect to GoogleApiClient.");
// Loop through the events and send a message
/ to the node that created the data item.
for (DataEvent event : events) {
Uri uri = event.getDataItem().getUri();
// Get the node id from the host value of the URI
String nodeId = uri.getHost();
// Set the data of the message to be the bytes of the URI.
byte[] payload = uri.toString().getBytes();
// Send the RPC
Wearable.MessageApi.sendMessage(googleApiClient, nodeId,
DATA_ITEM_RECEIVED_PATH, payload);
下面代码是配置文件中声明的intentfilter
使用DataApi.DataListener监听数据层
如果不需要后台长时间进行监听,可以使用DataApi.DataListener进行监听,下面是使用该方式的方法。
使用DataApi.DataListener接口
在onCreate中创建 GoogleApiClient,访问数据层API
在onStart中调用connect()连接Google PlayService
但连接上GooglePlay Service后,系统调用onConnected(),通知Google Play service该activity监听数据层事件
在onStop中调用DataApi.removeListener()
实现 onDataChanged()回调
下面是使用DataApi.DataListener监听数据层事件的代码
public class MainActivity extends Activity implements
DataApi.DataListener, ConnectionCallbacks, OnConnectionFailedListener {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
protected void onStart() {
super.onStart();
if (!mResolvingError) {
mGoogleApiClient.connect();
public void onConnected(Bundle connectionHint) {
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Connected to Google Api Service");
Wearable.DataApi.addListener(mGoogleApiClient, this);
protected void onStop() {
if (null != mGoogleApiClient && mGoogleApiClient.isConnected()) {
Wearable.DataApi.removeListener(mGoogleApiClient, this);
mGoogleApiClient.disconnect();
super.onStop();
public void onDataChanged(DataEventBuffer dataEvents) {
for (DataEvent event : dataEvents) {
if (event.getType() == DataEvent.TYPE_DELETED) {
Log.d(TAG, "DataItem deleted: " +
event.getDataItem().getUri());
} else if (event.getType() == DataEvent.TYPE_CHANGED) {
Log.d(TAG, "DataItem changed: " + event.getDataItem().getUri());
获取手机通知大家的服务
Android提供了一个服务类接口NotificationListenerService,继承该服务,可以获取手机中应用发起的通知,在配置文件中需要添加如下声明和权限
这样在系统设置中会出现一个是否允许该服务捕获通知的选项,在设置--安全与隐私--通知读取权限
该服务有两个抽象方法需要实现,分别是当有通知发起与通知被销毁,都会触发其回调方法。
public class NotificationCollectorService extends NotificationListenerService {
public void onNotificationPosted(StatusBarNotification sbn) {
public void onNotificationRemoved(StatusBarNotification sbn) {
也就是说当系统发现某应用产生通知或者用户删除某通知,都会回调该服务的这两个函数,函数的参数StatusBarNotification包含着该通知的具体信息。
如果是在Android Wear开发中,使用该方法捕获手机的通知,然后同步到手表中,就是使用该服务进行的中转。
接收到的通知以StatusBarNotification对象形式传递给回调函数onNotificationPosted(),
调用StatusBarNotification对象的公共方法,分别取出StatusBarNotification中的PackageName、Tag、Id、notification对象和PostTime,通过这些值去创建DataItem。 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
一种android系统访问sql server数据库的方法
下载积分:1000
内容提示:一种android系统访问sql server数据库的方法
文档格式:DOC|
浏览次数:846|
上传日期: 10:33:01|
文档星级:
全文阅读已结束,如果下载本文需要使用
 1000 积分
下载此文档
该用户还上传了这些文档
一种android系统访问sql server数据库的方法
关注微信公众号Android开发笔记之: 数据存储方式详解
字体:[ ] 类型:转载 时间:
本篇文章是对Android中数据存储方式进行了详细的分析介绍,需要的朋友参考下
无论是神马平台,神马开发环境,神马软件程序,数据都是核心。对于开发平台来讲,如果对数据的存储有良好的支持,那么对应用程序的开发将会有很大的促进作用。总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络。其中文件和数据库可能用的稍多一些,文件用起来较为方便,程序可以自己定义格式;数据库用起稍烦锁一些,但它有它的优点,比如在海量数据时性能优越,有查询功能,可以加密,可以加锁,可以跨应用,跨平台等等;网络,则用于比较重要的事情,比如科研,勘探,航空等实时采集到的数据需要马上通过网络传输到数据处理中心进行存储并进行处理。对于Android平台来讲,它的存储方式也不外乎这几种,按方式总体来分,也是文件,数据库和网络。但从开发者的角度来讲它可以分为以下五种方式:1.SharedPreferences共享偏好2.Internal Storage内部存储空间3.External Storage外部存储空间4.SQLite Database数据库5.Internet网络这几种方式各自有各自的优点和缺点,要根据不同的实际情况来选择,而无法给出统一的标准。下面就各种方式谈谈它们的优缺点,以及最合适的使用情况: 1.Shared Preferences共享偏好SharedPreferences是用来存储一些Key/Value类似的成对的基本数据类型,注意,它只能存储基本数据类型,也即int, long, boolean, String, float。事实上它完全相当于一个HashMap,唯一不同的就是HashMap中的Value可以是任何对象,而SharedPreferences中的值只能存储基本数据类型(primitive types)。对于它的使用方法,可以参考,这里不重复。如此来看,最适合SharedPreferences的地方就是保存配置信息,因为很多配置信息都是Key/Value。事实上,在Android当中SharedPreferences使用最多的地方也是用来保存配置(Settings)信息,系统中的Settings中这样,各个应用中的Settings也是这样。并且,Android中为了方便的使用SharedPreferences保存配置信息,它来专门有PreferenceActivity用来封装。也就是说如果你想在应用程序中创建配置(Settings),你可以直接使用PreferenceActivity和一些相关的专门为Preference封装的组件,而不用再直接去创建,读取和保存SharedPreference,Framework中的这些组件会为你做这些事。再谈谈一些使用SharedPreference时的技巧,它只能保存基本数据类型,但假如我想保存一个数组,怎么办?可以把数据进行处理,把它转化成一个String,取出的时候再还原就好了;再如,如想保存一个对象,怎么办,同样,可以把对象序列化成为字符序列,或转成String(Object.toString()),或是把它的HashCode(Object.hashCode())当成Value保存进去。总之,SharedPreferences使用起来十分的方便,可以灵活应用,因为它简单方便,所以能用它就尽量不要用文件或是数据库。1.Internal Storage内部存储空间所谓的内部存储与外部存储,是指是否是手机内置。手机内置的存储空间,称为内部存储,它是手机一旦出厂就无法改变,它也是手机的硬件指标之一,通常来讲手机内置存储空间越大意味着手机价格会越贵(很多地方把它称为手机内存,但我们做软件的知道,这并不准确,内存是指手机运行时存储程序,数据和指令的地方;这里应该是手机内部存储的简称为内存,而并非严格意义上的内存)。内部存储空间十分有限,因而显得可贵,所以我们要尽可能避免使用;另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。上面所谈到的Shared Preferences和下面要谈到的SQLite数据库也都是存储在内部存储空间上的。Android本身来讲是一个Linux操作系统,所以它的内部存储空间,对于应用程序和用户来讲就是“/data/data"目录。它与其他的(外部的存储)相比有着比较稳定,存储方便,操作简单,更加安全(因为可以控制访问权限)等优点。而它唯一的缺点就是它比较有限,比较可贵。虽然,可以非常容易的知道程序本身的数据所在路径,所有的应用程序的数据路径都是“/data/data/app-package-name/”,所有的程序用到的数据,比如libs库,SharedPreferences都是存放在这个路径下面。但我们在使用的时候最好不要,或是千万不要直接引用这个路径。使用内部存储主要有二个方式,一个是文件操作,一个是文件夹操作。无论哪种方式,Context中都提供了相应的函数来支持,使用Context不但操作简单方便,最重要的是Context会帮助我们管理这些文件,也可以方便帮助我们控制文件的访问权限。先来系统的说下Context中关于文件和文件夹操作的函数有哪些。a. 创建一个文件,并打开成一个文件输出流,需要提供一个String,作为文件名 代码如下:FileOutputStream& output = Context.openOutputFile(filename, Context.MODE_PRIVATE);output.write(data);// use output to write whatever you likeoutput.close();b.& 同样,想打开一个文件作为输入的话,也是只需要提供文件名
代码如下:FileInputStream input = Context.openInputFile(filename);input.read();input.close();c.& 列出所有的已创建的文件 代码如下:String[] files = Context.fileList();for (String file : files) {& Log.e(TAG, "file is " + file);}d.& 删除文件,能创建就要能够删除,当然也会提供了删除文件的接口,它也非常简单,只需要提供文件名
代码如下:if (Context.deleteFile(filename)) {&Log.e(TAG, "delete file " + filename + " sucessfully“);} else {&Log.e(TAG, "failed to delete file " + filename);}&e.& 获取文件已创建文件的路径,它返回一个文件对象用于操作路径 代码如下:File fileDir = Context.getFileDir();Log.e(TAG, "fileDir " + fileDir.getAbsolutePath();&f.& 创建一个目录,需要传入目录名称,它返回 一个文件对象用到操作路径 代码如下:File workDir = Context.getDir(dirName, Context.MODE_PRIVATE);Log.e(TAG, "workdir " + workDir.getAbsolutePath();g. 以File对象方式查看所创建文件,需要传入文件名,会返回文件对象
代码如下:File store = Context.openFileStreamPath(filename);Log.e(TAG, "store " + store.length());h. 获取Cache路径,无需要传入参数,返回文件对象
代码如下:&File cachedir = Context.getCacheDir();&Log.e(TAG, "cachedir " + cacheDir.getAbsolutePath());总结一下文件相关操作,可以得出以下三个特点:1. 文件操作只需要向函数提供文件名,所以程序自己只需要维护文件名即可; 2. 不用自己去创建文件对象和输入、输出流,提供文件名就可以返回File对象或输入输出流3. 对于路径操作返回的都是文件对象。如前所述,内部存储空间有限,可贵,安全,稳定,所以应该用来保存比较重要的数据,比如用户信息资料,口令秘码等不需要与其他应用程序共享的数据。也可以用来创建临时文件,但一定要注意及时删除。另外,对于内部存储还有一个非常重要的特点,那就是在应用程序被卸载时,应用程序在内部存储空间的文件数据将全部被删除。系统这样做的原因很简单,就是因为内部存储很有限,它必须保证它的可用性,因为一旦添满,系统将无法再正常工作。1.External Storage外部存储空间再来谈谈手机外部存储空间,与内部存储空间相对,外部存储空间是指手机出厂的时候不存在,用户在使用时候可以自由添加的外部存储介质比如TS卡,SD卡等闪存储介质。这些闪存介质由最初的空间小价格贵,到现在的大容量价格便宜,所以几乎每个支持外部存储的手机上面都有大容量(大于等于2G)的闪存卡。Android也是不例外,它完全支持外部存储介质。其实更确切的说,它是要依赖于外部存储卡的,因为对于Android系统,如果没有外部存储卡,很多的系统应用无法使用,比如多媒体相关的应用程序无法使用。虽然Android很依赖,但是外部存储卡也有它自身的特点,它最大的优点就是存储空间大,基本上你可无限制的使用,也不怎么担心去清除数据。就目前来看,很多程序都在使用外部存储卡,但很少有程序去主动清理数据,所以无论你的SD卡有多大,它的可用空间却越来越少。与内部存储不同的是,当程序卸载时,它在外部存储所创建的文件数据是不会被清除的。所以清理外部存储空间的责任丢给了用户自己,每隔一段时间就去查看下SD卡,发现无用数据立马删除。外部存储的缺点就是不是很稳定,对于Android手机来讲可以说,很不稳定,本身闪存介质就容易出问题,SD卡处于不能正常使用的状态十分多。先来说说外部存储相关的使用方法和API:a. Check media availability检查介质的可用性&如前所述,外部存储介质的稳定性十分的差,所以在使用之前一定要先检查它的可用性,如果可用再去用 代码如下:&final String state = Environment.getExternalStorageState();&if (state.equals(Environment.MEDIA_MOUNTED) ||&state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us }b. Get the directory获取外部存储卡的路径 &事实上,外部存储卡的路径是“/mnt/sdcard",所以你直接这样写去访问也能访问的到。鉴于可读性和可移植性的考虑,建议这样写: 代码如下:&&& File sdcardDir = Environment.getExternalStorageDirectory();c. For API 8 or greater, there are some other useful APIs helping to manager files and directories. 如果你使用API 8(Android 2.2)或者更高,那么SDK中又多了几个操作外部存储文件和路径的接口,文档中也建议开始者更加规范的使用SD卡。比如,创建相应的目录去存储相应的数据,Music,Picture,Video等。应用程序目录也变成了"/Android/data/package-name/data"。具体的使用可以参考文档,这里不重复。当然,就像编程规范一样,这里只是规范,你完全可以不遵守它,但出于可读性和可移植性,还是建议按照文档建议的去做。下面总结一下使用时应该注意的一些和外部存储的特点:a. 外部存储卡不是随时想用就能够用的,所以一定要记得在使用之前检查它的可用性b. 存储在外部存储卡上的数据是所有应用程序都可见,用户也可见(使用FileManager),所以安全性不是很好,虽然文档声称可以在外部存储卡上写程序私有数据,但貌似没用,用FileManager仍然可以删除或编辑文件(Market上面的FileManager功能都十分的强大,能让用户看到SD卡中的所有文件,和操作能看到的文件)。c. Android手机支持把外部存储卡Mount至PC做为U盘,当连接数据线时,这时SD卡变成了U盘连接到了另外的操作系统中。什么意思,就是在Android当中虽然有的文件属性(隐藏,私有等),到了PC上就不一定管用了,用户在PC上可以随意操作文件(这就是第二点中所提及的)。d. 如果使用外部存储卡保存数据,一定要额外做好异常处理:外部存储卡不可用时把数据存入哪里;可用的时候再怎么同步数据(这是比较头疼的地方,可行的做法就是当SD卡不可用时不准用户写数据,但这用户体验又不是很好,但如你所知,很多应用都这么干);你的数据被破坏了。当然常见的异常也要考虑,比如空间满了,无法写入,磁盘坏道等。1.SQLite Database数据库Android对数据库的支持很好,它本身集成了SQLite数据库,每个应用都可以方便的使用它,或者更确切的说,Android完全依赖于SQLite数据库,它所有的系统数据和用到的结构化数据都存储在数据库中。它具有以下优点:a. 效率出众,这是无可否认的b. 十分适合存储结构化数据c. 方便在不同的Activity,甚至不同的应用之间传递数据先前有一篇&&讲到了不同Activity和不同应用之间传递数据的麻烦,特别是对于大型数据结构,因为Activity虽是Java对象,但去无法像使用其他类对象那样去创建一个实例然后使用它,更无法给Activity加上Setters和Getters(虽然这样做了没有编译错误)。比较好的解决方案就是把结构化数据写入数据库,然后在不同的Activity之间传递它们的Uri。d. 由专门的ContentProvider来帮忙管理和维护数据库e. 可以方便的设置访问权限,私有还是都可见f.& 操作方便,使用标准的CRUDE语句,ContentResolver.query(), update(), delete() insert(),详见g. 良好的可移植性和通用性,用标准的SQL语句就能实现CRUDE对于它的使用方法可以去,这里也说不清楚。1.Internet网络网络是比较不靠谱的一个,因为移动终端的网络稳定性,以及所产生的流量让人伤不起,用户更伤不起。但若是对于非常重要的实时数据,或是需要发送给远端服务器处理的,也可以考虑使用网络实时发送。这已经有先例了,Apple和Google就是这样,iPhone设备和Android设备都会在用户不知情的情况 下收集用户的信息,然后又在用户不知情的情况 下发送到Apple和Google的服务器上,也就是所谓的“跟踪门”。除此之外,智能手机(特别是Android和火热的iPhone)上面的应用程序都会偷偷的在后台运行,收集用户数据,然后再偷偷的发服务器,直接伤害是用户流量。对比这几种方式,可以总结下:1. 简单数据和配置信息,SharedPreference是首选;2. 如果SharedPreferences不够用,那么就创建一个数据库3. 结构化数据,一定要创建数据库,虽然这稍显烦锁,但是好处无穷4. 文件就是用来存储文件(也即非配置信息或结构化数据),如文本文件,二进制文件,PC文件,多媒体文件,下载的文件等等。5. 尽量不要创建文件6. 如果创建文件,如果是私密文件或是重要文件,就存储在内部存储,否则放到外部存储7. 不要收集用户数据,更不要发到网络上,虽然你们也有很多无奈。用户也无奈,也无辜,但更无助平台为开发者准备了这么多的方式固然是一件好事,但我们要认清每一种的优点和缺点,根据实际情况选择最合适的。还有一个原则就是最简单原则,也就是说能用简单的方式处理,就不要用复杂的方式。比如存储几个数据或简单对象,用SharedPreference也能做到,何必还去写个ContentProvider呢?
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具本文由CSDN-蚍蜉撼青松【主页:http://blog.csdn/howeverpf】原创,转载请注明出处!&&&&&&& 当前系统越来越流行,无论是对于应用的开发人员,还是对于网络安全的研究人员,都有可能需要掌握捕获Android应用通信数据包的方法。根据技术手段不同,常用的抓包方法分两类,一类是通过Android智能移动终端所接入的上层网络设备或线路获取数据流,另一类则是直接在Android移动终端上监听数据流。本文主要探讨第二类方法,下面分别就前期准备、一般步骤、常见问题、扩展说明四方面详谈。(由于本人使用的是Android手机,所以后文在描述的时候都说的是Android手机,但其实本文所说的内容是Android移动终端基本都可以通用的)&&&&&&&&所谓学以致用,建议大家看了本文之后还是能实际选择一个安卓应用分析一下。我本人利用本文所说的抓包技术实际分析了百度贴吧安卓客户端的网络通信行为,分析结果参见我的上一篇博文《》,也可直接下载PDF版的完整分析报告,地址是:。&一、前期准备1.1 为Android手机的Root权限解锁&&&&&&& Root是Android手机系统中的超级管理员账户,Root权限(即底层权限)和我们在Windows系统下的Administrator权限类似。默认状态下,为了防止系统文件被更改,Android系统并没有把Root账户开放给我们普通用户,我们必须先为Root权限解锁才能获取Root权限。网上一般把Android手机的Root权限是否解锁,简称为Android手机是否root过。&&&&&&& 这些年网上涌现了大量手机root工具,使用你自己的手机型号搜,应该能找到合适你的工具。作为一个华为党,俺最后使用了刷机精灵,两次之后成功解锁Root权限。解锁成功后,刷机精灵会在手机上安装一个授权管理工具,以帮助咱们管理哪些应用和程序可以获取Root授权。最新版的授权管理工具还自带了一个工具箱,可以自由卸载手机上的预装软件和系统软件,很省心,很方便!刷机精灵使用教程参照:《》。1.2 下载相关工具&&&&&&& 要用到的工具主要有两个,tcpdump(Android版) 和 adb 。打包下载地址为:。&&&&&&& tcpdump是系统中普遍使用的一款开源网络协议分析工具,使用方法详参:《》。&&&&&&& adb是谷歌提供的安卓远程调试工具,应该使用方法详参:《》。如果你前面使用了刷机精灵为手机的Root权限解锁,那么可以在刷机精灵的实用工具里找到Adb命令行,直接调用此工具,而无需专门下载;又或者你以前搭建过安卓开发环境,那么应该也可以在***\platform-tools目录下找到该工具。&&二、一般步骤&&&&&&&&为了让大家看起来方便,我先把所有步骤拉通放在一张图上,给大家一个直观的印象,如图2-0。(考虑到通用性,在上传tcpdump前修改了手机上目的目录权限,部分手机不用。)图2-0 在某手机上第一次抓包的完整过程下面是分步解说,其中有些步骤是仅在第一次使用的时候才需要,用【仅需第一次】标注(也就是图2-0中用白色方框圈起来的部分)。(1)将 adb.exe 放在合适的目录下,并将该目录的完整路径添加到Windows的 PATH 环境变量中。【仅需第一次】【已经搭建过安卓开发环境则不需要此步】(2)打开windows命令提示符窗口,输入命令: adb version ,如果正常显示adb的版本,则说明上一步环境变量设置没有问题,且adb.exe本身完整,如图2-1;反之,则可能是adb.exe本身文件损坏,环境变量设置有误,或者环境变量设置后尚未生效,请自行检查。【仅需第一次】图2-1 检查adb工具是否正常可用(3)勾选Android手机的"USB调试",将Android手机与电脑USB相连,在命令提示符窗口输入命令: adb devices ,若正常显示所连接手机的设备号,则说明连接成功,如图2-2。(注:有些手机的设备号可能读取有问题,显示的是一个问号,这也是可以的,并不会影响后面的操作)图2-2 查看PC与安卓手机是否连接成功(4)将 tcpdump (for Android)上传至Android手机上,在命令提示符窗口中输入命令:adb push& &LocalPath of tcpdump&&& /data/local/tcpdump,如图2-3。【仅需第一次】图2-3 上传tcpdump(5)给 tcpdump 增加可执行权限,如图2-4。【仅需第一次】在命令提示符窗口中使用命令 adb shell 远程打开Android手机上的终端Shell;在当前Shell中使用su命令获取管理员权限;在当前Shell中使用 chmod 命令修改 tcpdump 的权限。图2-4 修改 tcpdump 的权限(6)使用 tcpdump 抓包,并将结果写入一个pcap文件保存,如图2-5。在命令提示符窗口中使用命令 adb shell 远程打开Android手机上的终端Shell;在当前Shell中使用 su 命令获取管理员权限;在当前Shell中输入命令: /data/local/tcpdump -p -s 0 -w /sdcard/001.pcap;在Android手机上进行相关操作,产生通信数据包,通信行为完成后在命令提示符窗口中使用 Ctrl + C 组合键退出当前Shell,以停止抓包。图2-5 抓包过程&上述过程中,tcpdump命令的参数含义如下:  # "-p": disable promiscuous mode (不使用混杂模式)  # "-s 0": capture the entire packet(-s参数用以指定数据包捕获长度,此处指定为0,意为抓取完整的数据包)  # "-w *.pcap": write packets to a file (将结果写入一个pcap文件,而不在终端上直接显示)(7)将抓包结果下载到本地PC上。在命令提示符窗口中使用命令:adb pull /sdcard/001.pcap &LocalPath of&PcapFile &,如图2-6。图2-6 下载抓包结果到本地(8)使用Wireshark等协议分析工具查看抓包结果。&三、常见问题的解决3.1 部分手机使用adb的push命令上传tcpdump失败提示信息:"failed to copy 'd:/tcpdump' to '/data/local/tcpdump': Permission denied";出错原因:该Android手机上的目的目录没有写权限;解决方法:给Android手机上的目的目录/data/local增加写权限,步骤如图4-1;图4-1 给/data/local目录增加写权限3.2 部分手机使用chmod命令改变文件或目录的权限时失败提示信息:"Read-only file system";出错原因:从字面上理解,就是说文件系统是只读的,不允许改权限;【好像是在同学的小米手机上遇到的这个问题】解决方法:重新挂载根目录,并在挂载的时候指定为可读写。步骤如下,在命令提示符窗口中使用命令 adb shell 远程打开Android手机上的终端Shell;在当前Shell中使用 su 命令获取管理员权限;在当前Shell中输入命令: mount -o remount,rw / 。之后再使用chmod命令应该就没问题了。&四、扩展与说明4.1 上传tcpdump到Android手机的时候,是否一定要选择/data/local目录&&&&&&& 应该不是唯一的选择,但是我试过上传到一些其他的目录/sdcard等,会遇到更多的权限限制问题。所以出于方便的考量,建议还是都尽量固定传往/data/local目录。4.2 使用终端模拟器代替adb工具的shell命令&&&&&&& 终端模拟器是一款Android平台上的Linux Shell工具,相当于Windows中的CMD命令提示符,有了它,我们可以在Android上进行Linux系统的命令操作。&&&&&&& 通过前面的描述,我们可以看出,adb工具在这主要起到两个作用,一是基于push、pull命令的文件上传下载(本地PC与Android手机之间的文件交换);二是基于shell命令对Android内置Linux命令行Shell的远程访问(通过Android内置Shell来执行su、chmod、tcpdump等命令或程序)。其中第二个功能可以使用终端模拟器代替。例如图3-1图3-1 使用终端模拟器执行系统命令4.3 使用USB文件传输功能代替adb工具的pull命令&&&&&&& 我们前面在运行tcpdump时,使用-w参数指定了抓包结果的文件保存路径在/sdcard目录下。/sdcard目录对应安卓手机的内部存储空间,也就是我们手机插上USB线,选择“打开USB存储设备”后,用Windows的资源管理器打开所看到的根目录,如图3-2。因此我们可以用USB连接手机后,像访问U盘一般直接获取我们前面抓包生成的001.pcap文件。图3-2 /sdcard目录对应PC上可见的手机内部存储空间的根目录4.4 chmod命令中3位(或4位)八进制数字所代表含义的说明&&&&&&& 那些八进制数字对应着我们要为目标文件/目录设定的权限。先说3位的情况,假使我们将三位八进制数分别看做a,b,c的话,那么a,b,c分别表示User(该档案的属主)、Group(与该档案的属主属于同一个组的用户)、及Other(其他用户)的权限。&&&&&&& 八进制的a/b/c可以转成3位二进制数,这三位数的取值从高到低分别对应是否具有读、写、执行权限。对应位置1,则有相应权限;反之若置0,则无相应权限。例如:777 [111,111,111],所有用户均有读、写、执行权限;700 [111,000,000],只有档案的所有者拥有读、写、执行权限,其他用户无权限;644 [110,100,100],只有档案的所有者拥有读、写权限,其他用户只有读权限。&&&&&&& 回看前文,我们在修改 /data/local 权限时设置为777,算是最简单方便,但也是最不安全的该法。可以根据此处的介绍,你可以自行计算权限值该设为多少才是最科学的。&&&&&&& 至于4位八进制数,则是在3位八进制数的最左边加上1位八进制数来设置特殊属性,该特殊位默认取0。详参:《》4.5 chmod命令中用数字表示的权限值是否可用文本字符串代替&&&&&&& 在Linux下工作过的童鞋应该知道,chmod命令中的权限值除了可以用上文所述3位/4位八进制数表示以外,也可以用形如:&[ugoa...][[+-=][rwxX]...] 形式的字符串表示,如下:【以下例子取自博文《》,谢谢该文博主(林榆耿)】例1.以下两条命令作用相同,都是给FileName的属主分配读、写、执行的权限,给FileName的属主所在组分配读、执行权限,给其他用户仅分配执行权限# chmod 751 FileName # chmod u=rwx,g=rx,o=x FileName 例2.以下三条命令作用相同,都是为所有用户仅分配读权限# chmod 444 FileName # chmod =r FileName # chmod a-wx,a+r FileName &&&&&&& 那么在Android系统中是否可用文本字符串形式的代替八进制数形式的权限值呢?以我实验的结果来看,是不可以的,系统给的错误提示是:"Bad mode"。可能是系统本身不支持吧。&&------本文由CSDN-蚍蜉撼青松【主页:/howeverpf】原创,转载请注明出处!------&
阅读(...) 评论()}

我要回帖

更多关于 前端上传文件到数据库 的文章

更多推荐

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

点击添加站长微信