Slide 1

Slide 1 text

SystemΞϓϦ։ൃೖ໳ DroidKaigi 2017 Day 2 14:20 - 14:50 kobashin

Slide 2

Slide 2 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 2 ͜ͷεϥΠυʹ͍ͭͯ https://goo.gl/cj9AXW ∠ Լʹஔ͍ͯ·͢ ݟ͑ʹ͍͘ͱ͜Ζ΋͋Δͱࢥ͏ͷͰ ݟͳ͕ΒͲ͏ͧ

Slide 3

Slide 3 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 3 ࣗݾ঺հ Shinji Kobayashi (@kobashinG) Androidͱ͸2009ೖࣾҎདྷͷ෇͖߹͍
 ΞϓϦΑΓFramework૚ͷ࢓ࣄ͕ଟΊ

Slide 4

Slide 4 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 4 ࠓ೔͓࿩͢Δ͜ͱ 1. SystemΞϓϦͱύʔϛογϣϯ 2. SystemΞϓϦͱϚϧνϢʔβʔ 3. SystemΞϓϦͱ։ൃ؀ڥ ͓·͚ʹ͍ۙ

Slide 5

Slide 5 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 5 λʔήοτ • SystemΞϓϦΛ։ൃͨ͜͠ͱ͕ແ͍ • platformॺ໊ͷཁෆཁʹ໎ͬͨ͜ͱ͕͋Δ
 ͱΓ͋͑ͣॺ໊͚ͭͱ͚ • SystemΞϓϦͰϚϧνϢʔβʔαϙʔτ
 Λ͍ͨ͠

Slide 6

Slide 6 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 6 ஫ҙࣄ߲ • ຊ೔͓࿩͢Δ͜ͱ͸ɺandroid-7.1.1_r13
 Λϕʔεʹ͍ͯ͠·͢ • ಈ࡞֬ೝʹ͸Nexus6Λར༻
 Tablet-UI, Restricted profileͷ֬ೝ༻ʹ
 গ͠ROMΛ࿔ͬͯ·͢

Slide 7

Slide 7 text

1 SystemΞϓϦͱύʔϛογϣϯ ∠

Slide 8

Slide 8 text

SystemΞϓϦͱ͸ʁ

Slide 9

Slide 9 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 9 AndroidʹΠϯετʔϧ͞Ε͍ͯΔΞϓϦ # # # # GooglePlay ౳͔Β SystemΞϓϦʹ୺຤ʹϓϦΠϯ

Slide 10

Slide 10 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 10 AndroidʹΠϯετʔϧ͞Ε͍ͯΔΞϓϦ • System.imgʹؚ·Εͳ͍௨ৗͷΞϓϦ • System.imgʹؚ·ΕΔΞϓϦ • PrivilegedΞϓϦ • sharedUserId=“android.uid.xxxx” • ಛఆͷॺ໊෇͖ΞϓϦ • etc… SystemΞϓϦ

Slide 11

Slide 11 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 11 ௨ৗͷΞϓϦͱSystemΞϓϦͱͷҧ͍ • ύʔϛογϣϯϞσϧʹΑΓ੍ݶ͞Εͨ
 APIͷར༻ • @hide API, @systemApiͷར༻ • ಉuid͔ΒͷΈͷΞΫηεՄAPIͷར༻ $ Πϯετʔϧख๏ʹΑΓݖݶ͕ҟͳΔ ∠

Slide 12

Slide 12 text

ύʔϛογϣϯϞσϧ

Slide 13

Slide 13 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 13 ύʔϛογϣϯϞσϧ • ΞϓϦ͕อ࣋͢ΔύʔϛογϣϯͷΈ
 ΞϓϦαϯυϘοΫε֎ͷϦιʔε΁ͷ
 ΞΫηε΁ڐՄΛ༩͑Δ MyApp INTERNET # % & device API INTERNET CAMERA CAMERA

Slide 14

Slide 14 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 14 protectionLevel = BasicProtection | AdditionalFlag ex. signatureOrSystem = signature | privileged ϓϩςΫγϣϯϨϕϧ + permission: a.p.WRITE_MEDIA_STORAGE package: android label: null description: null protectionLevel: signature|privileged

Slide 15

Slide 15 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 15 Basic Protection Type ֓ཁɺڐՄ৚݅ normal ௿ϦεΫ dangerous Ϣʔβͷݸਓ৘ใ΍อଘσʔλ΁ ͷΞΫηε͕ൃੜ͢Δ signature ύʔϛογϣϯͷఆٛऀͱಉ͡ॺ ໊Λ࣋ͭΞϓϦ signatureOrSystem signatureݖݶɺSystemΞϓϦ

Slide 16

Slide 16 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 16 Additional Flag ֓ཁɺڐՄ৚݅ privileged(system) /system/priv-app ҎԼʹΠϯετʔϧ ͞ΕͨΞϓϦ development ༧ΊڐՄ͍ͯ͠ͳ͍ͱڐՄͰ͖ͳ͍ installer Intent.ACTION_INSTALL_PACKAGEʹ ൓Ԡ͢ΔActivityΛ࣋ͭΞϓϦ appop AppOpsͰ؅ཧ͞Ε͍ͯΔύʔϛογ ϣϯ

Slide 17

Slide 17 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 17 Additional Flag ֓ཁɺڐՄ৚݅ pre23 targetSdkVersion < 23 verifier Intent.ACTION_PACKAGE_NEEDS_VER IFICATIONʹ൓ԠͰ͖ΔActivityΛ࣋ͭ setup Intent.CATEGORY_SETUP_WIZARDʹ ൓ԠͰ͖ΔActivityΛ࣋ͭ preinstalled γεςϜΠϝʔδʹؚ·ΕΔશͯͷΞ ϓϦ

Slide 18

Slide 18 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 18 ͨͱ͑͹ • FactoryResetػೳΛ࣋ͭ • ୺຤ΛεϦʔϓঢ়ଶʹ͢ΔػೳΛ࣋ͭ

Slide 19

Slide 19 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 19 APIΛ୳͢ • ྨࣅΞϓϦ͔ΒAPIΛ୳͢ • SettingsΞϓϦ͕࣋ͬͯΔ • ֘౰Օॴͷιʔε͔ΒAPIΛݟ͚ͭΔ private void doMasterClear() {
 Intent intent = new Intent(Intent.ACTION_MASTER_CLEAR);
 intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
 intent.putExtra(Intent.EXTRA_REASON, "MasterClearConfirm");
 intent.putExtra(Intent.EXTRA_WIPE_EXTERNAL_STORAGE, mEraseSdCard);
 getActivity().sendBroadcast(intent);
 // Intent handling is asynchronous -- assume it will happen soon.
 }
 MasterClearConfirm.java

Slide 20

Slide 20 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 20 APIຖͷύʔϛογϣϯΛ֬ೝ 
 
 
 
 AndroidManifest.xml ୺຤ΛFactoryReset͢ΔAPI͸ ʮMASTER_CLEARʯ͕ඞཁ

Slide 21

Slide 21 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 21 permissionͷprotectionLevelΛ֬ೝ $ adb shell pm list permissions -f + permission:android.permission.MASTER_CLEAR package:android label:null description:null protectionLevel:signature|privileged ʮMASTER_CLEARʯ-> signature | privileged ॺ໊ or /system/priv-app ΁Πϯετʔϧඞཁ

Slide 22

Slide 22 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 22 ͨͱ͑͹ • FactoryResetػೳΛ࣋ͭ • ୺຤ΛεϦʔϓঢ়ଶʹ͢ΔػೳΛ࣋ͭ

Slide 23

Slide 23 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 23 APIΛ୳͢ • XXManager͔ΒAPIΛ୳͢ • ֘౰Օॴͷιʔε͔ΒAPIΛݟ͚ͭΔ /**
 * Forces the device to go to sleep.
 * 
 * Requires the {@link android.Manifest.permission#DEVICE_POWER} * permission.
 * 
 * @hide Requires signature permission.
 */
 public void goToSleep(long time, int reason, int flags) {
 PowerManager.java

Slide 24

Slide 24 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 24 APIຖͷύʔϛογϣϯΛ֬ೝ /**
 * Forces the device to go to sleep.
 * 
 * Requires the {@link android.Manifest.permission#DEVICE_POWER} * permission.
 * 
 * @hide Requires signature permission.
 */
 public void goToSleep(long time, int reason, int flags) {
 PowerManager.java ୺຤ΛSleepঢ়ଶ΁Ҡߦ͢ΔAPI͸ ʮDEVICE_POWERʯ͕ඞཁ

Slide 25

Slide 25 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 25 permissionͷprotectionLevelΛ֬ೝ $ adb shell pm list permissions -f + permission:android.permission.DEVICE_POWER package:android label:null description:null protectionLevel:signature ʮDEVICE_POWERʯ-> signature͕ඞཁ
 platformॺ໊͕ඞཁ

Slide 26

Slide 26 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 26 SystemΞϓϦͱύʔϛογϣϯ • ඞཁͳػೳʹ߹Θͤύʔϛογϣϯͷ
 protectionLevelΛ֬ೝ㱺ඞཁͳݖݶΛ෇༩ • AdditionalFlagͷৄࡉ͸ɺԼهॲཧ෦͕
 Θ͔Γ΍͍͢ • PackageManagerService.grantSignaturePermission()

Slide 27

Slide 27 text

signature + android.uid.system

Slide 28

Slide 28 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 28 sharedUserId=“android.uid.system” • uidΛݻఆԽʢuid = 1000ʣ • uid.system͕࣋ͭϦιʔε΁ͷΞΫηε • Ұ෦੍ݶAPIΛར༻Մೳʹ • platformॺ໊ඞཁ • ҰํɺWebView͕ར༻ෆՄೳʹ

Slide 29

Slide 29 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 29 uidʹΑ੍ͬͯݶ͞ΕΔAPI /**
 * Validate a user-supplied password string with cryptfs
 */
 @Override
 public int verifyEncryptionPassword(String password) throws RemoteException {
 // Only the system process is permitted to validate passwords
 if (Binder.getCallingUid() != android.os.Process.SYSTEM_UID) {
 throw new SecurityException("no permission to access the crypt keeper");
 } MountService.java ҉߸ԽFSͷύεϫʔυνΣοΫAPI

Slide 30

Slide 30 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 30 uidʹΑ੍ͬͯݶ͞ΕΔAPI final int uid = android.os.Process.myUid();
 if (uid == android.os.Process.ROOT_UID || uid == android.os.Process.SYSTEM_UID) {
 throw new UnsupportedOperationException(
 "For security reasons, WebView is not allowed in privileged processes");
 } WebViewFactory.java ٯʹandroid.uid.systemͱ͢Δ͜ͱͰWebview ͸ར༻Ͱ͖ͳ͘ͳΔ

Slide 31

Slide 31 text

·ͱΊ

Slide 32

Slide 32 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 32 privileged? APIݕ౼ ҰൠAPP signature? uid? priv-app signature sharedUid SystemΞϓϦͱύʔϛογϣϯ YES NO NO YES YES NO

Slide 33

Slide 33 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 33 SystemΞϓϦͱύʔϛογϣϯ • API͸ྨࣅΞϓϦ or XXManager͔Β୳͢ • Platformॺ໊͕ඞཁ͔Ͳ͏͔ • ԿͰ΋͚ͭΕ͹ྑ͍ͬͯ΋ͷͰ΋ແ͍ • uid.system͸੍ݶ΋͋Δ͜ͱʹ஫ҙ Point

Slide 34

Slide 34 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 34 SystemΞϓϦͱύʔϛογϣϯ • Platformॺ໊Ҏ֎ʹ΋UICCอଘॺ໊ͱ
 Ұக͠ͳ͚Ε͹ར༻ෆՄAPI΋ଘࡏ͢Δ
 TelephonyManager.*ͱ͔ • ΞοϓσʔτͷΞϯΠϯετʔϧ͕Մೳ • /system/appͷΞϓϦ΁μ΢ϯάϨʔυ • migrationରԠΘ͢Εͣʹ

Slide 35

Slide 35 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 35 SystemΞϓϦͱΞοϓσʔτ • ΞοϓσʔτࡁΈͷSystemΞϓϦ͔Ͳ͏͔
 ͸্هAPIͰ֬ೝՄೳ /**
 * @hide
 */
 public boolean isUpdatedSystemApp() {
 return (flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
 } ApplicationInfo.java

Slide 36

Slide 36 text

2 SystemΞϓϦͱϚϧνϢʔβʔ ∠

Slide 37

Slide 37 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 37 ϚϧνϢʔβʔ͓͞Β͍ Tablet • from 4.2 • Restricted Profile Hand Set ※ݫີʹ͸Voice capableʹର Ԡ͍ͯ͠Δ͔Ͳ͏͔ • from 5.0

Slide 38

Slide 38 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 38 ΞϓϦͷΠϯετʔϧͷ͞Εํ /data/user/ 0 10 11 • Owner User • /data/data/ ΁ͷSymbolic Link • New User • New Profile $ ΞϓϦέʔγϣϯσʔλ͸Ϣʔβʔຖʹಠཱ

Slide 39

Slide 39 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 39 ϢʔβʔؒͰσʔλڞ༗͍ͨ͠ • ΞϓϦσʔλ/EXTERNAL STORAGE σʔλڞʹϢʔβʔຖʹഉଞ • ઃఆҾ͖ܧ͗ • ϢʔβʔຖʹৼΔ෣͍Λมߋ͍ͨ͠ service, receiverΛʮSingleton Componentʯʹ ∠

Slide 40

Slide 40 text

Singleton Component

Slide 41

Slide 41 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 41 MyApp uid=0 MyApp uid=10 Activity Service singleUser Activity Singleton Component service, receiver΁singleUse=“true”Λઃఆ uid=0 ͷcomponentΛSingletonͱͯ͠ར༻

Slide 42

Slide 42 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 42 ϚϧνϢʔβʔૢ࡞ʹඞཁͳॺ໊ • INTERACT_ACROSS_USER • signature | privilege • Ϣʔβʔૢ࡞Ұൠʹඞཁ • INTERACT_ACROSS_USER_FULL • signature • ଞϢʔβʔͷActivityىಈ
 ଞϢʔβʔͷContentObserverొ࿥ͳͲ

Slide 43

Slide 43 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 43 Singleton Component 
 
 AndroidManifest.xml

Slide 44

Slide 44 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 44 Singleton Component @Override
 public int sampleAidlApi() throws RemoteException {
 File file = getFilesDir(); // ͲͷϢʔβ͔ΒͰ΋ /data/user/0/xxx.xxx.xxx/files
 Log.i(TAG, "filesDir: " + file.getAbsolutePath());
 
 SampleService.java

Slide 45

Slide 45 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 45 Singleton Component಺ͰϢʔβʔνΣοΫ • UserHandle.getCallingUserId() • Binderܦ༝ͷAPIΞΫηεݩUIDΛऔಘ • UserManager.getUserInfo() • ֤Ϣʔβʔͷৄࡉ৘ใΛऔಘ

Slide 46

Slide 46 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 46 Singleton Component @Override
 public int sampleAidlApi() throws RemoteException {
 if( UserHandle.USER_SYSTEM == getCallingUserId()){
 // USER_SYSTEM (uid == 0)
 } else {
 // other user (uid != 0)
 UserManager userManager = (UserManager) getSystemService(USER_SERVICE);
 UserInfo userInfo = ɹuserManager.getUserInfo(getCallingUserId());
 // ֤ϢʔβຖͷInfo UserInfo{10:New user:10} Log.i(TAG, "UserInfo " + userInfo.toString());
 }
 SampleService.java

Slide 47

Slide 47 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 47 ϢʔβʔຖͷComponentΛىಈ͢Δ • startActivityAsUser(Intent, UserHandle) • UserΛࢦఆ͠ActivityΛىಈ • ֤ίϯϙʔωϯτ༻ʹAsUser API͕ଘࡏ • ޡͬͨActivityΛىಈ͠Α͏ͱͨ͠৔߹
 SecurityException͕ൃੜ͢Δ

Slide 48

Slide 48 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 48 Singleton Component @Override
 public int sampleAidlApi() throws RemoteException {
 // loginதϢʔβʔͷActivityىಈ Intent intent = new Intent();
 intent.setClass(MultiUserSingletonService.this, MainActivity.class);
 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 startActivityAsUser(intent, UserHandle.CURRENT); // uid=0ϢʔβʔͷServiceىಈ(SYSTEM=OWNER) startServiceAsUser(intent, UserHandle.SYSTEM);
 
 
 SampleService.java

Slide 49

Slide 49 text

SystemΞϓϦ ͱ Restricted Profile

Slide 50

Slide 50 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 50 Restricted Profile • ੍ݶϢʔβʔʹ͸ɺΞϓ ϦέʔγϣϯͷڐՄঢ় ଶΛઃఆͰ͖Δ • Intent.ACTION_GET_RES TRICTION_ENTRIESʹΑ Γ੍ݶ಺༰Λݸผʹઃ ఆͰ͖Δ

Slide 51

Slide 51 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 51 SystemΞϓϦͱRestricted Profile • SystemΞϓϦͷදࣔ৚݅ • ॺ໊༗Γ͸ඇදࣔ • platformॺ໊ແ͠͸දࣔ • platformॺ໊༗Γʴɹ Intent.ACTION_GET_REST RICTION_ENTRIESΛड৴ ͢ΔReceiver࣮૷

Slide 52

Slide 52 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 52 ະॺ໊ platformॺ໊ platformॺ໊ has receiver දࣔঢ়ଶ දࣔ ඇදࣔ දࣔ + ' SystemΞϓϦͱRestricted Profile • platformॺ໊࣋ͪͷ৔߹͸ON/OFFઃఆͰ͖ͳ͍
 ৄࡉઃఆΛߦ͏ͨΊʹ Intent.ACTION_GET_RESTRICTION_ENTRIESΛϋϯυϧ͢Δ

Slide 53

Slide 53 text

·ͱΊ

Slide 54

Slide 54 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 54 SystemΞϓϦͱϚϧνϢʔβʔ • جຊҰൠΞϓϦͱมΘΒͳ͍ • ϢʔβʔؒͰσʔλڞ༗ɺϢʔβʔຖͷڍಈมߋ
 ɹ㱺singleUserͷservice, receiverΛར༻͢Δ • Restricted Profile͸ॺ໊༗ແͰڍಈมߋ͋Γ
 ඞཁʹԠ͡ACTION_GET_RESTRICTION_ENTRIESͷ
 ࣮૷ݕ౼Λʢ࣮૷಺༰͸ҰൠΞϓϦͱಉ౳ʣ

Slide 55

Slide 55 text

3 SystemΞϓϦͱ։ൃ؀ڥ ∠

Slide 56

Slide 56 text

SystemΞϓϦ ʴ Android Studio

Slide 57

Slide 57 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 57 AndroidSDKͷ࣋ͨͳ͍APIΛར༻͢Δ • AndroidSDKͷ࣋ͨͳ͍APIΛར༻
 ɹ㱺௨ৗͷ؀ڥͩͱࢀরΤϥʔൃੜ • AOSPϏϧυ؀ڥͰϏϧυඞཁ
 㱺IDE͕ར༻Ͱ͖ͳ͍໰୊
 ʢEclipse༻ͷαϙʔτϖʔδ͸͕͋ͬͨɺ
 ɹAndroid Studio༻͸ແ͍ΑͶʁʣ

Slide 58

Slide 58 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 58 AndroidSDKͷ࣋ͨͳ͍APIΛར༻͢Δ 1. AOSPͷϏϧυʢframework.jarੜ੒ʣ 2. framework.jarΛϥΠϒϥϦͱͯ͠ొ࿥ 3. ϏϧυΤϥʔճආͷͨΊbuild.gradleมߋ 4. ॺ໊͕ඞཁͰ͋Ε͹෇༩͢Δ

Slide 59

Slide 59 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 59 2. framework.jarΛϥΠϒϥϦͱͯ͠ొ࿥ 1. out/target/common/obj/JAVA_LIBRARIES/ framework_intermediates/classes.jar 
 Λίϐʔˍϖʔετ

Slide 60

Slide 60 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 60 2. framework.jarΛϥΠϒϥϦͱͯ͠ొ࿥ 2. apkʹؚΊͳ͍Α͏ʹprovidedͰಡΈࠐΉ dependencies {
 // build pathʹframework.jarΛؚΊΔɻAPKʹ͸ؚΊͳ͍
 provided fileTree(dir: 'framework', include: ['*.jar']) }

Slide 61

Slide 61 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 61 3. ϏϧυΤϥʔճආͷͨΊbuild.gradleมߋ • Editor͸app.imlͷϥΠϒϥϦΛ্͔Βϩʔυ
 ͠ࢀরΛղܾ͢Δ • framework.jarΛSDKΑΓ΋্ʹมߋ • build.gradleʹtaskॻ͍͓ͯ͘ͱศར

Slide 62

Slide 62 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 62 import groovy.xml.*
 task changeOrderEntry {
 def iml = file("app.iml")
 def doc = (new XmlParser()).parse(iml);
 def deleteNode = doc.component[1].orderEntry.find { it.@type == "jdk" }
 
 def _type = deleteNode.@type
 def _jdkName = deleteNode.@jdkName
 def _jdkType = deleteNode.@jdkType
 
 doc.component[1].remove(deleteNode)
 new Node(doc.component[1], 'orderEntry', ['type': _type, 'jdkName': _jdkName, 'jdkType': _jdkType])
 
 iml.text = XmlUtil.serialize(doc)
 }
 preBuild.dependsOn(changeOrderEntry) 3. ϏϧυΤϥʔճආͷͨΊbuild.gradleมߋ

Slide 63

Slide 63 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 63 tasks.withType(JavaCompile) {
 options.compilerArgs.add('-Xbootclasspath/p:app/framework/ framework.jar')
 }
 3. ϏϧυΤϥʔճආͷͨΊbuild.gradleมߋ • packageੜ੒࣌ʹBuildPathʹׂΓࠐΉʹ͸
 -Xbootclasspath/p: Λར༻͢Δ

Slide 64

Slide 64 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 64 4. ॺ໊͕ඞཁͳΒ෇༩͢Δ • debugॺ໊͸ build/target/product/security • keytool-importkeypair • https://github.com/getfatday/keytool-importkeypair signingConfigs {
 debug {
 storeFile file(“/path/to/debug.keystore")
 storePassword "android"
 keyAlias "platform"
 keyPassword "android"
 }
 }


Slide 65

Slide 65 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 65 AndroidSDKͷ࣋ͨͳ͍APIΛར༻͢Δ • priv-app΁ͷΠϯετʔϧ͸ผ్ඞཁ • ࠷ۙͷfirm͸dm-verity͕̤̣ͳͷͰ
 `adb disable-verity; adb reboot;` Λ๨Εͣʹ • SDKͷjarΛฤू͢Δํ๏ͩͱɺ
 :app:mockableAndroidJar TaskͰΤϥʔൃੜ

Slide 66

Slide 66 text

debugging framework

Slide 67

Slide 67 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 67 Debugging AOSP Source 1. user-debugͷ࣮ػΛ༻ҙ 2. AOSPͷϏϧυ 3. ./development/tools/idegen/intellij-gen.sh
 ͰϓϩδΣΫτͷiprΛ࡞੒ 4. DDMSىಈ 5. studioͰಡΈࠐΈ & debug࣮ߦ

Slide 68

Slide 68 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 68 
 $ ./development/tools/idegen/intellij-gen.sh \ packages/apps/Settings $ monitor
 iprͷ࡞੒ͱDDMSͷىಈ • intellij-gen.shΛར༻͠iprΛ࡞੒ • idegen.shͰ΋ߏΘͳ͍͕AOSPશମ͸ϝϞϦෛՙ • DDMS͕port:8700ͰσόΠεͱ௨৴
 ಉportͰAndroid StudioͰremote઀ଓ͢Δ

Slide 69

Slide 69 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 69 DDMSͰΞλον͢ΔϓϩηεΛબ୒

Slide 70

Slide 70 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 70 Edit ConfigurationͰRemote DebugΛ௥Ճ Port:8700Λࢦఆ

Slide 71

Slide 71 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 71 SettingsΞϓϦͷσόοά

Slide 72

Slide 72 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 72 Debugging AOSP Source • Step࣮ߦ౳΋ࣗ༝ʹͰ͖ΔͷͰɺAOSPͷ
 ιʔεΛಡΉͱ͖ͷखॿ͚ʹ • DDMSͷىಈॱʹΑͬͯ͸8700Ͱ઀ଓ
 Ͱ͖ͳ͍ͱ͖΋͋ΔͷͰ஫ҙ

Slide 73

Slide 73 text

·ͱΊ

Slide 74

Slide 74 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 74 ·ͱΊ • Ϗϧυ͸ίϚϯυϥΠϯͰӡ༻͸ਏ͍ • AOSPͷιʔεΛಡΉ؀ڥͱͯ͠1ͭ༻ҙ
 ͓ͯ͘͠ͱίʔυϦʔσΟϯάḿΔ
 ʢIntellijͷBookmarkػೳͱ͔௒ศར͡Όͳ͍Ͱ͔͢ʣ

Slide 75

Slide 75 text

SystemΞϓϦ։ൃೖ໳ ! @kobashinG 75 ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠