修改android framework学习

1:android平台编译自己编写的framework级service server实录

http://blog.sina.com.cn/s/blog_68f928c10101a4nl.html

2:Android Framework学习——如何加入并编译自定义的模块

http://blog.csdn.net/lylwo317/article/details/53456462
Android开发:Framework添加新模块 http://www.360doc.com/content/14/0308/22/3700464_358895265.shtml


Android5.1.1源码 - 在Framework中添加自定义系统服务
http://blog.csdn.net/earbao/article/details/68955330


 Android5.1.1源码 - 在Framework中添加自定义系统服务 
https://jaq.alibaba.com/community/art/show?spm=a313e.7916646.24000001.64.1azB9G&articleid=342

Android6.0源码添加自定义系统服务
https://www.cnblogs.com/liam999/p/5933827.html

Android FrameWork 学习之Android 系统源码调试 (**_我能看明白如何在studio中导入源代码进行调试_**)
https://www.cnblogs.com/liumce/p/8027559.html

3:Android Framework系统服务详解

http://blog.csdn.net/u012169524/article/details/51264979

操作步骤:见上面3:Android Framework系统服务详解 1):

joe@joe-Aspire-Z3730:/media/sdb4/aosp$ source build/envsetup.sh 
including device/asus/tilapia/vendorsetup.sh
including device/asus/grouper/vendorsetup.sh
including device/asus/deb/vendorsetup.sh
including device/asus/flo/vendorsetup.sh
including device/asus/fugu/vendorsetup.sh
including device/lge/mako/vendorsetup.sh
including device/lge/hammerhead/vendorsetup.sh
including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh
including device/generic/mini-emulator-x86/vendorsetup.sh
including device/generic/mini-emulator-x86_64/vendorsetup.sh
including device/generic/mini-emulator-arm64/vendorsetup.sh
including device/generic/mini-emulator-mips/vendorsetup.sh
including device/htc/flounder/vendorsetup.sh
including device/moto/shamu/vendorsetup.sh
including device/samsung/manta/vendorsetup.sh
including sdk/bash_completion/adb.bash
joe@joe-Aspire-Z3730:/media/sdb4/aosp$ popd
/media/sdb4/aosp/frameworks/base

2):

joe@joe-Aspire-Z3730:/media/sdb4/aosp$ cd /media/sdb4/aosp/frameworks/base
查看系统缓存和交换分区,以便后面高速编译模块
joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ echo $USE_CCACHE
1
joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ ccache -s
cache directory                     /home/joe/.ccache
cache hit (direct)                    30
cache hit (preprocessed)               0
cache miss                         29410
called for link                     1241
called for preprocessing               9
preprocessor error                  1159
unsupported source language          819
no input file                        222
files in cache                     79387
cache size                           7.9 Gbytes
max cache size                      50.0 Gbytes
joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ swapon -s
Filename				Type		Size	Used	Priority
/dev/sdb2                               partition	488444	0	-1
joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ swapon ~/swap1
swapon: /home/joe/swap1: swapon failed: Operation not permitted
joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ sudo swapon ~/swap1
[sudo] password for joe: 
joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ swapon -s
Filename				Type		Size	Used	Priority
/dev/sdb2                               partition	488444	0	-1
/home/joe/swap1                         file		2047996	0	-2

3):

joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ mm
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=5.1.1
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.11.0-15-generic-x86_64-with-Ubuntu-12.04-precise
HOST_BUILD_TYPE=release
BUILD_ID=LMY47Z
OUT_DIR=out
============================================
*** Build configuration changed: "sdk-eng-{en_US,ar_EG,ar_IL,bg_BG,ca_ES,cs_CZ,da_DK,de_AT,de_CH,de_DE,de_LI,el_GR,en_AU,en_CA,en_GB,en_IE,en_IN,en_NZ,en_SG,en_US,en_ZA,es_ES,es_US,fi_FI,fr_BE,fr_CA,fr_CH,fr_FR,he_IL,hi_IN,hr_HR,hu_HU,id_ID,it_CH,it_IT,ja_JP,ko_KR,lt_LT,lv_LV,nb_NO,nl_BE,nl_NL,pl_PL,pt_BR,pt_PT,ro_RO,ru_RU,sk_SK,sl_SI,sr_RS,sv_SE,th_TH,tl_PH,tr_TR,uk_UA,vi_VN,zh_CN,zh_TW}" -> "full-eng-{en_US,en_US,cs_CZ,da_DK,de_AT,de_CH,de_DE,de_LI,el_GR,en_AU,en_CA,en_GB,en_NZ,en_SG,eo_EU,es_ES,fr_CA,fr_CH,fr_BE,fr_FR,it_CH,it_IT,ja_JP,ko_KR,nb_NO,nl_BE,nl_NL,pl_PL,pt_PT,ru_RU,sv_SE,tr_TR,zh_CN,zh_HK,zh_TW,am_ET,hi_IN,en_US,en_AU,en_IN,fr_FR,it_IT,es_ES,et_EE,de_DE,nl_NL,cs_CZ,pl_PL,ja_JP,zh_TW,zh_CN,zh_HK,ru_RU,ko_KR,nb_NO,es_US,da_DK,el_GR,tr_TR,pt_PT,pt_BR,rm_CH,sv_SE,bg_BG,ca_ES,en_GB,fi_FI,hi_IN,hr_HR,hu_HU,in_ID,iw_IL,lt_LT,lv_LV,ro_RO,sk_SK,sl_SI,sr_RS,uk_UA,vi_VN,tl_PH,ar_EG,fa_IR,th_TH,sw_TZ,ms_MY,af_ZA,zu_ZA,am_ET,hi_IN,en_XA,ar_XB,fr_CA,km_KH,lo_LA,ne_NP,si_LK,mn_MN,hy_AM,az_AZ,ka_GE,my_MM,mr_IN,ml_IN,is_IS,mk_MK,ky_KG,eu_ES,gl_ES,bn_BD,ta_IN,kn_IN,te_IN,uz_UZ,ur_PK,kk_KZ,normal}"
*** Forcing "make installclean"...
*** rm -rf out/target/product/generic/data/* out/target/product/generic/data-qemu/* out/target/product/generic/userdata-qemu.img out/host/linux-x86/obj/NOTICE_FILES out/host/linux-x86/sdk out/target/product/generic/*.img out/target/product/generic/*.ini out/target/product/generic/*.txt out/target/product/generic/*.xlb out/target/product/generic/*.zip out/target/product/generic/kernel out/target/product/generic/data out/target/product/generic/skin out/target/product/generic/obj/APPS out/target/product/generic/obj/NOTICE_FILES out/target/product/generic/obj/PACKAGING out/target/product/generic/recovery out/target/product/generic/root out/target/product/generic/system out/target/product/generic/vendor out/target/product/generic/oem out/target/product/generic/dex_bootjars out/target/product/generic/obj/JAVA_LIBRARIES out/target/product/generic/obj/FAKE out/target/product/generic/obj/EXECUTABLES/adbd_intermediates out/target/product/generic/obj/STATIC_LIBRARIES/libfs_mgr_intermediates out/target/product/generic/obj/EXECUTABLES/init_intermediates out/target/product/generic/obj/ETC/mac_permissions.xml_intermediates out/target/product/generic/obj/ETC/sepolicy_intermediates out/target/product/generic/obj/ETC/init.environ.rc_intermediates
*** Done with the cleaning, now starting the real build.
find: `phone/java': No such file or directory
find: `phone/java': No such file or directory
make: Entering directory `/media/46bb100d-2505-4025-8425-34ecf3129209/aosp'
Aidl: framework <= frameworks/base/core/java/android/service/test/IMyTestManager.aidl
target Java: framework (out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes)

。。。。。。。。。。。。
Copying: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/noproguard.classes.jar
target Dex: framework
Copying: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.dex
target Jar: framework (out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/javalib.jar)
Notice file: frameworks/base/NOTICE -- out/target/product/generic/obj/NOTICE_FILES/src//system/framework/framework.jar.txt
make: *** No rule to make target `out/target/product/generic/system/framework/framework-res.apk', needed by `out/target/product/generic/system/framework/framework.jar'.  Stop.
make: Leaving directory `/media/46bb100d-2505-4025-8425-34ecf3129209/aosp'

#### make failed to build some targets (01:18 (mm:ss)) ####
虽然出现了错误,但是在/media/sdb4/aosp/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/service/test/文件夹下出现了二个文件:
IMyTestManager.java     IMyTestManager.P

IMyTestManager.java文件内容如下:
/*
 * This file is auto-generated.  DO NOT MODIFY.
 * Original file: frameworks/base/core/java/android/service/test/IMyTestManager.aidl
 */
package android.service.test;
public interface IMyTestManager extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements android.service.test.IMyTestManager
{
private static final java.lang.String DESCRIPTOR = "android.service.test.IMyTestManager";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
 * Cast an IBinder object into an android.service.test.IMyTestManager interface,
 * generating a proxy if needed.
 */
public static android.service.test.IMyTestManager asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof android.service.test.IMyTestManager))) {
return ((android.service.test.IMyTestManager)iin);
}
return new android.service.test.IMyTestManager.Stub.Proxy(obj);
}
@Override public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_sayHello:
{
data.enforceInterface(DESCRIPTOR);
java.lang.String _result = this.sayHello();
reply.writeNoException();
reply.writeString(_result);
return true;
}
case TRANSACTION_priFunction:
{
data.enforceInterface(DESCRIPTOR);
int _result = this.priFunction();
reply.writeNoException();
reply.writeInt(_result);
return true;
}
}
return super.onTransact(code, data, reply, flags);
}
private static class Proxy implements android.service.test.IMyTestManager
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
@Override public android.os.IBinder asBinder()
{
return mRemote;
}
public java.lang.String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
@Override public java.lang.String sayHello() throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
java.lang.String _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
mRemote.transact(Stub.TRANSACTION_sayHello, _data, _reply, 0);
_reply.readException();
_result = _reply.readString();
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
@Override public int priFunction() throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
int _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
mRemote.transact(Stub.TRANSACTION_priFunction, _data, _reply, 0);
_reply.readException();
_result = _reply.readInt();
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
}
static final int TRANSACTION_sayHello = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
static final int TRANSACTION_priFunction = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
}
public java.lang.String sayHello() throws android.os.RemoteException;
public int priFunction() throws android.os.RemoteException;
}
IMyTestManager.P文件内容如下:
out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/service/test/IMyTestManager.java: \
  frameworks/base/core/java/android/service/test/IMyTestManager.aidl 

4):创建新的系统服务类 frameworks/base/core/java/android/service/test/MyTestManagerService.java

package android.service.test;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

public class MyTestManagerService extends IMyTestManager.Stub{
private static final String TAG = "MyTestManagerService";
	private Context mContext;
	public MyTestManagerService(Context context){
		mContext = context;
	}
	@Override
	public String sayHello() throws RemoteException{
		Log.d(TAG,"sayHello()");
		return "Hello AIDL";
	}
	@Override
	public int priFunction() throws RemoteException{
		Log.d(TAG,"priFunction()");
		return 0;
	}
}

5:创建系统服务公开接串口管理类 frameworks/base/core/java/android/service/test/MyTestManager.java

package android.service.test;
import android.os.RemoteException;
import android.util.Log;
import android.service.test.IMyTestManager;

public class MyTestManager{
	private static final TAG="MyTestManager";
	private IMyTestManager mService;
	public MyTestManager(IMyTestManager service){
		mService = service;
	}

	public String sayHello() throws RemoteException{
		Log.d(TAG,"sayHello()");
		return mService.sayHello();
	}
}

6:将创建的服务添加进ServiceManager 文件:frameworks/base/services/java/com/android/server/SystemServer.java

import android.service.test.MyTestManagerService;

private void startOtherServices()函数中
       AudioService audioService = null;
	MyTestManagerService mTestService = null;
。。。。。。
try{
		Slog.i(TAG,"MyTestManager Service");
		mTestService = new MyTestManagerService(context);
		ServiceManager.addService(Context.MYTEST_SERVICE,mTestService);
	    }catch(Throwable e){
		reportWtf("starting MyTestManager",e);
	    }

7:代码中的Context.MYTEST_SERVICE服务常量添加 路径:frameworks/base/core/java/android/content/Context.java

/** @hide */
    @StringDef({
AUDIO_SERVICE,
MYTEST_SERVICE,      增加这行代码在@StringDef注解中

另外还在代码中
public static final String MYTEST_SERVICE = "mytest";

8:注册服务 路径:frameworks/base/core/java/android/app/ContextImpl.java

import android.service.test.IMyTestManager;
import android.service.test.MyTestManager;

在静态代码块中:
registerService(AUDIO_SERVICE, new ServiceFetcher() {
                public Object createService(ContextImpl ctx) {
                    return new AudioManager(ctx);
                }});
registerService(MYTEST_SERVICE,new ServiceFetcher(){
		public Object createService(ContextImpl ctx){
			IBinder iBinder = ServiceManager.getService(Context.MYTEST_SERVICE);
			if(iBinder == null){
				return null;
			}
			IMyTestManager service = IMyTestManager.Stub.asInterface(iBinder);
			return new MyTestManager(service);
		}
	});

另外,还要在aosp/external/sepolicy/service_contexts文件中在中间增加一行

(audio u:object_r:system_server_service:s0的下面)

mytest u:object_r:system_server_service:s0

9:我认为的编译方式(可能我的理解不正确)

joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ mm
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=5.1.1
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.11.0-15-generic-x86_64-with-Ubuntu-12.04-precise
HOST_BUILD_TYPE=release
BUILD_ID=LMY47Z
OUT_DIR=out
============================================
find: `phone/java': No such file or directory
find: `phone/java': No such file or directory
make: Entering directory `/media/46bb100d-2505-4025-8425-34ecf3129209/aosp'
make: *** No rule to make target `out/target/product/generic/system/framework/framework-res.apk', needed by `out/target/product/generic/system/framework/framework.jar'.  Stop.
make: Leaving directory `/media/46bb100d-2505-4025-8425-34ecf3129209/aosp'

#### make failed to build some targets (1 seconds) ####

10:

joe@joe-Aspire-Z3730:/media/sdb4/aosp$ make update-api
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=5.1.1
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.11.0-15-generic-x86_64-with-Ubuntu-12.04-precise
HOST_BUILD_TYPE=release
BUILD_ID=LMY47Z
OUT_DIR=out
============================================
including ./abi/cpp/Android.mk ...
including ./art/Android.mk ...
including ./bionic/Android.mk ...

。。。。。
Copying: out/target/common/obj/JAVA_LIBRARIES/android-support-v7-mediarouter_intermediates/classes.jar
target Java: android-support-v7-palette (out/target/common/obj/JAVA_LIBRARIES/android-support-v7-palette_intermediates/classes)
Copying: out/target/common/obj/JAVA_LIBRARIES/android-support-v7-palette_intermediates/classes-jarjar.jar
Copying: out/target/common/obj/JAVA_LIBRARIES/android-support-v7-palette_intermediates/emma_out/lib/classes-jarjar.jar
Copying: out/target/common/obj/JAVA_LIBRARIES/android-support-v7-palette_intermediates/classes.jar
Docs droiddoc: out/target/common/docs/doc-comment-check
DroidDoc took 264 sec. to write docs to out/target/common/docs/doc-comment-check
Copying current.txt
Copying removed.txt
Docs droiddoc: out/target/common/docs/system-api-stubs
DroidDoc took 12 sec. to write docs to out/target/common/docs/system-api-stubs
Copying system-current.txt
Copying system-removed.txt

#### make completed successfully (12:02 (mm:ss)) ####

11:

joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ mmm core/res/
。。。。
warning: string 'wifi_display_notification_title' is missing 87 required localizations: af_ZA am_ET ar_EG az_AZ bg_BG bn_BD ca_ES cs_CZ da_DK de_AT de_CH de_DE de_LI el_GR en_AU en_CA en_GB en_IN en_NZ en_SG en_US eo_EU es_ES es_US et_EE eu_ES fa_IR fi_FI fr_BE fr_CA fr_CH fr_FR gl_ES hi_IN hr_HR hu_HU hy_AM in_ID is_IS it_CH it_IT iw_IL ja_JP ka_GE kk_KZ km_KH kn_IN ko_KR ky_KG lo_LA lt_LT lv_LV mk_MK ml_IN mn_MN mr_IN ms_MY my_MM nb_NO ne_NP nl_BE nl_NL pl_PL pt_BR pt_PT rm_CH ro_RO ru_RU si_LK sk_SK sl_SI sr_RS sv_SE sw_TZ ta_IN te_IN th_TH tl_PH tr_TR uk_UA ur_PK uz_UZ vi_VN zh_CN zh_HK zh_TW zu_ZA
warning: no entries written for dimen/password_keyboard_height (0x010500a8)
Notice file: frameworks/base/core/res/NOTICE -- out/target/product/generic/obj/NOTICE_FILES/src//system/framework/framework-res.apk.txt
Install: out/target/product/generic/system/framework/framework-res.apk
make: Leaving directory `/media/46bb100d-2505-4025-8425-34ecf3129209/aosp'

#### make completed successfully (30 seconds) ####

12:

joe@joe-Aspire-Z3730:/media/sdb4/aosp/frameworks/base$ mmm -B
因为代码写错了,重新修改源代码,回家之后再重启电脑

13:开启swap ,重新配置source build/envsetup 及lunch 之后

joe@joe-Aspire-Z3730:/media/sdb4/aosp$ make -j8
.......
Target system fs image: out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img
Running:  mkuserimg.sh out/target/product/generic/system out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img ext4 system 576716800 out/target/product/generic/root/file_contexts
make_ext4fs -T -1 -S out/target/product/generic/root/file_contexts -l 576716800 -a system out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img out/target/product/generic/system
Creating filesystem with parameters:
    Size: 576716800
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 7040
    Inode size: 256
    Journal blocks: 2200
    Label: 
    Blocks: 140800
    Block groups: 5
    Reserved block group size: 39
Created filesystem with 1467/35200 inodes and 109536/140800 blocks
Install system fs image: out/target/product/generic/system.img
out/target/product/generic/system.img+ maxsize=588791808 blocksize=2112 total=576716800 reserve=5947392

#### make completed successfully (13:34 (mm:ss)) ####

说明编译成功了,此时需要用模拟器来看看实验结果。先要编译SDK。

14:lunch sdk-eng然后再:

joe@joe-Aspire-Z3730:/media/sdb4/aosp$ make sdk
。。。。。
Package SDK: out/host/linux-x86/sdk/sdk/android-sdk_eng.joe_linux-x86.zip
SDK: warning: including GNU target out/target/product/generic/system/lib/libexif.so
SDK: warning: including GNU target out/target/product/generic/system/lib/libgccdemangle.so
SDK: warning: including GNU target out/target/product/generic/system/lib/libnl.so

#### make completed successfully (01:02:57 (hh:mm:ss)) ####
编译完之后会在/media/sdb4/aosp/out/host/linux-x86/sdk/sdk/  目录下产生一个android-sdk_eng.joe_linux-x86子目录及zip压缩文件,这个压缩文件其实就是android-sdk_eng.joe_linux-x86目录压缩而成。以后开发时就可以用这个子目录或zip压缩文件(解压)之后作为SDK使用。

15:joe@joe-Aspire-Z3730:/media/sdb4/aosp$ make重新编译系统之后启动模拟器,用adb shell启动shell, 然后root@generic:/system/lib # service list

26	mytest: [android.service.test.IMyTestManager]

针对步骤9中出现的错误,网上有人说:https://bbs.csdn.net/topics/370150557

1.先在framework/base目录下执行
mmm core/res/      生成framework-res.apk
2.接着在framework/base下继续执行
mm -B 
即可生成Install: out/target/product/generic/system/framework/framework.jar

简化方法:

解决了我的问题,不过我简化了一下:
mmm frameworks/base/core/res/
mmm frameworks/base/ 

备注: 网上有人说增加了系统服务之后,需要重新编译再启动服务,我还没有到这一步,先记录下来,以备忘记

. 测试
make
make update-api 更新current.xml文件
生成system.imz文件,放到<ANDROID_SDK>/platform/android-20/images/目录下,
adb shell
service list

还有人说:https://www.2cto.com/kf/201709/687510.html

回到根目录下执行make update-api,否则编译不能通过。先编译framework.jar,然后编译service.jar,最后编译自己加mymodule。可以用mm命令编译,没问题后再整编。因为编译出来的out目录有boot.art和boot.oat,framework.jar和service.jar不能push调试,所以只能刷整包验证。

猜你喜欢

转载自my.oschina.net/u/2963604/blog/1648931