魔趣论坛

 找回密码
 注册账号
通过您的新浪微博帐号登录
QQ登录
查看: 30261|回复: 187

[知识百科] 【教你做玩机高手】通过一个示例程序的修改为大家讲解什么是插桩和源码开发!

[复制链接]
  • TA的每日心情
    奋斗
    2017-2-15 14:49
  • 签到天数: 1302 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-5-10 08:17:02 | 显示全部楼层 |阅读模式
    插桩的概念:
    插桩就是在代码中插入一段我们自定义的代码。

    插桩的目的:
    将程序中插入我们自定义的代码编译到可执行文件中,
    该程序的运行过程中就会执行我们自定义的代码,实现我们想要增加的功能需求。

    安卓插桩简介:
    在安卓方面,插桩通常是指在某手机的官方原厂ROM中通过反编译的方式获得中间代码,
    然后通过对中间代码的修改加入自定义的功能,达到为ROM添加功能的目的。
    这样做的优势是厂商原厂ROM中的功能、特性或优化基本不会丧失。
    而且适配工作很简单,因为官方的ROM本身就是能正常运行的,插桩者只要保证把自己的代码正确插入即可。
    缺点是通过中间代码插桩实现功能比起源代码进行修改要费力太多。
    而且维护起来也相对麻烦,各机型上难以复用,需要针对性的做一些修改。

    什么时候用到插桩:
    源码开发是自己拥有一套完整的源代码,想要实现新增的功能需求只需直接在源码上修改。
    比如小米自己生产的手机的ROM,必然是在一套完整的源代码上不断修改完善的。
    而小米用来适配到其它厂商手机的patchrom项目,则是通过插桩修改的方式。
    因为小米并不能获得其它厂商的ROM源代码,只能通过反编译获得中间代码进行插桩修改。

    比如我们看小米Nexus 5 MIUIV6的框架包:https://github.com/MiCode/patchrom_nexus5/tree/v6-kitkat/framework.jar.out/smali/android/os

    这里的文件就是反编译Nexus 5官方原厂ROM后得到的中间代码并加入MIUI自己的功能的版本。
    我们随便打开里面一个不太复杂的文件,如AsyncResult.smali,你看到的内容就是所谓中间代码了。
    1. .class public Landroid/os/AsyncResult;
    2. .super Ljava/lang/Object;
    3. .source "AsyncResult.java"


    4. # instance fields
    5. .field public exception:Ljava/lang/Throwable;

    6. .field public result:Ljava/lang/Object;

    7. .field public userObj:Ljava/lang/Object;


    8. # direct methods
    9. .method public constructor <init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Throwable;)V
    10.     .locals 0
    11.     .param p1, "uo"    # Ljava/lang/Object;
    12.     .param p2, "r"    # Ljava/lang/Object;
    13.     .param p3, "ex"    # Ljava/lang/Throwable;

    14.     .prologue
    15.     .line 63
    16.     invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    17.     .line 64
    18.     iput-object p1, p0, Landroid/os/AsyncResult;->userObj:Ljava/lang/Object;

    19.     .line 65
    20.     iput-object p2, p0, Landroid/os/AsyncResult;->result:Ljava/lang/Object;

    21.     .line 66
    22.     iput-object p3, p0, Landroid/os/AsyncResult;->exception:Ljava/lang/Throwable;

    23.     .line 67
    24.     return-void
    25. .end method

    26. .method public static forMessage(Landroid/os/Message;)Landroid/os/AsyncResult;
    27.     .locals 3
    28.     .param p0, "m"    # Landroid/os/Message;

    29.     .prologue
    30.     const/4 v2, 0x0

    31.     .line 53
    32.     new-instance v0, Landroid/os/AsyncResult;

    33.     iget-object v1, p0, Landroid/os/Message;->obj:Ljava/lang/Object;

    34.     invoke-direct {v0, v1, v2, v2}, Landroid/os/AsyncResult;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Throwable;)V

    35.     .line 55
    36.     .local v0, "ret":Landroid/os/AsyncResult;
    37.     iput-object v0, p0, Landroid/os/Message;->obj:Ljava/lang/Object;

    38.     .line 57
    39.     return-object v0
    40. .end method

    41. .method public static forMessage(Landroid/os/Message;Ljava/lang/Object;Ljava/lang/Throwable;)Landroid/os/AsyncResult;
    42.     .locals 2
    43.     .param p0, "m"    # Landroid/os/Message;
    44.     .param p1, "r"    # Ljava/lang/Object;
    45.     .param p2, "ex"    # Ljava/lang/Throwable;

    46.     .prologue
    47.     .line 40
    48.     new-instance v0, Landroid/os/AsyncResult;

    49.     iget-object v1, p0, Landroid/os/Message;->obj:Ljava/lang/Object;

    50.     invoke-direct {v0, v1, p1, p2}, Landroid/os/AsyncResult;-><init>(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Throwable;)V

    51.     .line 42
    52.     .local v0, "ret":Landroid/os/AsyncResult;
    53.     iput-object v0, p0, Landroid/os/Message;->obj:Ljava/lang/Object;

    54.     .line 44
    55.     return-object v0
    56. .end method
    复制代码

    而源代码可读性要比中间代码强多了,我们打开AOSP项目中相同文件的源码来看
    https://github.com/android/platform_frameworks_base/blob/android-4.4_r1.2.0.1/core/java/android/os/AsyncResult.java
    1. /*
    2. * Copyright (C) 2006 The Android Open Source Project
    3. *
    4. * Licensed under the Apache License, Version 2.0 (the "License");
    5. * you may not use this file except in compliance with the License.
    6. * You may obtain a copy of the License at
    7. *
    8. *      http://www.apache.org/licenses/LICENSE-2.0
    9. *
    10. * Unless required by applicable law or agreed to in writing, software
    11. * distributed under the License is distributed on an "AS IS" BASIS,
    12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13. * See the License for the specific language governing permissions and
    14. * limitations under the License.
    15. */

    16. package android.os;

    17. import android.os.Message;

    18. /** [url=home.php?mod=space&uid=398]@hide[/url] */
    19. public class AsyncResult
    20. {

    21.     /*************************** Instance Variables **************************/

    22.     // Expect either exception or result to be null
    23.     public Object userObj;
    24.     public Throwable exception;
    25.     public Object result;

    26.     /***************************** Class Methods *****************************/

    27.     /** Saves and sets m.obj */
    28.     public static AsyncResult
    29.     forMessage(Message m, Object r, Throwable ex)
    30.     {
    31.         AsyncResult ret;

    32.         ret = new AsyncResult (m.obj, r, ex);

    33.         m.obj = ret;

    34.         return ret;
    35.     }

    36.     /** Saves and sets m.obj */
    37.     public static AsyncResult
    38.     forMessage(Message m)
    39.     {
    40.         AsyncResult ret;

    41.         ret = new AsyncResult (m.obj, null, null);

    42.         m.obj = ret;

    43.         return ret;
    44.     }

    45.     /** please note, this sets m.obj to be this */
    46.     public
    47.     AsyncResult (Object uo, Object r, Throwable ex)
    48.     {
    49.         userObj = uo;
    50.         result = r;
    51.         exception = ex;
    52.     }
    53. }
    复制代码

    读到这里你应该会对插桩的中间代码和源代码的区别有一个基础的了解了。
    patchrom开源根本不算开源代码,因为反编译中间代码的取得我们任何一个人通过反编译工具都能做到,这只是忽悠外行的东西。
    某月亮打包大神(安卓梦工厂)跪舔MIUI说是开源项目,反而说魔趣是插桩的造谣行为只是欺骗新手用户,
    同时暴露给所有明白人他既不懂插桩,又不会源码开发,连CM源码和AOSP源码都弄不清楚,
    只是个彻头彻尾拿别人代码打包赚推广费的骗子罢了。满口肆无忌惮的污蔑,只能骗到外行。
    而且本人从没说过MIUI和魔趣谁好谁差,只说过MIUI不是开源项目,打包党纯粹造谣污蔑!



    接下来,我们用一个示例程序演示如果通过插桩和源代码修改的方式为一个程序增加功能。
    这个示例程序很简单,打开之后只会在手机上显示一段话:

    而我们要实现的就是用插桩和源码修改的两种方法实现另起一行再显示"以后多发科普,提升新手玩机水平,避免大家被这种人坑!"
    如果是源代码的话,只需要很简单的在源码中加入一段"\n以后多发科普,提升新手玩机水平,避免大家被这种人坑!"
    下面是修改后的源码:
    1. package com.example.appdemo;

    2. import android.app.Activity;
    3. import android.os.Bundle;
    4. import android.widget.TextView;

    5. public class MainActivity extends Activity {

    6.     @Override
    7.     protected void onCreate(Bundle savedInstanceState) {
    8.         super.onCreate(savedInstanceState);
    9.         setContentView(R.layout.activity_main);
    10.         TextView mTextView = (TextView)findViewById(R.id.helloworld);
    11.         mTextView.setText("moonlight-roms月亮打包大神就是个拿别人代码打包赚推广费,肆意胡编乱造各种没有常识的话欺骗新用户的骗子!\n以后多发科普,提升新手玩机水平,避免大家被这种人坑!");
    12.     }
    13. }
    复制代码

    如果要插桩,则是要反编译这个程序,然后将
    1.     .line 15
    2.     .local v0, "mTextView":Landroid/widget/TextView;
    3.     const-string v1, "moonlight-roms\u6708\u4eae\u6253\u5305\u5927\u795e\u5c31\u662f\u4e2a\u62ff\u522b\u4eba\u4ee3\u7801\u6253\u5305\u8d5a\u63a8\u5e7f\u8d39\uff0c\u8086\u610f\u80e1\u7f16\u4e71\u9020\u5404\u79cd\u6ca1\u6709\u5e38\u8bc6\u7684\u8bdd\u6b3a\u9a97\u65b0\u7528\u6237\u7684\u9a97\u5b50!"
    复制代码

    修改为
    1.     .line 15
    2.     .local v0, "mTextView":Landroid/widget/TextView;
    3.     const-string v1, "moonlight-roms\u6708\u4eae\u6253\u5305\u5927\u795e\u5c31\u662f\u4e2a\u62ff\u522b\u4eba\u4ee3\u7801\u6253\u5305\u8d5a\u63a8\u5e7f\u8d39\uff0c\u8086\u610f\u80e1\u7f16\u4e71\u9020\u5404\u79cd\u6ca1\u6709\u5e38\u8bc6\u7684\u8bdd\u6b3a\u9a97\u65b0\u7528\u6237\u7684\u9a97\u5b50!\n\u4ee5\u540e\u591a\u53d1\u79d1\u666e\uff0c\u63d0\u5347\u65b0\u624b\u73a9\u673a\u6c34\u5e73\uff0c\u907f\u514d\u5927\u5bb6\u88ab\u8fd9\u79cd\u4eba\u5751\uff01"
    复制代码

    最终效果截图:

    示例程序源代码、修改前中间代码和插桩后中间代码下载:
    游客,如果您要查看本帖隐藏内容请回复


    因月亮打包大神又开始造谣生事儿,所以写下此文科普。
    供新手玩家学习,以了解打包党的真实水平和骗子行径,防止被骗!
    欢迎打包大神继续造谣,为我提供更多科普素材!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?注册账号  

    x
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    7 小时前
  • 签到天数: 609 天

    连续签到: 5 天

    [LV.9]以坛为家II

    发表于 2015-5-10 08:30:09 来自移动版 | 显示全部楼层
    赞一个   
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    升级   66%

    发表于 2015-5-10 08:31:20 | 显示全部楼层
    通过一个示例程序的修改为大家讲解什么是插桩和源码开发
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-12-28 08:36
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    升级   36%

    发表于 2015-5-10 08:35:02 来自移动版 | 显示全部楼层
    好谢谢!!!!!!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-12-11 21:29
  • 签到天数: 32 天

    连续签到: 1 天

    [LV.5]常住居民I

    升级   25%

    发表于 2015-5-10 08:39:10 来自移动版 | 显示全部楼层
    ,,,,,,
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-3-14 15:06
  • 签到天数: 504 天

    连续签到: 1 天

    [LV.9]以坛为家II

    升级   78.69%

    发表于 2015-5-10 08:40:08 来自移动版 | 显示全部楼层
    看起来是前排~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-10-16 09:04
  • 签到天数: 30 天

    连续签到: 1 天

    [LV.5]常住居民I

    升级   98%

    发表于 2015-5-10 08:41:43 | 显示全部楼层
    龙猪大大强悍。顶顶。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-5-10 09:07
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    升级   42%

    发表于 2015-5-10 09:06:53 | 显示全部楼层
    高手,赞一个
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2017-2-3 22:44
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    升级   62%

    发表于 2015-5-10 09:07:05 来自移动版 | 显示全部楼层
    猪大威武,建议在发一下怎么为机型适配ROM的教程让小白学习一下怎么做ROM
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2015-11-1 22:52
  • 签到天数: 19 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    升级   40%

    发表于 2015-5-10 09:08:14 | 显示全部楼层
    ~~~~~~~
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册账号  

    本版积分规则

    手机版|魔趣论坛 ( 沪ICP备11020540号-1 )|  

    我们旨在提供一个良好的手机玩家技术交流、资源分享社区,如果有涉及版权的资源,请联系管理员并提供相应的版权证明,我们会进行相应处理。

    GMT+8, 2017-3-29 15:12 , Processed in 0.151993 second(s), 48 queries , Gzip On, Redis On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表