<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[成功不必在我，而功力必不唐捐！]]></title><description><![CDATA[今日事今日毕]]></description><link>https://blog.youkuaiyun.com/zhgeliang</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; zhgeliang]]></copyright><item><title><![CDATA[Qualcomm Simlock——启动检测流程]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/124499982</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/124499982</guid><author>zhgeliang</author><pubDate>Sun, 29 May 2022 17:51:44 +0800</pubDate><description><![CDATA[Simlock功能
simlock功能介绍
SIMLOCK功能的基本原理是通过私有加密算法，把加密后的定制参数保存在手机存储中，通过校验存储在手机中的加密信息和SIM卡中的信息来实现手机的高级的保护。功能实现中SIMLOCK进程需要查询存储在SIM卡中的IMSI、GID1、GID2相关信息，利用这些信息来实现不同SIMLOCK功能等级，达到限制不同运营商、地区等方案。
Sim卡参数

IMSI由以下4部分组成：

1)  移动国家码（the MobileCountry Code, MCC）,标识移动用户所.]]></description><category></category></item><item><title><![CDATA[抛弃硬件抽象层 (HAL)]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/125033576</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/125033576</guid><author>zhgeliang</author><pubDate>Sun, 29 May 2022 17:26:46 +0800</pubDate><description><![CDATA[更新对确保安全性至关重要，但对于设备制造商来说，更新可能难以实施，并且成本高昂。Treble 项目通过将底层供应商实现从 Android 内核框架中剥离出来，使更新变得更简单。这种模块化的设计允许分别独立更新平台和供应商提供的组件。让更新变得更轻松、更快速已经很棒，然而，Treble 加强模块化设计还有一个目的：提高安全性。

隔离 HAL

硬件抽象层 (HAL) 在与设备无关的代码和特定于设备的硬件实现之间提供了一个接口。HAL 通常打包成共享库，直接加载到需要与硬件交互的进程中。安全边界在进程级实施。]]></description><category></category></item><item><title><![CDATA[WeakReference 学习和使用]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/122827964</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/122827964</guid><author>zhgeliang</author><pubDate>Tue, 08 Feb 2022 17:23:59 +0800</pubDate><description><![CDATA[前言: 看到篇帖子, 国外一个技术面试官在面试senior java developer的时候, 问到一个weak reference相关的问题. 他没有期望有人能够完整解释清楚weak reference是什么, 怎么用, 只是期望有人能够提到这个concept和java的GC相关. 很可惜的是, 20多个拥有5年以上java开发经验的面试者中, 只有两人知道weak reference的存在, 而其中只有一人实际用到过他. 无疑, 在interviewer眼中, 对于weak reference的理解和]]></description><category></category></item><item><title><![CDATA[java 父类中的this_关于子类和父类中的this的用法]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/122730468</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/122730468</guid><author>zhgeliang</author><pubDate>Fri, 28 Jan 2022 14:01:05 +0800</pubDate><description><![CDATA[在看毕向东java视频的时候，多态这一章讲到了一段代码：

public class Demo {undefined

public static void main(String[] args) {undefined

Fu f = new Zi();

f.show();

}

}

class Fu {undefined

int num = 1;

void show() {undefined

System.out.println(this.num);

}

}

class Zi exten]]></description><category></category></item><item><title><![CDATA[AndroidRuntime java.lang.AbstractMethodError解决方案]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/122719733</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/122719733</guid><author>zhgeliang</author><pubDate>Thu, 27 Jan 2022 16:20:56 +0800</pubDate><description><![CDATA[AndroidRuntime: java.lang.AbstractMethodError解决方案
背景介绍
今天同事尝试编译apk的release版本，编译成功，但是运行时，却爆出这个运行时异常，导致crash。

排查过程
定位出错位置
通过查看异常的堆栈，爆出异常的方法是一个我们引入的jar包里，而这jar包引用方法是compileOnly，而compileOnly依赖的用途

编译时用于构建项目，但是运行时不需要
在编译时依赖它的api，但是它API的真正实现是在运行时环境
我们具体看一下这个Abs]]></description><category></category></item><item><title><![CDATA[VoLTE技术（含IMS注册/去注册流程、IMS呼叫流程、呼叫保持流程、二次协商过程）]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/122705154</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/122705154</guid><author>zhgeliang</author><pubDate>Wed, 26 Jan 2022 17:01:43 +0800</pubDate><description><![CDATA[VoLTE技术
通信系统支持的业务种类有很多，语音业务、数据业务、短信业务、彩信业务、彩铃、视频电话、会议电话、呼叫转移、多方通话等。最常用的两类业务就是语音业务和数据业务。

LTE的语音业务
语音业务早起是构筑在电路交换CS技术之上的，语音业务长时间、低数据量、低延迟的特点很适合用电路来承载。但是，随着技术的发展，分组交换PS技术成为主宰，甚至到了LTE系统，电路交换域荡然无存。
没有了电路交换设备就不能支持基于电路交换的业务了，那LTE靠什么来支持语音业务呢？此时，技术大佬们就想出了以下几种方案LTE]]></description><category></category></item><item><title><![CDATA[电路交换、报文交换、分组交换的区别与优缺点]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/122704911</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/122704911</guid><author>zhgeliang</author><pubDate>Wed, 26 Jan 2022 16:44:42 +0800</pubDate><description><![CDATA[（1）电路交换

由于电路交换在通信之前要在通信双方之间建立一条被双方独占的物理通路（由通信双方之间的交换设备和链路逐段连接而成），因而有以下优缺点。

优点： 

①由于通信线路为通信双方用户专用，数据直达，所以传输数据的时延非常小。 

②通信双方之间的物理通路一旦建立，双方可以随时通信，实时性强。 

③双方通信时按发送顺序传送数据，不存在失序问题。 

④电路交换既适用于传输模拟信号，也适用于传输数字信号。

⑤电路交换的交换设备（交换机等）及控制均较简单。 

缺点： 

①电路交换...]]></description><category></category></item><item><title><![CDATA[Framework中的AIDL（原）]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/122434045</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/122434045</guid><author>zhgeliang</author><pubDate>Tue, 11 Jan 2022 15:34:20 +0800</pubDate><description><![CDATA[在上一节（应用层的AIDL调用）中我们介绍了应用层中的AIDL用法， 这一节中，我们来看一下系统Framework层中更为普通的AIDL用法。

    为了便于分析，我们挑选了ITelephonyRegistry这个SystemService进行分析。这个服务的主要作用就是对通话相关的事件进行监听，我们把重心放在AIDL的实现结构上，不去关注ITelephonyRegistry具体的实现。

一、AIDL文件相关
    先来看一下这个服务的AIDL文件：

  @ITeleph...]]></description><category></category></item><item><title><![CDATA[应用层的AIDL用法（原）]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/122434008</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/122434008</guid><author>zhgeliang</author><pubDate>Tue, 11 Jan 2022 15:33:17 +0800</pubDate><description><![CDATA[一、什么是AIDL服务

　　一般创建的服务并不能被其他的应用程序访问。为了使其他的应用程序也可以访问本应用程序提供的服务，Android系统采用了远程过程调用（Remote Procedure Call，RPC）方式来实现。与很多其他的基于RPC的解决方案一样，Android使用一种接口定义语言（Interface Definition Language，IDL）来公开服务的接口。因此，可以将这种可以跨进程访问的服务称为AIDL（Android Interface Definition Language）]]></description><category></category></item><item><title><![CDATA[两种AIDL用法分析]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/122433865</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/122433865</guid><author>zhgeliang</author><pubDate>Tue, 11 Jan 2022 15:31:26 +0800</pubDate><description><![CDATA[我们在前面介绍了关于AIDL的两种用法，第一种用法主要用在应用层中（应用层的AIDL调用），第二种用法主要用在framework中（Framework中的AIDL调用）。但是这两种用法中都提到了Stub、asInterface等关键字，在这一节中我们主要针对AIDL内部机制的分析来深入理解AIDL调用的过程。
    为了便于分析，我们还拿第一节中我们自己搭建的例子去分析。
    当时我们在Eclipse Android工程的Java包目录中建立了一个扩展名为aidl的文件(IMySe...]]></description><category></category></item><item><title><![CDATA[进击的Android注入术(3)]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/120056312</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/120056312</guid><author>zhgeliang</author><pubDate>Thu, 02 Sep 2021 10:51:32 +0800</pubDate><description><![CDATA[继续
在前 《一》、 《二》、 《三》里已经把注入的技术介绍完了，这章开始说注入之后需要做的事情。如果对注入技术已经比较熟悉了，那么可以直接看本章，否则建议先把前三章阅读一遍会比较好。

注入之后
完成了注入，那只是万里长征的第一步。
众所周知，Android的应用进程，都是由Zygote孵化的子进程，每个进程都运行在独立的JVM中。通过ptrace的注入方式，我们得到了在目标进程执行代码的机会，但距离修改JVM的内容，还差那么一点点。我们重新看一下《二》中被注入SO的关键代码：
void Main(); ]]></description><category></category></item><item><title><![CDATA[进击的Android注入术(2)]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/120056255</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/120056255</guid><author>zhgeliang</author><pubDate>Thu, 02 Sep 2021 10:48:00 +0800</pubDate><description><![CDATA[继续
在《二》详细介绍了通过ptrace实现注入的技术方案，在这个章节里，我再介绍一种Android上特有的注入技术，我命其名为——Component Injection。顾名思义，这种方式是跟Android的组件相关的，详细见下面叙述。

Component Injection
原理
在android的开发者文档里，对android:process的描述是这样的：

android:process
The name of a process where all components of the appl]]></description><category></category></item><item><title><![CDATA[进击的Android注入术]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/120056175</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/120056175</guid><author>zhgeliang</author><pubDate>Thu, 02 Sep 2021 10:45:21 +0800</pubDate><description><![CDATA[写在前面

这个系列本来是在公司的一个分享，内容比较多，所以就把这个PPT重新组织整理成博客，希望对大家学习有所帮助。我会先以一个”短信拦截“作为例子，抛出问题，并提出了一种基于”注入“的技术方案达到提高拦截优先级，接着再重点讲解注入的技术细节。最后，我会跟大家分享一个我业余时间开发注入框架——AIM（Android IPC Manager)。当然了，这个框架跟目前的XPosed、CydiaStructe的侧重点不太一样。

短信拦截

场景
如果某款安全支付类应用和一个未知木马安装在同一台手机，木马会截获]]></description><category></category></item><item><title><![CDATA[selinux介绍]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/119871322</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/119871322</guid><author>zhgeliang</author><pubDate>Mon, 23 Aug 2021 15:59:17 +0800</pubDate><description><![CDATA[selinux相关命令
// 0--代表Permissive
// 1--代表Enforcing
setenforce 0

// 查看selinux开关状态
getenforce

// 查看进程的sContext
ps -Z

// 查看文件权限
ls -Z
如果设置成permissive mode 后问题依旧，说明还有其他的权限问题约束，否则就是SELinux 方面的问题

抓取SELinux Log
adb shell dmesg
抓kernel log，使用命令：
adb shell "cat /]]></description><category></category></item><item><title><![CDATA[AndroidO Treble架构下Hal进程启动及HIDL服务注册过程]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/118968264</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/118968264</guid><author>zhgeliang</author><pubDate>Wed, 21 Jul 2021 15:55:29 +0800</pubDate><description><![CDATA[通过前面对Treble架构的介绍，我们知道，Android Framework进程和Hal分离，每个Hal独立运行在自己的进程地址空间，那么这些Hal进程是如何启动的呢？本文以composer hal为例展开分析。
在以下路径有composer hal的rc启动脚本：
hardware/interfaces/graphics/composer/2.1/default/android.hardware.graphics.composer@2.1-service.rc


service hwcomposer-]]></description><category></category></item><item><title><![CDATA[VINTF供应商接口对象]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/118961253</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/118961253</guid><author>zhgeliang</author><pubDate>Wed, 21 Jul 2021 10:45:55 +0800</pubDate><description><![CDATA[VINTF对象设计为设备和框架组件提供以下内容：





从Android 8.0开始，运行时API会查询设备上的内容并将该信息发送到无线下载 (OTA) 更新服务器以及其他相关方（例如 CTS DeviceInfo）。有些信息会在运行时进行检索，而有些信息则是静态定义的信息。



设备清单描述了设备可以为框架提供的静态组件。
	框架兼容性矩阵描述了 Android 框架期待从给定设备中获取的内容。此矩阵是一个静态实体，在开发下一个版本的 Android 框架期间会手动确定此矩阵的组成。
	框架清单描.]]></description><category></category></item><item><title><![CDATA[c++静态对象的初始化]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/118933878</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/118933878</guid><author>zhgeliang</author><pubDate>Tue, 20 Jul 2021 14:09:57 +0800</pubDate><description><![CDATA[静态对象语义

所谓的静态对象，是指从产生一直持续到程序结束的那些对象，在这个过程中不会动态的消亡，所以被称为静态对象。包括global对象，定义于namespace的对象，在class 函数 file里的static对象。其中函数里的是local静态对象，其他都是non-local的，local与non-local的初始化时机不同。对于local的静态对象，初始化发生在函数被调用期间，首次碰到该定义时。而对于non-local的静态变量则在main函数的usercode之前进行初始化。

对于类中的静态变]]></description><category></category></item><item><title><![CDATA[Android call 流程以及其他case整理--Conference Call]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/118578587</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/118578587</guid><author>zhgeliang</author><pubDate>Thu, 08 Jul 2021 17:35:33 +0800</pubDate><description><![CDATA[Conference Call在项目中的场景不是很多，在日常生活应用也不是很多,基本上项目上的需求原生的代码已经足够。我所接触的只是之前在一个STK 运营商项目上时，对Conference call 有很多UI &amp; 功能的要求，所以趁此也做一个总结，本篇主要是对于IMS的情况做个总结。

1.Conference call 基本介绍
  Conference call 就是常说的电话会议，简单的说就是多台设备同时参与某一路通话(假设为A,B,C三台设备)，不是常见的两方对话。详细的解释可以查看...]]></description><category></category></item><item><title><![CDATA[c++ auto基本用法]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/118568830</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/118568830</guid><author>zhgeliang</author><pubDate>Thu, 08 Jul 2021 10:49:37 +0800</pubDate><description><![CDATA[总述：
auto的原理就是根据后面的值，来自己推测前面的类型是什么。

auto的作用就是为了简化变量初始化，如果这个变量有一个很长很长的初始化类型，就可以用auto代替。

注意点：
1.用auto声明的变量必须初始化（auto是根据后面的值来推测这个变量的类型，如果后面没有值，自然会报错）

2.函数和模板参数不能被声明为auto（原因同上）

3.因为auto是一个占位符，并不是一个他自己的类型，因此不能用于类型转换或其他一些操作，如sizeof和typeid

4.定义在一个auto序列的变量必须始]]></description><category></category></item><item><title><![CDATA[代理模式之详谈动态代理模式（Spring的AOP实现）]]></title><link>https://blog.youkuaiyun.com/zhgeliang/article/details/118361708</link><guid>https://blog.youkuaiyun.com/zhgeliang/article/details/118361708</guid><author>zhgeliang</author><pubDate>Wed, 30 Jun 2021 15:14:49 +0800</pubDate><description><![CDATA[java动态代理实现与原理详细分析

1.代理模式

关于Java中的动态代理，我们首先需要了解的是一种常用的设计模式--代理模式，而对于代理，根据创建代理类的时间点，又可以分为静态代理和动态代理。

 代理模式是常用的java设计模式，他的特征是代理类与委托类有同样的接口，代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类，以及事后处理消息等。代理类与委托类之间通常会存在关联关系，一个代理类的对象与一个委托类的对象关联，代理类的对象本身并不真正实现服务，而是通过调用委托类的对象的相关方法，..]]></description><category></category></item></channel></rss>