公海赌船网址追忆获取系统的配备音信,其实须要比普通客商知道更多关于Android

Android系统消息的获取

鉴于android手提式有线电话机的开源性,手提式有线电话机的布局五光十色,那三个优化大师之类的事物,都足以跑分和看布置新闻,那她们是从哪儿知道那一个音讯的吗?遥想获取系统的配备音讯,平日能够从以下多少个地方得到:

  • android.os.Build
  • SystemProperty
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);

具体内容

1.android.os.Build

android.os.Build类里面包车型地铁消息极度的拉长,它含有了系统一编写译时的大批量配备,配置音信,大家列举一点

  • Build.BOARD——主板
  • Build.BRAND——Android系统定制商
  • Build.SUPPORTED_ABIS——CPU指令集
  • Build.DEVICE——设备参数
  • Build.DISPLAY——显示屏参数
  • Build.FINGERP福睿斯INT——独一编号
  • Build.SEOdysseyIAL——硬件系列号
  • Build.ID——修订版本列表
  • Build.MANUFACTURE奥迪Q5——硬件创制商
  • Build.MODEL——版本
  • Build.HARDWARE——硬件名
  • Build.PRODUCT——手提式有线电电话机产品名
  • Build.TAGS——描述Build的标签
  • Build.TYPE——Builder类型
  • Build.VE传祺SION.CODENAME——当前支出代号
  • Build.VE君越SION.INCREMENTAL——源码调整版本号
  • Build.VEWranglerSION.RELEASE——版本字符串
  • Build.VERSION.SDK_INT——版本号
  • Build.HOST——host值
  • Build.USER——User名
  • Build.TIME——编写翻译时间

上边的一对参数未有注释,他们来自系统的RO值中,那么些值都以手提式有线电话机生产商配置的只读的参数值,依据厂商的布局分裂而各异,接下去大家再来看一下另叁个存储设备软硬件消息的类——SystemProperty

ActivityManager——Apk应用新闻得到

眼下所选用的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(服务是还是不是在后台实施)。

小编们一致的用二个实例来上课:

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获取越来越多有含义的东西

android.os.Build

android.os.Build类里面包车型地铁信息丰盛的增进,它含有了系统一编写译时的大气配备,配置新闻,大家列举一点:

  • Build.BOARD——主板
  • Build.BRAND——Android系统定制商
  • Build.SUPPORTED_ABIS——CPU指令集
  • Build.DEVICE——设备参数
  • Build.DISPLAY——显示屏参数
  • Build.FINGERPEnclaveINT——独一编号
  • Build.SE本田CR-VIAL——硬件类别号
  • Build.ID——修订版本列表
  • Build.MANUFACTURE大切诺基——硬件创造商
  • Build.MODEL——版本
  • Build.HARDWARE——硬件名
  • Build.PRODUCT——手提式有线电话机产品名
  • Build.TAGS——描述Build的标签
  • Build.TYPE——Builder类型
  • Build.VE讴歌RDXSION.CODENAME——当前支付代号
  • Build.VE凯雷德SION.INCREMENTAL——源码调控版本号
  • Build.VE奥迪Q5SION.RELEASE——版本字符串
  • Build.VERSION.SDK_INT——版本号
  • Build.HOST——host值
  • Build.USER——User名
  • Build.TIME——编写翻译时间

地点的一些参数未有注释,他们来自系统的RO值中,这个值都以手机生产商配置的只读的参数值,依照厂商的配备分裂而差异,接下去大家再来看一下另一个存款和储蓄设备软硬件音讯的类——SystemProperty。

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;
    }

PackageManager——APK应用程序新闻获取值

大家看一张图:

Package结构图

最里面包车型客车框就表示任何Activity的新闻,系统提供了ActivityInfo类来实行打包。
而Android提供了PackageManager来担当管理全部已设置的App,PackageManager能够获取AndroidManifest中区别节点的卷入消息,上面是有的常用的卷入消息:

  • ActivityInfo

ActivityInfo封装在了Mainfest文件中的< activity >和<
eceiver>之间的持有音讯,富含name、icon、label、launchMode等。

  • ServiceInfo

ServiceInfo与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():重临钦命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安全机制
  • 先是道防线

代码安全机制——代码混淆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的社会风气了,不一致的软件,硬件新闻就好像二个国家的经济水平,军事水平,不相同的配置参数,代表着一个android帝国的强弱,所以厂家喜欢打配置战。

Android系统音讯的获得

出于android手提式无线电话机的开源性,手提式有线话机的安顿五花八门,那么些优化大师之类的事物,都足以跑分和看布置新闻,这她们是从哪里知道那一个音信的吧?遥想获取系统的配备音讯,日常能够从以下八个地点获取

  • android.os.Build
  • SystemProperty
Android Apk反编译

利用四个工具:

  • apktool:反编译apk的xml文件。
  • Dex2jar:classes.dex转为jar文件。
  • jd-gui:查看jar文件。
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的进化日益庞大,Google也在入手处理开辟与黑河的难题,相信在不久的以往,这一抵触会进一步小

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属性

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

ServiceInfo与ActivityInfo类似,封装了< service>之间的全数音信。

  • ApplicationInfo

它包裹了<
application>之间的音讯,特别的是,ApplicationInfo蕴含了不菲Flag,FLAG_SYSTEM代表为系统采取,FLAG_EXTERNAL_STORAGE表示为设置在SDcard上的使用,通过那一个flag可以很有益的判别应用的种类。

  • PackageInfo

PackageInfo富含了具备的Activity和Service音讯。

  • ResolveInfo

ResolveInfo包涵了<
intent>消息的上司新闻,所以它可以回去ActivityInfo、瑟维斯Info等蕴涵了<
intent>的音信,常常用来支持找到那么些带有特定intent条件的音信,如带分享成效、播放效果的行使。
有了那个包裹的音信后,还要求有特定的法门来获得它们,上面正是PackageManager中封装的用来赢得这一个新闻的章程:

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

  • getApplicationInfo()——以ApplicationInfo的样式重返钦命包名的ApplicationInfo。

  • getApplicationIcon()——再次回到钦赐包名的Icon。

  • getInstalledApplications()——以ApplicationInfo的方式重返安装的应用。

  • getInstalledPackages()——以PackageInfo的款型重返安装的运用。

  • queryIntentActivities()——重回钦点Intent的ResolveInfo对象、Activity集结。

  • queryIntentServices()——重回钦命Intent的ResolveInfo对象、Service集结。

  • resolveActivity()——重临钦点Intent的Activity。

  • resolveService()——再次回到钦赐Intent的瑟维斯。

根据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;
   }

}
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设备,作为三个开荒者,其实须要比普通客商知道越多关于Android
系统的音讯,就算不明白,也亟需通晓怎么轻便获取的办法

分析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获取越多有含义的东西。

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属性
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系统一个相当鲜明的界别正是,三个是开放系统,四个是密封体系,开放自然有开放的利润,技艺发展快,产品增进,密闭也会有查封的实惠,安全性高,可控性高,Google本着开源的旺绽开放了Android的源代码,但随之而来的各样安全主题材料也让Android倍受诟病,过度的盛开与可定制化,不仅形成了Android的碎片化严重,同期也给众多违法应用以可乘之隙,但憨态可掬的是,随着Android的进步日益强大,谷歌(Google)也在初始管理开辟与安全的标题,相信在不久的明日,这一顶牛会愈加小。

  • Android系统音讯的获取
  • PackageManager的使用
  • ActivityManager的使用
  • Android安全体制
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反编译

至于反编写翻译,看那篇小说就行了
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 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目录下,超越57%的动静下利用应用那几个私下认可的模糊就好了,前边亦可是分是项目中自定义的混淆,能够在类型的app文件夹下找到这些文件,在那根文件里能够定义援引的第三方依赖库和模糊法规,配置好ProGuard之后,用AS四处apk就能够。

总结

学会获取系统音信。

越多内容戳这里(整理好的各种文集)

根本内容

  • Android系统新闻的获得
  • PackageManager的使用
  • ActivityManager的使用
  • 分析Packages.xml获取系统音讯
  • Android安全机制

Android安全部制

道高级中学一年级尺魔高一丈,从前到以后就从未有过什么样相对的石嘴山,所以谷歌(Google)也创建起了一稀世的界线,爱戴Android的着力安全,我们来详细驾驭一下。

相关文章