Android使用init.rc触发脚本实现隐藏内置应用
【实现逻辑】 通过在property_service.c中设置标志位,在设置中实现接口改变标志位, 使用init.rc中声明的服务来侦听标志位的变化,显式启动声明的服务,执行对应的脚本,把应用后缀从apk重命名为bak,从而实现隐藏(显示逻辑相反)。
【实现步骤】以隐藏Google Play Store(system/priv-app/Phonesky.apk)为例: 1.首先在system/core/init/property_service.c中声明并初始化标志位,0为隐藏,1为显示,默认隐藏
|
1
2
3
|
{ app.launcher.start, AID_SYSTEM, 0},+ { app.phonesky.show, AID_SYSTEM, 0}, //Add By zj { cdma., AID_RADIO, 0 }, //Add by gfzhu VIA |
2.在设置的开发者选项中实现对应的接口: 文件路径:packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java ①声明和初始化:
|
1
2
3
|
private static final String SHOW_PHONESKY = show_phonesky;private CheckBoxPreference mShowPhonesky;mShowPhonesky = findAndInitCheckboxPref(SHOW_PHONESKY); |
②CheckBox的逻辑:
|
1
2
3
4
5
6
7
8
9
|
(BatteryManager.BATTERY_PLUGGED_AC | BatteryManager.BATTERY_PLUGGED_USB) : 0);+ } else if (preference == mShowPhonesky) { // ZJ Add+ if(mShowPhonesky.isChecked())+ {+ SystemProperties.set(app.phonesky.show,1);+ }else{+ SystemProperties.set(app.phonesky.show,0);+ } } else if (preference == mBtHciSnoopLog) { |
③增加一个Preference: packages/apps/Settings/res/xml/development_prefs.xml
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
android:targetClass=com.android.settings.SetFullBackupPassword /> + <checkboxpreference android:key="show_phonesky" android:title="@string/show_phonesky"> <checkboxpreference pre="">④添加对应语言的string字符:<pre class="brush:java;"><string name="show_phonesky">Show Google Play Store</string></pre><br><br>⑤设置中新增一个监听,初始化Checkbox的逻辑: packages/apps/Settings/src/com/android/settings/BootReceiver.java 内容如下:<pre class="brush:java;">package com.android.settings;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.os.SystemClock;import android.util.Log;import android.os.SystemProperties;public class BootReceiver extends BroadcastReceiver{ @Override public void onReceive(Context arg0, Intent arg1) { // TODO Auto-generated method stub String action = arg1.getAction(); if(action.equals(Intent.ACTION_BOOT_COMPLETED)) { SharedPreferences shared = arg0.getSharedPreferences(com.android.settings_preferences, Context.MODE_PRIVATE); boolean show_phonesky = shared.getBoolean(show_phonesky, false); if(show_phonesky){ SystemProperties.set(app.phonesky.show,1); }else{ SystemProperties.set(app.phonesky.show,0); } } }}</pre><br><br>⑥在Settings的AndroidManifest文件中添加BroadcastReceiver的权限和声明:<pre class="brush:java;"><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED/"></uses-permission></pre><br>3.在init.rc中添加对应的服务和触发条件: 路径:mediatek/config/esky27_tb_ccn_mlc_kk/init.rc<pre class="brush:java;">+# ZJ Add START+#Hide or Show Google Play Dynamicly+#disabled:服务不会自动运行,必须显式地通过服务器来启动。+#oneshot:当此服务退出时不会自动重启。+service hidePhonesky /system/bin/hidePhonesky+ disabled+ oneshot +service showPhonesky /system/bin/showPhonesky+ disabled+ oneshot +#on property:sys.boot_completed=1+# start renamePhonesky+on property:app.phonesky.show=1+ start showPhonesky+on property:app.phonesky.show=0+ start hidePhonesky+# ZJ Add END</pre><br><br>4.隐藏和显示应用的脚本: 隐藏应用:vendor/ThirdParty/App/dte/hidePhonesky 内容:<br><pre class="brush:java;">#!/system/bin/sh#!/system/bin/busyboxmount -o remount,rw /system;mv /system/priv-app/Phonesky.apk /system/priv-app/Phonesky.bak</pre><br>显示应用:vendor/ThirdParty/App/dte/showPhonesky<br>内容:<br><pre class="brush:java;">#!/system/bin/sh#!/system/bin/busyboxmount -o remount,rw /system;mv /system/priv-app/Phonesky.bak /system/priv-app/Phonesky.apk</pre><br><br>5.拷贝脚本到system/bin目录下: 参考以下格式添加到对应的mk文件:<pre class="brush:java;">+#添加重命名GooglePlay脚本+PRODUCT_COPY_FILES += + vendor/ThirdParty/App/dte/hidePhonesky:system/bin/hidePhonesky + vendor/ThirdParty/App/dte/showPhonesky:system/bin/showPhonesky + vendor/ThirdParty/App/dte/Phonesky.bak:system/priv-app/Phonesky.bak</pre></checkboxpreference></checkboxpreference><br><br><br><br><br> |
结伴旅游,一个免费的交友网站:www.jieberu.com
推推族,免费得门票,游景区:www.tuituizu.com
Android使用init.rc触发脚本实现隐藏内置应用的更多相关文章
- Android 的 init.rc 文件简介【转】
转自:http://blog.csdn.net/yimiyangguang1314/article/details/6268177 init.rc由许多的Action和Service组成.每一个语句占 ...
- Android修改init.rc和init.xx.rc文件【转】
本文转载自:https://blog.csdn.net/u013686019/article/details/47981249 一.文件简介 init.rc:Android在启动过程中读取的启动脚本文 ...
- Android: 启动init.rc 中service的权限问题【转】
转自:http://www.linuxidc.com/Linux/2011-04/35014.htm 通过property_set("ctl.start", service_xx) ...
- android中init.rc文件的解析问题
init.rc中文件里会通过import /init.${ro.hardware}.rc文件,这个ro.hardware应该是某个详细的属性.而这个ro.hardware赋值应该是在Init进程中赋值 ...
- Android 重定向 init.rc中服务的输出
在init.rc中运行的服务,由于系统启动的时候将标准输出重定向到了/dev/null, 所以服务中的打印信息都不可见. 但调试时可能需要看到其中的打印信息,因此就有了logwrapper这个工具:l ...
- Android动态换肤(一、应用内置多套皮肤)
动态换肤在很多android应用中都有使用,用户根据自己的喜好设置皮肤主题,可以增强用户使用应用的舒适度. Android换肤可以分为很多种,它们从使用方式,用户体验以及项目框架设计上体现了明显的差异 ...
- 开源的Android开发框架-------PowerFramework使用心得(三)内置浏览器BrowserActivity
使用内置浏览器必须是引用源码的方式(因为jar中不能打包布局文件等资源).内置浏览器是一个继承自BaseActivity的普通Activity,使用WebView实现. 1.简单的打开内置浏览器 In ...
- Android启动脚本init.rc(2)
在Android中使用启动脚本init.rc,可以在系统的初始化中进行简单的操作. init.rc启动脚本路径:system/core/rootdir/init.rc 内容: Commands:命令 ...
- Android init.rc解析【转】
转自:http://www.linuxidc.com/Linux/2014-10/108438.htm 本文主要来自$Android_SOURCE/system/init/readme.txt的翻译. ...
随机推荐
- Mycat+Mysql主从复制实现双机热备
Mycat+Mysql主从复制实现双机热备 一.mysql主从配置原理 双机热备的概念简单说一下,就是要保持两个数据库的状态自动同步.对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据 ...
- springboot -- 2.0版本自定义ReidsCacheManager的改变
1. 问题发现 在1.0版本中,我们配置redis的cacheManager是这种方式: //缓存管理器 @Bean public CacheManager cacheManager(@Suppres ...
- mysql 表相关操作(1)
查询语句 select * from t_deptselect empno,ename,sal from t_emp select empno, sal * 12 as "inco ...
- php前台表单限制PHP上传大小
在php文件上传时候,一般我都认为考虑php.ini配置修改文件上传大小,还后台控制上传大小,这里教你php前台表单限制PHP上传大小 <form action="http://www ...
- [WPF]鼠标位置捕捉
private void StackPanel_MouseMove(object sender, MouseEventArgs e) { Debug.WriteLine("Move& ...
- C#获取主机信息
获取主机信息 最近需要做一个配合集控系统收集各个终端设备的一些信息,大致需要收集终端设备的硬件信息,CPU.内存以及硬盘使用率等信息.网上查看了一番,使用WMI来获取这些信息是最方便的.实现代码如下: ...
- MVVM框架简单实现
众所周知当下是MVVM盛行的时代,从早期的Angular到现在的React和Vue,再从最初的三分天下到现在的两虎相争. 无疑不给我们的开发带来了一种前所未有的新体验,告别了操作DOM的思维,换上了数 ...
- Genymotion模拟器使用camera
1.前言 最近开发react-native的app,上传图片功能需要使用相机,发现Genymotion默认的相机不工作.查看同行的博客解决了,归纳整理一下. 2.步骤 2.1安装Genymotion: ...
- Linux学习--第八天--acl、SetUID、SetGID、chattr、lsattr、sudo
acl权限 文件只能有一个所属组 acl就是不管用户什么组了,直接针对某个文件给他特定权限. acl需要所在分区文件系统的支持. df -h #查看分区 dumpe2fs -h /dev/sda3 # ...
- python-装饰器1
python-装饰器1 定义本质就是函数,(装饰其他函数)就是为其他函数添加附加功能原则:1.不能修改被装饰的函数的源代码2.不能修改被装饰的函数的调用方式 def logger(): print(' ...