配备信息,也急需领悟怎么轻松到手的措施

导语

在android的社会风气了,差其余软件,硬件音讯就如一个国家的经济水平,军事水平,差距的安排参数,代表着一个android帝国的强弱,所以厂商喜欢打配置战。

玩了这么久的Android设备,作为一个开发者,其实须要比普通用户知道愈多关于Android
系统的音信,固然不了然,也须求了然怎么轻松收获的不二法门

重中之重内容

  • Android系统音信的收获
  • PackageManager的使用
  • ActivityManager的使用
  • 解析Packages.xml获取系统消息
  • Android安全机制
  • Android系统音信的获取
  • PackageManager的使用
  • ActivityManager的使用
  • Android安全部制

具体内容

Android系统音讯的获得

由于android手机的开源性,手机的配备各式各个,那个优化大师之类的东西,都足以跑分和看布署音信,那他们是从哪里知道那个音讯的啊?遥想获取系统的安插音信,经常可以从以下多少个地点得到

  • android.os.Build
  • SystemProperty

Android系统音讯的取得

是因为android手机的开源性,手机的配备各式各类,那个优化大师之类的事物,都得以跑分和看安插新闻,那她们是从何地知道那一个音信的吧?遥想获取系统的布局新闻,日常可以从以下五个方面取得:

  • android.os.Build
  • SystemProperty
1.android.os.Build

android.os.Build类里面的音信充裕的丰盛,它富含了系统编译时的雅量装备,配置音信,我们列举一点

  • Build.BOARD——主板
  • Build.BRAND——Android系统定制商
  • Build.SUPPORTED_ABIS——CPU指令集
  • Build.DEVICE——设备参数
  • Build.DISPLAY——屏幕参数
  • Build.FINGERPRINT——唯一编号
  • Build.SERIAL——硬件体系号
  • Build.ID——修订版本列表
  • Build.MANUFACTURER——硬件创制商
  • Build.MODEL——版本
  • Build.HARDWARE——硬件名
  • Build.PRODUCT——手机产品名
  • Build.TAGS——描述Build的标签
  • Build.TYPE——Builder类型
  • Build.VERSION.CODENAME——当前开发代号
  • Build.VERSION.INCREMENTAL——源码控制版本号
  • Build.VERSION.RELEASE——版本字符串
  • Build.VERSION.SDK_INT——版本号
  • Build.HOST——host值
  • Build.USER——User名
  • Build.TIME——编译时间

地点的局地参数没有注释,他们来自系统的RO值中,那么些值都是手机生产商配置的只读的参数值,依据厂家的计划不一致而差距,接下去我们再来看一下另一个存储设备软硬件新闻的类——SystemProperty

android.os.Build

android.os.Build类里面的音信相当的增加,它包括了系统编译时的豁达装置,配置音信,大家列举一点:

  • Build.BOARD——主板
  • Build.BRAND——Android系统定制商
  • Build.SUPPORTED_ABIS——CPU指令集
  • Build.DEVICE——设备参数
  • Build.DISPLAY——显示器参数
  • Build.FINGERPRINT——唯一编号
  • Build.SERIAL——硬件系列号
  • Build.ID——修订版本列表
  • Build.MANUFACTURER——硬件成立商
  • Build.MODEL——版本
  • Build.HARDWARE——硬件名
  • Build.PRODUCT——手机产品名
  • Build.TAGS——描述Build的标签
  • Build.TYPE——Builder类型
  • Build.VERSION.CODENAME——当前付出代号
  • Build.VERSION.INCREMENTAL——源码控制版本号
  • Build.VERSION.RELEASE——版本字符串
  • Build.VERSION.SDK_INT——版本号
  • Build.HOST——host值
  • Build.USER——User名
  • Build.TIME——编译时间

上边的一部分参数没有注释,他们来自系统的RO值中,那个值都是手机生产商配置的只读的参数值,根据厂家的布置不一样而不相同,接下去大家再来看一下另一个存储设备软硬件音信的类——SystemProperty。

2.SystemProperty

SystemProperty类包罗了过多体系布置属性值和参数,很多音信和方面通过android.os.Build获取的值是平等的,大家列举部分常用的

  • os.version——OS版本
  • os.name——OS名称
  • os.arch——OS架构
  • user.home——home属性
  • user.name——name属性
  • user.dir——Dir属性
  • user.timezone——时区
  • path.separator——路径分隔符
  • line.separator——行分隔符
  • file.separator——文件分隔符
  • java.vendor.url——Java vender Url属性
  • java.class.path——Java Class属性
  • java.class.version——Java Class版本
  • java.vendor——Java Vender属性
  • java.version——Java版本
  • java.home——Java Home属性
SystemProperty

SystemProperty类包括了如拾草芥种类安插属性值和参数,很多音信和上边通过android.os.Build获取的值是一致的,大家列举部分常用的:

  • os.version——OS版本
  • os.name——OS名称
  • os.arch——OS架构
  • user.home——home属性
  • user.name——name属性
  • user.dir——Dir属性
  • user.timezone——时区
  • path.separator——路径分隔符
  • line.separator——行分隔符
  • file.separator——文件分隔符
  • java.vendor.url——Java vender Url属性
  • java.class.path——Java Class属性
  • java.class.version——Java Class版本
  • java.vendor——Java Vender属性
  • java.version——Java版本
  • java.home——Java Home属性
3. Android系统音信实例

废话不多说,直接上例子吗

        textView = findViewById(R.id.textView);

        stringBuilder = new StringBuilder();
        stringBuilder.append("\n Build.BOARD ==="+ Build.BOARD);
        stringBuilder.append("\n Build.BRAND ==="+ Build.BRAND);
        stringBuilder.append("\n Build.SUPPORTED_ABIS ==="+ Build.SUPPORTED_ABIS);
        stringBuilder.append("\n Build.DEVICE ==="+ Build.DEVICE);
        stringBuilder.append("\n Build.DISPLAY ==="+ Build.DISPLAY);
        stringBuilder.append("\n Build.FINGERPRINT ==="+ Build.FINGERPRINT);
        stringBuilder.append("\n Build.SERIAL ==="+ Build.SERIAL);

        stringBuilder.append("\n Build.HOST ==="+ Build.HOST);
        stringBuilder.append("\n Build.USER ==="+ Build.USER);
        stringBuilder.append("\n Build.TIME ==="+ Build.TIME);
        stringBuilder.append("\n ================================");
        stringBuilder.append("\n version ==="+ System.getProperty("os.version"));
        stringBuilder.append("\n name ==="+ System.getProperty("os.name"));
        stringBuilder.append("\n arch ==="+ System.getProperty("os.arch"));
        stringBuilder.append("\n home ==="+ System.getProperty("user.home"));
        stringBuilder.append("\n name ==="+ System.getProperty("user.name"));
        stringBuilder.append("\n dir ==="+ System.getProperty("user.dir"));
        stringBuilder.append("\n timezone ==="+ System.getProperty("user.timezone"));
        stringBuilder.append("\n path separator ==="+ System.getProperty("path.separator"));
        stringBuilder.append("\n line separator ==="+ System.getProperty("line.separator"));
        stringBuilder.append("\n file separator ==="+ System.getProperty("file.separator"));
        stringBuilder.append("\n java.vendor.url ==="+ System.getProperty("java.vendor.url"));
        stringBuilder.append("\n java.class.path ==="+ System.getProperty("java.class.path"));
        stringBuilder.append("\n java.class.version ==="+ System.getProperty("java.class.version"));
        stringBuilder.append("\n java.vendor ==="+ System.getProperty("java.vendor"));
        stringBuilder.append("\n java.version ==="+ System.getProperty("java.version"));
        stringBuilder.append("\n java.home ==="+ System.getProperty("java.home"));

        textView.setText(stringBuilder);
Android系统信息实例

下边我们用一个简练的实例来询问一下把。

透过android.os.Build那个类,大家可以直接拿走到Build提供的体系消息,而由此System.getProperty(“xxx”),大家可以访问到系统的性质。

在实例中收获到的新闻与上述的基本一致,运行如图。

tv_message.append("主板:"+ Build.BOARD+"\n");
tv_message.append("Android系统定制商:"+ Build.BRAND+"\n");
tv_message.append("CPU指令集:"+ Build.SUPPORTED_ABIS+"\n");
tv_message.append("设置参数:"+ Build.DEVICE+"\n");
tv_message.append("显示屏参数:"+ Build.DISPLAY+"\n");
tv_message.append("唯一编号:"+ Build.SERIAL+"\n");

用System.getProperty。

tv.append("OS版本:"+System.getProperty("os.version")+"\n");
tv.append("OS名称:"+System.getProperty("os.name")+"\n");
tv.append("OS架构:"+System.getProperty("os.arch")+"\n");
tv.append("Home属性:"+System.getProperty("user.home")+"\n");
tv.append("Name属性:"+System.getProperty("user.name")+"\n");

代码贴上一点就可以了

运转的实例程序中大家可以看看,大家早就收获到了一对一多的体系音讯,那么那一个信息的起点又是何地呢?记得大家分析android系统目录的时候提到过,在system/build.prop中,蕴涵了无数的RO值,打开命令窗,通过cat
build.prop能够看到。

此间大家得以观察不少面前通过android.os.Build所收获到的系统音讯,同时,在adb
shell中,还足以经过getprop来得到相应的值。

除却上述的四个法子,android系统还在其余一个非常重大的目录来储存系统音讯——/proc目录,在adb
shell中进入/proc目录,通过ll命令查看文件新闻。

看了那样多系统信息,应该看Apk应用音信了,在ADB
Shell命令中,有三个要命强劲的副手,PM和AM,PM主宰着应用的包管理,而AM主宰着应用的移动管理。

Android Apk 应用音信得到之 PackageManager

  • PackageManager
![](https://upload-images.jianshu.io/upload_images/688934-1752ffe663b6245b.png)

Package结构

最里面的框就象征全体Activity的信息,系统提供了ActivityInfo类来进展包装
而Android提供了PackageManager来负责管理所有已设置的App,PackageManager能够得到AndroidManifest中分化节点的包装新闻,下边是一些常用的卷入音信:

  • ActivityInfo

ActivityInfo封装在了Mainfest文件中的< activity >和<
receiver>之间的具有音讯,包罗name、icon、label、launchMode等。

  • ServiceInfo

瑟维斯(Service)Info与ActivityInfo类似,封装了< service>之间的持有新闻。

  • ApplicationInfo

它包裹了<
application>之间的音讯,特其他是,ApplicationInfo包括了诸多Flag,FLAG_SYSTEM表示为系统应用,FLAG_EXTERNAL_STORAGE代表为设置在SDcard上的接纳,通过这几个flag可以很便宜的判定应用的门类。

  • PackageInfo

PackageInfo包涵了有着的Activity和瑟维斯(Service)音信。

  • ResolveInfo

ResolveInfo包蕴了<
intent>音信的顶头上司音讯,所以它可以重临ActivityInfo、ServiceInfo等带有了<
intent>的新闻,平日用来支持找到这么些饱含特定intent条件的音信,如带分享作用、播放效果的采纳。
有了这么些包裹的新闻后,还索要有一定的方法来博取它们,上边就是PackageManager中封装的用来收获那几个音信的法子:

  • getPackageManager()——通过那个方法可以再次回到一个PackageManager对象。

  • getApplicationInfo()——以ApplicationInfo的形式重回指定包名的ApplicationInfo。

  • getApplicationIcon()——重回指定包名的Icon。

  • getInstalledApplications()——以ApplicationInfo的方式再次回到安装的应用。

  • getInstalledPackages()——以PackageInfo的款型重临安装的施用。

  • queryIntentActivities()——重临指定Intent的ResolveInfo对象、Activity集合。

  • queryIntentService(Service)s()——再次来到指定Intent的ResolveInfo对象、Service(Service)集合。

  • resolveActivity()——再次来到指定Intent的Activity。

  • resolve瑟维斯(Service)()——重回指定Intent的Service。

根据ApplicationInfo的flag来判断App的类型:

  • 如果当前应用的flags & ApplicationInfo.FLAG_SYSTEM != 0则为系统应用

  • 如果flags & ApplicationInfo.FLAG_SYSTEM <= 0 则为第三方使用

  • 卓殊规的当系统选取升级后也会化为第三方使用,此时 flags &
    ApplicationInfo.FLAG_UPDATED_SYSTEM_APP != 0;

  • 如果flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE != 0
    则为设置在SDCard上的应用。

关键代码粘过来,很粗略的

package com.example.androidsystem;

import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

/**
* Created by Younger on 2018/3/12.
*/
public class PMManageActivity extends AppCompatActivity implements View.OnClickListener {
   private PackageManager mPackageManager;

   private ListView mListView;
   private PackageAdapter mAdapter;
   List<PMBean> result;
   @Override
   protected void onCreate(@Nullable Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main_list_activity);
       mPackageManager = getPackageManager();
       mListView = (ListView) findViewById(R.id.mListView);
       mAdapter = new PackageAdapter(this);
       mListView.setAdapter(mAdapter);
       findViewById(R.id.btn_all).setOnClickListener(this);
       findViewById(R.id.btn_other).setOnClickListener(this);
       findViewById(R.id.btn_system).setOnClickListener(this);

   }

   @Override
   public void onClick(View view) {
       switch (view.getId()) {
           case R.id.btn_all:
               result = getAppInfo(R.id.btn_all);
               break;
           case R.id.btn_other:
               result = getAppInfo(R.id.btn_other);
               break;
           case R.id.btn_system:
               result = getAppInfo(R.id.btn_system);
               break;
           default:
               result = new ArrayList<>();
       }
       mAdapter.addAll(result);
   }

   private List<PMBean> getAppInfo(int flag) {
       List<ApplicationInfo> appInfos = mPackageManager.getInstalledApplications(
               PackageManager.GET_UNINSTALLED_PACKAGES);
       List<PMBean> list = new ArrayList<>();
       //根据不同的flag来切换显示不同的App类型
       switch (flag) {
           case R.id.btn_all:
               list.clear();
               for (ApplicationInfo appInfo : appInfos) {
                   list.add(makeAppInfo(appInfo));
               }

               break;
           case R.id.btn_other:
               list.clear();
               for (ApplicationInfo appInfo : appInfos) {
                   if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {
                       list.add(makeAppInfo(appInfo));
                   } else if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0){
                       list.add(makeAppInfo(appInfo));
                   }
               }
               break;
           case R.id.btn_system:
               list.clear();
               for (ApplicationInfo appInfo : appInfos) {
                   if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
                       list.add(makeAppInfo(appInfo));
                   }
               }
               break;
       }
       return list;
   }

   private PMBean makeAppInfo(ApplicationInfo appInfo) {
       PMBean info = new PMBean();
       info.setAppIcon(appInfo.loadIcon(mPackageManager));
       info.setAppLabel(appInfo.loadLabel(mPackageManager).toString());
       info.setPkgName(appInfo.packageName);
       return info;
   }

}

PackageManager——APK应用程序音讯获取值

俺们看一张图:

Package结构图

最中间的框就表示整个Activity的音讯,系统提供了ActivityInfo类来拓展打包。
而Android提供了PackageManager来负责管理所有已安装的App,PackageManager可以获取AndroidManifest中不相同节点的包装新闻,下边是一对常用的包装音讯:

  • ActivityInfo

ActivityInfo封装在了Mainfest文件中的< activity >和<
eceiver>之间的具有新闻,包含name、icon、label、launchMode等。

  • ServiceInfo

Service(Service)Info与ActivityInfo类似,封装了< service>之间的具备音信。

  • ApplicationInfo

它包裹了<
application>之间的音讯,特其余是,ApplicationInfo蕴含了好多Flag,FLAG_SYSTEM表示为系统应用,FLAG_EXTERNAL_STORAGE代表为设置在SDcard上的采纳,通过这个flag可以很便宜的判定应用的档次。

  • PackageInfo

PackageInfo包涵了所有的Activity和瑟维斯(Service)消息。

  • ResolveInfo

ResolveInfo包涵了<
intent>音信的上级信息,所以它可以回来ActivityInfo、ServiceInfo等含有了<
intent>的音讯,日常用来赞助找到这几个富含特定intent条件的音信,如带分享效率、播放效果的施用。

有了这一个包裹的信息后,还亟需有特定的艺术来收获它们,下边就是PackageManager中封装的用来取得这一个新闻的不二法门:

  • getPackageManager():通过这么些措施可以回来一个PackageManager对象。
  • getApplicationInfo():以ApplicationInfo的格局重临指定包名的ApplicationInfo。
  • getApplicationIcon():重返指定包名的Icon。
  • getInstalledApplications():以ApplicationInfo的花样重回安装的行使。
  • getInstalledPackages():以PackageInfo的样式再次回到安装的应用。
  • queryIntentActivities():重临指定Intent的ResolveInfo对象、Activity集合。
  • queryIntentServices():重临指定Intent的ResolveInfo对象、瑟维斯集合。
  • resolveActivity():再次来到指定Intent的Activity。
  • resolveService(Service)():再次来到指定Intent的瑟维斯(Service)。

根据ApplicationInfo的flag来判断App的类型:

  • 比方当前利用的flags & ApplicationInfo.FLAG_SYSTEM !=
    0则为系统选拔。
  • 如果flags & ApplicationInfo.FLAG_SYSTEM <= 0 则为第三方选拔。
  • 出奇的当系统应用升级后也会化为第三方选拔,此时 flags &
    ApplicationInfo.FLAG_UPDATED_SYSTEM_APP != 0。
  • 如果flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE != 0
    则为设置在SDCard上的使用。

我们经过一个实例来分析。
大家封装一个Bean来保存我们所需的字段:

package com.lgl.systemmesage;

import android.graphics.drawable.Drawable;

/**
 * Bean
 * Created by LGL on 2016/4/28.
 */
public class PMAPPInfo {

    //应用名
    private String appLabel;
    //图标
    private Drawable appIcon;
    //包名
    private String pkgName;

    //构造方法
    public PMAPPInfo(){

    }

    public String getAppLabel() {
        return appLabel;
    }

    public void setAppLabel(String appLabel) {
        this.appLabel = appLabel;
    }

    public Drawable getAppIcon() {
        return appIcon;
    }

    public void setAppIcon(Drawable appIcon) {
        this.appIcon = appIcon;
    }

    public String getPkgName() {
        return pkgName;
    }

    public void setPkgName(String pkgName) {
        this.pkgName = pkgName;
    }
}

接下去,大家由此地方的方法判断各系列型的使用,大家的主布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <Button
        android:id="@+id/btn_all"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="All APP"
        android:textAllCaps="false" />

    <Button
        android:id="@+id/btn_other"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Other App"
        android:textAllCaps="false" />

    <Button
        android:id="@+id/btn_system"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="System App"
        android:textAllCaps="false" />

    <ListView
        android:id="@+id/mListView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"></ListView>

</LinearLayout>

此间有一个listview,所以大家须要一个adapter和一个item:

package com.lgl.systemmesage;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

/**
 * 数据源
 * Created by LGL on 2016/4/28.
 */
public class PkgAdapter extends BaseAdapter {
    private Context mContext;
    private List<PMAPPInfo> mList;

    public PkgAdapter(Context context) {
        mContext = context;
        mList = new ArrayList<>();
    }

    public void addAll(List<PMAPPInfo> list) {
        mList.clear();
        mList.addAll(list);
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return mList.size();
    }

    @Override
    public PMAPPInfo getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        PMAPPInfo item = getItem(position);
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);
            holder.mIcon = (ImageView) convertView.findViewById(R.id.iv_icon);
            holder.mLabel = (TextView) convertView.findViewById(R.id.tv_label);
            holder.mPkgName = (TextView) convertView.findViewById(R.id.tv_pkg_name);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.mIcon.setImageDrawable(item.getAppIcon());
        holder.mLabel.setText(item.getAppLabel());
        holder.mPkgName.setText(item.getPkgName());
        return convertView;
    }

    static class ViewHolder {
        ImageView mIcon;
        TextView mLabel;
        TextView mPkgName;
    }
}

item就大约了:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/empty"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_vertical"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginLeft="15dp"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv_label"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/tv_pkg_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </LinearLayout>

</LinearLayout>

那大家主程序的逻辑就是:

package com.lgl.systemmesage;

import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

/**
 * 软件列表
 * Created by LGL on 2016/4/28.
 */
public class APP extends AppCompatActivity implements View.OnClickListener{

    private PackageManager mPackageManager;

    private ListView mListView;
    private PkgAdapter mAdapter;
    List<PMAPPInfo> result;

    protected void onCreate( Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_app);

        mPackageManager = getPackageManager();
        mListView = (ListView) findViewById(R.id.mListView);
        mAdapter = new PkgAdapter(this);
        mListView.setEmptyView(findViewById(R.id.empty));
        mListView.setAdapter(mAdapter);
        findViewById(R.id.btn_all).setOnClickListener(this);
        findViewById(R.id.btn_other).setOnClickListener(this);
        findViewById(R.id.btn_system).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_all:
                result = getAppInfo(R.id.btn_all);
                break;
            case R.id.btn_other:
                result = getAppInfo(R.id.btn_other);
                break;
            case R.id.btn_system:
                result = getAppInfo(R.id.btn_system);
                break;
            default:
                result = new ArrayList<>();
        }
        mAdapter.addAll(result);
    }

    private List<PMAPPInfo> getAppInfo(int flag) {
        List<ApplicationInfo> appInfos = mPackageManager.getInstalledApplications(
                PackageManager.GET_UNINSTALLED_PACKAGES);
        List<PMAPPInfo> list = new ArrayList<>();
        //根据不同的flag来切换显示不同的App类型
        switch (flag) {
            case R.id.btn_all:
                list.clear();
                for (ApplicationInfo appInfo : appInfos) {
                    list.add(makeAppInfo(appInfo));
                }

                break;
            case R.id.btn_other:
                list.clear();
                for (ApplicationInfo appInfo : appInfos) {
                    if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {
                        list.add(makeAppInfo(appInfo));
                    } else if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0){
                        list.add(makeAppInfo(appInfo));
                    }
                }
                break;
            case R.id.btn_system:
                list.clear();
                for (ApplicationInfo appInfo : appInfos) {
                    if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
                        list.add(makeAppInfo(appInfo));
                    }
                }
                break;
        }
        return list;
    }

    private PMAPPInfo makeAppInfo(ApplicationInfo appInfo) {
        PMAPPInfo info = new PMAPPInfo();
        info.setAppIcon(appInfo.loadIcon(mPackageManager));
        info.setAppLabel(appInfo.loadLabel(mPackageManager).toString());
        info.setPkgName(appInfo.packageName);
        return info;
    }
}

效果图:

效果图

Android Apk 应用新闻获得之 ActivityManager

PackageManager 重点在于获取行使的包消息,ActivityManager
重点在于获得运行的应用程序音信,
同PackageManager一样,ActivityManager也卷入了诸多的Bean对象,我们选多少个第一来说一下

  • ActivityManager.MemoryInfo

MemoryInfo有多少个更加主要的字段:availMem(系统可用内存),totalMem(总内存),threshold(低内存的阈值,即区分是还是不是低内存的临界值),lowMemory(是还是不是处在低内存)。

  • Debug.MemoryInfo

其一MemoryInfo用于总计进程下的内存新闻。

  • RunningAppProcessInfo

运行进度的音讯,存储的字段有:processName(进程名),pid(进度pid),uid(进度uid),pkgList(该进程下的具有包)

  • RunningServiceInfo

运行的服务音信,在它其中同样包罗了有的劳务进度音讯,同时还有一对其他消息。activeSince(第五次被激活的时光、形式),foreground(服务是或不是在后台执行)。

获取ActivityManager
activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);

/**
     * 正在运行
     * @return
     */
    private List<ActivityManager.RunningAppProcessInfo> getRunningProcossInfo(){
        mAMProcessInfo = new ArrayList<>();
        List<ActivityManager.RunningAppProcessInfo>appRunningList = activityManager.getRunningAppProcesses();

        for (int i = 0;i<appRunningList.size();i++){
            ActivityManager.RunningAppProcessInfo info = appRunningList.get(i);
            int pid = info.pid;
            int uid = info.uid;
            String procossName = info.processName;
            int[]memoryPid = new int[]{pid};
            Debug.MemoryInfo[] memoryInfos = activityManager.getProcessMemoryInfo(memoryPid);

            int memorySize = memoryInfos[0].getTotalPss();

            AMProcessInfo processInfo = new AMProcessInfo();
            processInfo.setPid(""+pid);
            processInfo.setUid(""+uid);
            processInfo.setMemorySize(""+memorySize);
            processInfo.setProcessName(procossName);
            appRunningList.add(processInfo);
        }
        return  appRunningList;
    }

ActivityManager——Apk应用消息获取

眼前所选取的packagemanager获取的是持有的选拔包名,不过哼哈二将还有一名大奖没有商讨,那就是ActivityManager了,他的效果四号不逊色前者,事实上,他在利用上各有中央,前者侧重于获取使用的包新闻,后者获取运行的应用程序音讯。

同packagemanager一样,ActivityManager也卷入了过多的Bean对象,大家选多少个重大来说一下:

  • ActivityManager.MemoryInfo——MemoryInfo有多少个要命重大的字段:availMem(系统可用内存),totalMem(总内存),threshold(低内存的阈值,即区分是还是不是低内存的临界值),lowMemory(是还是不是处于低内存)。
  • Debug.MemoryInfo——那几个MemoryInfo用于计算进度下的内存音信。
  • RunningAppProcessInfo——运行进度的新闻,存储的字段有:processName(进度名),pid(进程pid),uid(进度uid),pkgList(该进度下的装有包)
  • RunningService(Service)Info——运行的劳务新闻,在它里面同样富含了部分服务进程消息,同时还有局地此外音讯。activeSince(第三遍被激活的时光、情势),foreground(服务是或不是在后台执行)。

大家一样的用一个实例来讲学:

package com.lgl.systemmesage;

/**
 * Created by LGL on 2016/4/28.
 */
public class AMProcessInfo {

    private String pid;
    private String uid;
    private String memorySize;
    private String processName;

    public  AMProcessInfo(){

    }

    public String getPid() {
        return pid;
    }

    public void setPid(String pid) {
        this.pid = pid;
    }

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getProcessName() {
        return processName;
    }

    public void setProcessName(String processName) {
        this.processName = processName;
    }

    public String getMemorySize() {
        return memorySize;
    }

    public void setMemorySize(String memorySize) {
        this.memorySize = memorySize;
    }
}

下一场大家用一个办法就足以得到到了:

 /**
     * 正在运行
     * @return
     */
    private List<ActivityManager.RunningAppProcessInfo> getRunningProcossInfo(){
        mAMProcessInfo = new ArrayList<>();
        List<ActivityManager.RunningAppProcessInfo>appRunningList = activityManager.getRunningAppProcesses();

        for (int i = 0;i<appRunningList.size();i++){
            ActivityManager.RunningAppProcessInfo info = appRunningList.get(i);
            int pid = info.pid;
            int uid = info.uid;
            String procossName = info.processName;
            int[]memoryPid = new int[]{pid};
            Debug.MemoryInfo[] memoryInfos = activityManager.getProcessMemoryInfo(memoryPid);

            int memorySize = memoryInfos[0].getTotalPss();

            AMProcessInfo processInfo = new AMProcessInfo();
            processInfo.setPid(""+pid);
            processInfo.setUid(""+uid);
            processInfo.setMemorySize(""+memorySize);
            processInfo.setProcessName(procossName);
            appRunningList.add(processInfo);
        }
        return  appRunningList;
    }

效果图:

效果图

解析Packages.xml获取系统音信

深谙Android开机启动流程的敌人差不多知道,在系统开首化到时候,packagemanager的最底层达成类packagemanagerService会去扫描系统的有的一定目录,并且解析其中的Apk文件,同时Android把她取获得的施用信息保存到xml中,做成一个利用的名单,就是data/system/apckages.xml,我们用adb
pull命令把他导出来,里面的音讯也太多了,可是大家如若知道结果根节点就足以了

  • < permissions>标签

permissions标签定义了现行系统具有的权位,也分两类,系统定义的和app定义的

  • < package>标签

package代表的是一个apk的性能

个中各节点的音信意义大致为

  • name:APK的包名
  • cadePath:APK安装路径,首要在system/app和data/app三种,前者放系统级其他,后者放系统装置的
  • userid:用户ID
  • version:版本
  • < perms>标签

因而这个xml文件的竹签,可以博得到许多手机使用的新闻,平日在进展系统层开发的时候,可以透过那个xml获取越多有含义的东西

解析Packages.xml获取系统新闻

熟悉Android开机启动流程的情人大概知道,在系统开首化到时候,packagemanager的平底达成类packagemanagerService会去扫描系统的部分特定目录,并且解析其中的Apk文件,同时Android把她获得到的利用新闻保存到xml中,做成一个选拔的花名册,就是data/system/apckages.xml,大家用adb
pull命令把他导出来,里面的消息也太多了,不过大家要是精晓结果根节点就足以了。

  • <permissions>标签

permissions标签定义了明天系统有着的权杖,也分两类,系统定义的和app定义的。

  • <package>标签

package代表的是一个apk的特性。其中各节点的信息意义大概为:

  • name:APK的包名
  • cadePath:APK安装路径,首要在system/app和data/app两种,前者放系统级其余,后者放系统装置的
  • userid:用户ID
  • version:版本
  • <perms>标签

对应apk的清单文件,记录apk的权柄音信。

通过这一个xml文件的竹签,可以收获到许多手机使用的信息,经常在展开系统层开发的时候,可以由此那些xml获取更多有意义的事物。

Android安全机制
  • 首先道防线

代码安全机制——代码混淆proguard
鉴于java语言的特殊性,即使是编译成apk的应用程序也存在反编译的高风险,而proguard则是在代码从上对app的率先道程序,他混淆关键代码,替换命名,让破坏者阅读难,同样也得以减掉代码,优化编译后的字节

  • 第二道防线

利用接入权限决定——清单文件权限评释,权限检查机制,
其余app在使用Android受限资源的时候,都须要出示向系统生命权限,唯有当一个应用app具有相应的权限,才能报名相应的资源,通过权限机制的检讨并且使用并且使用系统的Binder对象达成对系统服务的调用,可是这道防线也有天赋的供不应求,如以下几项

  • 被赋予的权力不可以甘休
  • 在运用注明app使用权力的时候,用户无法针对有些权力举办限定
  • 权限的判定机制与用户的平安理念相关

Android系统平时按照以下依次来检查操作者的权限.
第一,判断permission名称.即使为空则直接回到PERMISSION_DENIED
附带。判断Uid,假设为0则为root权限,不做权限控制,倘若为systyemsystem
service的uid则为系统服务.不做权限决定:即便Uid与参数中的请求uid不一致则赶回PERMISSION_DENIED
终极,通过调用packagemanageservice.checkUidPermission()方法来判定该uid是不是有所相应的权柄,该格局会去xml的权柄列表和系统级的权能举行搜索
透过地方的步骤Android就确定了使用者是还是不是具备某项使用权力

  • 其三道防线

利用签名机制一数字证书。
Android中享有的app都会有个数字证书,那就是app的签名.数字证书用于敬服app的小编和其app的相信关系,只有所有同样数字签名的app,才会在升级时被认为是同一app,而且Android系统不会设置没有签约的App

  • 第四道防线

Linux内核层安全机制一一Uid 访问权限决定。
Animid本质是基于Linux内核开发的,所以Android同样三番五次了Linux的安全特点,比如Linux文件系统的权位决定是由user,group,other与读,写,执行的两样组合来兑现的,同样,Android也促成了那套机制”寻常景况下.唯有system,root用户才有权力访问到系统文件,而貌似用户不可以访问。

  • 第五道防线

Android虚拟机沙箱机制——沙箱隔离
Android的App运行在虚拟机中
因而才有沙箱机制,可以让动用之间相互隔离,经常景况下.不相同的施用之间不可能相互访问.每个App都单身的运行在虚似机中,与其它使用完全隔离.在落到实处长治体制的根底上,也让动用之间可以互不影响,即时一个应用崩溃,,也不会招致其他应用尤其

虽说经过以上的五道防线.如故不可以完全保障Android的着力安全”但却足以在最大程度上给破坏者扩充难度,从一边来说”那一个破坏者的破解也真是推动Android安全机制日趋完善的动力.

Android安全体制

道高一尺魔高一丈,自古以来就不曾什么相对的平安,所以谷歌(Google)也树立起了一层层的壁垒,珍爱Android的中央安全,大家来详细询问一下。

Android系统安全隐患
  • 1.代码破绽

其一问题存在世界上富有的次序中,没有何人敢有限支撑自己的次序尚未bug,有尾巴,要是赶上那种问题,我们不得不赶紧的晋级版本,更新补丁,才能杜绝利用漏洞的攻击装,比如Android的LaunchAnyWhere,FakeId,那几个都是bug,就是在编制的时候发出的狐狸尾巴,唯有期待官方的更新了

    1. root风险

Root权限是指Android的系统管理员权限,类似于windows系统中的Administrator。具有Root权限的用户能够访问和改下手机中大约拥有的文件,“Root”在一段时间内早已成为Android的代名词,
无Root,不Android”。的确,Root掉手机后,可以解锁很多普通用户不能完结的办事,如限制种种应用app的数码流量.系统文件管理丶自定义修改系统等,但还要手机的安全性也会就此大降价扣。随着android系统越来越周详,root的须求性也越来越低普通用户在不root的境况下,完全可以健康使用大多数App。须要Root权限的大都为部分开发者,由于开发的需求,不得不将手机root,而root后的手机,就少了一层Linux的天然屏障,整个系统主旨就全盘暴光在人侵者面前,在你没有察觉的动静下大肆破坏。所以,针对普通用户,希望都尽量不要Root手机以免带来不须要的损失

    1. 安然机制不圆满

出于Android的权限管理机制并不周详,所以重重有线电话开发商,常常会在RoM中伸张和谐的一套权限管理工具来协理用户控制手机中行使的权柄,如应用许可

  • 4.用户安全意识

用户对于安全隐患的意识里也是爱抚手机安全的一个重点元素。用户能够经过在正规的利用市场下载和设置使用时通过列出来的选用权限申请音信来大致判断一个施用的安全性,比如大家已经万分爱好用的xx神器”,其实远非一点技术含量,无非就是在你安装了动用之后遍历一次你的联络人并发送带有链接的短信而已当用户在设置不明来源的使用时假设一个游玩项目标app生命权限的时候不但要挂钩人又要短信权限,这些时候就要求警醒了,用户也足以在市面上下载一些安全类App,如LEB安全大师,360平安等,
尽管那一个软件会加深系统承担,但是为了安全也是值得的

    1. Android开发规范与云浮

明朗,Android与ioS系统一个丰裕举世瞩目标分别就是_一个是开放系统,一个是查封系列,开放自然有开放的益处,技术发展快,产品增进,封闭也有查封的好处,安全性高,可控性高,谷歌(Google)本着开源的饱满开放了Android的源代码,但随之而来的各类安全问题也让Android倍受诟病,过度的绽开与可定制化,不仅导致了Android的碎片化严重,
同时也给众多地下应用以可乘之机,但可喜的是,随着Android的发展日益壮大,谷歌也在起初处理开发与乌兰察布的题目,相信在不久的明日,这一争持会愈加小

Android安全部制介绍
  • 先是道防线

代码安全机制——代码混淆proguard。
由于java语言的特殊性,固然是编译成apk的应用程序也设有反编译的风险,而proguard则是在代码从上对app的首先道程序,他混淆关键代码,替换命名,让破坏者阅读难,同样也得以减去代码,优化编译后的字节。

  • 其次道防线

应用接入权限控制——清单文件权限声明,权限检查体制。
其他app在采纳Android受限资源的时候,都亟待出示向系统生命权限,唯有当一个应用app具有相应的权杖,才能报名相应的资源,通过权限机制的反省并且使用并且应用系统的Binder对象达成对系统服务的调用,不过那道防线也有天赋的欠缺,如以下几项:

  • 被予以的权杖不能截至。
  • 在利用表明app使用权力的时候,用户不可以针对一些权力进行限制。
  • 权限的论断机制与用户的安全理念相关。

Android系统日常依照以下顺序来检查操小编的权位:

  • 先是,判断permission名称.倘诺为空则直接重临PERMISSION_DENIED
  • 说不上。判断Uid,假若为0则为root权限,不做权限决定,假如为systyemsystem
    service的uid则为系统服务.不做权限控制:假使Uid与参数中的请求uid分歧则赶回PERMISSION_DENIED
  • 最后,通过调用packagemanageservice.checkUidPermission()方法来判断该uid是或不是享有相应的权杖,该形式会去xml的权杖列表和系统级的权力举办查找

因而地方的步骤Android就确定了使用者是还是不是拥有某项使用权力。

  • 其三道防线

选取签名机制一数字证书。
Android中保有的app都会有个数字证书,那就是app的签名.数字证书用于尊敬app的小编和其app的相信关系,唯有所有同样数字签名的app,才会在晋级时被认为是同一app,而且Android系统不会设置没有签约的App。

  • 第四道防线

Linux内核层安全机制一一Uid 访问权限决定。
Animid本质是基于Linux内核开发的,所以Android同样三番五次了Linux的平安特点,比如Linux文件系统的权柄控制是由user,group,other与读,写,执行的两样组合来兑现的,同样,Android也促成了那套机制”平时情形下.只有system,root用户才有权力访问到系统文件,而一般用户无法访问。

  • 第五道防线

Android虚拟机沙箱机制——沙箱隔流。
Android的App运行在虚拟机中
因而才有沙箱机制,能够让动用之间相互隔离,平时景况下,分裂的应用之间无法互相走访。每个App都独立的运作在虚似机中,与其余使用完全隔离.在促成平安机制的基本功上,也让使用之间可以互不影响,即时一个行使崩溃,也不会招致其余使用极度。

固然通过上述的五道防线,照旧不能够一心有限帮衬Android的中坚安全,但却得以在最大程度上给破坏者增添难度,从一头来说,那一个破坏者的破解也不失为推动Android安全部制逐步周到的引力。

Android Apk反编译

关于反编译,看那篇小说就行了
http://unclechen.github.io/2016/09/07/Android%E5%8F%8D%E7%BC%96%E8%AF%91%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93/

好了 ,就这么些了;

Android系统安全隐患

就算Android建立起来了N道防线,可是并未相对的平安所以在Android中也有一对破解之法。

  • 代码漏洞

以此题目存在世界上存有的主次中,没有什么人敢保障自己的次序没有bug,有漏洞,若是遭遇那种问题,我们只好赶紧的升高版本,更新补丁,才能杜绝利用漏洞的攻击装,比如Android的LaunchAnyWhere,FakeId,这么些都是bug,就是在编辑的时候暴发的纰漏,唯有期待官方的翻新了。

  • root风险

Root权限是指Android的系统管理员权限,类似于windows系统中的Administrator。具有Root权限的用户可以访问和修改手机中大约所有的公文,“Root”在一段时间内一度成为Android的代名词,无Root,不Android”。的确,,Root掉手机后,可以解锁很多普通用户不可能做到的干活,如限制种种应用app的数码流量。系统文件管理,自定义修改系统等,但与此同时手机的安全性也会就此大降价扣。随着android系统进一步周全,root的必要性也越来越低普通用户在不root的状态下,完全可以健康使用一大半App。须求Root权限的大多为部分开发者,由于开发的急需,,将手机root,而root后的无绳电话机,就少了一层Linux的天然屏障,整个系统主题就全盘暴露在人侵者面前,在您未曾发现的景色下大肆破坏。所以,针对普通用户,希望都尽心尽力不要Root手机以免带来不要求的损失。

  • 有惊无险机制不周到

由于Android的权位管理机制并不完善,所以广大部手机开发商,平时会在Rom中追加和谐的一套权限管理工具来提携用户控制手机中使用的权力,如使用许可。

  • 用户安全意识

用户对于安全隐患的觉察里也是保护手机安全的一个最首要元素。用户可以透过在正儿八经的行使市场下载和安装使用时经过列出来的使用权限申请新闻来差不离判断一个用到的安全性,比如大家早已卓殊欢悦用的“xx神器”,其实并未一点技术含量,无非就是在您安装了运用之后遍历一回你的维系人并发送带有链接的短信而已当用户在安装不明来源的行使时一旦一个嬉戏项目标app生命权限的时候不仅要联络人又要短信权限,这一个时候就要求小心了,用户也得以在市场上下载一些贵港类App,如LEB安全大师,360中卫等,
纵然那个软件会强化系统负责,不过为了安全也是值得的。

  • Android开发规范与长治

强烈,Android与ios系统一个卓殊醒目的差别就是,一个是开放系统,一个是查封序列,开放自然有开放的益处,技术发展快,产品拉长,封闭也有查封的好处,安全性高,可控性高,谷歌本着开源的精神开放了Android的源代码,但随之而来的各类安全题材也让Android倍受非议,过度的绽开与可定制化,不仅造成了Android的碎片化严重,同时也给众多野鸡应用以可乘之机,但憨态可掬的是,随着Android的上进日益壮大,谷歌也在入手处理开发与乌兰察布的问题,相信在不久的未来,这一争持会越发小。

Android Apk反编译

利用多个工具:

  • apktool:反编译apk的xml文件。
  • Dex2jar:classes.dex转为jar文件。
  • jd-gui:查看jar文件。
Android APK 加密

出于java字节的特殊性,他很简单反编译,为了可以保护好代码,我们数见不鲜会拔取部分艺术,比如说混淆,而在Android
studio中,可以很有益于的应用ProGuard,在Gradle Scripts目录下。

 buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

那边的minifyEnabled属性就是控制是不是启动ProGuard,那么些特性此前叫做runProgyard,在Android
studio1.1的时候改成minifyEnabled,将他设置成true,就足以混淆了,他位于《SDK目录下的tools/proguard/proguard-android.txt目录下,一大半的景况下利用应用这些默许的歪曲就好了,前边亦可是分是系列中自定义的模糊,能够在档次的app文件夹下找到那几个文件,在这根文件里可以定义引用的第三方依赖库和模糊规则,配置好ProGuard之后,用AS四处apk即可。

总结

学会获取系统音讯。

更多内容戳那里(整理好的各个文集)

相关文章