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为显示,默认隐藏

     { "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

①声明和初始化:

private static final String SHOW_PHONESKY = "show_phonesky";
private CheckBoxPreference mShowPhonesky;
mShowPhonesky = findAndInitCheckboxPref(SHOW_PHONESKY);

②CheckBox的逻辑:

       (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

     android:targetClass="com.android.settings.SetFullBackupPassword" />
     </PreferenceScreen>
+       <CheckBoxPreference
+        android:key="show_phonesky"
+        android:title="@string/show_phonesky"
+        />
     <CheckBoxPreference 

④添加对应语言的string字符:

<string name="show_phonesky">Show Google Play Store</string>

⑤设置中新增一个监听,初始化Checkbox的逻辑:

packages/apps/Settings/src/com/android/settings/BootReceiver.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");
               }
          }
     }
}

⑥在Settings的AndroidManifest文件中添加BroadcastReceiver的权限和声明:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name=".BootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
               <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
</receiver>

3.在init.rc中添加对应的服务和触发条件:

路径:mediatek/config/esky27_tb_ccn_mlc_kk/init.rc

+# 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

4.隐藏和显示应用的脚本:

隐藏应用:vendor/ThirdParty/App/dte/hidePhonesky

内容:

#!/system/bin/sh
#!/system/bin/busybox
mount -o remount,rw /system;
mv /system/priv-app/Phonesky.apk /system/priv-app/Phonesky.bak

显示应用:vendor/ThirdParty/App/dte/showPhonesky

内容:

#!/system/bin/sh
#!/system/bin/busybox
mount -o remount,rw /system;
mv /system/priv-app/Phonesky.bak /system/priv-app/Phonesky.apk

5.拷贝脚本到system/bin目录下:

参考以下格式添加到对应的mk文件:

+#添加重命名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

时间: 2024-08-04 23:03:14

Android使用init.rc触发脚本实现隐藏内置应用的相关文章

Android修改init.rc和init.xx.rc文件

一.文件简介 init.rc:Android在启动过程中读取的启动脚本文件,主要完成一些初级的初始化,在/system/core/init/init.c中解析. init.xx.rc:与具体CPU相关的启动脚本,比如对于飞思卡尔的CPU,名字为init.freescale.rc.在init.rc之后得到解析. 两个文件都位于根目录下:cat /init.rc 二.init.rc和init.xx.rc文件的修改 根据自己的CPU,修改文件的相应位置,然后: make bootimage 重新生成b

Android 的 init.rc 文件简介

init.rc由许多的Action和Service组成.每一个语句占据一行,并且各个关键字被空格分开. 由 # (前面允许有空格)开始的行都是注释行(comment) 一个actions 或 services 的开始隐含声明了一个新的段,所有commands 或 options 属于最近的声明.在第一个段之前的 commands 或 options 都会被忽略 每一个actions 和 services 都有不同的名字.后面与前面发生重名的,那么这个后面重名的将被忽略或被认为是一个错误. act

Android: 启动init.rc 中service的权限问题【转】

转自:http://www.linuxidc.com/Linux/2011-04/35014.htm 通过property_set("ctl.start", service_xx); 来启动init.rc中的service是一个很方便方法来调用某个可执行程序或某个脚本程序 service service_xx  /system/bin/xx disabled oneshot 但在非AID_ROOT.AID_SYSTEM 用户的进程中调用ctl.start ctl.stop会碰到权限问题

android中init.rc文件的解析问题

init.rc中文件里会通过import /init.${ro.hardware}.rc文件,这个ro.hardware应该是某个详细的属性.而这个ro.hardware赋值应该是在Init进程中赋值的. 这个ro.hardware值设置是在/system/core/init.c中实现的,其通过hardware来赋值.hardware首先被/proc/cpuinfo赋值.然后会检測comandline. 假设comandline中有參数为androidboot.hardware,那这个參数在in

Android动态换肤(一、应用内置多套皮肤)

动态换肤在很多android应用中都有使用,用户根据自己的喜好设置皮肤主题,可以增强用户使用应用的舒适度. Android换肤可以分为很多种,它们从使用方式,用户体验以及项目框架设计上体现了明显的差异. 接下来几篇文章分别讲解其中比较主流的换肤方式. 应用内置皮肤实现动态切换在技术上是最容易实现的,但有很多局限性,比如不能在使用过程中增减皮肤,除非升级应用,扩展性很弱:如果需要设置皮肤的位置很多,编码起来比较麻烦.主要是使用 SharedPreferences记录当前设置的皮肤序号,然后加载这套

android 二维码 扫描与生成(内置)

本文使用 zxing-android-embedded 这个开源项目实现 二维码扫描/生成 功能: 开发工具:android studio 1.如何将zxing-android-embedded添加到我们的项目中 1.1  添加arr依赖包 将以下代码添加到build.gradle文件中. repositories {     mavenCentral()     maven {         url "https://dl.bintray.com/journeyapps/maven"

常用Shell脚本编写的内置变量

参数处理-Shell传入参数的处理 $# 传递到脚本的参数个数 $* 以一个单字符串显示所有向脚本传递的参数.与位置变量不同,此选项参数可超过9个 $$ 脚本运行的当前进程ID号 $! 后台运行的最后一个进程的进程ID号 [email protected] 与$#相同,但是使用时加引号,并在引号中返回每个参数 $- 显示shell使用的当前选项,与set命令功能相同 $? 显示最后命令的退出状态.0表示没有错误,其他任何值表明有错误. 变量 含义 $0 脚本名字 $1 位置参数 #1 $2 -

开源的Android开发框架-------PowerFramework使用心得(三)内置浏览器BrowserActivity

使用内置浏览器必须是引用源码的方式(因为jar中不能打包布局文件等资源).内置浏览器是一个继承自BaseActivity的普通Activity,使用WebView实现. 1.简单的打开内置浏览器 Intent i = new Intent(this,BrowserActivity.class); i.putExtra("url", "http://www.baidu.com/"); startActivity(i); 2.设置浏览器主题 Intent i = new

Android启动脚本init.rc(2)

在Android中使用启动脚本init.rc,可以在系统的初始化中进行简单的操作. init.rc启动脚本路径:system/core/rootdir/init.rc 内容: Commands:命令 Actions:动作 Triggers:触发条件 Services:服务 Options:选项 Properties:属性 Commands是一些基本操作.如: mkdir /system    mkdir /data 0771 system system    mkdir /persist 077