ฉันจะสร้าง Android SDK โดยใช้ API ที่ซ่อนอยู่และภายในได้อย่างไร


86

ฉันต้องการสร้าง Android SDK ใหม่ (หรือเป็นเฉพาะ android.jar) เพื่อรวม API ที่ซ่อนอยู่และภายใน

ฉันไม่พบเอกสารหรือการอภิปรายเกี่ยวกับวิธีดำเนินการเกี่ยวกับเรื่องนี้ ฉันมีสภาพแวดล้อมการสร้าง Ubuntu CyanogenMod ที่ติดตั้งแล้วซึ่งสามารถสร้าง cm7 ได้

ตอนนี้ฉันอ่านแล้วว่าการสร้าง SDK จะสร้าง SDK แต่ฉันต้องการสร้าง SDK ที่มีเมธอดและฟิลด์ที่ทำเครื่องหมายว่าซ่อนอยู่โดยใช้ @hide เป็นไปได้หรือไม่

สิ่งที่ฉันต้องการทำคือเปลี่ยนแปลงแอปพลิเคชันที่ใช้ API ที่ซ่อนอยู่และในการสร้างใหม่ฉันต้องการใช้ SDK ที่แก้ไข


2
@Hidden เพียงแค่ซ่อน javadoc วิธีการทั้งหมดเหล่านี้ยังสามารถใช้ได้
Blundell

12
@hide จะลบออกจากไฟล์คลาส
Thomas Hofmann

1
เชื่อมโยง: stackoverflow.com/questions/4951146/…
Blundell

ฉันรู้ว่าฉันสามารถใช้การสะท้อนได้ แต่ฉันต้องการเปลี่ยนแอปพลิเคชันที่มีอยู่ซึ่งใช้ API ที่ซ่อนอยู่โดยไม่มีการอ้างอิงและฉันไม่ต้องการเปลี่ยนโค้ดที่มีอยู่ทั้งหมดเพื่อใช้การอ้างอิง
Thomas Hofmann

4
ฉันคิดว่าคุณสามารถลบ@Hiddenป้ายกำกับของ API ที่คุณต้องการเข้าถึงจากนั้นดำเนินการmake update-apiและmake SDKสร้าง SDK ของคุณเอง
dreamtale

คำตอบ:


69

นี่คือสิ่งที่ฉันใช้เสมอเพื่อใช้ api ที่ซ่อนอยู่

  1. สร้าง repo หรือดาวน์โหลด jar จาก https://sites.google.com/site/hippunosource/home/android/androidnohide-apiwo-shi-yongsuru-rifurekushonha-wei-shi-yong
  2. คัดลอกออก / target / common / obj / JAVA_LIBRARIES / framework_intermediates / class.jar (ควรเปลี่ยนชื่อเป็น framework_all.jar)
  3. กำหนดค่าเส้นทางการสร้างโครงการของคุณ -> ไลบรารี -> เพิ่มไหภายนอกนี้ ในการสั่งซื้อและส่งออกให้เลื่อนขึ้นก่อน android.jar

สิ่งนี้ได้ผลสำหรับฉันเช่นกัน! ตอนนี้ฉันสามารถทำงานจริงได้แล้วขอบคุณสำหรับสิ่งนี้
CurlyPaul

IMHO นี่เป็นวิธีที่ง่ายและเร็วที่สุด
Patrick Cho

ไม่มีวิธีทำเครื่องหมายนี้เป็นคำตอบที่เหมาะสมหรือไม่?
Chris Browet

2
วิธีนี้ใช้ได้กับอุปกรณ์ทั้งหมดหรือไม่หรือใช้ได้กับอุปกรณ์เป้าหมายเท่านั้น?
Hải Phong

เพื่อกำหนดคำสั่งห้องสมุดในสตูดิโอหุ่นยนต์คุณจะต้องปรับเปลี่ยนโมดูล.imlไฟล์และนำ lib ที่คุณต้องการของ<orderEntry>ก่อนAndroid SDK น่าเสียดายที่เทคนิคนี้ไม่คงอยู่เนื่องจากไฟล์จะถูกเขียนทับเมื่อกดปุ่ม gradle-sync
waqaslam

44

ฉันได้ทำการตรวจสอบเรื่องนี้แล้วและข้อสรุปของฉันก็เรียบง่าย: สิ่งนี้ไม่สามารถทำได้โดยไม่ต้องทำงานสักหน่อย อ่านส่วนที่เหลือของคำตอบนี้เพื่อดูรายละเอียดเกี่ยวกับสิ่งที่ฉันพบ


android.jarจริงๆแล้วประกอบด้วย "API สาธารณะ" framework.jarและcore.jarที่พบในsystem/frameworks/อุปกรณ์ android.jarเป็นชนิดของสิ่งที่ฉันจะเรียกว่าส่วนหัวของไลบรารี Java การใช้งานทั้งหมดในรหัสไบต์จริงเป็นเพียงสิ่งthrow new RuntimeException("stub");นี้ช่วยให้คุณสามารถสร้างต่อandroid.jar(เช่นใน Eclipse) แต่การดำเนินการจะต้องดำเนินการบนอุปกรณ์หรือโปรแกรมจำลอง

API สาธารณะของ Android SDK ถูกกำหนดโดยคลาส / วิธีการ / ฟิลด์ที่ไม่ได้นำหน้าด้วย@{hide}คำอธิบายประกอบ javadoc กล่าวคือทุกสิ่งที่ไม่มีคำอธิบายประกอบจะรวมอยู่ใน SDK

android.jarถูกสร้างขึ้นมาจากแหล่งที่ตั้งอยู่ในout/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediatesที่ตัวเองสร้างขึ้นโดยเครื่องมือDroidDocbuild/tools/droiddocตั้งอยู่ใน

DroidDocเป็นเครื่องมือ (อาจดัดแปลงมาจาก javadoc หรือใช้ javadoc) ที่สร้างเอกสาร Android SDK จริง ในฐานะที่เป็นผลข้างเคียงและอาจเป็นเพราะมันแยกวิเคราะห์ javadoc ทั้งหมดอยู่แล้วมันยังพ่นสตับ Android ออกมาซึ่งจะรวบรวมเป็นไฟล์android.jarที่แจกจ่ายใน SDK

ดังนั้นในการรวมสิ่งที่ซ่อนไว้คุณสามารถทำได้หากคุณต้องการรวมเฉพาะบางส่วนเพียงแค่ลบ@hideคำอธิบายประกอบและสร้าง SDK ใหม่

อย่างไรก็ตามหากคุณต้องการรวมทุกส่วนที่ซ่อนไว้สิ่งต่างๆจะซับซ้อนมากขึ้น คุณสามารถแก้ไขDroidDoc (แหล่งที่มาที่เกี่ยวข้องอยู่build/tools/droiddoc/src/Stubs.java) เพื่อให้ตรวจพบว่าไม่มีสิ่งใดซ่อนอยู่ นี่เป็นเรื่องเล็กน้อยและฉันได้ลองแล้ว แต่ต้นขั้วที่สร้างขึ้นนั้นไม่ได้รวบรวมเลย

ข้อสรุปของฉันในตอนนี้คือมันไม่สามารถทำได้ ต้นขั้วที่สร้างขึ้นหากคุณลบส่วนของ DroidDoc ที่ตรวจพบคำอธิบายประกอบที่ซ่อนอยู่นั้นไม่สามารถรวบรวมได้และจะต้องใช้งานเล็กน้อยในการรวบรวมอย่างถูกต้อง

ดังนั้นคำตอบของฉันสำหรับคำถามของคุณคือ: ไม่สิ่งนี้ไม่สามารถทำได้โดยไม่ต้องทำงานมากมาย ขออภัย.


หมายเหตุด้านข้างเกี่ยวกับmkstubsเครื่องมือ mkstubsจะใช้เมื่อคุณสร้างส่วนเสริมSDKนั่นคือส่วนเสริมที่คุณสามารถพบได้ในตัวจัดการ Android SDK จากผู้ขายเช่น Samsung ให้ API เพิ่มเติมสำหรับสิ่งต่างๆสำหรับโทรศัพท์ Samsung โดยเฉพาะ mkstubsทำเช่นเดียวกับกระบวนการสร้างต้นขั้วของ DroidDoc แต่จะไม่ใช้@hideคำอธิบายประกอบ แต่จะใช้.defsไฟล์ที่อธิบายว่าแพ็กเกจ / คลาส / ฟิลด์ใดที่จะรวมหรือแยกออกจากส่วนเสริม SDK ของคุณ

อย่างไรก็ตามทั้งหมดนี้ไม่เกี่ยวข้องกับคำถามเนื่องจากบิวด์ Android SDK ไม่ได้ใช้mkstubsเครื่องมือนี้ (น่าเสียดาย.)


ฉันก็ดูเกินไป นอกจาก Droiddoc แล้วยังมีเครื่องมือที่เรียกว่า mkstubs ใน / development / tools / mkstubs มันถูกเรียกในระหว่างการสร้างและเท่าที่ฉันเห็นมันจะแก้ไขไฟล์คลาสที่ทำให้สิ่งที่ขาดหายไปจากพวกเขา ใน build / core / งาน / sdk-addon.mk มีรหัสต่อไปนี้: กำหนดต้นขั้ว - addon-jar $ (เรียกไฟล์ stub-addon-jar, $ (1)): $ (1) | mkstubs $ (ข้อมูล Stubbing addon jar โดยใช้ $ (PRODUCT_SDK_ADDON_STUB_DEFS)) $ (hide) java -jar $ (call module-installed-files, mkstubs) $ (if $ (hide) ,, - v) \ "$$ <" "$$ @" @ $ (PRODUCT_SDK_ADDON_STUB_DEFS) endef
Thomas Hofmann

น่าเสียดายที่ฉันไม่ได้ชอบสิ่งนี้ แต่ดูเหมือนว่าทุกอย่างขึ้นอยู่กับตัวแปรที่เรียกว่าซ่อน ฉันไม่พบว่ามันถูกตั้งค่าแล้ว หากคุณค้นหา $ (ซ่อน) ในไฟล์บิลด์อื่น ๆ คุณจะเห็นว่าส่วนใหญ่ขึ้นอยู่กับค่านี้ ดูเหมือนว่าจะส่งผลต่อวิธีการสร้าง C libs ด้วย
Thomas Hofmann

@ThomasHofmann: ตอนแรกฉันก็สับสนกับเครื่องมือ mkstubs เช่นกัน สิ่งที่ฉันได้เรียนรู้คือ mkstubs จะถูกใช้เมื่อคุณสร้าง addon sdk (ผู้ขาย) เท่านั้นไม่ใช่เมื่อคุณสร้าง sdk ตามปกติ อย่างไรก็ตาม mkstubs ทำเช่นเดียวกับ DroidDoc ยกเว้นว่าจะไม่ใช้@hideคำอธิบายประกอบโดย "just" จะใช้.defsไฟล์ที่อธิบายว่าแพ็กเกจ / คลาส / ฟิลด์ใดที่จะรวมอยู่ใน API ของส่วนเสริม
Bjarke Freund-Hansen

2
@ThomasHofmann: เกี่ยวกับ$(hide)คุณกำลังสับสนในตัวเอง $(hide)เป็นเพียงคำนำหน้าใน makefiles เพื่อซ่อนบรรทัดคำสั่งที่แท้จริงของโปรแกรมที่กำลังดำเนินการไม่มีอะไรเพิ่มเติมและใช้ในทุกๆที่ ไม่มีอะไรเกี่ยวข้องกับ Android SDK หรือ@hideคำอธิบายประกอบในซอร์สโค้ด
Bjarke Freund-Hansen

ฉันจะตรวจสอบเส้นทางข้างต้นนี้ได้อย่างไร / target / common / obj / JAVA_LIBRARIES / framework_intermediates / class.jar
กระต่าย

31

เราสามารถสร้างไฟล์ * .jar ขึ้นมาใหม่จากแพลตฟอร์ม Android

ขั้นแรกให้เชื่อมต่อ ADB กับอุปกรณ์ของคุณ จากนั้นเรียกใช้:

adb pull /system/framework/core.jar .
adb pull /system/framework/framework.jar .

core.jarประกอบด้วยห้องสมุด Java มาตรฐาน ( java.*) และframework.jarมีห้องสมุด Android ( android.*) ยังไม่สามารถใช้งานได้เนื่องจากไฟล์จริงอยู่ในรูปแบบ DEX ไม่ใช่รูปแบบ JAR

เราสามารถแปลง * .jars ในรูปแบบ DEX เหล่านี้เป็น JAR จริงโดยใช้เครื่องมือเช่นdex2jar :

dex2jar core.jar
dex2jar framework.jar

จากนั้นดึงไหเหล่านี้โดยใช้ "Add External JARs ... " (สมมติว่าคุณใช้ Eclipse ADT)

  • คลิกขวาที่Project → Properties → Java Build Path → Libraries → Add External JARs... → (เลือกcore-dex2jar.jarและframework-dex2jar.jarจากด้านบน)

สิ่งนี้จะช่วยให้คุณสามารถใช้ API ภายในและ Java 7 บางตัวได้ (APK ที่สร้างขึ้นเท่าที่ฉันเห็นไม่มีรหัสจริงจาก JAR)


ขอบคุณมากฉันได้ลองหลายวิธีแล้วเฉพาะวิธีการของคุณเท่านั้นที่ใช้ได้กับฉัน
SalutonMondo

7
สิ่งสำคัญคือต้องทราบว่าวิธีนี้ยังคงใช้ได้กับ ICS และระบบที่ใหม่กว่า แต่ต้องมีการเล่นกลมากขึ้น ไฟล์ที่เกี่ยวข้อง/system/framework/core.odex, /system/framework/framework.odexและอาจจะมากขึ้น สิ่งเหล่านี้สามารถ deodexed ( java -jar baksmali-2.0.3.jar -d system.framework -x system.framework/core.odex -o core) และ reodexed ( java -jar smali-2.0.3.jar -x -o core.dex core) และหลังจากนั้นdex2jar core.dexก็ทำงานได้
Alex Cohn

ไม่พบ core.jar ใน marshmallow
mehmet6parmak

คุณมีความคิดเกี่ยวกับ core & framework jar ใน android p หรือไม่?
Prabhakaran

ฉันจะตรวจสอบเส้นทางข้างต้นนี้ได้อย่างไร / target / common / obj / JAVA_LIBRARIES / framework_intermediates / class.jar
กระต่าย

18

คุณสามารถดาวน์โหลดการแก้ไขandroid.jarเพื่อใช้เป็น API ที่ซ่อนอยู่จากที่เก็บนี้ ทำตามคำแนะนำที่นั่น


4
คำตอบนี้ควรได้รับการโหวตมากขึ้นเนื่องจากเป็นวิธีที่ง่ายที่สุด ผู้คนหากคุณกำลังมองหาวิธีแก้ปัญหา - ให้รู้ว่ามีคนอื่นทำเช่นนั้นแล้วและวางวิธีแก้ปัญหาให้กับ github repo นั้น ใช้มันและสนุก! ))
Mixaz

1
ขณะใช้ android.jar สำหรับ API 28 ฉันได้รับข้อผิดพลาดเกี่ยวกับ robolectric ยกปัญหาgithub.com/anggrayudi/android-hidden-api/issues/62และขอบคุณสำหรับโถของคุณ @Anggrayudi
Prabhakaran

ฉันยังไม่เหมือนกันสำหรับหุ่นยนต์ 10 มันไม่ทำงานสำหรับฉันค่อนข้าง i ดาวน์โหลดจากผู้สนับสนุนอื่น ๆgithub.com/aeab13/android-jar-with-hidden-api ฉันสามารถเข้าถึงคลาส hdmi-cec และสร้างได้ แต่รหัสยังคงสับสน .code link android.googlesource.com/platform/frameworks/base/+/4e90fcd/…
babbin tandukar

17

สำหรับ Lollipop การไหลจะแตกต่างกันเล็กน้อย:

  1. รับ /system/framework/arm/boot.oat จากอุปกรณ์อมยิ้ม

  2. ใช้ 'java -jar oat2dex.jar boot boot.oat'

  3. คุณจะได้รับสองโฟลเดอร์: dex และ odex ไปที่ dex และสร้าง 'java -jar dex2jar.jar framework.dex'
  4. เปลี่ยนชื่อ framework.jar ที่เป็นผลลัพธ์เป็น. zip แยกและค้นหาคลาสที่คุณต้องการ
  5. ไปที่ [sdk_path] / platforms / [target_platform] แล้วแตก android.jar (ก่อนอื่นให้เปลี่ยนชื่อเป็น zip)
  6. คัดลอกไฟล์จากเฟรมเวิร์กที่แตกแล้วไปยัง android.jar ที่แตกออกมา จากนั้นบีบอัดเป็น zip และเปลี่ยนชื่อเป็น. jar :)

ps: คุณอาจต้องทำซ้ำขั้นตอนที่ 4-6 สำหรับ 'framework_classes2.dex'


สำหรับขั้นตอนที่ 3 ฉันไม่พบ dex2jar.jar ในลิงค์นั้น .... ฉันได้ลองทำหลายอย่างแล้ว แต่ก็คิดไม่ออก มีลิงค์ไปที่ใดที่หนึ่งหรือไม่? อยู่ใน Android SDK ของฉันหรือไม่ ฉันหาไม่เจอ
Dwebtron

ใช่มันไปที่โปรเจ็กต์ github และอาจจะเป็นฉัน แต่ฉันไม่พบไฟล์ใด ๆ ที่ลงท้ายด้วย ".jar" ที่นั่น ...
Dwebtron

1
ดูส่วน 'เผยแพร่'
เบี่ยงเบน

2
ดูเหมือนว่าเวอร์ชันล่าสุดของ dex2jar ได้เปลี่ยนรูปแบบของการดาวน์โหลดแล้ว เพียงแค่เปิดเครื่องรูดการดาวน์โหลดและแทนที่จะเป็น 'java -jar ... ' เพียงแค่เรียกใช้สคริปต์ 'd2j-dex2jar.sh' หรือ 'd2j-dex2jar.bat' ขึ้นอยู่กับแพลตฟอร์มของคุณโดยตรงบนไฟล์ framework.dex
CalumMcCall

1
ฉันได้คัดลอกไฟล์ jar ทั้งสองไฟล์ลงใน android.jar แล้วตอนนี้ android studio บอกว่า Error: Execution failed for task ': app: processDebugResources' > com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: กระบวนการ 'คำสั่ง' D: \ Program \ Android \ android-sdk \ build-tools \ 19.1.0 \ aapt.exe ' 'เสร็จสิ้นด้วยค่าออกที่ไม่ใช่ศูนย์ 1
wutzebaer

15

DroidCon 2011

ที่นี่ Erik Hellman จาก Sony Ericson อธิบายวิธีการเข้าถึง Android API ที่ซ่อนอยู่:

http://vimeo.com/30180393 (ลิงก์อืมดูเหมือนจะไม่ทำงาน)

ไปที่หน้าเว็บ DroidCon วันที่ 2เลื่อนลงไปที่การใช้ Hidden APIs 10:15และคุณสามารถดูได้ที่นั่น

ลิงก์กำลังจะตาย!

ฉันพบสิ่งนี้: http://skillsmatter.com/podcast/os-mobile-server/hidden-apiไม่รู้ว่าจะใช้งานได้นานแค่ไหน

API อย่างเป็นทางการใน Android SDK มักจะเพียงพอสำหรับแอปพลิเคชันทั่วไปส่วนใหญ่ อย่างไรก็ตามมีบางครั้งสถานการณ์ที่นักพัฒนาต้องการเข้าถึงบริการระบบภายใน API และทรัพยากรที่ไม่ได้เผยแพร่ใน API อย่างเป็นทางการ โชคดีที่ API เหล่านี้ยังคงใช้งานได้ผ่านกลเม็ดอันชาญฉลาดและมักจะมีประโยชน์เมื่อพัฒนาโซลูชันใหม่ ๆ ที่เป็นนวัตกรรมเหนือ Android ในเซสชันนี้คุณจะได้เรียนรู้วิธีเข้าถึงและใช้ API ที่ซ่อนและได้รับการป้องกันข้อ จำกัด ของการใช้งานและเคล็ดลับบางประการเกี่ยวกับวิธีการใช้งานอย่างปลอดภัยและควบคุมได้ในอุปกรณ์ของผู้ให้บริการและ Android เวอร์ชันต่างๆ ผู้ชมจะเห็นการสาธิตขั้นสูงหลายรายการที่ปกติคุณไม่สามารถทำได้กับ Android คาดว่าจะมีเซสชันขั้นสูงที่มีข้อมูลเชิงลึกมากมายในแพลตฟอร์ม Android ภายใน


1
มันน่าสนใจ แต่น่าเสียดายที่มันไม่ตอบคำถามของฉัน ฉันกำลังขอวิธีสร้าง SDK ขึ้นมาใหม่พร้อมกับสิ่งที่ซ่อนอยู่
Thomas Hofmann

ดูเหมือนว่าฉันจะพบวิธีอื่นในการบรรลุสิ่งที่ฉันต้องการ ฉันจะอธิบายมันในวันพรุ่งนี้
Thomas Hofmann

ฉันพบว่าหากคุณต้องการรวบรวมแหล่งที่มาของโปรเจ็กต์ที่ใช้ API ที่ซ่อนอยู่ใน ADT คุณสามารถทำสิ่งต่อไปนี้: 1) สร้างโปรเจ็กต์ Android สำหรับซอร์ส 2) ลบคอนเทนเนอร์คลาสพา ธ Android ออกจากเส้นทางการสร้าง 3) กำหนดไลบรารีผู้ใช้ (ทำเครื่องหมายที่ช่องทำเครื่องหมายไลบรารีระบบด้วย) ที่มีไฟล์ JAR จาก ASOP ROM build เช่น cm7) ไฟล์ JAR ใดที่คุณใช้ขึ้นอยู่กับสิ่งที่คุณต้องการอ้างอิง Framework-ทันทีอาจเป็นส่วนหนึ่งของมัน
Thomas Hofmann

4) เมื่อสร้างโปรเจ็กต์แล้วคลาสไลบรารีผู้ใช้จะไม่รวมอยู่ใน APK ที่สร้างขึ้น Hidden API สามารถมองเห็นได้และทุกอย่างจะคอมไพล์ได้ดี
Thomas Hofmann

@Blundell: ช่วยอัพเดทลิงค์หน่อยได้ไหม .. พวกมันตายแล้ว!
zombie

12

ลองดูสิ่งนี้ :

เป้าหมายสูงสุดของบทความเหล่านี้คือเพื่อให้นักพัฒนาสามารถใช้ Internal และ Hidden API ได้โดยไม่ต้องใช้การสะท้อนกลับ หากคุณทำตามขั้นตอนทั้งหมดที่อธิบายไว้ในส่วนถัดไปคุณจะสามารถใช้InternalและHidden API ได้ราวกับว่าเป็น API แบบเปิดสาธารณะ จะไม่จำเป็นต้องมีการสะท้อนกลับ

แต่หากคุณกำลังใช้ API ที่ไม่เป็นสาธารณะเหล่านี้คุณควรทราบว่าแอปพลิเคชันของคุณมีความเสี่ยงสูง โดยทั่วไปไม่มีการรับประกันว่า API จะไม่เสียในการอัปเดต Android OS ครั้งต่อไป แม้จะไม่มีการรับประกันเกี่ยวกับพฤติกรรมที่สอดคล้องกันในอุปกรณ์จากผู้ขายที่แตกต่างกัน คุณเป็นของตัวเองอย่างสมบูรณ์

มีสามสถานการณ์ที่คุณอาจต้องการติดตาม:

  1. เปิดใช้API ทั้งภายในและที่ซ่อนอยู่ (สถานการณ์ A)
  2. เปิดใช้งานAPI ที่ซ่อนอยู่เท่านั้น(สถานการณ์ B)
  3. เปิดใช้เฉพาะAPI ภายใน (สถานการณ์ C)

สถานการณ์ A คือผลรวมของ B และ C สถานการณ์ B เป็นสิ่งที่ง่ายที่สุด (ไม่ต้องมีการแก้ไขปลั๊กอิน ADT ของ eclipse)

สถานการณ์ A : อ่านส่วนที่1 , 2 , 3 , 4 , 5

สถานการณ์ B : อ่านส่วนที่1 , 2 , 3 , 5

สถานการณ์ C : อ่านส่วนที่1 , 2 , 3 , 4 , 5


3
ฉันอ่านรายการบล็อกนั้นแล้ว โดยกล่าวถึงสิ่งนี้: "1) Android เป็นโครงการโอเพ่นซอร์สเราสามารถดาวน์โหลดซอร์สโค้ดและปรับแต่งระบบบิวด์ได้ดังนั้นจึงไม่รวมคลาสภายในและคลาสที่ซ่อนไว้จาก android.jar ซึ่งเป็นวิธีที่ยาก" น่าเสียดายที่ไม่ได้ลงรายละเอียด
Thomas Hofmann

3
ไปที่ส่วนสุดท้ายของบล็อกโพสต์ ( devmaze.wordpress.com/2011/01/19/… ) มีลิงค์ ( github.com/inazaruk/android-sdk/tree/master/platforms ) ไปยัง Android ที่สร้างไว้ล่วงหน้า API ที่มี API ที่ซ่อนอยู่และภายในทั้งหมด
Bob

1
ลิงก์ที่ระบุไม่สามารถเข้าถึงได้ต้องได้รับอนุญาตจากผู้เขียน
SHAHS

ฉันจะตรวจสอบเส้นทางข้างต้นนี้ได้อย่างไร / target / common / obj / JAVA_LIBRARIES / framework_intermediates / class.jar
Bunny

1

ครั้งหนึ่งฉันเคยเขียนสคริปต์ Groovy สำหรับการแตกไฟล์ java จากการชำระเงิน repo จากhttp://source.android.com/จากนั้นรวบรวมโดยไม่ต้องใช้ toolchain แบบเต็มเพื่อรวบรวมแหล่งที่มาของ Android ทั้งหมดรวมถึงขั้นตอนอื่น ๆ ที่จำเป็น ( บรรจุภัณฑ์การสร้างทรัพยากร ฯลฯ )

สามารถพบได้ที่นี่:

https://github.com/thoutbeckers/CollectAndroid

แต่แน่นอนว่าจะต้องมีการอัปเดตสำหรับทุกสิ่งหลังจาก Gingerbread โดยส่วนใหญ่ตั้งค่าไดเรกทอรีที่ถูกต้องใน "rootdirs" ในไฟล์กำหนดค่า (CollectConfig.groovy)

ในเวลานั้นฉันใช้สิ่งนี้เป็นประจำเพื่อการพัฒนาโดยมี API และแหล่งที่มาที่ซ่อนอยู่ทั้งหมด (ซึ่งมีปัญหาในเวลานั้นด้วย)

ตามที่กล่าวไว้ที่อื่น com / android / internal / ** จะยังคงถูกซ่อนอยู่ใน ADT เวอร์ชันล่าสุดเนื่องจากกฎการเข้าถึงที่ระบุไว้


ฉันจะตรวจสอบเส้นทางข้างต้นนี้ได้อย่างไร / target / common / obj / JAVA_LIBRARIES / framework_intermediates / class.jar
Bunny

ผมเก็บไว้ repo ว่านับตั้งแต่ได้รับการปรับปรุงล่าสุดสำหรับขนมปังขิง คุณจะต้องหาวิธีอื่นอย่างไม่น่าเชื่อ
thoutbeckers

1

คำตอบของ Long ใช้ได้ผลสำหรับฉัน แต่ฉันยังขาดบางคลาสที่ฉันต้องการโดยเฉพาะ android.provider.Telephony ฉันสามารถเพิ่มได้ดังนี้:

  1. แตกไฟล์ framework.jar

    mkdir /tmp/framework
    cp framework.jar /tmp
    cd /tmp/framework
    jar xvf ../framework.jar
    mv android classes
    
  2. สร้าง repo ของ Android ซึ่งจะสร้างไดเร็กทอรี out / target / common / obj / JAVA_LIBRARIES

  3. ค้นหาว่าชั้นเรียนที่หายไปอยู่ที่ไหน

    $ cd /path/to/out/target/common/obj/JAVA_LIBRARIES
    $ find . | grep "/Telephony.class"
    ./telephony-common_intermediates/classes/android/provider/Telephony.class
    ./android_stubs_current_intermediates/classes/android/provider/Telephony.class
    
  4. เพิ่มคลาสใหม่และสร้างไฟล์ Framework JAR ใหม่

    cd /tmp/framework
    cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes .
    cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/telephony-common_intermediates/classes .
    cd classes
    jar cvf ../framework.jar .
    

หรือคุณสามารถขี้เกียจและรวมคลาสทั้งหมดไว้ในไฟล์ jar ขนาดใหญ่:

cd /tmp/framework
cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/*/classes .
cd classes
jar cvf ../framework.jar .

out / target / common / obj / JAVA_LIBRARIES จะหาเส้นทางนี้ได้อย่างไร?
Bunny

@ กระต่ายฉันอัปเดตคำตอบพร้อมรายละเอียดเพิ่มเติม แต่ดูเหมือนว่าคำตอบที่นี่อาจจะง่ายกว่า: stackoverflow.com/a/32626155/399105
bmaupin

ขอบคุณสำหรับการตอบกลับของคุณ @bmaupin .. คุณช่วยฉันได้ไหมว่าฉันจะหาเส้นทางนี้ออกได้อย่างไร / target / common / obj / JAVA_LIBRARIES เพื่อรับ framework jar ... ฉันติดขัดจริงๆ .. ฉันไม่พบเส้นทางนี้หรือ ขาดอะไรไป ... โปรดชี้แนะ
Bunny

0

ฉันไม่สามารถแสดงความคิดเห็นได้ แต่นี่เป็นความคิดเห็นของ @ KennyTM ( https://stackoverflow.com/a/13550030/2923406 ) คำตอบที่ยอดเยี่ยม:

หากคุณพบว่าตัวเองมีข้อผิดพลาดต่อไปนี้ใน Eclipse:

The type com.android.internal.util.Predicate cannot be resolved. It is indirectly referenced from required .class   files

(นั่นคือ android.internal. * ไม่พร้อมใช้งาน)

วิธีแก้ปัญหาที่เป็นไปได้วิธีหนึ่งคือใช้วิธีการเดียวกันสำหรับ /system/framework/framework2.jar การใช้ Android Emulator สำหรับ SDK19 ฉันมีโถพิเศษนี้ ใน HTC One ของฉันยังมี framework3.jar


ฉันจะตรวจสอบเส้นทางข้างต้นนี้ได้อย่างไร / target / common / obj / JAVA_LIBRARIES / framework_intermediates / class.jar
Bunny
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.