xposed精简布局xml篇

这个挺难的,小白可以跳过,学习下一篇

这里要用到的xposed接口和修改dex的不一样
接口:IXposedHookInitPackageResources
修改方法也注释在代码里,这里就不详细说了
由于id定位的方法不知道丢哪里去了,这里只能用id名称来定位

声明:这次教程和下一次的有一个缺点就是修改xml前提是在resources.arsc里有该文件信息

首先找到目标xml然后去resources.arsc里搜索文件名获取name的值
-1
-2 -3

name值是main,这里用一点要注意在代码的26行
下面的都在代码的注释里

  1. package com.mycompany.application2;
  2. import android.os.Bundle;
  3. import android.view.View;
  4. import android.widget.LinearLayout;
  5. import android.widget.RelativeLayout;
  6. import android.widget.TextView;
  7. import de.robv.android.xposed.IXposedHookInitPackageResources;
  8. import de.robv.android.xposed.IXposedHookLoadPackage;
  9. import de.robv.android.xposed.XC_MethodHook;
  10. import de.robv.android.xposed.XposedHelpers;
  11. import de.robv.android.xposed.callbacks.XC_InitPackageResources;
  12. import de.robv.android.xposed.callbacks.XC_LayoutInflated;
  13. import de.robv.android.xposed.callbacks.XC_LoadPackage;
  14. public class MainHook implements IXposedHookLoadPackage,IXposedHookInitPackageResources {
  15.     //使用IXposedHookInitPackageResources接口
  16.     @Override
  17.     //xml篇
  18.     public void handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam loadPackageParam) throws Throwable
  19.       {
  20.       //目标文件main.xml,去resources.arsc里搜索文件,有会员的用Arsc编辑器++搜索取对应文件路径的name值,<path name=”main”>res/layout/main.xml</path>
  21.       //没有会员,的用Arsc编辑器,点搜索资源,输入文件名,找到对应路径的文件,最后一个/的值,com.android.module/layout/main
  22.       //main是在resources.arsc里定的名称,xml前缀名称不一定和resources.arsc里一样,以resources.arsc为准
  23.       //下面第一个参数是目标app包名,第二个是修改布局类型layout,第三个是上面找到的文件名
  24.         loadPackageParam.res.hookLayout(“com.android.module”, “layout”, “main”, new XC_LayoutInflated() {
  25.               @Override
  26.               public void handleLayoutInflated(final LayoutInflatedParam param) throws Throwable {
  27.                   //定位xml,第一个参数是id值,第二个参数是搜索类型为id,第三个参数是包名
  28.                   LinearLayout a = param.view.findViewById(param.res.getIdentifier(“v”, “id”,”com.android.module”));
  29.                   /*下面是a的子级*/
  30.                   //a.setVisibility(View.GONE);//隐藏a
  31.                   //a.removeViewAt(0);//隐藏a里面的第一个子控件
  32.                   //LinearLayout b=(LinearLayout) a.getChildAt(0);//定位a的第一个布局(也可以是控件)
  33.                   //b.removeViewAt(0);//隐藏b里面的第一个控件
  34.                   /*下面是a的父级*/
  35.                   //单纯定位或者用a.setVisibility(View.GONE);隐藏,view就是通用
  36.                   //View c= a.getParent();//定位a的上一层
  37.                   //View c= a.getParent().getParent();//定位a的上两层,以此类推
  38.                   /*下面是a的根布局*/
  39.                   //View d= a.getRootView();//根布局是最顶层的布局,没有父布局
  40.                   //然后就可以用第一种定位子级的方法修改想改的控件
  41.                 }
  42.             });
  43.       }
  44. /*
  45. a的根布局getRootView()
  46. <LinearLayout
  47.     android:orientation=”vertical”
  48.     android:layout_width=”match_parent”
  49.     android:layout_height=”match_parent”>
  50.     //a.getParent()这是a的第二层布局
  51.     <LinearLayout
  52.             android:scrollbars=”none”
  53.             android:layout_width=”match_parent”
  54.             android:layout_height=”match_parent”>
  55.             //a.getParent()这是a的第一层父布局
  56.             <LinearLayout
  57.                     android:layout_width=”match_parent”
  58.                     android:layout_height=”match_parent”>
  59.                     //这是a
  60.                     <LinearLayout
  61.                             android:id=”@+id/v”
  62.                             android:orientation=”vertical”
  63.                             android:layout_width=”match_parent”
  64.                             android:layout_height=”match_parent”>
  65.                             //LinearLayout b=(LinearLayout) a.getChildAt(0);//定位a的第一个子布局
  66.                             //a.removeViewAt(0),删除a的第一个子布局
  67.                             <LinearLayout
  68.                                     android:layout_width=”match_parent”
  69.                                     android:layout_height=”80dp”
  70.                                     android:background=”@drawable/ListControlBackground”
  71.                                     android:gravity=”center”
  72.                                     android:layout_margin=”5dp”>
  73.                                 //ImageView c=(ImageView) b.getChildAt(0);//定位b的第一个子控件
  74.                                 //b.removeViewAt(0),删除a的第一个子布局
  75.                                     <ImageView
  76.                                             android:layout_width=”70dp”
  77.                                             android:layout_height=”70dp”
  78.                                             android:background=”@drawable/AdvertisingIcon”
  79.                                             android:layout_margin=”10dp” />
  80.                                     <LinearLayout
  81.                                             android:layout_width=”wrap_content”
  82.                                             android:layout_height=”wrap_content”
  83.                                             android:layout_weight=”1″
  84.                                             android:layout_marginLeft=”10dp”
  85.                                             android:orientation=”vertical”>
  86.                                             <TextView
  87.                                                     android:maxLines=”1″
  88.                                                     android:text=”去广告”
  89.                                                     android:textColor=”#FF0000FF”
  90.                                                     android:layout_width=”wrap_content”
  91.                                                     android:layout_height=”wrap_content”
  92.                                                     android:textSize=”22sp” />
  93.                                             <TextView
  94.                                                     android:maxLines=”1″
  95.                                                     android:layout_width=”wrap_content”
  96.                                                     android:textColor=”#FF0000FF”
  97.                                                     android:layout_height=”wrap_content”
  98.                                                     android:text=”穿山甲广告,腾讯广告,快手广告,米盟广告” />
  99.                                             <TextView
  100.                                                     android:maxLines=”1″
  101.                                                     android:layout_width=”wrap_content”
  102.                                                     android:textColor=”#FF0000FF”
  103.                                                     android:layout_height=”wrap_content”
  104.                                                     android:text=”去除部分广告,非通杀” />
  105.                                     </LinearLayout>
  106.                             </LinearLayout>
  107.                     </LinearLayout>
  108.             </LinearLayout>
  109.     </LinearLayout>
  110. </LinearLayout>
  111. */
  112.     //使用IXposedHookLoadPackage接口
  113.     public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
  114.         //dex篇方法1
  115.         XposedHelpers.findAndHookMethod(“com.android.module.MainActivity”, loadPackageParam.classLoader, “onCreate”,Bundle.class, new XC_MethodHook() {
  116.               @Override
  117.               protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  118.                   super.afterHookedMethod(param);
  119.                   //变量 a 是自己随便取,后面的就是写找到的字段
  120.                   //只有不定位子控件和修改控件,单纯精简,前面View是通用的
  121.                   View a = (View) XposedHelpers.getObjectField(param.thisObject,”模块激活”);
  122.                   //a.setVisibility(View.GONE);
  123.                 }
  124.             }
  125.         );
  126.         //dex篇方法2
  127.         XposedHelpers.findAndHookMethod(“com.android.module.MainActivity”, loadPackageParam.classLoader, “InitializeLayout”, new XC_MethodHook() {
  128.               @Override
  129.               protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  130.                   super.afterHookedMethod(param);
  131.                   View a = (View) XposedHelpers.callMethod(param.thisObject,”findViewById”,0x7f080006);
  132.                   //a.setVisibility(View.GONE);
  133.                 }
  134.             }
  135.         );
  136.         //dex篇方法3
  137.         XposedHelpers.findAndHookMethod(“com.android.module.MainActivity”, loadPackageParam.classLoader, “InitializeLayout”, new XC_MethodHook() {
  138.               @Override
  139.               protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  140.                   super.afterHookedMethod(param);
  141.                   //这里定位子控件不能使用View,使用Java代码里对应的布局LinearLayout
  142.                   LinearLayout a = (LinearLayout) XposedHelpers.callMethod(param.thisObject,”findViewById”,0x7f080006);
  143.                   //我的听书是第一个控件就填0
  144.                   //a.removeViewAt(0);
  145.                 }
  146.             }
  147.         );
  148.       }
  149.   }

复制代码

标签

发表评论