当前位置:首页 » 安卓系统 » androidsvc

androidsvc

发布时间: 2022-08-10 23:48:38

‘壹’ androidmigsvc是什么

svc命令,位置在/system/bin目录下,用来管理电源控制,无线数据,WIFI。
# svc
svc
Available commands:
help Show information about the subcommands
power Control the power manager
data Control mobile data connectivity
wifi Control the Wi-Fi manager

# svc power
svc power
Control the power manager
usage: svc power stayon [true|false|usb|ac]
Set the 'keep awake while plugged in' setting.//设置屏幕的常亮,true保持常亮,false不保持,usb当插入usb时常亮,ac当插入电源时常亮

# svc data
svc data
Control mobile data connectivity
usage: svc data [enable|disable]
Turn mobile data on or off.//设置移动网络的数据是否启用
svc data prefer
Set mobile as the preferred data network//设置移动网络的数据优先于WIFI

# svc wifi
svc wifi
Control the Wi-Fi manager
usage: svc wifi [enable|disable]
Turn Wi-Fi on or off.//设置WIFI是否启用
svc wifi prefer
Set Wi-Fi as the preferred data network//设置WIFI优先于移动网络的数据,一般应设置成这样,除非你刻意使用移动网络数据传输

‘贰’ android系统在启动的过程中什么时候会调用systempropertys

System Properties是怎么一回事,又是如何实现的呢?
属性系统是android的一个重要特性。它作为一个服务运行,管理系统配置和状态。所有这些配置和状态都是属性。
每个属性是一个键值对(key/value pair),其类型都是字符串。
这些属性可能是有些资源的使用状态,进程的执行状态,系统的特有属性……
可以通过命令adb shell :
getprop查看手机上所有属性状态值。
或者 getprop init.svc.bootanim制定查看某个属性状态
使用setprop init.svc.bootanim start 设置某个属性的状态
特别属性 :
如果属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。
如果属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。
如果属性名称以“net.”开头,当设置这个属性时,“net.change”属性将会自动设置,以加入到最后修改的属性名。
(这是很巧妙的。 netresolve模块的使用这个属性来追踪在net.*属性上的任何变化。)
属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。每一项服务必须在/init.rc中定义.系统启动时,与init守护
进程将解析init.rc和启动属**。一旦收到设置“ ctrl.start ”属性的请求,属**将使用该属性值作为服务
名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中。客户端应用程序可以轮询那个属性值,以确定结果。

‘叁’ 这个开机启动项可以禁止吗XCAndroidSvc

1、在菜单栏中找到运行。

2、打开对话框后,输入msconfig命令,点击确定。

3、这样就可以看到可以选择禁止或者开启的修改项。
这是服务里面的程序,可以禁止的

‘肆’ android servicemanager 怎么实现service管理

ServiceManager是android中比较重要的一个进程,它是在init进程启动之后启动,从名字上就可以看出来它是用来管理系统中的service。比如:InputMethodService、ActivityManagerService等。在ServiceManager中有两个比较重要的方法:add_service、check_service。系统的service需要通过add_service把自己的信息注册到ServiceManager中,当需要使用时,通过check_service检查该service是否存在。


主函数(anrdroid4.0/frameworks/base/cmds/servicemanager/service_manager.c)


从它的主函数代码开始:


int main(int argc, char **argv)

{

struct binder_state *bs;

void *svcmgr = BINDER_SERVICE_MANAGER;

bs = binder_open(128*1024);

if (binder_become_context_manager(bs)) {

LOGE("cannot become context manager (%s) ", strerror(errno));

return -1;

}

svcmgr_handle = svcmgr;

binder_loop(bs, svcmgr_handler);

return 0;

}

从main函数中可以看出,它主要做了三件事情:


打开/dev/binder设备,并在内存中映射128K的空间。

通知Binder设备,把自己变成context_manager

进入循环,不停的去读Binder设备,看是否有对service的请求,如果有的话,就去调用svcmgr_handler函数回调处理请求。

服务注册


再来看看ServiceManager中是怎么样去注册服务的。先来看先,当有对service的请求时,调用的回调函数svcmgr_handler:


int svcmgr_handler(struct binder_state *bs,

struct binder_txn *txn,

struct binder_io *msg,

struct binder_io *reply)

{

struct svcinfo *si;

uint16_t *s;

unsigned len;

void *ptr;

uint32_t strict_policy;

// LOGI("target=%p code=%d pid=%d uid=%d ",

// txn->target, txn->code, txn->sender_pid, txn->sender_euid);

if (txn->target != svcmgr_handle)

return -1;

// Equivalent to Parcel::enforceInterface(), reading the RPC

// header with the strict mode policy mask and the interface name.

// Note that we ignore the strict_policy and don't propagate it

// further (since we do no outbound RPCs anyway).

strict_policy = bio_get_uint32(msg);

s = bio_get_string16(msg, &len);

if ((len != (sizeof(svcmgr_id) / 2)) ||

memcmp(svcmgr_id, s, sizeof(svcmgr_id))) {

fprintf(stderr,"invalid id %s ", str8(s));

return -1;

}

switch(txn->code) {

case SVC_MGR_GET_SERVICE:

case SVC_MGR_CHECK_SERVICE:

s = bio_get_string16(msg, &len);

ptr = do_find_service(bs, s, len);

if (!ptr)

break;

bio_put_ref(reply, ptr);

return 0;

case SVC_MGR_ADD_SERVICE:

s = bio_get_string16(msg, &len);

ptr = bio_get_ref(msg);

if (do_add_service(bs, s, len, ptr, txn->sender_euid))

return -1;

break;

case SVC_MGR_LIST_SERVICES: {

unsigned n = bio_get_uint32(msg);

si = svclist;

while ((n-- > 0) && si)

si = si->next;

if (si) {

bio_put_string16(reply, si->name);

return 0;

}

return -1;

}

default:

LOGE("unknown code %d ", txn->code);

return -1;

}

bio_put_uint32(reply, 0);

return 0;

}

在该回调函数中会判断Service有什么需要,如果是请求注册service,那么久执行:


case SVC_MGR_ADD_SERVICE:

s = bio_get_string16(msg, &len);

ptr = bio_get_ref(msg);

if (do_add_service(bs, s, len, ptr, txn->sender_euid))

return -1;

break;

我们再来看看do_add_service中做了什么事情:


int do_add_service(struct binder_state *bs,

uint16_t *s, unsigned len,

void *ptr, unsigned uid)

{

struct svcinfo *si;

// LOGI("add_service('%s',%p) uid=%d ", str8(s), ptr, uid);

if (!ptr || (len == 0) || (len > 127))

return -1;

if (!svc_can_register(uid, s)) {

LOGE("add_service('%s',%p) uid=%d - PERMISSION DENIED ",

str8(s), ptr, uid);

return -1;

}

si = find_svc(s, len);

if (si) {

if (si->ptr) {

LOGE("add_service('%s',%p) uid=%d - ALREADY REGISTERED ",

str8(s), ptr, uid);

return -1;

}

si->ptr = ptr;

} else {

si = malloc(sizeof(*si) + (len + 1) * sizeof(uint16_t));

if (!si) {

LOGE("add_service('%s',%p) uid=%d - OUT OF MEMORY ",

str8(s), ptr, uid);

return -1;

}

si->ptr = ptr;

si->len = len;

memcpy(si->name, s, (len + 1) * sizeof(uint16_t));

si->name[len] = '';

si->death.func = svcinfo_death;

si->death.ptr = si;

si->next = svclist;

svclist = si;

}

binder_acquire(bs, ptr);

binder_link_to_death(bs, ptr, &si->death);

return 0;

}

在该函数中,首先会去检查是否有权限注册service,如果没有权限就直接返回,不能注册。


if (!svc_can_register(uid, s)) {

LOGE("add_service('%s',%p) uid=%d - PERMISSION DENIED ",

str8(s), ptr, uid);

return -1;

}

然后会去检查该service是否已经注册过了,如果已经注册过,那么就不能再注册了:


si = find_svc(s, len);

if (si) {

if (si->ptr) {

LOGE("add_service('%s',%p) uid=%d - ALREADY REGISTERED ",

str8(s), ptr, uid);

return -1;

}

si->ptr = ptr;

}

再判断内存是否足够:


si = malloc(sizeof(*si) + (len + 1) * sizeof(uint16_t));

if (!si) {

LOGE("add_service('%s',%p) uid=%d - OUT OF MEMORY ",

str8(s), ptr, uid);

return -1;

}

如果都没什么问题,会注册该service,加入到svcList中来。注意,在ServiceManager中维护service信息的地方就是svclist。里面存了service的name和handler。


服务获取


通过以上几个步骤,service就算注册成功了。那么当要获得该service的时候又是怎么去处理的。还是来看下回调函数中的判断:


case SVC_MGR_CHECK_SERVICE:

s = bio_get_string16(msg, &len);

ptr = do_find_service(bs, s, len);

if (!ptr)

break;

bio_put_ref(reply, ptr);

return 0;


如果是获取service,那么执行SVC_MGR_CHECK_SERVICE,并把返回的数据写入reply,返回给客户端。


do_find_service函数中主要执行service的查找。


void *do_find_service(struct binder_state *bs, uint16_t *s, unsigned len)

{

struct svcinfo *si;

si = find_svc(s, len);

// LOGI("check_service('%s') ptr = %p ", str8(s), si ? si->ptr : 0);

if (si && si->ptr) {

return si->ptr;

} else {

return 0;

}

}

这样在ServiceManager中就完成了服务的注册和查找。来看下ServiceManager的功能图:

转载

‘伍’ Android系统文件夹结构详细解析!

\\system\\app
这个里面主要存放的是常规下载的应用程序,可以看到都是以APK格式结尾的文件。在这个文件夹下的程序为系统默认的组件,自己安装的软件将不会出现在这里,而是\\data\\文件夹中。下面是详细的介绍:
\\system\\app\\AlarmClock.apk 闹钟
\\system\\app\\AlarmClock.odex
\\system\\app\\Browser.apk 浏览器
\\system\\app\\Browser.odex
\\system\\app\\Bugreport.apk Bug报告
\\system\\app\\Bugreport.odex
\\system\\app\\Calculator.apk 计算器
\\system\\app\\Calculator.odex
\\system\\app\\Calendar.apk 日历
\\system\\app\\Calendar.odex
\\system\\app\\CalendarProvider.apk 日历提供
\\system\\app\\CalendarProvider.odex
\\system\\app\\Camera.apk 照相机
\\system\\app\\Camera.odex
\\system\\app\\com.amazon.mp3.apk 亚马逊音乐
\\system\\app\\Contacts.apk 联系人
\\system\\app\\Contacts.odex
\\system\\app\\DownloadProvider.apk 下载提供
\\system\\app\\DownloadProvider.odex
\\system\\app\\DrmProvider.apk DRM数字版权提供
\\system\\app\\DrmProvider.odex
\\system\\app\\Email.apk 电子邮件客户端
\\system\\app\\Email.odex
\\system\\app\\FieldTest.apk 测试程序
\\system\\app\\FieldTest.odex
\\system\\app\\GDataFeedsProvider.apk GoogleData提供
\\system\\app\\GDataFeedsProvider.odex
\\system\\app\\Gmail.apk Gmail电子邮件
\\system\\app\\Gmail.odex
\\system\\app\\GmailProvider.apk Gmail提供
\\system\\app\\GmailProvider.odex
\\system\\app\\GoogleApps.apk 谷歌程序包
\\system\\app\\GoogleApps.odex
\\system\\app\\GoogleSearch.apk 搜索工具
\\system\\app\\GoogleSearch.odex
\\system\\app\\gtalkservice.apk GTalk服务
\\system\\app\\gtalkservice.odex
\\system\\app\\HTMLViewer.apk HTML查看器
\\system\\app\\HTMLViewer.odex
\\system\\app\\IM.apk 即使通讯组件包含MSN、yahoo通
\\system\\app\\ImCredentialProvider.apk
\\system\\app\\ImProvider.apk
\\system\\app\\ImProvider.odex
\\system\\app\\Launcher.apk 启动加载器
\\system\\app\\Launcher.odex
\\system\\app\\Maps.apk 电子地图
\\system\\app\\Maps.odex
\\system\\app\\MediaProvider.apk 多媒体播放提供
\\system\\app\\MediaProvider.odex
\\system\\app\\Mms.apk 短信、彩信
\\system\\app\\Mms.odex
\\system\\app\\Music.apk 音乐播放器
\\system\\app\\Music.odex
\\system\\app\\MyFaves.apk T-Mobile MyFaves程序
\\system\\app\\MyFaves.odex
\\system\\app\\PackageInstaller.apk apk安装程序
\\system\\app\\PackageInstaller.odex
\\system\\app\\Phone.apk 电话拨号器
\\system\\app\\Phone.odex
\\system\\app\\Settings.apk 系统设置
\\system\\app\\Settings.odex
\\system\\app\\SettingsProvider.apk 设置提供
\\system\\app\\SettingsProvider.odex
\\system\\app\\SetupWizard.apk 设置向导
\\system\\app\\SetupWizard.odex
\\system\\app\\SoundRecorder.apk 录音工具
\\system\\app\\SoundRecorder.odex
\\system\\app\\Street.apk 街景地图
\\system\\app\\Street.odex
\\system\\app\\Sync.apk 同步程序
\\system\\app\\Sync.odex
\\system\\app\\Talk.apk 语音程序
\\system\\app\\Talk.odex
\\system\\app\\TelephonyProvider.apk 电话提供
\\system\\app\\TelephonyProvider.odex
\\system\\app\\Updater.apk 更新程序
\\system\\app\\Updater.odex
\\system\\app\\Vending.apk 制造商信息
\\system\\app\\Vending.odex
\\system\\app\\VoiceDialer.apk 语音拨号器
\\system\\app\\VoiceDialer.odex
\\system\\app\\YouTube.apk Youtube视频
\\system\\app\\YouTube.odex

\\system\\bin
这个目录下的文件都是系统的本地程序,从bin文件夹名称可以看出是binary二进制的程序,里面主要是Linux系统自带的组件,Android手机网就主要文件做下简单的分析介绍:
\\system\\bin\\akmd
\\system\\bin\\am
\\system\\bin\\app_process 系统进程
\\system\\bin\\dalvikvm Dalvik虚拟机宿主
\\system\\bin\\dbus-daemon 系统BUS总线监控
\\system\\bin\\debuggerd 调试器
\\system\\bin\\debug_tool 调试工具
\\system\\bin\\dexopt DEX选项
\\system\\bin\\dhcpcd DHCP服务器
\\system\\bin\\mpstate 状态抓取器
\\system\\bin\\mpsys 系统抓取器
\\system\\bin\\dvz
\\system\\bin\\fillup
\\system\\bin\\flash_image 闪存映像
\\system\\bin\\hciattach
\\system\\bin\\hcid HCID内核
\\system\\bin\\hostapd
\\system\\bin\\hostapd_cli
\\system\\bin\\htclogkernel
\\system\\bin\\input
\\system\\bin\\installd
\\system\\bin\\itr
\\system\\bin\\linker
\\system\\bin\\logcat Logcat日志打印
\\system\\bin\\logwrapper
\\system\\bin\\mediaserver
\\system\\bin\\monkey
\\system\\bin\\mountd 存储挂载器
\\system\\bin\\netcfg 网络设置
\\system\\bin\\ping Ping程序
\\system\\bin\\playmp3 MP3播放器
\\system\\bin\\pm 包管理器
\\system\\bin\\qemud QEMU虚拟机
\\system\\bin\\radiooptions 无线选项
\\system\\bin\\rild RIL组件
\\system\\bin\\sdptool
\\system\\bin\\stil
\\system\\bin\\service
\\system\\bin\\servicemanager 服务管理器
\\system\\bin\\sh
\\system\\bin\\ssltest SSL测试
\\system\\bin\\surfaceflinger 触摸感应驱动
\\system\\bin\\svc 服务
\\system\\bin\\system_server
\\system\\bin\\telnetd Telnet组件
\\system\\bin\\toolbox
\\system\\bin\\wlan_loader
\\system\\bin\\wpa_cli
\\system\\bin\\wpa_supplicant

\\system\\etc
从文件夹名称来看保存的都是系统的配置文件,比如APN接入点设置等核心配置。
\\system\\etc\\apns-conf.xml APN接入点配置文件
\\system\\etc\\AudioFilter.csv 音频过滤器配置文件
\\system\\etc\\AudioPara4.csv
\\system\\etc\\bookmarks.xml 书签数据库
\\system\\etc\\dbus.conf 总线监视配置文件
\\system\\etc\\dhcpcd
\\system\\etc\\event-log-tags
\\system\\etc\\favorites.xml 收藏夹
\\system\\etc\\firmware 固件信息
\\system\\etc\\gps.conf GPS设置文件
\\system\\etc\\hcid.conf内核HCID配置文件
\\system\\etc\\hosts 网络DNS缓存
\\system\\etc\\init.goldfish.sh
\\system\\etc\\location 定位相关
\\system\\etc\\mountd.conf 存储挂载配置文件
\\system\\etc\\NOTICE.html 提示网页
\\system\\etc\\permissions.xml 权限许可
\\system\\etc\\pvplayer.conf
\\system\\etc\\security
\\system\\etc\\wifi WLAN相关组件
\\system\\etc\\dhcpcd\\dhcpcd-hooks
\\system\\etc\\dhcpcd\\dhcpcd-run-hooks
\\system\\etc\\dhcpcd\\dhcpcd.conf
\\system\\etc\\dhcpcd\\dhcpcd-hooks\\01-test
\\system\\etc\\dhcpcd\\dhcpcd-hooks\\20-dns.conf
\\system\\etc\\dhcpcd\\dhcpcd-hooks\\95-configured
\\system\\etc\\firmware\\brf6300.bin
\\system\\etc\\location\\gps
\\system\\etc\\location\\gps\\location 定位相关
\\system\\etc\\location\\gps\\nmea GPS数据解析
\\system\\etc\\location\\gps\\properties
\\system\\etc\\security\\cacerts.bks
\\system\\etc\\security\\otacerts.zip OTA下载验证
\\system\\etc\\wifi\\Fw1251r1c.bin
\\system\\etc\\wifi\\tiwlan.ini
\\system\\etc\\wifi\\wpa_supplicant.conf WPA验证组件

\\system\\fonts
字体文件夹,除了标准字体和粗体、斜体外可以看到文件体积最大的可能是中文字库,或一些unicode字库,从T-Mobile G1上可以清楚的看到显示简体中文正常,其中DroidSansFallback.ttf文件大小
\\system\\fonts\\DroidSans-Bold.ttf
\\system\\fonts\\DroidSans.ttf
\\system\\fonts\\DroidSansFallback.ttf
\\system\\fonts\\DroidSansMono.ttf
\\system\\fonts\\DroidSerif-Bold.ttf
\\system\\fonts\\DroidSerif-BoldItalic.ttf
\\system\\fonts\\DroidSerif-Italic.ttf
\\system\\fonts\\DroidSerif-Regular.ttf

\\system\\framework
framework主要是一些核心的文件,从后缀名为jar可以看出是是系统平台框架。
\\system\\framework\\am.jar
\\system\\framework\\am.odex
\\system\\framework\\android.awt.jar AWT库
\\system\\framework\\android.awt.odex
\\system\\framework\\android.policy.jar
\\system\\framework\\android.policy.odex
\\system\\framework\\android.test.runner.jar
\\system\\framework\\android.test.runner.odex
\\system\\framework\\com.google.android.gtalkservice.jar GTalk服务
\\system\\framework\\com.google.android.gtalkservice.odex
\\system\\framework\\com.google.android.maps.jar 电子地图库
\\system\\framework\\com.google.android.maps.odex
\\system\\framework\\core.jar 核心库,启动桌面时首先加载这个
\\system\\framework\\core.odex
\\system\\framework\\ext.jar
\\system\\framework\\ext.odex
\\system\\framework\\framework-res.apk
\\system\\framework\\framework-tests.jar
\\system\\framework\\framework-tests.odex
\\system\\framework\\framework.jar
\\system\\framework\\framework.odex
\\system\\framework\\input.jar 输入库
\\system\\framework\\input.odex
\\system\\framework\\itr.jar
\\system\\framework\\itr.odex
\\system\\framework\\monkey.jar
\\system\\framework\\monkey.odex
\\system\\framework\\pm.jar 包管理库
\\system\\framework\\pm.odex
\\system\\framework\\services.jar
\\system\\framework\\services.odex
\\system\\framework\\ssltest.jar
\\system\\framework\\ssltest.odex
\\system\\framework\\svc.jar 系统服务
\\system\\framework\\svc.odex

\\system\\lib
lib目录中存放的主要是系统底层库,如平台运行时库。
\\system\\lib\\libaes.so
\\system\\lib\\libagl.so
\\system\\lib\\libandroid_runtime.so Android运行时库
\\system\\lib\\libandroid_servers.so 系统服务组件
\\system\\lib\\libaudio.so 音频处理
\\system\\lib\\libaudioeq.so EQ均衡器
\\system\\lib\\libaudioflinger.so 音频过滤器
\\system\\lib\\libbluetooth.so 蓝牙组件
\\system\\lib\\libc.so
\\system\\lib\\libcamera.so 超相机组件
\\system\\lib\\libcameraservice.so
\\system\\lib\\libcorecg.so
\\system\\lib\\libcrypto.so 加密组件
\\system\\lib\\libctest.so
\\system\\lib\\libcutils.so
\\system\\lib\\libdbus.so
\\system\\lib\\libdl.so
\\system\\lib\\libdrm1.so DRM解析库
\\system\\lib\\libdrm1_jni.so
\\system\\lib\\libdvm.so
\\system\\lib\\libexif.so
\\system\\lib\\libexpat.so
\\system\\lib\\libFFTEm.so
\\system\\lib\\libGLES_CM.so
\\system\\lib\\libgps.so
\\system\\lib\\libhardware.so
\\system\\lib\\libhgl.so
\\system\\lib\\libhtc_ril.so
\\system\\lib\\libicudata.so
\\system\\lib\\libicui18n.so
\\system\\lib\\libicuuc.so
\\system\\lib\\liblog.so
\\system\\lib\\libm.so
\\system\\lib\\libmedia.so
\\system\\lib\\libmediaplayerservice.so
\\system\\lib\\libmedia_jni.so
\\system\\lib\\libnativehelper.so
\\system\\lib\\libnetutils.so
\\system\\lib\\libOmxCore.so
\\system\\lib\\libOmxH264Dec.so
\\system\\lib\\libpixelflinger.so
\\system\\lib\\libpvasf.so
\\system\\lib\\libpvasfreg.so
\\system\\lib\\libpvauthor.so
\\system\\lib\\libpvcommon.so
\\system\\lib\\libpvdownload.so
\\system\\lib\\libpvdownloadreg.so
\\system\\lib\\libpvmp4.so
\\system\\lib\\libpvmp4reg.so
\\system\\lib\\libpvnet_support.so
\\system\\lib\\libpvplayer.so
\\system\\lib\\libpvrtsp.so
\\system\\lib\\libpvrtspreg.so
\\system\\lib\\libqcamera.so
\\system\\lib\\libreference-ril.so
\\system\\lib\\libril.so
\\system\\lib\\librpc.so
\\system\\lib\\libsgl.so
\\system\\lib\\libsonivox.so
\\system\\lib\\libsoundpool.so
\\system\\lib\\libsqlite.so
\\system\\lib\\libssl.so
\\system\\lib\\libstdc++.so
\\system\\lib\\libsurfaceflinger.so
\\system\\lib\\libsystem_server.so
\\system\\lib\\libthread_db.so
\\system\\lib\\libUAPI_jni.so
\\system\\lib\\libui.so
\\system\\lib\\libutils.so
\\system\\lib\\libvorbisidec.so
\\system\\lib\\libwbxml.so
\\system\\lib\\libwbxml_jni.so
\\system\\lib\\libwebcore.so
\\system\\lib\\libwpa_client.so
\\system\\lib\\libxml2wbxml.so
\\system\\lib\\libz.so
\\system\\lib\\moles
\\system\\lib\\moles\\wlan.ko

‘陆’ xcandroidsvc怎么启动

1、在菜单栏中找到运行。 2、打开对话框后,输入msconfig命令,点击确定。 3、这样就可以看到可以选择禁止或者开启的修改项。 这是服务里面的程序,可以禁止的

‘柒’ 如何使Android应用程序获得root权限

一般来说, Android 下的应用程序可以逗直接地得到的最大的权限为 system ,但是如果我们需要在程序中执行某些需要 root 权限的命令,如 ifconfig 等,就需要 root 权限了。按照 Simon 的文章中提到的,应用程序有以下两种办法临时获得 root 权限:
1) 实现一个 init 实现一个 Service ,来帮助 Android 应用程序执行 root 权限的命令。
2) 实现一个虚拟设备,这个设备帮助 Android 应用程序执行 root 权限的命令。

第二种办法我这里没有尝试,暂时也不会。这里讲讲我在实现第一种办法的过程和遇到的一些问题。

1. 将我们要执行的命令写成脚本,或者可执行程序。
下面是我的脚本 ifconfig_test.sh :

# ! /system/bin/sh
ifconfig
注意: 脚本的第一行必须为 # ! /system/bin/sh ,否则无法执行,通过 dmesg 可以查看到信息内容为 cannot execve ./ifconfig_test.sh: Exec format error

也可以采用 C/C++ 编写需要执行的命令或者程序,并在编译 image 的时候编译成可执行程序。

2. 在 init.rc 中注册 service
Android 中的 service 需要在 init.rc 中注册, Init.rc 中定义的 Service 将会被 init 进程创建,这样将可以获得 root 权限。当得到相应的通知(通过属性设置)后, init 进程会启动该 service 。
本文中注册的内容如下:

service ifconfig_test /system/etc/ifconfig_test.sh
oneshot
disabled
其中, oneshot 表示程序退出后不再重新启动, disabled 表示不在系统启动时启动。

注意: 这里 service name 不能超过 16 个字符。我之前的 service name 由于定义的比较长, 18 个字符,设置属性通知 service 启动后查看 dmesg 可以看到提示: init: no such service 。查看 /system/core/init/parser.c 的源代码,在 parse_service->valid_name 函数中可以看到如下内容: if (strlen(name) > 16) { return 0; } ,证明 service 的名字的确不能超过 16 个字符。

3. 将 Android 应用程序提升为 system 权限
既然应用程序可以通过启动 service 获得 root 权限,那么岂不是很不安全。 Android 考虑到了这点,规定只有 system 权限的应用程序才能设置属性,通知 service 启动。关于提升 system 权限的文章网上已有很多,这里就不再细说,

4. 在应用程序中添加属性设置代码
前面已经提到,对于 Android 来说,应用程序通知 init 启动 service 是通过设置系统属性来完成的,具体为设置 System 系统属性 逗ctl.start地 为 逗ifconfig_test地 ,这样 Android 系统将会帮我们运行 ifconfig_test 这个 service 了。
对该系统属性的设置有三种方法,分别对应三种不同的应用程序:
1) Java 代码
Android 在 Java 库中提供 System.getProperty 和 System.setProperty 方法, Java 程序可以通过他们来设置和获得属性。代码如下:
SystemProperties.set("ctl.start", "ifconfig_test");
上面的代码是通知 Android 执行 ifconfig_test service ,如果需要查询当前 service 执行的状态,如是否执行完毕,可以通过如下代码查询:
ret = SystemProperties.get("init.svc. ifconfig_test ", "");
if(ret != null && ret.equals("stopped"))
{
return true;
}
2) JNI 代码
当编写 NDK 的程序时,可以使用 property_get 和 property_set 这两个 API 来获得和设置属性。使用这两个 API 必须要包含头文件 cutils/properties.h 和链接 libcutil 库。

3) Shell 脚本
Android 提供了命令行 setprop 和 getprop 来设置和获取属性,他们可以在脚本中被使用。

由于我的程序是在 JNI 中调用脚本,脚本中又执行 ifconfig ,因此我将设置属性的部分放在了脚本中完成,代码如下:
setprop ctl.start ifconfig_test

#wait for the service until it stops
ret=1
while [ $ret -ne 0 ]
do
getprop | grep "$ENABLE_MAPPER_SRV" | grep stopped
ret=$?
done
通过上面 4 个步骤, Android 应用程序就获得了 root 权限,更具体的说,是在执行我们需要执行的命令时临时获得了 root 权限。
转载仅供参考,版权属于原作者。祝你愉快,满意请~~哦

‘捌’ 如何使用android百度地图离线地图

1.首先把离线地图放在android工程下的assets里面。
注意:建议离线地图下载通过网络地图APIDEMO去下载,因为到官网上下载的离线地图文件格式不一样,APIDEMO的格式是.dat,而官网上的格式是.dat_svc有可能加载不了地图.
2.把离线地图从assets下拷贝到sd卡下
public static void (Context context) {
try {
String filepath = Environment.getExternalStorageDirectory() + "/"
+ "BaiMapSDK" + "/" + "vmp" + "/" + "h" + "/"
+ "xxxxx.dat";
String path = Environment.getExternalStorageDirectory() + "/"
+ "BaiMapSDK" + "/" + "vmp" + "/" + "h" + "/";
File file = new File(path);
if (!file.exists()) {
file.mkdir();
}
if (!(new File(filepath)).exists()) {
new File(filepath).createNewFile();
InputStream is = context.getAssets().open(
"xxxx.dat");
FileOutputStream fos = new FileOutputStream(filepath);
byte[] buffer = new byte[8192];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
is.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
3.初始化离线地图
private MKOfflineMap mOffline = null;
MapController mMapController;
mMapController = mMapView.getController();
mOffline = new MKOfflineMap();
mOffline.init(mMapController, new MKOfflineMapListener() {
@Override
public void onGetOfflineMapState(int type, int state) {
// TODO Auto-generated method stub
switch (type) {
case MKOfflineMap.TYPE_DOWNLOAD_UPDATE: {
}
break;
case MKOfflineMap.TYPE_NEW_OFFLINE:
break;
case MKOfflineMap.TYPE_VER_UPDATE:
break;
}
}
});

热点内容
网易我的世界服务器添加第三方mod 发布:2025-01-18 11:32:10 浏览:212
oracle批量插入存储过程 发布:2025-01-18 10:49:57 浏览:41
分表存储查询 发布:2025-01-18 10:45:18 浏览:469
缺页算法 发布:2025-01-18 10:40:20 浏览:778
撕裂重罪6游戏电脑需要什么配置 发布:2025-01-18 10:37:23 浏览:444
python大小写忽略 发布:2025-01-18 10:36:13 浏览:441
如何给桌面的游戏加密码 发布:2025-01-18 10:09:34 浏览:231
魅族微信多开安卓怎么弄 发布:2025-01-18 10:04:33 浏览:448
网络设置里没有服务器是什么 发布:2025-01-18 09:52:19 浏览:343
阿里云esc服务器系统 发布:2025-01-18 09:49:16 浏览:790