为什么要梳理程序主线
在工作中,经常会遇到从别人手里接手一个项目的代码,只针对其中某一个功能修修补补,或者新增一个模块这样的工作。如果对方不能花太多时间帮助梳理,并且代码缺少必要的注释时,自己拿到这样一个源码,往往不知从哪里下手,找不到需要修改的模块在什么位置。特别是工程比较大,代码比较多时,把代码一行一行读下来很不现实,事倍功半。最近读了一份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
之间跳转,以完成特定的功能。根据activity
的android: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
,再根据WelcomeActivity
的name
:.show.WelcomeActivity
,找到WelcomeActivity
的java代码。
打开文件后,可以看到java代码,可以看到有一些诸如onCreate
,init
等函数。因为我们的主要目的是梳理程序主框架,所以可以不用对代码细节研读太细,直接在文档中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();
}
以上代码是MainActivity
的onCreate
函数。此处的紫色斜体字activity_main
,就是布局文件的名称。该布局文件的目录位置在:app > src > main > res > layout > activity_main.xml
。如下图所示:
打开这个activity_main.xml
文件,默认会打开Design
视图,能够直观地看到窗口的设计资源以及位置。在窗口左下角可以进行Design
视图和Text
视图的切换。
代码中的R.id.xxx
,则都是该布局文件中的资源ID,可对应查找。
最后
以上就是我读代码的心得。不对之处,请大家批评指正。或者还有什么别的技巧方法,欢迎留言交流。