東川印記

一本東川,笑看爭龍斗虎;寰茫兦者,度橫佰昧人生。

android源码编译之05android4.4.2版功能修改02

2015年4月29日星期三



接上,继续改

11,启动器Launcher
在android4.4.2里有俩,位于/home/senrsl/android/source/WORKING_DIRECTORY /packages/apps,分别是launcher2和launcher3.
一个一个来

①Launcher2
eclipse, File--New--Project,Android project for existis code,next

然后选择Launcher2的路径/home/senrsl/android/source/WORKING_DIRECTORY /packages/apps/Launcher2.
导进来后,改android支持为19,导支持包,四个,分别是

  1. /home/senrsl/android/source/WORKING_DIRECTORY/out/target/common/obj/JAVA_LIBRARIES/android-common_intermediates/classes.jar
  2. /home/senrsl/android/source/WORKING_DIRECTORY/out/target/common/obj/JAVA_LIBRARIES/android-support-v4-kitkat_intermediates/classes.jar
  3. /home/senrsl/android/source/WORKING_DIRECTORY/out/target/common/obj/JAVA_LIBRARIES/core_intermediates/classes.jar
  4. /home/senrsl/android/source/WORKING_DIRECTORY/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
  5. /home/senrsl/android/source/WORKING_DIRECTORY/out/target/common/obj/APPS/Launcher2_intermediates/classes.jar
然后切换选项卡到Order and Export,把这几个选中都放到前面.这一步我没做也编译成功。
导入后,清理项目,不报错了,直接运行可以安装。
pingbao

然后编辑代码,会提示Call requires API level 3 (current min is 1): android.app.Activity#onUserLeaveHint,在mainfest.xml里加<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="19"/>即可。

改一下,找到主页,com.android.launcher2.Launcher,在她onCreate的时候后面加一句
  1. Toast.makeText(this, "这个是Launcher2的主布局加载", Toast.LENGTH_LONG).show();
然后直接安装。三星S4有好三个启动器,无聊的又安了个小米桌面,有四个。


当前是小米桌面,然后改成第一个启动器,就会提示了。


编译了android source,发现默认使用的就是Launcher2.


②Launcher3
源码编译后默认用的是Launcher2,发现Launcher3没有被编译。

③自定义的Launcher
1)注册为Launcher
app默认的启动页只有前两行,加上后两行即可。
  1.     <activity
  2.             android:name=".WelcomeActivity"
  3.             android:label="@string/app_name" >
  4.             <intent-filter>
  5.                 <!-- 这个程序的第一页 -->
  6.                 <action android:name="android.intent.action.MAIN" />
  7.                 <!-- 把这个程序加入到程序列表 -->
  8.                 <category android:name="android.intent.category.LAUNCHER" />
  9.                 <!-- 按home键选择启动器 -->
  10.                 <category android:name="android.intent.category.HOME" /> 
  11.                 <!-- 支持接收隐式意图  implicit intent -->
  12.                 <category android:name="android.intent.category.DEFAULT" /> 
  13.                 <!-- 支持monkey测试工具 adb shell monkey [options] <event-count> -->
  14.                 <category android:name="android.intent.category.MONKEY"/>
  15.                
  16.             </intent-filter>
  17.         </activity>

12,屏保
什么时候显示,如何定义
按照之前的系统,是点了外设的关机键会跳转屏保,即一个显示时间的页面。


13,短信
在package/app下找到两个短信相关,分别是BasicSmsReceiver和Mms.
①BasicSmsReceiverApp,叫做"简单消息接收器"
这个apk里面只有三个类,而且导入eclipse之后,不用导任何lib,只要把android api设置成19就可以跑了。
查找替换,把com.android.basicsmsreceiver改成dc.android.basicsmsreceiver.

只有三个类,没有layout布局。
  1. senrsl@senrsl-ubuntu:~/android/source/WORKING_DIRECTORY/packages/apps/BasicSmsReceiver/src/dc/android/basicsmsreceiver$ ll
  2. 总用量 20
  3. drwxrwxr-x 2 senrsl senrsl 4096  3月 20 13:37 ./
  4. drwxrwxr-x 3 senrsl senrsl 4096  3月 20 13:37 ../
  5. -rwxrwxr-x 1 senrsl senrsl 2147  3月 20 13:37 BasicSmsReceiverApp.java*
  6. -rwxrwxr-x 1 senrsl senrsl 3857  3月 20 13:37 DialogSmsDisplay.java*
  7. -rwxrwxr-x 1 senrsl senrsl 3831  3月 20 13:37 SmsMessageReceiver.java*
mainfest也很简单,只有一个显示sms的dialog,一个接收短信的receiver。
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2.         package="dc.android.basicsmsreceiver">
  3.     <original-package android:name="dc.android.basicsmsreceiver" />
  4.     <uses-permission android:name="android.permission.RECEIVE_SMS" />
  5.     <!-- Needed just for the unit tests -->
  6.     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  7.     <uses-permission android:name="android.permission.SEND_SMS" />
  8.     <application android:name="BasicSmsReceiverApp"
  9.             android:label="@string/sms_app_name"
  10.             android:hardwareAccelerated="true">
  11.         <activity android:name="dc.android.basicsmsreceiver.DialogSmsDisplay"
  12.                   android:theme="@android:style/Theme.Holo.Dialog"
  13.                   android:launchMode="singleTop" />
  14.         <receiver android:name="dc.android.basicsmsreceiver.SmsMessageReceiver">
  15.             <intent-filter>
  16.                 <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  17.             </intent-filter>
  18.         </receiver>
  19.     </application>
  20. </manifest>
执行编译
  1. senrsl@senrsl-ubuntu:~/android/source/WORKING_DIRECTORY/packages/apps/BasicSmsReceiver$ mm
然后启动模拟器,测试。


好吧,上面这个图明显不对。

去执行 make -j16,会报
  1. including ./packages/apps/BasicSmsReceiver/Android.mk ...
  2. including ./packages/apps/BasicSmsReceiver222/Android.mk ...
  3. build/core/base_rules.mk:134: *** packages/apps/BasicSmsReceiver222: MODULE.TARGET.APPS.BasicSmsReceiver already defined by packages/apps/BasicSmsReceiver。 停止。
这就要改Android.mk,改成LOCAL_PACKAGE_NAME := BasicSmsReceiver222。
然后报
  1. including ./packages/apps/BasicSmsReceiver/Android.mk ...
  2. including ./packages/apps/BasicSmsReceiver222/Android.mk ...
  3. build/core/base_rules.mk:134: *** packages/apps/BasicSmsReceiver222/tests: MODULE.TARGET.APPS.BasicSmsReceiverTests already defined by packages/apps/BasicSmsReceiver/tests。 停止。
把这个tests文件夹删掉。
然后编译成功。
好吧,还是找不到地方看效果,暂时搁议。
//TODO 没找到地方看效果

②Mms



14,(乱入)怎样找需要引入的包
eclipse导入项目后,会有一堆的红叉号,这是因为引用找不到。
有一些谷歌百度即可知道要导什么,但新版的跟旧版的不一样,好多找不到。
一般来说大点的apk,这几个很大概率会用到
  1. android-common_intermediates
  2. core_intermediates
  3. framework_intermediates
  4. android-support-v4-kitkat_intermediates
然后每个项目有自己独有的需要导入的。
笨办法。。。。
看这个类找不到了,报找不到的错
  1. Multiple markers at this line
  2.     - The import com.android.i18n cannot be resolved
  3.     - The import com.android.i18n.phonenumbers.PhoneNumberUtil cannot be resolved
然后复制类名:PhoneNumberUtil,到源码根目录下搜索

也可以直接加上.java,以免跟.c/.cpp搞混,
如果查出来很多同名的那就比对包名,以此为:com.android.i18n.phonenumbers,
这样右键,打开项目位置,逐级向上,如果他根目录有Android.mk那就可以看到他make后的名,就能在
/home/senrsl/android/source/WORKING_DIRECTORY/out/target/common/obj /JAVA_LIBRARIES找到了,如果没有.mk,好吧还是没找到。。。。。
//TODO 已迷失于源码


15,ubuntu x64报Unresolved inclusion: <jni.h>
之前x32位的时候可以自动获取,后来改装x64后就找不到ndk下的库了,按度娘所说,也不行,今日突然看到这么一句
  1. 同样问题,路径是对的,但是添加错位置了。放在GCC那个位置上,一定要放在GCC那个位置上
  2. ,我们很自然放在Assembly位置上,就找不到资源引用了。
按之一改,果然正常运行!
步骤:
①添加NDK环境变量
Windows--Preferences--C/C++--Build--Environment
如果把NDK配置进了环境变量,可以点击Select,选择NDK_HOME.
或者Add,配置完这个键值是这样的:
  1. Name:NDK_HOME
  2. Value:/home/senrsl/android/android-ndk-r10b
如图:

②配置工程属性
进入工程属性,将库加入工程路径
项目右键--properties--C/C++ General --Path and Symbols--Include--GNU C --Add.
输入路径
  1. ${NDK_HOME}/platforms/android-19/arch-arm/usr/include
这个地方一定要注意,是GNU C还是CNU C++,我就是因为放到了C++里结果一直找不到。


然后Apply -- OK,找到了。
C的搞定了,然后试C++的,发现C++的发现不了。
这样,在GNU C++里加入路径,就也找到了

如此



16,编译报错You have tried to change the API from what has been previously approved
增加完06系列后一开始编译运行正常,周末回来再make -j16编译出了个问题。
  1. out/target/common/obj/PACKAGING/public_api.txt:17859: error 3: Added class ISenrslService to package android.os
  2. out/target/common/obj/PACKAGING/public_api.txt:17864: error 3: Added class ISenrslService.Stub to package android.os
  3. target Java: Calculator (out/target/common/obj/APPS/Calculator_intermediates/classes)
  4. ******************************
  5. You have tried to change the API from what has been previously approved.
  6. To make these errors go away, you have two choices:
  7.    1) You can add "@hide" javadoc comments to the methods, etc. listed in the
  8.       errors above.
  9.    2) You can update current.txt by executing the following command:
  10.          make update-api
  11.       To submit the revised current.txt to the main Android repository,
  12.       you will need approval.
  13. ******************************
  14. make: *** [out/target/common/obj/PACKAGING/checkapi-current-timestamp] 错误 38
  15. make: *** 正在等待未完成的任务....
  16. 注意:packages/apps/Calculator/src/com/android /calculator2/Calculator.java 使用或覆盖了已过时的 API。
  17. 注意:要了解详细信息,请使用 -Xlint:deprecation 重新编译。
如提示言,两种处理方法。
第一,在添加的public API或变量前,加 /** {@hide} */;
第二,先执行make  update-api,这样生成的javadoc里是包含的。

17,

2015年04月29日10:16:22

--
senRsl
2015年03月31日19:53:39

没有评论 :

发表评论