如何阅读Android项目的源码,快速梳理程序主线


为什么要梳理程序主线


在工作中,经常会遇到从别人手里接手一个项目的代码,只针对其中某一个功能修修补补,或者新增一个模块这样的工作。如果对方不能花太多时间帮助梳理,并且代码缺少必要的注释时,自己拿到这样一个源码,往往不知从哪里下手,找不到需要修改的模块在什么位置。特别是工程比较大,代码比较多时,把代码一行一行读下来很不现实,事倍功半。最近读了一份Android studio工程的源码,总结了一些规律和套路,同大家分享。

先把代码跑通


首先要先把代码跑通,这是一切工作开展的前提。代码从一台开发机拷贝到另一台,由于编译器设置的不同,或是环境配置的不同,一般来说不能一次性编译通过,会报各种各样奇怪的错误。常见的错误有:Android studio版本太低需更新;Android studio在国内的更新服务器被墙,需要设置合适的镜像代理;SDK、NDK等外部依赖的软件开发工具包路径配置不一致;SDK版本号设置与本机环境不匹配等。这个过程要根据所报的错误百度解决,一般来说自己遇到的问题都有别人遇到过,可以参考。

开始梳理主框架


在编译器左侧区域选择Project视图,可以看到工程的文件结构。一般来说,app > src > main > java 目录下,是我们需要研读的代码。

首先打开AndroidManifest.xml,找到一堆<uses-permission>下面的<application>以及里面所包含的<activity>,如下所示:

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />

<application
    android:name=".base.MyApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".show.WelcomeActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize|stateHidden">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".show.MainActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize|stateHidden" />

    <activity
        android:name=".show.LoginActivity"
        android:launchMode="singleTask"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize|stateHidden" />

    <activity
        android:name=".show.LocalActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize|stateHidden" />

以上截取了四个<activity>。每个activity可以理解为具有相对独立功能的一个窗口,应用程序打开后,根据程序逻辑,在各个activity之间跳转,以完成特定的功能。根据activityandroid:name,可以大概猜测出这个activity所完成的功能。在这个程序中,我们可以根据字面意思来猜测:WelcomeActivity是欢迎界面;MainActivity是应用程序主界面,相当于根窗口;LoginActivity是用户登录界面,以此类推。其中,WelcomeActivity中包含这样两行代码:

<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

这表示,该activity是应用程序打开后第一个启动的activity

接下来,对应去阅读WelcomeActivity的java代码。

代码的位置在哪里呢?可以用文件名搜索的方法,也可以根据AndroidManifest.xml里指示的位置打开。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.traffic.survey">

根据package值,找到目录com.traffic.survey,再根据WelcomeActivityname.show.WelcomeActivity,找到WelcomeActivity的java代码。


打开文件后,可以看到java代码,可以看到有一些诸如onCreateinit等函数。因为我们的主要目的是梳理程序主框架,所以可以不用对代码细节研读太细,直接在文档中Ctrl+F,搜索关键字“startActivity”或者“Intent”,来快速定位到activity跳转的代码。

因为我们知道,在Android中实现窗口跳转需要调用如下API:

startActivity(new Intent(this, newActivity.class));

用搜索关键字的方法,可以提高读代码的效率,快速梳理各窗口之间的关系。比如,在WelcomeActivity中的搜索结果是这样的:

public void onAnimationEnd(Animator animator) {
    if (TextUtils.isEmpty(userId)) {
        startActivity(new Intent(WelcomeActivity.this, LoginActivity.class));
    } else {
        startActivity(new Intent(WelcomeActivity.this, MainActivity.class));
    }
    finish();
}

通过这一小段,可以大概知道跳转逻辑。欢迎动画结束时,判断userId是不是空。如果是空,则跳转到LoginActivity(登录窗口);如果非空,则跳转到MainActivity(主窗口)。

此时按住Ctrl键不放,用鼠标点击LoginActivity,可以直接跳转到LoginActivity的java代码。再用相同的关键字搜索方法,搜索LoginActivity的窗口跳转逻辑。

这样就可以快速梳理出整个程序的窗口跳转逻辑,快速定位到自己需要修改的代码在哪里。

精读所需修改的代码的业务逻辑

通过梳理主框架,已经定位到自己所需修改的代码位置时,需要精读此处的代码,彻底掌握这部分的业务逻辑,才能在此基础上修改。在这里不具体举例如何修改代码,只介绍如何找到该Activity对应的布局文件。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initWidget();
    initData();
}

以上代码是MainActivityonCreate函数。此处的紫色斜体字activity_main,就是布局文件的名称。该布局文件的目录位置在:app > src > main > res > layout > activity_main.xml。如下图所示:


打开这个activity_main.xml文件,默认会打开Design视图,能够直观地看到窗口的设计资源以及位置。在窗口左下角可以进行Design视图和Text视图的切换。


代码中的R.id.xxx,则都是该布局文件中的资源ID,可对应查找。

最后

  以上就是我读代码的心得。不对之处,请大家批评指正。或者还有什么别的技巧方法,欢迎留言交流。


文章作者: 婷姐
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-ND 4.0 许可协议。转载请注明来源 婷姐 !
评论
  目录