android studio2021.3.1 最新xposed模块编写指南

Posted scrawman

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android studio2021.3.1 最新xposed模块编写指南相关的知识,希望对你有一定的参考价值。

前言

最新的xposed框架已经从xposed到Edxposed再到Lsposed,虽然xposed的api依然是通用的82版本,但现在网上大多数的在android studio上配置xposed的教程已经有点落后了,因此写下这篇来记录自己安装的流程。lsposed如何安装可以看我之前的小米root文章。

一. 配置build.gradle

找到app目录下的build.gradle,在dependencies里加上

compileOnly 'de.robv.android.xposed:api:82'
compileOnly 'de.robv.android.xposed:api:82:sources'

这一步和网上的教程都是一样的,虽然xposed的api最新的是89,但最初的开发者只更新到82,89是后面其他开发者补充的,因此选用82是最稳定的。

但不要像网上很多教程说的一样添加jcenter,这个仓库在21年已经宣布停止更新了。现在跟android studio合作的是maven,或者可以用国内阿里云的镜像。找到settings.gradle(以前build.gradle里的allprojects/repositories现在统一搬到这里了),在repositories里加上

maven  url 'https://maven.aliyun.com/repository/public/' 

或者

maven  url "https://api.xposed.info/" 

至于从哪个仓库同步能成功我也不确定,或者你像我一样总是同步不成功,只能下载XposedBridgeApi-82.jar然后放进app/libs文件夹下,右击jar文件——>add to library,再把dependencies中的implementation files('libs\\\\XposedBridgeApi-82.jar')改成compileOnly files('libs\\\\XposedBridgeApi-82.jar')

跟xposed有关的尽量不用implementation,如果后面报错: Cannot load module
The Xposed API classes are compiled into the module’s APK.
This may cause strange issues and must be fixed by the module developer.
可能就是在dependencies里用到了implementation。

二. AndroidManifest.xml

在AndroidManifest.xml application标签中加入

<meta-data
      android:name="xposedmodule"
      android:value="true" />
<meta-data
      android:name="xposeddescription"
      android:value="这是一个xposed demo" />
<meta-data
      android:name="xposedminversion"
      android:value="82" />

xposedmodule告诉xposed框架这是一个xposed模块,xposeddescription给你的模块添加描述,xposedminversion表示支持的最低xposed版本。

三. xposed_init

在main目录下,AndroidManifest.xml的同级,新建一个assets文件夹。

在assets文件夹下新建文件xposed_init,文件类型选择text,文件内容填上你要新建的xposed类的名字。这个文件标记了你的xposed模块的入口。

四. 编写xposed类

在main/java/package name文件夹下,跟main activity同级,新建一个java类,这就是你模块的功能主体,可以在这里添加hook app内方法的函数。以下是打印app包名的一个模块示例:

package com.xposed.ssl;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

public class passHook implements IXposedHookLoadPackage 

    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable 
        XposedBridge.log("Loaded app: " + lpparam.packageName);
    

如果只是用作Lsposed的一个模块的话,Main Activity其实是不需要的,可以选择safe delete。但是要先把AndroidManifest.xml里Main Activity的部分删除并且把main/res/layout里的主界面布局文件删掉。

五. 调试

可以用手机连接android studio,确保你的手机能够打开开发者选项里的USB调试和USB安装,并且电脑上已经装好adb。
android studio上打开File——>settings——>System settings——>Android SDK,下载好你手机android版本对应的sdk。

File——>settings——>System settings——>Android SDK——>SDK Tools,下载Google USB Driver。

用USB连接手机和电脑,打开设备管理器,选中便携设备中你的手机。选择驱动程序,更新驱动程序,选择刚刚安装的USB Driver,路径一般是在你存放SDK的路径下:Sdk\\extras\\google\\usb_driver。
如果安装后提示你的手机已经安装了最适合的驱动那么这步就不用做了。然后打开手机的USB调试和安装,运行android studio的app,就能在手机上安装了,然后Lsposed也会检测到纳入这个模块。

最新版Android Studio 创建JNI教程

本文主要目的如题所示,并针对一些创建过程中可能会遇到的问题提供解决方案。

本文主要参考:http://ph0b.com/android-studio-gradle-and-ndk-integration/,里面有视频讲解,嫌看文档麻烦

的可以直戳进去。。。

主要思路:在一个类中创建native方法,编译生成该类的class文件,再去生成该类的头文件,有了头文件之后在c文件中编写代码的具体实现,配置sdk、ndk路径、给ndk模块起名,最后就是对该方法的调用。

详细步骤如下:

1、本地创建native方法

新建一个空的android工程,在类中声明native方法

建议:不在activity中声明native方法,一是为了设计上的简洁并功能分离,二是创建头文件时避免不要的麻烦。

public class JniUtil {
    public native String getStringFromNative();
}

 

2、编译

如图,主要是为了得到带有native方法类的.class文件

技术分享

编译通过之后如下图所示

技术分享

在此目录下会出现JniUtil.class文件。

3、制作JniUtil.class的头文件

3.1打开terminal终端,主要有两种方法:

3.1.1.菜单栏View视图下,选择tool windows,再点击terminal即可进入

3.1.2.快捷键进入

技术分享

3.2 jni生成头文件

终端进入app\\src\\main文件下,再输入以下指令(javah及以后),如图

技术分享

主要格式为 javah –d –jni –classpath,

不熟悉javah指令的朋友可以输入javah -help帮助下。

-o <file>                输出文件 (只能使用 -d 或 -o 之一)                                         
-d <dir>                 输出目录                                                                  
-v  -verbose             启用详细输出                                                              
-h  --help  -?           输出此消息                                                                
-version                 输出版本信息                                                              
-jni                     生成 JNI 样式的标头文件 (默认值)                                          
-force                   始终写入输文 件                                                                                                               
-classpath <path>        从中加载类的路径
                  

路径介绍:  e:\\android-sdks\\platforms\\android-23\\android.jar  为此android工程所依赖的sdk版本,最终锁定到android.jar文件; ..\\..\\build\\intermediates\\classes\\debug com.example.hitman.final.JniUtil代表生成头文件所依据的.class文件.两个路径中间要用英文分号隔开

成功之后会看到main文件夹下多出一个-jni文件(有的可能直接生成jni文件夹)。里面有编译好的头文件

技术分享

可能遇到的问题

1)、某些类文件找不到  更多情况下是在activity中直接声明native方法导致的,由于AS工程依赖的android版本比较高,这就导致e:\\android-sdks\\platforms\\android-23\\android.jar 中没有所需的类,即javah –d找不到所需路径。以下文为例

技术分享
import android.support.v7.app.AppCompatActivity; 
public class MainActivity extends AppCompatActivity {

}
View Code

 

这种情况会导致appCompatActivity找不到,因为e:\\android-sdks\\platforms\\android-23\\android.jar 路径中没有这个类,appCompatActivity的实际路径是 E:\\android-sdks\\extras\\android\\m2repository\\com\\android\\support \\appcompat-v7\\23.1.1(本人路径)

技术分享

解决方案:将native方法迁出activity中,此方法笔者编译一次通过或者将public class MainActivity extends AppCompatActivity 改为public class MainActivity extends Activity

3.3创建.c文件,一定要在jni文件夹中

这时我们要注意,将-jni文件夹改名为jni,否则编译时build文件下不能生成ndk库(笔者遇到过这个问题),改名后再jni文件夹下新建.c文件,任意取名为main.c。内容下图所示:

技术分享
#include <com_example_hitman_finaljni_JniUtil.h>
 
JNIEXPORT jstring JNICALL Java_com_example_hitman_finaljni_JniUtil_getStringFromNative
        (JNIEnv *env, jobject obj){
    return (*env)->NewStringUTF(env,"HELLO FROM NATIVEJNI");
};
View Code

 

注意事项:一定要添加新建的头文件,如蓝色文字所示。

可能遇到问题:有些AS的bug必须要创建两个.c文件才能编译成功。

关于.c文件的语法问题可参考http://blog.chinaunix.net/uid-26000296-id-5296362.html

4、配置sdk、ndk路径,并编译

4.1打开local.propertiesZ文件

技术分享

ndk.dir=E\\:\\\\android-sdks\\\\ndk-bundle
sdk.dir=E\\:\\\\android-sdks

4.2设置好路径之后编译一下就能看到build问价下的ndk中的库了

技术分享

可能遇到的问题

Error:Execution failed for task ‘:app:compileDebugNdk‘.
> Error: NDK integration is deprecated in the current plugin.  Consider trying the new experimental plugin.  For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental.  Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.

这个可以在在gradle.properties 文件里面添加 android.useDeprecatedNdk=true 后重新编译即可

技术分享

5、给自己的库取名字并在activity中调用native方法

5.1在app目录选的build.gradle中添加ndk

技术分享

5.2加载本地库,并调用native方法

只需在activity中调用TextView.setText()方法就可以了。代码如下

public class MainActivity extends AppCompatActivity { 
    static{ 
        System.loadLibrary("MyLib"); 
    } 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.content_main); 
        TextView txt=(TextView)findViewById(R.id.txt); 
        JniUtil util=new JniUtil(this); 
        txt.setText(util.getStringFromNative()); 
            } 
        }); 
    } 
}

 

至此,确保编译通过就能能正常运行,模拟器效果图如下:

技术分享

如有问题、意见或者建议的欢迎留言交流。

以上是关于android studio2021.3.1 最新xposed模块编写指南的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio Dolphin 稳定版正式发布

我的Android进阶之旅Android Studio Dolphin | 2021.3.1版本,配置使用java 1.8 出错

我的Android进阶之旅Android Studio Dolphin | 2021.3.1版本,配置使用java 1.8 出错

Android Studio Arctic Fox 2021.3.1版本部分Bug

Android Studio Dolphin | 2021.3.1不显示布局XML预览

Android Studio Dolphin | 2021.3.1不显示布局XML预览