首页 > 编程知识 正文

如何修改一个app的参数,android修改手机参数

时间:2023-05-04 02:23:12 阅读:110084 作者:1501

什么是AOP

AOP是面向切面的编程,是Aspect Oriented Programming的缩写。 与日常遇到的面向对象的OOP编程不同,OOP将功能模块化和对象化,AOP统一处理同类问题。 例如,日志填充点、性能监控、动态权限控制等。 人工智能

AspectJ

AspectJ其实是AOP编程的实践,目前有很多AOP实现,如ASMDex,但笔者选择了AspectJ。 千兆

AspectJ在Android项目中的应用

虽然使用本机AspectJ在项目中设置很麻烦,但是GitHub中的开放源代码sdkgradle _ plugin _ Android _ aspectjx是基于gradle的。 github

访问说明

请自行检查开源项目访问配置流程的编程

AspectJ的Join Points介绍

Join Points在AspectJ中是一个重要的概念。 Join Points可以看作程序运行时的执行点,例如函数的调用可以看作Join Points,达到与代码相关的切入点。 但是,在AspectJ中,只有以下几个执行点被识别为Join Points:app

Join Points

说明

实例

方法呼叫

函数调用

例如,调用Log.e ()。 这是Join Point

方法执行

执行函数

例如,Log.e ()的执行内部为Join Points。 请注意,这里是函数内部

结构呼叫

构造函数调用

与方法呼叫类似

结构执行

执行构造函数

与方法执行类似

字段获取

取得某个变量

就像读取DemoActivity.debug成员一样

字段集

设定变量

就像设置DemoActivity.debug成员一样

预初始化

Object通过构造函数进行的工作。

_

初始化

构造函数中的Object工作。

_

静态初始化

初始化类

类的静态{ }

handler

例外处理

例如,在try catch中,对应于catch中的执行

高级执行

这是AspectJ的内容

_

Pointcuts介绍

虽然一个程序中有多个Join Points,并且同样的函数也被归类为call和execution类型的Join Points,但并不是所有的Join Points都感兴趣。 Pointcuts提供了一种允许开发人员按值选择所需的Join Points的方法。 ide

Advice

Advice是指我们插入的代码如何插入,有Before、After、Around。 让我们看一个例子。 模块化

@ before (“execution (* Android.app.activity.on * * () ) ) ) )。”

publicvoidonactivitymethodbefore (join point ) throws Throwable{

}

这里分几个部分,我们依次看看吧。 函数

@Before: Advice,即具体的插入点

执行:处理连接点的类型,如调用、执行等

(* android.app.Activity.on** () ) :是最重要的表达式,第一个表示返回值,第二个表示返回值为任意类型,第三个是典型的xhdxlb路径,其中) 几个)没有区别。 可以同时从这里通过,||, 进行条件的组合。 )指示此方法的参数可以指定类型。 例如,android.os.Bundle或(.)以此方式指示任意类型、任意数量的参数。

publicvoidonactivitymehodbefore :实际切入的代码。

efore和After其实还很理解。 也就是说,在Pointcuts前后插入代码。 那么,安卓呢? 字面上,也就是在方法的前后分别插入代码。 他包括了Before和After的所有功能。 代码如下所示。

@“execution (com.xys.aspectjxdemo.main activity.test AOP )”)。

公共语音注释

odAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{

String key = proceedingJoinPoint.getSignature().toString();

Log.d(TAG,”onActivityMethodAroundFirst:”+key);

proceedingJoinPoint.proceed();

Log.d(TAG,”onActivityMethodAroundSecond:”+key);

}

以上代码中,proceedingJoinPoint.proceed()表明执行原始的方法,在这以前、以后,均可以进行各类逻辑处理。

自定义Pointcuts

自定义Pointcuts可让咱们更加精准的切入一个或多个指定的切入点。 首先咱们要定义一个注解类

@Retention(RetentionPolicy.CLASS)

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD})

public @interface DebugTrace {

}

在须要插入代码的地方加入这个注解,例如在MainActivity中加入:

public class MainActivity extends AppCompatActivity{

final String TAG = MainActivity.class.getSimpleName();

@Override

protedcted void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

logTest();

}

@DebugTrace

public void logTest(){

Log.e(TAG,”log test");

}

}

最后建立切入代码

@Pointcut(“execution(@com.kun.aspectjtest.aspect.DebugTrace * *..*.*(..))”)

public void DebugTraceMethod(){}

@Before(“DebugTraceMethod()”)

public void beforeDebugTraceMethod(JoinPoint joinPoint) throws Throwable{

String key = joinPoint.getSignature().toString();

Log.e(TAG, “beforeDebugTraceMethod:”+key);

}

Call

在AspectJ的切入点表达式中,咱们前面都是使用的execution,实际上还有一种类型—call,那么这两种语法有什么区别呢?对call来讲:

Call (Before)

Pointcut{

Pointcut Method

}

Call (After)

对Execution来讲:

Pointcut{

execution (Before)

Pointcut Method

execution (After)

}

Withincode

这个语法一般来进行一些切入点条件的过滤,做更加精确的切入控制,以下:

public class MainActivity extends AppCompatActivity{

final String TAG = MainActivity.class.getSimpleName();

@Orveride

protected void onCreate(Bundle savedInstanceState){

super.onCreate(saveInstanceState);

setContentView(R.layout.activity_main);

aspectJ1();

aspectJ2();

aspectJ3();

}

public void aspectJTest(){

Log.e(TAG,”execute aspectJTest");

}

public void aspectJ1(){

aspectJTest();

}

public void aspectJ2(){

aspectJTest();

}

public void aspectJ3(){

aspectJTest();

}

}

aspectJ1(),aspectJ2(),aspectJ3()都调用了aspectJTest方法,但只想在aspectJ2调用aspectJTest时插入代码,这个时候就须要使用到Pointcut和withcode组合的方式,来精肯定位切入点。

@Pointcut(“(call(* *..aspectJTest()))&&withincode(* *..aspectJ2())”)

public void invokeAspectJTestInAspectJ2(){

}

@Before(“invokeAspectJTestInAspectJ2()”)

public void beforeInvokeaspectJTestInAspectJ2(JoinPoint joinPoint) throws Throwable{

Log.e(TAG,”method:”+getMethodName(joinPoint).getName());

}

private MethodSignature getMethodName(JoinPoint joinPoint){

if(joinPoint == null) return null;

return (MethodSignature) joinPoint.getSignature();

}

execution 语法

execution()是最经常使用的切点函数,其语法以下所示: 例以下面这段语法: @Around(“execution(* *..MainActivity+.on*(..))") 整个表达式能够分为五个部分:

execution()是表达式主体

第一个*号表明返回类型,*号表明全部的类型。

xhdxlb 表示须要拦截的xhdxlb,这里使用*.表明匹配全部的xhdxlb。

第二个*号表示类名,后面跟.MainActivity是指具体的类名叫MainActivity。

*(..) 最后这个星号表示方法名,+.表明具体的函数名,*号通配符,包括括弧号里面表示方法的参数,两个dot表明任意参数。

遇到的错误

如下错误可使用gradle2.2.3解决,因为目前还不适配gradle3.0致使的

Error:Execution failed for task ':app:transformClassesWithDexBuilderForDebug'.

> Unexpected scopes found in folder '/Users/ram/WorkSpace/AndroidWorkSpace/MyDemo/app/build/intermediates/transforms/AspectTransform/debug'. Required: PROJECT, SUB_PROJECTS, EXTERNAL_LIBRARIES. Found: EXTERNAL_LIBRARIES, PROJECT, PROJECT_LOCAL_DEPS, SUB_PROJECTS, SUB_PROJECTS_LOCAL_DEPS

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。