AllowBackup,打开子应用,不显示桌面图标的子apks,label标签的区别,AndroidManifest.xml中的package

目录

AndroidManifest.xml中的AllowBackup

打开子应用;

不显示桌面图标的子apks

 label标签的区别

AndroidManifest.xml中的package


AndroidManifest.xml中的AllowBackup

AllowBackup是在Android 2.2中引入的一个系统备份的功能。允许用户备份系统应用和第三方应用的apk安装包和应用数据,以便在刷机或者数据丢失后恢复应用,用户即可通过adb backup和adb restore来进行对应用数据的备份和恢复。第三方应用开发者需要在应用的 AndroidManifest.xml 文件中配置 allowBackup 标志(默认为 true )来设置应用数据是否能能够被备份或恢复。

Android属性allowBackup安全风险源于adb backup容许任何一个能够打开USB 调试开关的人从Android手机中复制应用数据到外设,一旦应用数据被备份之后,所有应用数据都可被用户读取;adb restore容许用户指定一个恢复的数据来源(即备份的应用数据)来恢复应用程序数据的创建。因此,当一个应用数据被备份之后,用户即可在其他Android手机或模拟器上安装同一个应用,以及通过恢复该备份的应用数据到该设备上,在该设备上打开该应用即可恢复到被备份的应用程序的状态。

其是通讯录应用,一旦应用程序支持备份和恢复功能,攻击者即可通过adb backup和adb restore进行恢复新安装的同一个应用来查看聊天记录等信息;对于支付金融类应用,攻击者可通过此来进行恶意支付、盗取存款等;因此为了安全起见,开发者务必将allowBackup标志值设置为false来关闭应用程序的备份和恢复功能,以免造成信息泄露和财产损失。

该漏洞的解决方案:

1.将allowBackup 的值设置为false;(allowBackup的值为false 对项目运行没有任何影响)

2.通过手机设备的IMEI号来辨识来设备编号和备份前是否一致,不一致则直接跳转登陆页面的同时清空当前应用数据及缓存;
 

打开子应用;

里面就一个按钮用于点击后打开子APP,核心跳转代码如下:

public void onClick(View view) {
    switch (view.getId()) {
    case R.id.btn_open_app:
         /*
         * Intent intent = getPackageManager().getLaunchIntentForPackage(
         * "com.example.noicontest"); if (intent != null) { //
         * startActivity(intent); } else { 
         * Toast.makeText(getApplicationContext(), "没有该子APP,请下载安装",
         * Toast.LENGTH_LONG).show(); }
         */

        Intent intent = new Intent();
        ComponentName cn = new ComponentName("com.example.noiconapp","com.example.noiconapp.MainActivity");
        intent.setComponent(cn);
        intent.setAction("android.intent.action.MAIN");
        try {
            startActivityForResult(intent, RESULT_OK);
        } catch (Exception e) {
            Toast.makeText(this, "没有该子APP,请下载安装",Toast.LENGTH_SHORT).show();
        }
        break;

    default:
        break;
    }
}

 

 

不显示桌面图标的子apks

其中要想不显示桌面图标只需修改AndroidManifest.xml文件即可。具体如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.noiconapp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="14" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.noiconapp.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <!-- 要想在桌面不显示图标,只需注释掉APP入口Activity中的下面这句即可,或者把下面的LAUNCHER改成DEFAULT也行 -->
            <!-- <category android:name="android.intent.category.LAUNCHER" /> -->
        </intent-filter>
    </activity>
</application>
</manifest>

上面的设置可以让桌面图标不显示的原因:

一般情况下,当我们的APK在被安装后,系统会自动创建我们的APK程序,系统Launcher(系统桌面应用程序)会自动检测系统已经安装的应用软件的包名,然后把这些APP的图标和名称解析出来后显示在应用程序列表里,一旦我们像上面那样设置不显示APK图标,则APK程序在运行后只会显示在“正在运行”的程序列表中,而不会在桌面上显示图标和名字。如果只是设置APP图标不可见而使用第一种方式(我注释的代码)打开APP是不会成功的,因为这样设置后,包名根本就没有加载到Launcher,所以通过 getPackageManager().getLaunchIntentForPackage()方法得到的Intent为null。

 label标签的区别

android:label="@string/app_name"> 意思是应用的名称,还有一个是主活动的名称。:label表示标签,@表示引用@string/app_name就是从string这个文件中引用叫app_name的这个键值对的值。

有以下几种情况: 
(1)activity的优先级高于application,也就是说两者都设置这个标签的话,activity的值覆盖application 
(2)application里设置了此标签,其他activity没有设置的情况下,应用程序名在桌面上的名字和所有activity的title是这个设置的标签 
(3)application里设置了此标签,主activity中也设置了此标签,则应用程序名和主activity的title都是主activity中设置的标签,其他非主activity的title如果没有自己设置此标签,还是使用application中设置的标签,如果其他非主activity也设置了此标签,则其title就是自己设置的这个标签

AndroidManifest.xml中的package

包名(package):指定本应用内java主程序包的包名。当没有指定apk的文件名时,编译后产生程序包将以此命名。本包名应当在Android系统运行时唯一。 

  1. 在两个不同的Application之间,用Application A的Activity A调用Application B的Activity B的时候,在AndroidManifest.xml中的package名称不能一样,否则安装完一个apk之后,再去安装另一个Application的apk的时候,会提示不存在,会有冲突,(install的时候,以内部package名字等信息为准,不是apk的名字为准),即使apk名字不同,AndroidManifest.xml中的package名相同会提示冲突。
  2. 所以,不同的Application,AndroidManifest.xml中的package名一定要不同,当一个Application中有多个package的时候,以这个Application的入口(MAIN+LAUNCHER的intent-filter)所在的包名为AndroidManifest.xml中的package名。如果一个Application没有入口程序,如packages/apps/Bluetooth,那以哪个包名作为AndroidManifest.xml中的package名都可以。
原创文章 685 获赞 746 访问量 68万+

猜你喜欢

转载自blog.csdn.net/qq_38998213/article/details/106163653