本帖最后由 hackerchen 于 2018-3-15 13:19 编辑
新年好,这是我的第一个正式帖子,算是处女贴,今天又是大年初一,也是拜年贴。'
该帖子注重的是让新手成功跑起Demo,然后才有动力进一步学习,往往第一步折腾很长时间,so 我的帖子应该对新手很有帮助。
本教程主要是复现Xposed官方教程的打印日志的那个Demo。
更新:
1. 感谢13楼14楼楼主提出来的知识点,其中compileOnly 代替 provided,在我现在看到的中文教程中还没人提到,(英文的还没敢去尝试看),我有时间试一下,大家也可以去试一下。14楼的提到只需要改一处就可以,如果导入api-source.jar应该要改两处,这个我也还没试
2. 感谢版主帮我把文章中因为误操作导致的图片路径信息删除
3. 待补充
随着AS的不断更新,有些网上的教程都过时了,或者还存在一些没解释清除的问题。因此今天把基于Android studio3.01(大年初一当前最新版本)的Xposed入门插件开发的步骤整理下来,供大家参考。
由于本人也是小白,Java语法过年前15天看了一遍,因此会存在很多问题请大家指正。另外在我的教程里,有些Android代码可能会解释一下对应的Java的语法,巩固一下基础(其实是我又忘记Java的相关语法了)。(该帖没什么科技含量,大神勿喷)
材料工具准备:- Android Studio3.0.1(简称AS),推荐安装64bit版本(因为现在的NDK开发,AS主要支持64bit版本了。稍后NDK开发入门教程也会发出来。)
- 有Root的虚拟机或者真机。本教程使用Genymotion虚拟机,在Genymotion下载Android5.1系统(推荐),自带root。(不建议使用5.0以下的系统,原因是提示更友好)
- 安装XposedInstaller_3.1.5.apk
- 下载api jar包。api-82.jar,api-82-source.jar(5.0系统推荐安装这个,这是网上推荐的)。
如何安装AS,如何安装Genymotion,如何安装Xposed框架,在哪里下载api jar包,这些基本的操作步骤,不是本文重点,网上查资料。
Genymotion安装可能会遇到坑,提示启动时exit(01)错误,我参考国外的坛子说是卸载Vbox->重启->重新安装Vbox->重启,运行Vbox,提示网卡错误,后来把网卡改成桥接模式,使用Genymotion的启动器(也就是桌面红色图标那个)启动成功。不要使用Vbox启动,否则只能看到黑色屏幕的启动代码,看不到模拟的手机界面。
======================正文开始==========================
- 创建一个普通的android工程(如何创建就不教了),其中选择如图那个就可以了(这里其实无所谓,新手还是根据我的步骤走)。我的工程名叫HelloTest02
2.切换到Projiect视图。(我相信有些人仍然使用的是Anroid视图,我之前就不会切换),点击左图的红色方框,选择Projiect就好了。效果如又图。以后所有的教程都是在Projiect视图下进行的,别人写的教程一般也是这个视图下进行的。
3.复制并安装jar包。把两个jar包复制到lbs目录下,然后在每个jar包上右键add as library,这样每个jar包就可以展开了。结果如下图所示。
4.修改AndroidMainfest.xml
使用下面的代码直接替换掉原来得代码。(AS代码代码贴近EverNote,缩进丢失,使用sulime中转一下,颜色丢失,两者不可兼得??? )
[XML] 纯文本查看 复制代码 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android";
package="com.kuaishou.chen.hellotest02">
<uses-sdk android:minSdkVersion="15" />
<application
android:label="@string/app_name" >
<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="Hook log test" />
<meta-data
android:name="xposedminversion"
android:value="53" />
</application>
</manifest>
效果如下,与自动生成的比较,主要的不同其实就是,applicatipn节点被替换掉了。use-sdk这句话应该是eclipse时代,安卓4.0 app开发使用的,AS时代在build.gradle指明minSDK,AS自动生成的AndroidMainfest文件没有这句话,经过测试确实可以删除这句。
5.修改APP目录下的build.gradl。不出意外,不管是本教程还是其他人的教程修改的都是这个gradle文件
原文dependencies部分如下
修改上面的代码。(AS原来版本是compile,现在AS3改成了implementation)现在修改上面的三处implementation为provided。(我测试的是必须三处都改),具体后面(如果有的话)会进行解释
6.创建测试代码。
新建一个类叫做TestHook(在包名上>右键>java class >输入名字TestHook>OK)
输入代码:注意这里面加粗的部分,包名一定对应自己的包名 类名一定要跟自己创建的java class文件名相同。如果不是按照本教程起名字和包名,AS提示错误,做相应的修改即可。大家最好开启AS的自动import功能(自己查教程),有的地方还是需要使用alt+enter导入包
package com.kuaishou.chen.hellotest02;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
/**
* Created by Administrator on 2018/2/15.
*/
public class TestHook implements IXposedHookLoadPackage {
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
XposedBridge.log("Loaded app: " + lpparam.packageName);
}
}
7.XposedBridge 从assets 目录中的xposed_init 文件中获取入口点。xposed_init文件中每行配置一个进入点(这个地方还不懂,网上摘得),使用完全限定名。在main目录下,创建assets文件夹(在main文件夹上右键new >directory>输入文件名assets>OK。还一种方法:main文件夹右键>new>folder>assets folder>ok搞定,截图不上了,应该没什么难度)
在新建的assets文件夹下面建立xposed_init文件(assets上面右键>new>file>输入xposed_init>OK)
在xposed_init文件上输入你的包名+类名,记得一定要对应你的包名和类名,用“.”连接即可。
com.kuaishou.chen.hellotest02.TestHook
如下所示:
8.接下来尝试一下Make projiects
如下图提示,生成.apk表示成功
9.接下来虚拟机测试。
一般情况下,大家习惯了使用Run按钮
让AS自动安装app到虚拟机或者真机测试,但是我在这里面遇到问题
提示Default Activity not found 。原因不言而喻,就是因为之前AndroidMainfest.xml重新配置。(AS至于为何检查DefaultActivity就不清楚了)
解决方法就是在app >build>outputs>apk>debug目录下会编译出apk文件。直接把该文件拖放到虚拟机Genymotion,Genymotion自动安装。
(有一个问题:realse为什么没有生成apk???)
接下来虚拟机提示模块没有激活,在xposed installer的模块里面勾选后重启即可。细节不再详述。
小技巧:Genymotion硬件重启可能实现不了(至少是我的这样),点击XposedInstaller的重启,虚拟机会卡死,然后就没反应了,需要手动关闭虚拟机,然后重新启动,这过程很慢,因为要启动VBox,并且Vbox要加载Android底层。相反使用软重启,不需要重启Vbox,不需要再加载安卓底层,所以速度快,方便,不会卡死。
成功,注意这个日志,可能显示不完全,其实是可以水平左右拖动的。如果还是不方便建议,使用右上角的保存按钮,保存到log日志,然后在文件管理器打开查看。另外模拟器也支持长按文本,然后选择复制到电脑记事本或者其他文本编辑器的操作(我还不会联调,不会让AS打印出Xposwed的log信息)
(大家有免费的CB鼓励一下小弟,谢谢了!)
|