接上,继续改
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,导支持包,四个,分别是
然后切换选项卡到Order and Export,把这几个选中都放到前面.这一步我没做也编译成功。
- /home/senrsl/android/source/WORKING_DIRECTORY/out/target/common/obj/JAVA_LIBRARIES/android-common_intermediates/classes.jar
- /home/senrsl/android/source/WORKING_DIRECTORY/out/target/common/obj/JAVA_LIBRARIES/android-support-v4-kitkat_intermediates/classes.jar
- /home/senrsl/android/source/WORKING_DIRECTORY/out/target/common/obj/JAVA_LIBRARIES/core_intermediates/classes.jar
- /home/senrsl/android/source/WORKING_DIRECTORY/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
- /home/senrsl/android/source/WORKING_DIRECTORY/out/target/common/obj/APPS/Launcher2_intermediates/classes.jar
导入后,清理项目,不报错了,直接运行可以安装。
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的时候后面加一句
然后直接安装。三星S4有好三个启动器,无聊的又安了个小米桌面,有四个。
- Toast.makeText(this, "这个是Launcher2的主布局加载", Toast.LENGTH_LONG).show();
当前是小米桌面,然后改成第一个启动器,就会提示了。
编译了android source,发现默认使用的就是Launcher2.
②Launcher3
源码编译后默认用的是Launcher2,发现Launcher3没有被编译。
③自定义的Launcher
1)注册为Launcher
app默认的启动页只有前两行,加上后两行即可。
- <activity
- android:name=".WelcomeActivity"
- android:label="@string/app_name" >
- <intent-filter>
- <!-- 这个程序的第一页 -->
- <action android:name="android.intent.action.MAIN" />
- <!-- 把这个程序加入到程序列表 -->
- <category android:name="android.intent.category.LAUNCHER" />
- <!-- 按home键选择启动器 -->
- <category android:name="android.intent.category.HOME" />
- <!-- 支持接收隐式意图 implicit intent -->
- <category android:name="android.intent.category.DEFAULT" />
- <!-- 支持monkey测试工具 adb shell monkey [options] <event-count> -->
- <category android:name="android.intent.category.MONKEY"/>
- </intent-filter>
- </activity>
12,屏保
什么时候显示,如何定义
按照之前的系统,是点了外设的关机键会跳转屏保,即一个显示时间的页面。
13,短信
在package/app下找到两个短信相关,分别是BasicSmsReceiver和Mms.
①BasicSmsReceiverApp,叫做"简单消息接收器"
这个apk里面只有三个类,而且导入eclipse之后,不用导任何lib,只要把android api设置成19就可以跑了。
查找替换,把com.android.basicsmsreceiver改成dc.android.basicsmsreceiver.
只有三个类,没有layout布局。
mainfest也很简单,只有一个显示sms的dialog,一个接收短信的receiver。
- senrsl@senrsl-ubuntu:~/android/source/WORKING_DIRECTORY/packages/apps/BasicSmsReceiver/src/dc/android/basicsmsreceiver$ ll
- 总用量 20
- drwxrwxr-x 2 senrsl senrsl 4096 3月 20 13:37 ./
- drwxrwxr-x 3 senrsl senrsl 4096 3月 20 13:37 ../
- -rwxrwxr-x 1 senrsl senrsl 2147 3月 20 13:37 BasicSmsReceiverApp.java*
- -rwxrwxr-x 1 senrsl senrsl 3857 3月 20 13:37 DialogSmsDisplay.java*
- -rwxrwxr-x 1 senrsl senrsl 3831 3月 20 13:37 SmsMessageReceiver.java*
执行编译
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="dc.android.basicsmsreceiver">
- <original-package android:name="dc.android.basicsmsreceiver" />
- <uses-permission android:name="android.permission.RECEIVE_SMS" />
- <!-- Needed just for the unit tests -->
- <uses-permission android:name="android.permission.READ_PHONE_STATE" />
- <uses-permission android:name="android.permission.SEND_SMS" />
- <application android:name="BasicSmsReceiverApp"
- android:label="@string/sms_app_name"
- android:hardwareAccelerated="true">
- <activity android:name="dc.android.basicsmsreceiver.DialogSmsDisplay"
- android:theme="@android:style/Theme.Holo.Dialog"
- android:launchMode="singleTop" />
- <receiver android:name="dc.android.basicsmsreceiver.SmsMessageReceiver">
- <intent-filter>
- <action android:name="android.provider.Telephony.SMS_RECEIVED" />
- </intent-filter>
- </receiver>
- </application>
- </manifest>
然后启动模拟器,测试。
- senrsl@senrsl-ubuntu:~/android/source/WORKING_DIRECTORY/packages/apps/BasicSmsReceiver$ mm
好吧,上面这个图明显不对。
去执行 make -j16,会报
这就要改Android.mk,改成LOCAL_PACKAGE_NAME := BasicSmsReceiver222。
- including ./packages/apps/BasicSmsReceiver/Android.mk ...
- including ./packages/apps/BasicSmsReceiver222/Android.mk ...
- build/core/base_rules.mk:134: *** packages/apps/BasicSmsReceiver222: MODULE.TARGET.APPS.BasicSmsReceiver already defined by packages/apps/BasicSmsReceiver。 停止。
然后报
把这个tests文件夹删掉。
- including ./packages/apps/BasicSmsReceiver/Android.mk ...
- including ./packages/apps/BasicSmsReceiver222/Android.mk ...
- build/core/base_rules.mk:134: *** packages/apps/BasicSmsReceiver222/tests: MODULE.TARGET.APPS.BasicSmsReceiverTests already defined by packages/apps/BasicSmsReceiver/tests。 停止。
然后编译成功。
好吧,还是找不到地方看效果,暂时搁议。
//TODO 没找到地方看效果
②Mms
14,(乱入)怎样找需要引入的包
eclipse导入项目后,会有一堆的红叉号,这是因为引用找不到。
有一些谷歌百度即可知道要导什么,但新版的跟旧版的不一样,好多找不到。
一般来说大点的apk,这几个很大概率会用到
然后每个项目有自己独有的需要导入的。
- android-common_intermediates
- core_intermediates
- framework_intermediates
- android-support-v4-kitkat_intermediates
笨办法。。。。
看这个类找不到了,报找不到的错
然后复制类名:PhoneNumberUtil,到源码根目录下搜索
- Multiple markers at this line
- - The import com.android.i18n cannot be resolved
- - The import com.android.i18n.phonenumbers.PhoneNumberUtil cannot be resolved
也可以直接加上.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下的库了,按度娘所说,也不行,今日突然看到这么一句
按之一改,果然正常运行!
- 同样问题,路径是对的,但是添加错位置了。放在GCC那个位置上,一定要放在GCC那个位置上
- ,我们很自然放在Assembly位置上,就找不到资源引用了。
步骤:
①添加NDK环境变量
Windows--Preferences--C/C++--Build--Environment
如果把NDK配置进了环境变量,可以点击Select,选择NDK_HOME.
或者Add,配置完这个键值是这样的:
如图:
- Name:NDK_HOME
- Value:/home/senrsl/android/android-ndk-r10b
②配置工程属性
进入工程属性,将库加入工程路径
项目右键--properties--C/C++ General --Path and Symbols--Include--GNU C --Add.
输入路径
这个地方一定要注意,是GNU C还是CNU C++,我就是因为放到了C++里结果一直找不到。
- ${NDK_HOME}/platforms/android-19/arch-arm/usr/include
然后Apply -- OK,找到了。
C的搞定了,然后试C++的,发现C++的发现不了。
这样,在GNU C++里加入路径,就也找到了
如此
16,编译报错You have tried to change the API from what has been previously approved
增加完06系列后一开始编译运行正常,周末回来再make -j16编译出了个问题。
如提示言,两种处理方法。
- out/target/common/obj/PACKAGING/public_api.txt:17859: error 3: Added class ISenrslService to package android.os
- out/target/common/obj/PACKAGING/public_api.txt:17864: error 3: Added class ISenrslService.Stub to package android.os
- target Java: Calculator (out/target/common/obj/APPS/Calculator_intermediates/classes)
- ******************************
- You have tried to change the API from what has been previously approved.
- To make these errors go away, you have two choices:
- 1) You can add "@hide" javadoc comments to the methods, etc. listed in the
- errors above.
- 2) You can update current.txt by executing the following command:
- make update-api
- To submit the revised current.txt to the main Android repository,
- you will need approval.
- ******************************
- make: *** [out/target/common/obj/PACKAGING/checkapi-current-timestamp] 错误 38
- make: *** 正在等待未完成的任务....
- 注意:packages/apps/Calculator/src/com/android /calculator2/Calculator.java 使用或覆盖了已过时的 API。
- 注意:要了解详细信息,请使用 -Xlint:deprecation 重新编译。
第一,在添加的public API或变量前,加 /** {@hide} */;
第二,先执行make update-api,这样生成的javadoc里是包含的。
17,
2015年04月29日10:16:22
--
senRsl
2015年03月31日19:53:39
2015年03月31日19:53:39
没有评论 :
发表评论