精华内容
下载资源
问答
  • android p
    千次阅读
    2019-06-15 23:26:12

    Android P相对Android O 的优化
    1、系统 UI 更新
    2、异形屏和双摄像头官方API
    3、ART性能提升
    4、省电优化,限制传感器的使用
    5、一些小操作的优化
    6、使用 WiFi RTT 进行室内定位;全新的 MessagingStyle 消息通知;HDR VP9 视频、HEIF 以及媒体 APIs ;JobScheduler 中的数据费用敏感度;神经网络 API 1.1;自动填充的改进;用于 NFC 支付和安全交易的 Open Mobile API;具体的更新内容可以参考谷歌开发者的官方更新内容文章。

    Android P  Pistachio Ice Cream,开心果冰淇淋 是谷歌首个开发者预览版,对“刘海屏”设备进行了适配,使用WiFi RTT实现室内精确定位,消息通知栏的改进,多摄像头API以及神经网络API 1.1版本等升级。
    首个Android P预览版亮点很多,第一个改变就 很“接地气”,那就是适配类似iPhone X的顶部凹槽屏幕设计,为“刘海屏”设备进行了适配。在开发者模式中,原生系统已经可以模拟“刘海屏”的凹口并对拥有通知栏进行了适配和优化(时间移动到了左边),系统中的名称翻译过来可以把“刘海屏”称之为“凹口屏”。
    安卓O的聚焦重点是电池续航能力、速度和安全,让用户更好地控制各种应用程序,加大了对App在后台操作的限制。这种限制在一定程度上延长了安卓机在“睡眠”(Doze)模式下的电池的续航能力,它让不在使用的App进入睡眠状态,使用时再唤醒。它要达到的目标是在不卸载程序、不改变用户使用习惯的情况下,减少后台应用的用电。同时,这种对后台应用的限制也会加快运行的速度。

     

    更多相关内容
  • android p是什么版本

    千次阅读 2021-06-02 18:20:36
    android p指的是安卓9.0版本。在开发时,安卓9.0戴好为android pp是pistachio ice cream的简称,也可以理解为pie,在正式发布后,谷歌将这款系统称为安卓9.0,它的上市时间是2018年8月,增加了许多新的功能,比如...

    android p指的是安卓9.0版本。在开发时,安卓9.0戴好为android p,p是pistachio ice cream的简称,也可以理解为pie,在正式发布后,谷歌将这款系统称为安卓9.0,它的上市时间是2018年8月,增加了许多新的功能,比如全面屏手势才做、神经网络、自适应功能等等。

    3e9c7e35054b354b0b21a16c4914ed17.png

    android p是什么版本

    1、android p指安卓9.0版本,在2018年1月开始出现,代号为pie,也就是pistachio ice cream的简称,中文里面叫做开心果冰淇淋,在2018年的8月7日,谷歌正式发布这个系统,它的正式明明就是android p,也叫作派。

    2、该系统是安卓变化非常大的一个版本,因为它添加了许多新的功能,与以前系统最大的差别就是它支持刘海屏的操作,屏幕内容的显示、操作以及使用等等都做了全新的变化,并且优化的电池的续航能力,以及多屏操作。

    3、android p的特点功能有:多摄像头的更多画面、通知栏的多种通知、神经网络、自适应功能、全面屏以及折叠屏支持等等,它还有全局黑夜模式,并加入原生的天气支持和通话录音,操作上更人性化和简洁方便。

    4、在不少手机上都曾测试过android p,比如索尼Xperia xz2、一加6、小米mix2s等等,但在安卓9.0正式版发布后,大部分的安卓手机都开始预装这个系统,而且以前的旧手机也可以升级到这个系统,国产手机由于定制化的ui,虽然各家厂商使用操作系统有差别,但也都是在安卓系统上开发的。

    5、在android p系统里,仪表功能、黑暗模式、电池管理功能是最受大家欢迎和认可的,可以查看手机解锁次数、使用时间、各项APP的使用时间,并且有emojis表情,如果手机是支持这个系统的,最好是升级到安卓9.0以上的版本。

    展开全文
  • Android P适配以太网功能开发指南

    千次阅读 多人点赞 2020-04-24 16:44:02
            Android P适配以太网功能开发指南 前言   此时的我吃着火锅唱着歌,进行着Android P(此P非彼PAndroid 9)的适配工作。我真的只能说每次Android版本的迭代更新,都是对我们的一次炼狱般的摧残啊...

            Android P适配以太网功能开发指南


    Android网络框架分析系列文章目录:

    Android P适配以太网功能开发指南
    Android以太网框架情景分析之启动简介
    Android以太网框架情景分析之EthernetServiceImpl和NetworkManagementService交互深入分析
    Android以太网框架情景分析之NetworkManagementService和netd交互深入分析二
    Android以太网框架情景分析之NetworkManagementService和netd交互深入分析一
    Android以太网框架情景分析之NetworkFactory与NetworkAgent深入分析
    AsyncChannel原理分析以及实操演练



    引言

      此时的我吃着火锅唱着歌,进行着Android P(此P非彼P,Android 9)的适配工作。我真的只能说每次Android版本的迭代更新,都是对我们的一次炼狱般的摧残啊,各种适配啊,我真的想说fuck the coding。但是吐槽归吐槽,为了我热爱的coding事业,让我们愉快的适配起来。

    注意:本文演示的代码是Android P高通msm8953平台。




    一.具体需求和成果展示


    1.1 具体需求

    具体需求说多不多,说少不少就三个如下:

    • 设置中增加以太网开/关设置
    • 设置中增加以太网静态设置
    • 设置中增加代理设置

    1.2 成果展示

    好了需求前面明确了,在正式开始Android P以太网适配的开发指南前,得先让大伙看看最终的成果演示这样大伙才有动力和我一起干不是。
    在这里插入图片描述




    二.需求实施

    好了前面说了一大把了,也该正式开干了,不然大伙就要说我是光说不干的花架子了。先放上Android O和Android P的以太网逻辑架构图,有了这个读者心里因该就大概有谱了。不会迷路瞎逛了。
    在这里插入图片描述


    2.1 Android P以太网部分变动

    2.1.1 源码文件的增添

    在正式开发前,我们一般都应该了解Android新版本对当前实施的需求的改动,Android原生已经对以太网部分有很好的支持了,具体的源码路径在frameworks/opt/net/ethernet/java/com/android/server/ethernet,下面让我们看看Android O和Android P该目录下文件的变化!

    • Android O(Android 8)此目录下的文件为:
    [arm-msm8909-user] xxx@pd:~/ssd/xxx/ap/idh.code/frameworks/opt/net/ethernet/java/com/android/server/ethernet$ ls 
    EthernetConfigStore.java  EthernetNetworkFactory.java  EthernetServiceImpl.java  EthernetService.java
    
    • Android P(Android 9)此目录下的文件为:
    xxx@Ubuntu16-Model:~/ssd/qcom_64/msm8953-9/frameworks/opt/net/ethernet/java/com/android/server/ethernet$ ls
    EthernetConfigStore.java  EthernetNetworkFactory.java  EthernetServiceImpl.java  EthernetService.java  EthernetTracker.java
    

    这里发现Android P(Android 9)多了EthernetTracker.java区别其他版本,Google新增的类,这个是比较大的改动。

    2.1.1 接口参数的变动

    有过Android 6/7/8版本开发经验的老司机都知道,Android对以太网的操作主要是依靠EthernetManager这个类来执行,而这个类中最重要的设置以太网信息的方法就是setConfiguration了,让我们来分别看看Android不同版本对这个方法定义的差别!

    • Android O(Android 8)此方法定义如下:
        /** 
         * Set Ethernet configuration.
         */
        public void setConfiguration(IpConfiguration config) {
            try {
                mService.setConfiguration(config);
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }   
        } 
    
    • Android P(Android 9)此方法定义如下:
    ```java
        /** 
         * Set Ethernet configuration.
         */
        public void setConfiguration(String iface, IpConfiguration config) {
            try {
                mService.setConfiguration(iface, config);
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }   
        }  
    

    对比发现了什么,多了一个参数String iface,这个参数的意思是什么呢,即我们通常看到的设备网口名称,譬如eth0,我们可以通过命令 ifconfig 可以看到你设备下的所有网口名称,这个eth0怎么来的我们后续会讲解。

    130|console:/ # ifconfig
    dummy0    Link encap:Ethernet  HWaddr 62:df:e7:bb:49:0f
              inet6 addr: fe80::60df:e7ff:febb:490f/64 Scope: Link
              UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
              TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 
              collisions:0 txqueuelen:1000 
              RX bytes:0 TX bytes:560 
    
    rmnet_ipa0 Link encap:UNSPEC  
              UP RUNNING  MTU:2000  Metric:1
              RX packets:8 errors:0 dropped:0 overruns:0 frame:0 
              TX packets:17 errors:0 dropped:0 overruns:0 carrier:0 
              collisions:0 txqueuelen:1000 
              RX bytes:3196 TX bytes:1268 
    
    rmnet_data0 Link encap:UNSPEC  
              inet6 addr: fe80::f265:e5b9:fecd:242c/64 Scope: Link
              UP RUNNING  MTU:2000  Metric:1
              RX packets:19 errors:0 dropped:0 overruns:0 frame:0 
              TX packets:17 errors:0 dropped:0 overruns:0 carrier:0 
              collisions:0 txqueuelen:1000 
              RX bytes:2968 TX bytes:1132 
    
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0 
              inet6 addr: ::1/128 Scope: Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
              collisions:0 txqueuelen:1 
              RX bytes:0 TX bytes:0 
    
    eth0      Link encap:Ethernet  HWaddr 00:80:0f:11:70:00  Driver smsc9500
              inet addr:172.16.151.22  Bcast:172.16.151.255  Mask:255.255.255.0 
              inet6 addr: fe80::56e0:5755:28c3:6270/64 Scope: Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:7812 errors:0 dropped:0 overruns:0 frame:0 
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
              collisions:0 txqueuelen:1000 
              RX bytes:507092 TX bytes:0 
    

    2.2 App层Settings修改

    Settings中的修改不是本文的重点,这个和以前的逻辑Android版本的添加几乎可以保持不变,只是对所有的相关接口多添加一个String iface参数即可,可以参见如下代码,实际UI效果如下 :
    在这里插入图片描述


    2.3 Framework的适配

    这个是本文的重点,当然前提得驱动的同事已经将有线网络的驱动加载OK了。怎么判断驱动OK了呢,一般就是插上网线然后状态栏上会有如下截图一个小角图标显示,并且在终端下面能发现/sys/class/net/eth0的节点。

    在这里插入图片描述

    2.3.1 EthernetService加入SystemServiceManager并启动

    参见framework/base/services/java/com/android/server/SystemServer.java的代码,将EthernetService加入SystemServiceManager管理,并启动。这里不做过多介绍,因为这个篇章的重点不是这个。

        private static final String ETHERNET_SERVICE_CLASS =
                "com.android.server.ethernet.EthernetService";
    
                if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_ETHERNET) ||
                    mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)) {
                    traceBeginAndSlog("StartEthernet");
                    mSystemServiceManager.startService(ETHERNET_SERVICE_CLASS);
                    traceEnd();
                }
    
    

    2.3.2 EthernetService介绍

    先来看下核心服务frameworks\opt\net\ethernet\java\com\android\server\ethernet\EthernetService.java,代码如下所示:

    public final class EthernetService extends SystemService {
    
        private static final String TAG = "EthernetService";
        final EthernetServiceImpl mImpl;
    
        public EthernetService(Context context) {
            super(context);
            mImpl = new EthernetServiceImpl(context);
        }   
    
        @Override
        public void onStart() {
            Log.i(TAG, "Registering service " + Context.ETHERNET_SERVICE);
            publishBinderService(Context.ETHERNET_SERVICE, mImpl);
        }   
    
        @Override
        public void onBootPhase(int phase) {
            if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
                mImpl.start();
            }   
        }   
    }
    

    这段代码非常简单,EthernetService 继承了系统服务,那自然也就是系统服务,这个会加载在system_server中启动,在该类中调用 EthernetServiceImpl 的 start(),我们继续接着看看。

    2.3.3 EthernetServiceImpl 介绍

    该文件所在源码目录为frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetServiceImpl.java,让我们看看主要做了些啥。

        public void start() {
            Log.i(TAG, "Starting Ethernet service");
    
            HandlerThread handlerThread = new HandlerThread("EthernetServiceThread");
            handlerThread.start();
            mHandler = new Handler(handlerThread.getLooper());
    
            mTracker = new EthernetTracker(mContext, mHandler);
            mTracker.start();
    
            mStarted.set(true);
        }  
    

    主要创建了 EthernetTracker,这个类是 9.0 中新增出来的,用于监听以太网的切换、以太网判断当前网络是否可用等一系列操作。之前 8.1 中都集成在 EthernetNetworkFactory 中,这个是Android P的主要差别,继续跟进。

    2.3.3 EthernetTracker介绍

    关于以太网初始化和基本操作基本集中在这个类里面了,取代了Android P之前EthernetNetworkFactory的部分功能。该文件的源码位置为frameworks\opt\net\ethernet\java\com\android\server\ethernet\EthernetTracker.java。

        void start() {
            mConfigStore.read();
    
            // Default interface is just the first one we want to track.
            mIpConfigForDefaultInterface = mConfigStore.getIpConfigurationForDefaultInterface();
            final ArrayMap<String, IpConfiguration> configs = mConfigStore.getIpConfigurations();
            for (int i = 0; i < configs.size(); i++) {
                mIpConfigurations.put(configs.keyAt(i), configs.valueAt(i));
            }   
    
            try {
                mNMService.registerObserver(new InterfaceObserver());
            } catch (RemoteException e) {
                Log.e(TAG, "Could not register InterfaceObserver " + e); 
            }   
    
            mHandler.post(this::trackAvailableInterfaces);
        } 
    

    在EthernetTracker通过ConcurrentHashMap<String, IpConfiguration> mIpConfigurations这个表来管理保存的 IpConfigStore 信息,那么这个Map的初识值从那里来的呢,主要如下两个地方:

    • EthernetConfigStore 中存储的信息,EthernetConfigStore 中通过读取 /misc/ethernet/ipconfig.txt
    • 获取interfaceConfigs 的信息,在 EthernetTracker 的构造方法中通过解析 config_ethernet_interfaces 字符串也可向 Map 中添加初始信息。
        EthernetTracker(Context context, Handler handler) {
            mHandler = handler;
            mContext = context;
            // The services we use.
            IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
            mNMService = INetworkManagementService.Stub.asInterface(b);
    
            // Interface match regex.
            mIfaceMatch = context.getResources().getString(
                    com.android.internal.R.string.config_ethernet_iface_regex);
    
            // Read default Ethernet interface configuration from resources
            final String[] interfaceConfigs = context.getResources().getStringArray(
                    com.android.internal.R.array.config_ethernet_interfaces);
            for (String strConfig : interfaceConfigs) {
                parseEthernetConfig(strConfig);
            }
    
            mConfigStore = new EthernetConfigStore();
    
            NetworkCapabilities nc = createNetworkCapabilities(true /* clear default capabilities */);
            mFactory = new EthernetNetworkFactory(handler, context, nc);
            mFactory.register();
        }
    
        private void parseEthernetConfig(String configString) {
            String[] tokens = configString.split(";");
            String name = tokens[0];
            String capabilities = tokens.length > 1 ? tokens[1] : null;
            NetworkCapabilities nc = createNetworkCapabilities(
                    !TextUtils.isEmpty(capabilities)  /* clear default capabilities */, capabilities);
            mNetworkCapabilities.put(name, nc);
            
            if (tokens.length > 2 && !TextUtils.isEmpty(tokens[2])) {
                IpConfiguration ipConfig = parseStaticIpConfiguration(tokens[2]);
                mIpConfigurations.put(name, ipConfig);
            }
        } 
    
    

    让我们看看config_ethernet_interfaces的取值从哪里看,具体位置如下frameworks/base/core/res/res/values/config.xml具体代码如下:

        <string-array translatable="false" name="config_ethernet_interfaces">
            <!-- 
            <item>eth1;12,13,14,15;ip=192.168.0.10/24 gateway=192.168.0.1 dns=4.4.4.4,8.8.8.8</item>
            <item>eth2;;ip=192.168.0.11/24</item>
            -->
        </string-array>
    
    

    这里就给各位解释了iface这个参数的由来了。

    2.3.4 增加以太网打开/关闭接口

    在EthernetTracker.文件中添加如下两个接口如下所示,即打开和关闭以太网接口,至于怎么从EthernetManager调用到EthernetTracker的逻辑就不细说了,各位可以看我最后上传的patch包即可。

    /**
    	state
    	true 开启以太网
    	false 关闭以太网
    **/
        public boolean setInterfaceStatus(String iface, boolean state){
             try {
                if(!TextUtils.isEmpty(iface)) {
                    if(!state)
                        mNMService.setInterfaceDown(iface);
                    else 
                        mNMService.setInterfaceUp(iface);
                    return true;
                } else {
                    Log.e(TAG,"iface is null");
                }   
            } catch (Exception e) {
                Log.e(TAG, "Error setInterfaceStatus : " + iface + " state : " + state + " exception : " + e); 
            }   
            return false;
    
        }  
    

    2.3.5 增加以太网状态判断和Mac接口

        public String getEthMacAddress(String iface){
            InterfaceConfiguration config = null;
            // Bring up the interface so we get link status indications.
            try {
                config = mNMService.getInterfaceConfig(iface);
            } catch (RemoteException | IllegalStateException e) {
                // Either the system is crashing or the interface has disappeared. Just ignore the
                // error; we haven't modified any state because we only do that if our calls succeed.
                Log.e(TAG, "Error upping interface " + iface, e);
            }
            if (config == null) {
                Log.e(TAG, "Null interface config for " + iface + ". Bailing out.");
                return "";
            }
    
            final String hwAddress = config.getHardwareAddress();
            return hwAddress;
        }
    
    
        public int getEthIfaceState(String mIface) {
            //return mTracker.getEthIfaceState(iface);
            try{
                File file = new File("/sys/class/net/"+mIface+"/flags");
                if(!file.exists())
                    return EthernetManager.ETH_IFACE_STATE_DOWN;
                FileInputStream fin= new FileInputStream(file);
                BufferedReader reader= new BufferedReader(new InputStreamReader(fin));
                String flag = reader.readLine();
                Log.e(TAG,"mIface : " + mIface);
                fin.close();
                flag = flag.substring(2);
                int flag_int = Integer.parseInt(flag, 16);
                if ((flag_int & 0x1) > 0) {
                    return EthernetManager.ETH_IFACE_STATE_UP;
                } else {
                    return EthernetManager.ETH_IFACE_STATE_DOWN;
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            return EthernetManager.ETH_IFACE_STATE_DOWN;
        }
    

    2.3.5 增加以太网静态IP设置接口,并解决拔插后才能更改ip地址

    以太网静态接口设置,主要是调用EthernetManager类里面的setConfiguration方法进行参数配置。我们看一下这个方法具体做了什么操作。

     /**
         * Set Ethernet configuration.
         */
        public void setConfiguration(String iface, IpConfiguration config) {
            try {
                mService.setConfiguration(iface, config);
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
        }
    

    发现是通过mService.setConfiguration()方法。那么这个mService是哪里传来的呢,都是老司机就不买弄了,这里的mService是EthernetServiceImpl ,让我们看看该代码:

        public void setConfiguration(String iface, IpConfiguration config) {
            if (!mStarted.get()) {
                Log.w(TAG, "System isn't ready enough to change ethernet configuration");
            }   
    
            enforceConnectivityInternalPermission();
    
            if (mTracker.isRestrictedInterface(iface)) {
                enforceUseRestrictedNetworksPermission();
            }   
    
            // TODO: this does not check proxy settings, gateways, etc.
            // Fix this by making IpConfiguration a complete representation of static configuration.
            mTracker.updateIpConfiguration(iface, new IpConfiguration(config));
    }
    

    上面是Android 9.0中的方法实现。这里就是我花了一段时间解决的为什么Android P设置了静态IP不立即生效的地方。我们看一下Android 8.0之前的版本是这个方法是怎么写的,这个地方是关键。

        public void setConfiguration(IpConfiguration config) {
            if (!mStarted.get()) {
                Log.w(TAG, "System isn't ready enough to change ethernet configuration");
            }   
    
            enforceConnectivityInternalPermission();
    
            synchronized (mIpConfiguration) {
                mEthernetConfigStore.writeIpAndProxyConfigurations(config);
    
                // TODO: this does not check proxy settings, gateways, etc.
                // Fix this by making IpConfiguration a complete representation of static configuration.
                if (!config.equals(mIpConfiguration)) {
                    mIpConfiguration = new IpConfiguration(config);
                    mTracker.stop();
                    mTracker.start(mContext, mHandler);
                }   
            }   
        }  
    

    我们也是看着都是mTracker对象调用方法进行设置。其实这两个mTracker是不同的对象。在Android 9.0之前的版本,这个mTracker对象都是EthernetNetworkFactory的实例对象。因为后续的设置参数进行连接网络判断端口等一系列操作都在这个EthernetNetworkFactory类中完成。而在Android9.0及以后后,Google将他们抽离出来了,对于监听以太网切换、以太网判断当前网络是否可用等一些列操作抽离到一个EthernetTracker类中。那么9.0的EthernetNetworkFactory只需要关心拿到参数进行连接上网操作就可以了。

    我们现在只关心9.0是怎么走的。找到EthernetTracker类的具体实现,可以看到调用了EthernetNetworkFactory中的方法

        void updateIpConfiguration(String iface, IpConfiguration ipConfiguration) {
            if (DBG) {
                Log.i(TAG, "updateIpConfiguration, iface: " + iface + ", cfg: " + ipConfiguration);
            }   
                
            mConfigStore.write(iface, ipConfiguration);
            mIpConfigurations.put(iface, ipConfiguration);
                    
            mHandler.post(() -> mFactory.updateIpConfiguration(iface, ipConfiguration));
        }  
    

    而其实这个方法并没有做任何上网的操作,这就是为什么设置静态IP后,没有变动的原因。

        void updateIpConfiguration(String iface, IpConfiguration ipConfiguration) {
            NetworkInterfaceState network = mTrackingInterfaces.get(iface);
            if (network != null) {
                network.setIpConfig(ipConfiguration);//仅仅是将ip地址等以太网参数保存下来。
            }   
        }
    

    这里设置下去仅仅是将参数保存下来,显示是不符合我们的需求的。此时已经可以通过拔插网线实现设置静态ip上网。那么接下来,我们看看正常流程怎么走。

    还是继续看EthernetTracker类。因为判断能不能连接网络的条件都在这里实现。这里要怎么才能做到设置静态IP后能动态的上网呢,这个可以参见EthernetTracker类,因为一般的正常上网都是从这个类开始的。这里我也不过多讲述其中的过程了,可以参见这篇博客Android 9.0 以太网上网设置静态ip,解决拔插后才能更改ip地址的问题
    有比较详细的讲解,最后我们的解决方法是EthernetServiceImpl中添加如下逻辑即可代码如下所示:

        public void setConfiguration(String iface, IpConfiguration config) {
            if (!mStarted.get()) {
                Log.w(TAG, "System isn't ready enough to change ethernet configuration");
            }   
    
            enforceConnectivityInternalPermission();
    
            if (mTracker.isRestrictedInterface(iface)) {
                enforceUseRestrictedNetworksPermission();
            }   
    
            // TODO: this does not check proxy settings, gateways, etc.
            // Fix this by making IpConfiguration a complete representation of static configuration.
            mTracker.updateIpConfiguration(iface, new IpConfiguration(config));
    
            //Add by xxxsz 2020.04.23
            if (mTracker.isRestrictedInterface(iface)) {
                enforceUseRestrictedNetworksPermission();
            }   
     
            // TODO: this does not check proxy settings, gateways, etc.
            // Fix this by making IpConfiguration a complete representation of static configuration.
         
            mTracker.updateIpConfiguration(iface, new IpConfiguration(config));
            mTracker.removeInterface(iface);//清除当前端口
            mTracker.start();
    
        }  
    

    收工,over!




    结语

    各位乡亲们,Android 9的适配以太网就结束了,整的我腰酸背痛啊。Android版本升级之时就是我等受苦之时啊。




    写在最后

      好了如上就是Android P适配以太网功能开发指南的所有,如有问题或者有任何疑问请及时沟通或者交流,也可点个赞或者吐槽一番也是可以的。so goodbye。

    当然得最后附上终极patch包不是,不然你们又得在背后diss我了
    Android P Settings Framework以太网适配path包

    展开全文
  • Android P新特性

    千次阅读 2018-05-22 16:25:27
    转:http://gityuan.com/2018/04/08/android_p/引言2018年3月8日,谷歌发布了Android P的预览版,预计今年的Q3季度发布final release版本,有不少文章从开发者角度介绍了Android P的新特征,初步来看给感觉这次大...

    转:http://gityuan.com/2018/04/08/android_p/

    引言

    2018年3月8日,谷歌发布了Android P的预览版,预计今年的Q3季度发布final release版本,有不少文章从开发者角度介绍了Android P的新特征,初步来看给感觉这次大版本似乎并没有什么改变。接下来,将从系统Treble,System,Framework,Runtime, Security等多方面来解读一下Android P的变化。

    Treble计划

    Treble计划是一个非常重要的变革,对系统层面的影响很大。Google每发布一个Android大版本,到厂商和APP的适配,过程是漫长的,每一次大版本适配工作的艰难厂商最能体会,各种兼容性问题。正如去年发布的Android O,目前Android O机型用户量比较小,APP都没能快速跟进把targetSdk适配到O的情况下,Android P又即将到来,Android系统的碎片化一直是一个痛点。该计划的核心主旨是让系统与硬件相关的解耦,加快系统升级速度。Treble始于Android O,到Android P又得以进一步完善。

    接下来,来看看Treble在整个Android系统的位置。

    treble

    • Product: OEM相关定制,主要包括Apps,产品sysprops等
    • System:Android系统的Framework和Daemons
    • Treble Interface: Treble接口
    • Vendor: 硬件相关
    • ODM: ODM相关定制,比如VINTF支持

    最中间Treble Interface组成成分,在Android O添加的接口:C++依赖(使用VNDK),IPC调用(使用HIDL),SELinux,通用Kernel接口,Android Verified Boot(AVB);到Android P新增接口:Java依赖(使用System SDK),系统Properties。从图中可以看出Treble计划是希望底层Vendor用旧版本,也能支持System层升级为新版本,从而保证Android大版本可快速升级。

    这里需要注意,System Property兼容性对于treble来说是非常糟糕的,它允许平台和Vendor之间通过非稳定通道进行跨进程通信,这与treble的分离解耦背道而驰。 为此,treble计划通过分离properties到platform和vendor。platform进程只能访问平platform属性,vendor进程只能访问vendor属性, 当然也是允许platform属性去暴露给vendor进程。

    1. 所有platform对外暴露的属性位于system/sepolicy/public/property_contexts,Vendor无法访问其他的平台属性;
    2. 所有可用于vendor init脚本的属性位于system/core/init/stable_properties.h,Vendor init脚本不能使用其他的平台属性来作为 action triggers。
    3. Vendor或者ODM属性必须有自己的命名空间,比如vendor., ro.vendor, persist.vendor等
    4. vendor init使用vendor_init域名,保障只使用vendor相关权限,不可访问system-only的属性

    VINTF(Vendor Interface)被分离成硬件无关(Framework)和硬件相关两部分。为了进一步规范化系统架构,定义了CKI(Common Kernel Interface)作为通用系统镜像必须依赖的内核接口集,并且对Kernel分支精简也进行了有效的精简。 VTS会测试HAL,Kernel, VNDK的可靠性,CTS测试通用系统接口,framework feature。从Android O以后就强制要求,通过CTS/VTS则会为system解耦合的适配提供了保障。

    Treble语境中,Vendor是指片上系统的HAL层和外围设备,不依赖于硬件的软件则不属于Vendor;VNDK是指Vendor用于实现HAL层所提供的系统库。

    • platform和Vendor的构建是相互隔离的。
    • platform lib对应 system.img
    • vendor lib对应 vendor.img
    • 大多数情况下,Vendor lib跟系统核心不能相互使用;Vendor lib不允许dlopen私有的系统库
    • 合作伙伴不允许为自己的产品在VNDK新增lib,只能贡献到AOSP

    VNDK

    这一切都是为系统库与Vendor库之间的解耦合,在Android P上采用该方案,则下一个大版本Android Q更新,可以直接将新的System Q加上老Vendor P,组成新版本Android。

    其中VNDK + Framework libs组成system.img, Vendor libs组成vendor.img。

    Android P新添加命名空间namespace:

    • System命名空间/system/lib/;
    • Vendor命名空间有/system/lib/vndk,/system/lib/vndk-sp,/vendor/lib/vndk,/vendor/lib/vndk-sp

    System

    1. 存储性能提升

    FDE用于Android 6.0, FBE用于Android 7.0,并且会创建DE和CE两个目录,提供更好的用户体验和隐私安全。 FDE很快会被彻底移除。 另外,未来会有更快的加密算法。

    文件系统

    文件系统配额从Android 8.0开始支持,三个主要目标是

    • 当打开设置时能快速计算存储使用情况,提供更好的用户体验
    • 更快和更公平的cache管理,通过quotas来管控滥用的app
    • 通过配额方式来限制应用滥用存储空间

    Fair cache策略:

    • 分配cache配额给每个App(基于他们使用的频率),删除最老的cached文件,直到有足够的空闲空间;
    • 最佳实践:定期调用新方法以保证系统有机会去删除缓存文件,可以follow PackageInstaller,DownloadManager和DocumentsUI。 限制滥用app:
    • 设备应该卸载恶意app,或者删除大文件
    • 避免设备卡在循环的重启过程
    • 阻止app使用block90%, 或者inodes50%

    • exFAT:Google没有资源支持相关的更新工作,只有会部分补丁;
    • vold:跟fw通信方式,由socket调整为binder方式,用于提高性能;这是继installerd之后的再一次由socket转变成binder模块;
    • TRIM: 该过程会运行f2fs GC操作,并且在夜间空闲时间来被调度执行;
    • FUSE: 已被删除,采用sdcardfs, 后续会有esdfs用于更深远的优化
    • 更快的文件拷贝: FileUtils.copy,比如纯userspace的方式快35~50%
    • FDE,FUSE, ASECs这些都被删除。

    2. 简述Kernel

    • framework想·的feature后续依赖Kernel 3.18或之后的版本,3.10将不再维护。另外Kernel 4.14已推到AOSP;
    • ION: libion在Android P上已支持新的kernel ion接口,强烈建议 使用libion,而非直接使用ion ioctl调用
    • kernel + clang: 强烈建议采用clang 5.0或之后版本,出错信息提供精准定位,占用内存和编译速度快,而gcc有一定的历史问题。
    • sdcardfs: android O默认的文件系统,ro.sys.sdcardfs=1,Android O上默认的文件系统是sdcardfs,但允许关闭,回退到FUSE。而Android P则计划直接删除FUSE,很快会更新一版sdcardfs。对于文件系统,即便不使用sdcardfs,也强烈推荐使用基于内核的文件系统,而非用户空间。

    3. LMKD调整

    基于内核的LMK缺点:

    • 依赖于硬编码的剩余内存限制,而非基于内存紧张情况来调整;
    • 厂商定制化比较多,也就意味着原有的设计比较死板,不适合增加policy定制,没有以group方式来杀进程
    • 在slab shrinker API中插桩,Shrinkers本应该快速drop不再使用caches并退出,以避免拖慢内存扫描进程。 但事实上,lmk执行的工作量包括搜索目标进程以及杀掉它们,这个过程并非快速完成的动作
    • 有可能出现把重要的进程杀掉,而非重要进程并没有被杀
    • 从内核4.12中会移除lmk;

    替代方案:用户态LMKD + memory cgroups

    • 可打造更智能的基于内存压力的杀进程策略
    • memory cgroups,内存压力事件,内存记账功能,额外的控制类似relaim和swappiness
    • 能被更方便的记录日志和track
    • 该方案的挑战:每个app需要有内存记账;杀进程组耗时;cgroups之间的task转移代价比较高;
    • 相应解决方案:最新内核已降低内存开销,应用启动时间增加了3%,在多个小的LRU队列并不高效;
    • 杀进程组耗时的问题,通过将杀进程过程移到AMS锁之外
    • LMKD的杀进程组委托给ActivityManager

    用户态LMKD策略:

    • 通过ro.config.low_ram属性来划分低内存设备和高性能设备
      • 低内存设备:中等内存压力出现得比较常见,杀进程主要针对medium和critical内存压力情况,配置oom_adj_score,内存压力基于swap使用情况。杀进程策略会延迟,尽量保持服务处于运行中的状态
      • 高性能设备:优先考虑性能和尽可能留有更多内存来优化用户体验。杀的策略会提前,一次会杀多个进程以保证内存处于低压力状态,更加激进地释放内存以保持系统处于低内存压力的状态

    未来

    • 提高杀进程策略,基于输入信号(可用内存,task大小,内存压力值,内存压力事件的频繁成都)
    • 合并杀进程策略,提供更多controll机制
    • 探索杀的时机,以及内存压力的潜力
    • 配合cgroups v2

    4. F2FS

    sdcardfs和fuse才是一个层面的东西,sdcardfs比fuse的的性能更好,对同一文件的操作,fuse需要经历6次用户态与内核态的切换,而sdcardfs只需要两次。对于fuse可以使用各种文件系统,比如ext3, ext4, f2fs.

    (F2FS,Flash-Friendly File System)文件系统重要特性

    • 后台清理:当文件系统碎片化比较严重的时候,读写速度会有所下降,开启一个反碎片的后台线程来清理文件碎片;
    • 异步discard:Discard文件系统的淘汰存储空间,对于减少闪存过度GC是很有必要的,当同步的discard对用户来说会有比较大的延迟,故采用异步Discard;
    • 原子写:SQLite是Android默认的数据库,通过管理记录文件来保障数据安全,这会带来大量冗余的写和同步操作;原子写能有效减少记录文件;

    F2FS相比ext4在文件顺序写、随机写以及SQLite方面有较大幅度的提升。Google将持续调整F2FS的性能与稳定性方面的表现。

    5. 性能

    在Android O上将Binder大锁拆分为更细粒度的锁,便真正解决了binder锁竞争问题。

    • 内核驱动代码在必要时可采用RT调度器,避免在驱动里有长时间地禁用抢占
    • 建议:
      • 如果可能,建议使用mem cgroups
      • userdata文件系统,建议采用f2fs
      • 关闭不需要的内核配置项
      • 移除不必要的日志
      • 在早期的文档中建议低内存设备要开启KSM,之后的版本不要使用KSM

    P上更加注重相同性能下如何改进功耗,EAS作为通用的基于功耗模型和性能数据的CPU调度算法,而非tuning的方式。 为什么Android采用EAS调度算法呢?需要一个标准的结合功耗和性能的调度器,能通过Framework来调整调度策略,这里需要考虑资源负载均衡、大小核、cpufreq、 governor、减少大核的使用、平衡功耗问题,2018.5完成EAS r1.6版本。

    Framework

    1. AMS

    从Android P开始,只有当Intent flag中指定了FLAG_ACTIVITY_NEW_TASK,才允许在非Activity场景启动Activity。 APP必须拥有FOREGROUND_SERVICE权限,才允许使用前台服务,否则会抛出异常。

    目前很多APP开发者们对Android O的一些后台限制行为不太了解这些变更,遇到问题可能误以为系统问题,所以这里说到这顺便提一下关于Android O对后台行为的一些管控。

    • 后台服务(Background Service)限制
      • 当进程处于后台1分钟后会进入idle状态,系统停止其后台服务,也就意味着应用处于后台必须1分钟内处理完收尾工作,不允许在后台长时间监控系统,从而节省功耗;对于应用后台执行用户不可感知的操作,官方推荐使用JobScheduler
      • 后台进程不允许通过startService方式启动服务,否则当targetSdk>=26的情况下会抛出IllegalStateException;
      • 对前台服务(Foreground Service)不会有这个限制,因为前台服务都会挂一个前台通知对用户来说是可见的。Android O新增startForegroundService(),用于启动前台服务,但有一个限制条件就是应用必须服务启动后5秒之内调用startForeground(),否则会抛出ANR
    • 广播(Broadcast)限制:
      • 应用无法使用其清单注册的大部分隐式广播,但部分隐式广播是被允许的, 比如BOOT_COMPLETED, LOCALE_CHANGED等。这样做是为了省电和性能,防止大量APP通过监听各种广播来拉起自己。
      • 清单注册的显式广播和动态注册的隐式广播依然可以正常工作。

    2. PMS

    重构Package Manger,减少核心服务的代码复杂度,将permission,intent等代码移到单独的类, 将user management,dex,shortcuts等不相关代码移到子包;尽可能操作本地数据,避免加锁;同时增加单元测试。

    PMS在Android O主要改动是优化启动时间,将操作尽可能并行化执行,在Android P上主要改动是扫描过程scanPackageOnly(), 下一步提取更多的子组件和类,比如Intent resolution, package verification, dexopt等,减少修改对象成员的方法。

    3. WMS

    在Android O上,结构化窗口对象模型和容器层次结构, 提高CTS覆盖率并引入单元测试,SurfaceFlinger中引入层级结构用于SurfaceView,引入Task快照。在Android P上,继续提升创建对象模型,同步APP Transitions,WindowScope工具,

    过度使用Stack ID, Stack管理着类似的task和activity,特定的窗口模式,例如HOME_STACK_ID,FULLSCREEN_STACK_ID,FREEFORM_STACK_ID,这就导致同一个Stack的task和activity不允许有不同的窗口模式。新的方案允许有多个WindowContainers,窗口模式不再受限于Stack ID。

    采用同步的APP Transitions, animations的过程可不再需要WMS大锁。另外Transitions,WindowScope工具是一个类似于systrace的工具,可用于方便查看WindowManager和SurfaceFlinger,仅在userdebug版本开启,对性能影响较小。

    4. 续航提升

    之前关于续航方面,有JobScheduler, Doze, 限制隐式广播,后台服务和定位限制,缓存wakelock释放等功能, 一直以来Google在功耗方面没有从整体上的策略,不同OEM往往会有不同的策略针对功耗,比如Force stop app, kill activity/service等。这次Android P在功耗方面也是重点,Google计划在Android P上采用机器学习的思路来预测用户使用习惯,来做省电优化。 从而把APP分为四类Active, working_set,frequent, rare,划分到不同bucket的app则采取对Jobs,Alarms,Network, FCM等限制策略。

    目前很多应用为了后台存活,都挂fg-service,其实Google,包括厂商都非常不建议开发者一直这样使用的,应该尽量克制,只要需要的场景使用,比如后台导航、后台播放音乐。 这也是为什么fg-service一定要显示通知,为的是让用户可知应用的行为,对于不该后台活动的依然挂前台通知,那么用户可能会主动杀它,甚至卸载。

    5. 机器学习

    在Android 8.1中引入神经网络API,提供Android内置的机器学习,在Android P中又进一步扩展和改进TensorFlow. 在Android P上采用AI预测用户行为来进行更智能化的省电策略,在UI搜索界面也使用到机器学习,AI正在逐步强化Android系统

    Dynamic App,需应用商店支持,资源文件,配置,语言,App内部基于版本格式的信息等都可以采用Dynamic App来精简APK尺寸。 Autofill:平台、插件、app、浏览器,一套完整的自动填充框架解决方案

    6. Location

    电话体验 提升打电话的用户体验,扩展APIs从而支持不同APP的电话并发,Telecom可跟踪所有的活动来电,但只有一个应用可获取焦点。另外, 调整SIM状态改变的广播,SIM_STATE_CHANGED改为SIM_CARD_STATE_CHANGED和SIM_APPLICATION_STATE_CHANGED广播。 也同步调整了TelephonyManager。

    活动检测 活动检测会结合传感器和声音数据,能识别走路、跑步、骑车、开车、上下楼梯,甚至要区分使用者是在汽车、地铁、火车,还是摩托车,也能识别睡眠模式, 当AR检测到处于开车模式,则停止通知以避免打扰开车人员。为系统提供使用者活动状态转换的API

    室内导航 一直以来无法做到精准的WIFI室内定位,次次Android P系统支持了IEEE 802.11mc WiFi协议,室内导航功能即将到来,应用能使用室内定位,为定位服务提供便利。

    CHRE 优化功耗就意味着需要尽可能少的唤醒AP,比如Doze模式,后台定位限制模式。定义一个Context Hub运行时环境,在该环境下的CPU不允许直接运行Java/Linux,只允许执行特殊的功能。 在Android P实现了Context Hub Service,使用起来更加简单。后续可以有always-on,低功耗模式

    Runtime

    1. ART和libcore

    在安装、更新、OTA的时候ART需从APK里提取压缩过的dex并进行校验,这样既浪费空间,也浪费CPU时间。 为此,正在做的方案是采用未压缩的dex文件,商店将会对其进行Java校验并将校验结果直接在安装过程使用。 对于dex文件开始采用一个新的紧凑的格式,减少对内存和存储空间的使用,更加智能的布局优化,更少的闪存读取。

    关于调试方面,使用JVMTI来替代ART debugger,提供更多的扩展功能,包括断点、异常等事件,本地变量审查,字段监测,类的重定义。

    Backtraces使用Java上下文来显示,省去使用addr2line来转换的一个过程,方便调试分析问题。例如

    backtrace

    Kotlin作为Android官方正式语言,其性能并不会比Java执行慢

    Profiles in the Cloud: 从N开始使用profile方式编译,对于存储空间、内存、功耗、CPUs使用率都有益处,但目前profile只是本地的方式, 在优先之前仍需要等待获取profile。未来收集用户的profile,并上传到云端(Google play),在安装时从云端获取profile直接使用到新用户。 大概能提升20%的冷启动性能。

    core lib 升级libcore代码到OpenJDK 9。APP弃用策略,Android将添加支持的最低版本,当targetVersionSdk<17的app则会弹出警告框。 从bootclasspath中移除Apache HTTP库、JUnit

    2. Soong编译系统

    采用Soong来编译Java,从GNU Make移植到Soong

    跨版本构建过程:

    soong

    Android P到底可见的Android.bp,所有依赖必须使用android.bp,androidmk工具可用于将make文件转换为Android.bp文件;

    3. 私有API

    Android P在运行时强制限制应用通过反射方式来操作被标记为@hide的类、方法、属性。 将API分为4类:白名单、灰名单、深灰名单、黑名单;当API属于白名单则不限制,灰名单(targetSdk ≥P)则警告,黑名单则 抛出NoSuchFieldException/NoSuchMethodException异常。对于深灰名单,介于灰名单和黑名单之间,取决targetSdk, 当(targetSdk ≥P)按黑名单方式处理,当(targetSdk <P)按灰名单方式处理。 对于黑名单只允许平台APP使用,对于灰白名单的API虽然不会直接抛出异常,但不再保证跨版本的兼容性,这样限制是为了后续新版本能更快地完成适配。

    Google之所以要设计灰白黑名单,也是为了给应用一个过渡时机,也给Android一个完善公开API的机会,对于某些很重要的@hide接口,可能也会考虑适当增加公开接口,另外那些API会被第一批加入黑名单,还需拭目以待。对于AOSP的黑名单和深灰名单将放入CTS测试,进而限制厂商不能轻易修改名单。

    关于兼容性测试,Google目前有CTS/VTS/GTS,其中CTS主要测试API行为,VTS针对Treble计划以及测试HW实现,GTS针对GMS需求和分销协议, 很快Google还会推出STS,用于隐私测试。从Top应用的测试数据来看,目前国内大多数的APP都存在兼容性问题,问题主要集中在热修复、混淆、加固以及依赖internal API。

    另外,@SystemApi不再向后兼容,另外几乎所有的系统API都需要权限。 /vendor/priv-app将在Android P上支持,权限会被限制有vendorPrivileged标识的权限。

    Security

    将所有网络流量从明文转向TLS,更改网络安全性配置 (Network Security Configuration) 的默认值,以阻止所有明文流量。 为保护用户隐私,当应用UID空闲时,断开应用对摄像头、话筒、传感器的使用,如果应用强制使用则会产生错误,从而进一步防止流氓应用后台手机隐私数据。

    FBE加密:FBE将会更容易支持高端元数据加密的设备,以及对sdcard的支持。对于OEMs能够更简单地移植。对于低端设备,更快速的算法,适合所有机型的移植

    总结

    • Android P的Treble计划为后续Android大版本可快速升级提供支撑;
    • 采用全新的Soong编译系统,将Android.mk全面替换为Android.bp;
    • 私有API的限制进一步规范化Android生态,但同时也面临着生态圈中大多数的APP都不可用的风险挑战;
    • 默认采用sdcardfs提升存储性能,F2FS相比ext4在文件顺序写、随机写以及SQLite方面有较大幅度的提升;
    • Framework逐步优化PMS、WMS大锁,未来应该还优化AMS锁;
    • 逐步试水AI技术,增强对APP后台管控,以提升系统续航能力。

    总之,Google一方面从系统层面不断优化Android系统;另一方面致力于改善APP生态,不断加强对非友善APP的管控,减少其对系统性能与续航的影响

    展开全文
  • Android P 图形显示系统

    千次阅读 2019-01-10 09:57:57
    Android P 图形显示系统(一)硬件合成HWC2 Android P 图像显示系统(二)GraphicBuffer和Gralloc分析 Android P 图像显示系统(三)Android HWUI 绘制流程 Android P 图形显示系统(四) Android VirtualDisplay...
  • 开发工具:Android Studio   项目中若使用 SecureRandom.getInstance("...The Crypto provider has been deleted in Android P (and was deprecated in Android N), so the code will crash. le...
  • Android9.0(androidP)系统API和行为变化

    万次阅读 2018-05-13 19:51:27
    注意事项(AndroidP 特性):   (1),android.os.Build.VERSION.RELEASE ,需要当做字符串类型处理。 (2),依赖的第三方 SDK (特别是加固和热修复框架) 会和系统底层紧密集成 (如使用非公开的接口),而导致应用在 ...
  • 如何在ubuntu20.04下配置android P源码编译环境123 123 撤销:Ctrl/Command + Z 引用文本 链接: link. 居中的图片: 当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。 去博客设置页面,选择一款你喜欢的...
  • 文章目录图形系统显示系统Buffer管理显示系统的架构从应用的角度理解Android Android图形显示子系统概述 Android图形显示系统,是Android比较重要的一个子系统,和很多其他子系统的关联紧密。想象一下,没有图形显示...
  • Android P获取系统IMEI码、ANDROID_ID

    千次阅读 2019-07-12 11:50:05
    Android获取ANDROID_ID方式: String ANDROID_ID = Settings . System . getString ( getContentResolver ( ) , Settings . System . ANDROID_ID ) ; adb获取ANDROID_ID: adb shell settings get ...
  • Android P SElinux权限调试

    千次阅读 2019-04-21 16:10:51
    Android P上要开发一个开机过程中运行bin程序,在Android O上权限问题还算比较好解决,而在 Android P上面由于谷歌收紧了 Android SElinux控制,增加了许多neverallow规则,导致调试权限十分不便 开发的bin程序...
  • 突破Android P(Preview 1)对调用隐藏API限制的方法 一.概要 本文基于对Android P(Preview 1)的源码分析,实现了三种绕过对调用隐藏API限制的方法,有效性均已得到验证,能够成功调用系统隐藏API。 二.限制原理 ...
  • Android P(API 28)适配需要哪些代码更改

    千次阅读 2019-05-24 12:51:21
    Android P(API 28)适配需要哪些代码更改 最好的文档依据为: google官方文档:行为变更:以 API 级别 28+ 为目标的应用 google官方文档:将应用迁移到 Android 9 下面来介绍Android P(API 28)适配,我们的App 需要做...
  • android P OTA 初探 —— 1、OTA简单介绍

    千次阅读 2019-07-27 15:10:06
    本系列介绍自己理解的基于android P的OTA系统。由于工作需要开始研究,实践经验匮乏,难免有理解不够或者错误之处。还请多多指正,不吝赐教! 1、 本文提及的OTA指的是android手机的基础操作系统、系统分区上安装的...
  • Android P Preview1 兼容要点

    千次阅读 2018-03-09 15:26:51
    Android P Preview1,昨天3.8发布,兼容Preview1 主要改下targetSdkVersion = 28 compileSdkVersion为前一个版本(比如27)在AndroidStudio3.2下能完整支持Android P Preview1AndroidP Preview1 要点1.1 约束调用非...
  • Android P版本的发布,引入了刘海屏的概念,像华为nova 3e,vivo X21等手机厂商也纷纷推出自己的刘海屏手机,我们先预览下HUAWEI nova 3e的机照 从这张图中我们可以看出,所谓的刘海屏实际上是安装在状态栏的一块...
  • 最近研究了下Android Auto版本的evs_app应用,是Android Auto提供的一个倒车功能; 代码结构: evs app层实现源码位于:packages\services\Car\evs\ |——– Android.mk |——– app |——– manager |——– ...
  • Android P property属性权限添加

    万次阅读 2019-01-29 16:38:26
    Google在Android O以后,为了降低vendor和system之间的耦合度,对property的作用区域也做了明确的区分,分为vendor三方的property和system平台端的property. 因为参与的项目中需要添加一个system property用作三方应用...
  • Android P在app程序中执行shell命令

    千次阅读 2019-06-01 18:22:43
    安卓在app程序中执行...Process p = Runtime.getRuntime().exec("/data/local/tmp/minicap -P 1920x1080@600x480/0"); 命令解释:/data/local/tmp/minicap -P 1920x1080@600x480/0,用来运行/data/local/tmp/min...
  • 开启系统FreeForm模式。 adb shell settings put global enable_freeform_support 1 adb shell settings put global force_resizable_.../frameworks/native/data/etc/android.software.freeform_window_manage...
  • Android P WiFi 框架 以及 Enable相关流程

    千次阅读 2018-12-25 15:43:23
    文章目录Android P WiFi 框架Wifi 整体流程框架图代码流程1. WifiSettings --&amp;gt; WifiManager2. WifiManager --&amp;gt; WifiService --&amp;gt; WifiServiceImpl --&amp;gt;WifiController3. ...
  • Android P org.apache.http.legacy.jar 找不到

    千次阅读 2019-01-14 21:23:31
    Android P开始,org.apache.http.legacy 库将从 bootclasspath 中删除。 Remove org.apache.http.legacy from bootclasspath 也就是进程启动时压根不会去加载这个jar,当你代码中使用到这个库中的类会抛出java....
  • 1.禁止第三方APP打开Camera frameworks/base/core/java/android/hardware/Camera.java public static Camera open(int cameraId) { // add if(SystemProperties.get("persist.sys.disablecamera").equals...
  • 适配android P

    千次阅读 2018-06-23 15:40:49
    androidP到来,真是让我们这群开发android的程序员蛋疼了不少,因为它加入了不少限制,尤其是非SDK api使用的限制,妈的以后非sdk的api调用直接给你抛异常奥,听起来是不是很兴奋。很想说适配个屁啊,哈哈确实是...
  • 相信很多在android8.0之前很正常,跑到p上数据都无法加载出来,忽然就懵逼了,因为google在android p为了安全起见,已经明确规定禁止http协议额,但是之前很多接口都是http协议啊,怎么解决呢?  下面介绍三中方法:  1....
  • Android P

    千次阅读 2018-05-29 10:06:18
    android P 源码下载https://www.cnblogs.com/shenchanghui/p/8503623.htmlandroid P 开发简介https://developer.android.google.cn/preview/download
  • 系统角度解读Android P新特性

    千次阅读 2018-04-15 01:24:28
    引言2018年3月8日,谷歌发布了Android P的预览版,预计今年的Q3季度发布final release版本,有不少文章从开发者角度介绍了Android P的新特征,初步来看给感觉这次大版本似乎并没有什么改变。接下来,将从系统Treble...
  • Android高版本P/Q/R源码编译指南

    万次阅读 多人点赞 2021-01-04 20:27:17
            AndroidP/Q/R编译系统 文章目录        AndroidP/Q/R编译系统引言一.Android编译整体概述1.1 Kati构建编译系统1.2 Blueprint和Soong构建编译系统1.2.1 Soong简介1.2.2 Blueprint简介1.2.3 ...
  • 错误:Android err_cleartext_not_permitted 原因:安卓9.0新的限制对未加密流量不在信任,直接放弃请求. 解决方案: 在manifest文件application节点下增加:android:usesCleartextTraffic=“true” 如果...
  • Android P HAL层添加HIDL实例(详细实现步骤)

    万次阅读 多人点赞 2019-07-15 10:43:28
    Android P HAL层添加HIDL实例 本文将介绍如何在P OS上添加HIDL实例,简单增加seLinux策略使得可以在system_service调用测试,并用模拟器emulator验证。 调用过程为 APP->TestManager->TestService->ITast....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 558,864
精华内容 223,545
关键字:

android p